roll_test.cxx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // roll_test.cxx
  3. // dice-td
  4. //
  5. // Created by Sam Jaffe on 12/18/18.
  6. // Copyright © 2018 Sam Jaffe. All rights reserved.
  7. //
  8. #include "xcode_gtest_helper.h"
  9. #include "shared_random_generator/random_impl.h"
  10. #include "dice-roll/die.h"
  11. #include "dice-roll/roll.h"
  12. struct MockRandomImpl : public engine::detail::random_impl {
  13. MOCK_METHOD1(exclusive, unsigned int(unsigned int));
  14. double exclusive(double, double) { throw; }
  15. double inclusive(double, double) { throw; }
  16. };
  17. class RollerTest : public ::testing::Test {
  18. protected:
  19. void SetUp() override { pRandom = std::make_shared<MockRandomImpl>(); }
  20. void TearDown() override { pRandom.reset(); }
  21. protected:
  22. std::shared_ptr<MockRandomImpl> pRandom;
  23. };
  24. using namespace ::testing;
  25. TEST_F(RollerTest, CanConstructNoThrow) {
  26. EXPECT_NO_THROW(dice::roller{});
  27. EXPECT_NO_THROW(dice::roller{pRandom});
  28. }
  29. TEST_F(RollerTest, RollsOncePerDie) {
  30. dice::dice mydice{1, {{dice::sign::ZERO, 3, 4}}, {{dice::sign::PLUS, 1}}};
  31. EXPECT_CALL(*pRandom, exclusive(4))
  32. .WillOnce(Return(2))
  33. .WillOnce(Return(1))
  34. .WillOnce(Return(3));
  35. auto roll = dice::roller{pRandom}(mydice);
  36. EXPECT_THAT(roll, SizeIs(1));
  37. EXPECT_THAT(roll[0].sub_rolls, SizeIs(1));
  38. EXPECT_THAT(roll[0].sub_rolls[0].rolled, ElementsAre(3, 2, 4));
  39. }
  40. TEST_F(RollerTest, DoesNotRollForConstants) {
  41. dice::dice mydice{1, {}, {{dice::sign::PLUS, 1}}};
  42. EXPECT_CALL(*pRandom, exclusive(_)).Times(0);
  43. auto roll = dice::roller{pRandom}(mydice);
  44. EXPECT_THAT(roll, SizeIs(1));
  45. EXPECT_THAT(roll[0].sub_rolls, SizeIs(0));
  46. EXPECT_THAT(roll[0].modifiers, SizeIs(1));
  47. EXPECT_THAT(roll[0].modifiers[0].value, Eq(1));
  48. }
  49. TEST_F(RollerTest, InjectsDCIntoRollObjects) {
  50. using test = dice::difficulty_class::test;
  51. dice::dice mydice{
  52. 1, {{dice::sign::ZERO, 3, 4}}, {{dice::sign::PLUS, 1}}, {test::Less, 20}};
  53. EXPECT_CALL(*pRandom, exclusive(4))
  54. .WillOnce(Return(2))
  55. .WillOnce(Return(1))
  56. .WillOnce(Return(3));
  57. auto roll = dice::roller{pRandom}(mydice);
  58. EXPECT_THAT(roll, Each(Field(&dice::dice_roll::dc,
  59. Field(&dice::difficulty_class::against, 20))));
  60. }
  61. TEST(DiceRollTest, OperatorIntSumsElements) {
  62. dice::dice_roll const roll{{{dice::sign::ZERO, {3, 2, 4}}},
  63. {{dice::sign::PLUS, 1}}};
  64. // 3 + 2 + 4 + 1 = 10
  65. EXPECT_THAT(int(roll), Eq(10));
  66. }
  67. TEST(DiceRollTest, OperatorIntWithDCReturnsOneOrZero) {
  68. using test = dice::difficulty_class::test;
  69. dice::dice_roll roll{{{dice::sign::ZERO, {3, 2, 4}}},
  70. {{dice::sign::PLUS, 1}},
  71. {test::Less, 10}};
  72. EXPECT_THAT(int(roll), Eq(0));
  73. --roll.modifiers[0].value;
  74. EXPECT_THAT(int(roll), Eq(1));
  75. }