/*
 * 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.DefaultEdgeLink;
import org.onosproject.net.DeviceId;
import org.onosproject.net.EdgeLink;
import org.onosproject.net.PortNumber;
import org.onosproject.ui.model.AbstractUiModelTest;

import static org.junit.Assert.assertEquals;

/**
 * Unit tests for {@link UiEdgeLink}.
 */
public class UiEdgeLinkTest extends AbstractUiModelTest {

    private static final String PHANTOM_HOST_ID = "00:00:00:00:00:00/None";
    private static final String D1_P8 = "dev-1/8";

    private static final DeviceId DEV = DeviceId.deviceId("dev-1");
    private static final PortNumber P8 = PortNumber.portNumber(8);
    private static final ConnectPoint CP = new ConnectPoint(DEV, P8);

    private static final EdgeLink EDGE_LINK =
            DefaultEdgeLink.createEdgeLink(CP, true);

    @Test
    public void basic() {
        title("basic");
        UiLinkId id = UiLinkId.uiLinkId(EDGE_LINK);
        UiEdgeLink link = new UiEdgeLink(null, id);
        link.attachEdgeLink(EDGE_LINK);
        print(link);
        print(link.endPointA());
        print(link.endPointB());

        assertEquals("bad end point A", PHANTOM_HOST_ID, link.endPointA());
        assertEquals("bad end point B", D1_P8, link.endPointB());
    }
}
