BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
reallimits.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/reallimits.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/utils/reallimits.h"
17 #include <limits>
18 
19 using namespace ModelView;
20 
21 class RealLimitsTest : public ::testing::Test {
22 protected:
24 };
25 
27 
28 TEST_F(RealLimitsTest, initialState)
29 {
30  RealLimits limits;
31 
32  EXPECT_FALSE(limits.hasLowerLimit());
33  EXPECT_FALSE(limits.hasUpperLimit());
34  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
35  EXPECT_TRUE(limits.isInRange(-std::numeric_limits<double>::infinity()));
36  EXPECT_TRUE(limits.isInRange(0.0));
37  EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::infinity()));
38 
39  EXPECT_FALSE(limits.isPositive());
40  EXPECT_FALSE(limits.isNonnegative());
41  EXPECT_FALSE(limits.isLowerLimited());
42  EXPECT_FALSE(limits.isUpperLimited());
43  EXPECT_FALSE(limits.isLimited());
44 }
45 
46 TEST_F(RealLimitsTest, lowerLimited)
47 {
48  // [5.0, inf[
50  EXPECT_TRUE(limits.hasLowerLimit());
51  EXPECT_FALSE(limits.hasUpperLimit());
52  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
53 
54  EXPECT_EQ(limits.lowerLimit(), 5.0);
55  EXPECT_DOUBLE_EQ(limits.upperLimit(), std::numeric_limits<double>::max());
56 
57  EXPECT_FALSE(limits.isPositive());
58  EXPECT_FALSE(limits.isNonnegative());
59  EXPECT_TRUE(limits.isLowerLimited());
60  EXPECT_FALSE(limits.isUpperLimited());
61  EXPECT_FALSE(limits.isLimited());
62 }
63 
64 TEST_F(RealLimitsTest, upperLimited)
65 {
66  // [-inf, 5.0[
68  EXPECT_FALSE(limits.hasLowerLimit());
69  EXPECT_TRUE(limits.hasUpperLimit());
70  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
71 
72  EXPECT_DOUBLE_EQ(limits.lowerLimit(), std::numeric_limits<double>::lowest());
73  EXPECT_EQ(5.0, limits.upperLimit());
74 
75  EXPECT_TRUE(limits.isInRange(-std::numeric_limits<double>::infinity()));
76  EXPECT_TRUE(limits.isInRange(-2.0));
77  EXPECT_FALSE(limits.isInRange(5.0));
78  EXPECT_FALSE(limits.isInRange(std::numeric_limits<double>::infinity()));
79 
80  EXPECT_FALSE(limits.isPositive());
81  EXPECT_FALSE(limits.isNonnegative());
82  EXPECT_FALSE(limits.isLowerLimited());
83  EXPECT_TRUE(limits.isUpperLimited());
84  EXPECT_FALSE(limits.isLimited());
85 }
86 
88 {
89  // [-10.0, 2.0[
90  RealLimits limits = RealLimits::limited(-10.0, 2.0);
91  EXPECT_TRUE(limits.hasLowerLimit());
92  EXPECT_TRUE(limits.hasUpperLimit());
93  EXPECT_TRUE(limits.hasLowerAndUpperLimits());
94 
95  EXPECT_EQ(limits.lowerLimit(), -10.0);
96  EXPECT_EQ(limits.upperLimit(), 2.0);
97 
98  EXPECT_FALSE(limits.isInRange(-11.0));
99  EXPECT_TRUE(limits.isInRange(-9.0));
100  EXPECT_TRUE(limits.isInRange(0.0));
101  EXPECT_TRUE(limits.isInRange(1.0));
102  EXPECT_FALSE(limits.isInRange(2.0));
103  EXPECT_FALSE(limits.isInRange(3.0));
104 
105  EXPECT_FALSE(limits.isPositive());
106  EXPECT_FALSE(limits.isNonnegative());
107  EXPECT_FALSE(limits.isLowerLimited());
108  EXPECT_FALSE(limits.isUpperLimited());
109  EXPECT_TRUE(limits.isLimited());
110 }
111 
113 {
114  // ]0.0, 2.0[
115  RealLimits limits = RealLimits::positive();
116  EXPECT_TRUE(limits.hasLowerLimit());
117  EXPECT_FALSE(limits.hasUpperLimit());
118  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
119 
120  EXPECT_EQ(limits.lowerLimit(), std::numeric_limits<double>::min());
121  EXPECT_EQ(limits.upperLimit(), std::numeric_limits<double>::max());
122 
123  EXPECT_FALSE(limits.isInRange(-11.0));
124  EXPECT_FALSE(limits.isInRange(0.0));
125  EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::min()));
126  EXPECT_TRUE(limits.isInRange(1.0));
127 
128  EXPECT_TRUE(limits.isPositive());
129  EXPECT_FALSE(limits.isNonnegative());
130  EXPECT_FALSE(limits.isLowerLimited());
131  EXPECT_FALSE(limits.isUpperLimited());
132  EXPECT_FALSE(limits.isLimited());
133 }
134 
135 TEST_F(RealLimitsTest, nonnegative)
136 {
137  // [0.0, 2.0[
139  EXPECT_TRUE(limits.hasLowerLimit());
140  EXPECT_FALSE(limits.hasUpperLimit());
141  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
142 
143  EXPECT_EQ(limits.lowerLimit(), 0.0);
144  EXPECT_EQ(limits.upperLimit(), std::numeric_limits<double>::max());
145 
146  EXPECT_FALSE(limits.isInRange(-11.0));
147  EXPECT_TRUE(limits.isInRange(0.0));
148  EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::min()));
149  EXPECT_TRUE(limits.isInRange(1.0));
150 
151  EXPECT_FALSE(limits.isPositive());
152  EXPECT_TRUE(limits.isNonnegative());
153  EXPECT_FALSE(limits.isLowerLimited());
154  EXPECT_FALSE(limits.isUpperLimited());
155  EXPECT_FALSE(limits.isLimited());
156 }
157 
159 {
161 
162  EXPECT_FALSE(limits.hasLowerLimit());
163  EXPECT_FALSE(limits.hasUpperLimit());
164  EXPECT_FALSE(limits.hasLowerAndUpperLimits());
165 
166  EXPECT_EQ(limits.lowerLimit(), std::numeric_limits<double>::lowest());
167  EXPECT_EQ(limits.upperLimit(), std::numeric_limits<double>::max());
168 
169  EXPECT_TRUE(limits.isInRange(-std::numeric_limits<double>::infinity()));
170  EXPECT_TRUE(limits.isInRange(0.0));
171  EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::infinity()));
172 
173  EXPECT_FALSE(limits.isPositive());
174  EXPECT_FALSE(limits.isNonnegative());
175  EXPECT_FALSE(limits.isLowerLimited());
176  EXPECT_FALSE(limits.isUpperLimited());
177  EXPECT_FALSE(limits.isLimited());
178 }
179 
180 TEST_F(RealLimitsTest, comparisonOperators)
181 {
182  RealLimits lim1 = RealLimits::limited(1.0, 2.0);
183  RealLimits lim2 = RealLimits::limited(1.0, 2.0);
184  EXPECT_TRUE(lim1 == lim2);
185  EXPECT_FALSE(lim1 != lim2);
186 
189  EXPECT_TRUE(lim3 == lim4);
190  EXPECT_FALSE(lim3 != lim4);
191 
194  EXPECT_TRUE(lim5 == lim6);
195  EXPECT_FALSE(lim5 != lim6);
196 
199  EXPECT_TRUE(lim7 == lim8);
200  EXPECT_FALSE(lim7 != lim8);
201 
202  EXPECT_TRUE(RealLimits::positive() == RealLimits::positive());
204 
205  EXPECT_FALSE(RealLimits::positive() == RealLimits::nonnegative());
206 }
207 
208 TEST_F(RealLimitsTest, copyConstructor)
209 {
210  RealLimits lim1 = RealLimits::limited(1.0, 2.0);
211  RealLimits lim2 = lim1;
212  EXPECT_TRUE(lim1 == lim2);
213  EXPECT_FALSE(lim1 != lim2);
214 
215  RealLimits lim3(lim1);
216  EXPECT_TRUE(lim1 == lim3);
217  EXPECT_FALSE(lim1 != lim3);
218 }
219 
221 {
222  RealLimits limit = RealLimits::limited(1.0, 2.0);
223  QVariant variant = QVariant::fromValue(limit);
224 
225  EXPECT_EQ(variant.value<RealLimits>().isLimited(), limit.isLimited());
226  EXPECT_EQ(variant.value<RealLimits>().lowerLimit(), limit.lowerLimit());
227  EXPECT_EQ(variant.value<RealLimits>().upperLimit(), limit.upperLimit());
228 }
229 
230 TEST_F(RealLimitsTest, variantEquality)
231 {
233  QVariant var1a = QVariant::fromValue(RealLimits::limited(1.0, 2.0));
234  QVariant var1b = QVariant::fromValue(RealLimits::limited(1.0, 2.0));
235  QVariant var2 = QVariant::fromValue(RealLimits::lowerLimited(1.0));
236 
237  EXPECT_TRUE(var1a == var1b);
238  EXPECT_FALSE(var1a == var2);
239  EXPECT_FALSE(var1a != var1b);
240  EXPECT_TRUE(var1a != var2);
241  }
242 }
static bool registered()
Definition: comparators.cpp:38
Limits for double.
Definition: reallimits.h:25
bool isLimited() const
Definition: reallimits.cpp:151
static RealLimits limitless()
Creates an object withoud bounds (default)
Definition: reallimits.cpp:66
static RealLimits upperLimited(double bound_value)
Creates an object bounded from the right.
Definition: reallimits.cpp:56
bool isLowerLimited() const
Definition: reallimits.cpp:141
bool isPositive() const
Definition: reallimits.cpp:130
bool hasUpperLimit() const
if has upper limit
Definition: reallimits.cpp:81
static RealLimits lowerLimited(double bound_value)
Creates an object bounded from the left.
Definition: reallimits.cpp:41
bool hasLowerAndUpperLimits() const
if has lower and upper limit
Definition: reallimits.cpp:91
static RealLimits positive()
Creates an object which can have only positive values (>0., zero is not included)
Definition: reallimits.cpp:46
bool isInRange(double value) const
returns true if proposed value is in limits range
Definition: reallimits.cpp:96
double upperLimit() const
Returns upper limit.
Definition: reallimits.cpp:86
double lowerLimit() const
Returns lower limit.
Definition: reallimits.cpp:76
bool isNonnegative() const
Definition: reallimits.cpp:136
static RealLimits nonnegative()
Creates an object which can have only positive values with 0. included.
Definition: reallimits.cpp:51
bool isUpperLimited() const
Definition: reallimits.cpp:146
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: reallimits.cpp:61
bool hasLowerLimit() const
if has lower limit
Definition: reallimits.cpp:71
Defines class CLASS?
materialitems.h Collection of materials to populate MaterialModel.
Defines class CLASS?
TEST_F(RealLimitsTest, initialState)