Skip to content

Commit ae242f5

Browse files
arnaud-morvanm-kuhn
authored andcommittedMay 26, 2015
Update QgsFields nameToIndex hash on field removed
1 parent 9b79747 commit ae242f5

File tree

2 files changed

+410
-2
lines changed

2 files changed

+410
-2
lines changed
 

‎src/core/qgsfield.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,12 @@ void QgsFields::remove( int fieldIdx )
203203
if ( !exists( fieldIdx ) )
204204
return;
205205

206-
mNameToIndex.remove( mFields[fieldIdx].field.name() );
207-
mFields.remove( fieldIdx );
206+
d->fields.remove( fieldIdx );
207+
d->nameToIndex.clear();
208+
for ( int idx = 0; idx < count(); ++idx )
209+
{
210+
d->nameToIndex.insert( d->fields[idx].field.name(), idx );
211+
}
208212
}
209213

210214
void QgsFields::extend( const QgsFields& other )

‎tests/src/core/testqgsfields.cpp

Lines changed: 404 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,404 @@
1+
/***************************************************************************
2+
testqgsfields.cpp
3+
-----------------
4+
Date : May 2015
5+
Copyright : (C) 2015 Nyall Dawson
6+
Email : nyall dot dawson at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#include <QtTest/QtTest>
16+
#include <QObject>
17+
#include <QString>
18+
#include <QStringList>
19+
#include <QSettings>
20+
#include <QSharedPointer>
21+
22+
#include "qgsfield.h"
23+
24+
class TestQgsFields: public QObject
25+
{
26+
Q_OBJECT
27+
28+
private slots:
29+
void initTestCase();// will be called before the first testfunction is executed.
30+
void cleanupTestCase();// will be called after the last testfunction was executed.
31+
void init();// will be called before each testfunction is executed.
32+
void cleanup();// will be called after every testfunction.
33+
void create();//test creating a data defined container
34+
void copy();// test cpy destruction (double delete)
35+
void assignment();
36+
void equality(); //test equality operators
37+
void asVariant(); //test conversion to and from a QVariant
38+
void clear();
39+
void exists();
40+
void count();
41+
void isEmpty();
42+
void remove();
43+
void extend();
44+
void byIndex();
45+
void byName();
46+
void fieldOrigin();
47+
void fieldOriginIndex();
48+
void indexFromName();
49+
void toList();
50+
void allAttrsList();
51+
void appendExpressionField();
52+
53+
private:
54+
};
55+
56+
void TestQgsFields::initTestCase()
57+
{
58+
59+
}
60+
61+
void TestQgsFields::cleanupTestCase()
62+
{
63+
64+
}
65+
66+
void TestQgsFields::init()
67+
{
68+
69+
}
70+
71+
void TestQgsFields::cleanup()
72+
{
73+
74+
}
75+
76+
void TestQgsFields::create()
77+
{
78+
QgsFields fields;
79+
QCOMPARE( fields.count(), 0 );
80+
}
81+
82+
void TestQgsFields::copy()
83+
{
84+
QgsFields original;
85+
//add field
86+
QgsField field( "testfield" );
87+
original.append( field );
88+
QCOMPARE( original.count(), 1 );
89+
QgsFields copy( original );
90+
QCOMPARE( copy.count(), 1 );
91+
QVERIFY( copy == original );
92+
93+
QgsField copyfield( "copyfield" );
94+
copy.append( copyfield );
95+
QCOMPARE( copy.count(), 2 );
96+
QCOMPARE( original.count(), 1 );
97+
QVERIFY( copy != original );
98+
}
99+
100+
void TestQgsFields::assignment()
101+
{
102+
QgsFields original;
103+
//add field
104+
QgsField field( "testfield" );
105+
original.append( field );
106+
107+
QgsFields copy;
108+
copy = original;
109+
QVERIFY( copy == original );
110+
111+
QgsField copyfield( "copyfield" );
112+
copy.append( copyfield );
113+
QCOMPARE( original.count(), 1 );
114+
QCOMPARE( copy.count(), 2 );
115+
QVERIFY( copy != original );
116+
}
117+
118+
void TestQgsFields::equality()
119+
{
120+
//compare two empty QgsFields
121+
QgsFields fields1;
122+
QgsFields fields2;
123+
QVERIFY( fields1 == fields2 );
124+
QVERIFY( !( fields1 != fields2 ) );
125+
126+
//append an identical fields to both and retest
127+
QgsField field1;
128+
field1.setName( "name" );
129+
QgsField field2;
130+
field2.setName( "name" );
131+
QCOMPARE( field1, field2 );
132+
fields1.append( field1 );
133+
fields2.append( field2 );
134+
QVERIFY( fields1 == fields2 );
135+
QVERIFY( !( fields1 != fields2 ) );
136+
137+
//make a change and retest
138+
QgsField field3;
139+
fields2.append( field3 );
140+
QVERIFY( !( fields1 == fields2 ) );
141+
QVERIFY( fields1 != fields2 );
142+
}
143+
144+
void TestQgsFields::asVariant()
145+
{
146+
QgsField field1;
147+
field1.setName( "name" );
148+
QgsField field2;
149+
field2.setName( "name" );
150+
QgsFields original;
151+
original.append( field1 );
152+
original.append( field2 );
153+
154+
//convert to and from a QVariant
155+
QVariant var = QVariant::fromValue( original );
156+
QVERIFY( var.isValid() );
157+
158+
QgsFields fromVar = qvariant_cast<QgsFields>( var );
159+
QCOMPARE( fromVar, original );
160+
}
161+
162+
void TestQgsFields::clear()
163+
{
164+
QgsFields original;
165+
QgsField field( "testfield" );
166+
original.append( field );
167+
QCOMPARE( original.count(), 1 );
168+
QgsFields copy( original );
169+
170+
copy.clear();
171+
QCOMPARE( copy.count(), 0 );
172+
QCOMPARE( original.count(), 1 );
173+
}
174+
175+
void TestQgsFields::exists()
176+
{
177+
QgsFields fields;
178+
QgsField field( "testfield" );
179+
fields.append( field );
180+
181+
QVERIFY( !fields.exists( -1 ) );
182+
QVERIFY( !fields.exists( 1 ) );
183+
QVERIFY( fields.exists( 0 ) );
184+
}
185+
186+
void TestQgsFields::count()
187+
{
188+
QgsFields fields;
189+
QCOMPARE( fields.count(), 0 );
190+
QCOMPARE( fields.size(), 0 );
191+
192+
QgsField field( "testfield" );
193+
fields.append( field );
194+
QCOMPARE( fields.count(), 1 );
195+
QCOMPARE( fields.size(), 1 );
196+
197+
QgsField field2( "testfield2" );
198+
fields.append( field2 );
199+
QCOMPARE( fields.count(), 2 );
200+
QCOMPARE( fields.size(), 2 );
201+
}
202+
203+
void TestQgsFields::isEmpty()
204+
{
205+
QgsFields fields;
206+
QVERIFY( fields.isEmpty() );
207+
208+
QgsField field( "testfield" );
209+
fields.append( field );
210+
QVERIFY( !fields.isEmpty() );
211+
}
212+
213+
void TestQgsFields::remove()
214+
{
215+
QgsFields fields;
216+
217+
//test for no crash
218+
fields.remove( 1 );
219+
220+
QgsField field( "testfield" );
221+
fields.append( field );
222+
QgsField field2( "testfield2" );
223+
fields.append( field2 );
224+
225+
//test for no crash
226+
fields.remove( -1 );
227+
fields.remove( 5 );
228+
229+
//remove valid field
230+
fields.remove( 0 );
231+
QCOMPARE( fields.count(), 1 );
232+
QCOMPARE( fields.at( 0 ).name(), QString( "testfield2" ) );
233+
QCOMPARE( fields.indexFromName(QString( "testfield2" )), 0);
234+
}
235+
236+
void TestQgsFields::extend()
237+
{
238+
QgsFields destination;
239+
QgsField field( "testfield" );
240+
destination.append( field );
241+
QgsField field2( "testfield2" );
242+
destination.append( field2 );
243+
244+
QgsFields source;
245+
QgsField field3( "testfield3" );
246+
source.append( field3, QgsFields::OriginJoin, 5 );
247+
QgsField field4( "testfield4" );
248+
source.append( field4 );
249+
250+
QCOMPARE( destination.count(), 2 );
251+
destination.extend( source );
252+
QCOMPARE( destination.count(), 4 );
253+
QCOMPARE( destination.at( 2 ), field3 );
254+
QCOMPARE( destination.at( 3 ), field4 );
255+
}
256+
257+
void TestQgsFields::byIndex()
258+
{
259+
QgsFields fields;
260+
QgsField field( "testfield" );
261+
fields.append( field );
262+
QgsField field2( "testfield2" );
263+
fields.append( field2 );
264+
265+
QCOMPARE( fields[0], field );
266+
QCOMPARE( fields[1], field2 );
267+
268+
const QgsFields& constFields = fields;
269+
QCOMPARE( constFields[0], field );
270+
QCOMPARE( constFields[1], field2 );
271+
QCOMPARE( constFields.at( 0 ), field );
272+
QCOMPARE( constFields.at( 1 ), field2 );
273+
QCOMPARE( constFields.field( 0 ), field );
274+
QCOMPARE( constFields.field( 1 ), field2 );
275+
}
276+
277+
void TestQgsFields::byName()
278+
{
279+
QgsFields fields;
280+
QgsField field( "testfield" );
281+
fields.append( field );
282+
QgsField field2( "testfield2" );
283+
fields.append( field2 );
284+
285+
QCOMPARE( fields.field( "testfield" ), field );
286+
QCOMPARE( fields.field( "testfield2" ), field2 );
287+
}
288+
289+
void TestQgsFields::fieldOrigin()
290+
{
291+
QgsFields fields;
292+
QgsField field( QString( "testfield" ) );
293+
fields.append( field , QgsFields::OriginJoin );
294+
QgsField field2( QString( "testfield2" ) );
295+
fields.append( field2, QgsFields::OriginExpression );
296+
297+
QCOMPARE( fields.fieldOrigin( 0 ), QgsFields::OriginJoin );
298+
QCOMPARE( fields.fieldOrigin( 1 ), QgsFields::OriginExpression );
299+
QCOMPARE( fields.fieldOrigin( 2 ), QgsFields::OriginUnknown );
300+
}
301+
302+
void TestQgsFields::fieldOriginIndex()
303+
{
304+
QgsFields fields;
305+
QgsField field( QString( "testfield" ) );
306+
fields.append( field , QgsFields::OriginProvider, 5 );
307+
QCOMPARE( fields.fieldOriginIndex( 0 ), 5 );
308+
309+
QgsField field2( QString( "testfield2" ) );
310+
fields.append( field2, QgsFields::OriginProvider, 10 );
311+
QCOMPARE( fields.fieldOriginIndex( 1 ), 10 );
312+
313+
QgsField field3( QString( "testfield3" ) );
314+
//field origin index not specified with OriginProvider, should be automatic
315+
fields.append( field3, QgsFields::OriginProvider );
316+
QCOMPARE( fields.fieldOriginIndex( 2 ), 2 );
317+
318+
QgsField field4( QString( "testfield4" ) );
319+
//field origin index not specified with other than OriginProvider, should remain -1
320+
fields.append( field4, QgsFields::OriginEdit );
321+
QCOMPARE( fields.fieldOriginIndex( 3 ), -1 );
322+
}
323+
324+
void TestQgsFields::indexFromName()
325+
{
326+
QgsFields fields;
327+
QgsField field( QString( "testfield" ) );
328+
fields.append( field );
329+
QgsField field2( QString( "testfield2" ) );
330+
fields.append( field2 );
331+
QgsField field3( QString( "testfield3" ) );
332+
fields.append( field3 );
333+
334+
QCOMPARE( fields.indexFromName( QString( "bad" ) ), -1 );
335+
QCOMPARE( fields.fieldNameIndex( QString( "bad" ) ), -1 );
336+
QCOMPARE( fields.indexFromName( QString( "testfield" ) ), 0 );
337+
QCOMPARE( fields.fieldNameIndex( QString( "testfield" ) ), 0 );
338+
QCOMPARE( fields.indexFromName( QString( "testfield3" ) ), 2 );
339+
QCOMPARE( fields.fieldNameIndex( QString( "testfield3" ) ), 2 );
340+
341+
//indexFromName is case sensitive, fieldNameIndex isn't
342+
QCOMPARE( fields.indexFromName( QString( "teStFiEld2" ) ), -1 );
343+
QCOMPARE( fields.fieldNameIndex( QString( "teStFiEld2" ) ), 1 );
344+
}
345+
346+
void TestQgsFields::toList()
347+
{
348+
QgsFields fields;
349+
QList<QgsField> list = fields.toList();
350+
QVERIFY( list.isEmpty() );
351+
352+
QgsField field( QString( "testfield" ) );
353+
fields.append( field );
354+
QgsField field2( QString( "testfield2" ) );
355+
fields.append( field2 );
356+
QgsField field3( QString( "testfield3" ) );
357+
fields.append( field3 );
358+
359+
list = fields.toList();
360+
QCOMPARE( list.at( 0 ), field );
361+
QCOMPARE( list.at( 1 ), field2 );
362+
QCOMPARE( list.at( 2 ), field3 );
363+
}
364+
365+
void TestQgsFields::allAttrsList()
366+
{
367+
QgsFields fields;
368+
QgsAttributeList attrList = fields.allAttributesList();
369+
QVERIFY( attrList.isEmpty() );
370+
371+
QgsField field( QString( "testfield" ) );
372+
fields.append( field );
373+
QgsField field2( QString( "testfield2" ) );
374+
fields.append( field2 );
375+
QgsField field3( QString( "testfield3" ) );
376+
fields.append( field3 );
377+
378+
attrList = fields.allAttributesList();
379+
QCOMPARE( attrList.at( 0 ), 0 );
380+
QCOMPARE( attrList.at( 1 ), 1 );
381+
QCOMPARE( attrList.at( 2 ), 2 );
382+
}
383+
384+
void TestQgsFields::appendExpressionField()
385+
{
386+
QgsFields fields;
387+
QgsField field( QString( "testfield" ) );
388+
fields.append( field );
389+
QgsField field2( QString( "testfield2" ) );
390+
fields.append( field2 );
391+
392+
QgsField dupeName( QString( "testfield" ) );
393+
QVERIFY( !fields.appendExpressionField( dupeName, 1 ) );
394+
395+
//good name
396+
QgsField exprField( QString( "expression" ) );
397+
QVERIFY( fields.appendExpressionField( exprField, 5 ) );
398+
QCOMPARE( fields.count(), 3 );
399+
QCOMPARE( fields.fieldOrigin( 2 ), QgsFields::OriginExpression );
400+
QCOMPARE( fields.fieldOriginIndex( 2 ), 5 );
401+
}
402+
403+
QTEST_MAIN( TestQgsFields )
404+
#include "testqgsfields.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.