]> git.tdb.fi Git - libs/datafile.git/blobdiff - tests/parser.cpp
Add unit tests
[libs/datafile.git] / tests / parser.cpp
diff --git a/tests/parser.cpp b/tests/parser.cpp
new file mode 100644 (file)
index 0000000..32fc6a4
--- /dev/null
@@ -0,0 +1,141 @@
+#include <msp/datafile/dataerror.h>
+#include <msp/datafile/parser.h>
+#include <msp/datafile/statement.h>
+#include <msp/io/memory.h>
+#include <msp/test/test.h>
+
+using namespace Msp;
+
+class ParserTests: public Test::RegisteredTest<ParserTests>
+{
+public:
+       ParserTests();
+
+       static const char *get_name() { return "Parser"; }
+
+private:
+       void keyword_only();
+       void arguments();
+       void substatements();
+       void empty();
+       void unterminated_comment();
+       void missing_semicolon();
+       void bad_string();
+       void bad_float();
+};
+
+ParserTests::ParserTests()
+{
+       add(&ParserTests::keyword_only, "Keyword only");
+       add(&ParserTests::arguments, "Arguments");
+       add(&ParserTests::substatements, "Substatements");
+       add(&ParserTests::empty, "Empty input");
+       add(&ParserTests::unterminated_comment, "Unterminated comment").expect_throw<DataFile::data_error>();
+       add(&ParserTests::missing_semicolon, "Missing semicolon").expect_throw<DataFile::data_error>();
+       add(&ParserTests::bad_string, "Bad string").expect_throw<DataFile::data_error>();
+       add(&ParserTests::bad_float, "Bad float").expect_throw<DataFile::data_error>();
+}
+
+void ParserTests::keyword_only()
+{
+       static const char input[] =
+               "foo; bar;\n"
+               "quux;\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       DataFile::Statement st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "foo");
+       st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "bar");
+       st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "quux");
+}
+
+void ParserTests::arguments()
+{
+       static const char input[] =
+               "foo 1 true;\n"
+               "bar 3.45;\n"
+               "quux a \"s\";\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       DataFile::Statement st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "foo");
+       EXPECT_EQUAL(st.args.size(), 2);
+       EXPECT_EQUAL(st.args[0].get_signature(), DataFile::IntType::signature);
+       EXPECT_EQUAL(st.args[1].get_signature(), DataFile::BoolType::signature);
+       st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "bar");
+       EXPECT_EQUAL(st.args.size(), 1);
+       EXPECT_EQUAL(st.args[0].get_signature(), DataFile::FloatType::signature);
+       st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "quux");
+       EXPECT_EQUAL(st.args.size(), 2);
+       EXPECT_EQUAL(st.args[0].get_signature(), DataFile::SymbolType::signature);
+       EXPECT_EQUAL(st.args[1].get_signature(), DataFile::StringType::signature);
+}
+
+void ParserTests::substatements()
+{
+       static const char input[] =
+               "top { sub; };\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       DataFile::Statement st = parser.parse();
+       EXPECT_EQUAL(st.keyword, "top");
+       EXPECT_EQUAL(st.sub.size(), 1);
+       EXPECT_EQUAL(st.sub.front().keyword, "sub");
+}
+
+void ParserTests::empty()
+{
+       static const char input[] = { 0 };
+
+       IO::Memory mem(input, 0U);
+       DataFile::Parser parser(mem, "-");
+       DataFile::Statement st = parser.parse();
+       EXPECT(!st.valid);
+}
+
+void ParserTests::unterminated_comment()
+{
+       static const char input[] =
+               " /* comment\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       parser.parse();
+}
+
+void ParserTests::missing_semicolon()
+{
+       static const char input[] =
+               "foo { }\nbar;\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       parser.parse();
+}
+
+void ParserTests::bad_string()
+{
+       static const char input[] =
+               "foo \"quu\"x;\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       parser.parse();
+}
+
+void ParserTests::bad_float()
+{
+       static const char input[] =
+               "foo 1.234.5;\n";
+
+       IO::Memory mem(input, sizeof(input)-1);
+       DataFile::Parser parser(mem, "-");
+       parser.parse();
+}