diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 |
commit | f8af5cf600354830d4ccf59732403f0f073eccb9 (patch) | |
tree | 2ba0398b4c42ad4f55561327538044fd2c925a8b /unittests/Option | |
parent | 59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff) |
Diffstat (limited to 'unittests/Option')
-rw-r--r-- | unittests/Option/Makefile | 23 | ||||
-rw-r--r-- | unittests/Option/OptionParsingTest.cpp | 123 | ||||
-rw-r--r-- | unittests/Option/Opts.td | 23 |
3 files changed, 152 insertions, 17 deletions
diff --git a/unittests/Option/Makefile b/unittests/Option/Makefile new file mode 100644 index 0000000000000..8c90a83da872f --- /dev/null +++ b/unittests/Option/Makefile @@ -0,0 +1,23 @@ +##===- unittests/Option/Makefile ---------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../.. +TESTNAME = Option +LINK_COMPONENTS := option support + +BUILT_SOURCES = Opts.inc +TABLEGEN_INC_FILES_COMMON = 1 + +include $(LEVEL)/Makefile.config + +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest + +$(ObjDir)/Opts.inc.tmp : Opts.td $(LLVM_TBLGEN) $(ObjDir)/.dir + $(Echo) "Building Driver Option tables with tblgen" + $(Verb) $(LLVMTableGen) -gen-opt-parser-defs -o $(call SYSPATH, $@) $< diff --git a/unittests/Option/OptionParsingTest.cpp b/unittests/Option/OptionParsingTest.cpp index 30944d9be7976..11d6d1e87ebb0 100644 --- a/unittests/Option/OptionParsingTest.cpp +++ b/unittests/Option/OptionParsingTest.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" #include "llvm/Option/Option.h" @@ -18,8 +19,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 @@ -29,11 +30,17 @@ enum ID { #include "Opts.inc" #undef PREFIX +enum OptionFlags { + OptFlag1 = (1 << 4), + OptFlag2 = (1 << 5), + OptFlag3 = (1 << 6) +}; + 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 }; @@ -41,8 +48,8 @@ static const OptTable::Info InfoTable[] = { namespace { class TestOptTable : public OptTable { public: - TestOptTable() - : OptTable(InfoTable, sizeof(InfoTable) / sizeof(InfoTable[0])) {} + TestOptTable(bool IgnoreCase = false) + : OptTable(InfoTable, array_lengthof(InfoTable), IgnoreCase) {} }; } @@ -58,14 +65,10 @@ const char *Args[] = { "-Gchuu", "2" }; -TEST(Support, OptionParsing) { +TEST(Option, OptionParsing) { TestOptTable T; unsigned MAI, MAC; - OwningPtr<InputArgList> - AL(T.ParseArgs(Args, - Args + (sizeof(Args) / sizeof(Args[0])), - MAI, - MAC)); + OwningPtr<InputArgList> AL(T.ParseArgs(Args, array_endof(Args), MAI, MAC)); // Check they all exist. EXPECT_TRUE(AL->hasArg(OPT_A)); @@ -104,3 +107,99 @@ TEST(Support, OptionParsing) { EXPECT_EQ(StringRef(ASL[0]), "-C"); EXPECT_EQ(StringRef(ASL[1]), "desu"); } + +TEST(Option, ParseWithFlagExclusions) { + TestOptTable T; + unsigned MAI, MAC; + OwningPtr<InputArgList> 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)); + + // 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)); + + 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"); +} + +TEST(Option, ParseAliasInGroup) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-I" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(MyArgs), MAI, MAC)); + EXPECT_TRUE(AL->hasArg(OPT_H)); +} + +TEST(Option, AliasArgs) { + TestOptTable T; + unsigned MAI, MAC; + + const char *MyArgs[] = { "-J", "-Joo" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(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" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(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" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(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" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(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" }; + OwningPtr<InputArgList> AL(T.ParseArgs(MyArgs, array_endof(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"); +} diff --git a/unittests/Option/Opts.td b/unittests/Option/Opts.td index 3d6242f5185c8..aaed6b2101e00 100644 --- a/unittests/Option/Opts.td +++ b/unittests/Option/Opts.td @@ -1,13 +1,26 @@ include "llvm/Option/OptParser.td" -def A : Flag<["-"], "A">, HelpText<"The A option">; -def B : Joined<["-"], "B">, HelpText<"The B option">, MetaVarName<"B">; -def C : Separate<["-"], "C">, HelpText<"The C option">, MetaVarName<"C">; +def OptFlag1 : OptionFlag; +def OptFlag2 : OptionFlag; +def OptFlag3 : OptionFlag; + +def A : Flag<["-"], "A">, HelpText<"The A option">, Flags<[OptFlag1]>; +def B : Joined<["-"], "B">, HelpText<"The B option">, MetaVarName<"B">, Flags<[OptFlag2]>; +def C : Separate<["-"], "C">, HelpText<"The C option">, MetaVarName<"C">, Flags<[OptFlag1]>; +def SLASH_C : Separate<["/", "-"], "C">, HelpText<"The C option">, MetaVarName<"C">, Flags<[OptFlag3]>; def D : CommaJoined<["-"], "D">, HelpText<"The D option">, MetaVarName<"D">; -def E : MultiArg<["-"], "E", 2>; +def E : MultiArg<["-"], "E", 2>, Flags<[OptFlag1, OptFlag2]>; def F : JoinedOrSeparate<["-"], "F">, HelpText<"The F option">, MetaVarName<"F">; def G : JoinedAndSeparate<["-"], "G">, HelpText<"The G option">, MetaVarName<"G">; -def Ceq : Joined<["-", "--"], "C=">, Alias<C>; +def Ceq : Joined<["-", "--"], "C=">, Alias<C>, Flags<[OptFlag1]>; def H : Flag<["-"], "H">, Flags<[HelpHidden]>; + +def my_group : OptionGroup<"my group">; +def I : Flag<["-"], "I">, Alias<H>, Group<my_group>; + +def J : Flag<["-"], "J">, Alias<B>, AliasArgs<["foo"]>; +def Joo : Flag<["-"], "Joo">, Alias<B>, AliasArgs<["bar"]>; + +def Slurp : Option<["-"], "slurp", KIND_REMAINING_ARGS>; |