BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
itemutils.test.cpp File Reference

Implements class CLASS? More...

Include dependency graph for itemutils.test.cpp:

Go to the source code of this file.

Classes

class  ItemUtilsTest
 

Functions

 TEST_F (ItemUtilsTest, CastedItems)
 
 TEST_F (ItemUtilsTest, FindNextItemToSelect)
 Looking for previous item. More...
 
 TEST_F (ItemUtilsTest, FindNextSibling)
 Looking for next item. More...
 
 TEST_F (ItemUtilsTest, FindPreviousSibling)
 Looking for previous item. More...
 
 TEST_F (ItemUtilsTest, HasTag)
 Checks method ::HasTag. More...
 
 TEST_F (ItemUtilsTest, IsItemAncestor)
 Looking for previous item. More...
 
 TEST_F (ItemUtilsTest, IsSinglePropertyTag)
 Checks method ::IsSinglePropertyTag. More...
 
 TEST_F (ItemUtilsTest, itemCopyNumber)
 Copy number of child in parents tree. More...
 
 TEST_F (ItemUtilsTest, iterateIfItem)
 Conditional iteration over item and its children. More...
 
 TEST_F (ItemUtilsTest, iterateItem)
 Simple iteration over item and its children. More...
 
 TEST_F (ItemUtilsTest, iterateModel)
 Iteration over root item of the model. More...
 
 TEST_F (ItemUtilsTest, RegisteredTags)
 Checks method ::RegisteredTags. More...
 
 TEST_F (ItemUtilsTest, RegisteredUniversalTags)
 Checks method ::RegisteredUniversalTags. More...
 
 TEST_F (ItemUtilsTest, SinglePropertyItems)
 Check access to top level and property items. More...
 
 TEST_F (ItemUtilsTest, TopLevelItems)
 Check access to top level and property items. More...
 
 TEST_F (ItemUtilsTest, UniqueItems)
 

Detailed Description

Implements class CLASS?

Homepage:\n http://www.bornagainproject.org
License:\n GNU General Public License v3 or higher (see COPYING)
Authors
Gennady Pospelov et al, Scientific Computing Group at MLZ (see CITATION, AUTHORS)

Definition in file itemutils.test.cpp.

Function Documentation

◆ TEST_F() [1/16]

TEST_F ( ItemUtilsTest  ,
CastedItems   
)

Definition at line 319 of file itemutils.test.cpp.

