Skip to content

Commit 336f5e3

Browse files
committed
Add tests to ci
1 parent 3672665 commit 336f5e3

3 files changed

Lines changed: 66 additions & 136 deletions

File tree

.github/workflows/dart.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ jobs:
4545
run: dart format .
4646
- name: Test for git changes
4747
run: git diff --exit-code
48-
# Your project will need to have tests in test/ and a dependency on
49-
# package:test for this step to succeed. Note that Flutter projects will
50-
# want to change this to 'flutter test'.
51-
# - name: Run tests
52-
# run: flutter test
48+
- name: Run Flutter tests
49+
if: matrix.projects == 'app'
50+
run: flutter test
51+
- name: Run Dart tests
52+
if: matrix.projects == 'api'
53+
run: dart test
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import 'dart:ui';
2+
3+
import 'package:butterfly/renderers/renderer.dart';
4+
import 'package:flutter_test/flutter_test.dart';
5+
6+
class _TestHitCalculator extends HitCalculator {
7+
@override
8+
bool hit(Rect rect, {bool full = false}) => false;
9+
10+
@override
11+
bool hitPolygon(List<Offset> polygon, {bool full = false}) => false;
12+
}
13+
14+
void main() {
15+
group('HitCalculator.isPolygonInPolygon', () {
16+
test('does not hit a polygon in the hollow of a concave lasso', () {
17+
final calculator = _TestHitCalculator();
18+
final lasso = [
19+
Offset(0, 0),
20+
Offset(10, 0),
21+
Offset(10, 2),
22+
Offset(2, 2),
23+
Offset(2, 8),
24+
Offset(10, 8),
25+
Offset(10, 10),
26+
Offset(0, 10),
27+
];
28+
final shapeInHollow = [
29+
Offset(5, 4),
30+
Offset(7, 4),
31+
Offset(7, 6),
32+
Offset(5, 6),
33+
];
34+
35+
expect(calculator.isPolygonInPolygon(lasso, shapeInHollow), isFalse);
36+
});
37+
38+
test('hits intersecting polygons', () {
39+
final calculator = _TestHitCalculator();
40+
final lasso = [
41+
Offset(0, 0),
42+
Offset(10, 0),
43+
Offset(10, 2),
44+
Offset(2, 2),
45+
Offset(2, 8),
46+
Offset(10, 8),
47+
Offset(10, 10),
48+
Offset(0, 10),
49+
];
50+
final crossingShape = [
51+
Offset(1, 1),
52+
Offset(3, 1),
53+
Offset(3, 3),
54+
Offset(1, 3),
55+
];
56+
57+
expect(calculator.isPolygonInPolygon(lasso, crossingShape), isTrue);
58+
});
59+
});
60+
}

app/test/renderers/select_foreground_test.dart

Lines changed: 0 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import 'dart:math';
22

33
import 'package:butterfly/renderers/foregrounds/select.dart';
4-
import 'package:butterfly/renderers/renderer.dart';
5-
import 'package:butterfly_api/butterfly_api.dart';
64
import 'package:flutter/material.dart';
75
import 'package:flutter_test/flutter_test.dart';
86

