/*
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 .
*/
#include
#include
#include
namespace ousia {
static const std::string testStr{"first line\n\nthird line\nlast line"};
// 0123456789 0 12345678901 23456789012
// 0 1 2 3
static SourceContext readContext(
SourceContextReader &sr, size_t pos,
size_t width = SourceContextReader::MAX_MAX_CONTEXT_LENGTH)
{
CharReader reader{testStr};
return sr.readContext(reader, SourceRange{pos}, width);
}
TEST(SourceContextReader, firstLine)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 0);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("first line", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(1U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, firstLineCenter)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 5);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("first line", ctx.text);
EXPECT_EQ(5U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(6U, ctx.startColumn);
EXPECT_EQ(1U, ctx.endLine);
EXPECT_EQ(6U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, firstLineBeginTruncated)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 0, 3);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("fir", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(1U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_TRUE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, inWhitespaceSequence)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 10);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("first line", ctx.text);
EXPECT_EQ(10U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(11U, ctx.startColumn);
EXPECT_EQ(1U, ctx.endLine);
EXPECT_EQ(11U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, truncation)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 5, 3);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("t l", ctx.text);
EXPECT_EQ(1U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(6U, ctx.startColumn);
EXPECT_EQ(1U, ctx.endLine);
EXPECT_EQ(6U, ctx.endColumn);
EXPECT_TRUE(ctx.truncatedStart);
EXPECT_TRUE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, emptyLine)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 11);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(2U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(2U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, thirdLine)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 12);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("third line", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(3U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(3U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, thirdLineBeginTruncated)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 12, 3);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("thi", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(3U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(3U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_TRUE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, thirdLineEnd)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 22);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("third line", ctx.text);
EXPECT_EQ(10U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(3U, ctx.startLine);
EXPECT_EQ(11U, ctx.startColumn);
EXPECT_EQ(3U, ctx.endLine);
EXPECT_EQ(11U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLine)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 23);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("last line", ctx.text);
EXPECT_EQ(0U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(4U, ctx.startLine);
EXPECT_EQ(1U, ctx.startColumn);
EXPECT_EQ(4U, ctx.endLine);
EXPECT_EQ(1U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLineMiddle)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 27);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("last line", ctx.text);
EXPECT_EQ(4U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(4U, ctx.startLine);
EXPECT_EQ(5U, ctx.startColumn);
EXPECT_EQ(4U, ctx.endLine);
EXPECT_EQ(5U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLineMiddleTruncated)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 27, 3);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("t l", ctx.text);
EXPECT_EQ(1U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(4U, ctx.startLine);
EXPECT_EQ(5U, ctx.startColumn);
EXPECT_EQ(4U, ctx.endLine);
EXPECT_EQ(5U, ctx.endColumn);
EXPECT_TRUE(ctx.truncatedStart);
EXPECT_TRUE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLineEnd)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 32);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("last line", ctx.text);
EXPECT_EQ(9U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(4U, ctx.startLine);
EXPECT_EQ(10U, ctx.startColumn);
EXPECT_EQ(4U, ctx.endLine);
EXPECT_EQ(10U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLineEndTruncated)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 32, 3);
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("ine", ctx.text);
EXPECT_EQ(3U, ctx.relPos);
EXPECT_EQ(0U, ctx.relLen);
EXPECT_EQ(4U, ctx.startLine);
EXPECT_EQ(10U, ctx.startColumn);
EXPECT_EQ(4U, ctx.endLine);
EXPECT_EQ(10U, ctx.endColumn);
EXPECT_TRUE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
TEST(SourceContextReader, lastLineBeyondEnd)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
SourceContext ctx = readContext(sr, 33);
EXPECT_FALSE(ctx.isValid());
}
}
TEST(SourceContextReader, multiline)
{
SourceContextReader sr;
for (int i = 0; i < 2; i++) {
CharReader reader{testStr};
SourceContext ctx = sr.readContext(reader, SourceRange{5, 17});
EXPECT_TRUE(ctx.isValid());
EXPECT_EQ("first line\n\nthird line", ctx.text);
EXPECT_EQ(5U, ctx.relPos);
EXPECT_EQ(12U, ctx.relLen);
EXPECT_EQ(1U, ctx.startLine);
EXPECT_EQ(6U, ctx.startColumn);
EXPECT_EQ(3U, ctx.endLine);
EXPECT_EQ(6U, ctx.endColumn);
EXPECT_FALSE(ctx.truncatedStart);
EXPECT_FALSE(ctx.truncatedEnd);
}
}
}