1 /**
2  * Copyright (C) 2001-2015 Klaralvdalens Datakonsult AB.  All rights reserved.
3  *
4  * This file is part of the KD Chart library.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (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 <https://www.gnu.org/licenses/>.
18  */
19 
20 #include <QtTest/QtTest>
21 #include <KChartChart>
22 #include <KChartGlobal>
23 #include <KChartBarDiagram>
24 #include <KChartLineDiagram>
25 #include <KChartCartesianCoordinatePlane>
26 #include <KChartCartesianAxis>
27 
28 #include <TableModel.h>
29 
30 using namespace KChart;
31 
32 class TestAxisOwnership: public QObject {
33   Q_OBJECT
34 private Q_SLOTS:
35 
initTestCase()36   void initTestCase()
37   {
38       m_chart = new Chart(nullptr);
39       m_bars = new BarDiagram();
40       m_lines = new LineDiagram();
41       m_tableModel = new TableModel( this );
42       m_tableModel->loadFromCSV( ":/data" );
43       m_bars->setModel( m_tableModel );
44       m_lines->setModel( m_tableModel );
45       m_chart->coordinatePlane()->replaceDiagram( m_bars );
46       m_chart->coordinatePlane()->addDiagram( m_lines );
47   }
48 
testIntialOwnership()49   void testIntialOwnership()
50   {
51       m_axis = new CartesianAxis( m_bars );
52       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_bars ) );
53       QVERIFY( m_axis->observedBy( m_bars ) );
54   }
55 
testTakingOwnership()56   void testTakingOwnership()
57   {
58       m_axis = new CartesianAxis();
59       m_bars->addAxis( m_axis );
60       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_bars ) );
61       QVERIFY( m_axis->observedBy( m_bars ) );
62       QVERIFY( !m_axis->observedBy( m_lines ) );
63   }
64 
testGivingUpOwnership()65   void testGivingUpOwnership()
66   {
67       m_axis = new CartesianAxis();
68       m_bars->addAxis( m_axis );
69       m_lines->addAxis( m_axis );
70       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_bars ) );
71       QVERIFY( m_axis->observedBy( m_bars ) );
72       QVERIFY( m_axis->observedBy( m_lines ) );
73       m_bars->takeAxis( m_axis );
74       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_lines ) );
75       QVERIFY( m_axis->observedBy( m_lines ) );
76       QVERIFY( !m_axis->observedBy( m_bars ) );
77   }
78 
testReplacing()79   void testReplacing()
80   {
81       m_axis = new CartesianAxis;
82       m_lines->addAxis( m_axis );
83       m_chart->coordinatePlane()->takeDiagram( m_bars );
84       QVERIFY( m_axis->observedBy( m_lines ) );
85       QVERIFY( !m_axis->observedBy( m_bars ) );
86       QPointer<LineDiagram> p( m_lines);
87       m_chart->coordinatePlane()->replaceDiagram( m_bars, m_lines );
88       QVERIFY( !p );
89       AbstractDiagram * nullDiagram = nullptr;
90       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( nullDiagram ) );
91       QVERIFY( !m_axis->observedBy( m_bars ) );
92   }
93 
testReplacingWithPropagation()94   void testReplacingWithPropagation()
95   {
96       initTestCase();
97       m_axis = new CartesianAxis;
98       m_lines->addAxis( m_axis );
99       m_bars->addAxis( m_axis );
100       m_chart->coordinatePlane()->takeDiagram( m_bars );
101       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_lines ) );
102       QVERIFY( m_axis->observedBy( m_bars ) );
103       QPointer<LineDiagram> p( m_lines);
104       m_chart->coordinatePlane()->replaceDiagram( m_bars, m_lines );
105       QVERIFY( !p );
106       QCOMPARE( m_axis->diagram(), static_cast<const AbstractDiagram*>( m_bars ) );
107       QVERIFY( m_axis->observedBy( m_bars ) );
108   }
109 
testAxisDeletion()110   void testAxisDeletion()
111   {
112       initTestCase();
113       m_axis = new CartesianAxis;
114       m_lines->addAxis( m_axis );
115       CartesianAxisList list = m_lines->axes();
116       QVERIFY( !list.isEmpty() );
117       delete m_axis;
118       list = m_lines->axes();
119       QVERIFY( list.isEmpty() );
120   }
121 
testAxisDeletionAndUnregister()122   void testAxisDeletionAndUnregister()
123   {
124       initTestCase();
125       m_axis = new CartesianAxis;
126       m_lines->addAxis( m_axis );
127       m_bars->addAxis( m_axis );
128       CartesianAxisList list = m_lines->axes();
129       QVERIFY( !list.isEmpty() );
130       delete m_axis;
131       list = m_lines->axes();
132       QVERIFY( list.isEmpty() );
133       list = m_bars->axes();
134       QVERIFY( list.isEmpty() );
135   }
136 
testFreeStanding()137   void testFreeStanding()
138   {
139       initTestCase();
140       m_axis = new CartesianAxis;
141       m_bars->addAxis( m_axis );
142       BarDiagram *bars2 = new BarDiagram;
143       bars2->setModel( m_tableModel );
144       m_chart->coordinatePlane()->replaceDiagram( bars2 );
145       m_axis->sizeHint();
146   }
147 
cleanupTestCase()148   void cleanupTestCase()
149   {
150   }
151 
152 private:
153   Chart *m_chart;
154   BarDiagram *m_bars;
155   LineDiagram *m_lines;
156   CartesianAxis *m_axis;
157   TableModel *m_tableModel;
158 
159 };
160 
161 QTEST_MAIN(TestAxisOwnership)
162 
163 #include "main.moc"
164