summaryrefslogtreecommitdiff
path: root/unittests/Option
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2013-12-22 00:04:03 +0000
committerDimitry Andric <dim@FreeBSD.org>2013-12-22 00:04:03 +0000
commitf8af5cf600354830d4ccf59732403f0f073eccb9 (patch)
tree2ba0398b4c42ad4f55561327538044fd2c925a8b /unittests/Option
parent59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff)
Diffstat (limited to 'unittests/Option')
-rw-r--r--unittests/Option/Makefile23
-rw-r--r--unittests/Option/OptionParsingTest.cpp123
-rw-r--r--unittests/Option/Opts.td23
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>;