BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
customvariants.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/customvariants.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"
19 #include "mvvm/model/itemutils.h"
20 #include "mvvm/model/sessionitem.h"
22 #include "mvvm/model/taginfo.h"
24 #include <QColor>
25 #include <functional>
26 #include <memory>
27 
28 using namespace ModelView;
29 
30 class CustomVariantsTest : public ::testing::Test {
31 public:
33 
34  template <typename T> QVariant variantFromArgument(const T& value)
35  {
36  return QVariant::fromValue(value);
37  }
38 };
39 
41 
42 //! To keep under control implicit type conversion.
43 
44 TEST_F(CustomVariantsTest, VariantFromTemplateArgument)
45 {
46  EXPECT_EQ(variantFromArgument(true).typeName(), Constants::bool_type_name);
47  EXPECT_EQ(variantFromArgument(1).typeName(), Constants::int_type_name);
48  EXPECT_EQ(variantFromArgument(42.0).typeName(), Constants::double_type_name);
49  EXPECT_EQ(variantFromArgument(std::string("abc")).typeName(), Constants::string_type_name);
50 }
51 
52 //! Variant compatibility.
53 
55 {
56  const std::vector<double> vec{1, 2};
57  const ComboProperty combo = ComboProperty::createFrom({"a1", "a2", "s3"});
58  EXPECT_EQ(Utils::VariantName(QVariant()), Constants::invalid_type_name);
59  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(true)), Constants::bool_type_name);
60  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(1)), Constants::int_type_name);
61  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(42.0)), Constants::double_type_name);
62  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(std::string("string"))),
64  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(vec)), Constants::vector_double_type_name);
65  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(combo)), Constants::comboproperty_type_name);
66  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(QColor(Qt::red))),
68  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(ExternalProperty())),
70  EXPECT_EQ(Utils::VariantName(QVariant::fromValue(RealLimits())),
72 }
73 
74 //! Variant compatibility.
75 
77 {
78  QVariant undefined;
79  QVariant bool_variant = QVariant::fromValue(true);
80  QVariant int_variant = QVariant::fromValue(1);
81  QVariant double_variant = QVariant::fromValue(42.0);
82  QVariant string_variant = QVariant::fromValue(std::string("string"));
83  std::vector<double> vec{1, 2};
84  QVariant vector_variant = QVariant::fromValue(vec);
85  ComboProperty combo = ComboProperty::createFrom({"a1", "a2", "s3"});
86  QVariant combo_variant = QVariant::fromValue(combo);
87  QVariant color_variant = QVariant::fromValue(QColor(Qt::red));
88  QVariant extprop_variant = QVariant::fromValue(ExternalProperty());
89  QVariant limits_variant = QVariant::fromValue(RealLimits());
90 
91  std::vector<QVariant> variants = {bool_variant, int_variant, double_variant,
92  string_variant, vector_variant, combo_variant,
93  color_variant, extprop_variant, limits_variant};
94  for (size_t i = 0; i < variants.size(); ++i) {
95  EXPECT_TRUE(Utils::CompatibleVariantTypes(undefined, variants[i]));
96  EXPECT_FALSE(Utils::VariantType(undefined) == Utils::VariantType(variants[i]));
97  for (size_t j = 0; j < variants.size(); ++j) {
98  if (i == j) {
99  EXPECT_TRUE(Utils::VariantType(variants[i]) == Utils::VariantType(variants[j]));
100  EXPECT_TRUE(Utils::CompatibleVariantTypes(variants[i], variants[j]));
101  } else {
102  EXPECT_FALSE(Utils::CompatibleVariantTypes(variants[i], variants[j]));
103  EXPECT_FALSE(Utils::VariantType(variants[i]) == Utils::VariantType(variants[j]));
104  }
105  }
106  }
107 }
108 
109 //! Test variant equality reported by SessionItemUtils::isTheSame
110 
111 TEST_F(CustomVariantsTest, IsTheSameVariant)
112 {
113  const std::vector<double> vec1{1, 2};
114  const std::vector<double> vec2{1, 2, 3};
115  const ComboProperty combo1 = ComboProperty::createFrom({"a1", "a2"});
116  const ComboProperty combo2 = ComboProperty::createFrom({"b1"});
117  const ExternalProperty extprop1;
118  const ExternalProperty extprop2("abc", QColor(Qt::red), "123");
119  const RealLimits lim1;
120  const RealLimits lim2 = RealLimits::limited(1.0, 2.0);
121 
122  ComboProperty combo3 = ComboProperty::createFrom({"e1", "e2"});
123  ComboProperty combo4 = ComboProperty::createFrom({"e1", "e2"});
124  combo3.setValue("e1");
125  combo4.setValue("e2");
126 
127  std::vector<QVariant> variants = {QVariant(),
128  QVariant::fromValue(true),
129  QVariant::fromValue(false),
130  QVariant::fromValue(1),
131  QVariant::fromValue(2),
132  QVariant::fromValue(42.0),
133  QVariant::fromValue(43.0),
134  QVariant::fromValue(std::string("string1")),
135  QVariant::fromValue(std::string("string2")),
136  QVariant::fromValue(vec1),
137  QVariant::fromValue(vec2),
138  QVariant::fromValue(combo1),
139  QVariant::fromValue(combo2),
140  QVariant::fromValue(QColor(Qt::red)),
141  QVariant::fromValue(QColor(Qt::green)),
142  QVariant::fromValue(extprop1),
143  QVariant::fromValue(extprop2),
144  QVariant::fromValue(lim1),
145  QVariant::fromValue(lim2),
146  QVariant::fromValue(combo3),
147  QVariant::fromValue(combo4)};
148 
149  for (size_t i = 0; i < variants.size(); ++i) {
150  for (size_t j = 0; j < variants.size(); ++j) {
151  if (i == j)
152  EXPECT_TRUE(Utils::IsTheSame(variants[i], variants[j]));
153  else
154  EXPECT_FALSE(Utils::IsTheSame(variants[i], variants[j]));
155  }
156  }
157 }
158 
159 //! Checks if ComboProperty based variant is the same.
160 
161 TEST_F(CustomVariantsTest, IsTheSameComboProperty)
162 {
163  ComboProperty combo1 = ComboProperty::createFrom({"a1", "a2"});
164  ComboProperty combo2 = ComboProperty::createFrom({"a1", "a2"});
165 
166  EXPECT_TRUE(Utils::IsTheSame(QVariant::fromValue(combo1), QVariant::fromValue(combo1)));
167 
168  combo1.setValue("a1");
169  combo2.setValue("a2");
170  EXPECT_FALSE(Utils::IsTheSame(QVariant::fromValue(combo1), QVariant::fromValue(combo2)));
171 
172  QVariant v1 = QVariant::fromValue(combo1);
173  QVariant v2 = QVariant::fromValue(combo2);
174  EXPECT_FALSE(Utils::IsTheSame(v1, v2));
175 }
176 
177 //! Test toQtVAriant function.
178 
180 {
181  // from Variant based on std::string to variant based on QString
182  QVariant stdstring_variant = QVariant::fromValue(std::string("abc"));
183  QVariant qstring_variant = QVariant::fromValue(QString("abc"));
184  QVariant converted = Utils::toQtVariant(stdstring_variant);
185 
186  EXPECT_FALSE(qstring_variant == stdstring_variant);
187  EXPECT_TRUE(qstring_variant == converted);
188 
189  // Double variant should be unchanged
190  QVariant value(42.0);
191  EXPECT_TRUE(Utils::toQtVariant(value) == QVariant::fromValue(42.0));
192 
193  QVariant invalid;
194  EXPECT_FALSE(Utils::toQtVariant(invalid).isValid());
195 }
196 
197 //! Test translation of variants
198 
200 {
201  // from Variant based on QString to variant based on std::string
202  QVariant stdstring_variant = QVariant::fromValue(std::string("abc"));
203  QVariant qstring_variant = QVariant::fromValue(QString("abc"));
204  QVariant converted = Utils::toCustomVariant(qstring_variant);
205 
206  EXPECT_FALSE(qstring_variant == stdstring_variant);
207  EXPECT_TRUE(stdstring_variant == converted);
208 
209  // Double variant should be unchanged
210  QVariant value(42.0);
211  EXPECT_TRUE(Utils::toCustomVariant(value) == QVariant::fromValue(42.0));
212 
213  QVariant invalid;
214  EXPECT_FALSE(Utils::toCustomVariant(invalid).isValid());
215 }
216 
217 //! Checks all functions related to variant types.
218 
219 // FIXME replace tests in loop with parameterized tests
220 
221 TEST_F(CustomVariantsTest, isVariantType)
222 {
223  using is_variant_t = std::function<bool(const QVariant&)>;
224 
225  std::vector<std::pair<QVariant, is_variant_t>> data = {
226  {QVariant::fromValue(true), Utils::IsBoolVariant},
227  {QVariant::fromValue(1), Utils::IsIntVariant},
228  {QVariant::fromValue(42.0), Utils::IsDoubleVariant},
229  {QVariant::fromValue(ComboProperty()), Utils::IsComboVariant},
230  {QVariant::fromValue(std::string("string1")), Utils::IsStdStringVariant},
231  {QVariant::fromValue(std::vector<double>({1, 2})), Utils::IsDoubleVectorVariant},
232  {QVariant::fromValue(QColor(Qt::red)), Utils::IsColorVariant},
233  {QVariant::fromValue(ExternalProperty()), Utils::IsExtPropertyVariant},
234  {QVariant::fromValue(RealLimits()), Utils::IsRealLimitsVariant}};
235 
236  for (size_t i = 0; i < data.size(); ++i) {
237  auto is_variant_func = data[i].second;
238  for (size_t j = 0; j < data.size(); ++j) {
239  auto variant = data[j].first;
240  if (i == j)
241  EXPECT_TRUE(is_variant_func(variant));
242  else
243  EXPECT_FALSE(is_variant_func(variant));
244  }
245  }
246 }
QVariant variantFromArgument(const T &value)
Custom property to define list of string values with multiple selections.
Definition: comboproperty.h:27
void setValue(const std::string &name)
static ComboProperty createFrom(const std::vector< std::string > &values, const std::string &current_value={})
Property to carry text, color and identifier.
Limits for double.
Definition: reallimits.h:25
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: reallimits.cpp:61
Defines class CLASS?
Defines class CLASS?
TEST_F(CustomVariantsTest, VariantFromTemplateArgument)
To keep under control implicit type conversion.
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
const std::string string_type_name
const std::string bool_type_name
const std::string reallimits_type_name
const std::string comboproperty_type_name
const std::string double_type_name
const std::string extproperty_type_name
const std::string vector_double_type_name
const std::string invalid_type_name
const std::string qcolor_type_name
const std::string int_type_name
MVVM_MODEL_EXPORT bool IsTheSame(const Variant &var1, const Variant &var2)
Returns true if given variants have same type and value.
MVVM_MODEL_EXPORT Variant toCustomVariant(const Variant &standard)
Converts Qt variant to custom variant on board of SessionItem.
MVVM_MODEL_EXPORT bool IsIntVariant(const Variant &variant)
Returns true in the case of double value based variant.
MVVM_MODEL_EXPORT std::string VariantName(const Variant &variant)
Returns name of variant.
MVVM_MODEL_EXPORT bool IsColorVariant(const Variant &variant)
Returns true in the case of QColor based variant.
MVVM_MODEL_EXPORT int VariantType(const Variant &variant)
Returns type of variant (additionally checks for user type).
MVVM_MODEL_EXPORT bool IsDoubleVariant(const Variant &variant)
Returns true in the case of double value based variant.
MVVM_MODEL_EXPORT Variant toQtVariant(const Variant &custom)
Converts custom variant to standard variant which Qt views will understand.
MVVM_MODEL_EXPORT bool CompatibleVariantTypes(const Variant &oldValue, const Variant &newValue)
Returns true if variants has compatible types.
MVVM_MODEL_EXPORT bool IsStdStringVariant(const Variant &variant)
Returns true in the case of double value based variant.
MVVM_MODEL_EXPORT bool IsBoolVariant(const Variant &variant)
Returns true in the case of double value based variant.
MVVM_MODEL_EXPORT bool IsExtPropertyVariant(const Variant &variant)
Returns true in the case of ExternalProperty based variant.
MVVM_MODEL_EXPORT bool IsComboVariant(const Variant &variant)
Returns true in the case of double value based variant.
MVVM_MODEL_EXPORT bool IsDoubleVectorVariant(const Variant &variant)
Returns true in the case of variant based on std::vector<double>.
MVVM_MODEL_EXPORT bool IsRealLimitsVariant(const Variant &variant)
Returns true in the case of RealLimits based variant.
materialitems.h Collection of materials to populate MaterialModel.
bool CompatibleVariantTypes(const QVariant &oldValue, const QVariant &newValue)
Returns true if variants has compatible types.
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?