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