test.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. '''
  2. Created on 18 nov. 2016
  3. @author: olinox
  4. '''
  5. import unittest
  6. import xdice
  7. class Test(unittest.TestCase):
  8. """unitests for DiceRollParser"""
  9. def test_secured_eval(self):
  10. # refused
  11. self.assertRaises(TypeError, xdice._secured_eval, "open('foo', 'r')")
  12. # accepted
  13. xdice._secured_eval("1 + max([1,2,3])")
  14. xdice._secured_eval("1 + min([1,2,3])")
  15. def test_patterns_validation(self):
  16. """check the with behaviour with valid / invalid patterns"""
  17. # check valid expressions
  18. xdice.roll("3")
  19. xdice.roll("0d6")
  20. xdice.roll("1d6")
  21. xdice.roll("1d66")
  22. xdice.roll("1d4+2")
  23. xdice.roll("1d4-2")
  24. xdice.roll("1d4 - 2 ")
  25. xdice.roll("6d102+123")
  26. xdice.roll("6d102+123+8d6")
  27. xdice.roll("6d102+123+8d6+2+1+1-8-6d4+8-2d101+100d2")
  28. xdice.roll("32+3-0-2")
  29. xdice.roll("1d1-3")
  30. xdice.roll("1000d1000")
  31. xdice.roll("10 d 10")
  32. xdice.roll("10*1d10/2")
  33. xdice.roll("1d20**2")
  34. xdice.roll("abs(1d6-1d10)")
  35. xdice.roll("max(1d6,2d4)")
  36. xdice.roll("min(1d6,2d4)")
  37. xdice.roll("d")
  38. xdice.roll("2d")
  39. xdice.roll("d6")
  40. xdice.roll("3d6l")
  41. xdice.roll("3d6l2")
  42. xdice.roll("3d6h")
  43. xdice.roll("3d6h2")
  44. xdice.roll("6d6lh")
  45. xdice.roll("6d6lh2")
  46. xdice.roll("6d6l2h")
  47. xdice.roll("6d6l2h2")
  48. xdice.roll("3dlh")
  49. xdice.roll("1d%")
  50. xdice.roll("d%")
  51. xdice.roll("1+R3(1d6+1)")
  52. xdice.roll("3d6!")
  53. xdice.roll("3d6x")
  54. xdice.roll("3d6h1x")
  55. # test invalid expressions
  56. self.assertRaises(ValueError, xdice.roll, "")
  57. self.assertRaises(ValueError, xdice.roll, "1d0")
  58. self.assertRaises(TypeError, xdice.roll, "abc")
  59. self.assertRaises(TypeError, xdice.roll, "1d2,3")
  60. self.assertRaises(ValueError, xdice.roll, "1d6l2")
  61. self.assertRaises(ValueError, xdice.roll, "1d6h2")
  62. self.assertRaises(ValueError, xdice.roll, "1d6lh")
  63. self.assertRaises(SyntaxError, xdice.roll, "1+R3(1d6+1")
  64. def test_dice_object(self):
  65. d = xdice.Dice(6, 6)
  66. self.assertEqual(d.sides, 6)
  67. self.assertEqual(d.amount, 6)
  68. self.assertEqual(d.__repr__(), "<Dice; sides=6; amount=6>")
  69. d.drop_lowest = 1
  70. d.drop_highest = 1
  71. self.assertEqual(d.__repr__(), "<Dice; sides=6; amount=6; drop_lowest=1; drop_highest=1>")
  72. d.explode = True
  73. self.assertEqual(d.__repr__(), "<Dice; sides=6; amount=6; drop_lowest=1; drop_highest=1; explode>")
  74. self.assertRaises(ValueError, setattr, d, "sides", -1)
  75. self.assertRaises(ValueError, setattr, d, "sides", "a")
  76. self.assertRaises(ValueError, setattr, d, "sides", None)
  77. self.assertRaises(ValueError, setattr, d, "amount", -1)
  78. self.assertRaises(ValueError, setattr, d, "amount", "a")
  79. self.assertRaises(ValueError, setattr, d, "amount", None)
  80. self.assertRaises(ValueError, setattr, d, "drop_lowest", -1)
  81. self.assertRaises(ValueError, setattr, d, "drop_lowest", "a")
  82. self.assertRaises(ValueError, setattr, d, "drop_lowest", None)
  83. self.assertRaises(ValueError, setattr, d, "drop_highest", -1)
  84. self.assertRaises(ValueError, setattr, d, "drop_highest", "a")
  85. self.assertRaises(ValueError, setattr, d, "drop_highest", None)
  86. self.assertEqual(xdice.Dice(1, 6).roll(), 6)
  87. self.assertEqual(xdice.Dice(1, 6, 1).roll(), 5)
  88. self.assertEqual(xdice.Dice(1, 6, 0, 1).roll(), 5)
  89. self.assertEqual(xdice.Dice(1, 6, 1, 1).roll(), 4)
  90. self.assertEqual(xdice.Dice(1, 6, 3, 3).roll(), 0)
  91. self.assertEqual(xdice.Dice.parse("6d1").roll(), 6)
  92. self.assertRaises(ValueError, xdice.Dice.parse, "a1d6")
  93. self.assertEqual(xdice.Dice.parse("6d1h1").roll().name, "6d1h1")
  94. self.assertEqual(xdice.Dice.parse("6 D 1h1").roll().name, "6d1h1")
  95. self.assertEqual(xdice.Dice.parse("3d1!").roll(), 6)
  96. self.assertEqual(xdice.Dice.parse("3d1x").roll(), 6)
  97. self.assertEqual(xdice.Dice.parse("3d1lhx").roll(), 2)
  98. def test_score_object(self):
  99. s = xdice.Score([1, 2, 3])
  100. self.assertEqual(s, 6)
  101. self.assertEqual(str(s), "6")
  102. self.assertEqual(list(s), [1, 2, 3])
  103. self.assertEqual(s.detail, [1, 2, 3])
  104. self.assertTrue(1 in s)
  105. self.assertEqual(s.__repr__(), "<Score; score=6; detail=[1, 2, 3]; dropped=[]; name=>")
  106. s = xdice.Score([1, 2, 3], dropped=[1], name='foo')
  107. self.assertEqual(s.__repr__(), "<Score; score=6; detail=[1, 2, 3]; dropped=[1]; name=foo>")
  108. def test_pattern_object(self):
  109. self.assertEqual(xdice._normalize("1 D 6"), "1d6")
  110. p = xdice.Pattern("6d1+6")
  111. p.compile()
  112. self.assertEqual(p.format_string, "{0}+6")
  113. self.assertEqual(p.dices, [xdice.Dice(1, 6)])
  114. self.assertEqual(p.roll(), 12)
  115. p = xdice.Pattern("R2(6d1+6)")
  116. p.compile()
  117. self.assertEqual(p.format_string, "({0}+6+{1}+6)")
  118. self.assertEqual(p.dices, [xdice.Dice(1, 6), xdice.Dice(1, 6)])
  119. self.assertEqual(p.roll(), 24)
  120. def test_patternscore_objet(self):
  121. ps = xdice.PatternScore("{0}+6", [xdice.Score([1, 1, 1, 1, 1, 1])])
  122. self.assertEqual(ps, 12)
  123. self.assertEqual(ps.score(0), 6)
  124. self.assertEqual(ps.scores(), [6])
  125. self.assertEqual(ps.format(), "[1, 1, 1, 1, 1, 1]+6")
  126. self.assertEqual(ps.format(verbose=True), "(scores:[1, 1, 1, 1, 1, 1])+6")
  127. def test_compile(self):
  128. p1 = xdice.compile("6d1+6")
  129. p2 = xdice.Pattern("6d1+6")
  130. p2.compile()
  131. self.assertEqual(p1.format_string, p2.format_string)
  132. self.assertEqual(p1.dices, p2.dices)
  133. def test_roll(self):
  134. ps1 = xdice.roll("6d1+6")
  135. ps2 = xdice.PatternScore("{0}+6", [xdice.Score([1, 1, 1, 1, 1, 1])])
  136. self.assertEqual(ps1, ps2)
  137. def test_rolldice(self):
  138. self.assertEqual(xdice.rolldice(1, 6), xdice.Dice(1, 6).roll())
  139. if __name__ == "__main__":
  140. unittest.main()