Skip to content

Commit 7cf409e

Browse files
committed
Add unit test for #18283
1 parent a76fb0b commit 7cf409e

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

tests/src/core/testqgslabelingengine.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class TestQgsLabelingEngine : public QObject
5050
void testParticipatingLayers();
5151
void testRegisterFeatureUnprojectible();
5252
void testRotateHidePartial();
53+
void testParallelLabelSmallFeature();
5354

5455
private:
5556
QgsVectorLayer *vl = nullptr;
@@ -696,5 +697,76 @@ void TestQgsLabelingEngine::testRotateHidePartial()
696697
QVERIFY( imageCheck( "label_rotate_hide_partial", img, 20 ) );
697698
}
698699

700+
void TestQgsLabelingEngine::testParallelLabelSmallFeature()
701+
{
702+
// Test rendering a small, closed linestring using parallel labeling
703+
// This test assumes that NO label is drawn in this situation. In future we may want
704+
// to revisit this and e.g. draw a centered horizontal label over the feature -- in which
705+
// case the reference image here should be freely revised. But for now, we just don't
706+
// want a hang/crash such as described in https://issues.qgis.org/issues/18283
707+
708+
QgsPalLayerSettings settings;
709+
setDefaultLabelParams( settings );
710+
711+
QgsTextFormat format = settings.format();
712+
format.setSize( 20 );
713+
format.setColor( QColor( 0, 0, 0 ) );
714+
settings.setFormat( format );
715+
716+
settings.fieldName = QStringLiteral( "'long label which doesn\\'t fit'" );
717+
settings.isExpression = true;
718+
settings.placement = QgsPalLayerSettings::Line;
719+
720+
std::unique_ptr< QgsVectorLayer> vl2( new QgsVectorLayer( QStringLiteral( "linestring?crs=epsg:3148&field=id:integer" ), QStringLiteral( "vl" ), QStringLiteral( "memory" ) ) );
721+
vl2->setRenderer( new QgsNullSymbolRenderer() );
722+
723+
QgsVectorLayerLabelProvider *provider = new QgsVectorLayerLabelProvider( vl2.get(), QStringLiteral( "test" ), true, &settings );
724+
QgsFeature f( vl2->fields(), 1 );
725+
726+
f.setGeometry( QgsGeometry().fromWkt( QStringLiteral( "MultiLineString ((491176.796876200591214 1277565.39028006233274937, 491172.03128372476203367 1277562.45040752924978733, 491167.67935446038609371 1277557.28786265244707465, 491165.36599104333436117 1277550.97473702346906066, 491165.35308923490811139 1277544.24074512091465294, 491166.8345245998352766 1277539.49665334494784474, 491169.47186020453227684 1277535.27191955596208572, 491173.11253597546601668 1277531.85408334922976792, 491179.02124191814800724 1277528.94421873707324266, 491185.57387020520400256 1277528.15719766705296934, 491192.01811734877992421 1277529.57064539520069957, 491197.62341773137450218 1277533.02997340611182153, 491201.74636711279163137 1277538.15941766835749149, 491203.92884904221864417 1277544.35095247370190918, 491203.9633954341406934 1277550.5652371181640774, 491202.02436481812037528 1277556.4815535971429199, 491198.296930403157603 1277561.48062952468171716, 491193.17346247035311535 1277565.0647635399363935, 491187.82046439842088148 1277566.747082503978163, 491182.21622701874002814 1277566.85931688314303756, 491176.796876200591214 1277565.39028006233274937))" ) ) );
727+
vl2->dataProvider()->addFeature( f );
728+
729+
vl2->setLabeling( new QgsVectorLayerSimpleLabeling( settings ) ); // TODO: this should not be necessary!
730+
vl2->setLabelsEnabled( true );
731+
732+
// make a fake render context
733+
QSize size( 640, 480 );
734+
QgsMapSettings mapSettings;
735+
QgsCoordinateReferenceSystem tgtCrs;
736+
tgtCrs.createFromString( QStringLiteral( "EPSG:3148" ) );
737+
mapSettings.setDestinationCrs( tgtCrs );
738+
739+
mapSettings.setOutputSize( size );
740+
mapSettings.setExtent( QgsRectangle( 490359.7, 1276862.1, 492587.8, 1278500.0 ) );
741+
mapSettings.setLayers( QList<QgsMapLayer *>() << vl2.get() );
742+
mapSettings.setOutputDpi( 96 );
743+
744+
QgsLabelingEngineSettings engineSettings = mapSettings.labelingEngineSettings();
745+
engineSettings.setFlag( QgsLabelingEngineSettings::UsePartialCandidates, false );
746+
engineSettings.setFlag( QgsLabelingEngineSettings::DrawLabelRectOnly, true );
747+
mapSettings.setLabelingEngineSettings( engineSettings );
748+
749+
QgsMapRendererSequentialJob job( mapSettings );
750+
job.start();
751+
job.waitForFinished();
752+
753+
QImage img = job.renderedImage();
754+
755+
QPainter p( &img );
756+
QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings );
757+
context.setPainter( &p );
758+
759+
QgsLabelingEngine engine;
760+
engine.setMapSettings( mapSettings );
761+
engine.addProvider( provider );
762+
763+
engine.run( context );
764+
p.end();
765+
engine.removeProvider( provider );
766+
767+
// no need to actually check the result here -- we were just testing that no hang/crash occurred
768+
// QVERIFY( imageCheck( "label_rotate_hide_partial", img, 20 ) );
769+
}
770+
699771
QGSTEST_MAIN( TestQgsLabelingEngine )
700772
#include "testqgslabelingengine.moc"

0 commit comments

Comments
 (0)