Переглянути джерело

Test increment and decrement.

Sam Jaffe 5 роки тому
батько
коміт
ee718b8651

+ 4 - 0
opaque_typedef.xcodeproj/project.pbxproj

@@ -12,6 +12,7 @@
 		CDE8546724DF5051006FE7C7 /* opaque_typedef in Resources */ = {isa = PBXBuildFile; fileRef = CDE8546624DF5051006FE7C7 /* opaque_typedef */; };
 		CDE8547324DF80EE006FE7C7 /* opaque_typedef_comparable_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDE8547224DF80EE006FE7C7 /* opaque_typedef_comparable_test.cxx */; };
 		CDE8547524DF8110006FE7C7 /* opaque_typedef_adhoc_arithmatic_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDE8547424DF8110006FE7C7 /* opaque_typedef_adhoc_arithmatic_test.cxx */; };
+		CDE8547724DF8A6A006FE7C7 /* opaque_typedef_arithmatic_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDE8547624DF8A6A006FE7C7 /* opaque_typedef_arithmatic_test.cxx */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -60,6 +61,7 @@
 		CDE8546624DF5051006FE7C7 /* opaque_typedef */ = {isa = PBXFileReference; lastKnownFileType = folder; name = opaque_typedef; path = include/opaque_typedef; sourceTree = "<group>"; };
 		CDE8547224DF80EE006FE7C7 /* opaque_typedef_comparable_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = opaque_typedef_comparable_test.cxx; sourceTree = "<group>"; };
 		CDE8547424DF8110006FE7C7 /* opaque_typedef_adhoc_arithmatic_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = opaque_typedef_adhoc_arithmatic_test.cxx; sourceTree = "<group>"; };
+		CDE8547624DF8A6A006FE7C7 /* opaque_typedef_arithmatic_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = opaque_typedef_arithmatic_test.cxx; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -99,6 +101,7 @@
 				CD7048F020C48AE4007C944C /* opaque_typedef_conversion_test.cxx */,
 				CDE8547224DF80EE006FE7C7 /* opaque_typedef_comparable_test.cxx */,
 				CDE8547424DF8110006FE7C7 /* opaque_typedef_adhoc_arithmatic_test.cxx */,
+				CDE8547624DF8A6A006FE7C7 /* opaque_typedef_arithmatic_test.cxx */,
 			);
 			path = test;
 			sourceTree = "<group>";
@@ -230,6 +233,7 @@
 			files = (
 				CDE8547524DF8110006FE7C7 /* opaque_typedef_adhoc_arithmatic_test.cxx in Sources */,
 				CDE8547324DF80EE006FE7C7 /* opaque_typedef_comparable_test.cxx in Sources */,
+				CDE8547724DF8A6A006FE7C7 /* opaque_typedef_arithmatic_test.cxx in Sources */,
 				CD70491220C48B7C007C944C /* opaque_typedef_conversion_test.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 68 - 0
test/opaque_typedef_arithmatic_test.cxx

@@ -0,0 +1,68 @@
+//
+//  opaque_typedef_arithmatic_test.cpp
+//  opaque_typedef_test
+//
+//  Created by Sam Jaffe on 8/8/20.
+//  Copyright © 2020 Sam Jaffe. All rights reserved.
+//
+
+#include <gmock/gmock.h>
+#include <cmath>
+
+#include "opaque_typedef/arithmatic.hpp"
+#include "opaque_typedef/opaque_typedef.hpp"
+
+// Allow Eq() checks without needing the Skill EqualityComparable
+template <typename T>
+bool operator==(T const & lhs, T const & rhs) {
+  return lhs.get() == rhs.get();
+}
+
+// Make compilation (but not linking) possible for StaticAssertTypeEq to check
+// 'does a real version of this function exist'
+template <typename T> void operator++(T, int);
+template <typename T> void operator++(T);
+template <typename T> void operator--(T, int);
+template <typename T> void operator--(T);
+
+// Types for Test Cases
+using namespace types;
+using counter = opaque_typedef<uint32_t, struct counter_tag, Incrementable>;
+using countdown = opaque_typedef<uint32_t, struct countdown_tag, Decrementable>;
+
+// Actual Test Bodies
+TEST(OpaqueTypedefDecrementableTest, CannotDecrement) {
+  counter c{1};
+  EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(c--)>()));
+  EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(--c)>()));
+}
+
+TEST(OpaqueTypedefIncrementableTest, CanPostIncrement) {
+  counter c{1};
+  EXPECT_THAT(c++, testing::Eq(counter{1}));
+  EXPECT_THAT(c, testing::Eq(counter{2}));
+}
+
+TEST(OpaqueTypedefIncrementableTest, CanPreIncrement) {
+  counter c{1};
+  EXPECT_THAT(++c, testing::Eq(counter{2}));
+  EXPECT_THAT(c, testing::Eq(counter{2}));
+}
+
+TEST(OpaqueTypedefDecrementableTest, CannotIncrement) {
+  countdown c{10};
+  EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(c++)>()));
+  EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(++c)>()));
+}
+
+TEST(OpaqueTypedefDecrementableTest, CanPostDecrement) {
+  countdown c{10};
+  EXPECT_THAT(c--, testing::Eq(countdown{10}));
+  EXPECT_THAT(c, testing::Eq(countdown{9}));
+}
+
+TEST(OpaqueTypedefDecrementableTest, CanPreDecrement) {
+  countdown c{10};
+  EXPECT_THAT(--c, testing::Eq(countdown{9}));
+  EXPECT_THAT(c, testing::Eq(countdown{9}));
+}