| // |
| // Copyright 2012 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| #include "compiler/preprocessor/Input.h" |
| #include "PreprocessorTest.h" |
| #include "compiler/preprocessor/Token.h" |
| |
| namespace angle |
| { |
| |
| class InitTest : public PreprocessorTest |
| { |
| public: |
| InitTest() : PreprocessorTest(SH_GLES2_SPEC) {} |
| }; |
| |
| TEST_F(InitTest, ZeroCount) |
| { |
| EXPECT_TRUE(mPreprocessor.init(0, nullptr, nullptr)); |
| |
| pp::Token token; |
| mPreprocessor.lex(&token); |
| EXPECT_EQ(pp::Token::LAST, token.type); |
| } |
| |
| TEST_F(InitTest, NullString) |
| { |
| EXPECT_FALSE(mPreprocessor.init(1, nullptr, nullptr)); |
| } |
| |
| TEST(InputTest, DefaultConstructor) |
| { |
| pp::Input input; |
| EXPECT_EQ(0u, input.count()); |
| int lineNo = 0; |
| EXPECT_EQ(0u, input.read(nullptr, 1, &lineNo)); |
| } |
| |
| TEST(InputTest, NullLength) |
| { |
| const char *str[] = {"foo"}; |
| pp::Input input(1, str, nullptr); |
| EXPECT_EQ(3u, input.length(0)); |
| } |
| |
| TEST(InputTest, NegativeLength) |
| { |
| const char *str[] = {"foo"}; |
| int length[] = {-1}; |
| pp::Input input(1, str, length); |
| EXPECT_EQ(3u, input.length(0)); |
| } |
| |
| TEST(InputTest, ActualLength) |
| { |
| const char *str[] = {"foobar"}; |
| int length[] = {3}; |
| pp::Input input(1, str, length); |
| // Note that strlen(str[0]) != length[0]. |
| // Even then Input should just accept any non-negative number. |
| EXPECT_EQ(static_cast<size_t>(length[0]), input.length(0)); |
| } |
| |
| TEST(InputTest, String) |
| { |
| const char *str[] = {"foo"}; |
| pp::Input input(1, str, nullptr); |
| EXPECT_STREQ(str[0], input.string(0)); |
| } |
| |
| TEST(InputTest, ReadSingleString) |
| { |
| int count = 1; |
| const char *str[] = {"foo"}; |
| char buf[4] = {'\0', '\0', '\0', '\0'}; |
| |
| int maxSize = 1; |
| int lineNo = 0; |
| pp::Input input1(count, str, nullptr); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('f', buf[0]); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(0u, input1.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 2; |
| pp::Input input2(count, str, nullptr); |
| EXPECT_EQ(2u, input2.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("fo", buf); |
| EXPECT_EQ(1u, input2.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(0u, input2.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 3; |
| pp::Input input3(count, str, nullptr); |
| EXPECT_EQ(3u, input3.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("foo", buf); |
| EXPECT_EQ(0u, input3.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 4; |
| pp::Input input4(count, str, nullptr); |
| EXPECT_EQ(3u, input4.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("foo", buf); |
| EXPECT_EQ(0u, input4.read(buf, maxSize, &lineNo)); |
| } |
| |
| TEST(InputTest, ReadMultipleStrings) |
| { |
| int count = 3; |
| const char *str[] = {"f", "o", "o"}; |
| char buf[4] = {'\0', '\0', '\0', '\0'}; |
| |
| int maxSize = 1; |
| int lineNo = 0; |
| pp::Input input1(count, str, nullptr); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('f', buf[0]); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(0u, input1.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 2; |
| pp::Input input2(count, str, nullptr); |
| EXPECT_EQ(2u, input2.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("fo", buf); |
| EXPECT_EQ(1u, input2.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ('o', buf[0]); |
| EXPECT_EQ(0u, input2.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 3; |
| pp::Input input3(count, str, nullptr); |
| EXPECT_EQ(3u, input3.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("foo", buf); |
| EXPECT_EQ(0u, input3.read(buf, maxSize, &lineNo)); |
| |
| maxSize = 4; |
| pp::Input input4(count, str, nullptr); |
| EXPECT_EQ(3u, input4.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("foo", buf); |
| EXPECT_EQ(0u, input4.read(buf, maxSize, &lineNo)); |
| } |
| |
| TEST(InputTest, ReadStringsWithLength) |
| { |
| int count = 2; |
| const char *str[] = {"foo", "bar"}; |
| // Note that the length for the first string is 2 which is less than |
| // strlen(str[0]. We want to make sure that the last character is ignored. |
| int length[] = {2, 3}; |
| char buf[6] = {'\0', '\0', '\0', '\0', '\0', '\0'}; |
| size_t maxSize = 5; |
| int lineNo = 0; |
| |
| pp::Input input(count, str, length); |
| EXPECT_EQ(maxSize, input.read(buf, maxSize, &lineNo)); |
| EXPECT_STREQ("fobar", buf); |
| } |
| |
| TEST(InputTest, ReadStringsWithLineContinuation) |
| { |
| int count = 2; |
| const char *str[] = {"foo\\", "\nba\\\r\nr"}; |
| int length[] = {4, 7}; |
| char buf[11] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; |
| size_t maxSize = 11; |
| int lineNo = 0; |
| |
| pp::Input input(count, str, length); |
| EXPECT_EQ(3u, input.read(buf, maxSize, &lineNo)); |
| EXPECT_EQ(0, lineNo); |
| EXPECT_EQ(2u, input.read(buf + 3, maxSize - 3, &lineNo)); |
| EXPECT_EQ(1, lineNo); |
| EXPECT_EQ(1u, input.read(buf + 5, maxSize - 5, &lineNo)); |
| EXPECT_EQ(2, lineNo); |
| EXPECT_STREQ("foobar", buf); |
| } |
| |
| } // namespace angle |