Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pblottiere committed Aug 17, 2017
1 parent 40ad860 commit b5bdafe
Show file tree
Hide file tree
Showing 4 changed files with 192 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/gui/editorwidgets/qgsrelationreferencewidget.cpp
Expand Up @@ -191,10 +191,10 @@ void QgsRelationReferenceWidget::setRelation( const QgsRelation& relation, bool
mReferencedFieldIdx = mReferencedLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).second );
mReferencingFieldIdx = mReferencingLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).first );

QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed );

if ( mEmbedForm )
{
QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed );
mAttributeEditorFrame->setTitle( mReferencedLayer->name() );
mReferencedAttributeForm = new QgsAttributeForm( relation.referencedLayer(), QgsFeature(), context, this );
mAttributeEditorLayout->addWidget( mReferencedAttributeForm );
Expand Down Expand Up @@ -464,6 +464,10 @@ void QgsRelationReferenceWidget::init()
{
QVariantList uniqueValues;
int idx = mReferencedLayer->fieldNameIndex( fieldName );

if ( idx == -1 )
continue;

QComboBox* cb = new QComboBox();
cb->setProperty( "Field", fieldName );
cb->setProperty( "FieldAlias", mReferencedLayer->attributeDisplayName( idx ) );
Expand Down
2 changes: 2 additions & 0 deletions src/gui/editorwidgets/qgsrelationreferencewidget.h
Expand Up @@ -219,6 +219,8 @@ class GUI_EXPORT QgsRelationReferenceWidget : public QWidget
QVBoxLayout* mAttributeEditorLayout;
QLineEdit* mLineEdit;
QLabel* mInvalidLabel;

friend class TestQgsRelationReferenceWidget;
};

