Skip to content

Commit

Permalink
Added test for ThrowingConsumer
Browse files Browse the repository at this point in the history
Added pom and ignore files.
  • Loading branch information
sagaofsilence committed Jun 9, 2024
1 parent 2539500 commit fd99e77
Show file tree
Hide file tree
Showing 4 changed files with 176 additions and 0 deletions.
35 changes: 35 additions & 0 deletions junit/junit5/functional-interfaces/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

.vscode

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
41 changes: 41 additions & 0 deletions junit/junit5/functional-interfaces/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>io.reflectoring</groupId>
<artifactId>junit5-functional-interfaces</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<junit.version>5.9.0</junit.version>
</properties>

<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.reflectoring.functional;

public class ValidationException extends Throwable {
public ValidationException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.reflectoring.functional;

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.text.MessageFormat;
import java.time.temporal.ValueRange;
import java.util.Arrays;
import java.util.Collection;
import java.util.function.Function;
import java.util.stream.Stream;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.ThrowingConsumer;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class ThrowingConsumerTest {
@ParameterizedTest
@CsvSource({"50,true", "130,false", "-30,false"})
void testMethodThatThrowsCheckedException(int percent, boolean valid) {
// acceptable percentage range: 0 - 100
ValueRange validPercentageRange = ValueRange.of(0, 100);
final Function<Integer, String> message =
input ->
MessageFormat.format(
"Percentage {0} should be in range {1}", input, validPercentageRange.toString());

ThrowingConsumer<Integer> consumer =
input -> {
if (!validPercentageRange.isValidValue(input)) {
throw new ValidationException(message.apply(input));
}
};

if (valid) {
assertDoesNotThrow(() -> consumer.accept(percent));
} else {
assertAll(
() -> {
ValidationException exception =
assertThrows(ValidationException.class, () -> consumer.accept(percent));
assertEquals(exception.getMessage(), message.apply(percent));
});
}
}

@TestFactory
Stream<DynamicTest> testDynamicTestsWithThrowingConsumer() {
// acceptable percentage range: 0 - 100
ValueRange validPercentageRange = ValueRange.of(0, 100);
final Function<Integer, String> message =
input ->
MessageFormat.format(
"Percentage {0} should be in range {1}", input, validPercentageRange.toString());

// Define the ThrowingConsumer that validates the input percentage
ThrowingConsumer<TestCase> consumer =
testCase -> {
if (!validPercentageRange.isValidValue(testCase.percent)) {
throw new ValidationException(message.apply(testCase.percent));
}
};

ThrowingConsumer<TestCase> executable =
testCase -> {
if (testCase.valid) {
assertDoesNotThrow(() -> consumer.accept(testCase));
} else {
assertAll(
() -> {
ValidationException exception =
assertThrows(ValidationException.class, () -> consumer.accept(testCase));
assertEquals(exception.getMessage(), message.apply(testCase.percent));
});
}
};
// Test data: an array of test cases with inputs and their validity
Collection<TestCase> testCases =
Arrays.asList(new TestCase(50, true), new TestCase(130, false), new TestCase(-30, false));

Function<TestCase, String> displayNameGenerator =
testCase -> "Testing percentage: " + testCase.percent;

// Generate dynamic tests
return DynamicTest.stream(testCases.stream(), displayNameGenerator, executable);
}

// Helper record to represent a test case
record TestCase(int percent, boolean valid) {}
}

0 comments on commit fd99e77

Please sign in to comment.