BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
scientificspinbox.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/testviewmodel/scientificspinbox.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"
17 #include <limits>
18 
19 using namespace ModelView;
20 
21 class ScientificSpinBoxTest : public ::testing::Test {
22 public:
24 };
25 
27 
28 TEST_F(ScientificSpinBoxTest, testValueFromText)
29 {
30  QLocale locale(QLocale::C);
31  locale.setNumberOptions(QLocale::RejectGroupSeparator);
32 
33  QDoubleValidator validator;
34  validator.setLocale(locale);
35  validator.setNotation(QDoubleValidator::ScientificNotation);
36 
37  auto to_value = [&validator](QString text) {
38  return ScientificSpinBox::toDouble(text, validator, std::numeric_limits<double>::lowest(),
39  std::numeric_limits<double>::max(), 0.1);
40  };
41 
42  // translation fails
43  EXPECT_EQ(0.1, to_value(QString("abcd")));
44  EXPECT_EQ(0.1, to_value(QString("1,2")));
45  EXPECT_EQ(0.1, to_value(QString("100,000,000.2")));
46  EXPECT_EQ(0.1, to_value(QString("100.000.000.2")));
47  EXPECT_EQ(0.1, to_value(QString("1e+2345")));
48  EXPECT_EQ(0.1, to_value(QString("-1e+2345")));
49  EXPECT_EQ(0.1, to_value(QString("1e-2345")));
50  EXPECT_EQ(0.1, to_value(QString("-1e-2345")));
51  EXPECT_EQ(0.1, to_value(QString("--0.1")));
52  EXPECT_EQ(0.1, to_value(QString("-.e-12")));
53  EXPECT_EQ(0.1, to_value(QString()));
54 
55  auto to_value_2 = [&validator](QString text) {
56  return ScientificSpinBox::toDouble(text, validator, -0.1, 1e+7, 0.1);
57  };
58 
59  // translation fails due to out-of-bounds condition
60  EXPECT_EQ(0.1, to_value_2(QString("-0.2")));
61  EXPECT_EQ(0.1, to_value_2(QString("-0.1e+1")));
62  EXPECT_EQ(0.1, to_value_2(QString("1e+8")));
63 
64  // legitimate values
65  EXPECT_EQ(-0.0999, to_value_2(QString("-0.0999")));
66  EXPECT_EQ(-1e-13, to_value_2(QString("-.1e-12")));
67  EXPECT_EQ(0.0, to_value_2(QString("0")));
68  EXPECT_EQ(0.123, to_value_2(QString("0.123")));
69  EXPECT_EQ(1e+6, to_value_2(QString("1e+6")));
70  EXPECT_EQ(1.1e+6, to_value_2(QString("1.1e+6")));
71  EXPECT_EQ(0.012, to_value_2(QString("0.012")));
72 }
73 
75 {
76  int decimals = 3;
77  auto to_string = [&decimals](double val) { return ScientificSpinBox::toString(val, decimals); };
78 
79  EXPECT_EQ(std::string("-123.45"), to_string(-123.45).toStdString());
80  EXPECT_EQ(std::string("-100"), to_string(-99.9999).toStdString());
81  EXPECT_EQ(std::string("-99.999"), to_string(-99.9994).toStdString());
82  EXPECT_EQ(std::string("-10.123"), to_string(-10.12345).toStdString());
83  EXPECT_EQ(std::string("-1"), to_string(-1.).toStdString());
84  EXPECT_EQ(std::string("-0.1"), to_string(-0.1).toStdString());
85  EXPECT_EQ(std::string("-0.1"), to_string(-0.1).toStdString());
86  EXPECT_EQ(std::string("-9.99e-2"), to_string(-9.99e-2).toStdString());
87  EXPECT_EQ(std::string("-1.266e-12"), to_string(-1.26555e-12).toStdString());
88  EXPECT_EQ(std::string("0"), to_string(-0.0).toStdString());
89  EXPECT_EQ(std::string("0"), to_string(0.0).toStdString());
90  EXPECT_EQ(std::string("1e-12"), to_string(1.e-12).toStdString());
91  EXPECT_EQ(std::string("1.23e-12"), to_string(1.23e-12).toStdString());
92  EXPECT_EQ(std::string("1e-2"), to_string(1.e-2).toStdString());
93  EXPECT_EQ(std::string("1.5e-2"), to_string(1.5e-2).toStdString());
94  EXPECT_EQ(std::string("1.523e-2"), to_string(1.5234e-2).toStdString());
95  EXPECT_EQ(std::string("9.99e-2"), to_string(9.99e-2).toStdString());
96  EXPECT_EQ(std::string("1e-1"), to_string(9.9999e-2).toStdString());
97  EXPECT_EQ(std::string("0.1"), to_string(0.1).toStdString());
98  EXPECT_EQ(std::string("1"), to_string(1.).toStdString());
99  EXPECT_EQ(std::string("1.1"), to_string(1.1).toStdString());
100  EXPECT_EQ(std::string("1.123"), to_string(1.12345).toStdString());
101  EXPECT_EQ(std::string("10.123"), to_string(10.12345).toStdString());
102  EXPECT_EQ(std::string("99.9"), to_string(99.9).toStdString());
103  EXPECT_EQ(std::string("99.999"), to_string(99.9994).toStdString());
104  EXPECT_EQ(std::string("100"), to_string(99.9999).toStdString());
105  EXPECT_EQ(std::string("123.45"), to_string(123.45).toStdString());
106  EXPECT_EQ(std::string("1e+4"), to_string(1.e+4).toStdString());
107  EXPECT_EQ(std::string("1.265e+12"), to_string(1.265e+12).toStdString());
108  EXPECT_EQ(std::string("1.266e+12"), to_string(1.26555e+12).toStdString());
109 
110  decimals = 5;
111  EXPECT_EQ(std::string("1.23e-12"), to_string(1.23e-12).toStdString());
112  EXPECT_EQ(std::string("1.52346e-2"), to_string(1.523456e-2).toStdString());
113  EXPECT_EQ(std::string("1e-1"), to_string(9.999999e-2).toStdString());
114  EXPECT_EQ(std::string("1.12346"), to_string(1.123455).toStdString());
115  EXPECT_EQ(std::string("10.12346"), to_string(10.123456).toStdString());
116  EXPECT_EQ(std::string("99.9"), to_string(99.9).toStdString());
117  EXPECT_EQ(std::string("100"), to_string(99.999999).toStdString());
118  EXPECT_EQ(std::string("123.45"), to_string(123.45).toStdString());
119  EXPECT_EQ(std::string("1.26556e+12"), to_string(1.265556e+12).toStdString());
120 }
121 
123 {
124  auto round_3 = [](double val) { return ScientificSpinBox::round(val, 3); };
125  EXPECT_DOUBLE_EQ(1.232e-12, round_3(1.2323e-12));
126  EXPECT_DOUBLE_EQ(0.123, round_3(0.1232));
127  EXPECT_DOUBLE_EQ(1.002e+2, round_3(100.2));
128 }
static double toDouble(QString text, const QDoubleValidator &validator, double min, double max, double default_value)
static double round(double val, int decimals)
static QString toString(double val, int decimal_points)
~ScientificSpinBoxTest() override
Defines class CLASS?
materialitems.h Collection of materials to populate MaterialModel.
std::string toString(PyObject *obj)
Converts PyObject into string, if possible, or throws exception.
Definition: PyUtils.cpp:24
Defines class CLASS?
TEST_F(ScientificSpinBoxTest, testValueFromText)