#endif // QGSRELATIONREFERENCEWIDGET_H
2 changes: 2 additions & 0 deletions tests/src/gui/CMakeLists.txt
Expand Up @@ -14,6 +14,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/gui/editorwidgets/core
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/gui/symbology-ng
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/gui/raster
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/gui/attributetable
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/core
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/core/auth
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/core/composer
Expand Down Expand Up @@ -145,3 +146,4 @@ ADD_QGIS_TEST(sqlcomposerdialog testqgssqlcomposerdialog.cpp)
ADD_QGIS_TEST(filedownloader testqgsfiledownloader.cpp)
ADD_QGIS_TEST(composergui testqgscomposergui.cpp)
ADD_QGIS_TEST(valuerelationwidgetwrapper testqgsvaluerelationwidgetwrapper.cpp)
ADD_QGIS_TEST(relationreferencewidget testqgsrelationreferencewidget.cpp)
183 changes: 183 additions & 0 deletions tests/src/gui/testqgsrelationreferencewidget.cpp
@@ -0,0 +1,183 @@
/***************************************************************************
testqgsrelationreferencewidget.cpp
--------------------------------------
Date : 21 07 2017
Copyright : (C) 2017 Paul Blottiere
Email : paul dot blottiere at oslandia dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include <QtTest/QtTest>
#include <editorwidgets/core/qgseditorwidgetregistry.h>
#include <qgsapplication.h>
#include "qgseditorwidgetwrapper.h"
#include <qgsmaplayerregistry.h>
#include <editorwidgets/qgsrelationreferencewidget.h>
#include <qgsproject.h>
#include <qgsattributeform.h>
#include <qgsrelationmanager.h>
#include <attributetable/qgsattributetablefiltermodel.h>

class TestQgsRelationReferenceWidget : public QObject
{
Q_OBJECT
public:
TestQgsRelationReferenceWidget() {}

private slots:
void initTestCase(); // will be called before the first testfunction is executed.
void cleanupTestCase(); // will be called after the last testfunction was executed.
void init(); // will be called before each testfunction is executed.
void cleanup(); // will be called after every testfunction.

void testChainFilter();
};

void TestQgsRelationReferenceWidget::initTestCase()
{
QgsApplication::init();
QgsApplication::initQgis();
QgsEditorWidgetRegistry::initEditors();
}

void TestQgsRelationReferenceWidget::cleanupTestCase()
{
QgsApplication::exitQgis();
}

void TestQgsRelationReferenceWidget::init()
{
}

void TestQgsRelationReferenceWidget::cleanup()
{
}

void TestQgsRelationReferenceWidget::testChainFilter()
{
// create layers
QgsVectorLayer vl1( QString( "LineString?crs=epsg:3111&field=pk:int&field=fk:int" ), QString( "vl1" ), QString( "memory" ) );
QgsMapLayerRegistry::instance()->addMapLayer( &vl1 );
QgsVectorLayer vl2( QString( "LineString?field=pk:int&field=material:string&field=diameter:int&field=raccord:string" ), QString( "vl2" ), QString( "memory" ) );
QgsMapLayerRegistry::instance()->addMapLayer( &vl2 );

// create a relation between them
QgsRelation relation;
relation.setRelationId( QString( "vl1.vl2" ) );
relation.setRelationName( QString( "vl1.vl2" ) );
relation.setReferencingLayer( vl1.id() );
relation.setReferencedLayer( vl2.id() );
relation.addFieldPair( "fk", "pk" );
QVERIFY( relation.isValid() );
QgsProject::instance()->relationManager()->addRelation( relation );

// add features
QgsFeature ft0( vl1.fields() );
ft0.setAttribute( QString( "pk" ), 0 );
ft0.setAttribute( QString( "fk" ), 0 );
vl1.startEditing();
vl1.addFeature( ft0 );
vl1.commitChanges();

QgsFeature ft1( vl1.fields() );
ft1.setAttribute( QString( "pk" ), 1 );
ft1.setAttribute( QString( "fk" ), 1 );
vl1.startEditing();
vl1.addFeature( ft1 );
vl1.commitChanges();

QgsFeature ft2( vl2.fields() );
ft2.setAttribute( QString( "pk" ), 10 );
ft2.setAttribute( QString( "material" ), "iron" );
ft2.setAttribute( QString( "diameter" ), 120 );
ft2.setAttribute( QString( "raccord" ), "brides" );
vl2.startEditing();
vl2.addFeature( ft2 );
vl2.commitChanges();

QgsFeature ft3( vl2.fields() );
ft3.setAttribute( QString( "pk" ), 11 );
ft3.setAttribute( QString( "material" ), "iron" );
ft3.setAttribute( QString( "diameter" ), 120 );
ft3.setAttribute( QString( "raccord" ), "sleeve" );
vl2.startEditing();
vl2.addFeature( ft3 );
vl2.commitChanges();

QgsFeature ft4( vl2.fields() );
ft4.setAttribute( QString( "pk" ), 12 );
ft4.setAttribute( QString( "material" ), "steel" );
ft4.setAttribute( QString( "diameter" ), 120 );
ft4.setAttribute( QString( "raccord" ), "collar" );
vl2.startEditing();
vl2.addFeature( ft4 );
vl2.commitChanges();

// init a relation reference widget
QStringList filterFields = { "material", "diameter", "raccord" };

QgsRelationReferenceWidget w( new QWidget() );
w.setChainFilters( true );
w.setFilterFields( filterFields );
w.setRelation( relation, true );
w.init();

// check default status for comboboxes
QList<QComboBox *> cbs = w.mFilterComboBoxes;
QCOMPARE( cbs.count(), 3 );
Q_FOREACH ( const QComboBox *cb, cbs )
{
if ( cb->currentText() == "raccord" )
QCOMPARE( cb->count(), 5 );
else if ( cb->currentText() == "material" )
QCOMPARE( cb->count(), 4 );
else if ( cb->currentText() == "diameter" )
QCOMPARE( cb->count(), 3 );
}

// set first filter
cbs[0]->setCurrentIndex( cbs[0]->findText( "iron" ) );
cbs[1]->setCurrentIndex( cbs[1]->findText( "120" ) );

Q_FOREACH ( const QComboBox *cb, cbs )
{
if ( cb->itemText( 0 ) == "material" )
QCOMPARE( cb->count(), 4 );
else if ( cb->itemText( 0 ) == "diameter" )
QCOMPARE( cb->count(), 2 );
else if ( cb->itemText( 0 ) == "raccord" )
{
QStringList items;
for ( int i = 0; i < cb->count(); i++ )
items << cb->itemText( i );

QCOMPARE( cb->count(), 3 );
QCOMPARE(( bool )items.contains( "collar" ), false );
// collar should not be available in combobox as there's no existing
// feature with the filter expression:
// "material" == 'iron' AND "diameter" == '120' AND "raccord" = 'collar'
}
}

// set the filter for "raccord" and then reset filter for "diameter". As
// chain filter is activated, the filter on "raccord" field should be reset
cbs[2]->setCurrentIndex( cbs[2]->findText( "brides" ) );
cbs[1]->setCurrentIndex( cbs[1]->findText( "diameter" ) );

// combobox should propose NULL, 10 and 11 because the filter is now:
// "material" == 'iron'
QCOMPARE( w.mComboBox->count(), 3 );

// if there's no filter at all, all features' id should be proposed
cbs[0]->setCurrentIndex( cbs[0]->findText( "material" ) );
QCOMPARE( w.mComboBox->count(), 4 );
}

QTEST_MAIN( TestQgsRelationReferenceWidget )
#include "testqgsrelationreferencewidget.moc"

0 comments on commit b5bdafe

Please sign in to comment.