19
19
#include < QSettings>
20
20
21
21
#include " qgsgraduatedsymbolrenderer.h"
22
+ #include " qgssymbollayerutils.h"
22
23
23
- /* * \ingroup UnitTests
24
+ /* *
25
+ * \ingroup UnitTests
24
26
* This is a unit test for the qgsGraduatedSymbolRenderer class.
25
27
*/
26
28
@@ -35,7 +37,7 @@ class TestQgsGraduatedSymbolRenderer: public QObject
35
37
void cleanup ();// will be called after every testfunction.
36
38
void rangesOverlap ();
37
39
void rangesHaveGaps ();
38
- void _makeBreaksSymmetric (QList< double > &breaks, double symmetryPoint, bool astride );
40
+ void classifySymmetric ( );
39
41
40
42
41
43
private:
@@ -141,28 +143,71 @@ void TestQgsGraduatedSymbolRenderer::rangesHaveGaps()
141
143
QVERIFY ( renderer.rangesHaveGaps () );
142
144
}
143
145
144
- void TestQgsGraduatedSymbolRenderer::_makeBreaksSymmetric (QList<double > &breaks, double symmetryPoint, bool astride)
146
+ // this function is used only on breaks that already contain the symmetryPoint
147
+ // calcEqualIntervalBreaks takes symmetryPoint as parameter
148
+ void TestQgsGraduatedSymbolRenderer::classifySymmetric ()
145
149
{
146
- const QList<double > unchanged_breaks = {1235 , 1023 , 997 , 800 , 555 , 10 , 1 , -5 , -11 , -423 , -811 };
147
-
148
- // with astride = false
149
- breaks = unchanged_breaks;
150
- symmetryPoint = 12.0 ;
151
- astride = false ;
152
- _makeBreaksSymmetric ( breaks, symmetryPoint, astride );
153
-
154
- QVERIFY ( breaks.contains ( symmetryPoint) );
155
- // /!\ breaks contain the maximum of the distrib but not the minimum ?
156
- QVERIFY ( breaks.count () % 2 == 0 );
157
-
158
- // with astride = true
159
- breaks = unchanged_breaks;
160
- symmetryPoint = 666.3 ;
161
- astride = true ;
162
- _makeBreaksSymmetric ( breaks, symmetryPoint, astride );
163
-
164
- QVERIFY ( breaks.contains ( symmetryPoint) );
165
- QVERIFY ( breaks.count () % 2 != 0 );
150
+ // minimum < symmetryPointForEqualInterval < maximum
151
+ // going below 1E-6 will result in a fail because C++ think 2.6e-06 - 2e-06 = 0
152
+ QList<double > minimum = {15.30 , 20 , 20 , 1111 , 0.26 , 0.000026 , -1.56E10 };
153
+ QList<double > symmetryPointForEqualInterval = {122.6 , 24.3 , 26.3 , 1563.3 , 0.34 , 0.000034 , 0.56E10 };
154
+ QList<double > maximum = {253.6 , 30 , 30 , 2222 , 0.55 , 0.000055 , 1.25E10 };
155
+
156
+ int newPosOfSymmetryPoint = 0 ;
157
+ bool astride = false ;
158
+ double symmetryPoint = 0 ;
159
+ bool useSymmetricMode = true ;
160
+ QList<double > breaks = {};
161
+
162
+ for ( int valTest = 0 ; valTest < minimum.size (); valTest++ )
163
+ {
164
+ // makes no sense with less than 3 classes
165
+ for ( int nclasses = 3 ; nclasses < 30 ; nclasses++ )
166
+ {
167
+ // PRETTY BREAKS
168
+ const QList<double > unchanged_breaks = QgsSymbolLayerUtils::prettyBreaks ( minimum[valTest], maximum[valTest], nclasses );
169
+
170
+ // user can only choose a symmetryPoint which is part of the pretty breaks (this part is not tested here)
171
+ // makes no sense to take the extreme breaks as symmetry point
172
+ for ( int posOfSymmetryPoint = 1 ; posOfSymmetryPoint < unchanged_breaks.count () - 2 ; posOfSymmetryPoint++ )
173
+ {
174
+ symmetryPoint = unchanged_breaks[posOfSymmetryPoint];
175
+
176
+ // with astride = false
177
+ astride = false ;
178
+ breaks = unchanged_breaks;
179
+ QgsGraduatedSymbolRenderer::makeBreaksSymmetric ( breaks, symmetryPoint, astride );
180
+ QCOMPARE ( breaks.count () % 2 , 0 );
181
+ // because the minimum is not in the breaks
182
+ int newPosOfSymmetryPoint = breaks.count () / 2 ;
183
+ QCOMPARE ( breaks[ newPosOfSymmetryPoint - 1 ], symmetryPoint );
184
+
185
+ // with astride = true
186
+ astride = true ;
187
+ breaks = unchanged_breaks;
188
+ QgsGraduatedSymbolRenderer::makeBreaksSymmetric ( breaks, symmetryPoint, astride );
189
+ QCOMPARE ( breaks.count () % 2 , 1 );
190
+ QVERIFY ( !breaks.contains ( symmetryPoint ) );
191
+ }
192
+
193
+ // EQUAL INTERVALS
194
+ useSymmetricMode = true ;
195
+
196
+ // with astride = false
197
+ astride = false ;
198
+ breaks = QgsGraduatedSymbolRenderer::calcEqualIntervalBreaks ( minimum[valTest], maximum[valTest], nclasses, useSymmetricMode, symmetryPointForEqualInterval[valTest], astride );
199
+ QCOMPARE ( breaks.count () % 2 , 0 );
200
+ // because the minimum is not in the breaks
201
+ newPosOfSymmetryPoint = breaks.count () / 2 ;
202
+ QCOMPARE ( breaks[ newPosOfSymmetryPoint - 1 ], symmetryPointForEqualInterval[valTest] );
203
+
204
+ // with astride = true
205
+ astride = true ;
206
+ breaks = QgsGraduatedSymbolRenderer::calcEqualIntervalBreaks ( minimum[valTest], maximum[valTest], nclasses, useSymmetricMode, symmetryPointForEqualInterval[valTest], astride );
207
+ QCOMPARE ( breaks.count () % 2 , 1 );
208
+ QVERIFY ( !breaks.contains ( symmetryPointForEqualInterval[valTest] ) );
209
+ }
210
+ }
166
211
}
167
212
168
213
QGSTEST_MAIN ( TestQgsGraduatedSymbolRenderer )
0 commit comments