From 08e5830f018e1ac91ef22debf8889cf8d9824681 Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 1 Oct 2022 08:37:30 +0200 Subject: [PATCH] #6107: Add an example layer hierarchy in mapx and map formats to test the restore code --- test/LayerManipulation.cpp | 48 +++++++++++ .../maps/layer_hierarchy_restore.darkradiant | 53 +++++++++++++ .../tdm/maps/layer_hierarchy_restore.map | 17 ++++ .../tdm/maps/layer_hierarchy_restore.mapx | 79 +++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 test/resources/tdm/maps/layer_hierarchy_restore.darkradiant create mode 100644 test/resources/tdm/maps/layer_hierarchy_restore.map create mode 100644 test/resources/tdm/maps/layer_hierarchy_restore.mapx diff --git a/test/LayerManipulation.cpp b/test/LayerManipulation.cpp index a9e1ac6ebe..aa235aff49 100644 --- a/test/LayerManipulation.cpp +++ b/test/LayerManipulation.cpp @@ -570,6 +570,54 @@ TEST_F(LayerTest, LayerHierarchyIsPersistedToMap) runLayerHierarchyPersistenceTest(tempPath.string()); } +TEST_F(LayerTest, LayerHierarchyIsRestoredFromMapx) +{ + // The .mapx file contains a hierarchy that should be restored + // without running into crashes (layer 3 is a child of layer 9) + auto mapFilePath = _context.getTestProjectPath() + "maps/layer_hierarchy_restore.mapx"; + + GlobalCommandSystem().executeCommand("OpenMap", mapFilePath); + + auto unsortedLayerIds = getAllLayerIds(); + auto layerIds = std::set(unsortedLayerIds.begin(), unsortedLayerIds.end()); + + for (int i = 0; i <= 9; ++i) + { + EXPECT_EQ(layerIds.count(0), 1) << "Layer with ID " << i << " not present"; + } + + auto& layerManager = GlobalMapModule().getRoot()->getLayerManager(); + EXPECT_EQ(layerManager.getParentLayer(0), -1) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(3), 9) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(4), 2) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(5), 3) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(9), 2) << "Hierarchy has not been restored"; +} + +TEST_F(LayerTest, LayerHierarchyIsRestoredFromMap) +{ + // The .darkradiant file contains a hierarchy that should be restored + // without running into crashes (layer 3 is a child of layer 9) + auto mapFilePath = _context.getTestProjectPath() + "maps/layer_hierarchy_restore.map"; + + GlobalCommandSystem().executeCommand("OpenMap", mapFilePath); + + auto unsortedLayerIds = getAllLayerIds(); + auto layerIds = std::set(unsortedLayerIds.begin(), unsortedLayerIds.end()); + + for (int i = 0; i <= 9; ++i) + { + EXPECT_EQ(layerIds.count(0), 1) << "Layer with ID " << i << " not present"; + } + + auto& layerManager = GlobalMapModule().getRoot()->getLayerManager(); + EXPECT_EQ(layerManager.getParentLayer(0), -1) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(3), 9) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(4), 2) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(5), 3) << "Hierarchy has not been restored"; + EXPECT_EQ(layerManager.getParentLayer(9), 2) << "Hierarchy has not been restored"; +} + TEST_F(LayerTest, CreateLayerMarksMapAsModified) { loadMap("general_purpose.mapx"); diff --git a/test/resources/tdm/maps/layer_hierarchy_restore.darkradiant b/test/resources/tdm/maps/layer_hierarchy_restore.darkradiant new file mode 100644 index 0000000000..d17ef79a0f --- /dev/null +++ b/test/resources/tdm/maps/layer_hierarchy_restore.darkradiant @@ -0,0 +1,53 @@ +DarkRadiant Map Information File Version 2 +{ + MapProperties + { + KeyValue { "EditTimeInSeconds" "34" } + KeyValue { "LastCameraAngle" "0 0 0" } + KeyValue { "LastCameraPosition" "0 0 30" } + } + MapEditTimings + { + TotalSecondsEdited { 34 } + } + Layers + { + Layer 0 { Default } + Layer 1 { box } + Layer 2 { BoardsandStuff } + Layer 3 { Tst } + Layer 4 { Test2 } + Layer 5 { Test3 } + Layer 6 { Test4 } + Layer 7 { Test6 } + Layer 8 { Test7 } + Layer 9 { Test8 } + } + LayerHierarchy + { + Layer 0 Parent { -1 } + Layer 1 Parent { -1 } + Layer 2 Parent { -1 } + Layer 3 Parent { 9 } + Layer 4 Parent { 2 } + Layer 5 Parent { 3 } + Layer 6 Parent { 3 } + Layer 7 Parent { 3 } + Layer 8 Parent { 4 } + Layer 9 Parent { 2 } + } + NodeToLayerMapping + { + Node { 0 } // entity (world) + Node { 0 } // brush (Brush) + } + SelectionSets + { + } + SelectionGroups + { + } + SelectionGroupNodeMapping + { + } +} diff --git a/test/resources/tdm/maps/layer_hierarchy_restore.map b/test/resources/tdm/maps/layer_hierarchy_restore.map new file mode 100644 index 0000000000..04ed46f0b9 --- /dev/null +++ b/test/resources/tdm/maps/layer_hierarchy_restore.map @@ -0,0 +1,17 @@ +Version 2 +// entity 0 +{ +"classname" "worldspawn" +// primitive 0 +{ +brushDef3 +{ +( 0 0 1 -64 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +( 0 1 0 -84 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +( 1 0 0 -177 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +( 0 0 -1 -64 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +( 0 -1 0 24 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +( -1 0 0 96 ) ( ( 0.03125 0 0 ) ( 0 0.03125 0 ) ) "_default" 0 0 0 +} +} +} diff --git a/test/resources/tdm/maps/layer_hierarchy_restore.mapx b/test/resources/tdm/maps/layer_hierarchy_restore.mapx new file mode 100644 index 0000000000..521b35ca61 --- /dev/null +++ b/test/resources/tdm/maps/layer_hierarchy_restore.mapx @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +