ONOS-2186 - GUI Topo Overlay - (WIP)
- added unit tests for BiLink, BiLinkMap, Mod, and LinkHighlight.

Change-Id: I247103af2713731b20564718064eeda03d030df7
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java b/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java
index 5e7ef4b..9f789b2 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java
@@ -17,6 +17,8 @@
 
 package org.onosproject.ui.topo;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Partial implementation of the highlighting to apply to topology
  * view elements.
@@ -32,8 +34,8 @@
      * @param elementId element identifier
      */
     public AbstractHighlight(TopoElementType type, String elementId) {
-        this.type = type;
-        this.elementId = elementId;
+        this.type = checkNotNull(type);
+        this.elementId = checkNotNull(elementId);
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/BiLinkMap.java b/core/api/src/main/java/org/onosproject/ui/topo/BiLinkMap.java
index 66f0f8f..7bc0e65 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/BiLinkMap.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/BiLinkMap.java
@@ -45,7 +45,7 @@
      * @param link the initial link
      * @return a new instance
      */
-    public abstract B create(LinkKey key, Link link);
+    protected abstract B create(LinkKey key, Link link);
 
     /**
      * Adds the given link to our collection, returning the corresponding
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
index 107fdd3..848e758 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
@@ -17,7 +17,6 @@
 
 package org.onosproject.ui.topo;
 
-import java.text.DecimalFormat;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
@@ -29,8 +28,6 @@
  */
 public class Highlights {
 
-    private static final DecimalFormat DF0 = new DecimalFormat("#,###");
-
     private final Set<DeviceHighlight> devices = new HashSet<>();
     private final Set<HostHighlight> hosts = new HashSet<>();
     private final Set<LinkHighlight> links = new HashSet<>();
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkMapTest.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkMapTest.java
new file mode 100644
index 0000000..17fcc22
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkMapTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2015 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());
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java
new file mode 100644
index 0000000..1acc06f
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 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.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Unit tests for {@link BiLink}.
+ */
+public class BiLinkTest extends BiLinkTestBase {
+
+    private static final String EXP_ID_AB = "device-a/1-device-b/2";
+
+    private BiLink blink;
+
+    @Test
+    public void basic() {
+        blink = new ConcreteLink(KEY_AB, LINK_AB);
+        assertEquals("wrong id", EXP_ID_AB, blink.linkId());
+        assertEquals("wrong key", KEY_AB, blink.key());
+        assertEquals("wrong link one", LINK_AB, blink.one());
+        assertNull("what?", blink.two());
+
+        blink.setOther(LINK_BA);
+        assertEquals("wrong link two", LINK_BA, blink.two());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void nullKey() {
+        new ConcreteLink(null, LINK_AB);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void nullLink() {
+        new ConcreteLink(KEY_AB, null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void nullOther() {
+        blink = new ConcreteLink(KEY_AB, LINK_AB);
+        blink.setOther(null);
+    }
+}
+
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
new file mode 100644
index 0000000..b5bd41e
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2015 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.onosproject.net.Annotations;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.provider.ProviderId;
+
+/**
+ * Base class for unit tests of {@link BiLink} and {@link BiLinkMap}.
+ */
+public abstract class BiLinkTestBase {
+
+    protected static class FakeLink implements Link {
+        private final ConnectPoint src;
+        private final ConnectPoint dst;
+
+        FakeLink(ConnectPoint src, ConnectPoint dst) {
+            this.src = src;
+            this.dst = dst;
+        }
+
+        @Override public ConnectPoint src() {
+            return src;
+        }
+        @Override public ConnectPoint dst() {
+            return dst;
+        }
+
+        @Override public Type type() {
+            return null;
+        }
+        @Override public State state() {
+            return null;
+        }
+        @Override public boolean isDurable() {
+            return false;
+        }
+        @Override public Annotations annotations() {
+            return null;
+        }
+        @Override public ProviderId providerId() {
+            return null;
+        }
+    }
+
+    protected static final DeviceId DEV_A_ID = DeviceId.deviceId("device-A");
+    protected static final DeviceId DEV_B_ID = DeviceId.deviceId("device-B");
+    protected static final PortNumber PORT_1 = PortNumber.portNumber(1);
+    protected static final PortNumber PORT_2 = PortNumber.portNumber(2);
+
+    protected static final ConnectPoint CP_A1 = new ConnectPoint(DEV_A_ID, PORT_1);
+    protected static final ConnectPoint CP_B2 = new ConnectPoint(DEV_B_ID, PORT_2);
+
+    protected static final LinkKey KEY_AB = LinkKey.linkKey(CP_A1, CP_B2);
+    protected static final LinkKey KEY_BA = LinkKey.linkKey(CP_B2, CP_A1);
+
+    protected static final Link LINK_AB = new FakeLink(CP_A1, CP_B2);
+    protected static final Link LINK_BA = new FakeLink(CP_B2, CP_A1);
+
+    protected static class ConcreteLink extends BiLink {
+        public ConcreteLink(LinkKey key, Link link) {
+            super(key, link);
+        }
+        @Override
+        public LinkHighlight highlight(Enum<?> type) {
+            return null;
+        }
+    }
+
+    protected static class ConcreteLinkMap extends BiLinkMap<ConcreteLink> {
+        @Override
+        public ConcreteLink create(LinkKey key, Link link) {
+            return new ConcreteLink(key, link);
+        }
+    }
+
+
+}
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/LinkHighlightTest.java b/core/api/src/test/java/org/onosproject/ui/topo/LinkHighlightTest.java
new file mode 100644
index 0000000..205f08c
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/LinkHighlightTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2015 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.Test;
+
+import java.util.Iterator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.ui.topo.LinkHighlight.Flavor.*;
+
+/**
+ * Unit tests for {@link LinkHighlight}.
+ */
+public class LinkHighlightTest {
+
+    private static final String LINK_ID = "link-id-for-testing";
+    private static final String LABEL = "some label";
+    private static final String EMPTY = "";
+    private static final String CUSTOM = "custom";
+    private static final String ANIMATED = "animated";
+    private static final String OPTICAL = "optical";
+
+    private LinkHighlight lh;
+
+    @Test
+    public void basic() {
+        lh = new LinkHighlight(LINK_ID, NO_HIGHLIGHT);
+
+        assertEquals("wrong flavor", NO_HIGHLIGHT, lh.flavor());
+        assertTrue("unexpected mods", lh.mods().isEmpty());
+        assertEquals("wrong css", "plain", lh.cssClasses());
+        assertEquals("wrong label", EMPTY, lh.label());
+    }
+
+    @Test
+    public void primaryOptical() {
+        lh = new LinkHighlight(LINK_ID, PRIMARY_HIGHLIGHT)
+                .addMod(LinkHighlight.MOD_OPTICAL);
+
+        assertEquals("wrong flavor", PRIMARY_HIGHLIGHT, lh.flavor());
+        assertEquals("missing mod", 1, lh.mods().size());
+        Mod m = lh.mods().iterator().next();
+        assertEquals("wrong mod", LinkHighlight.MOD_OPTICAL, m);
+        assertEquals("wrong css", "primary optical", lh.cssClasses());
+        assertEquals("wrong label", EMPTY, lh.label());
+    }
+
+    @Test
+    public void secondaryAnimatedWithLabel() {
+        lh = new LinkHighlight(LINK_ID, SECONDARY_HIGHLIGHT)
+                .addMod(LinkHighlight.MOD_ANIMATED)
+                .setLabel(LABEL);
+
+        assertEquals("wrong flavor", SECONDARY_HIGHLIGHT, lh.flavor());
+        assertEquals("missing mod", 1, lh.mods().size());
+        Mod m = lh.mods().iterator().next();
+        assertEquals("wrong mod", LinkHighlight.MOD_ANIMATED, m);
+        assertEquals("wrong css", "secondary animated", lh.cssClasses());
+        assertEquals("wrong label", LABEL, lh.label());
+    }
+
+    @Test
+    public void customMod() {
+        lh = new LinkHighlight(LINK_ID, PRIMARY_HIGHLIGHT)
+                .addMod(new Mod(CUSTOM));
+
+        assertEquals("missing mod", 1, lh.mods().size());
+        Mod m = lh.mods().iterator().next();
+        assertEquals("wrong mod", CUSTOM, m.toString());
+        assertEquals("wrong css", "primary custom", lh.cssClasses());
+    }
+
+    @Test
+    public void severalMods() {
+        lh = new LinkHighlight(LINK_ID, SECONDARY_HIGHLIGHT)
+                .addMod(LinkHighlight.MOD_OPTICAL)
+                .addMod(LinkHighlight.MOD_ANIMATED)
+                .addMod(new Mod(CUSTOM));
+
+        assertEquals("missing mods", 3, lh.mods().size());
+        Iterator<Mod> iter = lh.mods().iterator();
+        // NOTE: we know we are using TreeSet as backing => sorted order
+        assertEquals("wrong mod", ANIMATED, iter.next().toString());
+        assertEquals("wrong mod", CUSTOM, iter.next().toString());
+        assertEquals("wrong mod", OPTICAL, iter.next().toString());
+        assertEquals("wrong css", "secondary animated custom optical", lh.cssClasses());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void noFlavor() {
+        new LinkHighlight(LINK_ID, null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void noIdentity() {
+        new LinkHighlight(null, PRIMARY_HIGHLIGHT);
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/ModTest.java b/core/api/src/test/java/org/onosproject/ui/topo/ModTest.java
new file mode 100644
index 0000000..bb40279
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/ModTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 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.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Unit tests for {@link Mod}.
+ */
+public class ModTest {
+
+    private static final String AAA = "aaa";
+    private static final String BBB = "bbb";
+
+    private Mod mod1;
+    private Mod mod2;
+
+    @Test(expected = NullPointerException.class)
+    public void nullId() {
+        new Mod(null);
+    }
+
+    @Test
+    public void basic() {
+        mod1 = new Mod(AAA);
+        assertEquals("wrong id", AAA, mod1.toString());
+    }
+
+    @Test
+    public void equivalence() {
+        mod1 = new Mod(AAA);
+        mod2 = new Mod(AAA);
+        assertNotSame("oops", mod1, mod2);
+        assertEquals("not equivalent", mod1, mod2);
+    }
+
+    @Test
+    public void comparable() {
+        mod1 = new Mod(AAA);
+        mod2 = new Mod(BBB);
+        assertNotEquals("what?", mod1, mod2);
+        assertTrue(mod1.compareTo(mod2) < 0);
+        assertTrue(mod2.compareTo(mod1) > 0);
+    }
+}