X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=unittests%2FOption%2FOptionParsingTest.cpp;h=5270dc940f9624618d244e79763dcf2ce8026020;hb=124d2bc4dc3298d2b669be23a5b640d985319b65;hp=8bfa99b5de4abf3cba2672ca03d701883f57cb20;hpb=75b1783b2bf18572e9c286eaaa7f95ee82e7c514;p=oota-llvm.git diff --git a/unittests/Option/OptionParsingTest.cpp b/unittests/Option/OptionParsingTest.cpp index 8bfa99b5de4..5270dc940f9 100644 --- a/unittests/Option/OptionParsingTest.cpp +++ b/unittests/Option/OptionParsingTest.cpp @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" @@ -19,8 +18,8 @@ using namespace llvm::opt; enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ - HELPTEXT, METAVAR) OPT_##ID, +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR) OPT_##ID, #include "Opts.inc" LastOption #undef OPTION @@ -37,10 +36,10 @@ enum OptionFlags { }; static const OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR) \ { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, PARAM, \ - FLAGS, OPT_##GROUP, OPT_##ALIAS }, + FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS }, #include "Opts.inc" #undef OPTION }; @@ -48,8 +47,8 @@ static const OptTable::Info InfoTable[] = { namespace { class TestOptTable : public OptTable { public: - TestOptTable() - : OptTable(InfoTable, array_lengthof(InfoTable)) {} + TestOptTable(bool IgnoreCase = false) + : OptTable(InfoTable, IgnoreCase) {} }; } @@ -68,26 +67,26 @@ const char *Args[] = { TEST(Option, OptionParsing) { TestOptTable T; unsigned MAI, MAC; - OwningPtr AL(T.ParseArgs(Args, array_endof(Args), MAI, MAC)); + InputArgList AL = T.ParseArgs(Args, MAI, MAC); // Check they all exist. - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_TRUE(AL->hasArg(OPT_D)); - EXPECT_TRUE(AL->hasArg(OPT_E)); - EXPECT_TRUE(AL->hasArg(OPT_F)); - EXPECT_TRUE(AL->hasArg(OPT_G)); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_TRUE(AL.hasArg(OPT_D)); + EXPECT_TRUE(AL.hasArg(OPT_E)); + EXPECT_TRUE(AL.hasArg(OPT_F)); + EXPECT_TRUE(AL.hasArg(OPT_G)); // Check the values. - EXPECT_EQ(AL->getLastArgValue(OPT_B), "hi"); - EXPECT_EQ(AL->getLastArgValue(OPT_C), "bye"); - EXPECT_EQ(AL->getLastArgValue(OPT_D), "adena"); - std::vector Es = AL->getAllArgValues(OPT_E); + EXPECT_EQ(AL.getLastArgValue(OPT_B), "hi"); + EXPECT_EQ(AL.getLastArgValue(OPT_C), "bye"); + EXPECT_EQ(AL.getLastArgValue(OPT_D), "adena"); + std::vector Es = AL.getAllArgValues(OPT_E); EXPECT_EQ(Es[0], "apple"); EXPECT_EQ(Es[1], "bloom"); - EXPECT_EQ(AL->getLastArgValue(OPT_F), "42"); - std::vector Gs = AL->getAllArgValues(OPT_G); + EXPECT_EQ(AL.getLastArgValue(OPT_F), "42"); + std::vector Gs = AL.getAllArgValues(OPT_G); EXPECT_EQ(Gs[0], "chuu"); EXPECT_EQ(Gs[1], "2"); @@ -98,11 +97,11 @@ TEST(Option, OptionParsing) { EXPECT_NE(Help.find("-A"), std::string::npos); // Test aliases. - arg_iterator Cs = AL->filtered_begin(OPT_C); - ASSERT_NE(Cs, AL->filtered_end()); + arg_iterator Cs = AL.filtered_begin(OPT_C); + ASSERT_NE(Cs, AL.filtered_end()); EXPECT_EQ(StringRef((*Cs)->getValue()), "desu"); ArgStringList ASL; - (*Cs)->render(*AL, ASL); + (*Cs)->render(AL, ASL); ASSERT_EQ(ASL.size(), 2u); EXPECT_EQ(StringRef(ASL[0]), "-C"); EXPECT_EQ(StringRef(ASL[1]), "desu"); @@ -111,28 +110,107 @@ TEST(Option, OptionParsing) { TEST(Option, ParseWithFlagExclusions) { TestOptTable T; unsigned MAI, MAC; - OwningPtr AL; // Exclude flag3 to avoid parsing as OPT_SLASH_C. - AL.reset(T.ParseArgs(Args, array_endof(Args), MAI, MAC, - /*FlagsToInclude=*/0, - /*FlagsToExclude=*/OptFlag3)); - EXPECT_TRUE(AL->hasArg(OPT_A)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_FALSE(AL->hasArg(OPT_SLASH_C)); + InputArgList AL = T.ParseArgs(Args, MAI, MAC, + /*FlagsToInclude=*/0, + /*FlagsToExclude=*/OptFlag3); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_FALSE(AL.hasArg(OPT_SLASH_C)); // Exclude flag1 to avoid parsing as OPT_C. - AL.reset(T.ParseArgs(Args, array_endof(Args), MAI, MAC, - /*FlagsToInclude=*/0, - /*FlagsToExclude=*/OptFlag1)); - EXPECT_TRUE(AL->hasArg(OPT_B)); - EXPECT_FALSE(AL->hasArg(OPT_C)); - EXPECT_TRUE(AL->hasArg(OPT_SLASH_C)); + AL = T.ParseArgs(Args, MAI, MAC, + /*FlagsToInclude=*/0, + /*FlagsToExclude=*/OptFlag1); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_FALSE(AL.hasArg(OPT_C)); + EXPECT_TRUE(AL.hasArg(OPT_SLASH_C)); const char *NewArgs[] = { "/C", "foo", "--C=bar" }; - AL.reset(T.ParseArgs(NewArgs, array_endof(NewArgs), MAI, MAC)); - EXPECT_TRUE(AL->hasArg(OPT_SLASH_C)); - EXPECT_TRUE(AL->hasArg(OPT_C)); - EXPECT_EQ(AL->getLastArgValue(OPT_SLASH_C), "foo"); - EXPECT_EQ(AL->getLastArgValue(OPT_C), "bar"); + AL = T.ParseArgs(NewArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_SLASH_C)); + EXPECT_TRUE(AL.hasArg(OPT_C)); + EXPECT_EQ(AL.getLastArgValue(OPT_SLASH_C), "foo"); + EXPECT_EQ(AL.getLastArgValue(OPT_C), "bar"); +} + +TEST(Option, ParseAliasInGroup) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-I" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_H)); +} + +TEST(Option, AliasArgs) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-J", "-Joo" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[0], "foo"); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[1], "bar"); +} + +TEST(Option, IgnoreCase) { + TestOptTable T(true); + unsigned MAI, MAC; + + const char *MyArgs[] = { "-a", "-joo" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_B)); +} + +TEST(Option, DoNotIgnoreCase) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-a", "-joo" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_FALSE(AL.hasArg(OPT_A)); + EXPECT_FALSE(AL.hasArg(OPT_B)); +} + +TEST(Option, SlurpEmpty) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-A", "-slurp" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_TRUE(AL.hasArg(OPT_Slurp)); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp).size(), 0U); +} + +TEST(Option, Slurp) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-A", "-slurp", "-B", "--", "foo" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_EQ(AL.size(), 2U); + EXPECT_TRUE(AL.hasArg(OPT_A)); + EXPECT_FALSE(AL.hasArg(OPT_B)); + EXPECT_TRUE(AL.hasArg(OPT_Slurp)); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp).size(), 3U); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[0], "-B"); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[1], "--"); + EXPECT_EQ(AL.getAllArgValues(OPT_Slurp)[2], "foo"); +} + +TEST(Option, FlagAliasToJoined) { + TestOptTable T; + unsigned MAI, MAC; + + // Check that a flag alias provides an empty argument to a joined option. + const char *MyArgs[] = { "-K" }; + InputArgList AL = T.ParseArgs(MyArgs, MAI, MAC); + EXPECT_EQ(AL.size(), 1U); + EXPECT_TRUE(AL.hasArg(OPT_B)); + EXPECT_EQ(AL.getAllArgValues(OPT_B).size(), 1U); + EXPECT_EQ(AL.getAllArgValues(OPT_B)[0], ""); }