Skip to content
This repository was archived by the owner on Mar 25, 2025. It is now read-only.

Commit ffe0c03

Browse files
author
Axel Schüssler
authored
Merge pull request #5 from slu-it/conditions
Replaced direct use of Predicate with own Condition subclass
2 parents 947df41 + 747fd7b commit ffe0c03

36 files changed

+265
-225
lines changed

documentation/chapters/conditions.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
[Home](../README.md)
22

33
# The Conditions Utility Class
4-
The utility class `Conditions` provides several factory methods for creating `Predicate` instances.
5-
These can be (re-)used in the following sub-systems:
4+
The utility class `Conditions` provides several factory methods for creating `Condition` instances.
5+
These are specialized subclasses of Java 8's `Predicate` interface and can be used in the following sub-systems:
66

7-
- Filtering a streams of page fragments
8-
- Conditions for wait operations
7+
- Waiting: `@Wait` and `Wait.until(..)`
8+
- Post Construct Assertions: `@PostConstructMustBe(...)`
9+
- Filtering of `PageFragement` Streams
910

1011
```java
1112
// ad-hoc finding of page fragments with filter
@@ -14,8 +15,6 @@ browser.findMany(".textfield").filter(Conditions.is(Conditions.visible()));
1415
Wait.until(textField).has(Conditions.text("foo"));
1516
```
1617

17-
Since all of these implement Java's `Predicate` interface it is easy to create your own conditions if need be.
18-
1918
## Syntax
2019

2120
Conditions are designed to be readable. They take a lot of inspiration from Hamecrest's `Matcher` and AssertJ's fluent API.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package info.novatec.testit.webtester.conditions;
2+
3+
import java.util.Objects;
4+
import java.util.function.Predicate;
5+
6+
7+
/**
8+
* A condition is a special form of {@link Predicate}.
9+
* <p>
10+
* It is used in WebTester's API in order to allow for the extension with additional features in the future.
11+
*
12+
* @param <T> the type of the input to the predicate
13+
* @see Predicate
14+
* @see Conditions
15+
* @since 2.0
16+
*/
17+
public interface Condition<T> extends Predicate<T> {
18+
19+
@Override
20+
default Condition<T> negate() {
21+
return (t) -> !test(t);
22+
}
23+
24+
@Override
25+
default Condition<T> and(Predicate<? super T> other) {
26+
Objects.requireNonNull(other);
27+
return (t) -> test(t) && other.test(t);
28+
}
29+
30+
@Override
31+
default Condition<T> or(Predicate<? super T> other) {
32+
Objects.requireNonNull(other);
33+
return (t) -> test(t) || other.test(t);
34+
}
35+
36+
}

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/Conditions.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package info.novatec.testit.webtester.conditions;
22

33
import java.util.Collection;
4-
import java.util.function.Predicate;
54

