diff --git a/test/files/terrain/bad_editor.xml b/test/files/terrain/bad_editor.xml
new file mode 100644
index 00000000..e4497cb4
--- /dev/null
+++ b/test/files/terrain/bad_editor.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/files/terrain/full.xml b/test/files/terrain/full.xml
new file mode 100644
index 00000000..e09eb863
--- /dev/null
+++ b/test/files/terrain/full.xml
@@ -0,0 +1,33 @@
+
+
+ Test Terrain
+ 0
+
+ move
+ 10
+ true
+ true
+ false
+ true
+ 3
+ splash
+ 2
+ none
+ 1
+ 0
+
+ dmg
+ 4
+ 6
+ 3
+
+
+ u
+
+
+
+
diff --git a/test/files/terrain/object_bad.xml b/test/files/terrain/object_bad.xml
new file mode 100644
index 00000000..432f74b2
--- /dev/null
+++ b/test/files/terrain/object_bad.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/files/terrain/object_missing.xml b/test/files/terrain/object_missing.xml
new file mode 100644
index 00000000..af85fe3d
--- /dev/null
+++ b/test/files/terrain/object_missing.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ter_read.cpp b/test/ter_read.cpp
index 21803e9d..49ad2f90 100644
--- a/test/ter_read.cpp
+++ b/test/ter_read.cpp
@@ -89,6 +89,21 @@ TEST_CASE("Loading a terrain type definition") {
doc = xmlDocFromStream(fin, "bad_abil_tag.xml");
REQUIRE_THROWS_AS(readTerrainFromXml(move(doc), scen), xBadNode);
}
+ SECTION("With an incomplete object definition") {
+ fin.open("files/terrain/object_missing.xml");
+ doc = xmlDocFromStream(fin, "object_missing.xml");
+ REQUIRE_THROWS_AS(readTerrainFromXml(move(doc), scen), xMissingElem);
+ }
+ SECTION("With an invalid object definition") {
+ fin.open("files/terrain/object_bad.xml");
+ doc = xmlDocFromStream(fin, "object_bad.xml");
+ REQUIRE_THROWS_AS(readTerrainFromXml(move(doc), scen), xBadNode);
+ }
+ SECTION("With an invalid editor subtag") {
+ fin.open("files/terrain/bad_editor.xml");
+ doc = xmlDocFromStream(fin, "bad_editor.xml");
+ REQUIRE_THROWS_AS(readTerrainFromXml(move(doc), scen), xBadNode);
+ }
SECTION("With the minimal required data") {
fin.open("files/terrain/minimal.xml");
doc = xmlDocFromStream(fin, "minimal.xml");
@@ -99,7 +114,35 @@ TEST_CASE("Loading a terrain type definition") {
CHECK(scen.ter_types[0].map_pic == 0);
CHECK(scen.ter_types[0].combat_arena == 0);
CHECK(scen.ter_types[0].blockage == eTerObstruct::BLOCK_MOVE);
+ CHECK(scen.ter_types[0].ground_type == 0);
CHECK(scen.ter_types[0].trim_type == eTrimType::NONE);
CHECK(scen.ter_types[0].special == eTerSpec::NONE);
+ CHECK(scen.ter_types[0].step_sound == eStepSnd::STEP);
+ CHECK_FALSE(scen.ter_types[0].fly_over);
+ CHECK_FALSE(scen.ter_types[0].boat_over);
+ CHECK_FALSE(scen.ter_types[0].block_horse);
+ CHECK_FALSE(scen.ter_types[0].is_archetype);
+ }
+ SECTION("With all possible data") {
+ fin.open("files/terrain/full.xml");
+ doc = xmlDocFromStream(fin, "full.xml");
+ REQUIRE_NOTHROW(readTerrainFromXml(move(doc), scen));
+ CHECK(scen.ter_types[0].special == eTerSpec::DAMAGING);
+ CHECK(scen.ter_types[0].flag1 == 4);
+ CHECK(scen.ter_types[0].flag2 == 6);
+ CHECK(scen.ter_types[0].flag3 == 3);
+ CHECK(scen.ter_types[0].trans_to_what == 10);
+ CHECK(scen.ter_types[0].fly_over);
+ CHECK(scen.ter_types[0].boat_over);
+ CHECK(scen.ter_types[0].block_horse);
+ CHECK(scen.ter_types[0].is_archetype);
+ CHECK(scen.ter_types[0].light_radius == 3);
+ CHECK(scen.ter_types[0].step_sound == eStepSnd::SPLASH);
+ CHECK(scen.ter_types[0].ground_type == 2);
+ CHECK(scen.ter_types[0].trim_ter == 1);
+ CHECK(scen.ter_types[0].shortcut_key == 'u');
+ CHECK(scen.ter_types[0].obj_num == 1);
+ CHECK(scen.ter_types[0].obj_pos == loc(0,0));
+ CHECK(scen.ter_types[0].obj_size == loc(2,1));
}
}
diff --git a/test/ter_write.cpp b/test/ter_write.cpp
index 49cfb7bb..73243332 100644
--- a/test/ter_write.cpp
+++ b/test/ter_write.cpp
@@ -59,4 +59,40 @@ TEST_CASE("Saving terrain types") {
CHECK(scen.ter_types[0].flag1 == -1);
CHECK(scen.ter_types[0].step_sound == eStepSnd::STEP);
}
+ SECTION("With all information") {
+ scen.ter_types[0].flag1 = 1;
+ scen.ter_types[0].flag2 = 2;
+ scen.ter_types[0].flag3 = 3;
+ scen.ter_types[0].trans_to_what = 100;
+ scen.ter_types[0].fly_over = true;
+ scen.ter_types[0].boat_over = true;
+ scen.ter_types[0].block_horse = true;
+ scen.ter_types[0].is_archetype = true;
+ scen.ter_types[0].light_radius = 3;
+ scen.ter_types[0].step_sound = eStepSnd::SPLASH;
+ scen.ter_types[0].ground_type = 2;
+ scen.ter_types[0].trim_ter = 1;
+ scen.ter_types[0].shortcut_key = 'u';
+ scen.ter_types[0].obj_num = 1;
+ scen.ter_types[0].obj_pos = loc(0,0);
+ scen.ter_types[0].obj_size = loc(2,1);
+ in_and_out("basic", scen);
+ REQUIRE(scen.ter_types.size() == 1);
+ CHECK(scen.ter_types[0].flag1 == 1);
+ CHECK(scen.ter_types[0].flag2 == 2);
+ CHECK(scen.ter_types[0].flag3 == 3);
+ CHECK(scen.ter_types[0].trans_to_what == 100);
+ CHECK(scen.ter_types[0].fly_over);
+ CHECK(scen.ter_types[0].boat_over);
+ CHECK(scen.ter_types[0].block_horse);
+ CHECK(scen.ter_types[0].is_archetype);
+ CHECK(scen.ter_types[0].light_radius == 3);
+ CHECK(scen.ter_types[0].step_sound == eStepSnd::SPLASH);
+ CHECK(scen.ter_types[0].ground_type == 2);
+ CHECK(scen.ter_types[0].trim_ter == 1);
+ CHECK(scen.ter_types[0].shortcut_key == 'u');
+ CHECK(scen.ter_types[0].obj_num == 1);
+ CHECK(scen.ter_types[0].obj_pos == loc(0,0));
+ CHECK(scen.ter_types[0].obj_size == loc(2,1));
+ }
}