Browse Source

Adding test cases to case_matcher.
Fixing bug where matched state not set.
Creating new macros for multi-matching.

Samuel Jaffe 8 years ago
parent
commit
65c828c7e7
4 changed files with 146 additions and 85 deletions
  1. 66 47
      case-matcher.xcodeproj/project.pbxproj
  2. 0 36
      match.cpp
  3. 13 2
      match.hpp
  4. 67 0
      match.t.h

+ 66 - 47
case-matcher.xcodeproj/project.pbxproj

@@ -7,18 +7,30 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		CD6E2CED1D84BF64002C1FB3 /* match.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD6E2CEB1D84BF64002C1FB3 /* match.cpp */; };
-		CD6E2CEE1D84BF64002C1FB3 /* match.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CD6E2CEC1D84BF64002C1FB3 /* match.hpp */; };
+		CD78202B1E44DB26001D22E5 /* case_matcher_tc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD7820291E44DB26001D22E5 /* case_matcher_tc.cpp */; };
 /* End PBXBuildFile section */
 
+/* Begin PBXCopyFilesBuildPhase section */
+		CD7820201E44DAD1001D22E5 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
 /* Begin PBXFileReference section */
-		CD6E2CDC1D84BF3C002C1FB3 /* libcase-matcher.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = "libcase-matcher.dylib"; sourceTree = BUILT_PRODUCTS_DIR; };
-		CD6E2CEB1D84BF64002C1FB3 /* match.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = match.cpp; sourceTree = "<group>"; };
 		CD6E2CEC1D84BF64002C1FB3 /* match.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = match.hpp; sourceTree = "<group>"; };
+		CD78201D1E44DABD001D22E5 /* match.t.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = match.t.h; sourceTree = "<group>"; };
+		CD7820221E44DAD1001D22E5 /* case_matcher_tc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = case_matcher_tc; sourceTree = BUILT_PRODUCTS_DIR; };
+		CD7820291E44DB26001D22E5 /* case_matcher_tc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = case_matcher_tc.cpp; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		CD6E2CD91D84BF3C002C1FB3 /* Frameworks */ = {
+		CD78201F1E44DAD1001D22E5 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -32,6 +44,7 @@
 			isa = PBXGroup;
 			children = (
 				CD6E2CEA1D84BF45002C1FB3 /* src */,
+				CD78201C1E44DAAE001D22E5 /* test */,
 				CD6E2CDD1D84BF3C002C1FB3 /* Products */,
 			);
 			sourceTree = "<group>";
@@ -39,7 +52,7 @@
 		CD6E2CDD1D84BF3C002C1FB3 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				CD6E2CDC1D84BF3C002C1FB3 /* libcase-matcher.dylib */,
+				CD7820221E44DAD1001D22E5 /* case_matcher_tc */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -47,42 +60,40 @@
 		CD6E2CEA1D84BF45002C1FB3 /* src */ = {
 			isa = PBXGroup;
 			children = (
-				CD6E2CEB1D84BF64002C1FB3 /* match.cpp */,
 				CD6E2CEC1D84BF64002C1FB3 /* match.hpp */,
 			);
 			name = src;
 			sourceTree = "<group>";
 		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		CD6E2CDA1D84BF3C002C1FB3 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				CD6E2CEE1D84BF64002C1FB3 /* match.hpp in Headers */,
+		CD78201C1E44DAAE001D22E5 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				CD78201D1E44DABD001D22E5 /* match.t.h */,
+				CD7820291E44DB26001D22E5 /* case_matcher_tc.cpp */,
 			);
-			runOnlyForDeploymentPostprocessing = 0;
+			name = test;
+			sourceTree = "<group>";
 		};
