Skip to content

Commit c4a3299

Browse files
committed
Spike to have assertions as expressions.
1 parent 26f2541 commit c4a3299

File tree

5 files changed

+90
-9
lines changed

5 files changed

+90
-9
lines changed

src/main/java/net/itarray/automotion/internal/UIElement.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.itarray.automotion.tools.helpers.TextFinder;
1212
import net.itarray.automotion.validation.properties.Condition;
1313
import net.itarray.automotion.internal.properties.ElementPropertyExpression;
14+
import net.itarray.automotion.validation.properties.Expression;
1415
import org.openqa.selenium.Dimension;
1516
import org.openqa.selenium.Point;
1617
import org.openqa.selenium.WebElement;
@@ -452,16 +453,12 @@ public void validateWidth(Condition<Scalar> condition, Context context, Errors e
452453
validateExtend(RIGHT, condition, context, errors);
453454
}
454455

455-
public void validateExtend(Direction direction, Condition condition, Context context, Errors errors) {
456+
public void validateExtend(Direction direction, Condition<Scalar> condition, Context context, Errors errors) {
456457
ElementPropertyExpression<Scalar> property = ElementPropertyExpression.extend(direction, this);
457-
Scalar value = property.evaluateIn(context, direction);
458-
if (!value.satisfies(condition, context, direction)) {
458+
Expression<Boolean> assertion = condition.applyTo(property);
459+
if (!assertion.evaluateIn(context, direction)) {
459460
errors.add(
460-
String.format("Expected %s to be %s. Actual %s is: %s",
461-
property.getDescription(context, direction),
462-
condition.getDescription(context, direction),
463-
property.getName(),
464-
value.toStringWithUnits(PIXELS)));
461+
assertion.getDescription(context, direction));
465462
}
466463
}
467464

src/main/java/net/itarray/automotion/internal/properties/BinaryScalarConditionWithFixedOperand.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.itarray.automotion.internal.properties;
22

3+
import com.webfirmframework.wffweb.tag.html.formatting.S;
34
import net.itarray.automotion.internal.geometry.Direction;
45
import net.itarray.automotion.internal.geometry.Scalar;
56
import net.itarray.automotion.validation.properties.Condition;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net.itarray.automotion.internal.properties;
2+
3+
import net.itarray.automotion.internal.geometry.Direction;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import net.itarray.automotion.validation.properties.Condition;
6+
import net.itarray.automotion.validation.properties.Expression;
7+
8+
public class ConditionedExpression<T> implements Expression<Boolean> {
9+
10+
private final Expression<T> toBeConditioned;
11+
private final Condition<T> toBeApplied;
12+
13+
public ConditionedExpression(Expression<T> toBeConditioned, Condition<T> toBeApplied) {
14+
this.toBeConditioned = toBeConditioned;
15+
this.toBeApplied = toBeApplied;
16+
}
17+
18+
@Override
19+
public Boolean evaluateIn(Context context, Direction direction) {
20+
return toBeApplied.isSatisfiedOn(toBeConditioned.evaluateIn(context, direction), context, direction);
21+
}
22+
23+
@Override
24+
public String getDescription(Context context, Direction direction) {
25+
T t = toBeConditioned.evaluateIn(context, direction);
26+
return String.format("Expected %s to be %s. Actual %s is: %s",
27+
toBeConditioned.getDescription(context, direction),
28+
toBeApplied.getDescription(context, direction),
29+
(toBeConditioned instanceof ElementPropertyExpression) ? ((ElementPropertyExpression) toBeConditioned).getName() : toBeConditioned.getDescription(context, direction),
30+
(t instanceof Scalar) ? ((Scalar) t).toStringWithUnits("px") : t);
31+
}
32+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.itarray.automotion.internal.properties;
2+
3+
import net.itarray.automotion.internal.geometry.Direction;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import net.itarray.automotion.validation.properties.Expression;
6+
7+
public class ConstantExpression<T> implements Expression<T> {
8+
9+
private final T value;
10+
11+
public ConstantExpression(T value) {
12+
this.value = value;
13+
}
14+
15+
@Override
16+
public T evaluateIn(Context context, Direction direction) {
17+
return value;
18+
}
19+
20+
@Override
21+
public String getDescription(Context context, Direction direction) {
22+
return value.toString() + "px";
23+
}
24+
25+
@Override
26+
public String toString() {
27+
return value.toString();
28+
}
29+
30+
@Override
31+
public boolean equals(Object object) {
32+
if (!(object instanceof ConstantExpression)) {
33+
return false;
34+
}
35+
ConstantExpression other = (ConstantExpression) object;
36+
return value.equals(other.value);
37+
}
38+
39+
@Override
40+
public int hashCode() {
41+
return value.hashCode();
42+
}
43+
}

src/main/java/net/itarray/automotion/validation/properties/Condition.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import net.itarray.automotion.internal.properties.Between;
66
import net.itarray.automotion.internal.properties.BinaryScalarConditionWithFixedOperand;
7+
import net.itarray.automotion.internal.properties.ConditionedExpression;
8+
import net.itarray.automotion.internal.properties.ConstantExpression;
79
import net.itarray.automotion.internal.properties.Context;
810
import net.itarray.automotion.internal.properties.PixelConstant;
911

@@ -110,7 +112,13 @@ public Condition<Scalar> and(Expression<Scalar> upperLimit) {
110112
}
111113
}
112114

113-
boolean isSatisfiedOn(T value, Context context, Direction direction);
115+
default boolean isSatisfiedOn(T value, Context context, Direction direction) {
116+
return applyTo(new ConstantExpression<T>(value)).evaluateIn(context, direction);
117+
}
118+
119+
default Expression<Boolean> applyTo(Expression<T> toBeConditioned) {
120+
return new ConditionedExpression<>(toBeConditioned, this);
121+
}
114122

115123
String getDescription(Context context, Direction direction);
116124
}

0 commit comments

Comments
 (0)