void TestQgsProject::testLayerFlags() { QString dataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt QString layerPath = dataDir + "/points.shp"; QgsVectorLayer *layer1 = new QgsVectorLayer( layerPath, QStringLiteral( "points 1" ), QStringLiteral( "ogr" ) ); QgsVectorLayer *layer2 = new QgsVectorLayer( layerPath, QStringLiteral( "points 2" ), QStringLiteral( "ogr" ) ); QgsProject prj; prj.addMapLayer( layer1 ); prj.addMapLayer( layer2 ); layer2->setFlags( layer2->flags() & ~QgsMapLayer::Removable ); QString layer2id = layer2->id(); QTemporaryFile f; QVERIFY( f.open() ); f.close(); prj.setFileName( f.fileName() ); prj.write(); // test reading required layers back QgsProject prj2; prj2.setFileName( f.fileName() ); QVERIFY( prj2.read() ); QgsMapLayer *layer = prj.mapLayer( layer2id ); QVERIFY( layer ); QVERIFY( !layer->flags().testFlag( QgsMapLayer::Removable ) ); }
void TestQgsProject::testLocalFiles() { QTemporaryFile f; QVERIFY( f.open() ); f.close(); QgsProject prj; QFileInfo info( f.fileName() ); prj.setFileName( f.fileName() ); prj.write(); QString shpPath = info.dir().path() + '/' + info.baseName() + ".shp"; QString layerPath = "file://" + shpPath; QFile f2( shpPath ); QVERIFY( f2.open( QFile::ReadWrite ) ); f2.close(); QgsPathResolver resolver( f.fileName( ) ); QCOMPARE( resolver.writePath( layerPath ), QString( "./" + info.baseName() + ".shp" ) ) ; }
void TestQgsProject::testPathResolverSvg() { QString dataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt QString layerPath = dataDir + "/points.shp"; QVERIFY( QgsSymbolLayerUtils::svgSymbolNameToPath( QString(), QgsPathResolver() ).isEmpty() ); QVERIFY( QgsSymbolLayerUtils::svgSymbolPathToName( QString(), QgsPathResolver() ).isEmpty() ); // build a project with 3 layers, each having a simple renderer with SVG marker // - existing SVG file in project dir // - existing SVG file in QGIS dir // - non-exsiting SVG file QTemporaryDir dir; QVERIFY( dir.isValid() ); // on mac the returned path was not canonical and the resolver failed to convert paths properly QString dirPath = QFileInfo( dir.path() ).canonicalFilePath(); QString projectFilename = dirPath + "/project.qgs"; QString ourSvgPath = dirPath + "/valid.svg"; QString invalidSvgPath = dirPath + "/invalid.svg"; QFile svgFile( ourSvgPath ); QVERIFY( svgFile.open( QIODevice::WriteOnly ) ); svgFile.write( "<svg/>" ); // not a proper SVG, but good enough for this case svgFile.close(); QVERIFY( QFileInfo::exists( ourSvgPath ) ); // should exist now QString librarySvgPath = QgsSymbolLayerUtils::svgSymbolNameToPath( QStringLiteral( "transport/transport_airport.svg" ), QgsPathResolver() ); QCOMPARE( QgsSymbolLayerUtils::svgSymbolPathToName( librarySvgPath, QgsPathResolver() ), QStringLiteral( "transport/transport_airport.svg" ) ); QgsVectorLayer *layer1 = new QgsVectorLayer( layerPath, QStringLiteral( "points 1" ), QStringLiteral( "ogr" ) ); _useRendererWithSvgSymbol( layer1, ourSvgPath ); QgsVectorLayer *layer2 = new QgsVectorLayer( layerPath, QStringLiteral( "points 2" ), QStringLiteral( "ogr" ) ); _useRendererWithSvgSymbol( layer2, invalidSvgPath ); QgsVectorLayer *layer3 = new QgsVectorLayer( layerPath, QStringLiteral( "points 3" ), QStringLiteral( "ogr" ) ); _useRendererWithSvgSymbol( layer3, librarySvgPath ); QVERIFY( layer1->isValid() ); QgsProject project; project.addMapLayers( QList<QgsMapLayer *>() << layer1 << layer2 << layer3 ); project.write( projectFilename ); // make sure the path resolver works with relative paths (enabled by default) QCOMPARE( project.pathResolver().readPath( "./a.txt" ), dirPath + "/a.txt" ); QCOMPARE( project.pathResolver().writePath( dirPath + "/a.txt" ), QString( "./a.txt" ) ); // check that the saved paths are relative // key = layer name, value = svg path QHash<QString, QString> projectFileSvgPaths = _parseSvgPathsForLayers( projectFilename ); QCOMPARE( projectFileSvgPaths.count(), 3 ); QCOMPARE( projectFileSvgPaths["points 1"], QString( "./valid.svg" ) ); // relative path to project QCOMPARE( projectFileSvgPaths["points 2"], invalidSvgPath ); // full path to non-existent file (not sure why - but that's how it works now) QCOMPARE( projectFileSvgPaths["points 3"], QString( "transport/transport_airport.svg" ) ); // relative path to library // load project again, check that the paths are absolute QgsProject projectLoaded; projectLoaded.read( projectFilename ); QString svg1 = _getLayerSvgMarkerPath( projectLoaded, QStringLiteral( "points 1" ) ); QString svg2 = _getLayerSvgMarkerPath( projectLoaded, QStringLiteral( "points 2" ) ); QString svg3 = _getLayerSvgMarkerPath( projectLoaded, QStringLiteral( "points 3" ) ); QCOMPARE( svg1, ourSvgPath ); QCOMPARE( svg2, invalidSvgPath ); QCOMPARE( svg3, librarySvgPath ); // // now let's use these layers in embedded in another project... // QList<QDomNode> brokenNodes; QgsProject projectMaster; QVERIFY( projectMaster.createEmbeddedLayer( layer1->id(), projectFilename, brokenNodes ) ); QVERIFY( projectMaster.createEmbeddedLayer( layer2->id(), projectFilename, brokenNodes ) ); QVERIFY( projectMaster.createEmbeddedLayer( layer3->id(), projectFilename, brokenNodes ) ); QString svg1x = _getLayerSvgMarkerPath( projectMaster, QStringLiteral( "points 1" ) ); QString svg2x = _getLayerSvgMarkerPath( projectLoaded, QStringLiteral( "points 2" ) ); QString svg3x = _getLayerSvgMarkerPath( projectLoaded, QStringLiteral( "points 3" ) ); QCOMPARE( svg1x, ourSvgPath ); QCOMPARE( svg2x, invalidSvgPath ); QCOMPARE( svg3x, librarySvgPath ); }