-/* End PBXHeadersBuildPhase section */
+/* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		CD6E2CDB1D84BF3C002C1FB3 /* case-matcher */ = {
+		CD7820211E44DAD1001D22E5 /* case_matcher_tc */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = CD6E2CE71D84BF3C002C1FB3 /* Build configuration list for PBXNativeTarget "case-matcher" */;
+			buildConfigurationList = CD7820261E44DAD1001D22E5 /* Build configuration list for PBXNativeTarget "case_matcher_tc" */;
 			buildPhases = (
-				CD6E2CD81D84BF3C002C1FB3 /* Sources */,
-				CD6E2CD91D84BF3C002C1FB3 /* Frameworks */,
-				CD6E2CDA1D84BF3C002C1FB3 /* Headers */,
+				CD78202C1E44DB3B001D22E5 /* ShellScript */,
+				CD78201E1E44DAD1001D22E5 /* Sources */,
+				CD78201F1E44DAD1001D22E5 /* Frameworks */,
+				CD7820201E44DAD1001D22E5 /* CopyFiles */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "case-matcher";
-			productName = "case-matcher";
-			productReference = CD6E2CDC1D84BF3C002C1FB3 /* libcase-matcher.dylib */;
-			productType = "com.apple.product-type.library.dynamic";
+			name = case_matcher_tc;
+			productName = case_matcher_tc;
+			productReference = CD7820221E44DAD1001D22E5 /* case_matcher_tc */;
+			productType = "com.apple.product-type.tool";
 		};
 /* End PBXNativeTarget section */
 
@@ -93,7 +104,7 @@
 				LastUpgradeCheck = 0720;
 				ORGANIZATIONNAME = "Sam Jaffe";
 				TargetAttributes = {
-					CD6E2CDB1D84BF3C002C1FB3 = {
+					CD7820211E44DAD1001D22E5 = {
 						CreatedOnToolsVersion = 7.2.1;
 					};
 				};
@@ -110,17 +121,35 @@
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				CD6E2CDB1D84BF3C002C1FB3 /* case-matcher */,
+				CD7820211E44DAD1001D22E5 /* case_matcher_tc */,
 			);
 		};
 /* End PBXProject section */
 
+/* Begin PBXShellScriptBuildPhase section */
+		CD78202C1E44DB3B001D22E5 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"$(SRCROOT)/match.t.h",
+			);
+			outputPaths = (
+				"$(SRCROOT)/case_matcher_tc.cpp",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cxxtestgen --error-printer -o case_matcher_tc.cpp match.t.h";
+		};
+/* End PBXShellScriptBuildPhase section */
+
 /* Begin PBXSourcesBuildPhase section */
