17fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org//
27fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
37fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org// Use of this source code is governed by a BSD-style license that can be
47fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org// found in the LICENSE file.
57fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org//
67fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
77fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org#include "PreprocessorTest.h"
87fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org#include "Token.h"
97fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgclass DefineTest : public PreprocessorTest
117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org};
137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, NonIdentifier)
157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define 2 foo\n"
177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "2\n";
187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "2\n";
207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
227095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_UNEXPECTED_TOKEN,
237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 1),
247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "2"));
257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org};
287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
29f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, RedefinePredefined)
30f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
31f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* input = "#define __LINE__ 10\n"
32f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__LINE__\n"
33f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#define __FILE__ 20\n"
34f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__FILE__\n"
35f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#define __VERSION__ 200\n"
36f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__VERSION__\n"
37f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#define GL_ES 0\n"
38f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "GL_ES\n";
39f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* expected = "\n"
40f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "2\n"
41f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
42f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "0\n"
43f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
44f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "100\n"
45f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
46f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "1\n";
47f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
48f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
497095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED,
50f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 1),
51f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__LINE__"));
52f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
537095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED,
54f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 3),
55f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__FILE__"));
56f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
577095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED,
58f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 5),
59f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__VERSION__"));
60f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
617095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED,
62f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 7),
63f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "GL_ES"));
64f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
65f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    preprocess(input, expected);
66f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
67f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ReservedUnderScore1)
697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define __foo bar\n"
717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "__foo\n";
727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "__foo\n";
747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
767095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_NAME_RESERVED,
777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 1),
787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "__foo"));
797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ReservedUnderScore2)
847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo__bar baz\n"
867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo__bar\n";
877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo__bar\n";
897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
917095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_NAME_RESERVED,
927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 1),
937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo__bar"));
947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ReservedGL)
997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define GL_foo bar\n"
1017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "GL_foo\n";
1027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "GL_foo\n";
1047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
1067095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_NAME_RESERVED,
1077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 1),
1087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "GL_foo"));
1097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjRedefineValid)
1147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo (1-1)\n"
1167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo /* whitespace */ (1-1) /* other */ \n"
1177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
1187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
1207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(1-1)\n";
1217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    // No error or warning.
1227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    using testing::_;
1237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
1247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjRedefineInvalid)
1297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo (0)\n"
1317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo (1-1)\n"
1327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
1337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
1357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(0)\n";
1367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
1387095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_REDEFINED,
1397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 2),
1407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
1417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncRedefineValid)
1467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(a) ( a )\n"
1487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo( a )( /* whitespace */ a /* other */ )\n"
1497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(b)\n";
1507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
1527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "( b )\n";
1537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    // No error or warning.
1547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    using testing::_;
1557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
1567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncRedefineInvalid)
1617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(b) ( a )\n"
1637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo(b) ( b )\n"
1647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(1)\n";
1657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
1677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "( a )\n";
1687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
1707095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_REDEFINED,
1717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 2),
1727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
1737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjBasic)
1787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo 1\n"
1807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
1817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
1837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjEmpty)
1887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo\n"
1907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
1917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
1927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n";
1937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
1957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
1967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
1977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjChain)
1987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
1997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo 1\n"
2007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar foo\n"
2017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
2027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
2057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjChainReverse)
2107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define bar foo\n"
2127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo 1\n"
2137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
2147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
2177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjRecursive)
2227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo bar\n"
2247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar baz\n"
2257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define baz foo\n"
2267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
2277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n"
2287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "baz\n";
2297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo\n"
2337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "bar\n"
2347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "baz\n";
2357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjCompositeChain)
2407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo 1\n"
2427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar a foo\n"
2437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
2447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "a 1\n";
2477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjCompositeChainReverse)
2527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define bar a foo\n"
2547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo 1\n"
2557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
2567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "a 1\n";
2597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjCompositeRecursive)
2647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo a bar\n"
2667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar b baz\n"
2677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define baz c foo\n"
2687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
2697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n"
2707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "baz\n";
2717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "a b c foo\n"
2757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "b c a bar\n"
2767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "c a b baz\n";
2777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjChainSelfRecursive)
2827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo foo\n"
2847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar foo\n"
2857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
2867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
2877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
2887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo\n";
2897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
2917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
2927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
2937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjectLikeWithParens)
2947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
2957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo ()1\n"
2967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n"
2977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar ()2\n"
2987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar()\n";
2997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "()1()\n"
3017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
3027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "()2()\n";
3037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncEmpty)
3087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo()\n"
3107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n";
3117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n";
3137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncNoArgs)
3187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo() bar\n"
3207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n";
3217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "bar\n";
3237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncOneArgUnused)
3287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) 1\n"
3307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar)\n";
3317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
3337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncTwoArgsUnused)
3387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x,y) 1\n"
3407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar,baz)\n";
3417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
3437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncOneArg)
3487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) ((x)+1)\n"
3507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar)\n";
3517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "((bar)+1)\n";
3537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncTwoArgs)
3587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x,y) ((x)*(y))\n"
3607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar,baz)\n";
3617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "((bar)*(baz))\n";
3637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncEmptyArgs)
3687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define zero() pass\n"
3707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define one(x) pass\n"
3717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define two(x,y) pass\n"
3727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "zero()\n"
3737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "one()\n"
3747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "two(,)\n";
3757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
3777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
3787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n"
3797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n"
3807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
3817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncMacroAsParam)
3867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define x 0\n"
3887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo(x) x\n"
3897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(1)\n";
3907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
3917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
3927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n";
3937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
3957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
3967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
3977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncOneArgMulti)
3987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
3997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) (x)\n"
4007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(this is a multi-word argument)\n";
4017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(this is a multi-word argument)\n";
4037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncTwoArgsMulti)
4087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x,y) x,two fish,red fish,y\n"
4107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(one fish, blue fish)\n";
4117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "one fish,two fish,red fish,blue fish\n";
4137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncCompose)
4187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define bar(x) (1+(x))\n"
4207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo(y) (2*(y))\n"
4217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar(3))\n";
4227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(2*((1+(3))))\n";
4257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncArgWithParens)
4307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) (x)\n"
4327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(argument(with parens) FTW)\n";
4337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(argument(with parens) FTW)\n";
4357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncMacroAsNonMacro)
4407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(bar) bar\n"
4427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo bar\n";
4437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo bar\n";
4457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncExtraNewlines)
4507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(a) (a)\n"
4527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
4537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "(\n"
4547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "1\n"
4557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        ")\n";
4567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(1)\n"
4587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n";
4617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFunc)
4667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo() pass\n"
4687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar foo()\n"
4697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
4707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
4737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToNonFunc)
4787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define pass() fail\n"
4807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar pass\n"
4817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
4827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
4857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
4887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFuncWithArgs)
4907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
4917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(fail) fail\n"
4927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar foo(pass)\n"
4937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "bar\n";
4947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
4957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
4967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
4977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
4987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
4997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFuncCompose)
5027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define baz(fail) fail\n"
5047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar(fail) fail\n"
5057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo bar(baz(pass))\n"
5067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
5077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
5117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFuncParensInText1)
5167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define fail() pass\n"
5187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo fail\n"
5197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n";
5207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
5237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFuncParensInText2)
5287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define bar with,embedded,commas\n"
5307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define func(x) pass\n"
5317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo func\n"
5327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar)\n";
5337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
5377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainObjToFuncMultiLevel)
5427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) pass\n"
5447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar foo\n"
5457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define baz bar\n"
5467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define joe baz\n"
5477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "joe (fail)\n";
5487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
5537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ObjToFuncRecursive)
5587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define A(a,b) B(a,b)\n"
5607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define C A(0,C)\n"
5617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "C\n";
5627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "B(0,C)\n";
5657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, ChainFuncToFuncCompose)
5707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define baz(fail) fail\n"
5727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar(fail) fail\n"
5737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo() bar(baz(pass))\n"
5747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n";
5757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
5787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
5797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncSelfRecursive)
5847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(a) foo(2*(a))\n"
5867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(3)\n";
5877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo(2*(3))\n";
5897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
5917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
5927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
5937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncSelfCompose)
5947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
5957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(a) foo(2*(a))\n"
5967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(foo(3))\n";
5977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
5987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo(2*(foo(2*(3))))\n";
5997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncSelfComposeNonFunc)
6047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(bar) bar\n"
6067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(foo)\n";
6077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo\n";
6097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncSelfComposeNonFuncMultiTokenArg)
6147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(bar) bar\n"
6167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(1+foo)\n";
6177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1+foo\n";
6197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FinalizeUnexpandedMacro)
6247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define expand(x) expand(x once)\n"
6267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo(x) x\n"
6277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(expand(just))\n";
6287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
6307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "expand(just once)\n";
6317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6357fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncArgWithCommas)
6367fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6377fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) pass\n"
6387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(argument (with,embedded, commas) -- baz)\n";
6397fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6407fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "pass\n";
6417fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6427fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6437fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6447fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6457fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncArgObjMaroWithComma)
6467fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6477fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(a) (a)\n"
6487fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define bar two,words\n"
6497fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(bar)\n";
6507fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6517fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
6527fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "(two,words)\n";
6537fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6547fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6557fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6567fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6577fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncLeftParenInMacroRightParenInText)
6587fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6597fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define bar(a) a*2\n"
6607fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo bar(\n"
6617fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo b)\n";
6627fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6637fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
6647fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "b*2\n";
6657fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6667fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6677fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6687fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6697fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, RepeatedArg)
6707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6717fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define double(x) x x\n"
6727fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "double(1)\n";
6737fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1 1\n";
6757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncMissingRightParen)
6807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x) (2*(x))\n"
6827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(3\n";
6837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
6847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n";
6857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
6877095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_UNTERMINATED_INVOCATION,
6887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 2),
6897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
6907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
6927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
6937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
6947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, FuncIncorrectArgCount)
6957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
6967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo(x,y) ((x)+(y))\n"
6977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo()\n"
6987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(1)\n"
6997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo(1,2,3)\n";
7007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
7017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
7027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
7037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n";
7047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
7067095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_TOO_FEW_ARGS,
7077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 2),
7087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
7097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
7107095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_TOO_FEW_ARGS,
7117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 3),
7127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
7137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    EXPECT_CALL(mDiagnostics,
7147095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_TOO_MANY_ARGS,
7157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      pp::SourceLocation(0, 4),
7167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                      "foo"));
7177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
7197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
7207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, Undef)
7227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
7237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo 1\n"
7247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
7257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#undef foo\n"
7267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
7277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
7287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n"
7297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
7307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo\n";
7317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
7337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
7347fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
735f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, UndefPredefined)
736f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
737f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* input = "#undef __LINE__\n"
738f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__LINE__\n"
739f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#undef __FILE__\n"
740f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__FILE__\n"
741f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#undef __VERSION__\n"
742f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "__VERSION__\n"
743f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "#undef GL_ES\n"
744f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                        "GL_ES\n";
745f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* expected = "\n"
746f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "2\n"
747f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
748f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "0\n"
749f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
750f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "100\n"
751f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "\n"
752f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                           "1\n";
753f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
754f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
7557095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED,
756f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 1),
757f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__LINE__"));
758f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
7597095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED,
760f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 3),
761f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__FILE__"));
762f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
7637095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED,
764f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 5),
765f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__VERSION__"));
766f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_CALL(mDiagnostics,
7677095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang                print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED,
768f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      pp::SourceLocation(0, 7),
769f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "GL_ES"));
770f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
771f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    preprocess(input, expected);
772f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
773f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
7747fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, UndefRedefine)
7757fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
7767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input = "#define foo 1\n"
7777fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
7787fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#undef foo\n"
7797fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n"
7807fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "#define foo 2\n"
7817fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                        "foo\n";
7827fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected = "\n"
7837fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "1\n"
7847fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
7857fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "foo\n"
7867fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "\n"
7877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org                           "2\n";
7887fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7897fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
7907fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
7917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
7927fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.orgTEST_F(DefineTest, C99Example)
7937fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org{
7947fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* input =
7957fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define x    3          \n"
7967fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define f(a) f(x * (a)) \n"
7977fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#undef  x               \n"
7987fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define x    2          \n"
7997fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define g    f          \n"
8007fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define z    z[0]       \n"
8017fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define h    g(~        \n"
8027fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define m(a) a(w)       \n"
8037fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define w    0,1        \n"
8047fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define t(a) a          \n"
8057fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define p()  int        \n"
8067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "#define q(x) x          \n"
8077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "                        \n"
8087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);\n"
8097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "g(x+(3,4)-w) | h 5) & m\n"
8107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "    (f)^m(m);\n"
8117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "p() i[q()] = { q(1), 23, 4, 5, };\n";
8127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    const char* expected =
8137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8157fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8167fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8177fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8187fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8197fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8207fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8217fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8237fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8247fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8257fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "\n"
8267fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);\n"
8277fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))\n"
8287fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "^m(0,1);\n"
8297fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org        "int i[] = { 1, 23, 4, 5, };\n";
8307fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
8317fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org    preprocess(input, expected);
8327fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org}
8337fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org
834f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_GL_ES)
835f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
836f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* input = "GL_ES\n";
837f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* expected = "1\n";
838f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
839f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    preprocess(input, expected);
840f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
841f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
842f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_VERSION)
843f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
844f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* input = "__VERSION__\n";
845f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* expected = "100\n";
846f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
847f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    preprocess(input, expected);
848f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
849f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
850f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_LINE1)
851f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
852f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* str = "\n\n__LINE__";
853f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, NULL));
854f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
855f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    pp::Token token;
856f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    mPreprocessor.lex(&token);
857f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_EQ(pp::Token::CONST_INT, token.type);
8585b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org    EXPECT_EQ("3", token.text);
859f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
860f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
861f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_LINE2)
862f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
863f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* str = "#line 10\n"
864f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org                      "__LINE__\n";
865f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(1, &str, NULL));
866f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
867f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    pp::Token token;
868f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    mPreprocessor.lex(&token);
869f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_EQ(pp::Token::CONST_INT, token.type);
8705b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org    EXPECT_EQ("10", token.text);
871f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
872f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
873f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_FILE1)
874f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
875f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* const str[] = {"", "", "__FILE__"};
876f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(3, str, NULL));
877f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
878f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    pp::Token token;
879f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    mPreprocessor.lex(&token);
880f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_EQ(pp::Token::CONST_INT, token.type);
8815b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org    EXPECT_EQ("2", token.text);
882f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
883f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
884f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(DefineTest, Predefined_FILE2)
885f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{
886f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    const char* const str[] = {"#line 10 20\n", "__FILE__"};
887f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    ASSERT_TRUE(mPreprocessor.init(2, str, NULL));
888f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org
889f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    pp::Token token;
890f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    mPreprocessor.lex(&token);
891f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org    EXPECT_EQ(pp::Token::CONST_INT, token.type);
8925b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org    EXPECT_EQ("21", token.text);
893f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org}
894