/*
 * Copyright 2015-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.topo;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

/**
 * Unit tests for {@link BiLinkMap}.
 */
public class BiLinkMapTest extends BiLinkTestBase {


    private ConcreteLink clink;
    private ConcreteLinkMap linkMap;

    @Before
    public void setUp() {
        linkMap = new ConcreteLinkMap();
    }

    @Test
    public void basic() {
        assertEquals("wrong map size", 0, linkMap.size());
        assertTrue("unexpected links", linkMap.biLinks().isEmpty());
    }

    @Test
    public void addSameLinkTwice() {
        linkMap.add(LINK_AB);
        assertEquals("wrong map size", 1, linkMap.size());
        clink = linkMap.biLinks().iterator().next();
        assertEquals("wrong link one", LINK_AB, clink.one());
        assertNull("unexpected link two", clink.two());

        linkMap.add(LINK_AB);
        assertEquals("wrong map size", 1, linkMap.size());
        clink = linkMap.biLinks().iterator().next();
        assertEquals("wrong link one", LINK_AB, clink.one());
        assertNull("unexpected link two", clink.two());
    }

    @Test
    public void addPairOfLinks() {
        linkMap.add(LINK_AB);
        assertEquals("wrong map size", 1, linkMap.size());
        clink = linkMap.biLinks().iterator().next();
        assertEquals("wrong link one", LINK_AB, clink.one());
        assertNull("unexpected link two", clink.two());

        linkMap.add(LINK_BA);
        assertEquals("wrong map size", 1, linkMap.size());
        clink = linkMap.biLinks().iterator().next();
        assertEquals("wrong link one", LINK_AB, clink.one());
        assertEquals("wrong link two", LINK_BA, clink.two());
    }
}
