summaryrefslogtreecommitdiff
path: root/test/core/model/StyleTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/core/model/StyleTest.cpp')
-rw-r--r--test/core/model/StyleTest.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/test/core/model/StyleTest.cpp b/test/core/model/StyleTest.cpp
new file mode 100644
index 0000000..4727f4d
--- /dev/null
+++ b/test/core/model/StyleTest.cpp
@@ -0,0 +1,272 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <gtest/gtest.h>
+
+#include <core/model/Style.hpp>
+
+namespace ousia {
+namespace model {
+TEST(Specificity, testOperators)
+{
+ Specificity s1{0, 0, 1};
+ Specificity s2{0, 1, 1};
+ Specificity s3{1, 1, 1};
+ Specificity s4{0, 0, 2};
+ Specificity s5{1, 0, 2};
+
+ // This should be s1 < s4 < s2 < s5 < s3
+
+ ASSERT_TRUE(s1 == s1);
+ ASSERT_FALSE(s1 < s1);
+ ASSERT_FALSE(s1 > s1);
+ ASSERT_FALSE(s1 == s2);
+ ASSERT_TRUE(s1 < s2);
+ ASSERT_FALSE(s1 > s2);
+ ASSERT_FALSE(s1 == s3);
+ ASSERT_TRUE(s1 < s3);
+ ASSERT_FALSE(s1 > s3);
+ ASSERT_FALSE(s1 == s4);
+ ASSERT_TRUE(s1 < s4);
+ ASSERT_FALSE(s1 > s4);
+ ASSERT_FALSE(s1 == s5);
+ ASSERT_TRUE(s1 < s5);
+ ASSERT_FALSE(s1 > s5);
+
+ ASSERT_FALSE(s2 == s1);
+ ASSERT_FALSE(s2 < s1);
+ ASSERT_TRUE(s2 > s1);
+ ASSERT_TRUE(s2 == s2);
+ ASSERT_FALSE(s2 < s2);
+ ASSERT_FALSE(s2 > s2);
+ ASSERT_FALSE(s2 == s3);
+ ASSERT_TRUE(s2 < s3);
+ ASSERT_FALSE(s2 > s3);
+ ASSERT_FALSE(s2 == s4);
+ ASSERT_FALSE(s2 < s4);
+ ASSERT_TRUE(s2 > s4);
+ ASSERT_FALSE(s2 == s5);
+ ASSERT_TRUE(s2 < s5);
+ ASSERT_FALSE(s2 > s5);
+
+ ASSERT_FALSE(s3 == s1);
+ ASSERT_FALSE(s3 < s1);
+ ASSERT_TRUE(s3 > s1);
+ ASSERT_FALSE(s3 == s2);
+ ASSERT_FALSE(s3 < s2);
+ ASSERT_TRUE(s3 > s2);
+ ASSERT_TRUE(s3 == s3);
+ ASSERT_FALSE(s3 < s3);
+ ASSERT_FALSE(s3 > s3);
+ ASSERT_FALSE(s3 == s4);
+ ASSERT_FALSE(s3 < s4);
+ ASSERT_TRUE(s3 > s4);
+ ASSERT_FALSE(s3 == s5);
+ ASSERT_FALSE(s3 < s5);
+ ASSERT_TRUE(s3 > s5);
+
+ ASSERT_FALSE(s4 == s1);
+ ASSERT_FALSE(s4 < s1);
+ ASSERT_TRUE(s4 > s1);
+ ASSERT_FALSE(s4 == s2);
+ ASSERT_TRUE(s4 < s2);
+ ASSERT_FALSE(s4 > s2);
+ ASSERT_FALSE(s4 == s3);
+ ASSERT_TRUE(s4 < s3);
+ ASSERT_FALSE(s4 > s3);
+ ASSERT_TRUE(s4 == s4);
+ ASSERT_FALSE(s4 < s4);
+ ASSERT_FALSE(s4 > s4);
+ ASSERT_FALSE(s4 == s5);
+ ASSERT_TRUE(s4 < s5);
+ ASSERT_FALSE(s4 > s5);
+
+ ASSERT_FALSE(s5 == s1);
+ ASSERT_FALSE(s5 < s1);
+ ASSERT_TRUE(s5 > s1);
+ ASSERT_FALSE(s5 == s2);
+ ASSERT_FALSE(s5 < s2);
+ ASSERT_TRUE(s5 > s2);
+ ASSERT_FALSE(s5 == s3);
+ ASSERT_TRUE(s5 < s3);
+ ASSERT_FALSE(s5 > s3);
+ ASSERT_FALSE(s5 == s4);
+ ASSERT_FALSE(s5 < s4);
+ ASSERT_TRUE(s5 > s4);
+ ASSERT_TRUE(s5 == s5);
+ ASSERT_FALSE(s5 < s5);
+ ASSERT_FALSE(s5 > s5);
+}
+
+TEST(SelectorNode, testGetChildren)
+{
+ Manager mgr(1);
+ // build some children.
+ Rooted<SelectorNode> root{new SelectorNode{mgr, "root"}};
+ Rooted<SelectorNode> A{new SelectorNode{mgr, "A"}};
+ Rooted<SelectorNode> AMy_Select{
+ new SelectorNode{mgr, "A", {"my_select", {"a", "b"}, false}}};
+ Rooted<SelectorNode> B{new SelectorNode{mgr, "B"}};
+
+ std::vector<Rooted<SelectorNode>> children = {A, AMy_Select, B};
+
+ for (auto &c : children) {
+ root->getEdges().push_back(new SelectorNode::SelectorEdge{mgr, c});
+ }
+ root->getEdges().push_back(new SelectorNode::SelectorEdge{
+ mgr, B, SelectionOperator::DIRECT_DESCENDANT});
+
+ // make some checks.
+ std::vector<Rooted<SelectorNode>> expected = {A};
+ std::vector<Rooted<SelectorNode>> actual =
+ root->getChildren(SelectionOperator::DESCENDANT, "A", {"true", false});
+ ASSERT_EQ(expected, actual);
+
+ expected = {A, AMy_Select};
+ actual = root->getChildren(SelectionOperator::DESCENDANT, "A");
+ ASSERT_EQ(expected, actual);
+ actual = root->getChildren("A");
+ ASSERT_EQ(expected, actual);
+
+ expected = {A, AMy_Select, B};
+ actual = root->getChildren(SelectionOperator::DESCENDANT);
+ ASSERT_EQ(expected, actual);
+
+ expected = {B};
+ actual = root->getChildren(SelectionOperator::DIRECT_DESCENDANT);
+ ASSERT_EQ(expected, actual);
+
+ expected = {B, B};
+ actual = root->getChildren("B");
+ ASSERT_EQ(expected, actual);
+
+ {
+ expected = {A, B, B};
+ PseudoSelector select = {"true", false};
+ actual = root->getChildren(select);
+ ASSERT_EQ(expected, actual);
+ }
+
+ expected = {A, AMy_Select, B, B};
+ 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(0U, (root->append(A)).size());
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * |
+ * A
+ */
+ ASSERT_EQ(1U, (root->getEdges()).size());
+ std::vector<Rooted<SelectorNode>> children = root->getChildren("A");
+ ASSERT_EQ(1U, children.size());
+ ASSERT_EQ(A, children[0]);
+
+ // append another child.
+ Rooted<SelectorNode> B{new SelectorNode{mgr, "B"}};
+ ASSERT_EQ(0U, (root->append(B)).size());
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ */
+ ASSERT_EQ(2U, (root->getEdges()).size());
+ children = root->getChildren("B");
+ ASSERT_EQ(1U, 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(0U, (root->append(pathA)).size());
+ }
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ * |
+ * C
+ */
+ ASSERT_EQ(2U, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(1U, children.size());
+ ASSERT_EQ(1U, (children[0]->getEdges()).size());
+ children = children[0]->getChildren("C");
+ ASSERT_EQ(1U, 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(1U, unmergedLeafs.size());
+ ASSERT_EQ(C.get(), unmergedLeafs[0].get());
+ }
+ /*
+ * check the result. We expect the SelectorTree
+ *
+ * root
+ * | \
+ * A B
+ * |\
+ * C D
+ */
+ ASSERT_EQ(2U, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(1U, children.size());
+ ASSERT_EQ(2U, (children[0]->getEdges()).size());
+ children = children[0]->getChildren("D");
+ ASSERT_EQ(1U, 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(0U, (root->append(ASelect)).size());
+ ASSERT_EQ(3U, (root->getEdges()).size());
+ children = root->getChildren("A");
+ ASSERT_EQ(2U, children.size());
+ ASSERT_EQ(ASelect, children[1]);
+}
+}
+}