1/* This file is part of the KDE project
2 Copyright (C) 2012 Dag Andersen <danders@get2net.dk>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
18*/
19#include "WorkPackageProxyModelTester.h"
20#include "kptcommand.h"
21#include "kpttask.h"
22#include "kptnode.h"
23#include "kptnodeitemmodel.h"
24
25#include <QModelIndex>
26
27#include <qtest_kde.h>
28#include <kdebug.h>
29
30#include "../../kernel/tests/debug.cpp"
31
32namespace KPlato
33{
34
35Task *WorkPackageProxyModelTester::addTask( Node *parent, int after )
36{
37 Task *task = project.createTask();
38 TaskAddCmd cmd( &project, task, parent->childNode( after ) );
39 cmd.redo();
40 ResourceGroupRequest *gr = new ResourceGroupRequest( project.resourceGroupAt(0) );
41 ResourceRequest *rr = new ResourceRequest( project.resourceGroupAt(0)->resourceAt(0), 100 );
42 gr->addResourceRequest( rr );
43 AddResourceGroupRequestCmd c( *task, gr );
44 c.redo();
45 return task;
46}
47
48void WorkPackageProxyModelTester::removeTask( Node *task )
49{
50 NodeDeleteCmd cmd( task );
51 cmd.redo();
52}
53
54void WorkPackageProxyModelTester::moveTask( Node *task, Node *newParent, int newPos )
55{
56 NodeMoveCmd cmd( &project, task, newParent, newPos );
57 cmd.redo();
58}
59
60void WorkPackageProxyModelTester::initTestCase()
61{
62 project.setName( "P1" );
63 project.setId( project.uniqueNodeId() );
64 project.registerNodeId( &project );
65 Calendar *calendar = new Calendar();
66 calendar->setName( "C1" );
67 calendar->setDefault( true );
68 QTime t1( 9, 0, 0 );
69 QTime t2 ( 17, 0, 0 );
70 int length = t1.msecsTo( t2 );
71 for ( int i=1; i <= 7; ++i ) {
72 CalendarDay *d = calendar->weekday( i );
73 d->setState( CalendarDay::Working );
74 d->addInterval( t1, length );
75 }
76 project.addCalendar( calendar );
77
78 QCOMPARE( m_model.rowCount(), 0 );
79 m_model.setProject( &project );
80 QCOMPARE( m_model.rowCount(), 0 );
81
82 ResourceGroup *g = new ResourceGroup();
83 g->setName( "G1" );
84 project.addResourceGroup( g );
85 Resource *r = new Resource();
86 r->setName( "R1" );
87 project.addResource( g, r );
88
89 sm = project.createScheduleManager();
90 m_model.setScheduleManager( sm );
91}
92
93void WorkPackageProxyModelTester::testInsert()
94{
95 Task *task = addTask( &project, 0 );
96 task->setName( "T1" );
97 QCOMPARE( m_model.baseModel()->rowCount(), 1 );
98 QCOMPARE( m_model.rowCount(), 0 ); // filtered, (not scheduled)
99
100 sm->createSchedules();
101 project.calculate( *sm );
102 QVERIFY( task->isScheduled() );
103 QCOMPARE( m_model.rowCount(), 1 );
104 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
105
106 task = addTask( &project, -1 );
107 task->setName( "T2" );
108 QCOMPARE( m_model.baseModel()->rowCount(), 2 );
109 QCOMPARE( m_model.rowCount(), 1 ); // filtered, (not scheduled)
110 sm->createSchedules();
111 project.calculate( *sm );
112 QVERIFY( task->isScheduled() );
113 QCOMPARE( m_model.rowCount(), 2 );
114 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
115
116 task = addTask( &project, -1 );
117 task->setName( "T3" );
118 QCOMPARE( m_model.baseModel()->rowCount(), 3 );
119 QCOMPARE( m_model.rowCount(), 2 ); // filtered, (not scheduled)
120 sm->createSchedules();
121 project.calculate( *sm );
122 QVERIFY( task->isScheduled() );
123 QCOMPARE( m_model.rowCount(), 3 );
124 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
125}
126
127void WorkPackageProxyModelTester::testRemove()
128{
129
130 removeTask( project.childNode( 0 ) );
131 QCOMPARE( m_model.rowCount(), 2 );
132 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
133 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
134
135 removeTask( project.childNode( 1 ) );
136 QCOMPARE( m_model.rowCount(), 1 );
137 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
138
139 removeTask( project.childNode( 0 ) );
140 QCOMPARE( m_model.rowCount(), 0 );
141}
142
143void WorkPackageProxyModelTester::testMove()
144{
145 testInsert();
146 //Debug::print( &project, "T1, T2, T3 ---------", true );
147 moveTask( project.childNode( 0 ), &project, 1 );
148 //Debug::print( &project, "T2, T1, T3 ---------", true );
149 QCOMPARE( m_model.rowCount(), 3 );
150 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
151 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
152 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
153
154 moveTask( project.childNode( 1 ), &project, 0 );
155 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
156 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
157 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
158
159 moveTask( project.childNode( 1 ), &project, 0 );
160 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
161 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
162 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
163
164 moveTask( project.childNode( 0 ), &project, -1 ); // last
165 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
166 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
167 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
168}
169
170void WorkPackageProxyModelTester::testMoveChild()
171{
172 while ( project.numChildren() > 0 ) {
173 Node *t = project.childNode( 0 );
174 project.takeTask( t );
175 delete t;
176 }
177 testInsert();
178 Task *task = addTask( &project, 1 ); // after 1 = 2 :(
179 task->setName( "T4" );
180 //Debug::print( &project, "T1, T2, T4, T3 ----", true );
181 QCOMPARE( project.numChildren(), 4 );
182 QCOMPARE( m_model.rowCount(), 3 ); // filtered, (not scheduled)
183
184 sm->createSchedules();
185 project.calculate( *sm );
186 //Debug::print( &project, "T1, T2, T4, T3 ----", true );
187 QVERIFY( task->isScheduled() );
188 QCOMPARE( m_model.rowCount(), 4 );
189 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
190 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
191 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T4" ) );
192 QCOMPARE( m_model.index( 3, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
193
194 project.indentTask( project.childNode( 2 ) );
195 //Debug::print( &project, "T1, T2 -> T4, T3 ----", true );
196 QCOMPARE( m_model.rowCount(), 3 );
197 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
198 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T4" ) );
199 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
200
201 moveTask( project.childNode( 1 )->childNode( 0 ), project.childNode( 0 ), 0 );
202 //Debug::print( &project, "T1 -> T4, T2, T3 ----", true );
203 QCOMPARE( m_model.rowCount(), 3 );
204 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T4" ) );
205 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
206 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
207
208 moveTask( project.childNode( 0 )->childNode( 0 ), project.childNode( 2 ), 0 );
209 //Debug::print( &project, "T1, T2, T3 -> T4 ----", true );
210 QCOMPARE( m_model.rowCount(), 3 );
211 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
212 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
213 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T4" ) );
214
215 moveTask( project.childNode( 2 )->childNode( 0 ), &project, 0 );
216 //Debug::print( &project, "T4, T1, T2, T3 ----", true );
217 QCOMPARE( m_model.rowCount(), 4 );
218 QCOMPARE( m_model.index( 0, NodeModel::NodeName ).data().toString(), QString( "T4" ) );
219 QCOMPARE( m_model.index( 1, NodeModel::NodeName ).data().toString(), QString( "T1" ) );
220 QCOMPARE( m_model.index( 2, NodeModel::NodeName ).data().toString(), QString( "T2" ) );
221 QCOMPARE( m_model.index( 3, NodeModel::NodeName ).data().toString(), QString( "T3" ) );
222}
223
224} //namespace KPlato
225
226QTEST_KDEMAIN_CORE( KPlato::WorkPackageProxyModelTester )
227
228#include "WorkPackageProxyModelTester.moc"
229