/* Copyright 2013 Statoil ASA. This file is part of the Open Porous Media project (OPM). OPM 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. OPM 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 OPM. If not, see . */ #include #define BOOST_TEST_MODULE GroupTreeTests #include #include #include using namespace Opm; BOOST_AUTO_TEST_CASE(CreateGroupTree_DefaultConstructor_HasFieldNode) { GroupTree tree; BOOST_CHECK(tree.getNode("FIELD")); } BOOST_AUTO_TEST_CASE(GetNode_NonExistingNode_ReturnsNull) { GroupTree tree; BOOST_CHECK_EQUAL(GroupTreeNodePtr(), tree.getNode("Non-existing")); } BOOST_AUTO_TEST_CASE(GetNodeAndParent_AllOK) { GroupTree tree; tree.updateTree("GRANDPARENT", "FIELD"); tree.updateTree("PARENT", "GRANDPARENT"); tree.updateTree("GRANDCHILD", "PARENT"); GroupTreeNodePtr grandchild = tree.getNode("GRANDCHILD"); BOOST_CHECK(grandchild); GroupTreeNodePtr parent = tree.getParent("GRANDCHILD"); BOOST_CHECK_EQUAL("PARENT", parent->name()); BOOST_CHECK(parent->hasChildGroup("GRANDCHILD")); } BOOST_AUTO_TEST_CASE(UpdateTree_ParentNotSpecified_AddedUnderField) { GroupTree tree; tree.updateTree("CHILD_OF_FIELD"); BOOST_CHECK(tree.getNode("CHILD_OF_FIELD")); GroupTreeNodePtr rootNode = tree.getNode("FIELD"); BOOST_CHECK(rootNode->hasChildGroup("CHILD_OF_FIELD")); } BOOST_AUTO_TEST_CASE(UpdateTree_ParentIsField_AddedUnderField) { GroupTree tree; tree.updateTree("CHILD_OF_FIELD", "FIELD"); BOOST_CHECK(tree.getNode("CHILD_OF_FIELD")); GroupTreeNodePtr rootNode = tree.getNode("FIELD"); BOOST_CHECK(rootNode->hasChildGroup("CHILD_OF_FIELD")); } BOOST_AUTO_TEST_CASE(UpdateTree_ParentNotAdded_ChildAndParentAdded) { GroupTree tree; tree.updateTree("CHILD", "NEWPARENT"); BOOST_CHECK(tree.getNode("CHILD")); GroupTreeNodePtr rootNode = tree.getNode("FIELD"); BOOST_CHECK(rootNode->hasChildGroup("NEWPARENT")); GroupTreeNodePtr newParent = tree.getNode("NEWPARENT"); BOOST_CHECK(newParent->hasChildGroup("CHILD")); } BOOST_AUTO_TEST_CASE(UpdateTree_AddFieldNode_Throws) { GroupTree tree; BOOST_CHECK_THROW(tree.updateTree("FIELD", "NEWPARENT"), std::domain_error); BOOST_CHECK_THROW(tree.updateTree("FIELD"), std::domain_error); } BOOST_AUTO_TEST_CASE(UpdateTree_ChildExists_ChildMoved) { GroupTree tree; tree.updateTree("OLDPARENT", "FIELD"); tree.updateTree("NEWPARENT", "FIELD"); tree.updateTree("THECHILD", "OLDPARENT"); tree.updateTree("GRANDCHILD1", "THECHILD"); tree.updateTree("GRANDCHILD2", "THECHILD"); GroupTreeNodePtr oldParent = tree.getNode("OLDPARENT"); BOOST_CHECK(oldParent->hasChildGroup("THECHILD")); GroupTreeNodePtr theChild = oldParent->getChildGroup("THECHILD"); BOOST_CHECK(theChild->hasChildGroup("GRANDCHILD1")); GroupTreeNodePtr newParent = tree.getNode("NEWPARENT"); BOOST_CHECK(!newParent->hasChildGroup("THECHILD")); tree.updateTree("THECHILD", "NEWPARENT"); BOOST_CHECK(!oldParent->hasChildGroup("THECHILD")); BOOST_CHECK(newParent->hasChildGroup("THECHILD")); theChild = newParent->getChildGroup("THECHILD"); BOOST_CHECK(theChild->hasChildGroup("GRANDCHILD1")); } BOOST_AUTO_TEST_CASE(DeepCopy_TreeWithChildren_ObjectsDifferContentMatch) { GroupTreePtr tree(new GroupTree()); tree->updateTree("L1CHILD1", "FIELD"); tree->updateTree("L1CHILD2", "FIELD"); tree->updateTree("L2CHILD1", "L1CHILD1"); tree->updateTree("L2CHILD2", "L1CHILD1"); tree->updateTree("L3CHILD1", "L2CHILD1"); GroupTreePtr copiedTree = tree->deepCopy(); GroupTreeNodePtr fieldNodeCopy = copiedTree->getNode("FIELD"); GroupTreeNodePtr fieldNodeOriginal = tree->getNode("FIELD"); BOOST_CHECK(!(fieldNodeCopy == fieldNodeOriginal)); BOOST_CHECK_EQUAL(fieldNodeCopy->name(), fieldNodeOriginal->name()); GroupTreeNodePtr L1CHILD1NodeCopy = fieldNodeCopy->getChildGroup("L1CHILD1"); GroupTreeNodePtr L1CHILD1NodeOriginal = fieldNodeOriginal->getChildGroup("L1CHILD1"); BOOST_CHECK(!(L1CHILD1NodeCopy == L1CHILD1NodeOriginal)); BOOST_CHECK_EQUAL(L1CHILD1NodeCopy->name(), L1CHILD1NodeOriginal->name()); GroupTreeNodePtr L1CHILD2NodeCopy = fieldNodeCopy->getChildGroup("L1CHILD2"); GroupTreeNodePtr L1CHILD2NodeOriginal = fieldNodeOriginal->getChildGroup("L1CHILD2"); BOOST_CHECK(!(L1CHILD2NodeCopy == L1CHILD2NodeOriginal)); BOOST_CHECK_EQUAL(L1CHILD2NodeCopy->name(), L1CHILD2NodeOriginal->name()); GroupTreeNodePtr L2CHILD1NodeCopy = L1CHILD1NodeCopy->getChildGroup("L2CHILD1"); GroupTreeNodePtr L2CHILD1NodeOriginal = L1CHILD1NodeOriginal->getChildGroup("L2CHILD1"); BOOST_CHECK(!(L2CHILD1NodeCopy == L2CHILD1NodeOriginal)); BOOST_CHECK_EQUAL(L2CHILD1NodeCopy->name(), L2CHILD1NodeOriginal->name()); GroupTreeNodePtr L2CHILD2NodeCopy = L1CHILD1NodeCopy->getChildGroup("L2CHILD2"); GroupTreeNodePtr L2CHILD2NodeOriginal = L1CHILD1NodeOriginal->getChildGroup("L2CHILD2"); BOOST_CHECK(!(L2CHILD2NodeCopy == L2CHILD2NodeOriginal)); BOOST_CHECK_EQUAL(L2CHILD2NodeCopy->name(), L2CHILD2NodeOriginal->name()); GroupTreeNodePtr L3CHILD1NodeCopy = L2CHILD1NodeCopy->getChildGroup("L3CHILD1"); GroupTreeNodePtr L3CHILD1NodeOriginal = L2CHILD1NodeOriginal->getChildGroup("L3CHILD1"); BOOST_CHECK(!(L3CHILD1NodeCopy == L3CHILD1NodeOriginal)); BOOST_CHECK_EQUAL(L3CHILD1NodeCopy->name(), L3CHILD1NodeOriginal->name()); } BOOST_AUTO_TEST_CASE(GetNodes_ReturnsAllNodes) { GroupTreePtr tree(new GroupTree()); tree->updateTree("L1CHILD1", "FIELD"); tree->updateTree("L1CHILD2", "FIELD"); tree->updateTree("L2CHILD1", "L1CHILD1"); tree->updateTree("L2CHILD2", "L1CHILD1"); tree->updateTree("L3CHILD1", "L2CHILD1"); std::vector nodes = tree->getNodes(); BOOST_CHECK_EQUAL(6U, nodes.size()); BOOST_CHECK_EQUAL("FIELD", nodes[0U]->name()); BOOST_CHECK_EQUAL("L1CHILD1", nodes[1U]->name()); BOOST_CHECK_EQUAL("L2CHILD1", nodes[2U]->name()); BOOST_CHECK_EQUAL("L3CHILD1", nodes[3U]->name()); BOOST_CHECK_EQUAL("L2CHILD2", nodes[4U]->name()); BOOST_CHECK_EQUAL("L1CHILD2", nodes[5U]->name()); }