1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29
30#include <QtTest/QtTest>
31
32#include "qpen.h"
33#include "qbrush.h"
34
35#include <qdebug.h>
36
37class tst_QPen : public QObject
38{
39 Q_OBJECT
40
41public:
42 tst_QPen();
43
44private slots:
45 void getSetCheck();
46 void swap();
47 void move();
48 void move_assign();
49 void operator_eq_eq();
50 void operator_eq_eq_data();
51
52 void stream();
53 void stream_data();
54
55 void constructor();
56 void constructor_data();
57};
58
59// Testing get/set functions
60void tst_QPen::getSetCheck()
61{
62 QPen obj1;
63 // qreal QPen::miterLimit()
64 // void QPen::setMiterLimit(qreal)
65 obj1.setMiterLimit(0.0);
66 QCOMPARE(0.0, obj1.miterLimit());
67 obj1.setMiterLimit(qreal(1.1));
68 QCOMPARE(qreal(1.1), obj1.miterLimit());
69
70 // qreal QPen::widthF()
71 // void QPen::setWidthF(qreal)
72 obj1.setWidthF(0.0);
73 QCOMPARE(0.0, obj1.widthF());
74 obj1.setWidthF(qreal(1.1));
75 QCOMPARE(qreal(1.1), obj1.widthF());
76
77 // int QPen::width()
78 // void QPen::setWidth(int)
79 for (int i = 0; i < 100; ++i) {
80 obj1.setWidth(i);
81 QCOMPARE(i, obj1.width());
82 }
83}
84
85void tst_QPen::swap()
86{
87 QPen p1(Qt::black), p2(Qt::white);
88 p1.swap(other&: p2);
89 QCOMPARE(p1.color(), QColor(Qt::white));
90 QCOMPARE(p2.color(), QColor(Qt::black));
91}
92
93void tst_QPen::move()
94{
95 QPen p1(Qt::black);
96
97 // check that moving does the right thing:
98 QPen p2 = std::move(p1); // could be move or copy construction, so don't check p1's state
99 QCOMPARE(p2.color(), QColor(Qt::black));
100
101 // this, executed ehre, would crash:
102 // QVERIFY(p1.style() != Qt::NoPen);
103
104 // check that moved-from QPen p1 can still be safely copied:
105 const QPen p3 = p1;
106
107 // check that moved-from QPen p1 can still be safely assigned to:
108 const QPen p4(Qt::yellow);
109 p1 = p4;
110 QCOMPARE(p1.color(), QColor(Qt::yellow));
111
112 // check that moved-from QPens p2, p3 can still be safely destroyed:
113 QPen p5 = std::move(p2);
114
115 // intentionally no more statements beyond this point
116}
117
118void tst_QPen::move_assign()
119{
120 QPen p1(Qt::black), p2(Qt::white);
121
122 // check that moving does the right thing:
123 p2 = std::move(p1); // could be move or copy assignment, so don't check p1's state
124 QCOMPARE(p2.color(), QColor(Qt::black));
125
126 // check that move-assigned-from QPen p1 can still be used, albeit
127 // with undocumented state (it's p2's original state):
128 QVERIFY(p1.style() != Qt::NoPen);
129
130 // check that moved-from QPen p1 can still be safely copied:
131 const QPen p3 = p1;
132
133 // check that moved-from QPen p1 can still be safely assigned to:
134 const QPen p4(Qt::yellow);
135 p1 = p4;
136 QCOMPARE(p1.color(), QColor(Qt::yellow));
137
138 // check that moved-from QPens p2, p3 can still be safely destroyed:
139 QPen p5;
140 p5 = std::move(p2);
141
142 // intentionally no more statements beyond this point
143}
144
145tst_QPen::tst_QPen()
146
147{
148}
149
150void tst_QPen::operator_eq_eq_data()
151{
152 QTest::addColumn<QPen>(name: "pen1");
153 QTest::addColumn<QPen>(name: "pen2");
154 QTest::addColumn<bool>(name: "isEqual");
155
156 QTest::newRow(dataTag: "differentColor") << QPen(Qt::red)
157 << QPen(Qt::blue)
158 << false;
159 QTest::newRow(dataTag: "differentWidth") << QPen(Qt::red, 2)
160 << QPen(Qt::red, 3)
161 << false;
162 QTest::newRow(dataTag: "differentPenStyle") << QPen(Qt::red, 2, Qt::DashLine)
163 << QPen(Qt::red, 2, Qt::DotLine)
164 << false;
165 QTest::newRow(dataTag: "differentCapStyle") << QPen(Qt::red, 2, Qt::DashLine, Qt::RoundCap, Qt::BevelJoin)
166 << QPen(Qt::red, 2, Qt::DashLine, Qt::SquareCap, Qt::BevelJoin)
167 << false;
168 QTest::newRow(dataTag: "differentJoinStyle") << QPen(Qt::red, 2, Qt::DashLine, Qt::RoundCap, Qt::BevelJoin)
169 << QPen(Qt::red, 2, Qt::DashLine, Qt::RoundCap, Qt::MiterJoin)
170 << false;
171 QTest::newRow(dataTag: "same") << QPen(Qt::red, 2, Qt::DashLine, Qt::RoundCap, Qt::BevelJoin)
172 << QPen(Qt::red, 2, Qt::DashLine, Qt::RoundCap, Qt::BevelJoin)
173 << true;
174
175}
176
177void tst_QPen::operator_eq_eq()
178{
179 QFETCH(QPen, pen1);
180 QFETCH(QPen, pen2);
181 QFETCH(bool, isEqual);
182 QCOMPARE(pen1 == pen2, isEqual);
183}
184
185
186void tst_QPen::constructor_data()
187{
188 QTest::addColumn<QPen>(name: "pen");
189 QTest::addColumn<QBrush>(name: "brush");
190 QTest::addColumn<double>(name: "width");
191 QTest::addColumn<int>(name: "style");
192 QTest::addColumn<int>(name: "capStyle");
193 QTest::addColumn<int>(name: "joinStyle");
194
195 QTest::newRow(dataTag: "solid_black") << QPen() << QBrush(Qt::black) << 1. << (int)Qt::SolidLine
196 << (int) Qt::SquareCap << (int)Qt::BevelJoin;
197 QTest::newRow(dataTag: "solid_red") << QPen(Qt::red) << QBrush(Qt::red) << 1. << (int)Qt::SolidLine
198 << (int)Qt::SquareCap << (int)Qt::BevelJoin;
199 QTest::newRow(dataTag: "full") << QPen(QBrush(QLinearGradient(0, 0, 100, 100)), 10,
200 Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)
201 << QBrush(QLinearGradient(0, 0, 100, 100)) << 10. << (int)Qt::SolidLine
202 << (int)Qt::RoundCap << (int)Qt::MiterJoin;
203
204}
205
206
207void tst_QPen::constructor()
208{
209 QFETCH(QPen, pen);
210 QFETCH(QBrush, brush);
211 QFETCH(double, width);
212 QFETCH(int, style);
213 QFETCH(int, capStyle);
214 QFETCH(int, joinStyle);
215
216 QCOMPARE(pen.style(), Qt::PenStyle(style));
217 QCOMPARE(pen.capStyle(), Qt::PenCapStyle(capStyle));
218 QCOMPARE(pen.joinStyle(), Qt::PenJoinStyle(joinStyle));
219 QCOMPARE(pen.widthF(), width);
220 QCOMPARE(pen.brush(), brush);
221}
222
223
224void tst_QPen::stream_data()
225{
226 QTest::addColumn<QPen>(name: "pen");
227
228 QTest::newRow(dataTag: "solid_black") << QPen();
229 QTest::newRow(dataTag: "solid_red") << QPen(Qt::red);
230 QTest::newRow(dataTag: "full") << QPen(QBrush(QLinearGradient(0, 0, 100, 100)), 10, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin);
231}
232
233
234void tst_QPen::stream()
235{
236 QFETCH(QPen, pen);
237
238 QByteArray bytes;
239
240 {
241 QDataStream stream(&bytes, QIODevice::WriteOnly);
242 stream << pen;
243 }
244
245 QPen cmp;
246 {
247 QDataStream stream(&bytes, QIODevice::ReadOnly);
248 stream >> cmp;
249 }
250
251 QCOMPARE(pen.widthF(), cmp.widthF());
252 QCOMPARE(pen.style(), cmp.style());
253 QCOMPARE(pen.capStyle(), cmp.capStyle());
254 QCOMPARE(pen.joinStyle(), cmp.joinStyle());
255 QCOMPARE(pen.brush(), cmp.brush());
256
257 QCOMPARE(pen, cmp);
258}
259
260QTEST_APPLESS_MAIN(tst_QPen)
261#include "tst_qpen.moc"
262

source code of qtbase/tests/auto/gui/painting/qpen/tst_qpen.cpp