roll_test.cxx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 {
  20. pRandom = std::make_shared<MockRandomImpl>();
  21. }
  22. void TearDown() override {
  23. pRandom.reset();
  24. }
  25. protected:
  26. std::shared_ptr<MockRandomImpl> pRandom;
  27. };
  28. using namespace ::testing;
  29. TEST_F(RollerTest, CanConstructNoThrow) {
  30. EXPECT_NO_THROW(dice::roller{});
  31. EXPECT_NO_THROW(dice::roller{pRandom});
  32. }
  33. TEST_F(RollerTest, RollsOncePerDie) {
  34. dice::dice mydice{1, {{dice::sign::ZERO, 3, 4}}, {{dice::sign::PLUS, 1}}};
  35. EXPECT_CALL(*pRandom, exclusive(4)).WillOnce(Return(2)).WillOnce(Return(1))
  36. .WillOnce(Return(3));
  37. auto roll = dice::roller{pRandom}(mydice);
  38. EXPECT_THAT(roll, SizeIs(1));
  39. EXPECT_THAT(roll[0].sub_rolls, SizeIs(1));
  40. EXPECT_THAT(roll[0].sub_rolls[0].rolled, ElementsAre(3, 2, 4));
  41. }
  42. TEST_F(RollerTest, DoesNotRollForConstants) {
  43. dice::dice mydice{1, {}, {{dice::sign::PLUS, 1}}};
  44. EXPECT_CALL(*pRandom, exclusive(_)).Times(0);
  45. auto roll = dice::roller{pRandom}(mydice);
  46. EXPECT_THAT(roll, SizeIs(1));
  47. EXPECT_THAT(roll[0].sub_rolls, SizeIs(0));
  48. EXPECT_THAT(roll[0].modifiers, SizeIs(1));
  49. EXPECT_THAT(roll[0].modifiers[0].value, Eq(1));
  50. }
  51. TEST_F(RollerTest, InjectsDCIntoRollObjects) {
  52. using test = dice::difficulty_class::test;
  53. dice::dice mydice{1, {{dice::sign::ZERO, 3, 4}},
  54. {{dice::sign::PLUS, 1}}, {test::Less, 20}};
  55. EXPECT_CALL(*pRandom, exclusive(4)).WillOnce(Return(2)).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{
  63. {{dice::sign::ZERO, {3, 2, 4}}},
  64. {{dice::sign::PLUS, 1}}};
  65. // 3 + 2 + 4 + 1 = 10
  66. EXPECT_THAT(int(roll), Eq(10));
  67. }
  68. TEST(DiceRollTest, OperatorIntWithDCReturnsOneOrZero) {
  69. using test = dice::difficulty_class::test;
  70. dice::dice_roll roll{
  71. {{dice::sign::ZERO, {3, 2, 4}}},
  72. {{dice::sign::PLUS, 1}},
  73. {test::Less, 10}
  74. };
  75. EXPECT_THAT(int(roll), Eq(0));
  76. --roll.modifiers[0].value;
  77. EXPECT_THAT(int(roll), Eq(1));
  78. }