ProbabilityTest.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package com.gmail.nossr50.util.random;
  2. import org.bukkit.entity.Player;
  3. import org.junit.jupiter.api.BeforeEach;
  4. import org.junit.jupiter.api.Test;
  5. import org.junit.jupiter.params.ParameterizedTest;
  6. import org.junit.jupiter.params.provider.Arguments;
  7. import org.junit.jupiter.params.provider.MethodSource;
  8. import org.mockito.Mockito;
  9. import java.util.stream.Stream;
  10. import static org.junit.jupiter.api.Assertions.*;
  11. class ProbabilityTest {
  12. private static Stream<Arguments> provideProbabilitiesForWithinExpectations() {
  13. return Stream.of(
  14. // static probability, % of time for success
  15. Arguments.of(new ProbabilityImpl(5), 5),
  16. Arguments.of(new ProbabilityImpl(10), 10),
  17. Arguments.of(new ProbabilityImpl(15), 15),
  18. Arguments.of(new ProbabilityImpl(20), 20),
  19. Arguments.of(new ProbabilityImpl(25), 25),
  20. Arguments.of(new ProbabilityImpl(50), 50),
  21. Arguments.of(new ProbabilityImpl(75), 75),
  22. Arguments.of(new ProbabilityImpl(90), 90),
  23. Arguments.of(new ProbabilityImpl(99.9), 99.9),
  24. Arguments.of(new ProbabilityImpl(0.05), 0.05),
  25. Arguments.of(new ProbabilityImpl(0.1), 0.1),
  26. Arguments.of(new ProbabilityImpl(500), 100),
  27. Arguments.of(new ProbabilityImpl(1000), 100)
  28. );
  29. }
  30. private static Stream<Arguments> provideOfPercentageProbabilitiesForWithinExpectations() {
  31. return Stream.of(
  32. // static probability, % of time for success
  33. Arguments.of(Probability.ofPercent(5), 5),
  34. Arguments.of(Probability.ofPercent(10), 10),
  35. Arguments.of(Probability.ofPercent(15), 15),
  36. Arguments.of(Probability.ofPercent(20), 20),
  37. Arguments.of(Probability.ofPercent(25), 25),
  38. Arguments.of(Probability.ofPercent(50), 50),
  39. Arguments.of(Probability.ofPercent(75), 75),
  40. Arguments.of(Probability.ofPercent(90), 90),
  41. Arguments.of(Probability.ofPercent(99.9), 99.9),
  42. Arguments.of(Probability.ofPercent(0.05), 0.05),
  43. Arguments.of(Probability.ofPercent(0.1), 0.1),
  44. Arguments.of(Probability.ofPercent(500), 100),
  45. Arguments.of(Probability.ofPercent(1000), 100)
  46. );
  47. }
  48. @Test
  49. void testAlwaysWinConstructor() {
  50. for (int i = 0; i < 100000; i++) {
  51. assertTrue(new ProbabilityImpl(100).evaluate());
  52. }
  53. }
  54. @Test
  55. void testAlwaysLoseConstructor() {
  56. for (int i = 0; i < 100000; i++) {
  57. assertFalse(new ProbabilityImpl(0).evaluate());
  58. }
  59. }
  60. @Test
  61. void testAlwaysWinOfPercent() {
  62. for (int i = 0; i < 100000; i++) {
  63. assertTrue(Probability.ofPercent(100).evaluate());
  64. }
  65. }
  66. @Test
  67. void testAlwaysLoseOfPercent() {
  68. for (int i = 0; i < 100000; i++) {
  69. assertFalse(Probability.ofPercent(0).evaluate());
  70. }
  71. }
  72. @ParameterizedTest
  73. @MethodSource("provideProbabilitiesForWithinExpectations")
  74. void testOddsExpectationsImplConstructor(Probability probability, double expectedWinPercent) {
  75. // Probabilities are tested 200,000,000 times with a margin of error of 0.01%
  76. int iterations = 200000000;
  77. double winCount = 0;
  78. for (int i = 0; i < iterations; i++) {
  79. if(probability.evaluate()) {
  80. winCount++;
  81. }
  82. }
  83. double successPercent = (winCount / iterations) * 100;
  84. System.out.println(successPercent + ", " + expectedWinPercent);
  85. assertEquals(expectedWinPercent, successPercent, 0.01D);
  86. }
  87. @ParameterizedTest
  88. @MethodSource("provideOfPercentageProbabilitiesForWithinExpectations")
  89. void testOddsExpectationsOfPercent(Probability probability, double expectedWinPercent) {
  90. // Probabilities are tested 200,000,000 times with a margin of error of 0.01%
  91. int iterations = 200000000;
  92. double winCount = 0;
  93. for (int i = 0; i < iterations; i++) {
  94. if(probability.evaluate()) {
  95. winCount++;
  96. }
  97. }
  98. double successPercent = (winCount / iterations) * 100;
  99. System.out.println(successPercent + ", " + expectedWinPercent);
  100. assertEquals(expectedWinPercent, successPercent, 0.01D);
  101. }
  102. }