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, 227fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 49f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_REDEFINED, 50f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 1), 51f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__LINE__")); 52f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 53f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_REDEFINED, 54f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 3), 55f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__FILE__")); 56f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 57f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_REDEFINED, 58f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 5), 59f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__VERSION__")); 60f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 61f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::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, 767fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 917fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 1067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 1387fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 1707fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 6877fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 7067fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::MACRO_TOO_FEW_ARGS, 7077fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org pp::SourceLocation(0, 2), 7087fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org "foo")); 7097fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org EXPECT_CALL(mDiagnostics, 7107fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::MACRO_TOO_FEW_ARGS, 7117fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org pp::SourceLocation(0, 3), 7127fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org "foo")); 7137fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org EXPECT_CALL(mDiagnostics, 7147fc38dddd2f5b6349348230475ca359666af583aalokp@chromium.org print(pp::Diagnostics::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, 755f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_UNDEFINED, 756f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 1), 757f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__LINE__")); 758f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 759f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_UNDEFINED, 760f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 3), 761f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__FILE__")); 762f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 763f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::MACRO_PREDEFINED_UNDEFINED, 764f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation(0, 5), 765f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "__VERSION__")); 766f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org EXPECT_CALL(mDiagnostics, 767f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org print(pp::Diagnostics::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