Explorar o código

Convert to GoogleTest

Sam Jaffe %!s(int64=6) %!d(string=hai) anos
pai
achega
457827ddf8

+ 22 - 0
stream-test/Info.plist

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>

+ 164 - 88
stream.xcodeproj/project.pbxproj

@@ -7,34 +7,57 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		CD9337351E3CD7B700699FF5 /* stream_tc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD9337271E3CD78B00699FF5 /* stream_tc.cpp */; };
+		CDEC1D7623514BEB0091D9F2 /* stream_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD9337281E3CD78B00699FF5 /* stream_test.cxx */; };
+		CDEC1D7723514BEB0091D9F2 /* stream_fluent_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDF9374E1E3D9AD7003E5D5C /* stream_fluent_test.cxx */; };
+		CDEC1D7923514BF80091D9F2 /* GoogleMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDEC1D6323514BB50091D9F2 /* GoogleMock.framework */; };
 /* End PBXBuildFile section */
 
-/* Begin PBXCopyFilesBuildPhase section */
-		CD93372B1E3CD79E00699FF5 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = /usr/share/man/man1/;
-			dstSubfolderSpec = 0;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
+/* Begin PBXContainerItemProxy section */
+		CDEC1D6223514BB50091D9F2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 05818F861A685AEA0072A469;
+			remoteInfo = GoogleMock;
+		};
+		CDEC1D6423514BB50091D9F2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 05E96ABD1A68600C00204102;
+			remoteInfo = gmock;
 		};
-/* End PBXCopyFilesBuildPhase section */
+		CDEC1D6623514BB50091D9F2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 05E96B1F1A68634900204102;
+			remoteInfo = gtest;
+		};
+		CDEC1D6823514BB50091D9F2 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 05818F901A685AEA0072A469;
+			remoteInfo = GoogleMockTests;
+		};
+/* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		CD9337271E3CD78B00699FF5 /* stream_tc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = stream_tc.cpp; sourceTree = "<group>"; };
-		CD9337281E3CD78B00699FF5 /* stream.t.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stream.t.h; sourceTree = "<group>"; };
-		CD93372D1E3CD79E00699FF5 /* stream_tc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = stream_tc; sourceTree = BUILT_PRODUCTS_DIR; };
+		CD9337281E3CD78B00699FF5 /* stream_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = stream_test.cxx; sourceTree = "<group>"; };
 		CDAA170121A3A738007BBA11 /* stream */ = {isa = PBXFileReference; lastKnownFileType = folder; name = stream; path = include/stream; sourceTree = "<group>"; };
