roll_test.cxx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 <gmock/gmock.h>
  9. #include <gtest/gtest.h>
  10. #include "shared_random_generator/random_impl.h"
  11. #include "die.h"
  12. #include "roll.h"
  13. struct MockRandomImpl : public engine::detail::random_impl {
  14. MOCK_METHOD1(exclusive, unsigned int(unsigned int));
  15. double exclusive(double, double) { throw; }
  16. double inclusive(double, double) { throw; }
  17. };
  18. class RollTest : public ::testing::Test {
  19. protected:
  20. void SetUp() override {
  21. pRandom = std::make_shared<MockRandomImpl>();
  22. }
  23. void TearDown() override {
  24. pRandom.reset();
  25. }
  26. protected:
  27. std::shared_ptr<MockRandomImpl> pRandom;
  28. };
  29. using namespace ::testing;
  30. TEST_F(RollTest, CanConstructNoThrow) {
  31. EXPECT_NO_THROW(dice::roller{});
  32. EXPECT_NO_THROW(dice::roller{pRandom});
  33. }
  34. TEST_F(RollTest, RollsOncePerDie) {
  35. dice::dice mydice{1, {{dice::ZERO, 3, 4}}, {{dice::PLUS, 1}}};
  36. EXPECT_CALL(*pRandom, exclusive(4)).WillOnce(Return(2)).WillOnce(Return(1))
  37. .WillOnce(Return(3));
  38. auto roll = dice::roller{pRandom}(mydice);
  39. EXPECT_THAT(roll, SizeIs(1));
  40. EXPECT_THAT(roll[0].sub_rolls, SizeIs(1));
  41. EXPECT_THAT(roll[0].sub_rolls[0].rolled, ElementsAre(3, 2, 4));
  42. }
  43. TEST_F(RollTest, DoesNotRollForConstants) {
  44. dice::dice mydice{1, {}, {{dice::PLUS, 1}}};
  45. EXPECT_CALL(*pRandom, exclusive(_)).Times(0);
  46. auto roll = dice::roller{pRandom}(mydice);
  47. EXPECT_THAT(roll, SizeIs(1));
  48. EXPECT_THAT(roll[0].sub_rolls, SizeIs(0));
  49. EXPECT_THAT(roll[0].modifiers, SizeIs(1));
  50. EXPECT_THAT(roll[0].modifiers[0].value, Eq(1));
  51. }
  52. TEST_F(RollTest, OperatorInSumsElements) {
  53. dice::dice mydice{1, {{dice::ZERO, 3, 4}}, {{dice::PLUS, 1}}};
  54. EXPECT_CALL(*pRandom, exclusive(4)).WillOnce(Return(2)).WillOnce(Return(1))
  55. .WillOnce(Return(3));
  56. auto roll = dice::roller{pRandom}(mydice);
  57. // 3 + 2 + 4 + 1 = 10
  58. EXPECT_THAT(int(roll[0]), Eq(10));
  59. }
  60. TEST(RollSerialTest, CanPrint0dN) {
  61. dice::dice_roll roll{{{}}};
  62. std::stringstream ss;
  63. ss << roll;
  64. EXPECT_THAT(ss.str(), Eq("0"));
  65. }
  66. TEST(RollSerialTest, Prints1dNAsRollNumber) {
  67. dice::dice_roll roll{{{dice::ZERO, {3}}}};
  68. std::stringstream ss;
  69. ss << roll;
  70. EXPECT_THAT(ss.str(), Eq("3"));
  71. }
  72. TEST(RollSerialTest, PrintsNdMAsList) {
  73. dice::dice_roll roll{{{dice::ZERO, {3, 2, 4}}}};
  74. std::stringstream ss;
  75. ss << roll;
  76. EXPECT_THAT(ss.str(), Eq("[ 3, 2, 4 ]"));
  77. }