blob: ec7687d51bb2c0a52945a5b14bf63328e844ba1a [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 android.support.design.widget;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.support.annotation.NonNull;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.List;
@RunWith(JUnit4.class)
public class DirectedAcyclicGraphTest {
private DirectedAcyclicGraph<TestNode> mGraph;
@Before
public void setup() {
mGraph = new DirectedAcyclicGraph<>();
}
@Test
public void test_addNode() {
final TestNode node = new TestNode("node");
mGraph.addNode(node);
assertEquals(1, mGraph.size());
assertTrue(mGraph.contains(node));
}
@Test
public void test_addNodeAgain() {
final TestNode node = new TestNode("node");
mGraph.addNode(node);
mGraph.addNode(node);
assertEquals(1, mGraph.size());
assertTrue(mGraph.contains(node));
}
@Test
public void test_addEdge() {
final TestNode node = new TestNode("node");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node);
mGraph.addNode(edge);
mGraph.addEdge(node, edge);
}
@Test(expected = IllegalArgumentException.class)
public void test_addEdgeWithNotAddedEdgeNode() {
final TestNode node = new TestNode("node");
final TestNode edge = new TestNode("edge");
// Add the node, but not the edge node
mGraph.addNode(node);
// Now add the link
mGraph.addEdge(node, edge);
}
@Test
public void test_getIncomingEdges() {
final TestNode node = new TestNode("node");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node);
mGraph.addNode(edge);
mGraph.addEdge(node, edge);
final List<TestNode> incomingEdges = mGraph.getIncomingEdges(node);
assertNotNull(incomingEdges);
assertEquals(1, incomingEdges.size());
assertEquals(edge, incomingEdges.get(0));
}
@Test
public void test_getOutgoingEdges() {
final TestNode node = new TestNode("node");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node);
mGraph.addNode(edge);
mGraph.addEdge(node, edge);
// Now assert the getOutgoingEdges returns a list which has one element (node)
final List<TestNode> outgoingEdges = mGraph.getOutgoingEdges(edge);
assertNotNull(outgoingEdges);
assertEquals(1, outgoingEdges.size());
assertTrue(outgoingEdges.contains(node));
}
@Test
public void test_getOutgoingEdgesMultiple() {
final TestNode node1 = new TestNode("1");
final TestNode node2 = new TestNode("2");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node1);
mGraph.addNode(node2);
mGraph.addNode(edge);
mGraph.addEdge(node1, edge);
mGraph.addEdge(node2, edge);
// Now assert the getOutgoingEdges returns a list which has 2 elements (node1 & node2)
final List<TestNode> outgoingEdges = mGraph.getOutgoingEdges(edge);
assertNotNull(outgoingEdges);
assertEquals(2, outgoingEdges.size());
assertTrue(outgoingEdges.contains(node1));
assertTrue(outgoingEdges.contains(node2));
}
@Test
public void test_hasOutgoingEdges() {
final TestNode node = new TestNode("node");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node);
mGraph.addNode(edge);
// There is no edge currently and assert that fact
assertFalse(mGraph.hasOutgoingEdges(edge));
// Now add the edge
mGraph.addEdge(node, edge);
// and assert that the methods returns true;
assertTrue(mGraph.hasOutgoingEdges(edge));
}
@Test
public void test_clear() {
final TestNode node1 = new TestNode("1");
final TestNode node2 = new TestNode("2");
final TestNode edge = new TestNode("edge");
mGraph.addNode(node1);
mGraph.addNode(node2);
mGraph.addNode(edge);
// Now clear the graph
mGraph.clear();
// Now assert the graph is empty and that contains returns false
assertEquals(0, mGraph.size());
assertFalse(mGraph.contains(node1));
assertFalse(mGraph.contains(node2));
assertFalse(mGraph.contains(edge));
}
@Test
public void test_getSortedList() {
final TestNode node1 = new TestNode("A");
final TestNode node2 = new TestNode("B");
final TestNode node3 = new TestNode("C");
final TestNode node4 = new TestNode("D");
// Now we'll add the nodes
mGraph.addNode(node1);
mGraph.addNode(node2);
mGraph.addNode(node3);
mGraph.addNode(node4);
// Now we'll add edges so that 4 <- 2, 2 <- 3, 3 <- 1 (where <- denotes a dependency)
mGraph.addEdge(node4, node2);
mGraph.addEdge(node2, node3);
mGraph.addEdge(node3, node1);
final List<TestNode> sorted = mGraph.getSortedList();
// Assert that it is the correct size
assertEquals(4, sorted.size());
// Assert that all of the nodes are present and in their sorted order
assertEquals(node1, sorted.get(0));
assertEquals(node3, sorted.get(1));
assertEquals(node2, sorted.get(2));
assertEquals(node4, sorted.get(3));
}
private static class TestNode {
private final String mLabel;
TestNode(@NonNull String label) {
mLabel = label;
}
@Override
public String toString() {
return "TestNode: " + mLabel;
}
}
}