/* 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 . */ #include #include 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 root{new SelectorNode{mgr, "root"}}; Rooted A{new SelectorNode{mgr, "A"}}; Rooted AMy_Select{ new SelectorNode{mgr, "A", {"my_select", {"a", "b"}, false}}}; Rooted B{new SelectorNode{mgr, "B"}}; std::vector> 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> expected = {A}; std::vector> 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 root{new SelectorNode{mgr, "root"}}; // append a child. Rooted 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> children = root->getChildren("A"); ASSERT_EQ(1U, children.size()); ASSERT_EQ(A, children[0]); // append another child. Rooted 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 C{new SelectorNode{mgr, "C"}}; { Rooted 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 D{new SelectorNode{mgr, "D"}}; { Rooted pathA{new SelectorNode{mgr, "A"}}; Rooted 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> 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 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]); } } }