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 
minimizeSourceToDependencyDirectives(StringRef Input,SmallVectorImpl<char> & Out,SmallVectorImpl<dependency_directives_scan::Token> & Tokens,SmallVectorImpl<Directive> & Directives)17*b4c83a13SArgyrios Kyrtzidis static bool minimizeSourceToDependencyDirectives(
18*b4c83a13SArgyrios Kyrtzidis     StringRef Input, SmallVectorImpl<char> &Out,
19*b4c83a13SArgyrios Kyrtzidis     SmallVectorImpl<dependency_directives_scan::Token> &Tokens,
20*b4c83a13SArgyrios Kyrtzidis     SmallVectorImpl<Directive> &Directives) {
21*b4c83a13SArgyrios Kyrtzidis   Out.clear();
22*b4c83a13SArgyrios Kyrtzidis   Tokens.clear();
23*b4c83a13SArgyrios Kyrtzidis   Directives.clear();
24*b4c83a13SArgyrios Kyrtzidis   if (scanSourceForDependencyDirectives(Input, Tokens, Directives))
25*b4c83a13SArgyrios Kyrtzidis     return true;
26*b4c83a13SArgyrios Kyrtzidis 
27*b4c83a13SArgyrios Kyrtzidis   raw_svector_ostream OS(Out);
28*b4c83a13SArgyrios Kyrtzidis   printDependencyDirectivesAsSource(Input, Directives, OS);
29*b4c83a13SArgyrios Kyrtzidis   if (!Out.empty() && Out.back() != '\n')
30*b4c83a13SArgyrios Kyrtzidis     Out.push_back('\n');
31*b4c83a13SArgyrios Kyrtzidis   Out.push_back('\0');
32*b4c83a13SArgyrios Kyrtzidis   Out.pop_back();
33*b4c83a13SArgyrios Kyrtzidis 
34*b4c83a13SArgyrios Kyrtzidis   return false;
35b58a420fSArgyrios Kyrtzidis }
36b58a420fSArgyrios Kyrtzidis 
minimizeSourceToDependencyDirectives(StringRef Input,SmallVectorImpl<char> & Out)37*b4c83a13SArgyrios Kyrtzidis static bool minimizeSourceToDependencyDirectives(StringRef Input,
38*b4c83a13SArgyrios Kyrtzidis                                                  SmallVectorImpl<char> &Out) {
39*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 16> Tokens;
40*b4c83a13SArgyrios Kyrtzidis   SmallVector<Directive, 32> Directives;
41*b4c83a13SArgyrios Kyrtzidis   return minimizeSourceToDependencyDirectives(Input, Out, Tokens, Directives);
42b58a420fSArgyrios Kyrtzidis }
43b58a420fSArgyrios Kyrtzidis 
44b58a420fSArgyrios Kyrtzidis namespace {
45b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Empty)46b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Empty) {
47b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
48*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 4> Tokens;
49b58a420fSArgyrios Kyrtzidis   SmallVector<Directive, 4> Directives;
50b58a420fSArgyrios Kyrtzidis 
51*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(
52*b4c83a13SArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("", Out, Tokens, Directives));
53b58a420fSArgyrios Kyrtzidis   EXPECT_TRUE(Out.empty());
54*b4c83a13SArgyrios Kyrtzidis   EXPECT_TRUE(Tokens.empty());
55b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(1u, Directives.size());
56b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(pp_eof, Directives.back().Kind);
57b58a420fSArgyrios Kyrtzidis 
58*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("abc def\nxyz", Out, Tokens,
59*b4c83a13SArgyrios Kyrtzidis                                                     Directives));
60b58a420fSArgyrios Kyrtzidis   EXPECT_TRUE(Out.empty());
61*b4c83a13SArgyrios Kyrtzidis   EXPECT_TRUE(Tokens.empty());
62b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(1u, Directives.size());
63b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(pp_eof, Directives.back().Kind);
64b58a420fSArgyrios Kyrtzidis }
65b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,AllTokens)66*b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) {
67b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
68*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 4> Tokens;
69b58a420fSArgyrios Kyrtzidis   SmallVector<Directive, 4> Directives;
70b58a420fSArgyrios Kyrtzidis 
71b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
72b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define A\n"
73b58a420fSArgyrios Kyrtzidis                                            "#undef A\n"
74b58a420fSArgyrios Kyrtzidis                                            "#endif\n"
75b58a420fSArgyrios Kyrtzidis                                            "#if A\n"
76b58a420fSArgyrios Kyrtzidis                                            "#ifdef A\n"
77b58a420fSArgyrios Kyrtzidis                                            "#ifndef A\n"
78b58a420fSArgyrios Kyrtzidis                                            "#elifdef A\n"
79b58a420fSArgyrios Kyrtzidis                                            "#elifndef A\n"
80b58a420fSArgyrios Kyrtzidis                                            "#elif A\n"
81b58a420fSArgyrios Kyrtzidis                                            "#else\n"
82b58a420fSArgyrios Kyrtzidis                                            "#include <A>\n"
83b58a420fSArgyrios Kyrtzidis                                            "#include_next <A>\n"
84b58a420fSArgyrios Kyrtzidis                                            "#__include_macros <A>\n"
85b58a420fSArgyrios Kyrtzidis                                            "#import <A>\n"
86b58a420fSArgyrios Kyrtzidis                                            "@import A;\n"
87b58a420fSArgyrios Kyrtzidis                                            "#pragma clang module import A\n"
88b58a420fSArgyrios Kyrtzidis                                            "#pragma push_macro(A)\n"
89b58a420fSArgyrios Kyrtzidis                                            "#pragma pop_macro(A)\n"
90b58a420fSArgyrios Kyrtzidis                                            "#pragma include_alias(<A>, <B>)\n"
91b58a420fSArgyrios Kyrtzidis                                            "export module m;\n"
92b58a420fSArgyrios Kyrtzidis                                            "import m;\n",
93*b4c83a13SArgyrios Kyrtzidis                                            Out, Tokens, Directives));
94b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_define, Directives[0].Kind);
95b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_undef, Directives[1].Kind);
96b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_endif, Directives[2].Kind);
97b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_if, Directives[3].Kind);
98b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_ifdef, Directives[4].Kind);
99b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_ifndef, Directives[5].Kind);
100b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_elifdef, Directives[6].Kind);
101b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_elifndef, Directives[7].Kind);
102b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_elif, Directives[8].Kind);
103b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_else, Directives[9].Kind);
104b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_include, Directives[10].Kind);
105b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_include_next, Directives[11].Kind);
106b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp___include_macros, Directives[12].Kind);
107b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_import, Directives[13].Kind);
108b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(decl_at_import, Directives[14].Kind);
109b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_pragma_import, Directives[15].Kind);
110b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_pragma_push_macro, Directives[16].Kind);
111b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_pragma_pop_macro, Directives[17].Kind);
112b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(pp_pragma_include_alias, Directives[18].Kind);
113*b4c83a13SArgyrios Kyrtzidis   EXPECT_EQ(cxx_export_module_decl, Directives[19].Kind);
114*b4c83a13SArgyrios Kyrtzidis   EXPECT_EQ(cxx_import_decl, Directives[20].Kind);
115*b4c83a13SArgyrios Kyrtzidis   EXPECT_EQ(pp_eof, Directives[21].Kind);
116*b4c83a13SArgyrios Kyrtzidis }
117*b4c83a13SArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,EmptyHash)118*b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyHash) {
119*b4c83a13SArgyrios Kyrtzidis   SmallVector<char, 128> Out;
120*b4c83a13SArgyrios Kyrtzidis 
121*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(
122*b4c83a13SArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#\n#define MACRO a\n", Out));
123*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO a\n", Out.data());
124b58a420fSArgyrios Kyrtzidis }
125b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Define)126b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Define) {
127b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
128*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 4> Tokens;
129b58a420fSArgyrios Kyrtzidis   SmallVector<Directive, 4> Directives;
130b58a420fSArgyrios Kyrtzidis 
131*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO", Out,
132*b4c83a13SArgyrios Kyrtzidis                                                     Tokens, Directives));
133b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO\n", Out.data());
134*b4c83a13SArgyrios Kyrtzidis   ASSERT_EQ(4u, Tokens.size());
135b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(2u, Directives.size());
136b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(pp_define, Directives.front().Kind);
137b58a420fSArgyrios Kyrtzidis }
138b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineSpacing)139b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineSpacing) {
140b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
141b58a420fSArgyrios Kyrtzidis 
142b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
143b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO\n\n\n", Out));
144b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO\n", Out.data());
145b58a420fSArgyrios Kyrtzidis 
146b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
147b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO \n\n\n", Out));
148b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO\n", Out.data());
149b58a420fSArgyrios Kyrtzidis 
150b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
151b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO a \n\n\n", Out));
152b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO a\n", Out.data());
153b58a420fSArgyrios Kyrtzidis 
154b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
155b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define   MACRO\n\n\n", Out));
156b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO\n", Out.data());
157b58a420fSArgyrios Kyrtzidis }
158b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMacroArguments)159b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMacroArguments) {
160b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
161b58a420fSArgyrios Kyrtzidis 
162b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO()", Out));
163b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO()\n", Out.data());
164b58a420fSArgyrios Kyrtzidis 
165b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
166b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a, b...)", Out));
167b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b...)\n", Out.data());
168b58a420fSArgyrios Kyrtzidis 
169b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
170b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO content", Out));
171b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO content\n", Out.data());
172b58a420fSArgyrios Kyrtzidis 
173b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
174b58a420fSArgyrios Kyrtzidis       "#define MACRO   con  tent   ", Out));
175b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO con tent\n", Out.data());
176b58a420fSArgyrios Kyrtzidis 
177b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
178b58a420fSArgyrios Kyrtzidis       "#define MACRO()   con  tent   ", Out));
179b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO() con tent\n", Out.data());
180b58a420fSArgyrios Kyrtzidis }
181b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineInvalidMacroArguments)182b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineInvalidMacroArguments) {
183b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
184b58a420fSArgyrios Kyrtzidis 
185b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO((a))", Out));
186*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO((a))\n", Out.data());
187b58a420fSArgyrios Kyrtzidis 
188b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO(", Out));
189*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(\n", Out.data());
190b58a420fSArgyrios Kyrtzidis 
191b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
192b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a * b)", Out));
193*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a*b)\n", Out.data());
194b58a420fSArgyrios Kyrtzidis }
195b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineHorizontalWhitespace)196b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineHorizontalWhitespace) {
197b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
198b58a420fSArgyrios Kyrtzidis 
199b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
200b58a420fSArgyrios Kyrtzidis       "#define MACRO(\t)\tcon \t tent\t", Out));
201*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO() con tent\n", Out.data());
202b58a420fSArgyrios Kyrtzidis 
203b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
204b58a420fSArgyrios Kyrtzidis       "#define MACRO(\f)\fcon \f tent\f", Out));
205*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO() con tent\n", Out.data());
206b58a420fSArgyrios Kyrtzidis 
207b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
208b58a420fSArgyrios Kyrtzidis       "#define MACRO(\v)\vcon \v tent\v", Out));
209*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO() con tent\n", Out.data());
210b58a420fSArgyrios Kyrtzidis 
211b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
212b58a420fSArgyrios Kyrtzidis       "#define MACRO \t\v\f\v\t con\f\t\vtent\v\f \v", Out));
213*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO con tent\n", Out.data());
214b58a420fSArgyrios Kyrtzidis }
215b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMultilineArgs)216b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgs) {
217b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
218b58a420fSArgyrios Kyrtzidis 
219b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
220b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a        \\\n"
221b58a420fSArgyrios Kyrtzidis                                            "              )",
222b58a420fSArgyrios Kyrtzidis                                            Out));
223b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a)\n", Out.data());
224b58a420fSArgyrios Kyrtzidis 
225b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
226b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a,       \\\n"
227b58a420fSArgyrios Kyrtzidis                                            "              b)       \\\n"
228b58a420fSArgyrios Kyrtzidis                                            "        call((a),      \\\n"
229b58a420fSArgyrios Kyrtzidis                                            "             (b))",
230b58a420fSArgyrios Kyrtzidis                                            Out));
231b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data());
232b58a420fSArgyrios Kyrtzidis }
233b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMultilineArgsCarriageReturn)234b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
235b58a420fSArgyrios Kyrtzidis      DefineMultilineArgsCarriageReturn) {
236b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
237b58a420fSArgyrios Kyrtzidis 
238b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
239b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a,       \\\r"
240b58a420fSArgyrios Kyrtzidis                                            "              b)       \\\r"
241b58a420fSArgyrios Kyrtzidis                                            "        call((a),      \\\r"
242b58a420fSArgyrios Kyrtzidis                                            "             (b))",
243b58a420fSArgyrios Kyrtzidis                                            Out));
244b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data());
245b58a420fSArgyrios Kyrtzidis }
246b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMultilineArgsStringize)247b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineMultilineArgsStringize) {
248b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
249b58a420fSArgyrios Kyrtzidis 
250b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO(a,b) \\\n"
251b58a420fSArgyrios Kyrtzidis                                                     "                #a \\\n"
252b58a420fSArgyrios Kyrtzidis                                                     "                #b",
253b58a420fSArgyrios Kyrtzidis                                                     Out));
254b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b) #a #b\n", Out.data());
255b58a420fSArgyrios Kyrtzidis }
256b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMultilineArgsCarriageReturnNewline)257b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
258b58a420fSArgyrios Kyrtzidis      DefineMultilineArgsCarriageReturnNewline) {
259b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
260b58a420fSArgyrios Kyrtzidis 
261b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
262b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a,       \\\r\n"
263b58a420fSArgyrios Kyrtzidis                                            "              b)       \\\r\n"
264b58a420fSArgyrios Kyrtzidis                                            "        call((a),      \\\r\n"
265b58a420fSArgyrios Kyrtzidis                                            "             (b))",
266b58a420fSArgyrios Kyrtzidis                                            Out));
267b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data());
268b58a420fSArgyrios Kyrtzidis }
269b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineMultilineArgsNewlineCarriageReturn)270b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
271b58a420fSArgyrios Kyrtzidis      DefineMultilineArgsNewlineCarriageReturn) {
272b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
273b58a420fSArgyrios Kyrtzidis 
274b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
275b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO(a,       \\\n\r"
276b58a420fSArgyrios Kyrtzidis                                            "              b)       \\\n\r"
277b58a420fSArgyrios Kyrtzidis                                            "        call((a),      \\\n\r"
278b58a420fSArgyrios Kyrtzidis                                            "             (b))",
279b58a420fSArgyrios Kyrtzidis                                            Out));
280b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO(a,b) call((a), (b))\n", Out.data());
281b58a420fSArgyrios Kyrtzidis }
282b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineNumber)283b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNumber) {
284b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
285b58a420fSArgyrios Kyrtzidis 
286*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define 0\n", Out));
287b58a420fSArgyrios Kyrtzidis }
288b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineNoName)289b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNoName) {
290b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
291b58a420fSArgyrios Kyrtzidis 
292*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define &\n", Out));
293b58a420fSArgyrios Kyrtzidis }
294b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,DefineNoWhitespace)295b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, DefineNoWhitespace) {
296b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
297b58a420fSArgyrios Kyrtzidis 
298b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define AND&\n", Out));
299b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define AND&\n", Out.data());
300b58a420fSArgyrios Kyrtzidis 
301b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define AND\\\n"
302b58a420fSArgyrios Kyrtzidis                                                     "&\n",
303b58a420fSArgyrios Kyrtzidis                                                     Out));
304*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define AND\\\n"
305*b4c83a13SArgyrios Kyrtzidis                "&\n",
306*b4c83a13SArgyrios Kyrtzidis                Out.data());
307b58a420fSArgyrios Kyrtzidis }
308b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,MultilineComment)309b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, MultilineComment) {
310b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
311b58a420fSArgyrios Kyrtzidis 
312b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
313b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#define MACRO a/*\n"
314b58a420fSArgyrios Kyrtzidis                                            "  /*\n"
315b58a420fSArgyrios Kyrtzidis                                            "#define MISSING abc\n"
316b58a420fSArgyrios Kyrtzidis                                            "  /*\n"
317b58a420fSArgyrios Kyrtzidis                                            "  /* something */ \n"
318b58a420fSArgyrios Kyrtzidis                                            "#include  /* \"def\" */ <abc> \n",
319b58a420fSArgyrios Kyrtzidis                                            Out));
320b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO a\n"
321b58a420fSArgyrios Kyrtzidis                "#include <abc>\n",
322b58a420fSArgyrios Kyrtzidis                Out.data());
323b58a420fSArgyrios Kyrtzidis }
324b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,MultilineCommentInStrings)325b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, MultilineCommentInStrings) {
326b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
327b58a420fSArgyrios Kyrtzidis 
328b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define MACRO1 \"/*\"\n"
329b58a420fSArgyrios Kyrtzidis                                                     "#define MACRO2 \"*/\"\n",
330b58a420fSArgyrios Kyrtzidis                                                     Out));
331b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO1 \"/*\"\n"
332b58a420fSArgyrios Kyrtzidis                "#define MACRO2 \"*/\"\n",
333b58a420fSArgyrios Kyrtzidis                Out.data());
334b58a420fSArgyrios Kyrtzidis }
335b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CommentSlashSlashStar)336*b4c83a13SArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CommentSlashSlashStar) {
337*b4c83a13SArgyrios Kyrtzidis   SmallVector<char, 128> Out;
338*b4c83a13SArgyrios Kyrtzidis 
339*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
340*b4c83a13SArgyrios Kyrtzidis       "#define MACRO 1 //* blah */\n", Out));
341*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define MACRO 1\n", Out.data());
342*b4c83a13SArgyrios Kyrtzidis }
343*b4c83a13SArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Ifdef)344b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Ifdef) {
345b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
346b58a420fSArgyrios Kyrtzidis 
347b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
348b58a420fSArgyrios Kyrtzidis                                                     "#define B\n"
349b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
350b58a420fSArgyrios Kyrtzidis                                                     Out));
351b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
352b58a420fSArgyrios Kyrtzidis                "#define B\n"
353b58a420fSArgyrios Kyrtzidis                "#endif\n",
354b58a420fSArgyrios Kyrtzidis                Out.data());
355b58a420fSArgyrios Kyrtzidis 
356b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
357b58a420fSArgyrios Kyrtzidis                                                     "#define B\n"
358b58a420fSArgyrios Kyrtzidis                                                     "#elif B\n"
359b58a420fSArgyrios Kyrtzidis                                                     "#define C\n"
360b58a420fSArgyrios Kyrtzidis                                                     "#elif C\n"
361b58a420fSArgyrios Kyrtzidis                                                     "#define D\n"
362b58a420fSArgyrios Kyrtzidis                                                     "#else\n"
363b58a420fSArgyrios Kyrtzidis                                                     "#define E\n"
364b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
365b58a420fSArgyrios Kyrtzidis                                                     Out));
366b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
367b58a420fSArgyrios Kyrtzidis                "#define B\n"
368b58a420fSArgyrios Kyrtzidis                "#elif B\n"
369b58a420fSArgyrios Kyrtzidis                "#define C\n"
370b58a420fSArgyrios Kyrtzidis                "#elif C\n"
371b58a420fSArgyrios Kyrtzidis                "#define D\n"
372b58a420fSArgyrios Kyrtzidis                "#else\n"
373b58a420fSArgyrios Kyrtzidis                "#define E\n"
374b58a420fSArgyrios Kyrtzidis                "#endif\n",
375b58a420fSArgyrios Kyrtzidis                Out.data());
376b58a420fSArgyrios Kyrtzidis }
377b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Elifdef)378b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Elifdef) {
379b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
380b58a420fSArgyrios Kyrtzidis 
381b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
382b58a420fSArgyrios Kyrtzidis                                                     "#define B\n"
383b58a420fSArgyrios Kyrtzidis                                                     "#elifdef C\n"
384b58a420fSArgyrios Kyrtzidis                                                     "#define D\n"
385b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
386b58a420fSArgyrios Kyrtzidis                                                     Out));
387b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
388b58a420fSArgyrios Kyrtzidis                "#define B\n"
389b58a420fSArgyrios Kyrtzidis                "#elifdef C\n"
390b58a420fSArgyrios Kyrtzidis                "#define D\n"
391b58a420fSArgyrios Kyrtzidis                "#endif\n",
392b58a420fSArgyrios Kyrtzidis                Out.data());
393b58a420fSArgyrios Kyrtzidis 
394b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
395b58a420fSArgyrios Kyrtzidis                                                     "#define B\n"
396b58a420fSArgyrios Kyrtzidis                                                     "#elifdef B\n"
397b58a420fSArgyrios Kyrtzidis                                                     "#define C\n"
398b58a420fSArgyrios Kyrtzidis                                                     "#elifndef C\n"
399b58a420fSArgyrios Kyrtzidis                                                     "#define D\n"
400b58a420fSArgyrios Kyrtzidis                                                     "#else\n"
401b58a420fSArgyrios Kyrtzidis                                                     "#define E\n"
402b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
403b58a420fSArgyrios Kyrtzidis                                                     Out));
404b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
405b58a420fSArgyrios Kyrtzidis                "#define B\n"
406b58a420fSArgyrios Kyrtzidis                "#elifdef B\n"
407b58a420fSArgyrios Kyrtzidis                "#define C\n"
408b58a420fSArgyrios Kyrtzidis                "#elifndef C\n"
409b58a420fSArgyrios Kyrtzidis                "#define D\n"
410b58a420fSArgyrios Kyrtzidis                "#else\n"
411b58a420fSArgyrios Kyrtzidis                "#define E\n"
412b58a420fSArgyrios Kyrtzidis                "#endif\n",
413b58a420fSArgyrios Kyrtzidis                Out.data());
414b58a420fSArgyrios Kyrtzidis }
415b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,EmptyIfdef)416b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyIfdef) {
417b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
418b58a420fSArgyrios Kyrtzidis 
419b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
420b58a420fSArgyrios Kyrtzidis                                                     "void skip();\n"
421b58a420fSArgyrios Kyrtzidis                                                     "#elif B\n"
422b58a420fSArgyrios Kyrtzidis                                                     "#elif C\n"
423b58a420fSArgyrios Kyrtzidis                                                     "#else D\n"
424b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
425b58a420fSArgyrios Kyrtzidis                                                     Out));
426b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
427b58a420fSArgyrios Kyrtzidis                "#elif B\n"
428b58a420fSArgyrios Kyrtzidis                "#elif C\n"
429b58a420fSArgyrios Kyrtzidis                "#endif\n",
430b58a420fSArgyrios Kyrtzidis                Out.data());
431b58a420fSArgyrios Kyrtzidis }
432b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,EmptyElifdef)433b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, EmptyElifdef) {
434b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
435b58a420fSArgyrios Kyrtzidis 
436b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifdef A\n"
437b58a420fSArgyrios Kyrtzidis                                                     "void skip();\n"
438b58a420fSArgyrios Kyrtzidis                                                     "#elifdef B\n"
439b58a420fSArgyrios Kyrtzidis                                                     "#elifndef C\n"
440b58a420fSArgyrios Kyrtzidis                                                     "#else D\n"
441b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
442b58a420fSArgyrios Kyrtzidis                                                     Out));
443b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifdef A\n"
444b58a420fSArgyrios Kyrtzidis                "#elifdef B\n"
445b58a420fSArgyrios Kyrtzidis                "#elifndef C\n"
446b58a420fSArgyrios Kyrtzidis                "#endif\n",
447b58a420fSArgyrios Kyrtzidis                Out.data());
448b58a420fSArgyrios Kyrtzidis }
449b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Pragma)450b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Pragma) {
451b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
452b58a420fSArgyrios Kyrtzidis 
453b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#pragma A\n", Out));
454b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("", Out.data());
455b58a420fSArgyrios Kyrtzidis 
456b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
457b58a420fSArgyrios Kyrtzidis       "#pragma push_macro(\"MACRO\")\n", Out));
458b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma push_macro(\"MACRO\")\n", Out.data());
459b58a420fSArgyrios Kyrtzidis 
460b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
461b58a420fSArgyrios Kyrtzidis       "#pragma pop_macro(\"MACRO\")\n", Out));
462b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma pop_macro(\"MACRO\")\n", Out.data());
463b58a420fSArgyrios Kyrtzidis 
464b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
465b58a420fSArgyrios Kyrtzidis       "#pragma include_alias(\"A\", \"B\")\n", Out));
466b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma include_alias(\"A\", \"B\")\n", Out.data());
467b58a420fSArgyrios Kyrtzidis 
468b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
469b58a420fSArgyrios Kyrtzidis       "#pragma include_alias(<A>, <B>)\n", Out));
470b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma include_alias(<A>, <B>)\n", Out.data());
471b58a420fSArgyrios Kyrtzidis 
472b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#pragma clang\n", Out));
473b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("", Out.data());
474b58a420fSArgyrios Kyrtzidis 
475b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
476b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#pragma clang module\n", Out));
477b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("", Out.data());
478b58a420fSArgyrios Kyrtzidis 
479b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
480b58a420fSArgyrios Kyrtzidis       "#pragma clang module impor\n", Out));
481b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("", Out.data());
482b58a420fSArgyrios Kyrtzidis 
483b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
484b58a420fSArgyrios Kyrtzidis       "#pragma clang module import\n", Out));
485b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma clang module import\n", Out.data());
486b58a420fSArgyrios Kyrtzidis }
487b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,Include)488b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, Include) {
489b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
490b58a420fSArgyrios Kyrtzidis 
491b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include \"A\"\n", Out));
492b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include \"A\"\n", Out.data());
493b58a420fSArgyrios Kyrtzidis 
494b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include <A>\n", Out));
495b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include <A>\n", Out.data());
496b58a420fSArgyrios Kyrtzidis 
497b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
498b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#include <A//A.h>\n", Out));
499b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include <A//A.h>\n", Out.data());
500b58a420fSArgyrios Kyrtzidis 
501b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
502b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#include \"A//A.h\"\n", Out));
503b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include \"A//A.h\"\n", Out.data());
504b58a420fSArgyrios Kyrtzidis 
505b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
506b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#include_next <A>\n", Out));
507b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include_next <A>\n", Out.data());
508b58a420fSArgyrios Kyrtzidis 
509b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#import <A>\n", Out));
510b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#import <A>\n", Out.data());
511b58a420fSArgyrios Kyrtzidis 
512b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#import <A//A.h>\n", Out));
513b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#import <A//A.h>\n", Out.data());
514b58a420fSArgyrios Kyrtzidis 
515b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
516b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#import \"A//A.h\"\n", Out));
517b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#import \"A//A.h\"\n", Out.data());
518b58a420fSArgyrios Kyrtzidis 
519b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(
520b58a420fSArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("#__include_macros <A>\n", Out));
521b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#__include_macros <A>\n", Out.data());
522*b4c83a13SArgyrios Kyrtzidis 
523*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#include MACRO\n", Out));
524*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#include MACRO\n", Out.data());
525b58a420fSArgyrios Kyrtzidis }
526b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,AtImport)527b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AtImport) {
528b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
529b58a420fSArgyrios Kyrtzidis 
530b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A;\n", Out));
531b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("@import A;\n", Out.data());
532b58a420fSArgyrios Kyrtzidis 
533b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(" @ import  A;\n", Out));
534b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("@import A;\n", Out.data());
535b58a420fSArgyrios Kyrtzidis 
536b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A\n;", Out));
537b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("@import A;\n", Out.data());
538b58a420fSArgyrios Kyrtzidis 
539b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import A.B;\n", Out));
540b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("@import A.B;\n", Out.data());
541b58a420fSArgyrios Kyrtzidis 
542b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(
543b58a420fSArgyrios Kyrtzidis       "@import /*x*/ A /*x*/ . /*x*/ B /*x*/ \n /*x*/ ; /*x*/", Out));
544b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("@import A.B;\n", Out.data());
545b58a420fSArgyrios Kyrtzidis }
546b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,AtImportFailures)547b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, AtImportFailures) {
548b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
549b58a420fSArgyrios Kyrtzidis 
550b58a420fSArgyrios Kyrtzidis   ASSERT_TRUE(minimizeSourceToDependencyDirectives("@import A\n", Out));
551*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(
552*b4c83a13SArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives("@import MACRO(A);\n", Out));
553*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("@import \" \";\n", Out));
554b58a420fSArgyrios Kyrtzidis }
555b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,RawStringLiteral)556b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, RawStringLiteral) {
557b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
558b58a420fSArgyrios Kyrtzidis 
559b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#ifndef GUARD\n"
560b58a420fSArgyrios Kyrtzidis                                                     "#define GUARD\n"
561b58a420fSArgyrios Kyrtzidis                                                     "R\"()\"\n"
562b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
563b58a420fSArgyrios Kyrtzidis                                                     Out));
564b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifndef GUARD\n"
565b58a420fSArgyrios Kyrtzidis                "#define GUARD\n"
566b58a420fSArgyrios Kyrtzidis                "#endif\n",
567b58a420fSArgyrios Kyrtzidis                Out.data());
568b58a420fSArgyrios Kyrtzidis 
569b58a420fSArgyrios Kyrtzidis   bool RawStringLiteralResult = minimizeSourceToDependencyDirectives(
570b58a420fSArgyrios Kyrtzidis       "#ifndef GUARD\n"
571b58a420fSArgyrios Kyrtzidis       "#define GUARD\n"
572b58a420fSArgyrios Kyrtzidis       R"raw(static constexpr char bytes[] = R"(-?:\,[]{}#&*!|>'"%@`)";)raw"
573b58a420fSArgyrios Kyrtzidis       "\n"
574b58a420fSArgyrios Kyrtzidis       "#endif\n",
575b58a420fSArgyrios Kyrtzidis       Out);
576b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(RawStringLiteralResult);
577b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifndef GUARD\n"
578b58a420fSArgyrios Kyrtzidis                "#define GUARD\n"
579b58a420fSArgyrios Kyrtzidis                "#endif\n",
580b58a420fSArgyrios Kyrtzidis                Out.data());
581b58a420fSArgyrios Kyrtzidis 
582b58a420fSArgyrios Kyrtzidis   bool RawStringLiteralResult2 = minimizeSourceToDependencyDirectives(
583b58a420fSArgyrios Kyrtzidis       "#ifndef GUARD\n"
584b58a420fSArgyrios Kyrtzidis       "#define GUARD\n"
585b58a420fSArgyrios Kyrtzidis       R"raw(static constexpr char bytes[] = R"abc(-?:\,[]{}#&*!|>'"%@`)abc";)raw"
586b58a420fSArgyrios Kyrtzidis       "\n"
587b58a420fSArgyrios Kyrtzidis       "#endif\n",
588b58a420fSArgyrios Kyrtzidis       Out);
589b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(RawStringLiteralResult2);
590b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#ifndef GUARD\n"
591b58a420fSArgyrios Kyrtzidis                "#define GUARD\n"
592b58a420fSArgyrios Kyrtzidis                "#endif\n",
593b58a420fSArgyrios Kyrtzidis                Out.data());
594b58a420fSArgyrios Kyrtzidis }
595b58a420fSArgyrios Kyrtzidis 
596b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, SplitIdentifier) {
597b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
598b58a420fSArgyrios Kyrtzidis 
599b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#if\\\n"
600b58a420fSArgyrios Kyrtzidis                                                     "ndef GUARD\n"
601b58a420fSArgyrios Kyrtzidis                                                     "#define GUARD\n"
602b58a420fSArgyrios Kyrtzidis                                                     "#endif\n",
603b58a420fSArgyrios Kyrtzidis                                                     Out));
604*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#if\\\n"
605*b4c83a13SArgyrios Kyrtzidis                "ndef GUARD\n"
606b58a420fSArgyrios Kyrtzidis                "#define GUARD\n"
607b58a420fSArgyrios Kyrtzidis                "#endif\n",
608b58a420fSArgyrios Kyrtzidis                Out.data());
609b58a420fSArgyrios Kyrtzidis 
610b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\n"
611b58a420fSArgyrios Kyrtzidis                                                     "RD\n",
612b58a420fSArgyrios Kyrtzidis                                                     Out));
613*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define GUA\\\n"
614*b4c83a13SArgyrios Kyrtzidis                "RD\n",
615*b4c83a13SArgyrios Kyrtzidis                Out.data());
616b58a420fSArgyrios Kyrtzidis 
617b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\r"
618b58a420fSArgyrios Kyrtzidis                                                     "RD\n",
619b58a420fSArgyrios Kyrtzidis                                                     Out));
620*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define GUA\\\r"
621*b4c83a13SArgyrios Kyrtzidis                "RD\n",
622*b4c83a13SArgyrios Kyrtzidis                Out.data());
623b58a420fSArgyrios Kyrtzidis 
624b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define GUA\\\n"
625b58a420fSArgyrios Kyrtzidis                                                     "           RD\n",
626b58a420fSArgyrios Kyrtzidis                                                     Out));
627b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define GUA RD\n", Out.data());
628b58a420fSArgyrios Kyrtzidis }
629b58a420fSArgyrios Kyrtzidis 
630b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
631b58a420fSArgyrios Kyrtzidis      WhitespaceAfterLineContinuationSlash) {
632b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
633b58a420fSArgyrios Kyrtzidis 
634b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define A 1 + \\  \n"
635b58a420fSArgyrios Kyrtzidis                                                     "2 + \\\t\n"
636b58a420fSArgyrios Kyrtzidis                                                     "3\n",
637b58a420fSArgyrios Kyrtzidis                                                     Out));
638*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#define A 1+\\  \n"
639*b4c83a13SArgyrios Kyrtzidis                "2+\\\t\n"
640*b4c83a13SArgyrios Kyrtzidis                "3\n",
641*b4c83a13SArgyrios Kyrtzidis                Out.data());
642b58a420fSArgyrios Kyrtzidis }
643b58a420fSArgyrios Kyrtzidis 
644b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, PoundWarningAndError) {
645b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
646b58a420fSArgyrios Kyrtzidis 
647b58a420fSArgyrios Kyrtzidis   for (auto Source : {
648b58a420fSArgyrios Kyrtzidis            "#warning '\n#include <t.h>\n",
649b58a420fSArgyrios Kyrtzidis            "#warning \"\n#include <t.h>\n",
650b58a420fSArgyrios Kyrtzidis            "#warning /*\n#include <t.h>\n",
651b58a420fSArgyrios Kyrtzidis            "#warning \\\n#include <t.h>\n#include <t.h>\n",
652b58a420fSArgyrios Kyrtzidis            "#error '\n#include <t.h>\n",
653b58a420fSArgyrios Kyrtzidis            "#error \"\n#include <t.h>\n",
654b58a420fSArgyrios Kyrtzidis            "#error /*\n#include <t.h>\n",
655b58a420fSArgyrios Kyrtzidis            "#error \\\n#include <t.h>\n#include <t.h>\n",
656b58a420fSArgyrios Kyrtzidis        }) {
657b58a420fSArgyrios Kyrtzidis     ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
658b58a420fSArgyrios Kyrtzidis     EXPECT_STREQ("#include <t.h>\n", Out.data());
659b58a420fSArgyrios Kyrtzidis   }
660b58a420fSArgyrios Kyrtzidis 
661b58a420fSArgyrios Kyrtzidis   for (auto Source : {
662b58a420fSArgyrios Kyrtzidis            "#warning \\\n#include <t.h>\n",
663b58a420fSArgyrios Kyrtzidis            "#error \\\n#include <t.h>\n",
664b58a420fSArgyrios Kyrtzidis        }) {
665b58a420fSArgyrios Kyrtzidis     ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
666b58a420fSArgyrios Kyrtzidis     EXPECT_STREQ("", Out.data());
667b58a420fSArgyrios Kyrtzidis   }
668b58a420fSArgyrios Kyrtzidis 
669b58a420fSArgyrios Kyrtzidis   for (auto Source : {
670b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#warning '\n#endif\n",
671b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#warning \"\n#endif\n",
672b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#warning /*\n#endif\n",
673b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#error '\n#endif\n",
674b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#error \"\n#endif\n",
675b58a420fSArgyrios Kyrtzidis            "#if MACRO\n#error /*\n#endif\n",
676b58a420fSArgyrios Kyrtzidis        }) {
677b58a420fSArgyrios Kyrtzidis     ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
678b58a420fSArgyrios Kyrtzidis     EXPECT_STREQ("#if MACRO\n#endif\n", Out.data());
679b58a420fSArgyrios Kyrtzidis   }
680b58a420fSArgyrios Kyrtzidis }
681b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CharacterLiteral)682b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteral) {
683b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
684b58a420fSArgyrios Kyrtzidis 
685b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(
686b58a420fSArgyrios Kyrtzidis #include <bob>
687b58a420fSArgyrios Kyrtzidis int a = 0'1;
688b58a420fSArgyrios Kyrtzidis int b = 0xfa'af'fa;
689b58a420fSArgyrios Kyrtzidis int c = 12 ' ';
690b58a420fSArgyrios Kyrtzidis #include <foo>
691b58a420fSArgyrios Kyrtzidis )";
692b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
693b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include <bob>\n#include <foo>\n", Out.data());
694b58a420fSArgyrios Kyrtzidis }
695b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CharacterLiteralPrefixL)696b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixL) {
697b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
698b58a420fSArgyrios Kyrtzidis 
699b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(L'P'
700b58a420fSArgyrios Kyrtzidis #if DEBUG
701b58a420fSArgyrios Kyrtzidis // '
702b58a420fSArgyrios Kyrtzidis #endif
703b58a420fSArgyrios Kyrtzidis #include <test.h>
704b58a420fSArgyrios Kyrtzidis )";
705b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
706b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#if DEBUG\n#endif\n#include <test.h>\n", Out.data());
707b58a420fSArgyrios Kyrtzidis }
708b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CharacterLiteralPrefixU)709b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixU) {
710b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
711b58a420fSArgyrios Kyrtzidis 
712b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(int x = U'P';
713b58a420fSArgyrios Kyrtzidis #include <test.h>
714b58a420fSArgyrios Kyrtzidis // '
715b58a420fSArgyrios Kyrtzidis )";
716b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
717b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include <test.h>\n", Out.data());
718b58a420fSArgyrios Kyrtzidis }
719b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CharacterLiteralPrefixu)720b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralPrefixu) {
721b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
722b58a420fSArgyrios Kyrtzidis 
723b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(int x = u'b';
724b58a420fSArgyrios Kyrtzidis int y = u8'a';
725b58a420fSArgyrios Kyrtzidis int z = 128'78;
726b58a420fSArgyrios Kyrtzidis #include <test.h>
727b58a420fSArgyrios Kyrtzidis // '
728b58a420fSArgyrios Kyrtzidis )";
729b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
730b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#include <test.h>\n", Out.data());
731b58a420fSArgyrios Kyrtzidis }
732b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,PragmaOnce)733b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) {
734b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
735*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 4> Tokens;
736b58a420fSArgyrios Kyrtzidis   SmallVector<Directive, 4> Directives;
737b58a420fSArgyrios Kyrtzidis 
738b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(// comment
739b58a420fSArgyrios Kyrtzidis #pragma once
740b58a420fSArgyrios Kyrtzidis // another comment
741b58a420fSArgyrios Kyrtzidis #include <test.h>
742b58a420fSArgyrios Kyrtzidis )";
743*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(
744*b4c83a13SArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives(Source, Out, Tokens, Directives));
745b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#pragma once\n#include <test.h>\n", Out.data());
746b58a420fSArgyrios Kyrtzidis   ASSERT_EQ(Directives.size(), 3u);
747b58a420fSArgyrios Kyrtzidis   EXPECT_EQ(Directives[0].Kind, dependency_directives_scan::pp_pragma_once);
748b58a420fSArgyrios Kyrtzidis 
749b58a420fSArgyrios Kyrtzidis   Source = R"(// comment
750b58a420fSArgyrios Kyrtzidis     #pragma once extra tokens
751b58a420fSArgyrios Kyrtzidis     // another comment
752b58a420fSArgyrios Kyrtzidis     #include <test.h>
753b58a420fSArgyrios Kyrtzidis     )";
754b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
755*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#pragma once extra tokens\n#include <test.h>\n", Out.data());
756b58a420fSArgyrios Kyrtzidis }
757b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,SkipLineStringCharLiteralsUntilNewline)758b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
759b58a420fSArgyrios Kyrtzidis      SkipLineStringCharLiteralsUntilNewline) {
760b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
761b58a420fSArgyrios Kyrtzidis 
762b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(#if NEVER_ENABLED
763b58a420fSArgyrios Kyrtzidis     #define why(fmt, ...) #error don't try me
764b58a420fSArgyrios Kyrtzidis     #endif
765b58a420fSArgyrios Kyrtzidis 
766b58a420fSArgyrios Kyrtzidis     void foo();
767b58a420fSArgyrios Kyrtzidis )";
768b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
769b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ(
770b58a420fSArgyrios Kyrtzidis       "#if NEVER_ENABLED\n#define why(fmt,...) #error don't try me\n#endif\n",
771b58a420fSArgyrios Kyrtzidis       Out.data());
772b58a420fSArgyrios Kyrtzidis 
773b58a420fSArgyrios Kyrtzidis   Source = R"(#if NEVER_ENABLED
774b58a420fSArgyrios Kyrtzidis       #define why(fmt, ...) "quote dropped
775b58a420fSArgyrios Kyrtzidis       #endif
776b58a420fSArgyrios Kyrtzidis 
777b58a420fSArgyrios Kyrtzidis       void foo();
778b58a420fSArgyrios Kyrtzidis   )";
779b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
780b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ(
781b58a420fSArgyrios Kyrtzidis       "#if NEVER_ENABLED\n#define why(fmt,...) \"quote dropped\n#endif\n",
782b58a420fSArgyrios Kyrtzidis       Out.data());
783b58a420fSArgyrios Kyrtzidis }
784b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,SupportWhitespaceBeforeLineContinuation)785b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
786b58a420fSArgyrios Kyrtzidis      SupportWhitespaceBeforeLineContinuation) {
787b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
788b58a420fSArgyrios Kyrtzidis 
789b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives("#define FOO(BAR) \\\n"
790b58a420fSArgyrios Kyrtzidis                                                     "  #BAR\\\n"
791b58a420fSArgyrios Kyrtzidis                                                     "  baz\n",
792b58a420fSArgyrios Kyrtzidis                                                     Out));
793b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define FOO(BAR) #BAR baz\n", Out.data());
794b58a420fSArgyrios Kyrtzidis }
795b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,SupportWhitespaceBeforeLineContinuationInStringSkipping)796b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest,
797b58a420fSArgyrios Kyrtzidis      SupportWhitespaceBeforeLineContinuationInStringSkipping) {
798b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
799b58a420fSArgyrios Kyrtzidis 
800b58a420fSArgyrios Kyrtzidis   StringRef Source = "#define X '\\ \t\nx'\nvoid foo() {}";
801b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
802b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define X '\\ \t\nx'\n", Out.data());
803b58a420fSArgyrios Kyrtzidis 
804b58a420fSArgyrios Kyrtzidis   Source = "#define X \"\\ \r\nx\"\nvoid foo() {}";
805b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
806b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define X \"\\ \r\nx\"\n", Out.data());
807b58a420fSArgyrios Kyrtzidis 
808b58a420fSArgyrios Kyrtzidis   Source = "#define X \"\\ \r\nx\n#include <x>\n";
809b58a420fSArgyrios Kyrtzidis   ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out));
810b58a420fSArgyrios Kyrtzidis   EXPECT_STREQ("#define X\"\\ \r\nx\n#include <x>\n", Out.data());
811b58a420fSArgyrios Kyrtzidis }
812b58a420fSArgyrios Kyrtzidis 
TEST(MinimizeSourceToDependencyDirectivesTest,CxxModules)813b58a420fSArgyrios Kyrtzidis TEST(MinimizeSourceToDependencyDirectivesTest, CxxModules) {
814b58a420fSArgyrios Kyrtzidis   SmallVector<char, 128> Out;
815*b4c83a13SArgyrios Kyrtzidis   SmallVector<dependency_directives_scan::Token, 4> Tokens;
816b58a420fSArgyrios Kyrtzidis   SmallVector<Directive, 4> Directives;
817b58a420fSArgyrios Kyrtzidis 
818b58a420fSArgyrios Kyrtzidis   StringRef Source = R"(
819b58a420fSArgyrios Kyrtzidis     module;
820b58a420fSArgyrios Kyrtzidis     #include "textual-header.h"
821b58a420fSArgyrios Kyrtzidis 
822b58a420fSArgyrios Kyrtzidis     export module m;
823b58a420fSArgyrios Kyrtzidis     exp\
824b58a420fSArgyrios Kyrtzidis ort \
825b58a420fSArgyrios Kyrtzidis       import \
826b58a420fSArgyrios Kyrtzidis       :l [[rename]];
827b58a420fSArgyrios Kyrtzidis 
828b58a420fSArgyrios Kyrtzidis     export void f();
829b58a420fSArgyrios Kyrtzidis 
830b58a420fSArgyrios Kyrtzidis     void h() {
831b58a420fSArgyrios Kyrtzidis       import.a = 3;
832b58a420fSArgyrios Kyrtzidis       import = 3;
833b58a420fSArgyrios Kyrtzidis       import <<= 3;
834b58a420fSArgyrios Kyrtzidis       import->a = 3;
835b58a420fSArgyrios Kyrtzidis       import();
836b58a420fSArgyrios Kyrtzidis       import . a();
837b58a420fSArgyrios Kyrtzidis 
838b58a420fSArgyrios Kyrtzidis       import a b d e d e f e;
839b58a420fSArgyrios Kyrtzidis       import foo [[no_unique_address]];
840b58a420fSArgyrios Kyrtzidis       import foo();
841b58a420fSArgyrios Kyrtzidis       import f(:sefse);
842b58a420fSArgyrios Kyrtzidis       import f(->a = 3);
843b58a420fSArgyrios Kyrtzidis     }
844b58a420fSArgyrios Kyrtzidis     )";
845*b4c83a13SArgyrios Kyrtzidis   ASSERT_FALSE(
846*b4c83a13SArgyrios Kyrtzidis       minimizeSourceToDependencyDirectives(Source, Out, Tokens, Directives));
847*b4c83a13SArgyrios Kyrtzidis   EXPECT_STREQ("#include \"textual-header.h\"\nexport module m;"
848*b4c83a13SArgyrios Kyrtzidis                "exp\\\nort import:l[[rename]];"
849*b4c83a13SArgyrios Kyrtzidis                "import<<=3;import a b d e d e f e;"
850*b4c83a13SArgyrios Kyrtzidis                "import foo[[no_unique_address]];import foo();"
851*b4c83a13SArgyrios Kyrtzidis                "import f(:sefse);import f(->a=3);\n",
852b58a420fSArgyrios Kyrtzidis                Out.data());
853*b4c83a13SArgyrios Kyrtzidis   ASSERT_EQ(Directives.size(), 10u);
854*b4c83a13SArgyrios Kyrtzidis   EXPECT_EQ(Directives[0].Kind, pp_include);
855*b4c83a13SArgyrios Kyrtzidis   EXPECT_EQ(Directives[1].Kind, cxx_export_module_decl);
856b58a420fSArgyrios Kyrtzidis }
857b58a420fSArgyrios Kyrtzidis 
858b58a420fSArgyrios Kyrtzidis } // end anonymous namespace
859