xref: /aosp_15_r20/external/llvm/unittests/Option/OptionParsingTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- unittest/Support/OptionParsingTest.cpp - OptTable tests ------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/Arg.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/ArgList.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/Option.h"
14*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker using namespace llvm::opt;
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker enum ID {
20*9880d681SAndroid Build Coastguard Worker   OPT_INVALID = 0, // This is not an option ID.
21*9880d681SAndroid Build Coastguard Worker #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
22*9880d681SAndroid Build Coastguard Worker                HELPTEXT, METAVAR) OPT_##ID,
23*9880d681SAndroid Build Coastguard Worker #include "Opts.inc"
24*9880d681SAndroid Build Coastguard Worker   LastOption
25*9880d681SAndroid Build Coastguard Worker #undef OPTION
26*9880d681SAndroid Build Coastguard Worker };
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker #define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE;
29*9880d681SAndroid Build Coastguard Worker #include "Opts.inc"
30*9880d681SAndroid Build Coastguard Worker #undef PREFIX
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker enum OptionFlags {
33*9880d681SAndroid Build Coastguard Worker   OptFlag1 = (1 << 4),
34*9880d681SAndroid Build Coastguard Worker   OptFlag2 = (1 << 5),
35*9880d681SAndroid Build Coastguard Worker   OptFlag3 = (1 << 6)
36*9880d681SAndroid Build Coastguard Worker };
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker static const OptTable::Info InfoTable[] = {
39*9880d681SAndroid Build Coastguard Worker #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
40*9880d681SAndroid Build Coastguard Worker                HELPTEXT, METAVAR)   \
41*9880d681SAndroid Build Coastguard Worker   { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, PARAM, \
42*9880d681SAndroid Build Coastguard Worker     FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS },
43*9880d681SAndroid Build Coastguard Worker #include "Opts.inc"
44*9880d681SAndroid Build Coastguard Worker #undef OPTION
45*9880d681SAndroid Build Coastguard Worker };
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker namespace {
48*9880d681SAndroid Build Coastguard Worker class TestOptTable : public OptTable {
49*9880d681SAndroid Build Coastguard Worker public:
TestOptTable(bool IgnoreCase=false)50*9880d681SAndroid Build Coastguard Worker   TestOptTable(bool IgnoreCase = false)
51*9880d681SAndroid Build Coastguard Worker     : OptTable(InfoTable, IgnoreCase) {}
52*9880d681SAndroid Build Coastguard Worker };
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker const char *Args[] = {
56*9880d681SAndroid Build Coastguard Worker   "-A",
57*9880d681SAndroid Build Coastguard Worker   "-Bhi",
58*9880d681SAndroid Build Coastguard Worker   "--C=desu",
59*9880d681SAndroid Build Coastguard Worker   "-C", "bye",
60*9880d681SAndroid Build Coastguard Worker   "-D,adena",
61*9880d681SAndroid Build Coastguard Worker   "-E", "apple", "bloom",
62*9880d681SAndroid Build Coastguard Worker   "-Fblarg",
63*9880d681SAndroid Build Coastguard Worker   "-F", "42",
64*9880d681SAndroid Build Coastguard Worker   "-Gchuu", "2"
65*9880d681SAndroid Build Coastguard Worker   };
66*9880d681SAndroid Build Coastguard Worker 
TEST(Option,OptionParsing)67*9880d681SAndroid Build Coastguard Worker TEST(Option, OptionParsing) {
68*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
69*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
70*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(Args, MAI, MAC);
71*9880d681SAndroid Build Coastguard Worker 
72*9880d681SAndroid Build Coastguard Worker   // Check they all exist.
73*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
74*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_B));
75*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_C));
76*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_D));
77*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_E));
78*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_F));
79*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_G));
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   // Check the values.
82*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("hi", AL.getLastArgValue(OPT_B));
83*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bye", AL.getLastArgValue(OPT_C));
84*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("adena", AL.getLastArgValue(OPT_D));
85*9880d681SAndroid Build Coastguard Worker   std::vector<std::string> Es = AL.getAllArgValues(OPT_E);
86*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("apple", Es[0]);
87*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bloom", Es[1]);
88*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("42", AL.getLastArgValue(OPT_F));
89*9880d681SAndroid Build Coastguard Worker   std::vector<std::string> Gs = AL.getAllArgValues(OPT_G);
90*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("chuu", Gs[0]);
91*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("2", Gs[1]);
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   // Check the help text.
94*9880d681SAndroid Build Coastguard Worker   std::string Help;
95*9880d681SAndroid Build Coastguard Worker   raw_string_ostream RSO(Help);
96*9880d681SAndroid Build Coastguard Worker   T.PrintHelp(RSO, "test", "title!");
97*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(std::string::npos, Help.find("-A"));
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   // Test aliases.
100*9880d681SAndroid Build Coastguard Worker   arg_iterator Cs = AL.filtered_begin(OPT_C);
101*9880d681SAndroid Build Coastguard Worker   ASSERT_NE(AL.filtered_end(), Cs);
102*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("desu", StringRef((*Cs)->getValue()));
103*9880d681SAndroid Build Coastguard Worker   ArgStringList ASL;
104*9880d681SAndroid Build Coastguard Worker   (*Cs)->render(AL, ASL);
105*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(2u, ASL.size());
106*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("-C", StringRef(ASL[0]));
107*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("desu", StringRef(ASL[1]));
108*9880d681SAndroid Build Coastguard Worker }
109*9880d681SAndroid Build Coastguard Worker 
TEST(Option,ParseWithFlagExclusions)110*9880d681SAndroid Build Coastguard Worker TEST(Option, ParseWithFlagExclusions) {
111*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
112*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker   // Exclude flag3 to avoid parsing as OPT_SLASH_C.
115*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(Args, MAI, MAC,
116*9880d681SAndroid Build Coastguard Worker                                 /*FlagsToInclude=*/0,
117*9880d681SAndroid Build Coastguard Worker                                 /*FlagsToExclude=*/OptFlag3);
118*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
119*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_C));
120*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(AL.hasArg(OPT_SLASH_C));
121*9880d681SAndroid Build Coastguard Worker 
122*9880d681SAndroid Build Coastguard Worker   // Exclude flag1 to avoid parsing as OPT_C.
123*9880d681SAndroid Build Coastguard Worker   AL = T.ParseArgs(Args, MAI, MAC,
124*9880d681SAndroid Build Coastguard Worker                    /*FlagsToInclude=*/0,
125*9880d681SAndroid Build Coastguard Worker                    /*FlagsToExclude=*/OptFlag1);
126*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_B));
127*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(AL.hasArg(OPT_C));
128*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SLASH_C));
129*9880d681SAndroid Build Coastguard Worker 
130*9880d681SAndroid Build Coastguard Worker   const char *NewArgs[] = { "/C", "foo", "--C=bar" };
131*9880d681SAndroid Build Coastguard Worker   AL = T.ParseArgs(NewArgs, MAI, MAC);
132*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SLASH_C));
133*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_C));
134*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("foo", AL.getLastArgValue(OPT_SLASH_C));
135*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bar", AL.getLastArgValue(OPT_C));
136*9880d681SAndroid Build Coastguard Worker }
137*9880d681SAndroid Build Coastguard Worker 
TEST(Option,ParseAliasInGroup)138*9880d681SAndroid Build Coastguard Worker TEST(Option, ParseAliasInGroup) {
139*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
140*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
141*9880d681SAndroid Build Coastguard Worker 
142*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-I" };
143*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
144*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_H));
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker 
TEST(Option,AliasArgs)147*9880d681SAndroid Build Coastguard Worker TEST(Option, AliasArgs) {
148*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
149*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-J", "-Joo" };
152*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
153*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_B));
154*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("foo", AL.getAllArgValues(OPT_B)[0]);
155*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bar", AL.getAllArgValues(OPT_B)[1]);
156*9880d681SAndroid Build Coastguard Worker }
157*9880d681SAndroid Build Coastguard Worker 
TEST(Option,IgnoreCase)158*9880d681SAndroid Build Coastguard Worker TEST(Option, IgnoreCase) {
159*9880d681SAndroid Build Coastguard Worker   TestOptTable T(true);
160*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-a", "-joo" };
163*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
164*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
165*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_B));
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker 
TEST(Option,DoNotIgnoreCase)168*9880d681SAndroid Build Coastguard Worker TEST(Option, DoNotIgnoreCase) {
169*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
170*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
171*9880d681SAndroid Build Coastguard Worker 
172*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-a", "-joo" };
173*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
174*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(AL.hasArg(OPT_A));
175*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(AL.hasArg(OPT_B));
176*9880d681SAndroid Build Coastguard Worker }
177*9880d681SAndroid Build Coastguard Worker 
TEST(Option,SlurpEmpty)178*9880d681SAndroid Build Coastguard Worker TEST(Option, SlurpEmpty) {
179*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
180*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
181*9880d681SAndroid Build Coastguard Worker 
182*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurp" };
183*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
184*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
185*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_Slurp));
186*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0U, AL.getAllArgValues(OPT_Slurp).size());
187*9880d681SAndroid Build Coastguard Worker }
188*9880d681SAndroid Build Coastguard Worker 
TEST(Option,Slurp)189*9880d681SAndroid Build Coastguard Worker TEST(Option, Slurp) {
190*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
191*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
192*9880d681SAndroid Build Coastguard Worker 
193*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurp", "-B", "--", "foo" };
194*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
195*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AL.size(), 2U);
196*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
197*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(AL.hasArg(OPT_B));
198*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_Slurp));
199*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(3U, AL.getAllArgValues(OPT_Slurp).size());
200*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("-B", AL.getAllArgValues(OPT_Slurp)[0]);
201*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("--", AL.getAllArgValues(OPT_Slurp)[1]);
202*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("foo", AL.getAllArgValues(OPT_Slurp)[2]);
203*9880d681SAndroid Build Coastguard Worker }
204*9880d681SAndroid Build Coastguard Worker 
TEST(Option,SlurpJoinedEmpty)205*9880d681SAndroid Build Coastguard Worker TEST(Option, SlurpJoinedEmpty) {
206*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
207*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurpjoined" };
210*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
211*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
212*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SlurpJoined));
213*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AL.getAllArgValues(OPT_SlurpJoined).size(), 0U);
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker 
TEST(Option,SlurpJoinedOneJoined)216*9880d681SAndroid Build Coastguard Worker TEST(Option, SlurpJoinedOneJoined) {
217*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
218*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurpjoinedfoo" };
221*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
222*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
223*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SlurpJoined));
224*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AL.getAllArgValues(OPT_SlurpJoined).size(), 1U);
225*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AL.getAllArgValues(OPT_SlurpJoined)[0], "foo");
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker 
TEST(Option,SlurpJoinedAndSeparate)228*9880d681SAndroid Build Coastguard Worker TEST(Option, SlurpJoinedAndSeparate) {
229*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
230*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
231*9880d681SAndroid Build Coastguard Worker 
232*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurpjoinedfoo", "bar", "baz" };
233*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
234*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
235*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SlurpJoined));
236*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(3U, AL.getAllArgValues(OPT_SlurpJoined).size());
237*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("foo", AL.getAllArgValues(OPT_SlurpJoined)[0]);
238*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bar", AL.getAllArgValues(OPT_SlurpJoined)[1]);
239*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("baz", AL.getAllArgValues(OPT_SlurpJoined)[2]);
240*9880d681SAndroid Build Coastguard Worker }
241*9880d681SAndroid Build Coastguard Worker 
TEST(Option,SlurpJoinedButSeparate)242*9880d681SAndroid Build Coastguard Worker TEST(Option, SlurpJoinedButSeparate) {
243*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
244*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
245*9880d681SAndroid Build Coastguard Worker 
246*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-A", "-slurpjoined", "foo", "bar", "baz" };
247*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
248*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_A));
249*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_SlurpJoined));
250*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(3U, AL.getAllArgValues(OPT_SlurpJoined).size());
251*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("foo", AL.getAllArgValues(OPT_SlurpJoined)[0]);
252*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("bar", AL.getAllArgValues(OPT_SlurpJoined)[1]);
253*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("baz", AL.getAllArgValues(OPT_SlurpJoined)[2]);
254*9880d681SAndroid Build Coastguard Worker }
255*9880d681SAndroid Build Coastguard Worker 
TEST(Option,FlagAliasToJoined)256*9880d681SAndroid Build Coastguard Worker TEST(Option, FlagAliasToJoined) {
257*9880d681SAndroid Build Coastguard Worker   TestOptTable T;
258*9880d681SAndroid Build Coastguard Worker   unsigned MAI, MAC;
259*9880d681SAndroid Build Coastguard Worker 
260*9880d681SAndroid Build Coastguard Worker   // Check that a flag alias provides an empty argument to a joined option.
261*9880d681SAndroid Build Coastguard Worker   const char *MyArgs[] = { "-K" };
262*9880d681SAndroid Build Coastguard Worker   InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC);
263*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AL.size(), 1U);
264*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(AL.hasArg(OPT_B));
265*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1U, AL.getAllArgValues(OPT_B).size());
266*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("", AL.getAllArgValues(OPT_B)[0]);
267*9880d681SAndroid Build Coastguard Worker }
268