/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.ui.model.topo;

import org.junit.Test;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DefaultLink;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Link;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.net.region.RegionId;
import org.onosproject.ui.model.AbstractUiModelTest;

import static org.junit.Assert.assertEquals;
import static org.onosproject.net.DeviceId.deviceId;
import static org.onosproject.net.PortNumber.P0;
import static org.onosproject.net.region.RegionId.regionId;

/**
 * Unit tests for {@link UiRegionLink}.
 */
public class UiRegionLinkTest extends AbstractUiModelTest {

    private static final RegionId R1 = regionId("r1");
    private static final RegionId R2 = regionId("r2");

    private static final DeviceId DEV_X = deviceId("device-X");
    private static final DeviceId DEV_Y = deviceId("device-Y");

    private static final ConnectPoint CP_X = new ConnectPoint(DEV_X, P0);
    private static final ConnectPoint CP_Y = new ConnectPoint(DEV_Y, P0);

    private static final Link LINK_X_TO_Y = DefaultLink.builder()
            .providerId(ProviderId.NONE)
            .src(CP_X)
            .dst(CP_Y)
            .type(Link.Type.DIRECT)
            .build();


    @Test(expected = NullPointerException.class)
    public void nullPointerRegion() {
        title("nullPointerRegion");
        new UiRegionLink(null, null);
    }

    @Test
    public void regionToRegion() {
        title("regionToRegion");
        UiLinkId id = UiLinkId.uiLinkId(R1, R2);
        UiRegionLink link = new UiRegionLink(null, id);
        print("link: %s", link);
        assertEquals("bad first region", R1, link.regionA());
        assertEquals("bad second region", R2, link.regionB());
    }

    @Test(expected = IllegalArgumentException.class)
    public void wrongLinkType() {
        title("wrongLinkType");
        UiLinkId id = UiLinkId.uiLinkId(LINK_X_TO_Y);
        new UiRegionLink(null, id);
    }
}
