- For monster attacks, 'd4' now means '1d4' instead of '0d4', and simple numbers without a 'd' are not accepted - Pop string path after pushing it in the shop test cases
155 lines
5.9 KiB
C++
155 lines
5.9 KiB
C++
//
|
|
// monst_read.cpp
|
|
// BoE
|
|
//
|
|
// Created by Celtic Minstrel on 15-07-29.
|
|
//
|
|
//
|
|
|
|
#include <fstream>
|
|
#include "ticpp.h"
|
|
#include "catch.hpp"
|
|
#include "dialog.hpp"
|
|
#include "scenario.hpp"
|
|
|
|
using namespace std;
|
|
using namespace ticpp;
|
|
|
|
extern Document xmlDocFromStream(istream& stream, string name);
|
|
extern void readMonstersFromXml(Document&& data, cScenario& scenario);
|
|
|
|
TEST_CASE("Loading a monster type definition") {
|
|
ifstream fin;
|
|
cScenario scen;
|
|
Document doc;
|
|
fin.exceptions(ios::badbit);
|
|
|
|
SECTION("When the root tag is wrong") {
|
|
fin.open("files/bad_root.xml");
|
|
doc = xmlDocFromStream(fin, "bad_root.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When the version attribute is missing") {
|
|
fin.open("files/monsters/no_version.xml");
|
|
doc = xmlDocFromStream(fin, "no_version.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xMissingAttr);
|
|
}
|
|
SECTION("When the root tag has a bad attribute") {
|
|
fin.open("files/monsters/bad_root_attr.xml");
|
|
doc = xmlDocFromStream(fin, "bad_root_attr.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadAttr);
|
|
}
|
|
SECTION("When an unknown toplevel tag appears") {
|
|
fin.open("files/monsters/bad_toplevel.xml");
|
|
doc = xmlDocFromStream(fin, "bad_toplevel.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When the ID attribute is missing") {
|
|
fin.open("files/monsters/missing_id.xml");
|
|
doc = xmlDocFromStream(fin, "missing_id.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), Exception);
|
|
}
|
|
SECTION("When the ID attribute is zero") {
|
|
fin.open("files/monsters/bad_id.xml");
|
|
doc = xmlDocFromStream(fin, "missing_id.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadVal);
|
|
}
|
|
SECTION("When a required subtag is missing") {
|
|
fin.open("files/monsters/missing_req.xml");
|
|
doc = xmlDocFromStream(fin, "missing_req.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xMissingElem);
|
|
}
|
|
SECTION("When a bad subtag is found") {
|
|
fin.open("files/monsters/bad_tag.xml");
|
|
doc = xmlDocFromStream(fin, "bad_tag.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When an attack has a bad subtag") {
|
|
fin.open("files/monsters/bad_attack_tag.xml");
|
|
doc = xmlDocFromStream(fin, "bad_attack_tag.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When an attack has a bad attribute") {
|
|
fin.open("files/monsters/bad_attack_attr.xml");
|
|
doc = xmlDocFromStream(fin, "bad_attack_attr.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadAttr);
|
|
}
|
|
SECTION("When an attack has a bad type") {
|
|
fin.open("files/monsters/bad_attack_type.xml");
|
|
doc = xmlDocFromStream(fin, "bad_attack_type.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), Exception);
|
|
}
|
|
SECTION("When an attack damage is invalid") {
|
|
fin.open("files/monsters/bad_attack.xml");
|
|
doc = xmlDocFromStream(fin, "bad_attack.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadVal);
|
|
}
|
|
SECTION("When an attack damage is missing 'd'") {
|
|
fin.open("files/monsters/bad_attack2.xml");
|
|
doc = xmlDocFromStream(fin, "bad_attack2.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadVal);
|
|
}
|
|
SECTION("When an attack is missing the type") {
|
|
fin.open("files/monsters/missing_attack_type.xml");
|
|
doc = xmlDocFromStream(fin, "missing_attack_type.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xMissingAttr);
|
|
}
|
|
SECTION("When the picture is missing the size attributes") {
|
|
fin.open("files/monsters/bad_pic.xml");
|
|
doc = xmlDocFromStream(fin, "bad_pic.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xMissingAttr);
|
|
}
|
|
SECTION("When the picture has a bad attribute") {
|
|
fin.open("files/monsters/bad_pic2.xml");
|
|
doc = xmlDocFromStream(fin, "bad_pic2.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadAttr);
|
|
}
|
|
SECTION("When there is a bad immunity") {
|
|
fin.open("files/monsters/bad_immune.xml");
|
|
doc = xmlDocFromStream(fin, "bad_immune.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When the loot has a bad subtag") {
|
|
fin.open("files/monsters/bad_loot.xml");
|
|
doc = xmlDocFromStream(fin, "bad_loot.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xBadNode);
|
|
}
|
|
SECTION("When the loot has a missing subtag") {
|
|
fin.open("files/monsters/bad_loot2.xml");
|
|
doc = xmlDocFromStream(fin, "bad_loot2.xml");
|
|
REQUIRE_THROWS_AS(readMonstersFromXml(move(doc), scen), xMissingElem);
|
|
}
|
|
SECTION("With the minimal required data") {
|
|
fin.open("files/monsters/minimal.xml");
|
|
doc = xmlDocFromStream(fin, "minimal.xml");
|
|
REQUIRE_NOTHROW(readMonstersFromXml(move(doc), scen));
|
|
REQUIRE(scen.scen_monsters.size() >= 2);
|
|
CHECK(scen.scen_monsters[1].m_name == "Test Monster");
|
|
CHECK(scen.scen_monsters[1].level == 1);
|
|
CHECK(scen.scen_monsters[1].armor == 0);
|
|
CHECK(scen.scen_monsters[1].skill == 2);
|
|
CHECK(scen.scen_monsters[1].m_health == 10);
|
|
CHECK(scen.scen_monsters[1].speed == 4);
|
|
CHECK(scen.scen_monsters[1].m_type == eRace::HUMANOID);
|
|
CHECK(scen.scen_monsters[1].picture_num == 5);
|
|
CHECK(scen.scen_monsters[1].x_width == 1);
|
|
CHECK(scen.scen_monsters[1].y_width == 1);
|
|
CHECK(scen.scen_monsters[1].default_attitude == eAttitude::HOSTILE_A);
|
|
}
|
|
SECTION("With some attacks") {
|
|
fin.open("files/monsters/attacks.xml");
|
|
doc = xmlDocFromStream(fin, "attacks.xml");
|
|
REQUIRE_NOTHROW(readMonstersFromXml(move(doc), scen));
|
|
REQUIRE(scen.scen_monsters.size() >= 2);
|
|
CHECK(scen.scen_monsters[1].a[0].type == eMonstMelee::SWING);
|
|
CHECK(scen.scen_monsters[1].a[0].dice == 1);
|
|
CHECK(scen.scen_monsters[1].a[0].sides == 10);
|
|
CHECK(scen.scen_monsters[1].a[1].type == eMonstMelee::PUNCH);
|
|
CHECK(scen.scen_monsters[1].a[1].dice == 2);
|
|
CHECK(scen.scen_monsters[1].a[1].sides == 4);
|
|
CHECK(scen.scen_monsters[1].a[2].type == eMonstMelee::BURN);
|
|
CHECK(scen.scen_monsters[1].a[2].dice == 1);
|
|
CHECK(scen.scen_monsters[1].a[2].sides == 8);
|
|
}
|
|
}
|