1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /*******************************************************************************
21  *  Includes
22  ******************************************************************************/
23 #include <gtest/gtest.h>
24 #include <librepcb/common/widgets/lengthedit.h>
25 
26 #include <QtTest/QtTest>
27 
28 /*******************************************************************************
29  *  Namespace
30  ******************************************************************************/
31 namespace librepcb {
32 namespace tests {
33 
34 /*******************************************************************************
35  *  Test Class
36  ******************************************************************************/
37 class LengthEditTest : public ::testing::Test, public QObject {
38 protected:
startListening()39   void startListening() {
40     connect(&edit, &LengthEdit::valueChanged, this,
41             &LengthEditTest::valueChanged);
42   }
43 
valueChanged(const Length & value)44   void valueChanged(const Length& value) noexcept {
45     emittedValues.append(value);
46   }
47 
48   LengthEdit edit;
49   QVector<Length> emittedValues;
50 };
51 
52 /*******************************************************************************
53  *  Test Methods
54  ******************************************************************************/
55 
TEST_F(LengthEditTest,testStep)56 TEST_F(LengthEditTest, testStep) {
57   edit.setSteps({
58       PositiveLength(100000),  // 0.1mm
59       PositiveLength(254000),  // 0.254mm
60       PositiveLength(1000000),  // 1mm
61       PositiveLength(2540000),  // 2.54mm
62   });
63   edit.setValue(Length(3000000));  // 3mm
64   startListening();
65 
66   // Step down from 3mm to -3mm
67   QVector<Length> expectedValues = {
68       Length(2000000), Length(1000000),  Length(900000),   Length(800000),
69       Length(700000),  Length(600000),   Length(500000),   Length(400000),
70       Length(300000),  Length(200000),   Length(100000),   Length(0),
71       Length(-100000), Length(-200000),  Length(-300000),  Length(-400000),
72       Length(-500000), Length(-600000),  Length(-700000),  Length(-800000),
73       Length(-900000), Length(-1000000), Length(-2000000), Length(-3000000),
74   };
75   for (int i = 0; i < expectedValues.count(); ++i) {
76     edit.stepDown();
77     EXPECT_EQ(expectedValues[i].toNm(), edit.getValue().toNm());
78     ASSERT_EQ(1, emittedValues.count());
79     EXPECT_EQ(expectedValues[i].toNm(), emittedValues.takeLast().toNm());
80   }
81 
82   // Step up from -3mm to 3mm
83   expectedValues = {
84       Length(-2000000), Length(-1000000), Length(-900000), Length(-800000),
85       Length(-700000),  Length(-600000),  Length(-500000), Length(-400000),
86       Length(-300000),  Length(-200000),  Length(-100000), Length(0),
87       Length(100000),   Length(200000),   Length(300000),  Length(400000),
88       Length(500000),   Length(600000),   Length(700000),  Length(800000),
89       Length(900000),   Length(1000000),  Length(2000000), Length(3000000),
90   };
91   for (int i = 0; i < expectedValues.count(); ++i) {
92     edit.stepUp();
93     EXPECT_EQ(expectedValues[i].toNm(), edit.getValue().toNm());
94     ASSERT_EQ(1, emittedValues.count());
95     EXPECT_EQ(expectedValues[i].toNm(), emittedValues.takeLast().toNm());
96   }
97 }
98 
TEST_F(LengthEditTest,testValueChangedWhileTyping)99 TEST_F(LengthEditTest, testValueChangedWhileTyping) {
100   edit.selectAll();
101   startListening();
102   QTest::keyClicks(&edit, "12+3um");
103   QTest::keyClick(&edit, Qt::Key_Enter);
104 
105   QVector<Length> expectedValues = {
106       Length(1000000),  // "1" -> 1mm
107       Length(12000000),  // "12" -> 12mm
108       Length(15000000),  // "12+3" -> 15mm
109       Length(15000),  // "12+3um" -> 15 um
110   };
111 
112   ASSERT_EQ(expectedValues.count(), emittedValues.count());
113   for (int i = 0; i < expectedValues.count(); ++i) {
114     EXPECT_EQ(expectedValues[i].toNm(), emittedValues[i].toNm());
115   }
116   EXPECT_EQ(expectedValues.last().toNm(), edit.getValue().toNm());
117 }
118 
TEST_F(LengthEditTest,testUnitUpdatedWhileTyping)119 TEST_F(LengthEditTest, testUnitUpdatedWhileTyping) {
120   edit.selectAll();
121   QTest::keyClicks(&edit, "12+3um");
122   EXPECT_EQ(LengthUnit::micrometers(), edit.getDisplayedUnit());
123 }
124 
TEST_F(LengthEditTest,testTextReplacedAfterPressingEnter)125 TEST_F(LengthEditTest, testTextReplacedAfterPressingEnter) {
126   edit.selectAll();
127 
128   QTest::keyClicks(&edit, " (-1/2) in ");
129   EXPECT_EQ(-12700000, edit.getValue().toNm());
130   EXPECT_EQ(" (-1/2) in ", edit.text().toStdString());
131 
132   QTest::keyClick(&edit, Qt::Key_Enter);
133   EXPECT_EQ(-12700000, edit.getValue().toNm());
134   EXPECT_EQ("-0.5 ″", edit.text().toStdString());
135 }
136 
TEST_F(LengthEditTest,testDivisionByZero)137 TEST_F(LengthEditTest, testDivisionByZero) {
138   edit.selectAll();
139   QTest::keyClicks(&edit, "5/0");
140   EXPECT_EQ(5000000, edit.getValue().toNm());
141   // Note: It results in 5mm because the term "5" was the last valid value
142   // entered in the text field.
143 }
144 
145 /*******************************************************************************
146  *  End of File
147  ******************************************************************************/
148 
149 }  // namespace tests
150 }  // namespace librepcb
151