1d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org//
2d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org// Use of this source code is governed by a BSD-style license that can be
4d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org// found in the LICENSE file.
5d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org//
6d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
7d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org#include "PreprocessorTest.h"
8d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org#include "Token.h"
9d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
10d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgclass IfTest : public PreprocessorTest
11d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
12d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org};
13d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
14d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_0)
15d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
16d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
17d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 0\n"
18d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
19d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
20d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n";
21d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
22d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
23d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
24d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
25d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n";
26d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
27d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
28d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
29d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
30d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_1)
31d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
32d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
33d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
34d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
35d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
36d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
37d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
38d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
39d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
40d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
41d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
42d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
43d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
44d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
45d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
46d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_0_Else)
47d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
48d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
49d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 0\n"
50d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
51d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
52d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
53d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
54d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
55d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
56d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
57d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
58d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
59d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
60d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
61d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
62d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
63d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
64d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
65d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
66d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_1_Else)
67d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
68d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
69d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
70d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
71d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
72d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
73d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
74d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
75d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
76d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
77d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
78d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
79d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
80d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
81d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
82d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
83d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
84d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
85d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
86d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_0_Elif)
87d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
88d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
89d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 0\n"
90d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
91d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 0\n"
92d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
93d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 1\n"
94d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
95d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 1\n"
96d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_3\n"
97d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
98d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_4\n"
99d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
100d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
101d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
102d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
103d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
104d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
105d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
106d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
107d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
108d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
109d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
110d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
111d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
112d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
113d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
114d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
115d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
116d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
117d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
118d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_1_Elif)
119d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
120d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
121d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
122d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
123d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 0\n"
124d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
125d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 1\n"
126d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
127d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
128d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_4\n"
129d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
130d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
131d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
132d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
133d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
134d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
135d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
136d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
137d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
138d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
139d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
140d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
141d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
142d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
143d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
144d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
145d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
146d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_Elif_Else)
147d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
148d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
149d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 0\n"
150d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
151d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 0\n"
152d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
153d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 0\n"
154d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_3\n"
155d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
156d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
157d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
158d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
159d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
160d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
161d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
162d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
163d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
164d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
165d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
166d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
167d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
168d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
169d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
170d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
171d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
172d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
173d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
174d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_0_Nested)
175d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
176d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
177d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 0\n"
178d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
179d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
180d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
181d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
182d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_3\n"
183d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
184d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
185d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
186d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
187d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n";
188d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
189d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
190d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
191d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
192d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
193d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
194d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
195d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
196d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
197d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
198d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
199d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n";
200d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
201d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
202d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
203d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
204d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, If_1_Nested)
205d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
206d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "pass_1\n"
207d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
208d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
209d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 1\n"
210d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n"
211d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
212d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
213d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
214d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
215d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
216d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
217d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_4\n";
218d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "pass_1\n"
219d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
220d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
221d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
222d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n"
223d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
224d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
225d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
226d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
227d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
228d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
229d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_4\n";
230d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
231d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
232d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
233d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
234d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorPrecedence)
235d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
236d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1 + 2 * 3 + - (26 % 17 - + 4 / 2)\n"
237d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
238d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
239d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
240d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
241d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
242d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
243d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
244d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
245d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
246d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
247d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
248d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
249d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
250d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorDefined)
251d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
252d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if defined foo\n"
253d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
254d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
255d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
256d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
257d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#define foo\n"
258d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if defined(foo)\n"
259d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
260d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
261d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
262d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
263d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#undef foo\n"
264d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if defined ( foo ) \n"
265d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_3\n"
266d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
267d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_3\n"
268d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
269d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
270d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
271d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
272d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
273d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
274d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
275d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
276d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
277d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
278d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
279d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
280d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
281d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
282d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
283d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
284d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_3\n"
285d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
286d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
287d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
288d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
289d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
290d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorEQ)
291d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
292d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 4 - 1 == 2 + 1\n"
293d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
294d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
295d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
296d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
297d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
298d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
299d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
300d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
301d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
302d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
303d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
304d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
305d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
306d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorNE)
307d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
308d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1 != 2\n"
309d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
310d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
311d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
312d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
313d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
314d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
315d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
316d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
317d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
318d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
319d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
320d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
321d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
322d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorLess)
323d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
324d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1 < 2\n"
325d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
326d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
327d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
328d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
329d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
330d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
331d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
332d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
333d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
334d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
335d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
336d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
337d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
338d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorGreater)
339d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
340d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 2 > 1\n"
341d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
342d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
343d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
344d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
345d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
346d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
347d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
348d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
349d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
350d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
351d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
352d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
353d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
354d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorLE)
355d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
356d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1 <= 2\n"
357d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
358d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
359d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
360d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
361d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 2 <= 2\n"
362d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
363d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
364d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
365d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
366d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
367d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
368d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
369d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
370d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
371d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
372d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
373d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
374d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
375d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
376d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
377d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
378d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
379d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
380d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorGE)
381d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
382d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 2 >= 1\n"
383d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
384d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
385d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
386d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
387d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if 2 >= 2\n"
388d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
389d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
390d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
391d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
392d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
393d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
394d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
395d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
396d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
397d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
398d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
399d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
400d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
401d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
402d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
403d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
404d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
405d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
406d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorBitwiseOR)
407d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
408d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (0xaaaaaaaa | 0x55555555) == 0xffffffff\n"
409d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
410d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
411d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
412d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
413d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
414d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
415d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
416d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
417d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
418d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
419d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
420d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
421d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
422d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorBitwiseAND)
423d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
424d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (0xaaaaaaa & 0x5555555) == 0\n"
425d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
426d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
427d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
428d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
429d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
430d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
431d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
432d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
433d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
434d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
435d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
436d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
437d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
438d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorBitwiseXOR)
439d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
440d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (0xaaaaaaa ^ 0x5555555) == 0xfffffff\n"
441d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
442d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
443d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
444d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
445d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
446d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
447d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
448d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
449d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
450d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
451d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
452d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
453d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
454d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorBitwiseComplement)
455d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
456d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (~ 0xdeadbeef) == -3735928560\n"
457d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
458d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
459d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
460d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
461d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
462d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
463d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
464d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
465d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
466d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
467d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
468d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
469d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
470d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorLeft)
471d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
472d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (1 << 12) == 4096\n"
473d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
474d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
475d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
476d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
477d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
478d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
479d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
480d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
481d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
482d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
483d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
484d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
485d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
486d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, OperatorRight)
487d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
488d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if (31762 >> 8) == 124\n"
489d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
490d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
491d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
492d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
493d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
494d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
495d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
496d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
497d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
498d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
499d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
500d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
501d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
502d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, ExpressionWithMacros)
503d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
504d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#define one 1\n"
505d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#define two 2\n"
506d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#define three 3\n"
507d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if one + two == three\n"
508d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
509d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
510d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
511d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
512d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
513d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
514d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
515d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
516d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
517d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
518d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
519d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
520d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
521d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
522d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
523d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
524d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, JunkInsideExcludedBlockIgnored)
525d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
526d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 0\n"
527d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "foo !@#$%^&* .1bar\n"
528d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#foo\n"
529d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#if bar\n"
530d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
531d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
532d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
533d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
534d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
535d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
536d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
537d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
538d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
539d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
540d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
541d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
542d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
543d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
544d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
545d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
546d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
547d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
548d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, Ifdef)
549d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
550d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#define foo\n"
551d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#ifdef foo\n"
552d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
553d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
554d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
555d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
556d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#undef foo\n"
557d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#ifdef foo\n"
558d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
559d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
560d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
561d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
562d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
563d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
564d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
565d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
566d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
567d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
568d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
569d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
570d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
571d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
572d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
573d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
574d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
575d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
576d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
577d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
578d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, Ifndef)
579d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
580d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#define foo\n"
581d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#ifndef foo\n"
582d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_1\n"
583d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
584d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_1\n"
585d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n"
586d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#undef foo\n"
587d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#ifndef foo\n"
588d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass_2\n"
589d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
590d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail_2\n"
591d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
592d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
593d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
594d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
595d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
596d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_1\n"
597d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
598d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
599d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
600d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass_2\n"
601d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
602d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
603d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
604d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
605d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
606d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
607d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
608d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, MissingExpression)
609d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
610d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if\n"
611d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
612d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
613d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
614d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
615d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::INVALID_EXPRESSION,
616d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
617d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "syntax error"));
618d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
619d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
620d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
621d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
622d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
623fadc20586b4108117214f87834403c185eb872a6alokp@chromium.orgTEST_F(IfTest, DivisionByZero)
624fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org{
625fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    const char* str = "#if 1 / (3 - (1 + 2))\n"
626fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                      "#endif\n";
627fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
628fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
629fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    EXPECT_CALL(mDiagnostics,
630fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                print(pp::Diagnostics::DIVISION_BY_ZERO,
631fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                      pp::SourceLocation(0, 1), "1 / 0"));
632fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
633fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    pp::Token token;
634fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    mPreprocessor.lex(&token);
635fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org}
636fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
637fadc20586b4108117214f87834403c185eb872a6alokp@chromium.orgTEST_F(IfTest, ModuloByZero)
638fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org{
639fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    const char* str = "#if 1 % (3 - (1 + 2))\n"
640fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                      "#endif\n";
641fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
642fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
643fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    EXPECT_CALL(mDiagnostics,
644fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                print(pp::Diagnostics::DIVISION_BY_ZERO,
645fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org                      pp::SourceLocation(0, 1), "1 % 0"));
646fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
647fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    pp::Token token;
648fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org    mPreprocessor.lex(&token);
649fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org}
650fadc20586b4108117214f87834403c185eb872a6alokp@chromium.org
6512e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.orgTEST_F(IfTest, DecIntegerOverflow)
6522e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org{
6532e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    const char* str = "#if 4294967296\n"
6542e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      "#endif\n";
6552e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
6562e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6572e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    EXPECT_CALL(mDiagnostics,
6582e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                print(pp::Diagnostics::INTEGER_OVERFLOW,
6592e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      pp::SourceLocation(0, 1), "4294967296"));
6602e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6612e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    pp::Token token;
6622e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    mPreprocessor.lex(&token);
6632e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org}
6642e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6652e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.orgTEST_F(IfTest, OctIntegerOverflow)
6662e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org{
6672e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    const char* str = "#if 077777777777\n"
6682e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      "#endif\n";
6692e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
6702e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6712e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    EXPECT_CALL(mDiagnostics,
6722e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                print(pp::Diagnostics::INTEGER_OVERFLOW,
6732e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      pp::SourceLocation(0, 1), "077777777777"));
6742e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6752e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    pp::Token token;
6762e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    mPreprocessor.lex(&token);
6772e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org}
6782e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6792e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.orgTEST_F(IfTest, HexIntegerOverflow)
6802e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org{
6812e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    const char* str = "#if 0xfffffffff\n"
6822e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      "#endif\n";
6832e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
6842e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6852e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    EXPECT_CALL(mDiagnostics,
6862e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                print(pp::Diagnostics::INTEGER_OVERFLOW,
6872e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org                      pp::SourceLocation(0, 1), "0xfffffffff"));
6882e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
6892e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    pp::Token token;
6902e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org    mPreprocessor.lex(&token);
6912e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org}
6922e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org
693d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, UndefinedMacro)
694d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
695d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if UNDEFINED\n"
696d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
697d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
698d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
699d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
700d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::INVALID_EXPRESSION,
701d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
702d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "syntax error"));
703d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
704d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_UNEXPECTED_TOKEN,
705d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
706d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "UNDEFINED"));
707d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
708d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
709d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
710d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
711d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
712d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, InvalidExpressionIgnoredForExcludedElif)
713d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
714d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1\n"
715d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "pass\n"
716d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif UNDEFINED\n"
717d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "fail\n"
718d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
719d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* expected = "\n"
720d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "pass\n"
721d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
722d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n"
723d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                           "\n";
724d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
725d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    // No error or warning.
726d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    using testing::_;
727d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
728d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
729d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    preprocess(str, expected);
730d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
731d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
732d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, ElseWithoutIf)
733d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
734d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#else\n";
735d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
736d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
737d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
738d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_ELSE_WITHOUT_IF,
739d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
740d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "else"));
741d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
742d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
743d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
744d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
745d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
746d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, ElifWithoutIf)
747d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
748d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#elif 1\n";
749d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
750d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
751d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
752d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_ELIF_WITHOUT_IF,
753d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
754d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "elif"));
755d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
756d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
757d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
758d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
759d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
760d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, EndifWithoutIf)
761d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
762d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#endif\n";
763d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
764d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
765d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
766d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_ENDIF_WITHOUT_IF,
767d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
768d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "endif"));
769d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
770d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
771d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
772d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
773d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
774d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, ElseAfterElse)
775d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
776d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1\n"
777d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
778d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
779d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
780d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
781d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
782d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
783d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_ELSE_AFTER_ELSE,
784d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 3),
785d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "else"));
786d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
787d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
788d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
789d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
790d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
791d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, ElifAfterElse)
792d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
793d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1\n"
794d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#else\n"
795d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#elif 0\n"
796d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "#endif\n";
797d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
798d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
799d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
800d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_ELIF_AFTER_ELSE,
801d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 3),
802d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "elif"));
803d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
804d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
805d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
806d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
807d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
808d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, UnterminatedIf)
809d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
810d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#if 1\n";
811d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
812d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
813d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
814d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_UNTERMINATED,
815d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
816d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "if"));
817d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
818d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
819d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
820d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
821d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
822d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.orgTEST_F(IfTest, UnterminatedIfdef)
823d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org{
824d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    const char* str = "#ifdef foo\n";
825d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, 0));
826d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
827d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    EXPECT_CALL(mDiagnostics,
828d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                print(pp::Diagnostics::CONDITIONAL_UNTERMINATED,
829d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      pp::SourceLocation(0, 1),
830d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org                      "ifdef"));
831d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
832d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    pp::Token token;
833d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    mPreprocessor.lex(&token);
834d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org}
835d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
836