-		CDF9374E1E3D9AD7003E5D5C /* stream_fluent.t.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stream_fluent.t.h; sourceTree = "<group>"; };
+		CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GoogleMock.xcodeproj; path = "../../../../gmock-xcode-master/GoogleMock.xcodeproj"; sourceTree = "<group>"; };
+		CDEC1D6E23514BC60091D9F2 /* stream-test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "stream-test.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		CDEC1D7223514BC60091D9F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		CDF9374E1E3D9AD7003E5D5C /* stream_fluent_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = stream_fluent_test.cxx; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		CD93372A1E3CD79E00699FF5 /* Frameworks */ = {
+		CDEC1D6B23514BC60091D9F2 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CDEC1D7923514BF80091D9F2 /* GoogleMock.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -44,16 +67,19 @@
 		0E5DFDB91BB4D3190063976E = {
 			isa = PBXGroup;
 			children = (
+				CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */,
 				CDAA170121A3A738007BBA11 /* stream */,
 				CD9337371E3CD88200699FF5 /* test */,
+				CDEC1D6F23514BC60091D9F2 /* stream-test */,
 				CD93372E1E3CD79E00699FF5 /* Products */,
+				CDEC1D7823514BF80091D9F2 /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
 		CD93372E1E3CD79E00699FF5 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				CD93372D1E3CD79E00699FF5 /* stream_tc */,
+				CDEC1D6E23514BC60091D9F2 /* stream-test.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -61,33 +87,57 @@
 		CD9337371E3CD88200699FF5 /* test */ = {
 			isa = PBXGroup;
 			children = (
-				CD9337281E3CD78B00699FF5 /* stream.t.h */,
-				CDF9374E1E3D9AD7003E5D5C /* stream_fluent.t.h */,
-				CD9337271E3CD78B00699FF5 /* stream_tc.cpp */,
+				CD9337281E3CD78B00699FF5 /* stream_test.cxx */,
+				CDF9374E1E3D9AD7003E5D5C /* stream_fluent_test.cxx */,
 			);
 			path = test;
 			sourceTree = "<group>";
 		};
+		CDEC1D5C23514BB50091D9F2 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				CDEC1D6323514BB50091D9F2 /* GoogleMock.framework */,
+				CDEC1D6523514BB50091D9F2 /* gmock.framework */,
+				CDEC1D6723514BB50091D9F2 /* gtest.framework */,
+				CDEC1D6923514BB50091D9F2 /* GoogleMockTests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		CDEC1D6F23514BC60091D9F2 /* stream-test */ = {
+			isa = PBXGroup;
+			children = (
+				CDEC1D7223514BC60091D9F2 /* Info.plist */,
+			);
+			path = "stream-test";
+			sourceTree = "<group>";
+		};
+		CDEC1D7823514BF80091D9F2 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		CD93372C1E3CD79E00699FF5 /* stream_tc */ = {
+		CDEC1D6D23514BC60091D9F2 /* stream-test */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = CD9337321E3CD79E00699FF5 /* Build configuration list for PBXNativeTarget "stream_tc" */;
+			buildConfigurationList = CDEC1D7323514BC60091D9F2 /* Build configuration list for PBXNativeTarget "stream-test" */;
 			buildPhases = (
-				CD9337361E3CD81000699FF5 /* ShellScript */,
-				CD9337291E3CD79E00699FF5 /* Sources */,
-				CD93372A1E3CD79E00699FF5 /* Frameworks */,
-				CD93372B1E3CD79E00699FF5 /* CopyFiles */,
+				CDEC1D6A23514BC60091D9F2 /* Sources */,
+				CDEC1D6B23514BC60091D9F2 /* Frameworks */,
+				CDEC1D6C23514BC60091D9F2 /* Resources */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = stream_tc;
-			productName = stream_tc;
-			productReference = CD93372D1E3CD79E00699FF5 /* stream_tc */;
-			productType = "com.apple.product-type.tool";
+			name = "stream-test";
+			productName = "stream-test";
+			productReference = CDEC1D6E23514BC60091D9F2 /* stream-test.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
 		};
 /* End PBXNativeTarget section */
 
@@ -97,8 +147,9 @@
 			attributes = {
 				LastUpgradeCheck = 1030;
 				TargetAttributes = {
-					CD93372C1E3CD79E00699FF5 = {
-						CreatedOnToolsVersion = 7.2.1;
+					CDEC1D6D23514BC60091D9F2 = {
+						CreatedOnToolsVersion = 11.1;
+						ProvisioningStyle = Automatic;
 					};
 				};
 			};
@@ -113,38 +164,67 @@
 			mainGroup = 0E5DFDB91BB4D3190063976E;
 			productRefGroup = CD93372E1E3CD79E00699FF5 /* Products */;
 			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = CDEC1D5C23514BB50091D9F2 /* Products */;
+					ProjectRef = CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */;
+				},
+			);
 			projectRoot = "";
 			targets = (
-				CD93372C1E3CD79E00699FF5 /* stream_tc */,
+				CDEC1D6D23514BC60091D9F2 /* stream-test */,
 			);
 		};
 /* End PBXProject section */
 
-/* Begin PBXShellScriptBuildPhase section */
-		CD9337361E3CD81000699FF5 /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
+/* Begin PBXReferenceProxy section */
+		CDEC1D6323514BB50091D9F2 /* GoogleMock.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = GoogleMock.framework;
+			remoteRef = CDEC1D6223514BB50091D9F2 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		CDEC1D6523514BB50091D9F2 /* gmock.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = gmock.framework;
+			remoteRef = CDEC1D6423514BB50091D9F2 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		CDEC1D6723514BB50091D9F2 /* gtest.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = gtest.framework;
+			remoteRef = CDEC1D6623514BB50091D9F2 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		CDEC1D6923514BB50091D9F2 /* GoogleMockTests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = GoogleMockTests.xctest;
+			remoteRef = CDEC1D6823514BB50091D9F2 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+		CDEC1D6C23514BC60091D9F2 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
-			inputPaths = (
-				"$(SRCROOT)/test/stream.t.h",
-				"$(SRCROOT)/test/stream_fluent.t.h",
-			);
-			outputPaths = (
-				"$(SRCROOT)/test/stream_tc.cpp",
-			);
 			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "cd test\ncxxtestgen --error-printer -o stream_tc.cpp stream.t.h stream_fluent.t.h\n";
 		};
-/* End PBXShellScriptBuildPhase section */
+/* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
-		CD9337291E3CD79E00699FF5 /* Sources */ = {
+		CDEC1D6A23514BC60091D9F2 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				CD9337351E3CD7B700699FF5 /* stream_tc.cpp in Sources */,
+				CDEC1D7623514BEB0091D9F2 /* stream_test.cxx in Sources */,
+				CDEC1D7723514BEB0091D9F2 /* stream_fluent_test.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -184,6 +264,7 @@
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = macosx;
+				USER_HEADER_SEARCH_PATHS = ./include/;
 			};
 			name = Debug;
 		};
@@ -218,81 +299,76 @@
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				SDKROOT = macosx;
+				USER_HEADER_SEARCH_PATHS = ./include/;
 			};
 			name = Release;
 		};
-		CD9337331E3CD79E00699FF5 /* Debug */ = {
+		CDEC1D7423514BC60091D9F2 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGN_IDENTITY = "-";
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
 				DEBUG_INFORMATION_FORMAT = dwarf;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
 					"$(inherited)",
 				);
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				HEADER_SEARCH_PATHS = /usr/local/include/;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
-				MTL_ENABLE_DEBUG_INFO = YES;
+				INFOPLIST_FILE = "stream-test/Info.plist";
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.stream-test";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Debug;
 		};
-		CD9337341E3CD79E00699FF5 /* Release */ = {
+		CDEC1D7523514BC60091D9F2 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				CODE_SIGN_IDENTITY = "-";
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
-				ENABLE_STRICT_OBJC_MSGSEND = YES;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_NO_COMMON_BLOCKS = YES;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				HEADER_SEARCH_PATHS = /usr/local/include/;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
+				INFOPLIST_FILE = "stream-test/Info.plist";
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
 				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.stream-test";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			name = Release;
@@ -309,11 +385,11 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		CD9337321E3CD79E00699FF5 /* Build configuration list for PBXNativeTarget "stream_tc" */ = {
+		CDEC1D7323514BC60091D9F2 /* Build configuration list for PBXNativeTarget "stream-test" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
-				CD9337331E3CD79E00699FF5 /* Debug */,
-				CD9337341E3CD79E00699FF5 /* Release */,
+				CDEC1D7423514BC60091D9F2 /* Debug */,
+				CDEC1D7523514BC60091D9F2 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;

+ 5 - 0
stream.xcodeproj/xcuserdata/samjaffe.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -4,6 +4,11 @@
 <dict>
 	<key>SchemeUserState</key>
 	<dict>
+		<key>stream-test.xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>57</integer>
+		</dict>
 		<key>stream_tc.xcscheme</key>
 		<dict>
 			<key>isShown</key>

+ 0 - 163
test/stream.t.h

@@ -1,163 +0,0 @@
-//
-//  stream_td.hpp
-//  stream
-//
-//  Created by Sam Jaffe on 1/28/17.
-//
-
-#pragma once
-
-#include <cxxtest/TestSuite.h>
-
-#include <string>
-#include <vector>
-
-#include "streams.hpp"
-
-// Workaround for OSX and pointer-to-member-functions
-template class std::basic_string<char>;
-
-class stream_TestSuite : public CxxTest::TestSuite {
-public:
-  using int_t = int const &;
-  using vec_t = std::vector<int>;
-public:
-  void test_preserved() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto s = stream::make_stream(v);
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(v, o);
-  }
-  
-  void test_collect_preserves() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto s = stream::make_stream(v);
-    vec_t o{s.begin(), s.end()};
-    vec_t o2{s.collect()};
-    TS_ASSERT_EQUALS(v, o);
-    TS_ASSERT_EQUALS(v, o2);
-  }
-
-  void test_collect_arg_preserves() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto s = stream::make_stream(v);
-    std::set<int> o{};
-    s.collect(o);
-    for ( int i : v ) {
-      TS_ASSERT_EQUALS(o.count( i ), 1);
-    }
-  }
-  
-  void test_map_identity() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto identity = [](int_t i) { return i; };
-    auto s = stream::make_stream(v).map( identity );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(v, o);
-  }
-  
-  void test_map_change() {
-    vec_t v{1, 2, 3, 4, 5};
-    vec_t expected{3, 5, 7, 9, 11};
-    auto fmap = [](int_t i) { return 2*i+1; };
-    auto s = stream::make_stream(v).map( fmap );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-  
-  void test_singleton_stream() {
-    int_t value = 11;
-    auto even = [](int_t i) { return i%2==0; };
-    auto s = stream::make_stream(&value).filter( even );
-    TS_ASSERT(s.empty());
-  }
-
-  void test_stream_on_subrange() {
-    vec_t v{1, 2, 3, 4, 5};
-    vec_t expected{5, 7};
-    auto fmap = [](int_t i) { return 2*i+1; };
-    auto s = stream::make_stream(v.begin()+1, v.begin()+3).map( fmap );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-
-  void test_filter_noop() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto pass = [](int_t) { return true; };
-    auto s = stream::make_stream(v).filter( pass );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(v, o);
-  }
-  
-  void test_filter_value() {
-    vec_t v{1, 2, 3, 4, 5};
-    vec_t expected{2, 4};
-    auto even = [](int_t i) { return i%2 == 0; };
-    auto s = stream::make_stream(v).filter( even );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-  
-  void test_accumulate() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto even = [](int_t i) { return i%2 == 0; };
-    auto s = stream::make_stream(v).filter( even );
-    TS_ASSERT_EQUALS( 6 , s.accumulate(0) );
-  }
-
-  void test_accumulate_custom_function() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto even = [](int_t i) { return i%2 == 0; };
-    auto prod =[](int_t lhs, int_t rhs) { return lhs * rhs; };
-    auto s = stream::make_stream(v).filter( even );
-    TS_ASSERT_EQUALS( 8 , s.accumulate(prod, 1) );
-  }
-  
-  void test_flatmap_joins_lists() {
-    vec_t vv{1, 2, 3, 4, 5};
-    auto next3 = [](int_t i) { return vec_t{i, i+1, i+2}; };
-    vec_t expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
-    auto s = stream::make_stream(vv).flatmap( next3 );
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-  
-  void test_dereference() {
-    int val = 5;
-    std::vector<int*> v{&val};
-    auto data = stream::make_stream(v).deref().collect();
-    TS_ASSERT_EQUALS(data.front(), val);
-  }
-  
-  void test_foreach() {
-    int hits = 0;
-    vec_t v{1, 2, 3, 4, 5};
-    stream::make_stream(v).each([&hits](int_t){ ++hits; });
-    TS_ASSERT_EQUALS(hits, 5);
-  }
-  
-  void test_getmember() {
-    struct test { int val; };
-    std::vector<test> v{{1}, {3}, {2}};
-    vec_t expected{1, 3, 2};
-    auto out = stream::make_stream(v).map(&test::val).collect();
-    TS_ASSERT_EQUALS(out, expected);
-  }
-  
-  void test_memberfunction() {
-    std::vector<std::string> v{"hello", "goodbye"};
-    std::vector<std::string::size_type> expected{5, 7};
-    auto out = stream::make_stream(v).map(&std::string::size).collect();
-    TS_ASSERT_EQUALS(out, expected);
-  }
-  
-  void test_cast() {
-    struct base { char cat[4] = "cat"; };
-    struct test : base { test(int v) : val(v) {} int val; };
-    std::vector<test> v{{1}, {3}, {2}};
-    auto strm = stream::make_stream(v).cast<base>();
-    auto first = stream::make_stream(v).map([](test const & t) { return (void*)&t; }).collect();
-    auto second = strm.map([](base const & t) { return (void*)&t; }).collect();
-    TS_ASSERT_EQUALS(first, second);
-  }
-};

