Selaa lähdekoodia

Add flag tests.

Sam Jaffe 4 vuotta sitten
vanhempi
commit
754aea089d
3 muutettua tiedostoa jossa 62 lisäystä ja 1 poistoa
  1. 4 0
      program_args.xcodeproj/project.pbxproj
  2. 57 0
      test/flag_test.cpp
  3. 1 1
      test/options_test.cpp

+ 4 - 0
program_args.xcodeproj/project.pbxproj

@@ -9,6 +9,7 @@
 /* Begin PBXBuildFile section */
 		CD8C5A8925D057900004A6D9 /* GoogleMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE4F79B25CF316A009E4EC1 /* GoogleMock.framework */; };
 		CD8C5A8B25D057AA0004A6D9 /* options_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD8C5A8A25D057AA0004A6D9 /* options_test.cpp */; };
+		CD8C5AA025D06D0B0004A6D9 /* flag_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD8C5A9F25D06D0B0004A6D9 /* flag_test.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -58,6 +59,7 @@
 		CD8C5A9225D057C00004A6D9 /* arguments_impl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = arguments_impl.hpp; sourceTree = "<group>"; };
 		CD8C5A9325D057C00004A6D9 /* exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exception.h; sourceTree = "<group>"; };
 		CD8C5A9625D058470004A6D9 /* xcode_gtest_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xcode_gtest_helper.h; sourceTree = "<group>"; };
+		CD8C5A9F25D06D0B0004A6D9 /* flag_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = flag_test.cpp; sourceTree = "<group>"; };
 		CDE4F78A25CF309E009E4EC1 /* libprogram_args.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libprogram_args.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDE4F79325CF316A009E4EC1 /* GoogleMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GoogleMock.xcodeproj; path = "../../../gmock-xcode-master/GoogleMock.xcodeproj"; sourceTree = "<group>"; };
 		CDE4F7A225CF317C009E4EC1 /* program_args */ = {isa = PBXFileReference; lastKnownFileType = folder; name = program_args; path = include/program_args; sourceTree = "<group>"; };
@@ -143,6 +145,7 @@
 			children = (
 				CD8C5A9625D058470004A6D9 /* xcode_gtest_helper.h */,
 				CD8C5A8A25D057AA0004A6D9 /* options_test.cpp */,
+				CD8C5A9F25D06D0B0004A6D9 /* flag_test.cpp */,
 			);
 			path = test;
 			sourceTree = "<group>";
@@ -294,6 +297,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				CD8C5A8B25D057AA0004A6D9 /* options_test.cpp in Sources */,
+				CD8C5AA025D06D0B0004A6D9 /* flag_test.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 57 - 0
test/flag_test.cpp

@@ -0,0 +1,57 @@
+//
+//  flag_test.cpp
+//  program_args-test
+//
+//  Created by Sam Jaffe on 2/7/21.
+//
+
+#include "program_args/arguments.h"
+
+#include "xcode_gtest_helper.h"
+
+using testing::Eq;
+
+template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
+  return T(N, argv);
+}
+
+struct FlagTest : program::Arguments<FlagTest> {
+  using program::Arguments<FlagTest>::Arguments;
+
+  bool dry_run = flag("dry-run");
+  int verbosity = flag("verbose");
+};
+
+TEST(FlagTest, ArgumentsAreDefaultedNaturally) {
+  auto const options = parse<FlagTest>({""});
+  EXPECT_THAT(options.dry_run, Eq(false));
+  EXPECT_THAT(options.verbosity, Eq(0));
+}
+
+TEST(FlagTest, FlagsDoNotRequireAdditionalArguments) {
+  EXPECT_NO_THROW(parse<FlagTest>({"", "--dry-run"}));
+}
+
+TEST(FlagTest, BooleanFlagSetsState) {
+  auto const options = parse<FlagTest>({"", "--dry-run"});
+  EXPECT_THAT(options.dry_run, Eq(true));
+}
+
+TEST(FlagTest, BooleanFlagIsIdempotent) {
+  EXPECT_NO_THROW(parse<FlagTest>({"", "--dry-run", "--dry-run"}));
+}
+
+TEST(FlagTest, BooleanFlagCanBeInverted) {
+  auto const options = parse<FlagTest>({"", "--dry-run", "--no-dry-run"});
+  EXPECT_THAT(options.dry_run, Eq(false));
+}
+
+TEST(FlagTest, IntegerFlagIncrementsState) {
+  auto const options = parse<FlagTest>({"", "--verbose"});
+  EXPECT_THAT(options.verbosity, Eq(1));
+}
+
+TEST(FlagTest, IntegerFlagCanBeRepeated) {
+  auto const options = parse<FlagTest>({"", "--verbose", "--verbose"});
+  EXPECT_THAT(options.verbosity, Eq(2));
+}

+ 1 - 1
test/options_test.cpp

@@ -11,7 +11,7 @@
 
 using testing::Eq;
 
-template <typename T, size_t N> T parse(char const * const (&argv)[N]) {
+template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
   return T(N, argv);
 }