Jelajahi Sumber

Add difficulty_class object and unit tests.

Sam Jaffe 4 tahun lalu
induk
melakukan
fcd79ce3be
4 mengubah file dengan 74 tambahan dan 0 penghapusan
  1. 4 0
      dice-roll.xcodeproj/project.pbxproj
  2. 11 0
      include/dice-roll/die.h
  3. 11 0
      src/die.cxx
  4. 48 0
      test/die_test.cxx

+ 4 - 0
dice-roll.xcodeproj/project.pbxproj

@@ -24,6 +24,7 @@
 		CDED6A2721B2F28A00AB91D0 /* main.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDED6A2621B2F28A00AB91D0 /* main.cxx */; };
 		CDEE78F725B336B000F195F9 /* parser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDEE78F625B336B000F195F9 /* parser.cxx */; };
 		CDEE790225B336EC00F195F9 /* io.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDEE790125B336EC00F195F9 /* io.cxx */; };
+		CDEE7A6B25B34DAA00F195F9 /* die_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDEE7A6A25B34DAA00F195F9 /* die_test.cxx */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -121,6 +122,7 @@
 		CDEE78F625B336B000F195F9 /* parser.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cxx; sourceTree = "<group>"; };
 		CDEE790125B336EC00F195F9 /* io.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = io.cxx; sourceTree = "<group>"; };
 		CDEE7A5925B3437D00F195F9 /* terminal_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terminal_helper.h; sourceTree = "<group>"; };
+		CDEE7A6A25B34DAA00F195F9 /* die_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = die_test.cxx; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -239,6 +241,7 @@
 			isa = PBXGroup;
 			children = (
 				CD38F53421C87799007A732C /* parser_test.cxx */,
+				CDEE7A6A25B34DAA00F195F9 /* die_test.cxx */,
 				CD38F53821C922E2007A732C /* roll_test.cxx */,
 				CD38F53A21C928B4007A732C /* exception_test.cxx */,
 				CDEE78ED25B3350B00F195F9 /* xcode_gtest_helper.h */,
@@ -448,6 +451,7 @@
 			files = (
 				CD38F53B21C928B4007A732C /* exception_test.cxx in Sources */,
 				CD38F53921C922E2007A732C /* roll_test.cxx in Sources */,
+				CDEE7A6B25B34DAA00F195F9 /* die_test.cxx in Sources */,
 				CD38F53521C87799007A732C /* parser_test.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 11 - 0
include/dice-roll/die.h

@@ -13,9 +13,11 @@
 
 namespace dice {
 enum class sign { PLUS = 1, MINUS = -1, ZERO = 0 };
+
 template <typename T> static sign sgn(T val) {
   return sign((T(0) < val) - (val < T(0)));
 }
+
 int sgn(sign);
 std::string str(sign);
 
@@ -30,6 +32,15 @@ struct mod {
   int value;
 };
 
+struct difficulty_class {
+  enum class test { None, Less, LessOrEqual, Greater, GreaterOrEqual };
+  
+  bool operator()(int value) const;
+  
+  test comp;
+  int against;
+};
+
 // Default value: 1{+0}
 struct dice {
   int num{1};

+ 11 - 0
src/die.cxx

@@ -27,4 +27,15 @@ std::string str(sign s) {
 }
 
 mod::operator int() const { return sgn(sign) * value; }
+
+bool difficulty_class::operator()(int value) const {
+  switch (comp) {
+    case test::None: return true;
+    case test::Less: return value < against;
+    case test::LessOrEqual: return value <= against;
+    case test::Greater: return value > against;
+    case test::GreaterOrEqual: return value >= against;
+  }
+}
+
 }

+ 48 - 0
test/die_test.cxx

@@ -0,0 +1,48 @@
+//
+//  die_test.cxx
+//  dice-td
+//
+//  Created by Sam Jaffe on 1/16/21.
+//  Copyright © 2021 Sam Jaffe. All rights reserved.
+//
+
+#include "xcode_gtest_helper.h"
+
+#include "dice-roll/die.h"
+
+using test = dice::difficulty_class::test;
+
+TEST(DifficultyClass, NoneAlwaysReturnsTrue) {
+  dice::difficulty_class dc{test::None, 0};
+  for (int i = -100; i < 100; ++i) {
+    EXPECT_TRUE(dc(i));
+  }
+}
+
+TEST(DifficultyClass, LessThan) {
+  dice::difficulty_class dc{test::Less, 10};
+  EXPECT_TRUE(dc(9));
+  EXPECT_FALSE(dc(10));
+  EXPECT_FALSE(dc(11));
+}
+
+TEST(DifficultyClass, LessThanOrEqualTo) {
+  dice::difficulty_class dc{test::LessOrEqual, 10};
+  EXPECT_TRUE(dc(9));
+  EXPECT_TRUE(dc(10));
+  EXPECT_FALSE(dc(11));
+}
+
+TEST(DifficultyClass, GreaterThan) {
+  dice::difficulty_class dc{test::Greater, 10};
+  EXPECT_FALSE(dc(9));
+  EXPECT_FALSE(dc(10));
+  EXPECT_TRUE(dc(11));
+}
+
+TEST(DifficultyClass, GreaterThanOrEqualTo) {
+  dice::difficulty_class dc{test::GreaterOrEqual, 10};
+  EXPECT_FALSE(dc(9));
+  EXPECT_TRUE(dc(10));
+  EXPECT_TRUE(dc(11));
+}