+ 0 - 82
test/stream_fluent.t.h

@@ -1,82 +0,0 @@
-//
-//  stream_fluent.t.h
-//  stream
-//
-//  Created by Sam Jaffe on 1/28/17.
-//
-
-#pragma once
-
-#include <cxxtest/TestSuite.h>
-
-#include <vector>
-
-#include "streams.hpp"
-#include "streams/fluent.hpp"
-
-class stream_fluent_TestSuite : public CxxTest::TestSuite {
-public:
-  using int_t = int const &;
-  using vec_t = std::vector<int>;
-public:
-  void test_collect_arg_preserves() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto s = stream::make_stream(v);
-    std::set<int> o{};
-    s > o;
-    for ( int i : v ) {
-      TS_ASSERT_EQUALS(o.count( i ), 1);
-    }
-  }
-  
-  void test_map_identity() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto identity = [](int_t i) { return i; };
-    auto s = stream::make_stream(v) | identity;
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(v, o);
-  }
-  
-  void test_map_change() {
-    vec_t v{1, 2, 3, 4, 5};
-    vec_t expected{3, 5, 7, 9, 11};
-    auto fmap = [](int_t i) { return 2*i+1; };
-    auto s = stream::make_stream(v) | fmap;
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-  
-  void test_filter_noop() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto pass = [](int_t) { return true; };
-    auto s = stream::make_stream(v) | pass;
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(v, o);
-  }
-  
-  void test_filter_value() {
-    vec_t v{1, 2, 3, 4, 5};
-    vec_t expected{2, 4};
-    auto even = [](int_t i) { return i%2 == 0; };
-    auto s = stream::make_stream(v) | even;
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-  
-  void test_accumulate() {
-    vec_t v{1, 2, 3, 4, 5};
-    auto even = [](int_t i) { return i%2 == 0; };
-    auto sum =[](int_t lhs, int_t rhs) { return lhs + rhs; };
-    auto s = stream::make_stream(v) | even;
-    TS_ASSERT_EQUALS( 6 , s > sum );
-  }
-  
-  void test_flatmap_joins_lists() {
-    vec_t vv{1, 2, 3, 4, 5};
-    auto next3 = [](int_t i) { return vec_t{i, i+1, i+2}; };
-    vec_t expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
-    auto s = stream::make_stream(vv) || next3;
-    vec_t o{s.begin(), s.end()};
-    TS_ASSERT_EQUALS(expected, o);
-  }
-};

