forked from calref/cboe
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtalk_read.cpp
155 lines (147 loc) · 6.27 KB
/
talk_read.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//
// talk_read.cpp
// BoE
//
// Created by Celtic Minstrel on 15-08-27.
//
//
#include <fstream>
#include "ticpp.h"
#include "catch.hpp"
#include "dialog.hpp"
#include "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!\"");
}
}