summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-05 02:50:55 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-05 02:50:55 +0100
commit62d336437d1e92ff8356c39efe22dd4a59de71ee (patch)
treee4a0c533e3711faa05ab8eb3c8247301c43ac385 /test
parent68ae3c4fd9db8baef4fea99d91766af5bc210506 (diff)
Added initial skeleton of the PlainFormatStreamReader class, providing the most basic functionality needed to read data from a Ousia plain text file.
Diffstat (limited to 'test')
-rw-r--r--test/plugins/plain/PlainFormatStreamReaderTest.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/test/plugins/plain/PlainFormatStreamReaderTest.cpp b/test/plugins/plain/PlainFormatStreamReaderTest.cpp
new file mode 100644
index 0000000..c44d575
--- /dev/null
+++ b/test/plugins/plain/PlainFormatStreamReaderTest.cpp
@@ -0,0 +1,239 @@
+/*
+ Ousía
+ Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <gtest/gtest.h>
+
+#include <iostream>
+
+#include <core/common/CharReader.hpp>
+#include <core/frontend/TerminalLogger.hpp>
+#include <plugins/plain/PlainFormatStreamReader.hpp>
+
+namespace ousia {
+
+static TerminalLogger logger(std::cerr, true);
+
+TEST(PlainFormatStreamReader, empty)
+{
+ const char *testString = "";
+ CharReader charReader(testString);
+
+ PlainFormatStreamReader reader(charReader, logger);
+
+ ASSERT_EQ(PlainFormatStreamReader::State::END, reader.parse());
+}
+
+TEST(PlainFormatStreamReader, oneCharacter)
+{
+ const char *testString = "a";
+ CharReader charReader(testString);
+
+ PlainFormatStreamReader reader(charReader, logger);
+
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("a", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(0U, loc.getStart());
+ ASSERT_EQ(1U, loc.getEnd());
+}
+
+TEST(PlainFormatStreamReader, whitespaceElimination)
+{
+ const char *testString = " hello \t world ";
+ // 0123456 78901234
+ // 0 1
+ CharReader charReader(testString);
+
+ PlainFormatStreamReader reader(charReader, logger);
+
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("hello world", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(1U, loc.getStart());
+ ASSERT_EQ(14U, loc.getEnd());
+}
+
+TEST(PlainFormatStreamReader, whitespaceEliminationWithLinebreak)
+{
+ const char *testString = " hello \n world ";
+ // 0123456 78901234
+ // 0 1
+ CharReader charReader(testString);
+
+ PlainFormatStreamReader reader(charReader, logger);
+
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ {
+ ASSERT_EQ("hello", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(1U, loc.getStart());
+ ASSERT_EQ(6U, loc.getEnd());
+ }
+ ASSERT_EQ(PlainFormatStreamReader::State::LINEBREAK, reader.parse());
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ {
+ ASSERT_EQ("world", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(9U, loc.getStart());
+ ASSERT_EQ(14U, loc.getEnd());
+ }
+}
+
+TEST(PlainFormatStreamReader, escapeWhitespace)
+{
+ const char *testString = " hello \n\\ world ";
+ // 0123456 7 89012345
+ // 0 1
+ CharReader charReader(testString);
+
+ PlainFormatStreamReader reader(charReader, logger);
+
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ {
+ ASSERT_EQ("hello", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(1U, loc.getStart());
+ ASSERT_EQ(6U, loc.getEnd());
+ }
+ ASSERT_EQ(PlainFormatStreamReader::State::LINEBREAK, reader.parse());
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ {
+ ASSERT_EQ(" world", reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(8U, loc.getStart());
+ ASSERT_EQ(15U, loc.getEnd());
+ }
+}
+
+static void testEscapeSpecialCharacter(const std::string &c)
+{
+ CharReader charReader(std::string("\\") + c);
+ PlainFormatStreamReader reader(charReader, logger);
+ EXPECT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ EXPECT_EQ(c, reader.getData().asString());
+
+ SourceLocation loc = reader.getData().getLocation();
+ EXPECT_EQ(0U, loc.getStart());
+ EXPECT_EQ(1U + c.size(), loc.getEnd());
+}
+
+TEST(PlainFormatStreamReader, escapeSpecialCharacters)
+{
+ testEscapeSpecialCharacter("\\");
+ testEscapeSpecialCharacter("{");
+ testEscapeSpecialCharacter("}");
+ testEscapeSpecialCharacter("<");
+ testEscapeSpecialCharacter(">");
+}
+
+TEST(PlainFormatStreamReader, simpleSingleLineComment)
+{
+ const char *testString = "% This is a single line comment";
+ CharReader charReader(testString);
+ PlainFormatStreamReader reader(charReader, logger);
+ ASSERT_EQ(PlainFormatStreamReader::State::END, reader.parse());
+}
+
+TEST(PlainFormatStreamReader, singleLineComment)
+{
+ const char *testString = "a% This is a single line comment\nb";
+ // 01234567890123456789012345678901 23
+ // 0 1 2 3
+ CharReader charReader(testString);
+ PlainFormatStreamReader reader(charReader, logger);
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("a", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(0U, loc.getStart());
+ ASSERT_EQ(1U, loc.getEnd());
+ }
+
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("b", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(33U, loc.getStart());
+ ASSERT_EQ(34U, loc.getEnd());
+ }
+
+ ASSERT_EQ(PlainFormatStreamReader::State::END, reader.parse());
+}
+
+TEST(PlainFormatStreamReader, multilineComment)
+{
+ const char *testString = "a%{ This is a\n\n multiline line comment}%b";
+ // 0123456789012 3 456789012345678901234567890
+ // 0 1 2 3 4
+ CharReader charReader(testString);
+ PlainFormatStreamReader reader(charReader, logger);
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("a", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(0U, loc.getStart());
+ ASSERT_EQ(1U, loc.getEnd());
+ }
+
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("b", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(40U, loc.getStart());
+ ASSERT_EQ(41U, loc.getEnd());
+ }
+
+ ASSERT_EQ(PlainFormatStreamReader::State::END, reader.parse());
+}
+
+TEST(PlainFormatStreamReader, nestedMultilineComment)
+{
+ const char *testString = "a%{%{Another\n\n}%multiline line comment}%b";
+ // 0123456789012 3 456789012345678901234567890
+ // 0 1 2 3 4
+ CharReader charReader(testString);
+ PlainFormatStreamReader reader(charReader, logger);
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("a", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(0U, loc.getStart());
+ ASSERT_EQ(1U, loc.getEnd());
+ }
+
+ {
+ ASSERT_EQ(PlainFormatStreamReader::State::DATA, reader.parse());
+ ASSERT_EQ("b", reader.getData().asString());
+ SourceLocation loc = reader.getData().getLocation();
+ ASSERT_EQ(40U, loc.getStart());
+ ASSERT_EQ(41U, loc.getEnd());
+ }
+
+ ASSERT_EQ(PlainFormatStreamReader::State::END, reader.parse());
+}
+
+
+
+}
+