1b58a420fSArgyrios Kyrtzidis //===- unittests/Lex/DependencyDirectivesScannerTest.cpp ------------------===// 2b58a420fSArgyrios Kyrtzidis // 3b58a420fSArgyrios Kyrtzidis // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4b58a420fSArgyrios Kyrtzidis // See https://llvm.org/LICENSE.txt for license information. 5b58a420fSArgyrios Kyrtzidis // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b58a420fSArgyrios Kyrtzidis // 7b58a420fSArgyrios Kyrtzidis //===----------------------------------------------------------------------===// 8b58a420fSArgyrios Kyrtzidis 9b58a420fSArgyrios Kyrtzidis #include "clang/Lex/DependencyDirectivesScanner.h" 10b58a420fSArgyrios Kyrtzidis #include "llvm/ADT/SmallString.h" 11b58a420fSArgyrios Kyrtzidis #include "gtest/gtest.h" 12b58a420fSArgyrios Kyrtzidis 13b58a420fSArgyrios Kyrtzidis using namespace llvm; 14b58a420fSArgyrios Kyrtzidis using namespace clang; 15b58a420fSArgyrios Kyrtzidis using namespace clang::dependency_directives_scan; 16b58a420fSArgyrios Kyrtzidis 17b4c83a13SArgyrios Kyrtzidis static bool minimizeSourceToDependencyDirectives( 18b4c83a13SArgyrios Kyrtzidis StringRef Input, SmallVectorImpl<char> &Out, 19b4c83a13SArgyrios Kyrtzidis SmallVectorImpl<dependency_directives_scan::Token> &Tokens, 200559eaffSNishith Kumar M Shah SmallVectorImpl<Directive> &Directives) { 21b4c83a13SArgyrios Kyrtzidis Out.clear(); 22b4c83a13SArgyrios Kyrtzidis Tokens.clear(); 23b4c83a13SArgyrios Kyrtzidis Directives.clear(); 240559eaffSNishith Kumar M Shah if (scanSourceForDependencyDirectives(Input, Tokens, Directives)) 25b4c83a13SArgyrios Kyrtzidis return true; 26b4c83a13SArgyrios Kyrtzidis 27b4c83a13SArgyrios Kyrtzidis raw_svector_ostream OS(Out); 28b4c83a13SArgyrios Kyrtzidis printDependencyDirectivesAsSource(Input, Directives, OS); 29b4c83a13SArgyrios Kyrtzidis if (!Out.empty() && Out.back() != '\n') 30b4c83a13SArgyrios Kyrtzidis Out.push_back('\n'); 31b4c83a13SArgyrios Kyrtzidis Out.push_back('\0'); 32b4c83a13SArgyrios Kyrtzidis Out.pop_back(); 33b4c83a13SArgyrios Kyrtzidis 34b4c83a13SArgyrios Kyrtzidis return false; 35b58a420fSArgyrios Kyrtzidis } 36b58a420fSArgyrios Kyrtzidis 37b4c83a13SArgyrios Kyrtzidis static bool minimizeSourceToDependencyDirectives(StringRef Input, 38b4c83a13SArgyrios Kyrtzidis SmallVectorImpl<char> &Out) { 39b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 16> Tokens; 40b4c83a13SArgyrios Kyrtzidis SmallVector<Directive, 32> Directives; 410559eaffSNishith Kumar M Shah return minimizeSourceToDependencyDirectives(Input, Out, Tokens, Directives); 42b58a420fSArgyrios Kyrtzidis } 43b58a420fSArgyrios Kyrtzidis 44b58a420fSArgyrios Kyrtzidis namespace { 45b58a420fSArgyrios Kyrtzidis 46b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Empty) { 47b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 48b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 4> Tokens; 49b58a420fSArgyrios Kyrtzidis SmallVector<Directive, 4> Directives; 50b58a420fSArgyrios Kyrtzidis 510559eaffSNishith Kumar M Shah ASSERT_FALSE( 520559eaffSNishith Kumar M Shah minimizeSourceToDependencyDirectives("", Out, Tokens, Directives)); 53b58a420fSArgyrios Kyrtzidis EXPECT_TRUE(Out.empty()); 54b4c83a13SArgyrios Kyrtzidis EXPECT_TRUE(Tokens.empty()); 55b58a420fSArgyrios Kyrtzidis ASSERT_EQ(1u, Directives.size()); 56b58a420fSArgyrios Kyrtzidis ASSERT_EQ(pp_eof, Directives.back().Kind); 57b58a420fSArgyrios Kyrtzidis 58b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("abc def\nxyz", Out, Tokens, 590559eaffSNishith Kumar M Shah Directives)); 60aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 61b4c83a13SArgyrios Kyrtzidis EXPECT_TRUE(Tokens.empty()); 62aa484c90SArgyrios Kyrtzidis ASSERT_EQ(2u, Directives.size()); 63aa484c90SArgyrios Kyrtzidis EXPECT_EQ(tokens_present_before_eof, Directives[0].Kind); 64aa484c90SArgyrios Kyrtzidis EXPECT_EQ(pp_eof, Directives[1].Kind); 65b58a420fSArgyrios Kyrtzidis } 66b58a420fSArgyrios Kyrtzidis 67b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) { 68b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 69b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 4> Tokens; 70b58a420fSArgyrios Kyrtzidis SmallVector<Directive, 4> Directives; 71b58a420fSArgyrios Kyrtzidis 72b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 73b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define A\n" 74b58a420fSArgyrios Kyrtzidis "#undef A\n" 75b58a420fSArgyrios Kyrtzidis "#endif\n" 76b58a420fSArgyrios Kyrtzidis "#if A\n" 77b58a420fSArgyrios Kyrtzidis "#ifdef A\n" 78b58a420fSArgyrios Kyrtzidis "#ifndef A\n" 79b58a420fSArgyrios Kyrtzidis "#elifdef A\n" 80b58a420fSArgyrios Kyrtzidis "#elifndef A\n" 81b58a420fSArgyrios Kyrtzidis "#elif A\n" 82b58a420fSArgyrios Kyrtzidis "#else\n" 83b58a420fSArgyrios Kyrtzidis "#include <A>\n" 84b58a420fSArgyrios Kyrtzidis "#include_next <A>\n" 85b58a420fSArgyrios Kyrtzidis "#__include_macros <A>\n" 86b58a420fSArgyrios Kyrtzidis "#import <A>\n" 87b58a420fSArgyrios Kyrtzidis "@import A;\n" 88b58a420fSArgyrios Kyrtzidis "#pragma clang module import A\n" 89b58a420fSArgyrios Kyrtzidis "#pragma push_macro(A)\n" 90b58a420fSArgyrios Kyrtzidis "#pragma pop_macro(A)\n" 91b58a420fSArgyrios Kyrtzidis "#pragma include_alias(<A>, <B>)\n" 92b58a420fSArgyrios Kyrtzidis "export module m;\n" 937b492d1bSBen Langmuir "import m;\n" 947b492d1bSBen Langmuir "#pragma clang system_header\n", 950559eaffSNishith Kumar M Shah Out, Tokens, Directives)); 96b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_define, Directives[0].Kind); 97b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_undef, Directives[1].Kind); 98b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_endif, Directives[2].Kind); 99b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_if, Directives[3].Kind); 100b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_ifdef, Directives[4].Kind); 101b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_ifndef, Directives[5].Kind); 102b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_elifdef, Directives[6].Kind); 103b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_elifndef, Directives[7].Kind); 104b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_elif, Directives[8].Kind); 105b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_else, Directives[9].Kind); 106b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_include, Directives[10].Kind); 107b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_include_next, Directives[11].Kind); 108b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp___include_macros, Directives[12].Kind); 109b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_import, Directives[13].Kind); 110b58a420fSArgyrios Kyrtzidis EXPECT_EQ(decl_at_import, Directives[14].Kind); 111b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_pragma_import, Directives[15].Kind); 112b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_pragma_push_macro, Directives[16].Kind); 113b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_pragma_pop_macro, Directives[17].Kind); 114b58a420fSArgyrios Kyrtzidis EXPECT_EQ(pp_pragma_include_alias, Directives[18].Kind); 115b4c83a13SArgyrios Kyrtzidis EXPECT_EQ(cxx_export_module_decl, Directives[19].Kind); 116b4c83a13SArgyrios Kyrtzidis EXPECT_EQ(cxx_import_decl, Directives[20].Kind); 1177b492d1bSBen Langmuir EXPECT_EQ(pp_pragma_system_header, Directives[21].Kind); 1187b492d1bSBen Langmuir EXPECT_EQ(pp_eof, Directives[22].Kind); 119b4c83a13SArgyrios Kyrtzidis } 120b4c83a13SArgyrios Kyrtzidis 121b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyHash) { 122b4c83a13SArgyrios Kyrtzidis SmallVector<char, 128> Out; 123b4c83a13SArgyrios Kyrtzidis 124b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE( 125b4c83a13SArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#\n#define MACRO a\n", Out)); 126b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO a\n", Out.data()); 127b58a420fSArgyrios Kyrtzidis } 128b58a420fSArgyrios Kyrtzidis 129b340c5aeSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, HashHash) { 130b340c5aeSArgyrios Kyrtzidis SmallVector<char, 128> Out; 131b340c5aeSArgyrios Kyrtzidis 132b340c5aeSArgyrios Kyrtzidis StringRef Source = R"( 133b340c5aeSArgyrios Kyrtzidis #define S 134b340c5aeSArgyrios Kyrtzidis #if 0 135b340c5aeSArgyrios Kyrtzidis ##pragma cool 136b340c5aeSArgyrios Kyrtzidis ##include "t.h" 137b340c5aeSArgyrios Kyrtzidis #endif 138b340c5aeSArgyrios Kyrtzidis #define E 139b340c5aeSArgyrios Kyrtzidis )"; 140b340c5aeSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 141b340c5aeSArgyrios Kyrtzidis EXPECT_STREQ("#define S\n#if 0\n#endif\n#define E\n", Out.data()); 142b340c5aeSArgyrios Kyrtzidis } 143b340c5aeSArgyrios Kyrtzidis 144b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Define) { 145b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 146b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 4> Tokens; 147b58a420fSArgyrios Kyrtzidis SmallVector<Directive, 4> Directives; 148b58a420fSArgyrios Kyrtzidis 1490559eaffSNishith Kumar M Shah ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO", Out, 1500559eaffSNishith Kumar M Shah Tokens, Directives)); 151b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO\n", Out.data()); 152b4c83a13SArgyrios Kyrtzidis ASSERT_EQ(4u, Tokens.size()); 153b58a420fSArgyrios Kyrtzidis ASSERT_EQ(2u, Directives.size()); 154b58a420fSArgyrios Kyrtzidis ASSERT_EQ(pp_define, Directives.front().Kind); 155b58a420fSArgyrios Kyrtzidis } 156b58a420fSArgyrios Kyrtzidis 157b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineSpacing) { 158b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 159b58a420fSArgyrios Kyrtzidis 160b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 161b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO\n\n\n", Out)); 162b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO\n", Out.data()); 163b58a420fSArgyrios Kyrtzidis 164b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 165b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO \n\n\n", Out)); 166b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO\n", Out.data()); 167b58a420fSArgyrios Kyrtzidis 168b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 169b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO a \n\n\n", Out)); 170b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO a\n", Out.data()); 171b58a420fSArgyrios Kyrtzidis 172b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 173b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO\n\n\n", Out)); 174b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO\n", Out.data()); 175b58a420fSArgyrios Kyrtzidis } 176b58a420fSArgyrios Kyrtzidis 177b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMacroArguments) { 178b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 179b58a420fSArgyrios Kyrtzidis 180b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO()", Out)); 181b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO()\n", Out.data()); 182b58a420fSArgyrios Kyrtzidis 183b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 184b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a, b...)", Out)); 185b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b...)\n", Out.data()); 186b58a420fSArgyrios Kyrtzidis 187b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 188b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO content", Out)); 189b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO content\n", Out.data()); 190b58a420fSArgyrios Kyrtzidis 191b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 192b58a420fSArgyrios Kyrtzidis "#define MACRO con tent ", Out)); 193b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO con tent\n", Out.data()); 194b58a420fSArgyrios Kyrtzidis 195b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 196b58a420fSArgyrios Kyrtzidis "#define MACRO() con tent ", Out)); 197b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO() con tent\n", Out.data()); 198b58a420fSArgyrios Kyrtzidis } 199b58a420fSArgyrios Kyrtzidis 200b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineInvalidMacroArguments) { 201b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 202b58a420fSArgyrios Kyrtzidis 203b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO((a))", Out)); 204b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO((a))\n", Out.data()); 205b58a420fSArgyrios Kyrtzidis 206b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO(", Out)); 207b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(\n", Out.data()); 208b58a420fSArgyrios Kyrtzidis 209b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 210b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a * b)", Out)); 211b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a*b)\n", Out.data()); 212b58a420fSArgyrios Kyrtzidis } 213b58a420fSArgyrios Kyrtzidis 214b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineHorizontalWhitespace) { 215b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 216b58a420fSArgyrios Kyrtzidis 217b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 218b58a420fSArgyrios Kyrtzidis "#define MACRO(\t)\tcon \t tent\t", Out)); 219b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO() con tent\n", Out.data()); 220b58a420fSArgyrios Kyrtzidis 221b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 222b58a420fSArgyrios Kyrtzidis "#define MACRO(\f)\fcon \f tent\f", Out)); 223b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO() con tent\n", Out.data()); 224b58a420fSArgyrios Kyrtzidis 225b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 226b58a420fSArgyrios Kyrtzidis "#define MACRO(\v)\vcon \v tent\v", Out)); 227b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO() con tent\n", Out.data()); 228b58a420fSArgyrios Kyrtzidis 229b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 230b58a420fSArgyrios Kyrtzidis "#define MACRO \t\v\f\v\t con\f\t\vtent\v\f \v", Out)); 231b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO con tent\n", Out.data()); 232b58a420fSArgyrios Kyrtzidis } 233b58a420fSArgyrios Kyrtzidis 234b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgs) { 235b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 236b58a420fSArgyrios Kyrtzidis 237b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 238b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a \\\n" 239b58a420fSArgyrios Kyrtzidis " )", 240b58a420fSArgyrios Kyrtzidis Out)); 241b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a)\n", Out.data()); 242b58a420fSArgyrios Kyrtzidis 243b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 244b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a, \\\n" 245b58a420fSArgyrios Kyrtzidis " b) \\\n" 246b58a420fSArgyrios Kyrtzidis " call((a), \\\n" 247b58a420fSArgyrios Kyrtzidis " (b))", 248b58a420fSArgyrios Kyrtzidis Out)); 249b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); 250b58a420fSArgyrios Kyrtzidis } 251b58a420fSArgyrios Kyrtzidis 252b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 253b58a420fSArgyrios Kyrtzidis DefineMultilineArgsCarriageReturn) { 254b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 255b58a420fSArgyrios Kyrtzidis 256b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 257b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a, \\\r" 258b58a420fSArgyrios Kyrtzidis " b) \\\r" 259b58a420fSArgyrios Kyrtzidis " call((a), \\\r" 260b58a420fSArgyrios Kyrtzidis " (b))", 261b58a420fSArgyrios Kyrtzidis Out)); 262b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); 263b58a420fSArgyrios Kyrtzidis } 264b58a420fSArgyrios Kyrtzidis 265b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgsStringize) { 266b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 267b58a420fSArgyrios Kyrtzidis 268b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO(a,b) \\\n" 269b58a420fSArgyrios Kyrtzidis " #a \\\n" 270b58a420fSArgyrios Kyrtzidis " #b", 271b58a420fSArgyrios Kyrtzidis Out)); 272b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b) #a #b\n", Out.data()); 273b58a420fSArgyrios Kyrtzidis } 274b58a420fSArgyrios Kyrtzidis 275b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 276b58a420fSArgyrios Kyrtzidis DefineMultilineArgsCarriageReturnNewline) { 277b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 278b58a420fSArgyrios Kyrtzidis 279b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 280b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a, \\\r\n" 281b58a420fSArgyrios Kyrtzidis " b) \\\r\n" 282b58a420fSArgyrios Kyrtzidis " call((a), \\\r\n" 283b58a420fSArgyrios Kyrtzidis " (b))", 284b58a420fSArgyrios Kyrtzidis Out)); 285b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); 286b58a420fSArgyrios Kyrtzidis } 287b58a420fSArgyrios Kyrtzidis 288b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 289b58a420fSArgyrios Kyrtzidis DefineMultilineArgsNewlineCarriageReturn) { 290b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 291b58a420fSArgyrios Kyrtzidis 292b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 293b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO(a, \\\n\r" 294b58a420fSArgyrios Kyrtzidis " b) \\\n\r" 295b58a420fSArgyrios Kyrtzidis " call((a), \\\n\r" 296b58a420fSArgyrios Kyrtzidis " (b))", 297b58a420fSArgyrios Kyrtzidis Out)); 298b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data()); 299b58a420fSArgyrios Kyrtzidis } 300b58a420fSArgyrios Kyrtzidis 301b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNumber) { 302b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 303b58a420fSArgyrios Kyrtzidis 304b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define 0\n", Out)); 305b58a420fSArgyrios Kyrtzidis } 306b58a420fSArgyrios Kyrtzidis 307b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNoName) { 308b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 309b58a420fSArgyrios Kyrtzidis 310b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define &\n", Out)); 311b58a420fSArgyrios Kyrtzidis } 312b58a420fSArgyrios Kyrtzidis 313b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNoWhitespace) { 314b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 315b58a420fSArgyrios Kyrtzidis 316b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define AND&\n", Out)); 317b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define AND&\n", Out.data()); 318b58a420fSArgyrios Kyrtzidis 319b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define AND\\\n" 320b58a420fSArgyrios Kyrtzidis "&\n", 321b58a420fSArgyrios Kyrtzidis Out)); 322b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define AND\\\n" 323b4c83a13SArgyrios Kyrtzidis "&\n", 324b4c83a13SArgyrios Kyrtzidis Out.data()); 325b58a420fSArgyrios Kyrtzidis } 326b58a420fSArgyrios Kyrtzidis 327b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, MultilineComment) { 328b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 329b58a420fSArgyrios Kyrtzidis 330b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 331b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#define MACRO a/*\n" 332b58a420fSArgyrios Kyrtzidis " /*\n" 333b58a420fSArgyrios Kyrtzidis "#define MISSING abc\n" 334b58a420fSArgyrios Kyrtzidis " /*\n" 335b58a420fSArgyrios Kyrtzidis " /* something */ \n" 336b58a420fSArgyrios Kyrtzidis "#include /* \"def\" */ <abc> \n", 337b58a420fSArgyrios Kyrtzidis Out)); 338b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO a\n" 339b58a420fSArgyrios Kyrtzidis "#include <abc>\n", 340b58a420fSArgyrios Kyrtzidis Out.data()); 341b58a420fSArgyrios Kyrtzidis } 342b58a420fSArgyrios Kyrtzidis 343b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, MultilineCommentInStrings) { 344b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 345b58a420fSArgyrios Kyrtzidis 346b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO1 \"/*\"\n" 347b58a420fSArgyrios Kyrtzidis "#define MACRO2 \"*/\"\n", 348b58a420fSArgyrios Kyrtzidis Out)); 349b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO1 \"/*\"\n" 350b58a420fSArgyrios Kyrtzidis "#define MACRO2 \"*/\"\n", 351b58a420fSArgyrios Kyrtzidis Out.data()); 352b58a420fSArgyrios Kyrtzidis } 353b58a420fSArgyrios Kyrtzidis 354b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CommentSlashSlashStar) { 355b4c83a13SArgyrios Kyrtzidis SmallVector<char, 128> Out; 356b4c83a13SArgyrios Kyrtzidis 357b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 358b4c83a13SArgyrios Kyrtzidis "#define MACRO 1 //* blah */\n", Out)); 359b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define MACRO 1\n", Out.data()); 360b4c83a13SArgyrios Kyrtzidis } 361b4c83a13SArgyrios Kyrtzidis 362b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Ifdef) { 363b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 364b58a420fSArgyrios Kyrtzidis 365b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 366b58a420fSArgyrios Kyrtzidis "#define B\n" 367b58a420fSArgyrios Kyrtzidis "#endif\n", 368b58a420fSArgyrios Kyrtzidis Out)); 369b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 370b58a420fSArgyrios Kyrtzidis "#define B\n" 371b58a420fSArgyrios Kyrtzidis "#endif\n", 372b58a420fSArgyrios Kyrtzidis Out.data()); 373b58a420fSArgyrios Kyrtzidis 374b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 375b58a420fSArgyrios Kyrtzidis "#define B\n" 376b58a420fSArgyrios Kyrtzidis "#elif B\n" 377b58a420fSArgyrios Kyrtzidis "#define C\n" 378b58a420fSArgyrios Kyrtzidis "#elif C\n" 379b58a420fSArgyrios Kyrtzidis "#define D\n" 380b58a420fSArgyrios Kyrtzidis "#else\n" 381b58a420fSArgyrios Kyrtzidis "#define E\n" 382b58a420fSArgyrios Kyrtzidis "#endif\n", 383b58a420fSArgyrios Kyrtzidis Out)); 384b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 385b58a420fSArgyrios Kyrtzidis "#define B\n" 386b58a420fSArgyrios Kyrtzidis "#elif B\n" 387b58a420fSArgyrios Kyrtzidis "#define C\n" 388b58a420fSArgyrios Kyrtzidis "#elif C\n" 389b58a420fSArgyrios Kyrtzidis "#define D\n" 390b58a420fSArgyrios Kyrtzidis "#else\n" 391b58a420fSArgyrios Kyrtzidis "#define E\n" 392b58a420fSArgyrios Kyrtzidis "#endif\n", 393b58a420fSArgyrios Kyrtzidis Out.data()); 394b58a420fSArgyrios Kyrtzidis } 395b58a420fSArgyrios Kyrtzidis 396b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Elifdef) { 397b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 398b58a420fSArgyrios Kyrtzidis 399b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 400b58a420fSArgyrios Kyrtzidis "#define B\n" 401b58a420fSArgyrios Kyrtzidis "#elifdef C\n" 402b58a420fSArgyrios Kyrtzidis "#define D\n" 403b58a420fSArgyrios Kyrtzidis "#endif\n", 404b58a420fSArgyrios Kyrtzidis Out)); 405b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 406b58a420fSArgyrios Kyrtzidis "#define B\n" 407b58a420fSArgyrios Kyrtzidis "#elifdef C\n" 408b58a420fSArgyrios Kyrtzidis "#define D\n" 409b58a420fSArgyrios Kyrtzidis "#endif\n", 410b58a420fSArgyrios Kyrtzidis Out.data()); 411b58a420fSArgyrios Kyrtzidis 412b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 413b58a420fSArgyrios Kyrtzidis "#define B\n" 414b58a420fSArgyrios Kyrtzidis "#elifdef B\n" 415b58a420fSArgyrios Kyrtzidis "#define C\n" 416b58a420fSArgyrios Kyrtzidis "#elifndef C\n" 417b58a420fSArgyrios Kyrtzidis "#define D\n" 418b58a420fSArgyrios Kyrtzidis "#else\n" 419b58a420fSArgyrios Kyrtzidis "#define E\n" 420b58a420fSArgyrios Kyrtzidis "#endif\n", 421b58a420fSArgyrios Kyrtzidis Out)); 422b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 423b58a420fSArgyrios Kyrtzidis "#define B\n" 424b58a420fSArgyrios Kyrtzidis "#elifdef B\n" 425b58a420fSArgyrios Kyrtzidis "#define C\n" 426b58a420fSArgyrios Kyrtzidis "#elifndef C\n" 427b58a420fSArgyrios Kyrtzidis "#define D\n" 428b58a420fSArgyrios Kyrtzidis "#else\n" 429b58a420fSArgyrios Kyrtzidis "#define E\n" 430b58a420fSArgyrios Kyrtzidis "#endif\n", 431b58a420fSArgyrios Kyrtzidis Out.data()); 432b58a420fSArgyrios Kyrtzidis } 433b58a420fSArgyrios Kyrtzidis 434b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyIfdef) { 435b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 436b58a420fSArgyrios Kyrtzidis 437b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 438b58a420fSArgyrios Kyrtzidis "void skip();\n" 439b58a420fSArgyrios Kyrtzidis "#elif B\n" 440b58a420fSArgyrios Kyrtzidis "#elif C\n" 441b58a420fSArgyrios Kyrtzidis "#else D\n" 442b58a420fSArgyrios Kyrtzidis "#endif\n", 443b58a420fSArgyrios Kyrtzidis Out)); 444b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 445b58a420fSArgyrios Kyrtzidis "#elif B\n" 446b58a420fSArgyrios Kyrtzidis "#elif C\n" 447b58a420fSArgyrios Kyrtzidis "#endif\n", 448b58a420fSArgyrios Kyrtzidis Out.data()); 449b58a420fSArgyrios Kyrtzidis } 450b58a420fSArgyrios Kyrtzidis 451b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyElifdef) { 452b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 453b58a420fSArgyrios Kyrtzidis 454b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 455b58a420fSArgyrios Kyrtzidis "void skip();\n" 456b58a420fSArgyrios Kyrtzidis "#elifdef B\n" 457b58a420fSArgyrios Kyrtzidis "#elifndef C\n" 458b58a420fSArgyrios Kyrtzidis "#else D\n" 459b58a420fSArgyrios Kyrtzidis "#endif\n", 460b58a420fSArgyrios Kyrtzidis Out)); 461b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 462b58a420fSArgyrios Kyrtzidis "#elifdef B\n" 463b58a420fSArgyrios Kyrtzidis "#elifndef C\n" 464b58a420fSArgyrios Kyrtzidis "#endif\n", 465b58a420fSArgyrios Kyrtzidis Out.data()); 466b58a420fSArgyrios Kyrtzidis } 467b58a420fSArgyrios Kyrtzidis 468b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Pragma) { 469b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 470b58a420fSArgyrios Kyrtzidis 471b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#pragma A\n", Out)); 472aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 473b58a420fSArgyrios Kyrtzidis 474b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 475b58a420fSArgyrios Kyrtzidis "#pragma push_macro(\"MACRO\")\n", Out)); 476b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#pragma push_macro(\"MACRO\")\n", Out.data()); 477b58a420fSArgyrios Kyrtzidis 478b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 479b58a420fSArgyrios Kyrtzidis "#pragma pop_macro(\"MACRO\")\n", Out)); 480b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#pragma pop_macro(\"MACRO\")\n", Out.data()); 481b58a420fSArgyrios Kyrtzidis 482b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 483b58a420fSArgyrios Kyrtzidis "#pragma include_alias(\"A\", \"B\")\n", Out)); 484b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#pragma include_alias(\"A\", \"B\")\n", Out.data()); 485b58a420fSArgyrios Kyrtzidis 486b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 487b58a420fSArgyrios Kyrtzidis "#pragma include_alias(<A>, <B>)\n", Out)); 488b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#pragma include_alias(<A>, <B>)\n", Out.data()); 489b58a420fSArgyrios Kyrtzidis 490b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#pragma clang\n", Out)); 491aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 492b58a420fSArgyrios Kyrtzidis 493b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 494b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#pragma clang module\n", Out)); 495aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 496b58a420fSArgyrios Kyrtzidis 497b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 498b58a420fSArgyrios Kyrtzidis "#pragma clang module impor\n", Out)); 499aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 500b58a420fSArgyrios Kyrtzidis 501b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 502b58a420fSArgyrios Kyrtzidis "#pragma clang module import\n", Out)); 503b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#pragma clang module import\n", Out.data()); 504b58a420fSArgyrios Kyrtzidis } 505b58a420fSArgyrios Kyrtzidis 506ee8ed0b3SBen Langmuir TEST(MinimizeSourceToDependencyDirectivesTest, UnderscorePragma) { 507ee8ed0b3SBen Langmuir SmallVector<char, 128> Out; 508ee8ed0b3SBen Langmuir 509ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_)", Out)); 510ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 511ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_Pragma)", Out)); 512ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 513ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_Pragma()", Out)); 514ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 515ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_Pragma())", Out)); 516ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 517ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_Pragma(")", Out)); 518ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 519ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives(R"(_Pragma("A"))", Out)); 520ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 521ee8ed0b3SBen Langmuir 522ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 523ee8ed0b3SBen Langmuir R"x(_Pragma("push_macro(\"MACRO\")"))x", Out)); 524ee8ed0b3SBen Langmuir EXPECT_STREQ(R"x(_Pragma("push_macro(\"MACRO\")"))x" 525ee8ed0b3SBen Langmuir "\n", 526ee8ed0b3SBen Langmuir Out.data()); 527ee8ed0b3SBen Langmuir 528ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 529ee8ed0b3SBen Langmuir R"x(_Pragma("pop_macro(\"MACRO\")"))x", Out)); 530ee8ed0b3SBen Langmuir EXPECT_STREQ(R"x(_Pragma("pop_macro(\"MACRO\")"))x" 531ee8ed0b3SBen Langmuir "\n", 532ee8ed0b3SBen Langmuir Out.data()); 533ee8ed0b3SBen Langmuir 534ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 535ee8ed0b3SBen Langmuir R"x(_Pragma("include_alias(\"A\", \"B\")"))x", Out)); 536ee8ed0b3SBen Langmuir EXPECT_STREQ(R"x(_Pragma("include_alias(\"A\", \"B\")"))x" 537ee8ed0b3SBen Langmuir "\n", 538ee8ed0b3SBen Langmuir Out.data()); 539ee8ed0b3SBen Langmuir 540ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 541ee8ed0b3SBen Langmuir R"x(_Pragma("include_alias(<A>, <B>)"))x", Out)); 542ee8ed0b3SBen Langmuir EXPECT_STREQ(R"x(_Pragma("include_alias(<A>, <B>)"))x" 543ee8ed0b3SBen Langmuir "\n", 544ee8ed0b3SBen Langmuir Out.data()); 545ee8ed0b3SBen Langmuir 546ee8ed0b3SBen Langmuir ASSERT_FALSE( 547ee8ed0b3SBen Langmuir minimizeSourceToDependencyDirectives(R"(_Pragma("clang"))", Out)); 548ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 549ee8ed0b3SBen Langmuir 550ee8ed0b3SBen Langmuir ASSERT_FALSE( 551ee8ed0b3SBen Langmuir minimizeSourceToDependencyDirectives(R"(_Pragma("clang module"))", Out)); 552ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 553ee8ed0b3SBen Langmuir 554ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 555ee8ed0b3SBen Langmuir R"(_Pragma("clang module impor"))", Out)); 556ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 557ee8ed0b3SBen Langmuir 558ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 559ee8ed0b3SBen Langmuir R"(_Pragma("clang module import"))", Out)); 560ee8ed0b3SBen Langmuir EXPECT_STREQ(R"(_Pragma("clang module import"))" 561ee8ed0b3SBen Langmuir "\n", 562ee8ed0b3SBen Langmuir Out.data()); 563ee8ed0b3SBen Langmuir 564ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 565ee8ed0b3SBen Langmuir R"(_Pragma("clang \ 566ee8ed0b3SBen Langmuir module \ 567ee8ed0b3SBen Langmuir import"))", 568ee8ed0b3SBen Langmuir Out)); 569ee8ed0b3SBen Langmuir EXPECT_STREQ(R"(_Pragma("clang \ 570ee8ed0b3SBen Langmuir module \ 571ee8ed0b3SBen Langmuir import"))" 572ee8ed0b3SBen Langmuir "\n", 573ee8ed0b3SBen Langmuir Out.data()); 574ee8ed0b3SBen Langmuir 575ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 576ee8ed0b3SBen Langmuir R"(_Pragma(L"clang module import"))", Out)); 577ee8ed0b3SBen Langmuir EXPECT_STREQ(R"(_Pragma(L"clang module import"))" 578ee8ed0b3SBen Langmuir "\n", 579ee8ed0b3SBen Langmuir Out.data()); 580ee8ed0b3SBen Langmuir 581ee8ed0b3SBen Langmuir // FIXME: u"" strings depend on using C11 language mode 582ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 583ee8ed0b3SBen Langmuir R"(_Pragma(u"clang module import"))", Out)); 584ee8ed0b3SBen Langmuir EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 585ee8ed0b3SBen Langmuir 586e4646840SSirraide // R"()" strings are enabled by default. 587ee8ed0b3SBen Langmuir ASSERT_FALSE(minimizeSourceToDependencyDirectives( 588ee8ed0b3SBen Langmuir R"(_Pragma(R"abc(clang module import)abc"))", Out)); 589e4646840SSirraide EXPECT_STREQ(R"(_Pragma(R"abc(clang module import)abc"))" 590e4646840SSirraide "\n", 591e4646840SSirraide Out.data()); 592ee8ed0b3SBen Langmuir } 593ee8ed0b3SBen Langmuir 594b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Include) { 595b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 596b58a420fSArgyrios Kyrtzidis 597b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include \"A\"\n", Out)); 598b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include \"A\"\n", Out.data()); 599b58a420fSArgyrios Kyrtzidis 600b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include <A>\n", Out)); 601b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <A>\n", Out.data()); 602b58a420fSArgyrios Kyrtzidis 603b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 604b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#include <A//A.h>\n", Out)); 605b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <A//A.h>\n", Out.data()); 606b58a420fSArgyrios Kyrtzidis 607b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 608b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#include \"A//A.h\"\n", Out)); 609b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include \"A//A.h\"\n", Out.data()); 610b58a420fSArgyrios Kyrtzidis 611b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 612b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#include_next <A>\n", Out)); 613b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include_next <A>\n", Out.data()); 614b58a420fSArgyrios Kyrtzidis 615b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#import <A>\n", Out)); 616b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#import <A>\n", Out.data()); 617b58a420fSArgyrios Kyrtzidis 618b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#import <A//A.h>\n", Out)); 619b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#import <A//A.h>\n", Out.data()); 620b58a420fSArgyrios Kyrtzidis 621b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 622b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#import \"A//A.h\"\n", Out)); 623b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#import \"A//A.h\"\n", Out.data()); 624b58a420fSArgyrios Kyrtzidis 625b58a420fSArgyrios Kyrtzidis ASSERT_FALSE( 626b58a420fSArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("#__include_macros <A>\n", Out)); 627b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#__include_macros <A>\n", Out.data()); 628b4c83a13SArgyrios Kyrtzidis 629b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include MACRO\n", Out)); 630b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#include MACRO\n", Out.data()); 631b58a420fSArgyrios Kyrtzidis } 632b58a420fSArgyrios Kyrtzidis 633b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AtImport) { 634b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 635b58a420fSArgyrios Kyrtzidis 636b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A;\n", Out)); 637b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("@import A;\n", Out.data()); 638b58a420fSArgyrios Kyrtzidis 639b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(" @ import A;\n", Out)); 640b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("@import A;\n", Out.data()); 641b58a420fSArgyrios Kyrtzidis 642b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A\n;", Out)); 643b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("@import A;\n", Out.data()); 644b58a420fSArgyrios Kyrtzidis 645b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A.B;\n", Out)); 646b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("@import A.B;\n", Out.data()); 647b58a420fSArgyrios Kyrtzidis 648b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives( 649b58a420fSArgyrios Kyrtzidis "@import /*x*/ A /*x*/ . /*x*/ B /*x*/ \n /*x*/ ; /*x*/", Out)); 650b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("@import A.B;\n", Out.data()); 651b58a420fSArgyrios Kyrtzidis } 652b58a420fSArgyrios Kyrtzidis 65334ab8558SCyndy Ishida TEST(MinimizeSourceToDependencyDirectivesTest, EmptyIncludesAndImports) { 65434ab8558SCyndy Ishida SmallVector<char, 128> Out; 65534ab8558SCyndy Ishida 656*d19e71dbSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#import\n", Out)); 657*d19e71dbSArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 658*d19e71dbSArgyrios Kyrtzidis 659*d19e71dbSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include\n", Out)); 660*d19e71dbSArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 661*d19e71dbSArgyrios Kyrtzidis 662*d19e71dbSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 66334ab8558SCyndy Ishida "#import \n" 66434ab8558SCyndy Ishida "#endif\n", 66534ab8558SCyndy Ishida Out)); 666*d19e71dbSArgyrios Kyrtzidis // The ifdef block is removed because it's "empty". 667*d19e71dbSArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 668*d19e71dbSArgyrios Kyrtzidis 669*d19e71dbSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n" 670*d19e71dbSArgyrios Kyrtzidis "#import \n" 671*d19e71dbSArgyrios Kyrtzidis "#define B\n" 672*d19e71dbSArgyrios Kyrtzidis "#endif\n", 673*d19e71dbSArgyrios Kyrtzidis Out)); 674*d19e71dbSArgyrios Kyrtzidis EXPECT_STREQ("#ifdef A\n" 675*d19e71dbSArgyrios Kyrtzidis "#define B\n" 676*d19e71dbSArgyrios Kyrtzidis "#endif\n", 677*d19e71dbSArgyrios Kyrtzidis Out.data()); 67834ab8558SCyndy Ishida } 67934ab8558SCyndy Ishida 680b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AtImportFailures) { 681b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 682b58a420fSArgyrios Kyrtzidis 683b58a420fSArgyrios Kyrtzidis ASSERT_TRUE(minimizeSourceToDependencyDirectives("@import A\n", Out)); 684b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE( 685b4c83a13SArgyrios Kyrtzidis minimizeSourceToDependencyDirectives("@import MACRO(A);\n", Out)); 686b4c83a13SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import \" \";\n", Out)); 687b58a420fSArgyrios Kyrtzidis } 688b58a420fSArgyrios Kyrtzidis 689b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, RawStringLiteral) { 690b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 691b58a420fSArgyrios Kyrtzidis 692b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifndef GUARD\n" 693b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 694b58a420fSArgyrios Kyrtzidis "R\"()\"\n" 695b58a420fSArgyrios Kyrtzidis "#endif\n", 696b58a420fSArgyrios Kyrtzidis Out)); 697b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifndef GUARD\n" 698b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 699b58a420fSArgyrios Kyrtzidis "#endif\n", 700b58a420fSArgyrios Kyrtzidis Out.data()); 701b58a420fSArgyrios Kyrtzidis 702b58a420fSArgyrios Kyrtzidis bool RawStringLiteralResult = minimizeSourceToDependencyDirectives( 703b58a420fSArgyrios Kyrtzidis "#ifndef GUARD\n" 704b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 705b58a420fSArgyrios Kyrtzidis R"raw(static constexpr char bytes[] = R"(-?:\,[]{}#&*!|>'"%@`)";)raw" 706b58a420fSArgyrios Kyrtzidis "\n" 707b58a420fSArgyrios Kyrtzidis "#endif\n", 708b58a420fSArgyrios Kyrtzidis Out); 709b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(RawStringLiteralResult); 710b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifndef GUARD\n" 711b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 712b58a420fSArgyrios Kyrtzidis "#endif\n", 713b58a420fSArgyrios Kyrtzidis Out.data()); 714b58a420fSArgyrios Kyrtzidis 715b58a420fSArgyrios Kyrtzidis bool RawStringLiteralResult2 = minimizeSourceToDependencyDirectives( 716b58a420fSArgyrios Kyrtzidis "#ifndef GUARD\n" 717b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 718b58a420fSArgyrios Kyrtzidis R"raw(static constexpr char bytes[] = R"abc(-?:\,[]{}#&*!|>'"%@`)abc";)raw" 719b58a420fSArgyrios Kyrtzidis "\n" 720b58a420fSArgyrios Kyrtzidis "#endif\n", 721b58a420fSArgyrios Kyrtzidis Out); 722b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(RawStringLiteralResult2); 723b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#ifndef GUARD\n" 724b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 725b58a420fSArgyrios Kyrtzidis "#endif\n", 726b58a420fSArgyrios Kyrtzidis Out.data()); 727b58a420fSArgyrios Kyrtzidis } 728b58a420fSArgyrios Kyrtzidis 729b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, SplitIdentifier) { 730b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 731b58a420fSArgyrios Kyrtzidis 732b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#if\\\n" 733b58a420fSArgyrios Kyrtzidis "ndef GUARD\n" 734b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 735b58a420fSArgyrios Kyrtzidis "#endif\n", 736b58a420fSArgyrios Kyrtzidis Out)); 737b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#if\\\n" 738b4c83a13SArgyrios Kyrtzidis "ndef GUARD\n" 739b58a420fSArgyrios Kyrtzidis "#define GUARD\n" 740b58a420fSArgyrios Kyrtzidis "#endif\n", 741b58a420fSArgyrios Kyrtzidis Out.data()); 742b58a420fSArgyrios Kyrtzidis 743b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\n" 744b58a420fSArgyrios Kyrtzidis "RD\n", 745b58a420fSArgyrios Kyrtzidis Out)); 746b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define GUA\\\n" 747b4c83a13SArgyrios Kyrtzidis "RD\n", 748b4c83a13SArgyrios Kyrtzidis Out.data()); 749b58a420fSArgyrios Kyrtzidis 750b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\r" 751b58a420fSArgyrios Kyrtzidis "RD\n", 752b58a420fSArgyrios Kyrtzidis Out)); 753b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define GUA\\\r" 754b4c83a13SArgyrios Kyrtzidis "RD\n", 755b4c83a13SArgyrios Kyrtzidis Out.data()); 756b58a420fSArgyrios Kyrtzidis 757b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\n" 758b58a420fSArgyrios Kyrtzidis " RD\n", 759b58a420fSArgyrios Kyrtzidis Out)); 760b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define GUA RD\n", Out.data()); 761b58a420fSArgyrios Kyrtzidis } 762b58a420fSArgyrios Kyrtzidis 763b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 764b58a420fSArgyrios Kyrtzidis WhitespaceAfterLineContinuationSlash) { 765b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 766b58a420fSArgyrios Kyrtzidis 767b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define A 1 + \\ \n" 768b58a420fSArgyrios Kyrtzidis "2 + \\\t\n" 769b58a420fSArgyrios Kyrtzidis "3\n", 770b58a420fSArgyrios Kyrtzidis Out)); 771b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#define A 1+\\ \n" 772b4c83a13SArgyrios Kyrtzidis "2+\\\t\n" 773b4c83a13SArgyrios Kyrtzidis "3\n", 774b4c83a13SArgyrios Kyrtzidis Out.data()); 775b58a420fSArgyrios Kyrtzidis } 776b58a420fSArgyrios Kyrtzidis 777b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, PoundWarningAndError) { 778b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 779b58a420fSArgyrios Kyrtzidis 780b58a420fSArgyrios Kyrtzidis for (auto Source : { 781b58a420fSArgyrios Kyrtzidis "#warning '\n#include <t.h>\n", 782b58a420fSArgyrios Kyrtzidis "#warning \"\n#include <t.h>\n", 783b58a420fSArgyrios Kyrtzidis "#warning /*\n#include <t.h>\n", 784b58a420fSArgyrios Kyrtzidis "#warning \\\n#include <t.h>\n#include <t.h>\n", 785b58a420fSArgyrios Kyrtzidis "#error '\n#include <t.h>\n", 786b58a420fSArgyrios Kyrtzidis "#error \"\n#include <t.h>\n", 787b58a420fSArgyrios Kyrtzidis "#error /*\n#include <t.h>\n", 788b58a420fSArgyrios Kyrtzidis "#error \\\n#include <t.h>\n#include <t.h>\n", 789b58a420fSArgyrios Kyrtzidis }) { 790b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 791b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <t.h>\n", Out.data()); 792b58a420fSArgyrios Kyrtzidis } 793b58a420fSArgyrios Kyrtzidis 794b58a420fSArgyrios Kyrtzidis for (auto Source : { 795b58a420fSArgyrios Kyrtzidis "#warning \\\n#include <t.h>\n", 796b58a420fSArgyrios Kyrtzidis "#error \\\n#include <t.h>\n", 797b58a420fSArgyrios Kyrtzidis }) { 798b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 799aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 800b58a420fSArgyrios Kyrtzidis } 801b58a420fSArgyrios Kyrtzidis 802b58a420fSArgyrios Kyrtzidis for (auto Source : { 803b58a420fSArgyrios Kyrtzidis "#if MACRO\n#warning '\n#endif\n", 804b58a420fSArgyrios Kyrtzidis "#if MACRO\n#warning \"\n#endif\n", 805b58a420fSArgyrios Kyrtzidis "#if MACRO\n#warning /*\n#endif\n", 806b58a420fSArgyrios Kyrtzidis "#if MACRO\n#error '\n#endif\n", 807b58a420fSArgyrios Kyrtzidis "#if MACRO\n#error \"\n#endif\n", 808b58a420fSArgyrios Kyrtzidis "#if MACRO\n#error /*\n#endif\n", 809b58a420fSArgyrios Kyrtzidis }) { 810b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 811b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#if MACRO\n#endif\n", Out.data()); 812b58a420fSArgyrios Kyrtzidis } 813b58a420fSArgyrios Kyrtzidis } 814b58a420fSArgyrios Kyrtzidis 815b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteral) { 816b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 817b58a420fSArgyrios Kyrtzidis 818b58a420fSArgyrios Kyrtzidis StringRef Source = R"( 819b58a420fSArgyrios Kyrtzidis #include <bob> 820b58a420fSArgyrios Kyrtzidis int a = 0'1; 821b58a420fSArgyrios Kyrtzidis int b = 0xfa'af'fa; 822b58a420fSArgyrios Kyrtzidis int c = 12 ' '; 823b58a420fSArgyrios Kyrtzidis #include <foo> 824b58a420fSArgyrios Kyrtzidis )"; 825b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 826b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <bob>\n#include <foo>\n", Out.data()); 827b58a420fSArgyrios Kyrtzidis } 828b58a420fSArgyrios Kyrtzidis 829b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixL) { 830b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 831b58a420fSArgyrios Kyrtzidis 832b58a420fSArgyrios Kyrtzidis StringRef Source = R"(L'P' 833b58a420fSArgyrios Kyrtzidis #if DEBUG 834b58a420fSArgyrios Kyrtzidis // ' 835b58a420fSArgyrios Kyrtzidis #endif 836b58a420fSArgyrios Kyrtzidis #include <test.h> 837b58a420fSArgyrios Kyrtzidis )"; 838b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 839b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#if DEBUG\n#endif\n#include <test.h>\n", Out.data()); 840b58a420fSArgyrios Kyrtzidis } 841b58a420fSArgyrios Kyrtzidis 842b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixU) { 843b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 844b58a420fSArgyrios Kyrtzidis 845b58a420fSArgyrios Kyrtzidis StringRef Source = R"(int x = U'P'; 846b58a420fSArgyrios Kyrtzidis #include <test.h> 847b58a420fSArgyrios Kyrtzidis // ' 848b58a420fSArgyrios Kyrtzidis )"; 849b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 850b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <test.h>\n", Out.data()); 851b58a420fSArgyrios Kyrtzidis } 852b58a420fSArgyrios Kyrtzidis 853b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixu) { 854b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 855b58a420fSArgyrios Kyrtzidis 856b58a420fSArgyrios Kyrtzidis StringRef Source = R"(int x = u'b'; 857b58a420fSArgyrios Kyrtzidis int y = u8'a'; 858b58a420fSArgyrios Kyrtzidis int z = 128'78; 859b58a420fSArgyrios Kyrtzidis #include <test.h> 860b58a420fSArgyrios Kyrtzidis // ' 861b58a420fSArgyrios Kyrtzidis )"; 862b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 863b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#include <test.h>\n", Out.data()); 864b58a420fSArgyrios Kyrtzidis } 865b58a420fSArgyrios Kyrtzidis 866b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) { 867b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 868b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 4> Tokens; 869b58a420fSArgyrios Kyrtzidis SmallVector<Directive, 4> Directives; 870b58a420fSArgyrios Kyrtzidis 871b58a420fSArgyrios Kyrtzidis StringRef Source = R"(// comment 872b58a420fSArgyrios Kyrtzidis #pragma once 873b58a420fSArgyrios Kyrtzidis // another comment 874b58a420fSArgyrios Kyrtzidis #include <test.h> 875ee8ed0b3SBen Langmuir _Pragma("once") 876b58a420fSArgyrios Kyrtzidis )"; 8770559eaffSNishith Kumar M Shah ASSERT_FALSE( 8780559eaffSNishith Kumar M Shah minimizeSourceToDependencyDirectives(Source, Out, Tokens, Directives)); 879ee8ed0b3SBen Langmuir EXPECT_STREQ("#pragma once\n#include <test.h>\n_Pragma(\"once\")\n", 880ee8ed0b3SBen Langmuir Out.data()); 881ee8ed0b3SBen Langmuir ASSERT_EQ(Directives.size(), 4u); 882b58a420fSArgyrios Kyrtzidis EXPECT_EQ(Directives[0].Kind, dependency_directives_scan::pp_pragma_once); 883ee8ed0b3SBen Langmuir EXPECT_EQ(Directives[2].Kind, dependency_directives_scan::pp_pragma_once); 884b58a420fSArgyrios Kyrtzidis 885b58a420fSArgyrios Kyrtzidis Source = R"(// comment 886b58a420fSArgyrios Kyrtzidis #pragma once extra tokens 887b58a420fSArgyrios Kyrtzidis // another comment 888b58a420fSArgyrios Kyrtzidis #include <test.h> 889ee8ed0b3SBen Langmuir _Pragma("once") extra tokens 890b58a420fSArgyrios Kyrtzidis )"; 891b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 892ee8ed0b3SBen Langmuir EXPECT_STREQ("#pragma once extra tokens\n#include " 893ee8ed0b3SBen Langmuir "<test.h>\n_Pragma(\"once\")<TokBeforeEOF>\n", 894ee8ed0b3SBen Langmuir Out.data()); 895b58a420fSArgyrios Kyrtzidis } 896b58a420fSArgyrios Kyrtzidis 897b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 898b58a420fSArgyrios Kyrtzidis SkipLineStringCharLiteralsUntilNewline) { 899b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 900b58a420fSArgyrios Kyrtzidis 901b58a420fSArgyrios Kyrtzidis StringRef Source = R"(#if NEVER_ENABLED 902b58a420fSArgyrios Kyrtzidis #define why(fmt, ...) #error don't try me 903b58a420fSArgyrios Kyrtzidis #endif 904b58a420fSArgyrios Kyrtzidis 905b58a420fSArgyrios Kyrtzidis void foo(); 906b58a420fSArgyrios Kyrtzidis )"; 907b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 908b58a420fSArgyrios Kyrtzidis EXPECT_STREQ( 909aa484c90SArgyrios Kyrtzidis "#if NEVER_ENABLED\n#define why(fmt,...) #error don't try me\n#endif\n" 910aa484c90SArgyrios Kyrtzidis "<TokBeforeEOF>\n", 911b58a420fSArgyrios Kyrtzidis Out.data()); 912b58a420fSArgyrios Kyrtzidis 913b58a420fSArgyrios Kyrtzidis Source = R"(#if NEVER_ENABLED 914b58a420fSArgyrios Kyrtzidis #define why(fmt, ...) "quote dropped 915b58a420fSArgyrios Kyrtzidis #endif 916b58a420fSArgyrios Kyrtzidis 917b58a420fSArgyrios Kyrtzidis void foo(); 918b58a420fSArgyrios Kyrtzidis )"; 919b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 920b58a420fSArgyrios Kyrtzidis EXPECT_STREQ( 921aa484c90SArgyrios Kyrtzidis "#if NEVER_ENABLED\n#define why(fmt,...) \"quote dropped\n#endif\n" 922aa484c90SArgyrios Kyrtzidis "<TokBeforeEOF>\n", 923b58a420fSArgyrios Kyrtzidis Out.data()); 924b58a420fSArgyrios Kyrtzidis } 925b58a420fSArgyrios Kyrtzidis 926b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 927b58a420fSArgyrios Kyrtzidis SupportWhitespaceBeforeLineContinuation) { 928b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 929b58a420fSArgyrios Kyrtzidis 930b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define FOO(BAR) \\\n" 931b58a420fSArgyrios Kyrtzidis " #BAR\\\n" 932b58a420fSArgyrios Kyrtzidis " baz\n", 933b58a420fSArgyrios Kyrtzidis Out)); 934b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define FOO(BAR) #BAR baz\n", Out.data()); 935b58a420fSArgyrios Kyrtzidis } 936b58a420fSArgyrios Kyrtzidis 937b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, 938b58a420fSArgyrios Kyrtzidis SupportWhitespaceBeforeLineContinuationInStringSkipping) { 939b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 940b58a420fSArgyrios Kyrtzidis 941b58a420fSArgyrios Kyrtzidis StringRef Source = "#define X '\\ \t\nx'\nvoid foo() {}"; 942b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 943aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#define X '\\ \t\nx'\n<TokBeforeEOF>\n", Out.data()); 944b58a420fSArgyrios Kyrtzidis 945b58a420fSArgyrios Kyrtzidis Source = "#define X \"\\ \r\nx\"\nvoid foo() {}"; 946b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 947aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#define X \"\\ \r\nx\"\n<TokBeforeEOF>\n", Out.data()); 948b58a420fSArgyrios Kyrtzidis 949b58a420fSArgyrios Kyrtzidis Source = "#define X \"\\ \r\nx\n#include <x>\n"; 950b58a420fSArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 951b58a420fSArgyrios Kyrtzidis EXPECT_STREQ("#define X\"\\ \r\nx\n#include <x>\n", Out.data()); 952b58a420fSArgyrios Kyrtzidis } 953b58a420fSArgyrios Kyrtzidis 954b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CxxModules) { 955b58a420fSArgyrios Kyrtzidis SmallVector<char, 128> Out; 956b4c83a13SArgyrios Kyrtzidis SmallVector<dependency_directives_scan::Token, 4> Tokens; 957b58a420fSArgyrios Kyrtzidis SmallVector<Directive, 4> Directives; 958b58a420fSArgyrios Kyrtzidis 959b58a420fSArgyrios Kyrtzidis StringRef Source = R"( 960b58a420fSArgyrios Kyrtzidis module; 961b58a420fSArgyrios Kyrtzidis #include "textual-header.h" 962b58a420fSArgyrios Kyrtzidis 963b58a420fSArgyrios Kyrtzidis export module m; 964b58a420fSArgyrios Kyrtzidis exp\ 965b58a420fSArgyrios Kyrtzidis ort \ 966b58a420fSArgyrios Kyrtzidis import \ 967b58a420fSArgyrios Kyrtzidis :l [[rename]]; 968b58a420fSArgyrios Kyrtzidis 969b58a420fSArgyrios Kyrtzidis export void f(); 970b58a420fSArgyrios Kyrtzidis 971b58a420fSArgyrios Kyrtzidis void h() { 972b58a420fSArgyrios Kyrtzidis import.a = 3; 973b58a420fSArgyrios Kyrtzidis import = 3; 974b58a420fSArgyrios Kyrtzidis import <<= 3; 975b58a420fSArgyrios Kyrtzidis import->a = 3; 976b58a420fSArgyrios Kyrtzidis import(); 977b58a420fSArgyrios Kyrtzidis import . a(); 978b58a420fSArgyrios Kyrtzidis 979b58a420fSArgyrios Kyrtzidis import a b d e d e f e; 980b58a420fSArgyrios Kyrtzidis import foo [[no_unique_address]]; 981b58a420fSArgyrios Kyrtzidis import foo(); 982b58a420fSArgyrios Kyrtzidis import f(:sefse); 983b58a420fSArgyrios Kyrtzidis import f(->a = 3); 984b58a420fSArgyrios Kyrtzidis } 985b58a420fSArgyrios Kyrtzidis )"; 9860559eaffSNishith Kumar M Shah ASSERT_FALSE( 9870559eaffSNishith Kumar M Shah minimizeSourceToDependencyDirectives(Source, Out, Tokens, Directives)); 988b4c83a13SArgyrios Kyrtzidis EXPECT_STREQ("#include \"textual-header.h\"\nexport module m;" 989b4c83a13SArgyrios Kyrtzidis "exp\\\nort import:l[[rename]];" 990b4c83a13SArgyrios Kyrtzidis "import<<=3;import a b d e d e f e;" 991b4c83a13SArgyrios Kyrtzidis "import foo[[no_unique_address]];import foo();" 992aa484c90SArgyrios Kyrtzidis "import f(:sefse);import f(->a=3);" 993aa484c90SArgyrios Kyrtzidis "<TokBeforeEOF>\n", 994b58a420fSArgyrios Kyrtzidis Out.data()); 995aa484c90SArgyrios Kyrtzidis ASSERT_EQ(Directives.size(), 11u); 996b4c83a13SArgyrios Kyrtzidis EXPECT_EQ(Directives[0].Kind, pp_include); 997b4c83a13SArgyrios Kyrtzidis EXPECT_EQ(Directives[1].Kind, cxx_export_module_decl); 998b58a420fSArgyrios Kyrtzidis } 999b58a420fSArgyrios Kyrtzidis 100042728475SMichael Spencer TEST(MinimizeSourceToDependencyDirectivesTest, ObjCMethodArgs) { 100142728475SMichael Spencer SmallVector<char, 128> Out; 100242728475SMichael Spencer 100342728475SMichael Spencer StringRef Source = R"( 100442728475SMichael Spencer @interface SomeObjcClass 100542728475SMichael Spencer - (void)func:(int)otherData 100642728475SMichael Spencer module:(int)module 100742728475SMichael Spencer import:(int)import; 100842728475SMichael Spencer @end 100942728475SMichael Spencer )"; 101042728475SMichael Spencer 101142728475SMichael Spencer ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 101242728475SMichael Spencer // `module :` and `import :` not followed by an identifier are not treated as 101342728475SMichael Spencer // directive lines because they can be method argument decls. 101442728475SMichael Spencer EXPECT_STREQ("<TokBeforeEOF>\n", Out.data()); 101542728475SMichael Spencer } 101642728475SMichael Spencer 1017aa484c90SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, TokensBeforeEOF) { 1018aa484c90SArgyrios Kyrtzidis SmallString<128> Out; 1019aa484c90SArgyrios Kyrtzidis 1020aa484c90SArgyrios Kyrtzidis StringRef Source = R"( 1021aa484c90SArgyrios Kyrtzidis #define A 1022aa484c90SArgyrios Kyrtzidis #ifdef B 1023aa484c90SArgyrios Kyrtzidis int x; 1024aa484c90SArgyrios Kyrtzidis #endif 1025aa484c90SArgyrios Kyrtzidis )"; 1026aa484c90SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 1027aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#define A\n<TokBeforeEOF>\n", Out.data()); 1028aa484c90SArgyrios Kyrtzidis 1029aa484c90SArgyrios Kyrtzidis Source = R"( 1030aa484c90SArgyrios Kyrtzidis #ifndef A 1031aa484c90SArgyrios Kyrtzidis #define A 1032aa484c90SArgyrios Kyrtzidis #endif // some comment 1033aa484c90SArgyrios Kyrtzidis 1034aa484c90SArgyrios Kyrtzidis // other comment 1035aa484c90SArgyrios Kyrtzidis )"; 1036aa484c90SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 1037aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#ifndef A\n#define A\n#endif\n", Out.data()); 1038aa484c90SArgyrios Kyrtzidis 1039aa484c90SArgyrios Kyrtzidis Source = R"( 1040aa484c90SArgyrios Kyrtzidis #ifndef A 1041aa484c90SArgyrios Kyrtzidis #define A 1042aa484c90SArgyrios Kyrtzidis #endif /* some comment 1043aa484c90SArgyrios Kyrtzidis 1044aa484c90SArgyrios Kyrtzidis */ 1045aa484c90SArgyrios Kyrtzidis )"; 1046aa484c90SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 1047aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#ifndef A\n#define A\n#endif\n", Out.data()); 1048aa484c90SArgyrios Kyrtzidis 1049aa484c90SArgyrios Kyrtzidis Source = R"( 1050aa484c90SArgyrios Kyrtzidis #ifndef A 1051aa484c90SArgyrios Kyrtzidis #define A 1052aa484c90SArgyrios Kyrtzidis #endif /* some comment 1053aa484c90SArgyrios Kyrtzidis 1054aa484c90SArgyrios Kyrtzidis */ 1055aa484c90SArgyrios Kyrtzidis int x; 1056aa484c90SArgyrios Kyrtzidis )"; 1057aa484c90SArgyrios Kyrtzidis ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out)); 1058aa484c90SArgyrios Kyrtzidis EXPECT_STREQ("#ifndef A\n#define A\n#endif\n<TokBeforeEOF>\n", Out.data()); 1059aa484c90SArgyrios Kyrtzidis } 1060aa484c90SArgyrios Kyrtzidis 1061b58a420fSArgyrios Kyrtzidis } // end anonymous namespace 1062