Skip to content

Commit 384784d

Browse files
committed
tolerance for relational conditions
1 parent e8a5749 commit 384784d

File tree

12 files changed

+81
-80
lines changed

12 files changed

+81
-80
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,13 @@ private void validateNotSameHeight(List<UIElement> elements) {
443443

444444
private void validateCenteredOnPageVertically(List<UIElement> elements) {
445445
for (UIElement element : elements) {
446-
element.validateCenteredOnVertically(page, errors);
446+
element.validateCenteredOnVertically(page, getContext(), errors);
447447
}
448448
}
449449

450450
private void validateCenteredOnPageHorizontally(List<UIElement> elements) {
451451
for (UIElement element : elements) {
452-
element.validateCenteredOnHorizontally(page, errors);
452+
element.validateCenteredOnHorizontally(page, getContext(), errors);
453453
}
454454
}
455455

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

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,7 @@ public Scalar getOffset(Direction direction, UIElement page) {
176176
return direction.signedDistance(getEnd(direction), page.getEnd(direction));
177177
}
178178

179-
public Scalar getTopOffset(UIElement page) {
180-
return getOffset(UP, page);
181-
}
182-
183-
public Scalar getBottomOffset(UIElement page) {
184-
return getOffset(DOWN, page);
185-
}
186-
187-
public Scalar getLeftOffset(UIElement page) {
188-
return getOffset(LEFT, page);
189-
}
190-
191-
public Scalar getRightOffset(UIElement page) {
192-
return getOffset(RIGHT, page);
193-
}
194-
195-
public boolean hasEqualOppositeOffsets(Direction direction, UIElement page) {
179+
public boolean hasEqualOppositeOffsets(Direction direction, UIElement page, Context context) {
196180
return getOffset(direction, page).equals(getOffset(direction.opposite(), page));
197181
}
198182

@@ -426,17 +410,17 @@ public void validateOffset(Direction direction, Condition condition, UIElement p
426410
}
427411
}
428412

429-
public void validateCenteredOnVertically(UIElement page, Errors errors) {
430-
validateCentered(RIGHT, page, errors);
413+
public void validateCenteredOnVertically(UIElement page, Context context, Errors errors) {
414+
validateCentered(RIGHT, page, context, errors);
431415
}
432416

433-
public void validateCenteredOnHorizontally(UIElement page, Errors errors) {
434-
validateCentered(DOWN, page, errors);
417+
public void validateCenteredOnHorizontally(UIElement page, Context context, Errors errors) {
418+
validateCentered(DOWN, page, context, errors);
435419
}
436420

437-
public void validateCentered(Direction direction, UIElement page, Errors errors) {
421+
private void validateCentered(Direction direction, UIElement page, Context context, Errors errors) {
438422
Direction opposite = direction.opposite();
439-
if (!hasEqualOppositeOffsets(direction, page)) {
423+
if (!hasEqualOppositeOffsets(direction, page, context)) {
440424
errors.add(
441425
String.format("Element %s has not equal %s and %s offset. %s offset is %s, %s is %s",
442426
getQuotedName(),

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ public UIValidatorBase doesNotHaveCssValue(String cssProperty, String... args) {
531531
*/
532532
@Override
533533
public UIValidatorBase isCenteredOnPageHorizontally() {
534-
rootElement.validateCenteredOnVertically(page, errors);
534+
rootElement.validateCenteredOnVertically(page, getContext(), errors);
535535
return this;
536536
}
537537

@@ -542,7 +542,7 @@ public UIValidatorBase isCenteredOnPageHorizontally() {
542542
*/
543543
@Override
544544
public UIValidatorBase isCenteredOnPageVertically() {
545-
rootElement.validateCenteredOnHorizontally(page, errors);
545+
rootElement.validateCenteredOnHorizontally(page, getContext(), errors);
546546
return this;
547547
}
548548

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package net.itarray.automotion.internal.properties;
22

3-
import com.webfirmframework.wffweb.tag.html.formatting.S;
4-
import net.itarray.automotion.internal.geometry.Direction;
53
import net.itarray.automotion.internal.geometry.ExtendGiving;
64
import net.itarray.automotion.internal.geometry.MetricSpace;
75
import net.itarray.automotion.internal.geometry.Scalar;
@@ -15,23 +13,23 @@
1513

1614
public class BinaryScalarConditionWithFixedOperand implements Condition<Scalar> {
1715
private final Expression<Scalar> fixedOperand;
18-
private final BiPredicate<Scalar, Scalar> predicate;
16+
private final ContextBiFunction<Scalar, Scalar, Boolean> contextPredicate;
1917
private final String toStringFormat;
2018

2119

2220
public BinaryScalarConditionWithFixedOperand(Expression<Scalar> fixedOperand, BiPredicate<Scalar, Scalar> predicate, String toStringFormat) {
23-
this.fixedOperand = fixedOperand;
24-
this.predicate = predicate;
25-
this.toStringFormat = toStringFormat;
21+
this(fixedOperand, (left, right, context) -> predicate.test(left, right), toStringFormat);
2622
}
2723

28-
protected boolean applyTo(Scalar operand, Scalar fixedOperand) {
29-
return predicate.test(operand, fixedOperand);
24+
public BinaryScalarConditionWithFixedOperand(Expression<Scalar> fixedOperand, ContextBiFunction<Scalar, Scalar, Boolean> contextPredicate, String toStringFormat) {
25+
this.fixedOperand = fixedOperand;
26+
this.contextPredicate = contextPredicate;
27+
this.toStringFormat = toStringFormat;
3028
}
3129

3230
@Override
3331
public <V extends MetricSpace<V>> boolean isSatisfiedOn(Scalar value, Context context, ExtendGiving<V> direction) {
34-
return applyTo(value, fixedOperand.evaluateIn(context, direction));
32+
return contextPredicate.apply(value, fixedOperand.evaluateIn(context, direction), context);
3533
}
3634

3735
@Override
@@ -41,7 +39,7 @@ public <V extends MetricSpace<V>> String getDescription(Context context, ExtendG
4139

4240
@Override
4341
public String toString() {
44-
return String.format("%s(%s)", uncapitalize(getClass().getSimpleName()), fixedOperand);
42+
return String.format("%s(%s)", uncapitalize(getClass().getSimpleName()), fixedOperand); // todo: tolerance
4543
}
4644

4745

@@ -51,11 +49,11 @@ public boolean equals(Object object) {
5149
return false;
5250
}
5351
BinaryScalarConditionWithFixedOperand other = (BinaryScalarConditionWithFixedOperand) object;
54-
return fixedOperand.equals(other.fixedOperand) && predicate.equals(other.predicate);
52+
return fixedOperand.equals(other.fixedOperand) && contextPredicate.equals(other.contextPredicate);
5553
}
5654

5755
@Override
5856
public int hashCode() {
59-
return fixedOperand.hashCode() * 31 ^ predicate.hashCode();
57+
return fixedOperand.hashCode() * 31 ^ contextPredicate.hashCode();
6058
}
6159
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
package net.itarray.automotion.internal.properties;
22

3+
import net.itarray.automotion.internal.geometry.Scalar;
4+
35
@FunctionalInterface
46
public interface ContextBiFunction<L, R, T> {
57
T apply(L l, R r, Context context);
8+
9+
ContextBiFunction<Scalar, Scalar, Boolean> equalToWithTolerance = (scalar, object, context) -> scalar.minus(object).norm().isLessOrEqualTo(context.getTolerance());
10+
ContextBiFunction<Scalar, Scalar, Boolean> greaterOrEqualTo = (scalar, other, context) -> scalar.isGreaterOrEqualTo(other.minus(context.getTolerance()));
11+
ContextBiFunction<Scalar, Scalar, Boolean> greaterThan = (scalar, other, context) -> scalar.isGreaterThan(other.minus(context.getTolerance()));
12+
ContextBiFunction<Scalar, Scalar, Boolean> lessOrEqualTo = (scalar, other, context) -> scalar.isLessOrEqualTo(other.plus(context.getTolerance()));
13+
ContextBiFunction<Scalar, Scalar, Boolean> lessThan = (scalar, other, context) -> scalar.isLessThan(other.plus(context.getTolerance()));
14+
615
}

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
import net.itarray.automotion.internal.properties.ConditionedExpression;
1010
import net.itarray.automotion.internal.properties.ConstantExpression;
1111
import net.itarray.automotion.internal.properties.Context;
12+
import net.itarray.automotion.internal.properties.ContextBiFunction;
1213
import net.itarray.automotion.internal.properties.PixelConstant;
1314

15+
import java.util.function.BiPredicate;
16+
1417
import static net.itarray.automotion.internal.geometry.Scalar.scalar;
1518

1619
public interface Condition<T> {
@@ -24,7 +27,7 @@ static Condition<Scalar> equalTo(Scalar limit) {
2427
}
2528

2629
static Condition<Scalar> equalTo(Expression<Scalar> lowerLimit) {
27-
return new BinaryScalarConditionWithFixedOperand(lowerLimit, Scalar::equals, "equal to %s");
30+
return new BinaryScalarConditionWithFixedOperand(lowerLimit, ContextBiFunction.equalToWithTolerance, "equal to %s");
2831
}
2932

3033
static Condition<Scalar> greaterOrEqualTo(int limit) {
@@ -36,7 +39,7 @@ static Condition<Scalar> greaterOrEqualTo(Scalar limit) {
3639
}
3740

3841
static Condition<Scalar> greaterOrEqualTo(Expression<Scalar> lowerLimit) {
39-
return new BinaryScalarConditionWithFixedOperand(lowerLimit, Scalar::isGreaterOrEqualTo, "greater or equal to %s");
42+
return new BinaryScalarConditionWithFixedOperand(lowerLimit, ContextBiFunction.greaterOrEqualTo, "greater or equal to %s");
4043
}
4144

4245
static Condition<Scalar> greaterThan(int limit) {
@@ -48,7 +51,7 @@ static Condition<Scalar> greaterThan(Scalar limit) {
4851
}
4952

5053
static Condition<Scalar> greaterThan(Expression<Scalar> lowerLimit) {
51-
return new BinaryScalarConditionWithFixedOperand(lowerLimit, Scalar::isGreaterThan, "greater than %s");
54+
return new BinaryScalarConditionWithFixedOperand(lowerLimit, ContextBiFunction.greaterThan, "greater than %s");
5255
}
5356

5457
static Condition<Scalar> lessOrEqualTo(int limit) {
@@ -60,7 +63,7 @@ static Condition<Scalar> lessOrEqualTo(Scalar limit) {
6063
}
6164

6265
static Condition<Scalar> lessOrEqualTo(Expression<Scalar> upperLimit) {
63-
return new BinaryScalarConditionWithFixedOperand(upperLimit, Scalar::isLessOrEqualTo, "less or equal to %s");
66+
return new BinaryScalarConditionWithFixedOperand(upperLimit, ContextBiFunction.lessOrEqualTo, "less or equal to %s");
6467
}
6568

6669
static Condition<Scalar> lessThan(int limit) {
@@ -72,7 +75,7 @@ static Condition<Scalar> lessThan(Scalar limit) {
7275
}
7376

7477
static Condition<Scalar> lessThan(Expression<Scalar> upperLimit) {
75-
return new BinaryScalarConditionWithFixedOperand(upperLimit, Scalar::isLessThan, "less than %s");
78+
return new BinaryScalarConditionWithFixedOperand(upperLimit, ContextBiFunction.lessThan, "less than %s");
7679
}
7780

7881
static LowerLimit between(int lowerLimit) {

src/test/java/net/itarray/automotion/tests/properties/ConditionEqualToTest.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ConditionEqualToTest {
1414

1515
private Condition<Scalar> condition;
1616
private Scalar limit;
17-
private Context context;
17+
private TestContext context;
1818
private Direction direction;
1919

2020
@Before
@@ -27,19 +27,21 @@ public void createProperty() {
2727

2828
@Test
2929
public void isNotSatisfiedOnValuesSmallerThanTheLimit() {
30-
boolean result = condition.isSatisfiedOn(limit.minus(1), context, direction);
31-
assertThat(result).isFalse();
30+
assertThat(condition.isSatisfiedOn(limit.minus(1), context, direction)).isFalse();
31+
assertThat(condition.isSatisfiedOn(limit.minus(2), context.withTolerance(1), direction)).isFalse();
3232
}
3333

3434
@Test
3535
public void isSatisfiedOnValuesEqualToTheLimit() {
36-
boolean result = condition.isSatisfiedOn(limit, context, direction);
37-
assertThat(result).isTrue();
36+
assertThat(condition.isSatisfiedOn(limit, context, direction)).isTrue();
37+
assertThat(condition.isSatisfiedOn(limit.minus(1), context.withTolerance(1), direction)).isTrue();
38+
assertThat(condition.isSatisfiedOn(limit, context.withTolerance(1), direction)).isTrue();
39+
assertThat(condition.isSatisfiedOn(limit.plus(1), context.withTolerance(1), direction)).isTrue();
3840
}
3941

4042
@Test
4143
public void isNotSatisfiedOnValuesGreaterThanTheLimit() {
42-
boolean result = condition.isSatisfiedOn(limit.plus(1), context, direction);
43-
assertThat(result).isFalse();
44+
assertThat(condition.isSatisfiedOn(limit.plus(1), context, direction)).isFalse();
45+
assertThat(condition.isSatisfiedOn(limit.plus(2), context.withTolerance(1), direction)).isFalse();
4446
}
4547
}

src/test/java/net/itarray/automotion/tests/properties/ConditionGreaterOrEqualToTest.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ConditionGreaterOrEqualToTest {
1414

1515
private Condition<Scalar> condition;
1616
private Scalar limit;
17-
private Context context;
17+
private TestContext context;
1818
private Direction direction;
1919

2020
@Before
@@ -27,20 +27,21 @@ public void createProperty() {
2727

2828
@Test
2929
public void isSatisfiedOnValuesSmallerThanTheLimit() {
30-
boolean result = condition.isSatisfiedOn(limit.minus(1), context, direction);
31-
assertThat(result).isFalse();
30+
assertThat(condition.isSatisfiedOn(limit.minus(1), context, direction)).isFalse();
31+
assertThat(condition.isSatisfiedOn(limit.minus(2), context.withTolerance(1), direction)).isFalse();
3232
}
3333

3434
@Test
3535
public void isSatisfiedOnValuesEqualToTheLimit() {
36-
boolean result = condition.isSatisfiedOn(limit, context, direction);
37-
assertThat(result).isTrue();
36+
assertThat(condition.isSatisfiedOn(limit, context, direction)).isTrue();
37+
assertThat(condition.isSatisfiedOn(limit, context.withTolerance(1), direction)).isTrue();
38+
assertThat(condition.isSatisfiedOn(limit.minus(1), context.withTolerance(1), direction)).isTrue();
3839
}
3940

4041
@Test
4142
public void isSatisfiedOnValuesGreaterThanTheLimit() {
42-
boolean result = condition.isSatisfiedOn(limit.plus(1), context, direction);
43-
assertThat(result).isTrue();
43+
assertThat(condition.isSatisfiedOn(limit.plus(1), context, direction)).isTrue();
44+
assertThat(condition.isSatisfiedOn(limit.plus(1), context.withTolerance(1), direction)).isTrue();
4445
}
4546

4647
@Test

src/test/java/net/itarray/automotion/tests/properties/ConditionGreaterThanTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ConditionGreaterThanTest {
1414

1515
private Condition<Scalar> condition;
1616
private Scalar limit;
17-
private Context context;
17+
private TestContext context;
1818
private Direction direction;
1919

2020
@Before
@@ -27,19 +27,19 @@ public void createProperty() {
2727

2828
@Test
2929
public void isNotSatisfiedOnValuesSmallerThanTheLimit() {
30-
boolean result = condition.isSatisfiedOn(limit.minus(1), context, direction);
31-
assertThat(result).isFalse();
30+
assertThat(condition.isSatisfiedOn(limit.minus(1), context, direction)).isFalse();
31+
assertThat(condition.isSatisfiedOn(limit.minus(1), context.withTolerance(1), direction)).isFalse();
3232
}
3333

3434
@Test
3535
public void isNotSatisfiedOnValuesEqualToTheLimit() {
36-
boolean result = condition.isSatisfiedOn(limit, context, direction);
37-
assertThat(result).isFalse();
36+
assertThat(condition.isSatisfiedOn(limit, context, direction)).isFalse();
3837
}
3938

4039
@Test
4140
public void isSatisfiedOnValuesGreaterThanTheLimit() {
42-
boolean result = condition.isSatisfiedOn(limit.plus(1), context, direction);
43-
assertThat(result).isTrue();
41+
assertThat(condition.isSatisfiedOn(limit.plus(1), context, direction)).isTrue();
42+
assertThat(condition.isSatisfiedOn(limit.plus(1), context.withTolerance(1), direction)).isTrue();
43+
assertThat(condition.isSatisfiedOn(limit, context.withTolerance(1), direction)).isTrue();
4444
}
4545
}

src/test/java/net/itarray/automotion/tests/properties/ConditionLessOrEqualToTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class ConditionLessOrEqualToTest {
1414

1515
private Condition<Scalar> condition;
1616
private Scalar limit;
17-
private Context context;
17+
private TestContext context;
1818
private Direction direction;
1919

2020
@Before
@@ -27,20 +27,21 @@ public void createProperty() {
2727

2828
@Test
2929
public void isSatisfiedOnValuesSmallerThanTheLimit() {
30-
boolean result = condition.isSatisfiedOn(limit.minus(1), context, direction);
31-
assertThat(result).isTrue();
30+
assertThat(condition.isSatisfiedOn(limit.minus(1), context, direction)).isTrue();
31+
assertThat(condition.isSatisfiedOn(limit.minus(1), context.withTolerance(1), direction)).isTrue();
3232
}
3333

3434
@Test
3535
public void isSatisfiedOnValuesEqualToTheLimit() {
36-
boolean result = condition.isSatisfiedOn(limit, context, direction);
37-
assertThat(result).isTrue();
36+
assertThat(condition.isSatisfiedOn(limit, context, direction)).isTrue();
37+
assertThat(condition.isSatisfiedOn(limit, context.withTolerance(1), direction)).isTrue();
38+
assertThat(condition.isSatisfiedOn(limit.plus(1), context.withTolerance(1), direction)).isTrue();
3839
}
3940

4041
@Test
41-
public void isSatisfiedOnValuesGreaterThanTheLimit() {
42-
boolean result = condition.isSatisfiedOn(limit.plus(1), context, direction);
43-
assertThat(result).isFalse();
42+
public void isNotSatisfiedOnValuesGreaterThanTheLimit() {
43+
assertThat(condition.isSatisfiedOn(limit.plus(1), context, direction)).isFalse();
44+
assertThat(condition.isSatisfiedOn(limit.plus(2), context.withTolerance(1), direction)).isFalse();
4445
}
4546

4647
@Test

0 commit comments

Comments
 (0)