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