-		CD6E2CD81D84BF3C002C1FB3 /* Sources */ = {
+		CD78201E1E44DAD1001D22E5 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				CD6E2CED1D84BF64002C1FB3 /* match.cpp in Sources */,
+				CD78202B1E44DB26001D22E5 /* case_matcher_tc.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -206,28 +235,18 @@
 			};
 			name = Release;
 		};
-		CD6E2CE81D84BF3C002C1FB3 /* Debug */ = {
+		CD7820271E44DAD1001D22E5 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				EXECUTABLE_PREFIX = lib;
-				GCC_ENABLE_CPP_EXCEPTIONS = YES;
-				GCC_ENABLE_CPP_RTTI = YES;
-				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				HEADER_SEARCH_PATHS = /usr/local/include/;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Debug;
 		};
-		CD6E2CE91D84BF3C002C1FB3 /* Release */ = {
+		CD7820281E44DAD1001D22E5 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				EXECUTABLE_PREFIX = lib;
-				GCC_ENABLE_CPP_EXCEPTIONS = YES;
-				GCC_ENABLE_CPP_RTTI = YES;
-				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				HEADER_SEARCH_PATHS = /usr/local/include/;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Release;
@@ -244,11 +263,11 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		CD6E2CE71D84BF3C002C1FB3 /* Build configuration list for PBXNativeTarget "case-matcher" */ = {
+		CD7820261E44DAD1001D22E5 /* Build configuration list for PBXNativeTarget "case_matcher_tc" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				CD6E2CE81D84BF3C002C1FB3 /* Debug */,
-				CD6E2CE91D84BF3C002C1FB3 /* Release */,
+				CD7820271E44DAD1001D22E5 /* Debug */,
+				CD7820281E44DAD1001D22E5 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 		};

+ 0 - 36
match.cpp

@@ -1,36 +0,0 @@
-//
-//  match.cpp
-//  case-matcher
-//
-//  Created by Sam Jaffe on 9/10/16.
-//
-#include <iostream>
-
-#include "match.hpp"
-
-struct example {
-  example(long in) : i(in) {}
-  example(example const &) : i(0xDEADBEEF) {}
-  long i;
-};
-
-bool operator==(example const & a, example const & b) {
-  return a.i == b.i;
-}
-
-int main() {
-  example const ex{1};
-  bool b{true};
-  
-  match(ex, b) {
-    with(example{1}, false) {
-      std::cout << "Match 1" << std::endl;
-    }
-    with(example{0xDEADBEEF}, matcher::any) {
-      std::cout << "Match 2" << std::endl;
-    }
-    with(matcher::any, true) {
-      std::cout << "Match 3" << std::endl;
-    }
-  }
-}

+ 13 - 2
match.hpp

@@ -28,11 +28,13 @@ namespace matcher {
     
     template <typename... NArgs>
     bool matches(NArgs &&... args) const {
-      return value == std::tuple<NArgs...>(std::forward<NArgs>(args)...);
+      bool const matched = value == std::make_tuple(std::forward<NArgs>(args)...);
+      satisfied |= matched;
+      return matched;
     }
   private:
     std::tuple<Args...> value;
-    bool satisfied = false;
+    mutable bool satisfied = false;
   };
   
   template <typename... Args>
@@ -48,3 +50,12 @@ namespace matcher {
 #define with( ... ) \
   if ( _matcher_local.unmatched( ) && \
       _matcher_local.matches( __VA_ARGS__ ) )
+
+#define else_with( ... ) \
+  else if ( _matcher_local.matches( __VA_ARGS__ ) )
+
+#define and_with( ... ) \
+  if ( _matcher_local.matches( __VA_ARGS__ ) )
+
+#define nomatch( ) \
+  if ( _matcher_local.unmatched( ) )

+ 67 - 0
match.t.h

@@ -0,0 +1,67 @@
+//
+//  match.t.h
+//  case-matcher
+//
+//  Created by Sam Jaffe on 2/3/17.
+//
+
+#pragma once
+
+#include "match.hpp"
+
+#include <cxxtest/TestSuite.h>
+
+struct example {
+  example(long in) : i(in) {}
+  long i;
+};
+
+bool operator==(example const & a, example const & b) {
+  return a.i == b.i;
+}
+
+class case_matcher_TestSuite : public CxxTest::TestSuite {
+public:
+  example const ex{1};
+  bool const b{true};
+public:
+  void test_match_explicit_case() {
+    match(ex, b) {
+      with(example{1}, true) {}
+      nomatch() { TS_FAIL("Unable to match"); }
+      TS_ASSERT( ! _matcher_local.unmatched() );
+    }
+  }
+  
+  void test_nomatch_incorrect_case() {
+    match(ex, b) {
+      with(example{1}, false) { TS_FAIL("Incorrect match!"); }
+      TS_ASSERT( _matcher_local.unmatched() );
+    }
+  }
+  
+  void test_match_fallback_case() {
+    match(ex, b) {
+      with(example{1}, false) { TS_FAIL("Incorrect match!"); }
+      with(example{1}, true) {}
+      TS_ASSERT( !_matcher_local.unmatched() );
+    }
+  }
+  
+  void test_match_any_case() {
+    match(ex, b) {
+      with(example{1}, false) { TS_FAIL("Incorrect match!"); }
+      with(matcher::any, true) {}
+      TS_ASSERT( !_matcher_local.unmatched() );
+    }
+  }
+  
+  void test_match_multiple_cases() {
+    int hits{0};
+    match(ex, b) {
+      with(matcher::any, true) { ++hits; }
+      and_with(example{1}, matcher::any) { ++hits; }
+    }
+    TS_ASSERT_EQUALS(hits, 2);
+  }
+};