@@ -36,135 +34,6 @@ void main() {
3634
SelectionTransformCorner.center,
3735
);
3836
});
39-
40-
for (final rotation in [15.0, 30.0, 44.0, 46.0, 75.0]) {
41-
for (final (:corner, :delta) in [
42-
(corner: SelectionTransformCorner.topLeft, delta: const Offset(-30, -20)),
43-
(corner: SelectionTransformCorner.topCenter, delta: const Offset(0, -20)),
44-
(corner: SelectionTransformCorner.topRight, delta: const Offset(30, -20)),
45-
(
46-
corner: SelectionTransformCorner.centerLeft,
47-
delta: const Offset(-30, 0),
48-
),
49-
(
50-
corner: SelectionTransformCorner.centerRight,
51-
delta: const Offset(30, 0),
52-
),
53-
(
54-
corner: SelectionTransformCorner.bottomCenter,
55-
delta: const Offset(0, 20),
56-
),
57-
(
58-
corner: SelectionTransformCorner.bottomLeft,
59-
delta: const Offset(-30, 20),
60-
),
61-
(
62-
corner: SelectionTransformCorner.bottomRight,
63-
delta: const Offset(30, 20),
64-
),
65-
]) {
66-
test(
67-
'rotated element AABB scaling is converted before _transform at $rotation degrees from $corner',
68-
() {
69-
final renderer = ShapeRenderer(
70-
ShapeElement(
71-
firstPosition: const Point(0, 0),
72-
secondPosition: const Point(100, 50),
73-
rotation: rotation,
74-
),
75-
);
76-
final selection = renderer.expandedRect!;
77-
final manager = RectSelectionForegroundManager()..select(selection);
78-
final start = corner.getFromRect(selection);
79-
manager.startTransformWithCorner(corner, start);
80-
manager.updateCurrentPosition(start + delta);
81-
82-
final transform = manager.getTransform()!;
83-
final transformed = renderer.transform(
84-
position: transform.position,
85-
scaleX: transform.scaleX,
86-
scaleY: transform.scaleY,
87-
)!;
88-
final originalRect = renderer.rect;
89-
final originalCenter = originalRect.center;
90-
final originalRadians = rotation * pi / 180;
91-
final originalRotatedTopLeft = rotatePoint(
92-
originalRect.topLeft,
93-
originalCenter,
94-
originalRadians,
95-
);
96-
final originalRotatedTopRight = rotatePoint(
97-
originalRect.topRight,
98-
originalCenter,
99-
originalRadians,
100-
);
101-
final expectedRotatedTopLeft = scaleInSelection(
102-
originalRotatedTopLeft,
103-
selection,
104-
transform,
105-
);
106-
final expectedRotatedTopRight = scaleInSelection(
107-
originalRotatedTopRight,
108-
selection,
109-
transform,
110-
);
111-
final expectedTopEdge =
112-
expectedRotatedTopRight - expectedRotatedTopLeft;
113-
final expectedRotation =
114-
atan2(expectedTopEdge.dy, expectedTopEdge.dx) * 180 / pi;
115-
final expectedScaleX = expectedTopEdge.distance / originalRect.width;
116-
final expectedScaleY =
117-
transform.scaleX * transform.scaleY / expectedScaleX;
118-
final transformedRect = transformed.rect!;
119-
final transformedRotatedTopLeft = rotatePoint(
120-
transformedRect.topLeft,
121-
transformedRect.center,
122-
transformed.rotation * pi / 180,
123-
);
124-
125-
expect(transformed.rotation, closeTo(expectedRotation, 1e-9));
126-
expect(
127-
transformedRotatedTopLeft,
128-
offsetCloseTo(expectedRotatedTopLeft),
129-
);
130-
expect(transformed.rect!.width, closeTo(100 * expectedScaleX, 1e-9));
131-
expect(transformed.rect!.height, closeTo(50 * expectedScaleY, 1e-9));
132-
},
133-
);
134-
}
135-
}
136-
137-
test('rotated element uniform scaling follows expanded bounds', () {
138-
final renderer = ShapeRenderer(
139-
ShapeElement(
140-
firstPosition: const Point(0, 0),
141-
secondPosition: const Point(100, 50),
142-
rotation: 44,
143-
),
144-
);
145-
final selection = renderer.expandedRect!;
146-
final manager = RectSelectionForegroundManager()..select(selection);
147-
manager.startTransformWithCorner(
148-
SelectionTransformCorner.bottomRight,
149-
selection.bottomRight,
150-
);
151-
manager.updateCurrentPosition(
152-
selection.bottomRight +
153-
Offset(selection.width * 0.25, selection.height * 0.25),
154-
);
155-
156-
final transform = manager.getTransform()!;
157-
final transformed = renderer.transform(
158-
position: transform.position,
159-
scaleX: transform.scaleX,
160-
scaleY: transform.scaleY,
161-
)!;
162-
163-
expectRectCloseTo(
164-
transformed.expandedRect!,
165-
manager.getTransformedSelection(),
166-
);
167-
});
16837
}
16938

17039
void expectRectCloseTo(Rect actual, Rect expected) {

0 commit comments

Comments
 (0)