320 {
321  SessionModel model;
322  auto item0 = model.insertItem<SessionItem>(model.rootItem());
323  auto item1 = model.insertItem<PropertyItem>(model.rootItem());
324  auto item2 = model.insertItem<VectorItem>(model.rootItem());
325  std::vector<SessionItem*> data = {nullptr, item0, item1, item2, item0, item1, item2, nullptr};
326 
327  EXPECT_EQ(Utils::CastedItems<PropertyItem>(data), std::vector<PropertyItem*>({item1, item1}));
328 }
Item to carry concrete editable entity (e.g.
Definition: propertyitem.h:27
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
Main class to hold hierarchy of SessionItem objects.
Definition: sessionmodel.h:37
SessionItem * rootItem() const
Returns root item of the model.
T * insertItem(SessionItem *parent=nullptr, const TagRow &tagrow={})
Inserts item into given parent under given tagrow.
Definition: sessionmodel.h:104
Vector item with three x,y,z property items.
Definition: vectoritem.h:24

References ModelView::SessionModel::insertItem(), and ModelView::SessionModel::rootItem().

Here is the call graph for this function:

◆ TEST_F() [2/16]

TEST_F ( ItemUtilsTest  ,
FindNextItemToSelect   
)

Looking for previous item.

Definition at line 265 of file itemutils.test.cpp.

266 {
267  SessionModel model;
268 
269  auto parent = model.insertItem<SessionItem>();
270  parent->registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
271  parent->registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
272 
273  auto property = model.insertItem<PropertyItem>(parent, "property_tag");
274  auto child0 = model.insertItem<SessionItem>(parent, "default_tag");
275  auto child1 = model.insertItem<SessionItem>(parent, "default_tag");
276  auto child2 = model.insertItem<SessionItem>(parent, "default_tag");
277 
278  EXPECT_EQ(Utils::FindNextItemToSelect(child0), child1);
279  EXPECT_EQ(Utils::FindNextItemToSelect(child1), child2);
280  EXPECT_EQ(Utils::FindNextItemToSelect(child2), child1);
281  EXPECT_EQ(Utils::FindNextItemToSelect(property), parent);
282  EXPECT_EQ(Utils::FindNextItemToSelect(parent), model.rootItem());
283 }
void registerTag(const TagInfo &tagInfo, bool set_as_default=false)
Registers tag to hold items under given name.
const model_type PropertyType
Definition: mvvm_types.h:59
MVVM_MODEL_EXPORT SessionItem * FindNextItemToSelect(SessionItem *item)
Finds next item to select Method is used in the context of next item selection after given item was d...
Definition: itemutils.cpp:149

References ModelView::Utils::FindNextItemToSelect(), ModelView::SessionModel::insertItem(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), ModelView::SessionModel::rootItem(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [3/16]

TEST_F ( ItemUtilsTest  ,
FindNextSibling   
)

Looking for next item.

Definition at line 221 of file itemutils.test.cpp.

222 {
223  SessionModel model;
224 
225  auto parent = model.insertItem<SessionItem>();
226  parent->registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
227  parent->registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
228 
229  auto property = model.insertItem<PropertyItem>(parent, "property_tag");
230  auto child0 = model.insertItem<SessionItem>(parent, "default_tag");
231  auto child1 = model.insertItem<SessionItem>(parent, "default_tag");
232  auto child2 = model.insertItem<SessionItem>(parent, "default_tag");
233 
234  EXPECT_EQ(Utils::FindNextSibling(child0), child1);
235  EXPECT_EQ(Utils::FindNextSibling(child1), child2);
236  EXPECT_EQ(Utils::FindNextSibling(child2), nullptr);
237  EXPECT_EQ(Utils::FindNextSibling(property), nullptr);
238  EXPECT_EQ(Utils::FindNextSibling(parent), nullptr);
239 }
MVVM_MODEL_EXPORT SessionItem * FindNextSibling(SessionItem *item)
Returns next sibling with same tag.
Definition: itemutils.cpp:131

References ModelView::Utils::FindNextSibling(), ModelView::SessionModel::insertItem(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [4/16]

TEST_F ( ItemUtilsTest  ,
FindPreviousSibling   
)

Looking for previous item.

Definition at line 243 of file itemutils.test.cpp.

244 {
245  SessionModel model;
246 
247  auto parent = model.insertItem<SessionItem>();
248  parent->registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
249  parent->registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
250 
251  auto property = model.insertItem<PropertyItem>(parent, "property_tag");
252  auto child0 = model.insertItem<SessionItem>(parent, "default_tag");
253  auto child1 = model.insertItem<SessionItem>(parent, "default_tag");
254  auto child2 = model.insertItem<SessionItem>(parent, "default_tag");
255 
256  EXPECT_EQ(Utils::FindPreviousSibling(child0), nullptr);
257  EXPECT_EQ(Utils::FindPreviousSibling(child1), child0);
258  EXPECT_EQ(Utils::FindPreviousSibling(child2), child1);
259  EXPECT_EQ(Utils::FindPreviousSibling(property), nullptr);
260  EXPECT_EQ(Utils::FindPreviousSibling(parent), nullptr);
261 }
MVVM_MODEL_EXPORT SessionItem * FindPreviousSibling(SessionItem *item)
Returns previous sibling with same tag.
Definition: itemutils.cpp:140

References ModelView::Utils::FindPreviousSibling(), ModelView::SessionModel::insertItem(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [5/16]

TEST_F ( ItemUtilsTest  ,
HasTag   
)

Checks method ::HasTag.

Definition at line 133 of file itemutils.test.cpp.

134 {
135  SessionItem item;
136  item.registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
137 
138  EXPECT_TRUE(Utils::HasTag(item, "default_tag"));
139  EXPECT_FALSE(Utils::HasTag(item, "nonexisting_tag"));
140 }
MVVM_MODEL_EXPORT bool HasTag(const SessionItem &item, const std::string &tag)
Returns true if given item has registered tag.
Definition: itemutils.cpp:86

References ModelView::Utils::HasTag(), ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [6/16]

TEST_F ( ItemUtilsTest  ,
IsItemAncestor   
)

Looking for previous item.

Definition at line 287 of file itemutils.test.cpp.

288 {
289  SessionModel model;
290  EXPECT_FALSE(Utils::IsItemAncestor(model.rootItem(), model.rootItem()));
291 
292  // rootItem in ancestor of vectorItem, but not vice versa
293  auto vector_item = model.insertItem<VectorItem>();
294  EXPECT_TRUE(Utils::IsItemAncestor(vector_item, model.rootItem()));
295  EXPECT_FALSE(Utils::IsItemAncestor(model.rootItem(), vector_item));
296 
297  auto x_item = vector_item->getItem(VectorItem::P_X);
298 
299  EXPECT_TRUE(Utils::IsItemAncestor(x_item, model.rootItem()));
300  EXPECT_TRUE(Utils::IsItemAncestor(x_item, vector_item));
301  EXPECT_FALSE(Utils::IsItemAncestor(model.rootItem(), x_item));
302  EXPECT_FALSE(Utils::IsItemAncestor(vector_item, x_item));
303 
304  auto y_item = vector_item->getItem(VectorItem::P_Y);
305  EXPECT_FALSE(Utils::IsItemAncestor(x_item, y_item));
306 }
static const QString P_Y
Definition: VectorItem.h:25
static const QString P_X
Definition: VectorItem.h:24
MVVM_MODEL_EXPORT bool IsItemAncestor(const SessionItem *item, const SessionItem *candidate)
Returns true if 'candidate' is one of ancestor of given item.
Definition: itemutils.cpp:156

References ModelView::SessionModel::insertItem(), ModelView::Utils::IsItemAncestor(), ModelView::VectorItem::P_X, ModelView::VectorItem::P_Y, and ModelView::SessionModel::rootItem().

Here is the call graph for this function:

◆ TEST_F() [7/16]

TEST_F ( ItemUtilsTest  ,
IsSinglePropertyTag   
)

Checks method ::IsSinglePropertyTag.

Definition at line 144 of file itemutils.test.cpp.

145 {
146  SessionItem item;
147  item.registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
148  item.registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
149 
150  EXPECT_FALSE(Utils::IsSinglePropertyTag(item, "default_tag"));
151  EXPECT_TRUE(Utils::IsSinglePropertyTag(item, "property_tag"));
152 }
MVVM_MODEL_EXPORT bool IsSinglePropertyTag(const SessionItem &item, const std::string &tag)
Returns true if given item has registered tag, and it belongs to single property.
Definition: itemutils.cpp:91

References ModelView::Utils::IsSinglePropertyTag(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [8/16]

TEST_F ( ItemUtilsTest  ,
itemCopyNumber   
)

Copy number of child in parents tree.

Definition at line 115 of file itemutils.test.cpp.

116 {
117  SessionModel model;
118 
119  auto parent = model.insertItem<SessionItem>();
120  parent->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
121 
122  auto child1 = model.insertItem<SessionItem>(parent);
123  auto child2 = model.insertItem<SessionItem>(parent);
124  auto child3 = model.insertItem<PropertyItem>(parent);
125 
126  EXPECT_EQ(Utils::CopyNumber(child1), 0);
127  EXPECT_EQ(Utils::CopyNumber(child2), 1);
128  EXPECT_EQ(Utils::CopyNumber(child3), -1);
129 }
MVVM_MODEL_EXPORT int CopyNumber(const SessionItem *item)
Returns copy number of given item in it's parent hierarchy.
Definition: itemutils.cpp:49

References ModelView::Utils::CopyNumber(), ModelView::SessionModel::insertItem(), ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [9/16]

TEST_F ( ItemUtilsTest  ,
iterateIfItem   
)

Conditional iteration over item and its children.

Definition at line 65 of file itemutils.test.cpp.

66 {
67  std::vector<const SessionItem*> visited_items;
68 
69  // function which will not let iterate over children
70  std::function<bool(const SessionItem*)> fun = [&](const SessionItem* item) {
71  visited_items.push_back(item);
72  return false;
73  };
74 
75  // iteration over lonely parent
76  std::unique_ptr<SessionItem> parent(new SessionItem);
77  parent->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
78 
79  auto child1 = new SessionItem;
80  auto child2 = new SessionItem;
81  parent->insertItem(child1, TagRow::append());
82  parent->insertItem(child2, TagRow::append());
83 
84  std::vector<const SessionItem*> expected = {parent.get()};
85  Utils::iterate_if(parent.get(), fun);
86  EXPECT_EQ(visited_items, expected);
87 }
bool insertItem(SessionItem *item, const TagRow &tagrow)
Insert item into given tag under the given row.
void iterate_if(const QModelIndex &index, const QAbstractItemModel *model, const std::function< bool(const QModelIndex &)> &fun)
Iterates through all model indices and calls user function.
Definition: ModelUtils.cpp:47

References ModelView::TagRow::append(), ModelView::SessionItem::insertItem(), ModelView::Utils::iterate_if(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [10/16]

TEST_F ( ItemUtilsTest  ,
iterateItem   
)

Simple iteration over item and its children.

Definition at line 32 of file itemutils.test.cpp.

33 {
34  std::vector<const SessionItem*> visited_items;
35 
36  auto fun = [&](const SessionItem* item) { visited_items.push_back(item); };
37 
38  // iteration over nullptr
39  Utils::iterate(nullptr, fun);
40  EXPECT_TRUE(visited_items.empty());
41 
42  // iteration over lonely parent
43  std::unique_ptr<SessionItem> parent(new SessionItem);
44  parent->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
45 
46  std::vector<const SessionItem*> expected = {parent.get()};
47  Utils::iterate(parent.get(), fun);
48  EXPECT_EQ(visited_items, expected);
49 
50  // adding children
51  auto child1 = new SessionItem;
52  auto child2 = new SessionItem;
53  parent->insertItem(child1, TagRow::append());
54  parent->insertItem(child2, TagRow::append());
55 
56  visited_items.clear();
57  Utils::iterate(parent.get(), fun);
58 
59  expected = {parent.get(), child1, child2};
60  EXPECT_EQ(visited_items, expected);
61 }
void iterate(const QModelIndex &index, const QAbstractItemModel *model, const std::function< void(const QModelIndex &)> &fun)
Iterates through all model indices and calls user function.
Definition: ModelUtils.cpp:33

References ModelView::TagRow::append(), ModelView::SessionItem::insertItem(), ModelView::Utils::iterate(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [11/16]

TEST_F ( ItemUtilsTest  ,
iterateModel   
)

Iteration over root item of the model.

Definition at line 91 of file itemutils.test.cpp.

92 {
93  SessionModel model;
94 
95  // building model
96  auto parent1 = model.insertItem<SessionItem>();
97  auto parent2 = model.insertItem<SessionItem>();
98  parent1->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
99  parent2->registerTag(TagInfo::universalTag("defaultTag"), /*set_as_default*/ true);
100  auto child1 = model.insertItem<SessionItem>(parent1);
101  auto child2 = model.insertItem<SessionItem>(parent1);
102 
103  std::vector<const SessionItem*> visited_items;
104  auto fun = [&](const SessionItem* item) { visited_items.push_back(item); };
105 
106  // iteration
107  Utils::iterate(model.rootItem(), fun);
108 
109  std::vector<const SessionItem*> expected = {model.rootItem(), parent1, child1, child2, parent2};
110  EXPECT_EQ(visited_items, expected);
111 }

References ModelView::SessionModel::insertItem(), ModelView::Utils::iterate(), ModelView::SessionItem::registerTag(), ModelView::SessionModel::rootItem(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [12/16]

TEST_F ( ItemUtilsTest  ,
RegisteredTags   
)

Checks method ::RegisteredTags.

Definition at line 156 of file itemutils.test.cpp.

157 {
158  SessionItem item;
159  EXPECT_TRUE(Utils::RegisteredTags(item).empty());
160 
161  item.registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
162  item.registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
163 
164  EXPECT_EQ(Utils::RegisteredTags(item),
165  std::vector<std::string>({"default_tag", "property_tag"}));
166 }
MVVM_MODEL_EXPORT std::vector< std::string > RegisteredTags(const SessionItem &item)
Returns vector of strings containing all registered tags of the given item.
Definition: itemutils.cpp:96

References ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::Utils::RegisteredTags(), ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [13/16]

TEST_F ( ItemUtilsTest  ,
RegisteredUniversalTags   
)

Checks method ::RegisteredUniversalTags.

Definition at line 170 of file itemutils.test.cpp.

171 {
172  SessionItem item;
173  EXPECT_TRUE(Utils::RegisteredUniversalTags(item).empty());
174 
175  item.registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
176  item.registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
177 
178  EXPECT_EQ(Utils::RegisteredUniversalTags(item), std::vector<std::string>({"default_tag"}));
179 }
MVVM_MODEL_EXPORT std::vector< std::string > RegisteredUniversalTags(const SessionItem &item)
Returns vector of strings containing all registered universal tags of the given item.
Definition: itemutils.cpp:104

References ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::Utils::RegisteredUniversalTags(), ModelView::SessionItem::registerTag(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [14/16]

TEST_F ( ItemUtilsTest  ,
SinglePropertyItems   
)

Check access to top level and property items.

Definition at line 202 of file itemutils.test.cpp.

203 {
204  SessionModel model;
205 
206  auto parent = model.insertItem<SessionItem>();
207  parent->registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
208  parent->registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
209 
210  auto child1 = model.insertItem<SessionItem>(parent, "default_tag");
211  auto child2 = model.insertItem<PropertyItem>(parent, "property_tag");
212  model.insertItem<SessionItem>(parent, "default_tag");
213 
214  EXPECT_EQ(Utils::SinglePropertyItems(*model.rootItem()), std::vector<SessionItem*>({}));
215  EXPECT_EQ(Utils::SinglePropertyItems(*child1), std::vector<SessionItem*>({}));
216  EXPECT_EQ(Utils::SinglePropertyItems(*parent), std::vector<SessionItem*>({child2}));
217 }
MVVM_MODEL_EXPORT std::vector< SessionItem * > SinglePropertyItems(const SessionItem &item)
Returns vector of children representing property items.
Definition: itemutils.cpp:122

References ModelView::SessionModel::insertItem(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), ModelView::SessionModel::rootItem(), ModelView::Utils::SinglePropertyItems(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [15/16]

TEST_F ( ItemUtilsTest  ,
TopLevelItems   
)

Check access to top level and property items.

Definition at line 183 of file itemutils.test.cpp.

184 {
185  SessionModel model;
186 
187  auto parent = model.insertItem<SessionItem>();
188  parent->registerTag(TagInfo::universalTag("default_tag"), /*set_as_default*/ true);
189  parent->registerTag(TagInfo::propertyTag("property_tag", Constants::PropertyType));
190 
191  auto child1 = model.insertItem<SessionItem>(parent, "default_tag");
192  model.insertItem<PropertyItem>(parent, "property_tag");
193  auto child3 = model.insertItem<SessionItem>(parent, "default_tag");
194 
195  EXPECT_EQ(Utils::TopLevelItems(*model.rootItem()), std::vector<SessionItem*>({parent}));
196  EXPECT_EQ(Utils::TopLevelItems(*child1), std::vector<SessionItem*>({}));
197  EXPECT_EQ(Utils::TopLevelItems(*parent), std::vector<SessionItem*>({child1, child3}));
198 }
MVVM_MODEL_EXPORT std::vector< SessionItem * > TopLevelItems(const SessionItem &item)
Returns vector of children representing top level items.
Definition: itemutils.cpp:113

References ModelView::SessionModel::insertItem(), ModelView::TagInfo::propertyTag(), ModelView::Constants::PropertyType, ModelView::SessionItem::registerTag(), ModelView::SessionModel::rootItem(), ModelView::Utils::TopLevelItems(), and ModelView::TagInfo::universalTag().

Here is the call graph for this function:

◆ TEST_F() [16/16]

TEST_F ( ItemUtilsTest  ,
UniqueItems   
)

Definition at line 308 of file itemutils.test.cpp.

309 {
310  SessionModel model;
311  auto item0 = model.insertItem<SessionItem>(model.rootItem());
312  auto item1 = model.insertItem<SessionItem>(model.rootItem());
313  auto item2 = model.insertItem<SessionItem>(model.rootItem());
314  std::vector<SessionItem*> data = {nullptr, item0, item1, item2, item0, item2, nullptr};
315  std::vector<SessionItem*> expected = {item0, item1, item2};
316  EXPECT_EQ(Utils::UniqueItems(data), expected);
317 }
MVVM_MODEL_EXPORT std::vector< SessionItem * > UniqueItems(const std::vector< SessionItem * > &items)
Returns vector with duplicates and 'nullptr' filtered out.
Definition: itemutils.cpp:170

References ModelView::SessionModel::insertItem(), ModelView::SessionModel::rootItem(), and ModelView::Utils::UniqueItems().

Here is the call graph for this function: