BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
modelutils.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/modelutils.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 "toyitems.h"
18 #include "toymodel.h"
19 
20 using namespace ModelView;
21 
22 class ModelUtilsTest : public ::testing::Test {
23 public:
25 };
26 
28 
30 {
32  EXPECT_EQ(Utils::TopItem<>(&model), nullptr);
33  EXPECT_EQ(Utils::TopItem<SessionItem>(&model), nullptr);
34  EXPECT_EQ(Utils::TopItem<ToyItems::MultiLayerItem>(&model), nullptr);
35 
36  auto multilayer1 = model.insertItem<ToyItems::MultiLayerItem>();
38 
39  EXPECT_EQ(Utils::TopItem<>(&model), multilayer1);
40  EXPECT_EQ(Utils::TopItem<SessionItem>(&model), multilayer1);
41  EXPECT_EQ(Utils::TopItem<ToyItems::MultiLayerItem>(&model), multilayer1);
42 }
43 
45 {
47  EXPECT_EQ(Utils::TopItems<>(&model).size(), 0);
48  EXPECT_EQ(Utils::TopItems<SessionItem>(&model).size(), 0);
49  EXPECT_EQ(Utils::TopItems<ToyItems::MultiLayerItem>(&model).size(), 0);
50 
51  auto multilayer1 = model.insertItem<ToyItems::MultiLayerItem>();
52  auto particle = model.insertItem<ToyItems::ParticleItem>();
53  auto multilayer2 = model.insertItem<ToyItems::MultiLayerItem>();
54 
55  std::vector<SessionItem*> expected1 = {multilayer1, particle, multilayer2};
56  EXPECT_EQ(Utils::TopItems<SessionItem>(&model), expected1);
57  std::vector<ToyItems::MultiLayerItem*> expected2 = {multilayer1, multilayer2};
58  EXPECT_EQ(Utils::TopItems<ToyItems::MultiLayerItem>(&model), expected2);
59 }
60 
62 {
64  EXPECT_EQ(Utils::FindItems<>(&model).size(), 1); // because of rootItem
65  EXPECT_EQ(Utils::FindItems<SessionItem>(&model).size(), 1); // because of rootItem
66  EXPECT_EQ(Utils::FindItems<ToyItems::MultiLayerItem>(&model).size(), 0);
67 
68  auto multilayer1 = model.insertItem<ToyItems::MultiLayerItem>();
70  auto multilayer2 = model.insertItem<ToyItems::MultiLayerItem>();
71 
72  std::vector<ToyItems::MultiLayerItem*> expected2 = {multilayer1, multilayer2};
73  EXPECT_EQ(Utils::FindItems<ToyItems::MultiLayerItem>(&model), expected2);
74 
75  // adding layers to multilayer
76  auto layer1 = model.insertItem<ToyItems::LayerItem>(multilayer1);
77  auto layer2 = model.insertItem<ToyItems::LayerItem>(multilayer2);
78 
79  std::vector<ToyItems::LayerItem*> expected3 = {layer1, layer2};
80  EXPECT_EQ(Utils::FindItems<ToyItems::LayerItem>(&model), expected3);
81 }
82 
84 {
86  auto layer = model.insertItem<ToyItems::LayerItem>();
88 
89  auto modelCopy = Utils::CreateCopy<ToyItems::SampleModel>(model);
90  auto layerCopy = modelCopy->topItem<ToyItems::LayerItem>();
91  EXPECT_EQ(layerCopy->property<double>(ToyItems::LayerItem::P_THICKNESS), 42.0);
92 
93  // Copied model has unique identifiers
94  EXPECT_FALSE(model.rootItem()->identifier() == modelCopy->rootItem()->identifier());
95  EXPECT_FALSE(layerCopy->identifier() == layer->identifier());
96 }
97 
99 {
100  ToyItems::SampleModel model;
101  auto layer = model.insertItem<ToyItems::LayerItem>();
103 
104  auto modelCopy = Utils::CreateClone<ToyItems::SampleModel>(model);
105  auto layerCopy = modelCopy->topItem<ToyItems::LayerItem>();
106  EXPECT_EQ(layerCopy->property<double>(ToyItems::LayerItem::P_THICKNESS), 42.0);
107 
108  // Copied model has unique identifiers
109  EXPECT_TRUE(layerCopy->identifier() == layer->identifier());
110 
111  // root item by current conveniton still has unique identifier event for cloned model
112  // probably for the uniformity this has to be changed, and test below changed to EXPECT_TRUE
113  // This will require change in JsonModelConverter
114  EXPECT_FALSE(model.rootItem()->identifier() == modelCopy->rootItem()->identifier());
115 }
116 
118 {
119  ToyItems::SampleModel model;
120 
121  auto item = model.insertItem<SessionItem>();
122  EXPECT_EQ(model.rootItem()->childrenCount(), 1);
124  EXPECT_EQ(model.rootItem()->childrenCount(), 0);
125 }
126 
127 TEST_F(ModelUtilsTest, MoveItemUp)
128 {
129  ToyItems::SampleModel model;
130 
131  auto multilayer = model.insertItem<ToyItems::MultiLayerItem>();
132  auto layer0 = model.insertItem<ToyItems::LayerItem>(multilayer);
133  auto layer1 = model.insertItem<ToyItems::LayerItem>(multilayer);
134  auto layer2 = model.insertItem<ToyItems::LayerItem>(multilayer);
135 
136  std::vector<SessionItem*> expected = {layer0, layer1, layer2};
137 
138  // original layout
139  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
140 
141  // moving top layer up doesn't change the order
142  Utils::MoveUp(layer0);
143  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
144 
145  // moving bottom layer up does change the order
146  Utils::MoveUp(layer2);
147  expected = {layer0, layer2, layer1};
148  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
149 }
150 
151 TEST_F(ModelUtilsTest, MoveItemDown)
152 {
153  ToyItems::SampleModel model;
154 
155  auto multilayer = model.insertItem<ToyItems::MultiLayerItem>();
156  auto layer0 = model.insertItem<ToyItems::LayerItem>(multilayer);
157  auto layer1 = model.insertItem<ToyItems::LayerItem>(multilayer);
158  auto layer2 = model.insertItem<ToyItems::LayerItem>(multilayer);
159 
160  std::vector<SessionItem*> expected = {layer0, layer1, layer2};
161 
162  // original layout
163  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
164 
165  // moving bottom layer down doesn't change the order
166  Utils::MoveDown(layer2);
167  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
168 
169  // moving top layer down doesn't change the order
170  Utils::MoveDown(layer0);
171  expected = {layer1, layer0, layer2};
172  EXPECT_EQ(multilayer->getItems(ToyItems::MultiLayerItem::T_LAYERS), expected);
173 }
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
std::string identifier() const
Returns unique identifier.
Definition: sessionitem.cpp:87
int childrenCount() const
Returns total number of children in all tags.
void setProperty(const std::string &tag, const T &value)
Sets value to property item.
Definition: sessionitem.h:190
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
Represents a layer, with thickness and color, and possibly populated with particles.
Definition: toyitems.h:52
static const std::string P_THICKNESS
Definition: toyitems.h:54
Represents multilayer with collection of layers.
Definition: toyitems.h:44
static const std::string T_LAYERS
Definition: toyitems.h:46
Represents a particle, with a position, and a selection of possible shapes.
Definition: toyitems.h:62
Defines class CLASS?
TEST_F(ModelUtilsTest, topItem)
Defines class CLASS?
std::unique_ptr< T > CreateCopy(const T &model)
Creates full deep copy of given model. All item's ID will be generated.
Definition: modelutils.h:81
MVVM_MODEL_EXPORT void MoveDown(SessionItem *item)
Moves item down (increments row of the item). Works on children belonging to single tag.
Definition: modelutils.cpp:71
MVVM_MODEL_EXPORT void MoveUp(SessionItem *item)
Moves item up (decrements row of the item). Works on children belonging to single tag.
Definition: modelutils.cpp:63
std::unique_ptr< T > CreateClone(const T &model)
Creates exact clone of given model. All item's ID will be preserved.
Definition: modelutils.h:90
MVVM_MODEL_EXPORT void DeleteItemFromModel(SessionItem *item)
Removes and deletes item from its model.
Definition: modelutils.cpp:54
materialitems.h Collection of materials to populate MaterialModel.
Defines class CLASS?
Defines class CLASS?