xref: /llvm-project/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp (revision d19e71db8a3de65de5da5d5bc4e1f9c1020c574c)
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