ProbabilityTest.java 3.9 KB

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