OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library rect_test; | |
6 | |
7 import 'dart:math'; | 5 import 'dart:math'; |
8 import 'package:unittest/unittest.dart'; | 6 import 'package:expect/expect.dart'; |
9 | 7 |
10 main() { | 8 main() { |
11 Rectangle createRectangle(List<num> a) { | 9 testConstruction(); |
12 return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) | 10 testIntersection(); |
13 : null; | 11 testIntersects(); |
14 } | 12 testBoundingBox(); |
15 | 13 testContainsRectangle(); |
16 test('construction', () { | 14 testContainsPoint(); |
17 var r0 = new Rectangle(10, 20, 30, 40); | 15 testHashCode(); |
18 expect(r0.toString(), 'Rectangle (10, 20) 30 x 40'); | 16 testEdgeCases(); |
19 expect(r0.right, 40); | 17 testEquality(); |
20 expect(r0.bottom, 60); | 18 testNegativeLengths(); |
21 | 19 testNaNLeft(); |
22 var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight); | 20 testNaNTop(); |
23 expect(r1, r0); | 21 testNaNWidth(); |
24 | 22 testNaNHeight(); |
25 var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft); | 23 } |
26 expect(r2, r0); | 24 |
27 }); | 25 Rectangle createRectangle(List<num> a) { |
28 | 26 return a != null ? new Rectangle(a[0], a[1], a[2] - a[0], a[3] - a[1]) |
29 test('intersection', () { | 27 : null; |
30 var tests = [ | 28 } |
31 [[10, 10, 20, 20], [15, 15, 25, 25], [15, 15, 20, 20]], | 29 |
32 [[10, 10, 20, 20], [20, 0, 30, 10], [20, 10, 20, 10]], | 30 testConstruction() { |
33 [[0, 0, 1, 1], [10, 11, 12, 13], null], | 31 var r0 = new Rectangle(10, 20, 30, 40); |
34 [[11, 12, 98, 99], [22, 23, 34, 35], [22, 23, 34, 35]]]; | 32 Expect.equals('Rectangle (10, 20) 30 x 40', r0.toString()); |
35 | 33 Expect.equals(40, r0.right); |
36 for (var test in tests) { | 34 Expect.equals(60, r0.bottom); |
37 var r0 = createRectangle(test[0]); | 35 |
38 var r1 = createRectangle(test[1]); | 36 var r1 = new Rectangle.fromPoints(r0.topLeft, r0.bottomRight); |
39 var expected = createRectangle(test[2]); | 37 Expect.equals(r0, r1); |
40 | 38 |
41 expect(r0.intersection(r1), expected); | 39 var r2 = new Rectangle.fromPoints(r0.bottomRight, r0.topLeft); |
42 expect(r1.intersection(r0), expected); | 40 Expect.equals(r0, r2); |
43 } | 41 } |
44 }); | 42 |
45 | 43 testIntersection() { |
46 test('intersects', () { | 44 var tests = [ |
47 var r0 = new Rectangle(10, 10, 20, 20); | 45 [[10, 10, 20, 20], [15, 15, 25, 25], [15, 15, 20, 20]], |
48 var r1 = new Rectangle(15, 15, 25, 25); | 46 [[10, 10, 20, 20], [20, 0, 30, 10], [20, 10, 20, 10]], |
49 var r2 = new Rectangle(0, 0, 1, 1); | 47 [[0, 0, 1, 1], [10, 11, 12, 13], null], |
50 | 48 [[11, 12, 98, 99], [22, 23, 34, 35], [22, 23, 34, 35]]]; |
51 expect(r0.intersects(r1), isTrue); | 49 |
52 expect(r1.intersects(r0), isTrue); | 50 for (var test in tests) { |
53 | 51 var r0 = createRectangle(test[0]); |
54 expect(r0.intersects(r2), isFalse); | 52 var r1 = createRectangle(test[1]); |
55 expect(r2.intersects(r0), isFalse); | 53 var expected = createRectangle(test[2]); |
56 }); | 54 |
57 | 55 Expect.equals(expected, r0.intersection(r1)); |
58 test('boundingBox', () { | 56 Expect.equals(expected, r1.intersection(r0)); |
59 var tests = [ | 57 } |
60 [[10, 10, 20, 20], [15, 15, 25, 25], [10, 10, 25, 25]], | 58 } |
61 [[10, 10, 20, 20], [20, 0, 30, 10], [10, 0, 30, 20]], | 59 |
62 [[0, 0, 1, 1], [10, 11, 12, 13], [0, 0, 12, 13]], | 60 testIntersects() { |
63 [[11, 12, 98, 99], [22, 23, 34, 35], [11, 12, 98, 99]]]; | 61 var r0 = new Rectangle(10, 10, 20, 20); |
64 | 62 var r1 = new Rectangle(15, 15, 25, 25); |
65 for (var test in tests) { | 63 var r2 = new Rectangle(0, 0, 1, 1); |
66 var r0 = createRectangle(test[0]); | 64 |
67 var r1 = createRectangle(test[1]); | 65 Expect.isTrue(r0.intersects(r1)); |
68 var expected = createRectangle(test[2]); | 66 Expect.isTrue(r1.intersects(r0)); |
69 | 67 |
70 expect(r0.boundingBox(r1), expected); | 68 Expect.isFalse(r0.intersects(r2)); |
71 expect(r1.boundingBox(r0), expected); | 69 Expect.isFalse(r2.intersects(r0)); |
72 } | 70 } |
73 }); | 71 |
74 | 72 testBoundingBox() { |
75 test('containsRectangle', () { | 73 var tests = [ |
76 var r = new Rectangle(-10, 0, 20, 10); | 74 [[10, 10, 20, 20], [15, 15, 25, 25], [10, 10, 25, 25]], |
77 expect(r.containsRectangle(r), isTrue); | 75 [[10, 10, 20, 20], [20, 0, 30, 10], [10, 0, 30, 20]], |
78 | 76 [[0, 0, 1, 1], [10, 11, 12, 13], [0, 0, 12, 13]], |
79 expect(r.containsRectangle( | 77 [[11, 12, 98, 99], [22, 23, 34, 35], [11, 12, 98, 99]]]; |
80 new Rectangle(double.NAN, double.NAN, double.NAN, double.NAN)), isFalse)
; | 78 |
81 | 79 for (var test in tests) { |
82 var r2 = new Rectangle(0, 2, 5, 5); | 80 var r0 = createRectangle(test[0]); |
83 expect(r.containsRectangle(r2), isTrue); | 81 var r1 = createRectangle(test[1]); |
84 expect(r2.containsRectangle(r), isFalse); | 82 var expected = createRectangle(test[2]); |
85 | 83 |
86 r2 = new Rectangle(-11, 2, 5, 5); | 84 Expect.equals(expected, r0.boundingBox(r1)); |
87 expect(r.containsRectangle(r2), isFalse); | 85 Expect.equals(expected, r1.boundingBox(r0)); |
88 r2 = new Rectangle(0, 2, 15, 5); | 86 } |
89 expect(r.containsRectangle(r2), isFalse); | 87 } |
90 r2 = new Rectangle(0, 2, 5, 10); | 88 |
91 expect(r.containsRectangle(r2), isFalse); | 89 testContainsRectangle() { |
92 r2 = new Rectangle(0, 0, 5, 10); | 90 var r = new Rectangle(-10, 0, 20, 10); |
93 expect(r.containsRectangle(r2), isTrue); | 91 Expect.isTrue(r.containsRectangle(r)); |
94 }); | 92 |
95 | 93 Expect.isFalse(r.containsRectangle( |
96 test('containsPoint', () { | 94 new Rectangle(double.NAN, double.NAN, double.NAN, double.NAN))); |
97 var r = new Rectangle(20, 40, 60, 80); | 95 |
98 | 96 var r2 = new Rectangle(0, 2, 5, 5); |
99 // Test middle. | 97 Expect.isTrue(r.containsRectangle(r2)); |
100 expect(r.containsPoint(new Point(50, 80)), isTrue); | 98 Expect.isFalse(r2.containsRectangle(r)); |
101 | 99 |
102 // Test edges. | 100 r2 = new Rectangle(-11, 2, 5, 5); |
103 expect(r.containsPoint(new Point(20, 40)), isTrue); | 101 Expect.isFalse(r.containsRectangle(r2)); |
104 expect(r.containsPoint(new Point(50, 40)), isTrue); | 102 r2 = new Rectangle(0, 2, 15, 5); |
105 expect(r.containsPoint(new Point(80, 40)), isTrue); | 103 Expect.isFalse(r.containsRectangle(r2)); |
106 expect(r.containsPoint(new Point(80, 80)), isTrue); | 104 r2 = new Rectangle(0, 2, 5, 10); |
107 expect(r.containsPoint(new Point(80, 120)), isTrue); | 105 Expect.isFalse(r.containsRectangle(r2)); |
108 expect(r.containsPoint(new Point(50, 120)), isTrue); | 106 r2 = new Rectangle(0, 0, 5, 10); |
109 expect(r.containsPoint(new Point(20, 120)), isTrue); | 107 Expect.isTrue(r.containsRectangle(r2)); |
110 expect(r.containsPoint(new Point(20, 80)), isTrue); | 108 } |
111 | 109 |
112 // Test outside. | 110 testContainsPoint() { |
113 expect(r.containsPoint(new Point(0, 0)), isFalse); | 111 var r = new Rectangle(20, 40, 60, 80); |
114 expect(r.containsPoint(new Point(50, 0)), isFalse); | 112 |
115 expect(r.containsPoint(new Point(100, 0)), isFalse); | 113 // Test middle. |
116 expect(r.containsPoint(new Point(100, 80)), isFalse); | 114 Expect.isTrue(r.containsPoint(new Point(50, 80))); |
117 expect(r.containsPoint(new Point(100, 160)), isFalse); | 115 |
118 expect(r.containsPoint(new Point(50, 160)), isFalse); | 116 // Test edges. |
119 expect(r.containsPoint(new Point(0, 160)), isFalse); | 117 Expect.isTrue(r.containsPoint(new Point(20, 40))); |
120 expect(r.containsPoint(new Point(0, 80)), isFalse); | 118 Expect.isTrue(r.containsPoint(new Point(50, 40))); |
121 }); | 119 Expect.isTrue(r.containsPoint(new Point(80, 40))); |
122 | 120 Expect.isTrue(r.containsPoint(new Point(80, 80))); |
123 test('hashCode', () { | 121 Expect.isTrue(r.containsPoint(new Point(80, 120))); |
124 var a = new Rectangle(0, 1, 2, 3); | 122 Expect.isTrue(r.containsPoint(new Point(50, 120))); |
125 var b = new Rectangle(0, 1, 2, 3); | 123 Expect.isTrue(r.containsPoint(new Point(20, 120))); |
126 expect(a.hashCode, b.hashCode); | 124 Expect.isTrue(r.containsPoint(new Point(20, 80))); |
127 | 125 |
128 var c = new Rectangle(1, 0, 2, 3); | 126 // Test outside. |
129 expect(a.hashCode == c.hashCode, isFalse); | 127 Expect.isFalse(r.containsPoint(new Point(0, 0))); |
130 }); | 128 Expect.isFalse(r.containsPoint(new Point(50, 0))); |
131 | 129 Expect.isFalse(r.containsPoint(new Point(100, 0))); |
132 { // Edge cases for boundingBox/intersection | 130 Expect.isFalse(r.containsPoint(new Point(100, 80))); |
133 edgeTest(a, l) { | 131 Expect.isFalse(r.containsPoint(new Point(100, 160))); |
134 test('edge case $a/$l', () { | 132 Expect.isFalse(r.containsPoint(new Point(50, 160))); |
135 var r = new Rectangle(a, a, l, l); | 133 Expect.isFalse(r.containsPoint(new Point(0, 160))); |
136 expect(r.boundingBox(r), r); | 134 Expect.isFalse(r.containsPoint(new Point(0, 80))); |
137 expect(r.intersection(r), r); | 135 } |
138 }); | 136 |
139 } | 137 testHashCode() { |
140 | 138 var a = new Rectangle(0, 1, 2, 3); |
141 var bignum1 = 0x20000000000000 + 0.0; | 139 var b = new Rectangle(0, 1, 2, 3); |
142 var bignum2 = 0x20000000000002 + 0.0; | 140 Expect.equals(b.hashCode, a.hashCode); |
143 var bignum3 = 0x20000000000004 + 0.0; | 141 |
144 edgeTest(1.0, bignum1); | 142 var c = new Rectangle(1, 0, 2, 3); |
145 edgeTest(1.0, bignum2); | 143 Expect.isFalse(a.hashCode == c.hashCode); |
146 edgeTest(1.0, bignum3); | 144 } |
147 edgeTest(bignum1, 1.0); | 145 |
148 edgeTest(bignum2, 1.0); | 146 testEdgeCases() { |
149 edgeTest(bignum3, 1.0); | 147 edgeTest(double a, double l) { |
150 } | 148 var r = new Rectangle(a, a, l, l); |
151 | 149 Expect.equals(r, r.boundingBox(r)); |
152 test("equality with different widths", () { | 150 Expect.equals(r, r.intersection(r)); |
153 var bignum = 0x80000000000008 + 0.0; | 151 } |
154 var r1 = new Rectangle(bignum, bignum, 1.0, 1.0); | 152 |
155 var r2 = new Rectangle(bignum, bignum, 2.0, 2.0); | 153 var bignum1 = 0x20000000000000 + 0.0; |
156 expect(r1, r2); | 154 var bignum2 = 0x20000000000002 + 0.0; |
157 expect(r1.hashCode, r2.hashCode); | 155 var bignum3 = 0x20000000000004 + 0.0; |
158 expect(r1.right, r2.right); | 156 edgeTest(1.0, bignum1); |
159 expect(r1.bottom, r2.bottom); | 157 edgeTest(1.0, bignum2); |
160 expect(r1.width, 1.0); | 158 edgeTest(1.0, bignum3); |
161 expect(r2.width, 2.0); | 159 edgeTest(bignum1, 1.0); |
162 }); | 160 edgeTest(bignum2, 1.0); |
163 | 161 edgeTest(bignum3, 1.0); |
164 test('negative lengths', () { | 162 } |
165 // Constructor allows negative lengths, but clamps them to zero. | 163 |
166 expect(new Rectangle(4, 4, -2, -2), new Rectangle(4, 4, 0, 0)); | 164 testEquality() { |
167 expect(new MutableRectangle(4, 4, -2, -2), new Rectangle(4, 4, 0, 0)); | 165 var bignum = 0x80000000000008 + 0.0; |
168 | 166 var r1 = new Rectangle(bignum, bignum, 1.0, 1.0); |
169 // Setters clamp negative lengths to zero. | 167 var r2 = new Rectangle(bignum, bignum, 2.0, 2.0); |
170 var r = new MutableRectangle(0, 0, 1, 1); | 168 Expect.equals(r2, r1); |
171 r.width = -1; | 169 Expect.equals(r2.hashCode, r1.hashCode); |
172 r.height = -1; | 170 Expect.equals(r2.right, r1.right); |
173 expect(r, new Rectangle(0, 0, 0, 0)); | 171 Expect.equals(r2.bottom, r1.bottom); |
174 | 172 Expect.equals(1.0, r1.width); |
175 // Test that doubles are clamped to double zero. | 173 Expect.equals(2.0, r2.width); |
176 r = new Rectangle(1.5, 1.5, -2.5, -2.5); | 174 } |
177 expect(identical(r.width, 0.0), isTrue); | 175 |
178 expect(identical(r.height, 0.0), isTrue); | 176 testNegativeLengths() { |
179 }); | 177 // Constructor allows negative lengths, but clamps them to zero. |
180 | 178 Expect.equals(new Rectangle(4, 4, 0, 0), new Rectangle(4, 4, -2, -2)); |
181 // A NaN-value in any rectangle value means the rectange is considered | 179 Expect.equals(new Rectangle(4, 4, 0, 0), |
182 // empty (contains no points, doesn't intersect any other rectangle). | 180 new MutableRectangle(4, 4, -2, -2)); |
183 const NaN = double.NAN; | 181 |
184 var isNaN = predicate((x) => x is double && x.isNaN, "NaN"); | 182 // Setters clamp negative lengths to zero. |
185 | 183 var mutable = new MutableRectangle(0, 0, 1, 1); |
186 test('NaN left', () { | 184 mutable.width = -1; |
187 var rectangles = [ | 185 mutable.height = -1; |
188 const Rectangle(NaN, 1, 2, 3), | 186 Expect.equals(new Rectangle(0, 0, 0, 0), mutable); |
189 new MutableRectangle(NaN, 1, 2, 3), | 187 |
190 new Rectangle.fromPoints(new Point(NaN, 1), new Point(2, 4)), | 188 // Test that doubles are clamped to double zero. |
191 new MutableRectangle.fromPoints(new Point(NaN, 1), new Point(2, 4)), | 189 var rectangle = new Rectangle(1.5, 1.5, -2.5, -2.5); |
192 ]; | 190 Expect.isTrue(identical(rectangle.width, 0.0)); |
193 for (var r in rectangles) { | 191 Expect.isTrue(identical(rectangle.height, 0.0)); |
194 expect(r.containsPoint(new Point(0, 1)), false); | 192 } |
195 expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false); | 193 |
196 expect(r.intersects(new Rectangle(0, 1, 2, 3)), false); | 194 testNaNLeft() { |
197 expect(r.left, isNaN); | 195 var rectangles = [ |
198 expect(r.right, isNaN); | 196 const Rectangle(double.NAN, 1, 2, 3), |
199 } | 197 new MutableRectangle(double.NAN, 1, 2, 3), |
200 }); | 198 new Rectangle.fromPoints(new Point(double.NAN, 1), new Point(2, 4)), |
201 | 199 new MutableRectangle.fromPoints(new Point(double.NAN, 1), new Point(2, 4)), |
202 test('NaN top', () { | 200 ]; |
203 var rectangles = [ | 201 for (var r in rectangles) { |
204 const Rectangle(0, NaN, 2, 3), | 202 Expect.isFalse(r.containsPoint(new Point(0, 1))); |
205 new MutableRectangle(0, NaN, 2, 3), | 203 Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3))); |
206 new Rectangle.fromPoints(new Point(0, NaN), new Point(2, 4)), | 204 Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3))); |
207 new MutableRectangle.fromPoints(new Point(0, NaN), new Point(2, 4)), | 205 Expect.isTrue(r.left.isNaN); |
208 ]; | 206 Expect.isTrue(r.right.isNaN); |
209 for (var r in rectangles) { | 207 } |
210 expect(r.containsPoint(new Point(0, 1)), false); | 208 } |
211 expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false); | 209 testNaNTop() { |
212 expect(r.intersects(new Rectangle(0, 1, 2, 3)), false); | 210 var rectangles = [ |
213 expect(r.top, isNaN); | 211 const Rectangle(0, double.NAN, 2, 3), |
214 expect(r.bottom, isNaN); | 212 new MutableRectangle(0, double.NAN, 2, 3), |
215 } | 213 new Rectangle.fromPoints(new Point(0, double.NAN), new Point(2, 4)), |
216 }); | 214 new MutableRectangle.fromPoints(new Point(0, double.NAN), new Point(2, 4)), |
217 | 215 ]; |
218 test('NaN width', () { | 216 for (var r in rectangles) { |
219 var rectangles = [ | 217 Expect.isFalse(r.containsPoint(new Point(0, 1))); |
220 const Rectangle(0, 1, NaN, 3), | 218 Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3))); |
221 new MutableRectangle(0, 1, NaN, 3), | 219 Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3))); |
222 new Rectangle.fromPoints(new Point(0, 1), new Point(NaN, 4)), | 220 Expect.isTrue(r.top.isNaN); |
223 new MutableRectangle.fromPoints(new Point(0, 1), new Point(NaN, 4)), | 221 Expect.isTrue(r.bottom.isNaN); |
224 ]; | 222 } |
225 for (var r in rectangles) { | 223 } |
226 expect(r.containsPoint(new Point(0, 1)), false); | 224 |
227 expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false); | 225 testNaNWidth() { |
228 expect(r.intersects(new Rectangle(0, 1, 2, 3)), false); | 226 var rectangles = [ |
229 expect(r.right, isNaN); | 227 const Rectangle(0, 1, double.NAN, 3), |
230 expect(r.width, isNaN); | 228 new MutableRectangle(0, 1, double.NAN, 3), |
231 } | 229 new Rectangle.fromPoints(new Point(0, 1), new Point(double.NAN, 4)), |
232 }); | 230 new MutableRectangle.fromPoints(new Point(0, 1), new Point(double.NAN, 4)), |
233 | 231 ]; |
234 test('NaN heigth', () { | 232 for (var r in rectangles) { |
235 var rectangles = [ | 233 Expect.isFalse(r.containsPoint(new Point(0, 1))); |
236 const Rectangle(0, 1, 2, NaN), | 234 Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3))); |
237 new MutableRectangle(0, 1, 2, NaN), | 235 Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3))); |
238 new Rectangle.fromPoints(new Point(0, 1), new Point(2, NaN)), | 236 Expect.isTrue(r.right.isNaN); |
239 new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, NaN)), | 237 Expect.isTrue(r.width.isNaN); |
240 ]; | 238 } |
241 for (var r in rectangles) { | 239 } |
242 expect(r.containsPoint(new Point(0, 1)), false); | 240 |
243 expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false); | 241 testNaNHeight() { |
244 expect(r.intersects(new Rectangle(0, 1, 2, 3)), false); | 242 var rectangles = [ |
245 expect(r.bottom, isNaN); | 243 const Rectangle(0, 1, 2, double.NAN), |
246 expect(r.height, isNaN); | 244 new MutableRectangle(0, 1, 2, double.NAN), |
247 } | 245 new Rectangle.fromPoints(new Point(0, 1), new Point(2, double.NAN)), |
248 }); | 246 new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, double.NAN)), |
249 } | 247 ]; |
250 | 248 for (var r in rectangles) { |
| 249 Expect.isFalse(r.containsPoint(new Point(0, 1))); |
| 250 Expect.isFalse(r.containsRectangle(new Rectangle(0, 1, 2, 3))); |
| 251 Expect.isFalse(r.intersects(new Rectangle(0, 1, 2, 3))); |
| 252 Expect.isTrue(r.bottom.isNaN); |
| 253 Expect.isTrue(r.height.isNaN); |
| 254 } |
| 255 } |
OLD | NEW |