65
import info.novatec.testit.webtester.conditions.pagefragments.Attribute;
76
import info.novatec.testit.webtester.conditions.pagefragments.AttributeWithValue;
@@ -36,16 +35,16 @@ private Conditions() {
3635

3736
/* syntax */
3837

39-
public static <T> Is<T> is(Predicate<T> predicate) {
40-
return new Is<>(predicate);
38+
public static <T> Is<T> is(Condition<T> condition) {
39+
return new Is<>(condition);
4140
}
4241

43-
public static <T> Has<T> has(Predicate<T> predicate) {
44-
return new Has<>(predicate);
42+
public static <T> Has<T> has(Condition<T> condition) {
43+
return new Has<>(condition);
4544
}
4645

47-
public static <T> Not<T> not(Predicate<T> predicate) {
48-
return new Not<>(predicate);
46+
public static <T> Not<T> not(Condition<T> condition) {
47+
return new Not<>(condition);
4948
}
5049

5150
/* other */

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Attribute.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a specific attribute of a {@link PageFragment page fragment} is present.
8+
* {@link Condition} to be used in order to check if a specific attribute of a {@link PageFragment page fragment} is present.
109
*
10+
* @see Condition
1111
* @see PageFragment#getAttribute(String)
1212
* @since 2.0
1313
*/
14-
public class Attribute implements Predicate<PageFragment> {
14+
public class Attribute implements Condition<PageFragment> {
1515

1616
private final String attributeName;
1717

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/AttributeWithValue.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

33
import java.util.Objects;
4-
import java.util.function.Predicate;
54

5+
import info.novatec.testit.webtester.conditions.Condition;
66
import info.novatec.testit.webtester.pagefragments.PageFragment;
77

88

99
/**
10-
* {@link Predicate} to be used in order to check if a specific attribute of a {@link PageFragment page fragment} has a
10+
* {@link Condition} to be used in order to check if a specific attribute of a {@link PageFragment page fragment} has a
1111
* certain value.
1212
*
13+
* @see Condition
1314
* @see PageFragment#getAttribute(String)
1415
* @since 2.0
1516
*/
16-
public class AttributeWithValue implements Predicate<PageFragment> {
17+
public class AttributeWithValue implements Condition<PageFragment> {
1718

1819
private final String attributeName;
1920
private final String expectedValue;

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Disabled.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is disabled.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is disabled.
109
*
10+
* @see Condition
1111
* @see PageFragment#isDisabled()
1212
* @since 2.0
1313
*/
14-
public class Disabled implements Predicate<PageFragment> {
14+
public class Disabled implements Condition<PageFragment> {
1515

1616
@Override
1717
public boolean test(PageFragment canBeDisabled) {

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Editable.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is 'editable'.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is 'editable'.
109
* <p>
1110
* A page fragment is considered editable if it is present, visible, enabled and NOT read-only.
1211
*
12+
* @see Condition
1313
* @see ReadOnly
1414
* @see Enabled
1515
* @see Visible
1616
* @since 2.0
1717
*/
18-
public class Editable implements Predicate<PageFragment> {
18+
public class Editable implements Condition<PageFragment> {
1919

2020
private final Present present = new Present();
2121
private final Visible visible = new Visible();

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Enabled.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is enabled.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is enabled.
109
*
10+
* @see Condition
1111
* @see PageFragment#isEnabled()
1212
* @since 2.0
1313
*/
14-
public class Enabled implements Predicate<PageFragment> {
14+
public class Enabled implements Condition<PageFragment> {
1515

1616
@Override
1717
public boolean test(PageFragment canBeDisabled) {

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Interactable.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is interactable.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is interactable.
109
* <p>
1110
* A page fragment is considered interactable if it is present, visible and enabled.
1211
*
12+
* @see Condition
1313
* @see Present
1414
* @see Visible
1515
* @see Enabled
1616
* @since 2.0
1717
*/
18-
public class Interactable implements Predicate<PageFragment> {
18+
public class Interactable implements Condition<PageFragment> {
1919

2020
private final Present present = new Present();
2121
private final Visible visible = new Visible();

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Invisible.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is invisible.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is invisible.
109
*
10+
* @see Condition
1111
* @see PageFragment#isVisible()
1212
* @since 2.0
1313
*/
14-
public class Invisible implements Predicate<PageFragment> {
14+
public class Invisible implements Condition<PageFragment> {
1515

1616
private Visible visible = new Visible();
1717

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Present.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is present.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is present.
109
*
10+
* @see Condition
1111
* @see PageFragment#isPresent()
1212
* @since 2.0
1313
*/
14-
public class Present implements Predicate<PageFragment> {
14+
public class Present implements Condition<PageFragment> {
1515

1616
@Override
1717
public boolean test(PageFragment pageFragment) {

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/PresentAndVisible.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is present and visible.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is present and visible.
109
*
10+
* @see Condition
1111
* @see Present
1212
* @see Visible
1313
* @since 2.0
1414
*/
15-
public class PresentAndVisible implements Predicate<PageFragment> {
15+
public class PresentAndVisible implements Condition<PageFragment> {
1616

1717
private final Visible visible = new Visible();
1818
private final Present present = new Present();

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/ReadOnly.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link PageFragment page fragment} is 'read-only'.
8+
* {@link Condition} to be used in order to check if a {@link PageFragment page fragment} is 'read-only'.
109
* I.g. read-only elements are input elements which are locked against value change but can still be edited.
1110
* <p>
1211
* This condition is true in case the 'readonly' attribute is either 'true' (HTML) or 'readonly' (XHTML).
1312
*
13+
* @see Condition
1414
* @see PageFragment#getAttribute(String)
1515
* @since 2.0
1616
*/
17-
public class ReadOnly implements Predicate<PageFragment> {
17+
public class ReadOnly implements Condition<PageFragment> {
1818

1919
@Override
2020
public boolean test(PageFragment pageFragment) {

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/Selected.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.PageFragment;
65
import info.novatec.testit.webtester.pagefragments.traits.Selectable;
76

87

98
/**
10-
* {@link Predicate} to be used in order to check if the {@link Selectable selectable} {@link PageFragment page fragment} is
9+
* {@link Condition} to be used in order to check if the {@link Selectable selectable} {@link PageFragment page fragment} is
1110
* selected.
1211
*
12+
* @see Condition
1313
* @see Selectable
1414
* @see Selectable#isSelected()
1515
* @since 2.0
1616
*/
17-
public class Selected implements Predicate<Selectable> {
17+
public class Selected implements Condition<Selectable> {
1818

1919
@Override
2020
public boolean test(Selectable selectable) {

webtester-core/src/main/java/info/novatec/testit/webtester/conditions/pagefragments/SelectedIndex.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package info.novatec.testit.webtester.conditions.pagefragments;
22

3-
import java.util.function.Predicate;
4-
3+
import info.novatec.testit.webtester.conditions.Condition;
54
import info.novatec.testit.webtester.pagefragments.SingleSelect;
65

76

87
/**
9-
* {@link Predicate} to be used in order to check if a {@link SingleSelect single-select} has a certain selected index.
8+
* {@link Condition} to be used in order to check if a {@link SingleSelect single-select} has a certain selected index.
109
*
10+
* @see Condition
1111
* @see SingleSelect
1212
* @see SingleSelect#getSelectionIndex()
1313
* @since 2.0
1414
*/
15-
public class SelectedIndex implements Predicate<SingleSelect> {
15+
public class SelectedIndex implements Condition<SingleSelect> {
1616

1717
private final Integer expectedIndex;
1818

0 commit comments

Comments
 (0)