Files
oboe/test/talk_read.cpp

156 lines
6.3 KiB
C++

//
// talk_read.cpp
// BoE
//
// Created by Celtic Minstrel on 15-08-27.
//
//
#include <fstream>
#include "ticpp.h"
#include "catch.hpp"
#include "dialogxml/dialogs/dialog.hpp"
#include "scenario/talking.hpp"
using namespace std;
using namespace ticpp;
extern Document xmlDocFromStream(istream& stream, string name);
extern void readDialogueFromXml(Document&& data, cSpeech& talk, int town_num);
TEST_CASE("Loading a town dialogue definition") {
ifstream fin;
cSpeech talk;
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(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When the version attribute is missing") {
fin.open("files/talk/no_version.xml");
doc = xmlDocFromStream(fin, "no_version.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xMissingAttr);
}
SECTION("When the root tag has a bad attribute") {
fin.open("files/talk/bad_root_attr.xml");
doc = xmlDocFromStream(fin, "bad_root_attr.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadAttr);
}
SECTION("When an invalid toplevel node is found") {
fin.open("files/talk/bad_node.xml");
doc = xmlDocFromStream(fin, "bad_node.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When the root tag is empty") {
fin.open("files/talk/empty.xml");
doc = xmlDocFromStream(fin, "empty.xml");
REQUIRE_NOTHROW(readDialogueFromXml(move(doc), talk, 0));
}
SECTION("When a personality is missing an ID") {
fin.open("files/talk/who_missing_id.xml");
doc = xmlDocFromStream(fin, "who_missing_id.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), Exception);
}
SECTION("When a personality has an out-of-bounds ID") {
fin.open("files/talk/who_bad_id.xml");
doc = xmlDocFromStream(fin, "who_bad_id.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadVal);
}
SECTION("When a personality is missing a required subtag") {
fin.open("files/talk/who_missing_req.xml");
doc = xmlDocFromStream(fin, "who_missing_req.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xMissingElem);
}
SECTION("When a personality has an invalid subtag") {
fin.open("files/talk/who_bad_node.xml");
doc = xmlDocFromStream(fin, "who_bad_node.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When node has an invalid subtag") {
fin.open("files/talk/node_bad_node.xml");
doc = xmlDocFromStream(fin, "node_bad_node.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When a node is missing the for attribute") {
fin.open("files/talk/node_missing_for.xml");
doc = xmlDocFromStream(fin, "node_missing_for.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), Exception);
}
SECTION("When a node is missing the <key> subtag") {
fin.open("files/talk/node_missing_key.xml");
doc = xmlDocFromStream(fin, "node_missing_key.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xMissingElem);
}
SECTION("When a node is missing the <type> subtag") {
fin.open("files/talk/node_missing_type.xml");
doc = xmlDocFromStream(fin, "node_missing_type.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xMissingElem);
}
SECTION("When a node is missing the <text> subtag") {
fin.open("files/talk/node_missing_string.xml");
doc = xmlDocFromStream(fin, "node_missing_string.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xMissingElem);
}
SECTION("When a node has too many keys") {
fin.open("files/talk/node_too_many_keys.xml");
doc = xmlDocFromStream(fin, "node_too_many_keys.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When a node has too many params") {
fin.open("files/talk/node_too_many_params.xml");
doc = xmlDocFromStream(fin, "node_too_many_params.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("When a node has too many strings") {
fin.open("files/talk/node_too_many_strings.xml");
doc = xmlDocFromStream(fin, "node_too_many_strings.xml");
REQUIRE_THROWS_AS(readDialogueFromXml(move(doc), talk, 0), xBadNode);
}
SECTION("With the minimal required information for a personality") {
fin.open("files/talk/minimal.xml");
doc = xmlDocFromStream(fin, "minimal.xml");
REQUIRE_NOTHROW(readDialogueFromXml(move(doc), talk, 0));
CHECK(talk.people[0].title == "Billy Kumquat");
CHECK(talk.people[0].look == "You see a small boy juggling fruit.");
CHECK(talk.people[0].name == "\"I'm Billy Kumquat!\"");
CHECK(talk.people[0].job == "\"I juggle!\"");
}
SECTION("A full personality with several nodes") {
fin.open("files/talk/full.xml");
doc = xmlDocFromStream(fin, "full.xml");
REQUIRE_NOTHROW(readDialogueFromXml(move(doc), talk, 0));
CHECK(talk.people[0].dunno == "\"No clue!\"");
REQUIRE(talk.talk_nodes.size() == 4);
CHECK(talk.talk_nodes[0].personality == 0);
CHECK(string(talk.talk_nodes[0].link1, 4) == "jugg");
CHECK(talk.talk_nodes[0].type == eTalkNode::REGULAR);
CHECK(talk.talk_nodes[0].str1 == "\"It's fun!\"");
CHECK(talk.talk_nodes[1].personality == 0);
CHECK(string(talk.talk_nodes[1].link1, 4) == "info");
CHECK(talk.talk_nodes[1].type == eTalkNode::BUY_SDF);
CHECK(talk.talk_nodes[1].extras[0] == 1);
CHECK(talk.talk_nodes[1].extras[1] == 2);
CHECK(talk.talk_nodes[1].extras[2] == 3);
CHECK(talk.talk_nodes[1].str1 == "\"There's a treasure hidden in the old tree!\"");
CHECK(talk.talk_nodes[1].str2 == "\"For a gold piece I'll tell you something interesting!\"");
CHECK(talk.talk_nodes[2].personality == 0);
CHECK(string(talk.talk_nodes[2].link1, 4) == "purc");
CHECK(talk.talk_nodes[2].type == eTalkNode::SHOP);
CHECK(talk.talk_nodes[2].extras[0] == 0);
CHECK(talk.talk_nodes[2].extras[1] == 4);
CHECK(talk.talk_nodes[2].str1 == "Billy Kumquat's Oddest Fruit");
CHECK(talk.talk_nodes[3].personality == 0);
CHECK(string(talk.talk_nodes[3].link1, 4) == "kumq");
CHECK(talk.talk_nodes[3].type == eTalkNode::RECEIVE_QUEST);
CHECK(talk.talk_nodes[3].extras[0] == 5);
CHECK(talk.talk_nodes[3].str1 == "\"I'll reward you if you find me some bigger kumquats!\"");
CHECK(talk.talk_nodes[3].str2 == "\"Thanks for finding the bigger kumquats!\"");
}
}