+ 78 - 0
test/stream_fluent_test.cxx

@@ -0,0 +1,78 @@
+//
+//  stream_fluent.t.h
+//  stream
+//
+//  Created by Sam Jaffe on 1/28/17.
+//
+
+#include <gmock/gmock.h>
+
+#include <vector>
+
+#include "stream/streams.hpp"
+#include "stream/streams/fluent.hpp"
+
+using ::testing::Eq;
+
+using int_t = int const &;
+
+TEST(FluentStreamTest, CollectToObjectPreservesElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto s = stream::make_stream(v);
+  std::set<int> o{};
+  s > o;
+  for (int i : v ) {
+    EXPECT_THAT(o.count(i), Eq(1));
+  }
+}
+
+TEST(FluentStreamTest, MapToSelfIsSelfs) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto identity = [](int_t i) { return i; };
+  auto s = stream::make_stream(v) | identity;
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(v));
+}
+
+TEST(FluentStreamTest, MapCanAlterValues) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  std::vector<int> expected{3, 5, 7, 9, 11};
+  auto fmap = [](int_t i) { return 2*i+1; };
+  auto s = stream::make_stream(v) | fmap;
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}
+
+TEST(FluentStreamTest, NoOpFilterReturnOriginal) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto pass = [](int_t) { return true; };
+  auto s = stream::make_stream(v) | pass;
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(v));
+}
+
+TEST(FluentStreamTest, CanFilterOutElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  std::vector<int> expected{2, 4};
+  auto even = [](int_t i) { return i%2 == 0; };
+  auto s = stream::make_stream(v) | even;
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}
+
+TEST(FluentStreamTest, AccumulateDefaultsToAdd) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto even = [](int_t i) { return i%2 == 0; };
+  auto sum = [](int_t lhs, int_t rhs) { return lhs + rhs; };
+  auto s = stream::make_stream(v) | even;
+  EXPECT_THAT(s > sum, Eq(6));
+}
+
+TEST(FluentStreamTest, FlatmapJoinsIterableOutputs) {
+  std::vector<int> vv{1, 2, 3, 4, 5};
+  auto next3 = [](int_t i) { return std::vector<int>{i, i+1, i+2}; };
+  std::vector<int> expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
+  auto s = stream::make_stream(vv) || next3;
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}

