mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-17 00:04:02 -04:00
Add tests
This commit is contained in:
parent
8642e88867
commit
58ea88715d
@ -198,10 +198,10 @@ void QgsRelationReferenceWidget::setRelation( const QgsRelation &relation, bool
|
|||||||
mReferencingFieldIdx = mReferencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first );
|
mReferencingFieldIdx = mReferencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first );
|
||||||
mAttributeEditorFrame->setObjectName( QStringLiteral( "referencing/" ) + relation.name() );
|
mAttributeEditorFrame->setObjectName( QStringLiteral( "referencing/" ) + relation.name() );
|
||||||
|
|
||||||
QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed );
|
|
||||||
|
|
||||||
if ( mEmbedForm )
|
if ( mEmbedForm )
|
||||||
{
|
{
|
||||||
|
QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed );
|
||||||
mAttributeEditorFrame->setTitle( mReferencedLayer->name() );
|
mAttributeEditorFrame->setTitle( mReferencedLayer->name() );
|
||||||
mReferencedAttributeForm = new QgsAttributeForm( relation.referencedLayer(), QgsFeature(), context, this );
|
mReferencedAttributeForm = new QgsAttributeForm( relation.referencedLayer(), QgsFeature(), context, this );
|
||||||
mAttributeEditorLayout->addWidget( mReferencedAttributeForm );
|
mAttributeEditorLayout->addWidget( mReferencedAttributeForm );
|
||||||
@ -467,6 +467,10 @@ void QgsRelationReferenceWidget::init()
|
|||||||
Q_FOREACH ( const QString &fieldName, mFilterFields )
|
Q_FOREACH ( const QString &fieldName, mFilterFields )
|
||||||
{
|
{
|
||||||
int idx = mReferencedLayer->fields().lookupField( fieldName );
|
int idx = mReferencedLayer->fields().lookupField( fieldName );
|
||||||
|
|
||||||
|
if ( idx == -1 )
|
||||||
|
continue;
|
||||||
|
|
||||||
QComboBox *cb = new QComboBox();
|
QComboBox *cb = new QComboBox();
|
||||||
cb->setProperty( "Field", fieldName );
|
cb->setProperty( "Field", fieldName );
|
||||||
cb->setProperty( "FieldAlias", mReferencedLayer->attributeDisplayName( idx ) );
|
cb->setProperty( "FieldAlias", mReferencedLayer->attributeDisplayName( idx ) );
|
||||||
|
@ -241,6 +241,8 @@ class GUI_EXPORT QgsRelationReferenceWidget : public QWidget
|
|||||||
QVBoxLayout *mAttributeEditorLayout = nullptr;
|
QVBoxLayout *mAttributeEditorLayout = nullptr;
|
||||||
QLineEdit *mLineEdit = nullptr;
|
QLineEdit *mLineEdit = nullptr;
|
||||||
QLabel *mInvalidLabel = nullptr;
|
QLabel *mInvalidLabel = nullptr;
|
||||||
|
|
||||||
|
friend class TestQgsRelationReferenceWidget;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGSRELATIONREFERENCEWIDGET_H
|
#endif // QGSRELATIONREFERENCEWIDGET_H
|
||||||
|
@ -136,3 +136,4 @@ ADD_QGIS_TEST(filedownloader testqgsfiledownloader.cpp)
|
|||||||
ADD_QGIS_TEST(composergui testqgscomposergui.cpp)
|
ADD_QGIS_TEST(composergui testqgscomposergui.cpp)
|
||||||
ADD_QGIS_TEST(layoutview testqgslayoutview.cpp)
|
ADD_QGIS_TEST(layoutview testqgslayoutview.cpp)
|
||||||
ADD_QGIS_TEST(valuerelationwidgetwrapper testqgsvaluerelationwidgetwrapper.cpp)
|
ADD_QGIS_TEST(valuerelationwidgetwrapper testqgsvaluerelationwidgetwrapper.cpp)
|
||||||
|
ADD_QGIS_TEST(relationreferencewidget testqgsrelationreferencewidget.cpp)
|
||||||
|
172
tests/src/gui/testqgsrelationreferencewidget.cpp
Normal file
172
tests/src/gui/testqgsrelationreferencewidget.cpp
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
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 "qgstest.h"
|
||||||
|
|
||||||
|
#include <editorwidgets/core/qgseditorwidgetregistry.h>
|
||||||
|
#include <qgsapplication.h>
|
||||||
|
#include "qgseditorwidgetwrapper.h"
|
||||||
|
#include <editorwidgets/qgsrelationreferencewidget.h>
|
||||||
|
#include <qgsproject.h>
|
||||||
|
#include <qgsattributeform.h>
|
||||||
|
#include <qgsrelationmanager.h>
|
||||||
|
#include <attributetable/qgsattributetablefiltermodel.h>
|
||||||
|
#include "qgsgui.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();
|
||||||
|
QgsGui::editorWidgetRegistry()->initEditors();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestQgsRelationReferenceWidget::cleanupTestCase()
|
||||||
|
{
|
||||||
|
QgsApplication::exitQgis();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestQgsRelationReferenceWidget::init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestQgsRelationReferenceWidget::cleanup()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestQgsRelationReferenceWidget::testChainFilter()
|
||||||
|
{
|
||||||
|
// create layers
|
||||||
|
QgsVectorLayer vl1( QStringLiteral( "LineString?crs=epsg:3111&field=pk:int&field=fk:int" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) );
|
||||||
|
QgsVectorLayer vl2( QStringLiteral( "LineString?field=pk:int&field=material:string&field=diameter:int&field=raccord:string" ), QStringLiteral( "vl2" ), QStringLiteral( "memory" ) );
|
||||||
|
QgsProject::instance()->addMapLayer( &vl1, false, false );
|
||||||
|
QgsProject::instance()->addMapLayer( &vl2, false, false );
|
||||||
|
|
||||||
|
// create a relation between them
|
||||||
|
QgsRelation relation;
|
||||||
|
relation.setId( QStringLiteral( "vl1.vl2" ) );
|
||||||
|
relation.setName( QStringLiteral( "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( QStringLiteral( "pk" ), 0 );
|
||||||
|
ft0.setAttribute( QStringLiteral( "fk" ), 0 );
|
||||||
|
vl1.startEditing();
|
||||||
|
vl1.addFeature( ft0 );
|
||||||
|
vl1.commitChanges();
|
||||||
|
|
||||||
|
QgsFeature ft1( vl1.fields() );
|
||||||
|
ft1.setAttribute( QStringLiteral( "pk" ), 1 );
|
||||||
|
ft1.setAttribute( QStringLiteral( "fk" ), 1 );
|
||||||
|
vl1.startEditing();
|
||||||
|
vl1.addFeature( ft1 );
|
||||||
|
vl1.commitChanges();
|
||||||
|
|
||||||
|
QgsFeature ft2( vl2.fields() );
|
||||||
|
ft2.setAttribute( QStringLiteral( "pk" ), 10 );
|
||||||
|
ft2.setAttribute( QStringLiteral( "material" ), "iron" );
|
||||||
|
ft2.setAttribute( QStringLiteral( "diameter" ), 120 );
|
||||||
|
ft2.setAttribute( QStringLiteral( "raccord" ), "brides" );
|
||||||
|
vl2.startEditing();
|
||||||
|
vl2.addFeature( ft2 );
|
||||||
|
vl2.commitChanges();
|
||||||
|
|
||||||
|
QgsFeature ft3( vl2.fields() );
|
||||||
|
ft3.setAttribute( QStringLiteral( "pk" ), 11 );
|
||||||
|
ft3.setAttribute( QStringLiteral( "material" ), "iron" );
|
||||||
|
ft3.setAttribute( QStringLiteral( "diameter" ), 120 );
|
||||||
|
ft3.setAttribute( QStringLiteral( "raccord" ), "sleeve" );
|
||||||
|
vl2.startEditing();
|
||||||
|
vl2.addFeature( ft3 );
|
||||||
|
vl2.commitChanges();
|
||||||
|
|
||||||
|
QgsFeature ft4( vl2.fields() );
|
||||||
|
ft4.setAttribute( QStringLiteral( "pk" ), 12 );
|
||||||
|
ft4.setAttribute( QStringLiteral( "material" ), "steel" );
|
||||||
|
ft4.setAttribute( QStringLiteral( "diameter" ), 120 );
|
||||||
|
ft4.setAttribute( QStringLiteral( "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( 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'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QGSTEST_MAIN( TestQgsRelationReferenceWidget )
|
||||||
|
#include "testqgsrelationreferencewidget.moc"
|
Loading…
x
Reference in New Issue
Block a user