/**
* Copyright (c) 2016 committers of YAKINDU and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
* @author René Beckmann (beckmann@itemis.de)
*
*/
package org.yakindu.sct.model.sexec.transformation.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.yakindu.sct.model.sexec.naming.StringTreeNode;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class StringTreeNodeTest {
private StringTreeNode tree;
@Before
public void setupStringTreeNode() {
tree = new StringTreeNode();
}
@Test
public void stringAddTest() {
/*
* Add a few strings where some are substrings of others and check if
* they all exist in the tree.
*/
List<String> testStrings = new ArrayList<String>();
testStrings.add("Statechart1");
testStrings.add("Statechart2");
testStrings.add("Statechart1.Region1");
testStrings.add("Statechart1.Region2");
testStrings.add("Statechart1.Region1.StateA");
testStrings.add("Statechart1.Region2.StateA");
for (String s : testStrings) {
tree.addString(s);
}
List<String> treeContents = tree.getContents();
stringListsEqual(testStrings, treeContents);
}
@Test
public void noDoublesTest() {
// Add the same string twice, expect it to be in the tree only once.
tree.addString("DoubleString");
tree.addString("DoubleString");
assertEquals(1, tree.getContents().size());
}
@Test
public void compressTest() {
// Add data to the tree, compress it, and compare contents before and
// after compressing.
tree.addString("PartOne");
tree.addString("PartTwo");
List<String> beforeContents = tree.getContents();
tree.compress();
List<String> afterContents = tree.getContents();
stringListsEqual(beforeContents, afterContents);
}
@Test
public void compressNodeTest() {
// Add data to the tree, compress it, and check if the nodes match the
// expectation.
tree.addString("PartOne");
tree.addString("PartTwo");
tree.compress();
List<StringTreeNode> nodelist = tree.getNodes();
List<String> nodecontents = new ArrayList<String>();
List<String> expectednodecontents = new ArrayList<String>();
expectednodecontents.add("Part");
expectednodecontents.add("One");
expectednodecontents.add("Two");
expectednodecontents.add(""); // two end nodes should be present
expectednodecontents.add("");
for (StringTreeNode node : nodelist) {
if (node.getData() != null) {
nodecontents.add(node.getData());
}
}
stringListsEqual(nodecontents, expectednodecontents);
}
@Test
public void hasSiblingsTest() {
testSiblings("Sc1Reg1StateA", new ArrayList<String>(Arrays.asList("StateB", "StateC")));
}
@Test
public void hasNoSiblingsTest() {
testSiblings("Sc1Reg2StateA", new ArrayList<String>());
}
@Test
public void nodeChainContainedTest() {
buildStandardTestTree();
String testString = new String("Sc1Reg1StateA");
List<StringTreeNode> nodes = tree.getNodeChain(testString);
StringBuilder builder = new StringBuilder();
for (StringTreeNode node : nodes) {
builder.append(node.getData());
}
assertEquals(testString, builder.toString());
}
@Test
public void nodeChainNotContainedTest() {
buildStandardTestTree();
String testString = new String("Sc1Reg3StateA");
List<StringTreeNode> nodes = tree.getNodeChain(testString);
assertEquals(nodes, null);
}
@Test
public void endNodesTest() {
buildStandardTestTree();
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc1", "Reg1")));
assertEquals(6, tree.getEndNodes().size());
}
@Test
public void distanceTest() {
buildStandardTestTree();
List<StringTreeNode> nodes1, nodes2, nodes3, nodes4;
StringTreeNode testNode1, testNode2, testNode3, testNode4;
nodes1 = tree.getNodeChain("Sc1Reg1StateA");
nodes2 = tree.getNodeChain("Sc1Reg1StateB");
nodes3 = tree.getNodeChain("Sc1Reg2StateA");
nodes4 = tree.getNodeChain("Sc2Reg1StateA");
testNode1 = nodes1.get(nodes1.size() - 1); // (Sc1Reg1)State A
testNode2 = nodes2.get(nodes2.size() - 1); // (Sc1Reg1)State B
testNode3 = nodes3.get(nodes3.size() - 1); // (Sc1Reg2)State A
testNode4 = nodes4.get(nodes4.size() - 1); // (Sc2Reg1)State A
assertEquals(2, testNode1.getDistance(testNode2));
assertEquals(4, testNode1.getDistance(testNode3));
assertEquals(6, testNode1.getDistance(testNode4));
}
@Test
public void navigateTest() {
buildStandardTestTree();
StringTreeNode nextnode = tree.navigate("Sc1");
assertEquals(true, nextnode != null);
assertEquals("Sc1", nextnode.getData());
nextnode = nextnode.navigate("Reg2");
assertEquals(true, nextnode != null);
assertEquals("Reg2", nextnode.getData());
nextnode = nextnode.navigate("StateA");
assertEquals(true, nextnode != null);
assertEquals("StateA", nextnode.getData());
nextnode = nextnode.getParent().getParent();
assertEquals(true, nextnode != null);
assertEquals("Sc1", nextnode.getData());
}
@Test
public void childrenContentTest() {
buildStandardTestTree();
StringTreeNode nextnode = tree.navigate("Sc1");
ArrayList<String> expectedChildren = new ArrayList<String>(Arrays.asList("Reg1", "Reg2"));
stringListsEqual(expectedChildren, nextnode.getChildrenContents());
}
@Test
public void deletionTest() {
buildStandardTestTree();
tree.navigate("Sc1").navigate("Reg2").delete();
ArrayList<String> expectedContents = new ArrayList<String>(
Arrays.asList("Sc1Reg1StateA", "Sc1Reg1StateB", "Sc1Reg1StateC", "Sc2Reg1StateA"));
stringListsEqual(expectedContents, tree.getContents());
}
@Test
public void addStringListReturnTest1() {
List<String> list = new ArrayList<String>(Arrays.asList("Un", "Deux", "Trois", "Quatre"));
StringTreeNode testNode = tree.addStringList(list);
assertEquals("UnDeuxTroisQuatre", testNode.getContentUpwards());
}
@Test
public void addStringListReturnTest2() {
List<String> list1 = new ArrayList<String>(Arrays.asList("Un", "Deux", "Trois", "Quatre"));
List<String> list2 = new ArrayList<String>(list1);
list2.add("Cinq");
tree.addStringList(list2);
StringTreeNode testNode = tree.addStringList(list1);
assertEquals("UnDeuxTroisQuatre", testNode.getContentUpwards());
}
@Test
public void weightTest() {
buildStandardTestTree();
assertEquals(15, tree.getWeight());
}
private void testSiblings(String testString, List<String> expectedSiblings) {
buildStandardTestTree();
stringListsEqual(tree.getSiblings(testString), expectedSiblings);
}
private void buildStandardTestTree() {
/*
* StateA / root-Sc1-Reg1-StateB \ \ \ \ \ StateC \ \ \ Reg2-StateA \
* Sc2-Reg1-StateA
*/
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc1", "Reg1", "StateA")));
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc1", "Reg1", "StateB")));
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc1", "Reg1", "StateC")));
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc1", "Reg2", "StateA")));
tree.addStringList(new ArrayList<String>(Arrays.asList("Sc2", "Reg1", "StateA")));
}
private void stringListsEqual(List<String> onelist, List<String> otherlist) {
java.util.Collections.sort(onelist, Collator.getInstance());
java.util.Collections.sort(otherlist, Collator.getInstance());
assertEquals(onelist, otherlist);
}
}