BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
path.test.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // qt-mvvm: Model-view-view-model framework for large GUI applications
4 //
5 //! @file mvvm/tests/testmodel/path.test.cpp
6 //! @brief Implements class CLASS?
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2020
11 //! @authors Gennady Pospelov et al, Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "google_test.h"
16 #include "mvvm/model/modelutils.h"
17 #include "mvvm/model/path.h"
18 #include "mvvm/model/sessionitem.h"
20 #include "mvvm/model/taginfo.h"
21 #include <memory>
22 
23 using namespace ModelView;
24 
25 class PathTest : public ::testing::Test {
26 public:
28 };
29 
30 PathTest::~PathTest() = default;
31 
32 TEST_F(PathTest, initialState)
33 {
34  Path path;
35  EXPECT_TRUE(path.str().empty());
36 }
37 
38 TEST_F(PathTest, append)
39 {
40  Path path;
41  path.append(1);
42  EXPECT_EQ(path.str(), "1");
43 
44  path.append(2);
45  EXPECT_EQ(path.str(), "1,2");
46 
47  path.prepend(3);
48  EXPECT_EQ(path.str(), "3,1,2");
49 }
50 
51 TEST_F(PathTest, fromVector)
52 {
53  Path path = Path::fromVector({1, 2, 3});
54  EXPECT_EQ(path.str(), "1,2,3");
55 }
56 
57 TEST_F(PathTest, fromString)
58 {
59  Path path = Path::fromString("3,2,3");
60  EXPECT_EQ(path.str(), "3,2,3");
61 }
62 
64 {
65  SessionModel model;
66 
67  // unexisting path
68  EXPECT_TRUE(Utils::PathFromItem(nullptr).str().empty());
69  // yet another unexisting path
70  auto alienItem = std::make_unique<SessionItem>();
71  EXPECT_TRUE(Utils::PathFromItem(alienItem.get()).str().empty());
72 
73  // three children beneeth root item
74  auto item0 = model.insertItem<SessionItem>();
75  item0->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
76  auto item1 = model.insertItem<SessionItem>();
77  item1->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
78  auto item2 = model.insertItem<SessionItem>();
79  item2->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
80 
81  EXPECT_EQ(Utils::PathFromItem(item0).str(), "0");
82  EXPECT_EQ(Utils::PathFromItem(item1).str(), "1");
83  EXPECT_EQ(Utils::PathFromItem(item2).str(), "2");
84 
85  // adding granchildren to item0
86  auto child00 = model.insertItem<SessionItem>(item0);
87  auto child01 = model.insertItem<SessionItem>(item0);
88 
89  EXPECT_EQ(Utils::PathFromItem(child00).str(), "0,0");
90  EXPECT_EQ(Utils::PathFromItem(child01).str(), "0,1");
91 
92  // adding grandchildren to item2
93  auto child20 = model.insertItem<SessionItem>(item2);
94  child20->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
95 
96  auto child200 = model.insertItem<SessionItem>(child20);
97  auto child201 = model.insertItem<SessionItem>(child20);
98 
99  EXPECT_EQ(Utils::PathFromItem(child200).str(), "2,0,0");
100  EXPECT_EQ(Utils::PathFromItem(child201).str(), "2,0,1");
101 }
102 
103 TEST_F(PathTest, itemFromPath)
104 {
105  SessionModel model;
106 
107  // access to non-existing item
108  Path non_existing;
109  non_existing.append(8);
110  EXPECT_EQ(Utils::ItemFromPath(model, non_existing), nullptr);
111 
112  auto item0 = model.insertItem<SessionItem>();
113  item0->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
114  auto item1 = model.insertItem<SessionItem>();
115  item1->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
116  auto item2 = model.insertItem<SessionItem>();
117  item2->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
118 
119  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({0})), item0);
120  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({1})), item1);
121  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({2})), item2);
122 
123  auto child20 = model.insertItem<SessionItem>(item2);
124  child20->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
125  auto child200 = model.insertItem<SessionItem>(child20);
126  auto child201 = model.insertItem<SessionItem>(child20);
127 
128  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({2, 0})), child20);
129  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({2, 0, 0})), child200);
130  EXPECT_EQ(Utils::ItemFromPath(model, Path::fromVector({2, 0, 1})), child201);
131 }
Supports navigation through SessionModel.
Definition: path.h:35
void prepend(PathElement element)
Definition: path.cpp:62
static Path fromVector(const std::vector< int > &data)
Constructs Path object from vector of integers..
Definition: path.cpp:40
static Path fromString(const std::string &str)
Constructs Path object from string containing sequence of integers ("0,0,1,3").
Definition: path.cpp:25
std::string str() const
Returns string representing path ("0,0,1,3").
Definition: path.cpp:49
void append(PathElement element)
Definition: path.cpp:57
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
void registerTag(const TagInfo &tagInfo, bool set_as_default=false)
Registers tag to hold items under given name.
Main class to hold hierarchy of SessionItem objects.
Definition: sessionmodel.h:37
T * insertItem(SessionItem *parent=nullptr, const TagRow &tagrow={})
Inserts item into given parent under given tagrow.
Definition: sessionmodel.h:104
static TagInfo universalTag(std::string name, std::vector< std::string > modelTypes={})
Constructs universal tag intended for unlimited amount of various items.
Definition: taginfo.cpp:34
Defines class CLASS?
Defines class CLASS?
MVVM_MODEL_EXPORT SessionItem * ItemFromPath(const SessionModel &moodel, const Path &path)
Returns item found in the model following given Path.
Definition: modelutils.cpp:36
MVVM_MODEL_EXPORT Path PathFromItem(const SessionItem *item)
Constructs path to find given item. Item must belong to a model.
Definition: modelutils.cpp:22
materialitems.h Collection of materials to populate MaterialModel.
Defines class CLASS?
TEST_F(PathTest, initialState)
Definition: path.test.cpp:32
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?