1//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "PreprocessorTest.h"
8#include "Input.h"
9#include "Token.h"
10
11class InitTest : public PreprocessorTest
12{
13};
14
15TEST_F(InitTest, ZeroCount)
16{
17    EXPECT_TRUE(mPreprocessor.init(0, NULL, NULL));
18
19    pp::Token token;
20    mPreprocessor.lex(&token);
21    EXPECT_EQ(pp::Token::LAST, token.type);
22}
23
24TEST_F(InitTest, NullString)
25{
26    EXPECT_FALSE(mPreprocessor.init(1, NULL, NULL));
27}
28
29TEST(InputTest, DefaultConstructor)
30{
31    pp::Input input;
32    EXPECT_EQ(0u, input.count());
33    EXPECT_EQ(0u, input.read(NULL, 1));
34}
35
36TEST(InputTest, NullLength)
37{
38    const char* str[] = {"foo"};
39    pp::Input input(1, str, NULL);
40    EXPECT_EQ(3u, input.length(0));
41}
42
43TEST(InputTest, NegativeLength)
44{
45    const char* str[] = {"foo"};
46    int length[] = {-1};
47    pp::Input input(1, str, length);
48    EXPECT_EQ(3u, input.length(0));
49}
50
51TEST(InputTest, ActualLength)
52{
53    const char* str[] = {"foobar"};
54    int length[] = {3};
55    pp::Input input(1, str, length);
56    // Note that strlen(str[0]) != length[0].
57    // Even then Input should just accept any non-negative number.
58    EXPECT_EQ(static_cast<size_t>(length[0]), input.length(0));
59}
60
61TEST(InputTest, String)
62{
63    const char* str[] = {"foo"};
64    pp::Input input(1, str, NULL);
65    EXPECT_STREQ(str[0], input.string(0));
66}
67
68TEST(InputTest, ReadSingleString)
69{
70    int count = 1;
71    const char* str[] = {"foo"};
72    char buf[4] = {'\0', '\0', '\0', '\0'};
73
74    int maxSize = 1;
75    pp::Input input1(count, str, NULL);
76    EXPECT_EQ(1u, input1.read(buf, maxSize));
77    EXPECT_EQ('f', buf[0]);
78    EXPECT_EQ(1u, input1.read(buf, maxSize));
79    EXPECT_EQ('o', buf[0]);
80    EXPECT_EQ(1u, input1.read(buf, maxSize));
81    EXPECT_EQ('o', buf[0]);
82    EXPECT_EQ(0u, input1.read(buf, maxSize));
83
84    maxSize = 2;
85    pp::Input input2(count, str, NULL);
86    EXPECT_EQ(2u, input2.read(buf, maxSize));
87    EXPECT_STREQ("fo", buf);
88    EXPECT_EQ(1u, input2.read(buf, maxSize));
89    EXPECT_EQ('o', buf[0]);
90    EXPECT_EQ(0u, input2.read(buf, maxSize));
91
92    maxSize = 3;
93    pp::Input input3(count, str, NULL);
94    EXPECT_EQ(3u, input3.read(buf, maxSize));
95    EXPECT_STREQ("foo", buf);
96    EXPECT_EQ(0u, input3.read(buf, maxSize));
97
98    maxSize = 4;
99    pp::Input input4(count, str, NULL);
100    EXPECT_EQ(3u, input4.read(buf, maxSize));
101    EXPECT_STREQ("foo", buf);
102    EXPECT_EQ(0u, input4.read(buf, maxSize));
103}
104
105TEST(InputTest, ReadMultipleStrings)
106{
107    int count = 3;
108    const char* str[] = {"f", "o", "o"};
109    char buf[4] = {'\0', '\0', '\0', '\0'};
110
111    int maxSize = 1;
112    pp::Input input1(count, str, NULL);
113    EXPECT_EQ(1u, input1.read(buf, maxSize));
114    EXPECT_EQ('f', buf[0]);
115    EXPECT_EQ(1u, input1.read(buf, maxSize));
116    EXPECT_EQ('o', buf[0]);
117    EXPECT_EQ(1u, input1.read(buf, maxSize));
118    EXPECT_EQ('o', buf[0]);
119    EXPECT_EQ(0u, input1.read(buf, maxSize));
120
121    maxSize = 2;
122    pp::Input input2(count, str, NULL);
123    EXPECT_EQ(2u, input2.read(buf, maxSize));
124    EXPECT_STREQ("fo", buf);
125    EXPECT_EQ(1u, input2.read(buf, maxSize));
126    EXPECT_EQ('o', buf[0]);
127    EXPECT_EQ(0u, input2.read(buf, maxSize));
128
129    maxSize = 3;
130    pp::Input input3(count, str, NULL);
131    EXPECT_EQ(3u, input3.read(buf, maxSize));
132    EXPECT_STREQ("foo", buf);
133    EXPECT_EQ(0u, input3.read(buf, maxSize));
134
135    maxSize = 4;
136    pp::Input input4(count, str, NULL);
137    EXPECT_EQ(3u, input4.read(buf, maxSize));
138    EXPECT_STREQ("foo", buf);
139    EXPECT_EQ(0u, input4.read(buf, maxSize));
140}
141
142TEST(InputTest, ReadStringsWithLength)
143{
144    int count = 2;
145    const char* str[] = {"foo", "bar"};
146    // Note that the length for the first string is 2 which is less than
147    // strlen(str[0]. We want to make sure that the last character is ignored.
148    int length[] = {2, 3};
149    char buf[6] = {'\0', '\0', '\0', '\0', '\0', '\0'};
150    size_t maxSize = 5;
151
152    pp::Input input(count, str, length);
153    EXPECT_EQ(maxSize, input.read(buf, maxSize));
154    EXPECT_STREQ("fobar", buf);
155}
156
157