Skip to content

Commit 0c4c8fd

Browse files
committed
introduced Interval to find grids
1 parent d7cbbd2 commit 0c4c8fd

File tree

5 files changed

+203
-1
lines changed

5 files changed

+203
-1
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,18 @@ public ChunkUIElementValidator areAlignedAsGridCells() {
9090

9191
public void validateAlignedAsGridCells(List<UIElement> rootElements) {
9292
if (this.rootElements.size() == 2) {
93-
errors.add("banane");
93+
for (int firstIndex = 0; firstIndex < rootElements.size(); firstIndex++) {
94+
UIElement first = rootElements.get(firstIndex);
95+
for (int secondIndex = firstIndex+1; secondIndex < rootElements.size(); secondIndex++) {
96+
UIElement second = rootElements.get(secondIndex);
97+
if (first.hasRightElement(second) && first.hasBelowElement(second)) {
98+
99+
}else{
100+
errors.add("banane");
101+
}
102+
}
103+
104+
}
94105
}
95106
}
96107

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package net.itarray.automotion.internal.geometry;
2+
3+
import java.util.Objects;
4+
5+
import static java.lang.String.format;
6+
7+
public class Interval {
8+
private final Scalar begin;
9+
private final Scalar end;
10+
11+
public Interval(Scalar begin, Scalar end) {
12+
this.begin = begin;
13+
this.end = end;
14+
}
15+
16+
@Override
17+
public String toString() {
18+
return format("[%s, %s[", begin, end);
19+
}
20+
21+
@Override
22+
public boolean equals(Object object) {
23+
if (!(object instanceof Interval)) {
24+
return false;
25+
}
26+
Interval other = (Interval) object;
27+
if (isEmpty()) {
28+
return other.isEmpty();
29+
}
30+
return begin.equals(other.begin) && end.equals(other.end);
31+
}
32+
33+
@Override
34+
public int hashCode() {
35+
return isEmpty()? 0 : Objects.hash(begin, end);
36+
}
37+
38+
public boolean isEmpty() {
39+
return end.isLessOrEqualTo(begin);
40+
}
41+
42+
public Interval intersect(Interval interval) {
43+
return new Interval(
44+
begin.isLessOrEqualTo(interval.begin) ? interval.begin : begin,
45+
end.isLessOrEqualTo(interval.end) ? end : interval.end);
46+
}
47+
}

src/main/java/net/itarray/automotion/validation/ChunkUIElementValidator.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@
1515
@Element({10, 20, 30, 35}),
1616
@Element({15, 25, 35, 50}),
1717
}),
18+
@Chunk(id = "two_horizontally_overlapping",
19+
description = "two elements which horizontally projections overlap", elements ={
20+
@Element({10, 20, 30, 35}),
21+
@Element({15, 40, 35, 50}),
22+
}),
23+
@Chunk(id = "two_vertically_overlapping",
24+
description = "two elements which vertically projections overlap", elements ={
25+
@Element({10, 20, 30, 35}),
26+
@Element({40, 25, 60, 50}),
27+
}),
28+
@Chunk(id = "two_not_overlapping_in_any_direction",
29+
description = "two elements which horizontal and vertical projections don not overlap", elements ={
30+
@Element({10, 20, 30, 35}),
31+
@Element({40, 40, 60, 60}),
32+
}),
1833
@Chunk(id = "three",
1934
description ="three elements with different sizes in a row with different gutters", elements ={
2035
@Element({100, 50, 300, 60}),
@@ -64,10 +79,13 @@ public interface ChunkUIElementValidator {
6479
@Scenario(chunk = "empty"),
6580
@Scenario(chunk = "one"),
6681
@Scenario(chunk = "seven"),
82+
@Scenario(chunk = "two_not_overlapping_in_any_direction"),
6783
})
6884
@NotValid({
6985
@Scenario(chunk = "empty", oneOrMore = true),
7086
@Scenario(chunk = "two_overlapping"),
87+
@Scenario(chunk = "two_horizontally_overlapping"),
88+
@Scenario(chunk = "two_vertically_overlapping"),
7189
})
7290
ChunkUIElementValidator areAlignedAsGridCells();
7391

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
public class EmptyIntervalTest {
11+
12+
private Scalar begin;
13+
private Scalar end;
14+
private Interval interval;
15+
16+
@Before
17+
public void setUp() {
18+
begin = new Scalar(17);
19+
end = new Scalar(10);
20+
interval = new Interval(begin, end);
21+
}
22+
23+
@Test
24+
public void isEmpty() {
25+
assertThat(interval.isEmpty()).isTrue();
26+
}
27+
28+
@Test
29+
public void isEqualToIntervalsOtherEmptyIntervals() {
30+
assertThat(interval).isEqualTo(new Interval(new Scalar(100), new Scalar(99)));
31+
assertThat(interval.hashCode()).isEqualTo(new Interval(new Scalar(100), new Scalar(99)).hashCode());
32+
}
33+
34+
@Test
35+
public void isNotEqualToNonEmptyIntervals() {
36+
assertThat(interval).isNotEqualTo(new Interval(new Scalar(10), new Scalar(20)));
37+
}
38+
39+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
public class IntervalTest {
11+
12+
private Scalar begin;
13+
private Scalar end;
14+
private Interval interval;
15+
16+
@Before
17+
public void setUp() {
18+
begin = new Scalar(10);
19+
end = new Scalar(17);
20+
interval = new Interval(begin, end);
21+
}
22+
23+
@Test
24+
public void isEqualToIntervalsWithEqualBeginAndEnd() {
25+
assertThat(interval).isEqualTo(new Interval(begin, end));
26+
assertThat(interval.hashCode()).isEqualTo(new Interval(begin, end).hashCode());
27+
}
28+
29+
@Test
30+
public void isNotEqualToIntervalsWithDifferentBegin() {
31+
assertThat(interval).isNotEqualTo(new Interval(begin.plus(1), end));
32+
}
33+
34+
@Test
35+
public void isNotEqualToIntervalsWithDifferentEnd() {
36+
assertThat(interval).isNotEqualTo(new Interval(begin, end.plus(1)));
37+
}
38+
39+
@Test
40+
public void isNotEmpty() {
41+
assertThat(interval.isEmpty()).isFalse();
42+
}
43+
44+
@Test
45+
public void isNotEqualToEmptyIntervals() {
46+
assertThat(interval).isNotEqualTo(new Interval(begin, begin));
47+
}
48+
49+
@Test
50+
public void intersectionWithIntervalBeforeIsEmpty() {
51+
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin.minus(5)));
52+
assertThat(intersection.isEmpty()).isTrue();
53+
}
54+
55+
@Test
56+
public void intersectionWithIntervalBeforeButTouchingIsEmpty() {
57+
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin));
58+
assertThat(intersection.isEmpty()).isTrue();
59+
}
60+
61+
@Test
62+
public void intersectionWithIntervalContainingBeginIsNotEmpty() {
63+
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin.plus(1)));
64+
assertThat(intersection.isEmpty()).isFalse();
65+
assertThat(intersection).isEqualTo(new Interval(begin, begin.plus(1)));
66+
}
67+
68+
@Test
69+
public void intersectionWithIntervalContainingAPointJustBeforeEndIsNotEmpty() {
70+
Interval intersection = interval.intersect(new Interval(end.minus(1), end.plus(10)));
71+
assertThat(intersection.isEmpty()).isFalse();
72+
assertThat(intersection).isEqualTo(new Interval(end.minus(1), end));
73+
}
74+
75+
@Test
76+
public void intersectionWithIntervalAfterIsEmpty() {
77+
Interval intersection = interval.intersect(new Interval(end.plus(5), end.plus(10)));
78+
assertThat(intersection.isEmpty()).isTrue();
79+
}
80+
81+
@Test
82+
public void intersectionWithIntervalAfterButTouchingIsEmpty() {
83+
Interval intersection = interval.intersect(new Interval(end, end.plus(10)));
84+
assertThat(intersection.isEmpty()).isTrue();
85+
}
86+
87+
}

0 commit comments

Comments
 (0)