summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/core/CSSTest.cpp104
1 files changed, 102 insertions, 2 deletions
diff --git a/test/core/CSSTest.cpp b/test/core/CSSTest.cpp
index fdb8238..5bbb492 100644
--- a/test/core/CSSTest.cpp
+++ b/test/core/CSSTest.cpp
@@ -125,8 +125,7 @@ TEST(SelectorNode, testGetChildren)
std::vector<Rooted<SelectorNode>> children = {A, AMy_Select, B};
for (auto &c : children) {
- root->getEdges().push_back(new SelectorNode::SelectorEdge{
- mgr, c, SelectionOperator::DESCENDANT});
+ root->getEdges().push_back(new SelectorNode::SelectorEdge{mgr, c});
}
root->getEdges().push_back(new SelectorNode::SelectorEdge{
mgr, B, SelectionOperator::DIRECT_DESCENDANT});
@@ -166,4 +165,105 @@ TEST(SelectorNode, testGetChildren)
actual = root->getChildren();
ASSERT_EQ(expected, actual);
}
+
+TEST(SelectorNode, testAppend)
+{
+ Manager mgr(1);
+ // build the root.
+ Rooted<SelectorNode> root{new SelectorNode{mgr, "root"}};
+ // append a child.
+ Rooted<SelectorNode> A{new SelectorNode{mgr, "A"}};
+ // this should work without any unmerged leafs.
+ ASSERT_EQ(0, (root->append(A)).size());
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * |
+ * A
+ */
+ ASSERT_EQ(1, (root->getEdges()).size());
+ std::vector<Rooted<SelectorNode>> children = root->getChildren("A");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(A, children[0]);
+
+ // append another child.
+ Rooted<SelectorNode> B{new SelectorNode{mgr, "B"}};
+ ASSERT_EQ(0, (root->append(B)).size());
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ */
+ ASSERT_EQ(2, (root->getEdges()).size());
+ children = root->getChildren("B");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(B, children[0]);
+
+ // append a grandchild using a path.
+ Rooted<SelectorNode> C{new SelectorNode{mgr, "C"}};
+ {
+ Rooted<SelectorNode> pathA{new SelectorNode{mgr, "A"}};
+ pathA->append(C);
+
+ ASSERT_EQ(0, (root->append(pathA)).size());
+ }
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ * |
+ * C
+ */
+ ASSERT_EQ(2, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(1, (children[0]->getEdges()).size());
+ children = children[0]->getChildren("C");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(C, children[0]);
+
+ // append a subtree that is partially contained.
+ Rooted<SelectorNode> D{new SelectorNode{mgr, "D"}};
+ {
+ Rooted<SelectorNode> pathA{new SelectorNode{mgr, "A"}};
+ Rooted<SelectorNode> pathC{new SelectorNode{mgr, "C"}};
+ pathA->append(pathC);
+ pathA->append(D);
+
+ // The C leaf can not be appended because it is already part of the
+ // tree. So we expect that as a return value.
+ std::vector<Rooted<SelectorNode>> unmergedLeafs = root->append(pathA);
+ ASSERT_EQ(1,unmergedLeafs.size());
+ ASSERT_EQ(C.get(),unmergedLeafs[0].get());
+ }
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ * |\
+ * C D
+ */
+ ASSERT_EQ(2, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(2, (children[0]->getEdges()).size());
+ children = children[0]->getChildren("D");
+ ASSERT_EQ(1, children.size());
+ ASSERT_EQ(D, children[0]);
+
+ // append a child with a non-trivial PseudoSelector.
+ Rooted<SelectorNode> ASelect {new SelectorNode{mgr, "A", {"my_select", {"a","b"},false}}};
+ ASSERT_EQ(0, (root->append(ASelect)).size());
+ ASSERT_EQ(3, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(2, children.size());
+ ASSERT_EQ(ASelect, children[1]);
+}
}