diff --git a/build.gradle.kts b/build.gradle.kts index 003cc8c..f8c864b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,8 +29,8 @@ repositories { dependencies { // The test classes are compiled with these: - implementation("com.r35157.libs:random-api:0.0.0") - implementation("com.r35157.libs:random-impl-ref:0.0.0") + implementation("com.r35157.libs:random-api:0.1-dev") + implementation("com.r35157.libs:random-impl-ref:0.1-dev") implementation("org.jetbrains:annotations:26.0.1") // The JUnit platform will not be included in the JAR file but are needed for running the tests: diff --git a/src/test/java/com/r35157/libs/random/tests/happy/CorrectRandomIntsTests.java b/src/test/java/com/r35157/libs/random/tests/happy/CorrectRandomIntsTests.java new file mode 100644 index 0000000..2b42cd8 --- /dev/null +++ b/src/test/java/com/r35157/libs/random/tests/happy/CorrectRandomIntsTests.java @@ -0,0 +1,81 @@ +package com.r35157.libs.random.tests.happy; + +import com.r35157.libs.random.RandomValueGeneratorInt; +import com.r35157.libs.random.impl.ref.RandomValueGeneratorIntImpl; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Happy Random Ints Tests") +public class CorrectRandomIntsTests { + + @DisplayName("Extreme narrow band works - always only one value possible") + @Test + void testThatEqualMinMaxBoundsWorks() { + // Arrange + int minBound = 7; + int maxBound = 7; + int expected = 7; + RandomValueGeneratorInt sut = new RandomValueGeneratorIntImpl(); + + // Act + int actual = sut.getSomeInt(minBound, maxBound); + + // Assert + assertEquals(expected, actual); + } + + @DisplayName("Produces different values over multiple calls") + @Test + void producesDifferentValuesOverMultipleCalls() { + // Arrange + int iterations = 5; + RandomValueGeneratorInt sut = new RandomValueGeneratorIntImpl(); + Set seen = new HashSet<>(); + + // Act + for (int i = 0; i < iterations; i++) { + seen.add(sut.getSomeInt()); + } + + // Arrange + assertTrue(seen.size() > 1, "Int generator returned the same value every time"); + } + + @DisplayName("Will never throw") + @Test + void noArgsMethodNeverThrows() { + // Arrange + int iterations = 10_000; + RandomValueGeneratorIntImpl sut = new RandomValueGeneratorIntImpl(); + + // Act + Assert + for (int i = 0; i < iterations; i++) { + assertDoesNotThrow(() -> sut.getSomeInt()); + } + } + + @Test + void returnsBothPositiveAndNegative() { + // Arrange + int iterations = 1_000_000; + boolean seenPos = false, seenNeg = false; + RandomValueGeneratorIntImpl sut = new RandomValueGeneratorIntImpl(); + + // Act + for (int i = 0; i < iterations; i++) { + int v = sut.getSomeInt(); + if (v > 0) seenPos = true; + if (v < 0) seenNeg = true; + if (seenPos && seenNeg) break; + } + + // Assert + assertTrue(seenPos, "Never saw positive number"); + assertTrue(seenNeg, "Never saw negative number"); + } +} diff --git a/src/test/java/com/r35157/libs/random/tests/sad/IncorrectRandomIntsTests.java b/src/test/java/com/r35157/libs/random/tests/sad/IncorrectRandomIntsTests.java new file mode 100644 index 0000000..b04c44e --- /dev/null +++ b/src/test/java/com/r35157/libs/random/tests/sad/IncorrectRandomIntsTests.java @@ -0,0 +1,34 @@ +package com.r35157.libs.random.tests.sad; + +import com.r35157.libs.random.RandomValueGeneratorInt; +import com.r35157.libs.random.impl.ref.RandomValueGeneratorIntImpl; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DisplayName("Sad Random Ints Tests") +public class IncorrectRandomIntsTests { + + @DisplayName("RandomInts.getSomeInts()") + @Test + void testThatMinBoundIsGreaterThanMaxBoundThrows() { + // Arrange + int minBound = 10; + int maxBound = 5; + String expectedErrorMsg = String.format("'minInclusive' (%d) must be less than or equal to 'maxInclusive' (%d)", + minBound, maxBound); + RandomValueGeneratorInt sut = new RandomValueGeneratorIntImpl(); + + // Act + IllegalArgumentException thrown = assertThrows( + IllegalArgumentException.class, + () -> sut.getSomeInt(minBound, maxBound) + ); + + // Assert + String actualErrorMsg = thrown.getMessage(); + assertEquals(expectedErrorMsg, actualErrorMsg); + } +}