1 /***************************************************************************
2 testqgsvectorlayersaveasdialog.cpp
3 -------------------------
4 Date : 2016-05-05
5 Copyright : (C) 2016 by Even Rouault
6 Email : even.rouault at spatials.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 "qgstest.h"
16 #include "qgisapp.h"
17 #include "qgsapplication.h"
18 #include "qgsvectorlayer.h"
19 #include "qgsfeature.h"
20 #include "qgsgeometry.h"
21 #include "qgsvectordataprovider.h"
22 #include "ogr/qgsvectorlayersaveasdialog.h"
23 #include "qgseditorwidgetregistry.h"
24 #include "qgsproject.h"
25 #include "qgsmapcanvas.h"
26 #include "qgsgui.h"
27
28 /**
29 * \ingroup UnitTests
30 * This is a unit test for the save as dialog
31 */
32 class TestQgsVectorLayerSaveAsDialog : public QObject
33 {
34 Q_OBJECT
35 public:
36 TestQgsVectorLayerSaveAsDialog();
37
38 private slots:
39 void initTestCase();// will be called before the first testfunction is executed.
40 void cleanupTestCase();// will be called after the last testfunction was executed.
init()41 void init() {} // will be called before each testfunction is executed.
cleanup()42 void cleanup() {} // will be called after every testfunction.
43
44 void testAttributesAsDisplayedValues();
45
46 private:
47 QgisApp *mQgisApp = nullptr;
48 };
49
50 TestQgsVectorLayerSaveAsDialog::TestQgsVectorLayerSaveAsDialog() = default;
51
52 //runs before all tests
initTestCase()53 void TestQgsVectorLayerSaveAsDialog::initTestCase()
54 {
55 qDebug() << "TestQgsVectorLayerSaveAsDialog::initTestCase()";
56 // init QGIS's paths - true means that all path will be inited from prefix
57 QgsApplication::init();
58 QgsApplication::initQgis();
59 mQgisApp = new QgisApp();
60 QgsGui::editorWidgetRegistry()->initEditors();
61 }
62
63 //runs after all tests
cleanupTestCase()64 void TestQgsVectorLayerSaveAsDialog::cleanupTestCase()
65 {
66 QgsApplication::exitQgis();
67 }
68
testAttributesAsDisplayedValues()69 void TestQgsVectorLayerSaveAsDialog::testAttributesAsDisplayedValues()
70 {
71 //create a temporary layer
72 std::unique_ptr< QgsVectorLayer> tempLayer( new QgsVectorLayer( QStringLiteral( "none?field=code:int&field=regular:string" ), QStringLiteral( "vl" ), QStringLiteral( "memory" ) ) );
73 QVERIFY( tempLayer->isValid() );
74
75 // Assign a custom CRS to the layer
76 QgsCoordinateReferenceSystem crs;
77 crs.createFromString( "PROJ:+proj=merc +a=1" );
78 tempLayer->setCrs( crs );
79
80 // Set a widget
81 tempLayer->setEditorWidgetSetup( 0, QgsEditorWidgetSetup( QStringLiteral( "ValueRelation" ), QVariantMap() ) );
82
83 QgsVectorLayerSaveAsDialog d( tempLayer.get() );
84
85 QPushButton *mDeselectAllAttributes = d.findChild<QPushButton *>( QStringLiteral( "mDeselectAllAttributes" ) );
86 QTest::mouseClick( mDeselectAllAttributes, Qt::LeftButton );
87
88 QTableWidget *mAttributeTable = d.findChild<QTableWidget *>( QStringLiteral( "mAttributeTable" ) );
89 QCheckBox *mReplaceRawFieldValues = d.findChild<QCheckBox *>( QStringLiteral( "mReplaceRawFieldValues" ) );
90
91 QCOMPARE( mAttributeTable->rowCount(), 2 );
92 QCOMPARE( mAttributeTable->columnCount(), 3 );
93
94 QCOMPARE( d.attributesAsDisplayedValues().size(), 0 );
95
96 QCOMPARE( mReplaceRawFieldValues->checkState(), Qt::Unchecked );
97 QCOMPARE( mReplaceRawFieldValues->isEnabled(), false );
98 QCOMPARE( mAttributeTable->item( 0, 0 )->checkState(), Qt::Unchecked );
99 QCOMPARE( mAttributeTable->item( 0, 2 )->checkState(), Qt::Unchecked );
100 QCOMPARE( mAttributeTable->item( 0, 2 )->flags(), Qt::ItemIsUserCheckable );
101 QCOMPARE( mAttributeTable->item( 1, 2 )->flags(), 0 );
102
103 // Activate item
104 mAttributeTable->item( 0, 0 )->setCheckState( Qt::Checked );
105
106 QCOMPARE( mReplaceRawFieldValues->checkState(), Qt::Unchecked );
107 QCOMPARE( mReplaceRawFieldValues->isEnabled(), true );
108 QCOMPARE( mAttributeTable->item( 0, 0 )->checkState(), Qt::Checked );
109 QCOMPARE( mAttributeTable->item( 0, 2 )->checkState(), Qt::Unchecked );
110 QCOMPARE( mAttributeTable->item( 0, 2 )->flags(), Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
111
112 // Activate "Replace with displayed value" column
113 mAttributeTable->item( 0, 2 )->setCheckState( Qt::Checked );
114
115 QCOMPARE( mReplaceRawFieldValues->checkState(), Qt::Checked );
116 QCOMPARE( mReplaceRawFieldValues->isEnabled(), true );
117
118 // Uncheck mReplaceRawFieldValues
119 mReplaceRawFieldValues->setCheckState( Qt::Unchecked );
120 QCOMPARE( mAttributeTable->item( 0, 2 )->checkState(), Qt::Unchecked );
121 QCOMPARE( mAttributeTable->item( 0, 2 )->flags(), Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
122
123 // Check mReplaceRawFieldValues
124 mReplaceRawFieldValues->setCheckState( Qt::Checked );
125 QCOMPARE( mAttributeTable->item( 0, 2 )->checkState(), Qt::Checked );
126 QCOMPARE( mAttributeTable->item( 0, 2 )->flags(), Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
127
128 QCOMPARE( d.attributesAsDisplayedValues().size(), 1 );
129 QCOMPARE( d.attributesAsDisplayedValues()[0], 0 );
130
131 // Disable item
132 mAttributeTable->item( 0, 0 )->setCheckState( Qt::Unchecked );
133 QCOMPARE( mAttributeTable->item( 0, 2 )->checkState(), Qt::Unchecked );
134 QCOMPARE( mAttributeTable->item( 0, 2 )->flags(), Qt::ItemIsUserCheckable );
135
136 // Check that we can get a custom CRS with crsObject()
137 QCOMPARE( d.crsObject(), crs ) ;
138
139 //d.exec();
140 }
141
142 QGSTEST_MAIN( TestQgsVectorLayerSaveAsDialog )
143 #include "testqgsvectorlayersaveasdialog.moc"
144