Exemplo n.º 1
0
TEST(io, linechar5)
{
    io::LineCharReader lr("<stringchar5>"_s, string_pipe("Hi\n\rWu"_s));
    io::LineChar c;
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), 'H');
    EXPECT_EQ(c.text, "Hi"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 1);
    EXPECT_EQ(c.column, 1);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), 'i');
    EXPECT_EQ(c.text, "Hi"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 1);
    EXPECT_EQ(c.column, 2);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), '\n');
    EXPECT_EQ(c.text, "Hi"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 1);
    EXPECT_EQ(c.column, 3);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), '\n');
    EXPECT_EQ(c.text, ""_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 2);
    EXPECT_EQ(c.column, 1);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), 'W');
    EXPECT_EQ(c.text, "Wu"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 3);
    EXPECT_EQ(c.column, 1);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), 'u');
    EXPECT_EQ(c.text, "Wu"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 3);
    EXPECT_EQ(c.column, 2);
    lr.adv();
    EXPECT_TRUE(lr.get(c));
    EXPECT_EQ(c.ch(), '\n');
    EXPECT_EQ(c.text, "Wu"_s);
    EXPECT_EQ(c.filename, "<stringchar5>"_s);
    EXPECT_EQ(c.line, 3);
    EXPECT_EQ(c.column, 3);
    lr.adv();
    EXPECT_FALSE(lr.get(c));
}
Exemplo n.º 2
0
TEST(io, line1)
{
    io::LineReader lr("<string1>"_s, string_pipe("Hello World\n"_s));
    io::Line hi;
    EXPECT_TRUE(lr.read_line(hi));
    EXPECT_EQ(hi.text, "Hello World"_s);
    EXPECT_EQ(hi.filename, "<string1>"_s);
    EXPECT_EQ(hi.line, 1);
    EXPECT_EQ(hi.column, 0);
    EXPECT_FALSE(lr.read_line(hi));
}
Exemplo n.º 3
0
TEST(sexpr, lexbad)
{
    QuietFd q;
    {
        io::LineSpan span;
        sexpr::Lexer lexer("<lexer-bad>"_s, string_pipe("(\n"_s));
        EXPECT_EQ(lexer.peek(), sexpr::TOK_OPEN);
        lexer.adv();
        EXPECT_EQ(lexer.peek(), sexpr::TOK_ERROR);
    }
    for (ZString bad : {
            ZString(")\n"_s),
            ZString("\"\n"_s),
            ZString("'\n"_s),
            ZString("\\\n"_s),
            ZString("\"\\"_s),
            ZString("\"\\z\""_s),
    })
    {
        io::LineSpan span;
        sexpr::Lexer lexer("<lexer-bad>"_s, string_pipe(bad));
        EXPECT_EQ(lexer.peek(), sexpr::TOK_ERROR);
    }
}
Exemplo n.º 4
0
TEST(io, linespan)
{
    io::LineCharReader lr("<span>"_s, string_pipe("Hello,\nWorld!\n"_s));
    io::LineSpan span;
    do
    {
        lr.get(span.begin);
        lr.adv();
    }
    while (span.begin.ch() != 'e');
    do
    {
        lr.get(span.end);
        lr.adv();
    }
    while (span.end.ch() != 'o');
    EXPECT_EQ(span.message_str("info"_s, "meh"_s),
            "<span>:1:2: info: meh\n"
            "Hello,\n"
            " ^~~~\n"_s
    );
    span.begin = span.end;
    do
    {
        lr.get(span.end);
        lr.adv();
    }
    while (span.end.ch() != 'r');

    EXPECT_EQ(span.begin.message_str("note"_s, "foo"_s),
            "<span>:1:5: note: foo\n"
            "Hello,\n"
            "    ^\n"_s
    );
    EXPECT_EQ(span.end.message_str("warning"_s, "bar"_s),
            "<span>:2:3: warning: bar\n"
            "World!\n"
            "  ^\n"_s
    );
    EXPECT_EQ(span.message_str("error"_s, "qux"_s),
            "<span>:1:5: error: qux\n"
            "Hello,\n"
            "    ^~ ...\n"
            "World!\n"
            "~~~\n"_s
    );
}
Exemplo n.º 5
0
TEST(sexpr, lexer)
{
    io::LineSpan span;
    sexpr::Lexer lexer("<lexer-test1>"_s, string_pipe(" foo( ) 123\"\" \n"_s));
    EXPECT_EQ(lexer.peek(), sexpr::TOK_TOKEN);
    EXPECT_EQ(lexer.val_string(), "foo"_s);
    EXPECT_EQ(lexer.span().error_str("test"_s),
            "<lexer-test1>:1:2: error: test\n"
            " foo( ) 123\"\" \n"
            " ^~~\n"_s
    );
    lexer.adv();
    EXPECT_EQ(lexer.peek(), sexpr::TOK_OPEN);
    EXPECT_EQ(lexer.span().error_str("test"_s),
            "<lexer-test1>:1:5: error: test\n"
            " foo( ) 123\"\" \n"
            "    ^\n"_s
    );
    lexer.adv();
    EXPECT_EQ(lexer.peek(), sexpr::TOK_CLOSE);
    EXPECT_EQ(lexer.span().error_str("test"_s),
            "<lexer-test1>:1:7: error: test\n"
            " foo( ) 123\"\" \n"
            "      ^\n"_s
    );
    lexer.adv();
    EXPECT_EQ(lexer.peek(), sexpr::TOK_TOKEN);
    EXPECT_EQ(lexer.val_string(), "123"_s);
    EXPECT_EQ(lexer.span().error_str("test"_s),
            "<lexer-test1>:1:9: error: test\n"
            " foo( ) 123\"\" \n"
            "        ^~~\n"_s
    );
    lexer.adv();
    EXPECT_EQ(lexer.peek(), sexpr::TOK_STRING);
    EXPECT_EQ(lexer.val_string(), ""_s);
    EXPECT_EQ(lexer.span().error_str("test"_s),
            "<lexer-test1>:1:12: error: test\n"
            " foo( ) 123\"\" \n"
            "           ^~\n"_s
    );
    lexer.adv();
    EXPECT_EQ(lexer.peek(), sexpr::TOK_EOF);
}
Exemplo n.º 6
0
TEST(io, line5)
{
    io::LineReader lr("<string5>"_s, string_pipe("Hello\n\rWorld"_s));
    io::Line hi;
    EXPECT_TRUE(lr.read_line(hi));
    EXPECT_EQ(hi.text, "Hello"_s);
    EXPECT_EQ(hi.filename, "<string5>"_s);
    EXPECT_EQ(hi.line, 1);
    EXPECT_EQ(hi.column, 0);
    EXPECT_TRUE(lr.read_line(hi));
    EXPECT_EQ(hi.text, ""_s);
    EXPECT_EQ(hi.filename, "<string5>"_s);
    EXPECT_EQ(hi.line, 2);
    EXPECT_EQ(hi.column, 0);
    EXPECT_TRUE(lr.read_line(hi));
    EXPECT_EQ(hi.text, "World"_s);
    EXPECT_EQ(hi.filename, "<string5>"_s);
    EXPECT_EQ(hi.line, 3);
    EXPECT_EQ(hi.column, 0);
    EXPECT_FALSE(lr.read_line(hi));
}