Skip to content

Commit ded992b

Browse files
committed
Add unit tests for RiuQwtLinearScaleEngine scale division methods
1 parent a2db3b6 commit ded992b

File tree

3 files changed

+126
-4
lines changed

3 files changed

+126
-4
lines changed

ApplicationLibCode/UnitTests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ set(SOURCE_UNITTEST_FILES
4040
${CMAKE_CURRENT_LIST_DIR}/ObservedDataParser-Test.cpp
4141
${CMAKE_CURRENT_LIST_DIR}/EclipseRftReader-Test.cpp
4242
${CMAKE_CURRENT_LIST_DIR}/RicExpressionParser-Test.cpp
43+
${CMAKE_CURRENT_LIST_DIR}/RiuQwtLinearScaleEngine-Test.cpp
4344
${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorDescriptionMap-Test.cpp
4445
${CMAKE_CURRENT_LIST_DIR}/FixedWidthDataParser-Test.cpp
4546
${CMAKE_CURRENT_LIST_DIR}/RigTimeCurveHistoryMerger-Test.cpp
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#include "gtest/gtest.h"
2+
3+
#include "RiuQwtLinearScaleEngine.h"
4+
5+
#include "qwt_scale_div.h"
6+
7+
//--------------------------------------------------------------------------------------------------
8+
///
9+
//--------------------------------------------------------------------------------------------------
10+
TEST( RiuQwtLinearScaleEngine, DivideScaleWithExplicitIntervals_NormalCase )
11+
{
12+
RiuQwtLinearScaleEngine engine;
13+
14+
// Range 0..10 with major step 2 and minor step 1
15+
QwtScaleDiv scaleDiv = engine.divideScaleWithExplicitIntervals( 0.0, 10.0, 2.0, 1.0 );
16+
17+
EXPECT_DOUBLE_EQ( scaleDiv.lowerBound(), 0.0 );
18+
EXPECT_DOUBLE_EQ( scaleDiv.upperBound(), 10.0 );
19+
20+
const QList<double>& majorTicks = scaleDiv.ticks( QwtScaleDiv::MajorTick );
21+
EXPECT_EQ( majorTicks.size(), 6 ); // 0, 2, 4, 6, 8, 10
22+
23+
const QList<double>& minorTicks = scaleDiv.ticks( QwtScaleDiv::MinorTick );
24+
EXPECT_EQ( minorTicks.size(), 11 ); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
25+
}
26+
27+
//--------------------------------------------------------------------------------------------------
28+
///
29+
//--------------------------------------------------------------------------------------------------
30+
TEST( RiuQwtLinearScaleEngine, DivideScaleWithExplicitIntervals_ZeroMajorStep )
31+
{
32+
RiuQwtLinearScaleEngine engine;
33+
34+
// Zero major step should produce no major ticks (guard against division by zero)
35+
QwtScaleDiv scaleDiv = engine.divideScaleWithExplicitIntervals( 0.0, 10.0, 0.0, 1.0 );
36+
37+
const QList<double>& majorTicks = scaleDiv.ticks( QwtScaleDiv::MajorTick );
38+
EXPECT_TRUE( majorTicks.isEmpty() );
39+
40+
// Minor ticks should still be built
41+
const QList<double>& minorTicks = scaleDiv.ticks( QwtScaleDiv::MinorTick );
42+
EXPECT_FALSE( minorTicks.isEmpty() );
43+
}
44+
45+
//--------------------------------------------------------------------------------------------------
46+
///
47+
//--------------------------------------------------------------------------------------------------
48+
TEST( RiuQwtLinearScaleEngine, DivideScaleWithExplicitIntervals_ZeroMinorStep )
49+
{
50+
RiuQwtLinearScaleEngine engine;
51+
52+
// Zero minor step should produce no minor ticks (guard against division by zero)
53+
QwtScaleDiv scaleDiv = engine.divideScaleWithExplicitIntervals( 0.0, 10.0, 2.0, 0.0 );
54+
55+
const QList<double>& minorTicks = scaleDiv.ticks( QwtScaleDiv::MinorTick );
56+
EXPECT_TRUE( minorTicks.isEmpty() );
57+
58+
// Major ticks should still be built
59+
const QList<double>& majorTicks = scaleDiv.ticks( QwtScaleDiv::MajorTick );
60+
EXPECT_FALSE( majorTicks.isEmpty() );
61+
}
62+
63+
//--------------------------------------------------------------------------------------------------
64+
///
65+
//--------------------------------------------------------------------------------------------------
66+
TEST( RiuQwtLinearScaleEngine, DivideScaleWithExplicitIntervalsAndRange_RangeDiffersFromTickInterval )
67+
{
68+
RiuQwtLinearScaleEngine engine;
69+
70+
// Ticks cover 0..10, but the displayed range is -2..12
71+
QwtScaleDiv scaleDiv = engine.divideScaleWithExplicitIntervalsAndRange( 0.0, 10.0, 2.0, 1.0, -2.0, 12.0 );
72+
73+
EXPECT_DOUBLE_EQ( scaleDiv.lowerBound(), -2.0 );
74+
EXPECT_DOUBLE_EQ( scaleDiv.upperBound(), 12.0 );
75+
76+
const QList<double>& majorTicks = scaleDiv.ticks( QwtScaleDiv::MajorTick );
77+
EXPECT_EQ( majorTicks.size(), 6 ); // 0, 2, 4, 6, 8, 10
78+
}
79+
80+
//--------------------------------------------------------------------------------------------------
81+
///
82+
//--------------------------------------------------------------------------------------------------
83+
TEST( RiuQwtLinearScaleEngine, DivideScaleWithExplicitIntervalsAndRange_ZeroStepIntervals )
84+
{
85+
RiuQwtLinearScaleEngine engine;
86+
87+
// Both step intervals zero — no ticks should be built
88+
QwtScaleDiv scaleDiv = engine.divideScaleWithExplicitIntervalsAndRange( 0.0, 10.0, 0.0, 0.0, 0.0, 10.0 );
89+
90+
const QList<double>& majorTicks = scaleDiv.ticks( QwtScaleDiv::MajorTick );
91+
EXPECT_TRUE( majorTicks.isEmpty() );
92+
93+
const QList<double>& minorTicks = scaleDiv.ticks( QwtScaleDiv::MinorTick );
94+
EXPECT_TRUE( minorTicks.isEmpty() );
95+
}

ApplicationLibCode/UserInterface/RiuQwtLinearScaleEngine.cpp

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,21 @@ QwtScaleDiv RiuQwtLinearScaleEngine::divideScaleWithExplicitIntervals( double x1
2727
{
2828
QwtInterval interval( x1, x2 );
2929
QwtInterval roundedInterval = align( interval, majorStepInterval );
30-
QList<double> majorTicks = buildMajorTicks( roundedInterval, majorStepInterval );
31-
QList<double> minorTicks = buildMajorTicks( roundedInterval, minorStepInterval );
30+
QList<double> majorTicks;
31+
32+
// Only build major ticks if the interval is non-zero to avoid division by zero
33+
if ( majorStepInterval > 0.0 )
34+
{
35+
majorTicks = buildMajorTicks( roundedInterval, majorStepInterval );
36+
}
37+
38+
QList<double> minorTicks;
39+
40+
// Only build minor ticks if the interval is non-zero to avoid division by zero
41+
if ( minorStepInterval > 0.0 )
42+
{
43+
minorTicks = buildMajorTicks( roundedInterval, minorStepInterval );
44+
}
3245

3346
return QwtScaleDiv( x1, x2, minorTicks, minorTicks, majorTicks );
3447
}
@@ -44,8 +57,21 @@ QwtScaleDiv RiuQwtLinearScaleEngine::divideScaleWithExplicitIntervalsAndRange( d
4457
double rangeEnd )
4558
{
4659
QwtInterval tickInterval( tickStart, tickEnd );
47-
QList<double> majorTicks = buildMajorTicks( tickInterval, majorStepInterval );
48-
QList<double> minorTicks = buildMajorTicks( tickInterval, minorStepInterval );
60+
QList<double> majorTicks;
61+
62+
// Only build major ticks if the interval is non-zero to avoid division by zero
63+
if ( majorStepInterval > 0.0 )
64+
{
65+
majorTicks = buildMajorTicks( tickInterval, majorStepInterval );
66+
}
67+
68+
QList<double> minorTicks;
69+
70+
// Only build minor ticks if the interval is non-zero to avoid division by zero
71+
if ( minorStepInterval > 0.0 )
72+
{
73+
minorTicks = buildMajorTicks( tickInterval, minorStepInterval );
74+
}
4975

5076
return QwtScaleDiv( rangeStart, rangeEnd, minorTicks, minorTicks, majorTicks );
5177
}

0 commit comments

Comments
 (0)