Compare commits

...
11 Commits
Author SHA1 Message Date
KKlochko 87c9c83c20 Add the tests for test validators.
continuous-integration/drone/push Build is failing
2023-10-18 22:00:20 +03:00
KKlochko 11b1377a37 Update the TestCommandFactory to have the validators.
continuous-integration/drone/push Build is passing
2023-10-17 22:27:05 +03:00
KKlochko 238957419e Update the block to run only a public method. 2023-10-17 22:25:38 +03:00
KKlochko c00320e295 Fix the test count for ClassLoader's test. 2023-10-17 22:23:38 +03:00
KKlochko ba9ce975c8 Add the invalid tests. 2023-10-17 22:22:27 +03:00
KKlochko 7ac264e5e8 Fix the given-when-then tests to have public methods. 2023-10-17 22:20:51 +03:00
KKlochko e6de1bde03 Add a Calculator and its tests. 2023-10-17 22:20:17 +03:00
KKlochko 8b7ba5f18b Add validators to show error if a test method is invalid. 2023-10-17 22:12:55 +03:00
KKlochko 71f30a43e9 Add the CHANGELOG.
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2023-10-16 21:39:26 +03:00
KKlochko 0bb1daf784 Fix the project name for the gradle build.
continuous-integration/drone/tag Build is passing
2023-10-16 21:37:18 +03:00
KKlochko a258a5f785 Update the build configuration to make the JAR file.
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2023-10-15 12:59:04 +03:00
25 changed files with 850 additions and 27 deletions
+291
View File
@@ -0,0 +1,291 @@
# Change Log
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [0.12.7] - 2023-30-16
### Added
- Add the CHANGELOG.
## [0.12.6] - 2023-30-16
### Fixed
- Fix the project name for the gradle build.
## [0.12.5] - 2023-30-15
### Changed
- Update the build configuration to make the JAR file.
## [0.12.4] - 2023-30-15
### Added
- Add SimpleEmptyTest and its tests.
## [0.12.3] - 2023-30-15
### Added
- Add the error for an empty test.
## [0.12.2] - 2023-30-15
### Changed
- Update the titles for SimpleFailedThenTest and SimpleGivenWhenThenTest.
## [0.12.1] - 2023-30-15
### Added
- Add a multi-block test.
### Changed
- Update the tests to test the multi-block test.
## [0.12.0] - 2023-30-15
### Added
- Add the multi-block tests support.
## [0.11.2] - 2023-30-10
### Added
- Add the main entry point.
## [0.11.1] - 2023-30-10
### Added
- Add a constructor to set only a formatter for CLIReporter.
## [0.11.0] - 2023-30-10
### Added
- Add the CLITestRunner to run tests and to report the result.
## [0.10.1] - 2023-30-10
### Changed
- Update the CLI test formatting.
## [0.10.0] - 2023-30-8
### Added
- Add the SingleTestLoader to create an object of a loaded Test class.
## [0.9.2] - 2023-30-8
### Added
- Add a constructor with a default factory for TestCommandQueueFactory.
## [0.9.1] - 2023-30-8
### Fixed
- Fix the test title for SingleTestClassLoader.
## [0.9.0] - 2023-30-7
### Added
- Add the AbstractReporter.
- Add the CLIReporter and its tests.
## [0.8.3] - 2023-30-7
### Added
- Add Apache Commons Lang library.
- Add default constructor for SimpleTestReportFormatter.
## [0.8.2] - 2023-30-6
### Added
- Add the AbstractTestReportFormatter.
### Changed
- Refactor the SimpleTestReportFormatter to use the interface.
## [0.8.1] - 2023-30-6
### Fixed
- Fix the encoding issue.
## [0.8.0] - 2023-30-4
### Added
- Add the SimpleTestReportFormatter.
## [0.7.0] - 2023-30-3
### Added
- Add the TestCommandMetaDataFactory to generate the metadata.
## [0.6.3] - 2023-30-1
### Added
- Add the ClassLoader.
## [0.6.2] - 2023-30-1
### Fixed
- Fix typos and improve description in the tests.
## [0.6.1] - 2023-09-30
### Added
- Add the com.google.guava as a dependency.
- Add the NameClassLoader.
## [0.6.0] - 2023-09-29
### Added
- Add the single class loader.
## [0.5.4] - 2023-09-27
### Added
- Add the queue factory for test commands.
## [0.5.3] - 2023-09-26
### Added
- Add Abstract and Simple factories to create a test runner.
## [0.5.2] - 2023-09-26
### Changed
- Refactor tests for the SimpleTestRunner.
- Refactor the SimpleTestRunner and its test.
## [0.5.1] - 2023-09-24
### Fixed
- Fix the BlockDecorator to throw the AsssertionError, if any.
## [0.5.0] - 2023-09-24
### Added
- Add SimpleTestRunner as a test runner.
## [0.4.1] - 2023-09-23
### Added
- Add the CI/CD configuration for Gradle and Maven build.
## [0.4.0] - 2023-09-23
### Added
- Add the create method for the TestCommandFactory.
## [0.3.1] - 2023-09-23
### Added
- Add the test block decorator.
## [0.3.0] - 2023-09-23
### Added
- Add abstract and simple test commands.
## [0.2.7] - 2023-09-23
### Added
- Add a test example without a title annotation.
## [0.2.6] - 2023-09-23
### Changed
- Update test examples to have annotations with values.
## [0.2.5] - 2023-09-23
### Added
- Add the Title annotation.
## [0.2.4] - 2023-09-20
### Added
- Add the TestCommandFactory with a getTestMethods.
## [0.2.3] - 2023-09-20
### Added
- Add the Test class as ABC.
## [0.2.2] - 2023-09-20
### Added
- Add test examples.
## [0.2.1] - 2023-09-20
### Changed
- Refactor the Sum class to be moved into the samples package.
## [0.2.0] - 2023-09-19
### Added
- Add the Given-When-Then annotations.
## [0.1.2] - 2023-09-19
### Removed
- Remove the test examples.
## [0.1.1] - 2023-09-19
### Added
- Add the Sum class to test as an example.
## [0.1.0] - 2023-09-19
### Added
- Project initialization.
[Unreleased]: https://gitlab.com/KKlochko/cipher-analytical-machine/-/compare/0.5.3...main?from_project_id=50218541&straight=false
: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.7...main?from_project_id=50536015&straight=false
[0.12.7]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.6...0.12.7?from_project_id=50536015&straight=false
[0.12.6]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.5...0.12.6?from_project_id=50536015&straight=false
[0.12.5]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.4...0.12.5?from_project_id=50536015&straight=false
[0.12.4]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.3...0.12.4?from_project_id=50536015&straight=false
[0.12.3]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.2...0.12.3?from_project_id=50536015&straight=false
[0.12.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.1...0.12.2?from_project_id=50536015&straight=false
[0.12.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.12.0...0.12.1?from_project_id=50536015&straight=false
[0.12.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.11.2...0.12.0?from_project_id=50536015&straight=false
[0.11.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.11.1...0.11.2?from_project_id=50536015&straight=false
[0.11.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.11.0...0.11.1?from_project_id=50536015&straight=false
[0.11.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.10.1...0.11.0?from_project_id=50536015&straight=false
[0.10.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.10.0...0.10.1?from_project_id=50536015&straight=false
[0.10.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.9.2...0.10.0?from_project_id=50536015&straight=false
[0.9.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.9.1...0.9.2?from_project_id=50536015&straight=false
[0.9.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.9.0...0.9.1?from_project_id=50536015&straight=false
[0.9.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.8.3...0.9.0?from_project_id=50536015&straight=false
[0.8.3]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.8.2...0.8.3?from_project_id=50536015&straight=false
[0.8.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.8.1...0.8.2?from_project_id=50536015&straight=false
[0.8.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.8.0...0.8.1?from_project_id=50536015&straight=false
[0.8.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.7.0...0.8.0?from_project_id=50536015&straight=false
[0.7.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.6.3...0.7.0?from_project_id=50536015&straight=false
[0.6.3]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.6.2...0.6.3?from_project_id=50536015&straight=false
[0.6.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.6.1...0.6.2?from_project_id=50536015&straight=false
[0.6.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.6.0...0.6.1?from_project_id=50536015&straight=false
[0.6.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.5.4...0.6.0?from_project_id=50536015&straight=false
[0.5.4]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.5.3...0.5.4?from_project_id=50536015&straight=false
[0.5.3]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.5.2...0.5.3?from_project_id=50536015&straight=false
[0.5.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.5.1...0.5.2?from_project_id=50536015&straight=false
[0.5.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.5.0...0.5.1?from_project_id=50536015&straight=false
[0.5.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.4.1...0.5.0?from_project_id=50536015&straight=false
[0.4.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.4.0...0.4.1?from_project_id=50536015&straight=false
[0.4.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.3.1...0.4.0?from_project_id=50536015&straight=false
[0.3.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.3.0...0.3.1?from_project_id=50536015&straight=false
[0.3.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.7...0.3.0?from_project_id=50536015&straight=false
[0.2.7]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.6...0.2.7?from_project_id=50536015&straight=false
[0.2.6]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.5...0.2.6?from_project_id=50536015&straight=false
[0.2.5]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.4...0.2.5?from_project_id=50536015&straight=false
[0.2.4]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.3...0.2.4?from_project_id=50536015&straight=false
[0.2.3]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.2...0.2.3?from_project_id=50536015&straight=false
[0.2.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.1...0.2.2?from_project_id=50536015&straight=false
[0.2.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.2.0...0.2.1?from_project_id=50536015&straight=false
[0.2.0]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.1.2...0.2.0?from_project_id=50536015&straight=false
[0.1.2]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.1.1...0.1.2?from_project_id=50536015&straight=false
[0.1.1]: https://gitlab.com/KKlochko/simple-jbdd/-/compare/0.1.0...0.1.1?from_project_id=50536015&straight=false
[0.1.0]: https://gitlab.com/KKlochko/simple-jbdd/-/commit/dabb09c518cdfad4aa05ac9d86c857833b8db41c
+11 -1
View File
@@ -1,11 +1,21 @@
plugins {
id('groovy')
id('application')
id 'com.github.johnrengelman.shadow' version '7.1.2'
}
version = "1.0"
description = "simple-jbdd is a simple BDD testing framework for Java."
// Spock works with Java 1.8 and above
application {
mainClassName = 'space.kklochko.simple_jbdd.Main'
}
shadowJar {
mergeServiceFiles()
minimize()
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
+26 -11
View File
@@ -18,6 +18,32 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifest>
<mainClass>space.kklochko.simple_jbdd.Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Mandatory plugins for using Spock -->
<plugin>
<!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
@@ -124,16 +150,5 @@
<version>2.2</version>
<scope>test</scope>
</dependency>
<!-- Dependencies used by examples in this project (not required for using Spock) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.222</version>
</dependency>
<dependency>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy-sql</artifactId>
<version>${groovy.version}</version>
</dependency>
</dependencies>
</project>
+1 -1
View File
@@ -1 +1 @@
rootProject.name = "simple_bdd"
rootProject.name = "simple_jbdd"
@@ -0,0 +1,16 @@
package space.kklochko.simple_jbdd.test_examples.samples;
public class Calculator {
public int plus(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b + 1;
}
}
@@ -0,0 +1,38 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("3*3 must be 9")
public class CalculatorMultiplyTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator")
public void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
a = 3;
b = 3;
}
@When("Invoke the multiply method")
public void when() {
result = calculator.multiply(a, b);
}
@Then("3*3 must be 9")
public void then() {
assert result == 9;
}
}
@@ -0,0 +1,37 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("2+2 must be 4")
public class CalculatorPlusTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator")
public void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
a = b = 2;
}
@When("Invoke the plus method")
public void when() {
result = calculator.plus(a, b);
}
@Then("2+2 must be 4")
public void then() {
assert result == 4;
}
}
@@ -0,0 +1,38 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("4-2 must be 2")
public class CalculatorSubtractTes extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator")
public void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
a = 4;
b = 2;
}
@When("Invoke the subtract method")
public void when() {
result = calculator.subtract(a, b);
}
@Then("4-2 must be 2")
public void then() {
assert result == 2;
}
}
@@ -0,0 +1,38 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("4-2 must be 2")
public class CalculatorSubtractTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator")
public void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
a = 4;
b = 2;
}
@When("Invoke the subtract method")
public void when() {
result = calculator.subtract(a, b);
}
@Then("4-2 must be 2")
public void then() {
assert result == 2;
}
}
@@ -0,0 +1,38 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("Test that has method arguments")
public class HasMethodArgumentsTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator in a private method")
public void given(int a, int b) {
calculator = new Calculator();
}
@Given("Set up the arguments with arguments")
public void setupArguments(int a, int b) {
this.a = 4;
this.b = 2;
}
@When("Invoke the subtract method")
public void when() {
result = calculator.subtract(a, b);
}
@Then("4-2 must be 2 and return Bool value")
public void then() {
assert result == 2;
}
}
@@ -0,0 +1,39 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("Test with a method that return boolean")
public class HasNonVoidMethodTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator in a private method")
public void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
this.a = 4;
this.b = 2;
}
@When("Invoke the subtract method")
public void when() {
result = calculator.subtract(a, b);
}
@Then("4-2 must be 2 and return result")
public boolean then() {
assert result == 2;
return result != 2;
}
}
@@ -0,0 +1,38 @@
package space.kklochko.simple_jbdd.test_examples.tests;
import space.kklochko.simple_jbdd.annotations.Given;
import space.kklochko.simple_jbdd.annotations.Then;
import space.kklochko.simple_jbdd.annotations.Title;
import space.kklochko.simple_jbdd.annotations.When;
import space.kklochko.simple_jbdd.test_examples.samples.Calculator;
import space.kklochko.simple_jbdd.tests.Test;
@Title("Test with a private method")
public class HasPrivateMethodTest extends Test {
Calculator calculator;
int a;
int b;
int result;
@Given("Set up the calculator in a private method")
private void given() {
calculator = new Calculator();
}
@Given("Set up the arguments")
public void setupArguments() {
this.a = 4;
this.b = 2;
}
@When("Invoke the subtract method")
public void when() {
result = calculator.subtract(a, b);
}
@Then("4-2 must be 2")
public void then() {
assert result == 2;
}
}
@@ -17,34 +17,34 @@ public class SimpleGivenGivenWhenWhenThenThenTest extends Test {
private int resultCB;
@Given("Create the Sum object")
void setup() {
public void setup() {
sum = new Sum();
}
@Given("Setup the arguments")
void setupArgs() {
public void setupArgs() {
a = 10;
b = 20;
c = 30;
}
@When("Call the .sum(10, 20)")
void triggerAB() {
public void triggerAB() {
resultAB = sum.sum(a, b);
}
@When("Call the .sum(30, 20)")
void triggerCB() {
public void triggerCB() {
resultCB = sum.sum(c, b);
}
@Then("10 + 20 is 30")
void checkAB() {
public void checkAB() {
assert 30 == resultAB;
}
@Then("30 + 20 is 50")
void checkCB() {
public void checkCB() {
assert 50 == resultCB;
}
}
@@ -14,18 +14,18 @@ public class SimpleGivenWhenThenTest extends Test {
private int b;
@Given
void setup() {
public void setup() {
sum = new Sum();
}
@When
void trigger() {
public void trigger() {
a = 10;
b = 20;
}
@Then
void check() {
public void check() {
assert 30 == sum.sum(a, b);
}
}
@@ -24,7 +24,6 @@ public class BlockDecorator<T extends Test> extends AbstractDecorator<T> {
public boolean runMethod() {
try {
method.setAccessible(true);
method.invoke(getCommand().getObject());
return true;
} catch (InvocationTargetException e) {
@@ -9,6 +9,7 @@ import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
import space.kklochko.simple_jbdd.tests.commands.SimpleTestCommand;
import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator;
import space.kklochko.simple_jbdd.tests.commands.decorators.ErrorDecorator;
import space.kklochko.simple_jbdd.tests.factories.validators.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@@ -21,8 +22,18 @@ public class TestCommandFactory {
AbstractTestCommand<Test> aTestCommand = createTest(aClass, input);
if(test_methods.size() == 0)
return new ErrorDecorator("ERROR!!! No blocks!!!", aTestCommand, "Error");
ArrayList<Validator> validators = new ArrayList<>();
validators.add(new EmptyValidator());
validators.add(new HasMethodsWithArgumentsValidator());
validators.add(new HasNonVoidMethodsValidator());
validators.add(new HasPrivateMethodsValidator());
for(var validator : validators) {
if(validator.validate(test_methods)) {
String name = validator.getMessage();
return new ErrorDecorator(name, aTestCommand, validator.getErrorType());
}
}
if(test_methods.containsKey("Then")) {
ArrayList<Method> thens = getMethodsInReverseOrder(test_methods, "Then");
@@ -0,0 +1,32 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
public class EmptyValidator extends Validator {
private boolean isInvalid;
@Override
public boolean validate(Map<String, ArrayList<Method>> methods) {
isInvalid = (methods.size() == 0);
return isInvalid;
}
@Override
public String getErrorType() {
if(!isInvalid)
return "ok";
return "Error";
}
@Override
public String getMessage() {
if(!isInvalid)
return "ok";
return "ERROR!!! No blocks!!!";
}
}
@@ -0,0 +1,19 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
public class HasMethodsWithArgumentsValidator extends MethodValidator {
@Override
protected boolean isMethodInvalid(Method method) {
return method.getParameterCount() != 0;
}
@Override
public String getMessage() {
if(!isInvalid)
return "ok";
return String.format("ERROR!!! Methods must have no arguments!!! Check methods: %s!!!", getMethodListAsString());
}
}
@@ -0,0 +1,19 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
public class HasNonVoidMethodsValidator extends MethodValidator {
@Override
protected boolean isMethodInvalid(Method method) {
return !method.getReturnType().equals(void.class);
}
@Override
public String getMessage() {
if(!isInvalid)
return "ok";
return String.format("ERROR!!! Methods must have the void type!!! Check methods: %s!!!", getMethodListAsString());
}
}
@@ -0,0 +1,20 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class HasPrivateMethodsValidator extends MethodValidator {
@Override
protected boolean isMethodInvalid(Method method) {
return !Modifier.isPublic(method.getModifiers());
}
@Override
public String getMessage() {
if(!isInvalid)
return "ok";
return String.format("ERROR!!! Methods must be public!!! Check method: %s!!!", getMethodListAsString());
}
}
@@ -0,0 +1,48 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;
abstract public class MethodValidator extends Validator{
protected boolean isInvalid;
protected ArrayList<Method> invalidMethods;
protected String getMethodListAsString() {
return invalidMethods.stream()
.map(m -> m.getName())
.collect(Collectors.joining(", "));
}
abstract protected boolean isMethodInvalid(Method method);
@Override
public boolean validate(Map<String, ArrayList<Method>> methods) {
isInvalid = false;
invalidMethods = new ArrayList<>();
for(var key : methods.keySet()) {
for(var method : methods.get(key)) {
if(isMethodInvalid(method)) {
isInvalid = true;
invalidMethods.add(method);
}
}
}
return isInvalid;
}
@Override
public String getErrorType() {
if(!isInvalid)
return "ok";
return "Error";
}
abstract public String getMessage();
}
@@ -0,0 +1,11 @@
package space.kklochko.simple_jbdd.tests.factories.validators;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
public abstract class Validator {
abstract public boolean validate(Map<String, ArrayList<Method>> methods);
abstract public String getErrorType();
abstract public String getMessage();
}
@@ -0,0 +1,66 @@
package space.kklochko.simple_jbdd.tests.factories.validators
import space.kklochko.simple_jbdd.test_examples.tests.HasMethodArgumentsTest
import space.kklochko.simple_jbdd.test_examples.tests.HasNonVoidMethodTest
import space.kklochko.simple_jbdd.test_examples.tests.HasPrivateMethodTest
import space.kklochko.simple_jbdd.test_examples.tests.SimpleEmptyTest
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Subject
import spock.lang.Title
@Narrative("""The validators must return true if a test class is invalid, so
those tests check if validators return the right result.
""")
@Title("Integrated tests for Validators")
class IntegratedValidatorsSpec extends Specification {
def "Validator return isInvalid"() {
given: "I have a factory and metadata"
def factory = new TestCommandFactory()
def metaData = factory.getTestMethods(testClass)
when: "Validating the test"
def isInvalid = validator.validate(metaData)
then: "The status must be expected"
isInvalid == expectedStatus
where: "Possible variants of tests"
validator | testClass || expectedStatus
new HasMethodsWithArgumentsValidator() | HasMethodArgumentsTest.class || true
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || false
new HasNonVoidMethodsValidator() | HasNonVoidMethodTest.class || true
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || false
new HasPrivateMethodsValidator() | HasPrivateMethodTest.class || true
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || false
new EmptyValidator() | SimpleEmptyTest.class || true
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || false
}
def "Validator return the error message"() {
given: "I have a factory and metadata"
def factory = new TestCommandFactory()
def metaData = factory.getTestMethods(testClass)
when: "Validating the test and checking the message"
validator.validate(metaData)
def message = validator.getMessage()
then: "The message must be expected"
message == expectedMessage
where: "Possible variants of tests"
validator | testClass || expectedMessage
new HasMethodsWithArgumentsValidator() | HasMethodArgumentsTest.class || "ERROR!!! Methods must have no arguments!!! Check methods: given, setupArguments!!!"
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || "ok"
new HasNonVoidMethodsValidator() | HasNonVoidMethodTest.class || "ERROR!!! Methods must have the void type!!! Check methods: then!!!"
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || "ok"
new HasPrivateMethodsValidator() | HasPrivateMethodTest.class || "ERROR!!! Methods must be public!!! Check method: given!!!"
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || "ok"
new EmptyValidator() | SimpleEmptyTest.class || "ERROR!!! No blocks!!!"
new HasMethodsWithArgumentsValidator() | SimpleGivenWhenThenTest.class || "ok"
}
}
@@ -22,7 +22,7 @@ class IntegratedClassLoader extends Specification {
def classes = loader.load()
then: "Checking that the test result is expected"
5 == classes.size()
11 == classes.size()
}
def "The classes must be represent the Test interface."() {
@@ -19,7 +19,7 @@ class IntegratedNameClassLoader extends Specification {
def classNames = loader.load()
then: "Checking that the test result is expected"
5 == classNames.size()
11 == classNames.size()
}
}