BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
jsonitemdataconverter.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/jsonitemdataconverter.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 "folderbasedtest.h"
16 #include "google_test.h"
18 #include "mvvm/model/mvvm_types.h"
23 #include "test_utils.h"
24 #include <QJsonArray>
25 #include <QJsonObject>
26 #include <string>
27 
28 using namespace ModelView;
29 
30 //! Test convertion of SessionItemData from/to QJsonObject.
31 
33 public:
34  JsonItemDataConverterTest() : FolderBasedTest("test_JsonItemData") {}
36 };
37 
39 
40 //! Creating QJsonArray from SessionItemData.
41 
43 {
44  JsonItemFormatAssistant assistant;
45  JsonItemDataConverter converter;
46 
47  // construction SessionItem data
48  SessionItemData data;
49  const int role = Qt::UserRole + 1;
50  data.setData(QVariant::fromValue(42), role);
51  data.setData(QVariant::fromValue(std::string("abc")), role + 2);
52 
53  // creating json object out of it
54  QJsonArray array = converter.to_json(data);
55 
56  // it should contain two json objects
57  EXPECT_EQ(array.size(), 2);
58  EXPECT_TRUE(array[0].isObject());
59  EXPECT_TRUE(array[1].isObject());
60 
61  // and these objects repesent DataRole
62  EXPECT_TRUE(assistant.isSessionItemData(array[0].toObject()));
63  EXPECT_TRUE(assistant.isSessionItemData(array[1].toObject()));
64 }
65 
66 //! From SessionItemData to json and back.
67 
68 TEST_F(JsonItemDataConverterTest, fromItemToJsonAndBack)
69 {
70  JsonItemDataConverter converter;
71 
72  // initial data
73  const std::vector<int> roles = {1, 2, 3};
74  const std::vector<QVariant> expected = {QVariant::fromValue(42), QVariant::fromValue(1.23),
75  QVariant::fromValue(std::string("abc"))};
76 
77  // constructing SessionItemData
78  SessionItemData data;
79  for (size_t i = 0; i < roles.size(); ++i)
80  data.setData(expected[i], roles[i]);
81 
82  // constructing json array from data
83  QJsonArray array = converter.to_json(data);
84  auto fileName = TestUtils::TestFileName(testDir(), "itemdata.json");
85  TestUtils::SaveJson(array, fileName);
86 
87  // constructing data from json array
88  SessionItemData data2;
89  converter.from_json(array, data2);
90  EXPECT_EQ(data2.roles().size(), 3u);
91 
92  EXPECT_EQ(data2.roles(), roles);
93  for (auto role : roles) {
94  EXPECT_EQ(data2.data(role), expected[role - 1]);
95  }
96 }
97 
98 //! By default tooltip role is enabled for read and write.
99 
101 {
102  // initial data
103  SessionItemData data;
104  data.setData(QVariant::fromValue(std::string("tooltip")), ItemDataRole::TOOLTIP);
105 
106  // constructing json array from data
107  JsonItemDataConverter converter;
108  QJsonArray array = converter.to_json(data);
109 
110  // constructing data from json array
111  SessionItemData data2;
112  converter.from_json(array, data2);
113  EXPECT_EQ(data2.roles().size(), 1u);
114  EXPECT_EQ(data2.data(ItemDataRole::TOOLTIP).value<std::string>(), "tooltip");
115 }
116 
117 //! Write filtered roles, read all into empty SessionItemData.
118 
119 TEST_F(JsonItemDataConverterTest, writeFilteredReadAll)
120 {
121  // initial data
122  SessionItemData data;
123  data.setData(QVariant::fromValue(std::string("abc")), ItemDataRole::IDENTIFIER);
124  data.setData(42, ItemDataRole::DATA);
125  data.setData(QVariant::fromValue(std::string("abc")), ItemDataRole::DISPLAY);
126  data.setData(QVariant::fromValue(std::string("tooltip")), ItemDataRole::TOOLTIP);
127 
128  // constructing json array from data
129  auto to_json_accept = [](auto role) { return role != ItemDataRole::TOOLTIP; };
130 
131  JsonItemDataConverter converter(to_json_accept, {});
132  QJsonArray array = converter.to_json(data);
133 
134  // constructing data from json array
135  SessionItemData data2;
136  converter.from_json(array, data2);
137  EXPECT_EQ(data2.roles().size(), 3u);
138  EXPECT_FALSE(data2.hasData(ItemDataRole::TOOLTIP));
139 }
140 
141 //! Write all roles, read filtered into empty SessionItemData.
142 
143 TEST_F(JsonItemDataConverterTest, writeAllReadFiltered)
144 {
145  // initial data
146  SessionItemData data;
147  data.setData(QVariant::fromValue(std::string("abc")), ItemDataRole::IDENTIFIER);
148  data.setData(42, ItemDataRole::DATA);
149  data.setData(QVariant::fromValue(std::string("abc")), ItemDataRole::DISPLAY);
150  data.setData(QVariant::fromValue(std::string("tooltip")), ItemDataRole::TOOLTIP);
151 
152  // constructing json array from data
153  auto from_json_accept = [](auto role) { return role == ItemDataRole::TOOLTIP; };
154 
155  JsonItemDataConverter converter({}, from_json_accept);
156  QJsonArray array = converter.to_json(data);
157 
158  // constructing data from json array
159  SessionItemData data2;
160  converter.from_json(array, data2);
161 
162  // while array itself has 4 elements, restored data has only TOOLTIPS as defined in filter
163  EXPECT_EQ(array.size(), 4u);
164  EXPECT_EQ(data2.roles().size(), 1u);
165  EXPECT_TRUE(data2.hasData(ItemDataRole::TOOLTIP));
166 }
167 
168 //! Update SessionItemData from json obtained from another JsonItemData.
169 
171 {
172  const std::vector<int> roles = {ItemDataRole::IDENTIFIER, ItemDataRole::DATA,
174  const std::vector<QVariant> variants = {QVariant::fromValue(std::string("identifier1")),
175  QVariant::fromValue(42),
176  QVariant::fromValue(std::string("tooltip1"))};
177 
178  // initial data
179  SessionItemData data1;
180  for (size_t i = 0; i < roles.size(); ++i)
181  data1.setData(variants[i], roles[i]);
182 
183  // data intended for serialization
184  SessionItemData data2;
185  data1.setData(QVariant::fromValue(43), ItemDataRole::DATA);
186  data1.setData(QVariant::fromValue(std::string("identifier2")), ItemDataRole::IDENTIFIER);
187 
188  // constructing json array from data
189  JsonItemDataConverter converter;
190  QJsonArray array = converter.to_json(data2);
191 
192  // updating data1 from json array
193  converter.from_json(array, data1);
194 
195  // roles as in initial object, id+data as in data2, tooltip as in data1
196  EXPECT_EQ(data1.roles(), roles);
197  EXPECT_EQ(data1.data(ItemDataRole::IDENTIFIER).value<std::string>(),
198  std::string("identifier2"));
199  EXPECT_EQ(data1.data(ItemDataRole::DATA).value<int>(), 43);
200  EXPECT_EQ(data1.data(ItemDataRole::TOOLTIP).value<std::string>(), std::string("tooltip1"));
201 }
202 
203 //! Checking factory method to create copying converter.
204 //! It is used normally in the situation, when the item data is fully serialized to JSON, and then
205 //! desirialized into empty item data.
206 
207 TEST_F(JsonItemDataConverterTest, createCopyConverter)
208 {
210 
211  SessionItemData data;
212  data.setData(QVariant::fromValue(std::string("identifier")), ItemDataRole::IDENTIFIER);
213  data.setData(42, ItemDataRole::DATA);
214  data.setData(QVariant::fromValue(std::string("display")), ItemDataRole::DISPLAY);
215  data.setData(QVariant::fromValue(std::string("tooltip")), ItemDataRole::TOOLTIP);
216 
217  QJsonArray array = converter->to_json(data);
218 
219  SessionItemData data2;
220  converter->from_json(array, data2);
221 
222  //! Empty data should become the same.
223  EXPECT_EQ(data.roles(), data2.roles());
224  EXPECT_EQ(data2.data(ItemDataRole::IDENTIFIER).value<std::string>(), "identifier");
225  EXPECT_EQ(data2.data(ItemDataRole::DATA).value<int>(), 42);
226  EXPECT_EQ(data2.data(ItemDataRole::DISPLAY).value<std::string>(), "display");
227  EXPECT_EQ(data2.data(ItemDataRole::TOOLTIP).value<std::string>(), "tooltip");
228 }
229 
230 //! Checking factory method for typical scenario for copying whole data while writing, and updating
231 //! on reading. This is a repetition of previous test.
232 
233 TEST_F(JsonItemDataConverterTest, createProjectConverter)
234 {
236 
237  SessionItemData data;
238  data.setData(QVariant::fromValue(std::string("identifier")), ItemDataRole::IDENTIFIER);
239  data.setData(42, ItemDataRole::DATA);
240  data.setData(QVariant::fromValue(std::string("display")), ItemDataRole::DISPLAY);
241  data.setData(QVariant::fromValue(std::string("tooltip")), ItemDataRole::TOOLTIP);
242  auto expected_roles = data.roles();
243 
244  QJsonArray array = converter->to_json(data);
245 
246  // changing data
247  data.setData(QVariant::fromValue(std::string("identifier_new")), ItemDataRole::IDENTIFIER);
248  data.setData(43, ItemDataRole::DATA);
249 
250  // deserializing back
251  converter->from_json(array, data);
252 
253  //! DATA and IDENTIFIER roles should be as before the serialization
254  EXPECT_EQ(data.roles(), expected_roles);
255  EXPECT_EQ(data.data(ItemDataRole::IDENTIFIER).value<std::string>(), "identifier");
256  EXPECT_EQ(data.data(ItemDataRole::DATA).value<int>(), 42);
257  EXPECT_EQ(data.data(ItemDataRole::DISPLAY).value<std::string>(), "display");
258  EXPECT_EQ(data.data(ItemDataRole::TOOLTIP).value<std::string>(), "tooltip");
259 }
Convenience class which creates a directory on disk for test content.
Test convertion of SessionItemData from/to QJsonObject.
Default converter of SessionItemData to/from json object.
void from_json(const QJsonArray &object, SessionItemData &data) override
Updates existing data with JSON content.
static std::unique_ptr< JsonItemDataConverterInterface > createProjectConverter()
Creates JSON data converter intended for project saving.
QJsonArray to_json(const SessionItemData &data) override
Converts SessionItemData to JSON;.
static std::unique_ptr< JsonItemDataConverterInterface > createCopyConverter()
Creates JSON data converter intended for simple data copying. Nothing is filtered out.
Utility class to determine, whether given JSON object can represent various parts of SessionModel.
bool isSessionItemData(const QJsonObject &json) const
Handles data roles for SessionItem.
std::vector< int > roles() const
bool hasData(int role) const
Returns true if item has data with given role.
bool setData(const Variant &value, int role)
Sets the data for given role.
Variant data(int role) const
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
TEST_F(JsonItemDataConverterTest, getJson)
Creating QJsonArray from SessionItemData.
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
const int TOOLTIP
tooltip for item's data
Definition: mvvm_types.h:34
const int DATA
main data role
Definition: mvvm_types.h:30
const int DISPLAY
display name
Definition: mvvm_types.h:31
const int IDENTIFIER
unique identifier
Definition: mvvm_types.h:29
materialitems.h Collection of materials to populate MaterialModel.
std::string TestFileName(const std::string &test_sub_dir, const std::string &file_name)
Returns full path to the file in test directory.
Definition: test_utils.cpp:52
void SaveJson(const QJsonObject &object, const std::string &fileName)
Definition: test_utils.cpp:58
Defines class CLASS?
Defines class CLASS?