summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-24 13:23:55 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-24 13:23:55 +0100
commit99c6f5df144d0530fe43225d353dee881cfdf26a (patch)
treea9a7499dda7d643861c753855823ed0f71aa8021
parent67d36e699a2852ce471c4d1b8dab5992d6c01a98 (diff)
Moved Terminal and TerminalLogger to own classes in new frontent folder
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/core/common/Logger.cpp143
-rw-r--r--src/core/common/Logger.hpp61
-rw-r--r--src/core/frontend/Terminal.cpp (renamed from src/core/common/Terminal.cpp)0
-rw-r--r--src/core/frontend/Terminal.hpp (renamed from src/core/common/Terminal.hpp)0
-rw-r--r--src/core/frontend/TerminalLogger.cpp151
-rw-r--r--src/core/frontend/TerminalLogger.hpp79
-rw-r--r--src/core/resource/ResourceManager.cpp2
-rw-r--r--test/core/common/ArgumentTest.cpp3
-rw-r--r--test/core/common/LoggerTest.cpp81
-rw-r--r--test/core/common/VariantReaderTest.cpp1
-rw-r--r--test/core/frontend/TerminalLoggerTest.cpp109
-rw-r--r--test/core/model/DocumentTest.cpp2
-rw-r--r--test/core/model/DomainTest.cpp1
-rw-r--r--test/core/model/TypesystemTest.cpp1
-rw-r--r--test/plugins/css/CSSParserTest.cpp6
-rw-r--r--test/plugins/html/DemoOutputTest.cpp2
-rw-r--r--test/plugins/xml/XmlParserTest.cpp1
18 files changed, 372 insertions, 275 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ba997d..f3e89ac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -131,12 +131,13 @@ ADD_LIBRARY(ousia_core
src/core/common/Rtti
src/core/common/RttiBuilder
src/core/common/SourceContextReader
- src/core/common/Terminal
src/core/common/Utils
src/core/common/Variant
src/core/common/VariantConverter
src/core/common/VariantReader
src/core/common/VariantWriter
+ src/core/frontend/Terminal
+ src/core/frontend/TerminalLogger
src/core/managed/Events
src/core/managed/Managed
src/core/managed/Manager
@@ -227,6 +228,7 @@ IF(TEST)
test/core/common/VariantWriterTest
test/core/common/VariantTest
test/core/common/UtilsTest
+ test/core/frontend/TerminalLoggerTest
test/core/managed/ManagedContainerTest
test/core/managed/ManagedTest
test/core/managed/ManagerTest
diff --git a/src/core/common/Logger.cpp b/src/core/common/Logger.cpp
index aa61e6a..54156f2 100644
--- a/src/core/common/Logger.cpp
+++ b/src/core/common/Logger.cpp
@@ -20,8 +20,6 @@
#include <sstream>
#include "Logger.hpp"
-#include "Terminal.hpp"
-#include "Utils.hpp"
namespace ousia {
@@ -118,49 +116,49 @@ void LoggerFork::commit()
purge();
}
-/* Class ScopedLogger */
+/* Class GuardedLogger */
-ScopedLogger::ScopedLogger(Logger &parent, SourceLocation loc)
+GuardedLogger::GuardedLogger(Logger &parent, SourceLocation loc)
: parent(parent), depth(0)
{
pushDefaultLocation(loc);
}
-ScopedLogger::~ScopedLogger()
+GuardedLogger::~GuardedLogger()
{
while (depth > 0) {
popDefaultLocation();
}
}
-void ScopedLogger::processMessage(const Message &msg)
+void GuardedLogger::processMessage(const Message &msg)
{
parent.processMessage(msg);
}
-bool ScopedLogger::filterMessage(const Message &msg)
+bool GuardedLogger::filterMessage(const Message &msg)
{
return parent.filterMessage(msg);
}
-void ScopedLogger::processPushDefaultLocation(const SourceLocation &loc)
+void GuardedLogger::processPushDefaultLocation(const SourceLocation &loc)
{
parent.processPushDefaultLocation(loc);
depth++;
}
-void ScopedLogger::processPopDefaultLocation()
+void GuardedLogger::processPopDefaultLocation()
{
depth--;
parent.processPopDefaultLocation();
}
-void ScopedLogger::processSetDefaultLocation(const SourceLocation &loc)
+void GuardedLogger::processSetDefaultLocation(const SourceLocation &loc)
{
parent.processSetDefaultLocation(loc);
}
-void ScopedLogger::processSetSourceContextCallback(
+void GuardedLogger::processSetSourceContextCallback(
SourceContextCallback sourceContextCallback)
{
parent.processSetSourceContextCallback(sourceContextCallback);
@@ -265,128 +263,5 @@ bool ConcreteLogger::hasFatalError()
return getSeverityCount(Severity::FATAL_ERROR) > 0;
}
-/* Class TerminalLogger */
-
-void TerminalLogger::processMessage(const Message &msg)
-{
- Terminal t(useColor);
-
- // Fetch filename, position and context
- const SourceContext ctx = messageContext(msg);
-
- // Print the file name
- if (ctx.hasFile()) {
- os << t.bright() << ctx.filename << t.reset();
- }
-
- // Print line and column number
- if (ctx.hasLine()) {
- if (ctx.hasFile()) {
- os << ':';
- }
- os << t.bright() << ctx.startLine << t.reset();
- if (ctx.hasColumn()) {
- os << ':' << ctx.startColumn;
- }
- }
-
- // Print the optional seperator
- if (ctx.hasFile() || ctx.hasLine()) {
- os << ": ";
- }
-
- // Print the severity
- switch (msg.severity) {
- case Severity::DEBUG:
- break;
- case Severity::NOTE:
- os << t.color(Terminal::CYAN, true) << "note: ";
- break;
- case Severity::WARNING:
- os << t.color(Terminal::MAGENTA, true) << "warning: ";
- break;
- case Severity::ERROR:
- os << t.color(Terminal::RED, true) << "error: ";
- break;
- case Severity::FATAL_ERROR:
- os << t.color(Terminal::RED, true) << "fatal error: ";
- break;
- }
- os << t.reset();
-
- // Print the actual message
- os << msg.msg << std::endl;
-
- // Print the error message context if available
- if (ctx.hasText()) {
- // Iterate over each line in the text
- std::vector<std::string> lines = Utils::split(ctx.text, '\n');
-
- const size_t relLen = ctx.relLen ? ctx.relLen : 1;
- const size_t relPos = ctx.relPos;
- const size_t pstart = relPos;
- const size_t pend = relPos + relLen;
-
- size_t lstart = 0;
- size_t lend = 0;
- for (size_t n = 0; n < lines.size(); n++) {
- bool firstLine = n == 0;
- bool lastLine = n == lines.size() - 1;
-
- // Indicate truncation and indent non-first lines
- if (ctx.truncatedStart && firstLine) {
- os << "[...] ";
- }
- if (!firstLine) {
- os << "\t";
- }
-
- // Print the actual line
- os << lines[n];
-
- // Indicate truncation
- if (ctx.truncatedEnd && lastLine) {
- os << " [...]";
- }
- os << std::endl;
-
- // Repeat truncation or indendation space in the next line
- if (ctx.truncatedStart && firstLine) {
- os << " ";
- }
- if (!firstLine) {
- os << "\t";
- }
-
- // Print the position indicators
- lend = lastLine ? pend : lstart + lines[n].size();
- for (size_t i = lstart; i < lend; i++) {
- if (i >= pstart && i < pend) {
- os << t.color(Terminal::GREEN);
- for (; i < std::min(lend, pend); i++) {
- if (relLen == 1) {
- os << '^';
- } else {
- os << '~';
- }
- if (i < ctx.text.size() && ctx.text[i] == '\t') {
- os << '\t';
- }
- }
- os << t.reset();
- } else {
- if (i < ctx.text.size() && ctx.text[i] == '\t') {
- os << '\t';
- } else {
- os << ' ';
- }
- }
- }
- os << std::endl;
-
- lstart = lend;
- }
- }
-}
}
diff --git a/src/core/common/Logger.hpp b/src/core/common/Logger.hpp
index 85b1bb1..afe58be 100644
--- a/src/core/common/Logger.hpp
+++ b/src/core/common/Logger.hpp
@@ -19,9 +19,8 @@
/**
* @file Logger.hpp
*
- * Contains classes for logging messages in Ousía. Provides a generic Logger
- * class, and TerminalLogger, an extension of Logger which logs do an output
- * stream.
+ * Contains classes for logging messages in Ousía. Provides various base Logger
+ * classes that allow to Fork logger instances or to create a GuardedLogger.
*
* @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de)
*/
@@ -30,7 +29,6 @@
#define _OUSIA_LOGGER_HPP_
#include <cstdint>
-#include <ostream>
#include <string>
#include <vector>
@@ -109,7 +107,7 @@ inline MessageMode operator|(MessageMode a, MessageMode b)
// Forward declaration
class LoggerFork;
-class ScopedLogger;
+class GuardedLogger;
/**
* The Logger class is the base class the individual logging systems should
@@ -123,7 +121,7 @@ class ScopedLogger;
class Logger {
public:
friend LoggerFork;
- friend ScopedLogger;
+ friend GuardedLogger;
/**
* The message struct represents a single log message and all information
@@ -611,12 +609,12 @@ public:
};
/**
- * The ScopedLogger class can be used to automatically pop any pushed file from
+ * The GuardedLogger class can be used to automatically pop any pushed file from
* the File stack maintained by a Logger class (in a RAII manner). This
* simplifies managing pushing and popping files in case there are multiple
* return calls or exceptions thrown.
*/
-class ScopedLogger : public Logger {
+class GuardedLogger : public Logger {
private:
/**
* Reference to the parent logger instance.
@@ -668,20 +666,20 @@ protected:
public:
/**
- * Constructor of the ScopedLogger class, pushes a first file instance onto
+ * Constructor of the GuardedLogger class, pushes a first file instance onto
* the file stack.
*
* @param parent is the parent logger instance to which all calls should
* be relayed.
* @param loc specifies the first source location.
*/
- ScopedLogger(Logger &parent, SourceLocation loc = SourceLocation{});
+ GuardedLogger(Logger &parent, SourceLocation loc = SourceLocation{});
/**
- * Destructor of the ScopedLogger class, automatically unwinds the file
+ * Destructor of the GuardedLogger class, automatically unwinds the file
* stack.
*/
- ~ScopedLogger();
+ ~GuardedLogger();
};
/**
@@ -818,45 +816,6 @@ public:
bool hasFatalError();
};
-/**
- * Class extending the Logger class and printing the log messages to the
- * given
- * stream.
- */
-class TerminalLogger : public ConcreteLogger {
-private:
- /**
- * Reference to the target output stream.
- */
- std::ostream &os;
-
- /**
- * If true, the TerminalLogger will use colors to make the log messages
- * prettier.
- */
- bool useColor;
-
-protected:
- void processMessage(const Message &msg) override;
-
-public:
- /**
- * Constructor of the TerminalLogger class.
- *
- * @param os is the output stream the log messages should be logged to.
- * Should be set to std::cerr in most cases.
- * @param useColor if true, the TerminalLogger class will do its best to
- * use ANSI/VT100 control sequences for colored log messages.
- * @param minSeverity is the minimum severity below which log messages
- *are
- * discarded.
- */
- TerminalLogger(std::ostream &os, bool useColor = false,
- Severity minSeverity = DEFAULT_MIN_SEVERITY)
- : ConcreteLogger(minSeverity), os(os), useColor(useColor)
- {
- }
-};
}
#endif /* _OUSIA_LOGGER_HPP_ */
diff --git a/src/core/common/Terminal.cpp b/src/core/frontend/Terminal.cpp
index 447e595..447e595 100644
--- a/src/core/common/Terminal.cpp
+++ b/src/core/frontend/Terminal.cpp
diff --git a/src/core/common/Terminal.hpp b/src/core/frontend/Terminal.hpp
index 730853d..730853d 100644
--- a/src/core/common/Terminal.hpp
+++ b/src/core/frontend/Terminal.hpp
diff --git a/src/core/frontend/TerminalLogger.cpp b/src/core/frontend/TerminalLogger.cpp
new file mode 100644
index 0000000..fdb7c8f
--- /dev/null
+++ b/src/core/frontend/TerminalLogger.cpp
@@ -0,0 +1,151 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 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 <core/common/Utils.hpp>
+
+#include "Terminal.hpp"
+#include "TerminalLogger.hpp"
+
+namespace ousia {
+
+/* Class TerminalLogger */
+
+void TerminalLogger::processMessage(const Message &msg)
+{
+ Terminal t(useColor);
+
+ // Fetch filename, position and context
+ const SourceContext ctx = messageContext(msg);
+
+ // Print the file name
+ if (ctx.hasFile()) {
+ os << t.bright() << ctx.filename << t.reset();
+ }
+
+ // Print line and column number
+ if (ctx.hasLine()) {
+ if (ctx.hasFile()) {
+ os << ':';
+ }
+ os << t.bright() << ctx.startLine << t.reset();
+ if (ctx.hasColumn()) {
+ os << ':' << ctx.startColumn;
+ }
+ }
+
+ // Print the optional seperator
+ if (ctx.hasFile() || ctx.hasLine()) {
+ os << ": ";
+ }
+
+ // Print the severity
+ switch (msg.severity) {
+ case Severity::DEBUG:
+ break;
+ case Severity::NOTE:
+ os << t.color(Terminal::CYAN, true) << "note: ";
+ break;
+ case Severity::WARNING:
+ os << t.color(Terminal::MAGENTA, true) << "warning: ";
+ break;
+ case Severity::ERROR:
+ os << t.color(Terminal::RED, true) << "error: ";
+ break;
+ case Severity::FATAL_ERROR:
+ os << t.color(Terminal::RED, true) << "fatal error: ";
+ break;
+ }
+ os << t.reset();
+
+ // Print the actual message
+ os << msg.msg << std::endl;
+
+ // Print the error message context if available
+ if (ctx.hasText()) {
+ // Iterate over each line in the text
+ std::vector<std::string> lines = Utils::split(ctx.text, '\n');
+
+ const size_t relLen = ctx.relLen ? ctx.relLen : 1;
+ const size_t relPos = ctx.relPos;
+ const size_t pstart = relPos;
+ const size_t pend = relPos + relLen;
+
+ size_t lstart = 0;
+ size_t lend = 0;
+ for (size_t n = 0; n < lines.size(); n++) {
+ bool firstLine = n == 0;
+ bool lastLine = n == lines.size() - 1;
+
+ // Indicate truncation and indent non-first lines
+ if (ctx.truncatedStart && firstLine) {
+ os << "[...] ";
+ }
+ if (!firstLine) {
+ os << "\t";
+ }
+
+ // Print the actual line
+ os << lines[n];
+
+ // Indicate truncation
+ if (ctx.truncatedEnd && lastLine) {
+ os << " [...]";
+ }
+ os << std::endl;
+
+ // Repeat truncation or indendation space in the next line
+ if (ctx.truncatedStart && firstLine) {
+ os << " ";
+ }
+ if (!firstLine) {
+ os << "\t";
+ }
+
+ // Print the position indicators
+ lend = lastLine ? pend : lstart + lines[n].size();
+ for (size_t i = lstart; i < lend; i++) {
+ if (i >= pstart && i < pend) {
+ os << t.color(Terminal::GREEN);
+ for (; i < std::min(lend, pend); i++) {
+ if (relLen == 1) {
+ os << '^';
+ } else {
+ os << '~';
+ }
+ if (i < ctx.text.size() && ctx.text[i] == '\t') {
+ os << '\t';
+ }
+ }
+ os << t.reset();
+ } else {
+ if (i < ctx.text.size() && ctx.text[i] == '\t') {
+ os << '\t';
+ } else {
+ os << ' ';
+ }
+ }
+ }
+ os << std::endl;
+
+ lstart = lend;
+ }
+ }
+}
+
+}
+
diff --git a/src/core/frontend/TerminalLogger.hpp b/src/core/frontend/TerminalLogger.hpp
new file mode 100644
index 0000000..03930e9
--- /dev/null
+++ b/src/core/frontend/TerminalLogger.hpp
@@ -0,0 +1,79 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 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/>.
+*/
+
+/**
+ * @file TerminalLogger.hpp
+ *
+ * Provides the TerminalLogger class, which is used to log messages to an output
+ * stream, possibly a Terminal.
+ *
+ * @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de)
+ */
+
+#ifndef _OUSIA_TERMINAL_LOGGER_HPP_
+#define _OUSIA_TERMINAL_LOGGER_HPP_
+
+#include <ostream>
+
+#include <core/common/Logger.hpp>
+
+namespace ousia {
+
+/**
+ * Class extending the Logger class and printing (possibly colored) log messages
+ * to the given stream.
+ */
+class TerminalLogger : public ConcreteLogger {
+private:
+ /**
+ * Reference to the target output stream.
+ */
+ std::ostream &os;
+
+ /**
+ * If true, the TerminalLogger will use colors to make the log messages
+ * prettier.
+ */
+ bool useColor;
+
+protected:
+ void processMessage(const Message &msg) override;
+
+public:
+ /**
+ * Constructor of the TerminalLogger class.
+ *
+ * @param os is the output stream the log messages should be logged to.
+ * Should be set to std::cerr in most cases.
+ * @param useColor if true, the TerminalLogger class will do its best to
+ * use ANSI/VT100 control sequences for colored log messages.
+ * @param minSeverity is the minimum severity below which log messages
+ * are discarded.
+ */
+ TerminalLogger(std::ostream &os, bool useColor = false,
+ Severity minSeverity = DEFAULT_MIN_SEVERITY)
+ : ConcreteLogger(minSeverity), os(os), useColor(useColor)
+ {
+ }
+};
+
+}
+
+#endif /* _OUSIA_TERMINAL_LOGGER_HPP_ */
+
+
diff --git a/src/core/resource/ResourceManager.cpp b/src/core/resource/ResourceManager.cpp
index a5e76b0..059da41 100644
--- a/src/core/resource/ResourceManager.cpp
+++ b/src/core/resource/ResourceManager.cpp
@@ -128,7 +128,7 @@ Rooted<Node> ResourceManager::parse(ParserContext &ctx, Resource &resource,
Rooted<Node> node;
try {
// Set the current source id in the logger instance
- ScopedLogger logger(ctx.logger, SourceLocation{sourceId});
+ GuardedLogger logger(ctx.logger, SourceLocation{sourceId});
// Fetch the input stream and create a char reader
std::unique_ptr<std::istream> is = resource.stream();
diff --git a/test/core/common/ArgumentTest.cpp b/test/core/common/ArgumentTest.cpp
index 5580e00..8b74a19 100644
--- a/test/core/common/ArgumentTest.cpp
+++ b/test/core/common/ArgumentTest.cpp
@@ -22,9 +22,8 @@
#include <core/common/Argument.hpp>
#include <core/common/Function.hpp>
-#include <core/common/Logger.hpp>
#include <core/common/RttiBuilder.hpp>
-
+#include <core/frontend/TerminalLogger.hpp>
#include <core/managed/Managed.hpp>
namespace ousia {
diff --git a/test/core/common/LoggerTest.cpp b/test/core/common/LoggerTest.cpp
index 7b0e6d0..67acc83 100644
--- a/test/core/common/LoggerTest.cpp
+++ b/test/core/common/LoggerTest.cpp
@@ -20,91 +20,10 @@
#include <gtest/gtest.h>
-#include <core/common/CharReader.hpp>
#include <core/common/Logger.hpp>
-#include <core/common/SourceContextReader.hpp>
namespace ousia {
-struct Pos {
- SourceLocation pos;
- Pos(SourceLocation pos = SourceLocation{}) : pos(pos){};
-
- SourceLocation getLocation() { return pos; }
-};
-
-static const std::string testStr =
- "\\link[domain]{book}\n" // 1
- "\\link[domain]{meta}\n" // 2
- "\n" // 3
- "\\meta{\n" // 4
- "\t\\title{The Adventures Of Tom Sawyer}\n" // 5
- "\t\\author{Mark Twain}\n" // 6
- "}\n" // 7
- "\n" // 8
- "\\book{\n" // 9
- "\n" // 10
- "\n" // 11
- "\\chapter\n" // 12
- "<<TOM!>>\n" // 13
- "\n" // 14
- "No answer.\n" // 15
- "\n" // 16
- "<<TOM!>>\n" // 17
- "\n" // 18
- "No answer.\n" // 19
- "\n" // 20
- "<<What's gone with that boy, I wonder? You TOM!>>\n" // 21
- "}\n"; // 22
-
-static SourceContextReader contextReader{};
-
-static SourceContext contextCallback(const SourceLocation &location)
-{
- CharReader reader{testStr, 0};
- return contextReader.readContext(reader, location, 60,
- "the_adventures_of_tom_sawyer.opd");
-}
-
-TEST(TerminalLogger, log)
-{
- // Test for manual visual expection only -- no assertions
- TerminalLogger logger{std::cerr, true};
- logger.setSourceContextCallback(contextCallback);
-
- logger.debug("This is a test debug message");
- logger.note("This is a test note");
- logger.note("This is a test note with point context", SourceLocation{0, 49});
- logger.note("This is a test note with range context", SourceLocation{0, 49, 55});
- logger.note("This is a test note with multiline context", SourceLocation{0, 49, 150});
- logger.warning("This is a test warning");
- logger.error("This is a test error");
- logger.fatalError("This is a test fatal error!");
-
- logger.error("This is a test error with context");
-
- try {
- throw LoggableException{"An exception"};
- }
- catch (const LoggableException &ex) {
- logger.log(ex);
- }
-}
-
-TEST(TerminalLogger, fork)
-{
- // Test for manual visual expection only -- no assertions
- TerminalLogger logger{std::cerr, true};
-
- logger.setSourceContextCallback(contextCallback);
-
- LoggerFork fork = logger.fork();
-
- fork.error("This is a test error with context");
-
- // Print all error messages
- fork.commit();
-}
}
diff --git a/test/core/common/VariantReaderTest.cpp b/test/core/common/VariantReaderTest.cpp
index cfdb1a0..241aa56 100644
--- a/test/core/common/VariantReaderTest.cpp
+++ b/test/core/common/VariantReaderTest.cpp
@@ -20,6 +20,7 @@
#include <gtest/gtest.h>
#include <core/common/VariantReader.hpp>
+#include <core/frontend/TerminalLogger.hpp>
namespace ousia {
diff --git a/test/core/frontend/TerminalLoggerTest.cpp b/test/core/frontend/TerminalLoggerTest.cpp
new file mode 100644
index 0000000..b0e769d
--- /dev/null
+++ b/test/core/frontend/TerminalLoggerTest.cpp
@@ -0,0 +1,109 @@
+/*
+ Ousía
+ Copyright (C) 2014, 2015 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 <iostream>
+
+#include <gtest/gtest.h>
+
+#include <core/common/CharReader.hpp>
+#include <core/common/SourceContextReader.hpp>
+#include <core/frontend/TerminalLogger.hpp>
+
+namespace ousia {
+
+struct Pos {
+ SourceLocation pos;
+
+ Pos(SourceLocation pos = SourceLocation{}) : pos(pos){};
+
+ SourceLocation getLocation() { return pos; }
+};
+
+static const std::string testStr =
+ "\\link[domain]{book}\n" // 1
+ "\\link[domain]{meta}\n" // 2
+ "\n" // 3
+ "\\meta{\n" // 4
+ "\t\\title{The Adventures Of Tom Sawyer}\n" // 5
+ "\t\\author{Mark Twain}\n" // 6
+ "}\n" // 7
+ "\n" // 8
+ "\\book{\n" // 9
+ "\n" // 10
+ "\n" // 11
+ "\\chapter\n" // 12
+ "<<TOM!>>\n" // 13
+ "\n" // 14
+ "No answer.\n" // 15
+ "\n" // 16
+ "<<TOM!>>\n" // 17
+ "\n" // 18
+ "No answer.\n" // 19
+ "\n" // 20
+ "<<What's gone with that boy, I wonder? You TOM!>>\n" // 21
+ "}\n"; // 22
+
+static SourceContextReader contextReader{};
+
+static SourceContext contextCallback(const SourceLocation &location)
+{
+ CharReader reader{testStr, 0};
+ return contextReader.readContext(reader, location, 60,
+ "the_adventures_of_tom_sawyer.opd");
+}
+
+TEST(TerminalLogger, log)
+{
+ // Test for manual visual expection only -- no assertions
+ TerminalLogger logger{std::cerr, true};
+ logger.setSourceContextCallback(contextCallback);
+
+ logger.debug("This is a test debug message");
+ logger.note("This is a test note");
+ logger.note("This is a test note with point context", SourceLocation{0, 49});
+ logger.note("This is a test note with range context", SourceLocation{0, 49, 55});
+ logger.note("This is a test note with multiline context", SourceLocation{0, 49, 150});
+ logger.warning("This is a test warning");
+ logger.error("This is a test error");
+ logger.fatalError("This is a test fatal error!");
+
+ logger.error("This is a test error with context");
+
+ try {
+ throw LoggableException{"An exception"};
+ }
+ catch (const LoggableException &ex) {
+ logger.log(ex);
+ }
+}
+
+TEST(TerminalLogger, fork)
+{
+ // Test for manual visual expection only -- no assertions
+ TerminalLogger logger{std::cerr, true};
+
+ logger.setSourceContextCallback(contextCallback);
+
+ LoggerFork fork = logger.fork();
+
+ fork.error("This is a test error with context");
+
+ // Print all error messages
+ fork.commit();
+}
+}
diff --git a/test/core/model/DocumentTest.cpp b/test/core/model/DocumentTest.cpp
index a9c0dcc..e07deb8 100644
--- a/test/core/model/DocumentTest.cpp
+++ b/test/core/model/DocumentTest.cpp
@@ -21,7 +21,7 @@
#include <iostream>
#include <core/common/Rtti.hpp>
-
+#include <core/frontend/TerminalLogger.hpp>
#include <core/model/Document.hpp>
#include <core/model/Domain.hpp>
diff --git a/test/core/model/DomainTest.cpp b/test/core/model/DomainTest.cpp
index 2b63aeb..c00b122 100644
--- a/test/core/model/DomainTest.cpp
+++ b/test/core/model/DomainTest.cpp
@@ -21,6 +21,7 @@
#include <iostream>
#include <core/common/Rtti.hpp>
+#include <core/frontend/TerminalLogger.hpp>
#include <core/model/Domain.hpp>
#include "TestDomain.hpp"
diff --git a/test/core/model/TypesystemTest.cpp b/test/core/model/TypesystemTest.cpp
index e6655c1..4d1d2c9 100644
--- a/test/core/model/TypesystemTest.cpp
+++ b/test/core/model/TypesystemTest.cpp
@@ -21,6 +21,7 @@
#include <iostream>
#include <core/common/Rtti.hpp>
+#include <core/frontend/TerminalLogger.hpp>
#include <core/model/Typesystem.hpp>
namespace ousia {
diff --git a/test/plugins/css/CSSParserTest.cpp b/test/plugins/css/CSSParserTest.cpp
index 420241e..5132e51 100644
--- a/test/plugins/css/CSSParserTest.cpp
+++ b/test/plugins/css/CSSParserTest.cpp
@@ -21,9 +21,9 @@
#include <iostream>
#include <sstream>
-#include <plugins/css/CSSParser.hpp>
-
+#include <core/frontend/TerminalLogger.hpp>
#include <core/parser/StandaloneParserContext.hpp>
+#include <plugins/css/CSSParser.hpp>
namespace ousia {
TEST(CSSParser, testParseSelectors)
@@ -266,7 +266,7 @@ void assertException(std::string css)
CharReader reader(css);
TerminalLogger logger(std::cerr, true);
{
- ScopedLogger sl(logger);
+ GuardedLogger sl(logger);
StandaloneParserContext ctx(sl);
CSSParser instance;
diff --git a/test/plugins/html/DemoOutputTest.cpp b/test/plugins/html/DemoOutputTest.cpp
index 5668ddc..11e5fa6 100644
--- a/test/plugins/html/DemoOutputTest.cpp
+++ b/test/plugins/html/DemoOutputTest.cpp
@@ -24,7 +24,7 @@
#include <plugins/html/DemoOutput.hpp>
#include <core/common/Rtti.hpp>
-
+#include <core/frontend/TerminalLogger.hpp>
#include <core/model/Document.hpp>
#include <core/model/Domain.hpp>
diff --git a/test/plugins/xml/XmlParserTest.cpp b/test/plugins/xml/XmlParserTest.cpp
index 52b64e5..37b9cab 100644
--- a/test/plugins/xml/XmlParserTest.cpp
+++ b/test/plugins/xml/XmlParserTest.cpp
@@ -22,6 +22,7 @@
#include <core/common/CharReader.hpp>
#include <core/common/Logger.hpp>
+#include <core/frontend/TerminalLogger.hpp>
#include <core/parser/StandaloneParserContext.hpp>
#include <plugins/xml/XmlParser.hpp>