+ 160 - 0
test/stream_test.cxx

@@ -0,0 +1,160 @@
+//
+//  stream_td.hpp
+//  stream
+//
+//  Created by Sam Jaffe on 1/28/17.
+//
+
+#include <gmock/gmock.h>
+
+#include <string>
+#include <vector>
+
+#include "stream/streams.hpp"
+
+using ::testing::Eq;
+
+// Workaround for OSX and pointer-to-member-functions
+template class std::basic_string<char>;
+
+using int_t = int const &;
+
+TEST(StreamTest, IteratorPreservesElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto s = stream::make_stream(v);
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(v, o);
+}
+
+TEST(StreamTest, CollectPreservesElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto s = stream::make_stream(v);
+  std::vector<int> o{s.begin(), s.end()};
+  std::vector<int> o2{s.collect()};
+  EXPECT_THAT(v, o);
+  EXPECT_THAT(v, o2);
+}
+
+TEST(StreamTest, CollectToObjectPreservesElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto s = stream::make_stream(v);
+  std::set<int> o{};
+  s.collect(o);
+  for (int i : v) {
+    EXPECT_THAT(o.count(i), Eq(1));
+  }
+}
+
+TEST(StreamTest, MapToSelfIsSelfs) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto identity = [](int_t i) { return i; };
+  auto s = stream::make_stream(v).map( identity );
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(v, o);
+}
+
+TEST(StreamTest, MapCanAlterValues) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  std::vector<int> expected{3, 5, 7, 9, 11};
+  auto fmap = [](int_t i) { return 2*i+1; };
+  auto s = stream::make_stream(v).map( fmap );
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(expected, o);
+}
+
+TEST(StreamTest, CanBuildFromSingleElement) {
+  int_t value = 11;
+  auto even = [](int_t i) { return i%2==0; };
+  auto s = stream::make_stream(&value).filter( even );
+  EXPECT_TRUE(s.empty());
+}
+
+TEST(StreamTest, CanBuildFromIterators) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  std::vector<int> expected{5, 7};
+  auto fmap = [](int_t i) { return 2*i+1; };
+  auto s = stream::make_stream(v.begin()+1, v.begin()+3).map(fmap);
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}
+
+TEST(StreamTest, NoOpFilterReturnOriginal) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto pass = [](int_t) { return true; };
+  auto s = stream::make_stream(v).filter( pass );
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(v));
+}
+
+TEST(StreamTest, CanFilterOutElements) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  std::vector<int> expected{2, 4};
+  auto even = [](int_t i) { return i%2 == 0; };
+  auto s = stream::make_stream(v).filter(even);
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}
+
+TEST(StreamTest, AccumulateDefaultsToAdd) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto even = [](int_t i) { return i%2 == 0; };
+  auto s = stream::make_stream(v).filter( even );
+  EXPECT_THAT(s.accumulate(0), Eq(6));
+}
+
+TEST(StreamTest, AccumulateCanTakeCustomAccumulator) {
+  std::vector<int> v{1, 2, 3, 4, 5};
+  auto even = [](int_t i) { return i%2 == 0; };
+  auto prod = [](int_t lhs, int_t rhs) { return lhs * rhs; };
+  auto s = stream::make_stream(v).filter(even);
+  EXPECT_THAT(s.accumulate(prod, 0), Eq(0));
+  EXPECT_THAT(s.accumulate(prod, 1), Eq(8));
+}
+
+TEST(StreamTest, FlatmapJoinsIterableOutputs) {
+  std::vector<int> vv{1, 2, 3, 4, 5};
+  auto next3 = [](int_t i) { return std::vector<int>{i, i+1, i+2}; };
+  std::vector<int> expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
+  auto s = stream::make_stream(vv).flatmap(next3);
+  std::vector<int> o{s.begin(), s.end()};
+  EXPECT_THAT(o, Eq(expected));
+}
+
+TEST(StreamTest, CanDereferenceElements) {
+  int val = 5;
+  std::vector<int*> v{&val};
+  auto data = stream::make_stream(v).deref().collect();
+  EXPECT_THAT(data.front(), val);
+}
+
+TEST(StreamTest, CanForEachConsume) {
+  int hits = 0;
+  std::vector<int> v{1, 2, 3, 4, 5};
+  stream::make_stream(v).each([&hits](int_t){ ++hits; });
+  EXPECT_THAT(hits, 5);
+}
+
+TEST(StreamTest, CanFetchMemPtr) {
+  struct test { int val; };
+  std::vector<test> v{{1}, {3}, {2}};
+  std::vector<int> expected{1, 3, 2};
+  auto out = stream::make_stream(v).map(&test::val).collect();
+  EXPECT_THAT(out, Eq(expected));
+}
+
+TEST(StreamTest, CanMapToMemFn) {
+  std::vector<std::string> v{"hello", "goodbye"};
+  std::vector<std::string::size_type> expected{5, 7};
+  auto out = stream::make_stream(v).map(&std::string::size).collect();
+  EXPECT_THAT(out, Eq(expected));
+}
+
+TEST(StreamTest, CastStreamToParentType) {
+  struct base { char cat[4] = "cat"; };
+  struct test : base { test(int v) : val(v) {} int val; };
+  std::vector<test> v{{1}, {3}, {2}};
+  auto strm = stream::make_stream(v).cast<base>();
+  auto first = stream::make_stream(v).map([](test const & t) { return (void*)&t; }).collect();
+  auto second = strm.map([](base const & t) { return (void*)&t; }).collect();
+  EXPECT_THAT(first, second);
+}