• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.shadows;
2 
3 import static com.google.common.truth.Truth.assertThat;
4 
5 import android.graphics.Matrix;
6 import android.graphics.PointF;
7 import android.graphics.RectF;
8 import androidx.test.ext.junit.runners.AndroidJUnit4;
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.robolectric.shadow.api.Shadow;
12 
13 @RunWith(AndroidJUnit4.class)
14 public class ShadowMatrixTest {
15   private static final float EPSILON = 1e-7f;
16 
17   @Test
preOperationsAreStacked()18   public void preOperationsAreStacked() {
19     Matrix m = new Matrix();
20     m.preRotate(4, 8, 15);
21     m.preTranslate(16, 23);
22     m.preSkew(42, 108);
23 
24     assertThat(((ShadowMatrix) Shadow.extract(m)).getPreOperations())
25         .containsExactly("skew 42.0 108.0", "translate 16.0 23.0", "rotate 4.0 8.0 15.0");
26   }
27 
28   @Test
postOperationsAreQueued()29   public void postOperationsAreQueued() {
30     Matrix m = new Matrix();
31     m.postRotate(4, 8, 15);
32     m.postTranslate(16, 23);
33     m.postSkew(42, 108);
34 
35     assertThat(((ShadowMatrix) Shadow.extract(m)).getPostOperations())
36         .containsExactly("rotate 4.0 8.0 15.0", "translate 16.0 23.0", "skew 42.0 108.0");
37   }
38 
39   @Test
setOperationsOverride()40   public void setOperationsOverride() {
41     Matrix m = new Matrix();
42     m.setRotate(4);
43     m.setRotate(8);
44     m.setRotate(15);
45     m.setRotate(16);
46     m.setRotate(23);
47     m.setRotate(42);
48     m.setRotate(108);
49 
50     assertThat(((ShadowMatrix) Shadow.extract(m)).getSetOperations())
51         .containsEntry("rotate", "108.0");
52   }
53 
54   @Test
set_shouldAddOpsToMatrix()55   public void set_shouldAddOpsToMatrix() {
56     final Matrix matrix = new Matrix();
57     matrix.setScale(1, 1);
58     matrix.preScale(2, 2, 2, 2);
59     matrix.postScale(3, 3, 3, 3);
60 
61     final ShadowMatrix shadow = Shadow.extract(matrix);
62     assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 1.0");
63     assertThat(shadow.getPreOperations().get(0)).isEqualTo("scale 2.0 2.0 2.0 2.0");
64     assertThat(shadow.getPostOperations().get(0)).isEqualTo("scale 3.0 3.0 3.0 3.0");
65   }
66 
67   @Test
setScale_shouldAddOpsToMatrix()68   public void setScale_shouldAddOpsToMatrix() {
69     final Matrix matrix = new Matrix();
70     matrix.setScale(1, 2, 3, 4);
71 
72     final ShadowMatrix shadow = Shadow.extract(matrix);
73     assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 2.0 3.0 4.0");
74   }
75 
76   @Test
set_shouldOverrideValues()77   public void set_shouldOverrideValues() {
78     final Matrix matrix1 = new Matrix();
79     matrix1.setScale(1, 2);
80 
81     final Matrix matrix2 = new Matrix();
82     matrix2.setScale(3, 4);
83     matrix2.set(matrix1);
84 
85     final ShadowMatrix shadow = Shadow.extract(matrix2);
86     assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 2.0");
87   }
88 
89   @Test
set_whenNull_shouldReset()90   public void set_whenNull_shouldReset() {
91     final Matrix matrix1 = new Matrix();
92     matrix1.setScale(1, 2);
93 
94     final Matrix matrix2 = new Matrix();
95     matrix2.set(matrix1);
96     matrix2.set(null);
97 
98     final ShadowMatrix shadow = Shadow.extract(matrix2);
99     assertThat(shadow.getSetOperations()).isEmpty();
100   }
101 
102   @Test
testIsIdentity()103   public void testIsIdentity() {
104     final Matrix matrix = new Matrix();
105     assertThat(matrix.isIdentity()).isTrue();
106 
107     matrix.postScale(2.0f, 2.0f);
108     assertThat(matrix.isIdentity()).isFalse();
109   }
110 
111   @Test
testIsAffine()112   public void testIsAffine() {
113     final Matrix matrix = new Matrix();
114     assertThat(matrix.isAffine()).isTrue();
115 
116     matrix.postScale(2.0f, 2.0f);
117     assertThat(matrix.isAffine()).isTrue();
118     matrix.postTranslate(1.0f, 2.0f);
119     assertThat(matrix.isAffine()).isTrue();
120     matrix.postRotate(45.0f);
121     assertThat(matrix.isAffine()).isTrue();
122 
123     matrix.setValues(new float[] {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 2.0f});
124     assertThat(matrix.isAffine()).isFalse();
125   }
126 
127   @Test
testRectStaysRect()128   public void testRectStaysRect() {
129     final Matrix matrix = new Matrix();
130     assertThat(matrix.rectStaysRect()).isTrue();
131 
132     matrix.postScale(2.0f, 2.0f);
133     assertThat(matrix.rectStaysRect()).isTrue();
134     matrix.postTranslate(1.0f, 2.0f);
135     assertThat(matrix.rectStaysRect()).isTrue();
136     matrix.postRotate(45.0f);
137     assertThat(matrix.rectStaysRect()).isFalse();
138     matrix.postRotate(45.0f);
139     assertThat(matrix.rectStaysRect()).isTrue();
140   }
141 
142   @Test
testGetSetValues()143   public void testGetSetValues() {
144     final Matrix matrix = new Matrix();
145     final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f};
146     matrix.setValues(values);
147     final float[] matrixValues = new float[9];
148     matrix.getValues(matrixValues);
149     assertThat(matrixValues).isEqualTo(values);
150   }
151 
152   @Test
testGetSetValues_withLargeArray()153   public void testGetSetValues_withLargeArray() {
154     final Matrix matrix = new Matrix();
155     final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};
156     matrix.setValues(values);
157     final float[] matrixValues = new float[10];
158     matrix.getValues(matrixValues);
159     // First 9 elements should match.
160     for (int i = 0; i < 9; i++) {
161       assertThat(matrixValues[i]).isEqualTo(values[i]);
162     }
163     // The last element should not have been set.
164     assertThat(matrixValues[9]).isEqualTo(0);
165   }
166 
167   @Test(expected = ArrayIndexOutOfBoundsException.class)
testGetValues_withSmallArray()168   public void testGetValues_withSmallArray() {
169     final Matrix matrix = new Matrix();
170     final float[] matrixValues = new float[8];
171     matrix.getValues(matrixValues);
172   }
173 
174   @Test(expected = ArrayIndexOutOfBoundsException.class)
testSetValues_withSmallArray()175   public void testSetValues_withSmallArray() {
176     final Matrix matrix = new Matrix();
177     final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f};
178     matrix.setValues(values);
179   }
180 
181   @Test
testSet()182   public void testSet() {
183     final Matrix matrix1 = new Matrix();
184     matrix1.postScale(2.0f, 2.0f);
185     matrix1.postTranslate(1.0f, 2.0f);
186     matrix1.postRotate(45.0f);
187 
188     final Matrix matrix2 = new Matrix();
189     matrix2.set(matrix1);
190     assertThat(matrix1).isEqualTo(matrix2);
191 
192     matrix2.set(null);
193     assertThat(matrix2.isIdentity()).isTrue();
194   }
195 
196   @Test
testReset()197   public void testReset() {
198     final Matrix matrix = new Matrix();
199     matrix.postScale(2.0f, 2.0f);
200     matrix.postTranslate(1.0f, 2.0f);
201     matrix.postRotate(45.0f);
202     matrix.reset();
203     assertThat(matrix.isIdentity()).isTrue();
204   }
205 
206   @Test
testSetTranslate()207   public void testSetTranslate() {
208     final Matrix matrix = new Matrix();
209     matrix.setTranslate(2.0f, 2.0f);
210     assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(3.0f, 3.0f));
211     matrix.setTranslate(-2.0f, -2.0f);
212     assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(-1.0f, -1.0f));
213   }
214 
215   @Test
testPostTranslate()216   public void testPostTranslate() {
217     final Matrix matrix1 = new Matrix();
218     matrix1.postTranslate(1.0f, 1.0f);
219     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f));
220 
221     matrix1.postTranslate(2.0f, 2.0f);
222     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f));
223 
224     final Matrix matrix2 = new Matrix();
225     matrix2.setScale(2.0f, 2.0f);
226     matrix2.postTranslate(-5.0f, 10.0f);
227     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(-3.0f, 12.0f));
228   }
229 
230   @Test
testPreTranslate()231   public void testPreTranslate() {
232     final Matrix matrix1 = new Matrix();
233     matrix1.preTranslate(1.0f, 1.0f);
234     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f));
235 
236     matrix1.preTranslate(2.0f, 2.0f);
237     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f));
238 
239     final Matrix matrix2 = new Matrix();
240     matrix2.setScale(2.0f, 2.0f);
241     matrix2.preTranslate(-5.0f, 10.0f);
242     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(-8.0f, 22.0f));
243   }
244 
245   @Test
testSetScale()246   public void testSetScale() {
247     final Matrix matrix = new Matrix();
248     matrix.setScale(2.0f, 2.0f);
249     assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(2.0f, 2.0f));
250     matrix.setScale(-2.0f, -3.0f);
251     assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-4.0f, -9.0f));
252     matrix.setScale(-2.0f, -3.0f, 1.0f, 1.0f);
253     assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-1.0f, -5.0f));
254   }
255 
256   @Test
testPostScale()257   public void testPostScale() {
258     final Matrix matrix1 = new Matrix();
259     matrix1.postScale(2.0f, 2.0f);
260     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f));
261 
262     matrix1.postScale(2.0f, 2.0f);
263     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f));
264 
265     final Matrix matrix2 = new Matrix();
266     matrix2.postScale(2.0f, 2.0f, 1.0f, 1.0f);
267     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f));
268 
269     matrix2.setTranslate(1.0f, 2.0f);
270     matrix2.postScale(2.0f, 2.0f, 1.0f, 1.0f);
271     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(3.0f, 5.0f));
272   }
273 
274   @Test
testPreScale()275   public void testPreScale() {
276     final Matrix matrix1 = new Matrix();
277     matrix1.preScale(2.0f, 2.0f);
278     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f));
279 
280     matrix1.preScale(2.0f, 2.0f);
281     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f));
282 
283     final Matrix matrix2 = new Matrix();
284     matrix2.preScale(2.0f, 2.0f, 1.0f, 1.0f);
285     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f));
286 
287     matrix2.setTranslate(1.0f, 2.0f);
288     matrix2.preScale(2.0f, 2.0f, 1.0f, 1.0f);
289     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(2.0f, 3.0f));
290   }
291 
292   @Test
testSetRotate()293   public void testSetRotate() {
294     final Matrix matrix = new Matrix();
295     matrix.setRotate(90.0f);
296     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f));
297     matrix.setRotate(180.0f);
298     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f));
299     matrix.setRotate(270.0f);
300     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f));
301     matrix.setRotate(360.0f);
302     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
303 
304     matrix.setRotate(45.0f, 0.0f, 1.0f);
305     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
306   }
307 
308   @Test
testPostRotate()309   public void testPostRotate() {
310     final Matrix matrix = new Matrix();
311     matrix.postRotate(90.0f);
312     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f));
313     matrix.postRotate(90.0f);
314     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f));
315     matrix.postRotate(90.0f);
316     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f));
317     matrix.postRotate(90.0f);
318     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
319 
320     matrix.setTranslate(1.0f, 2.0f);
321     matrix.postRotate(45.0f, 0.0f, 1.0f);
322     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-0.70710677f, 3.1213202f));
323   }
324 
325   @Test
testPreRotate()326   public void testPreRotate() {
327     final Matrix matrix = new Matrix();
328     matrix.preRotate(90.0f);
329     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f));
330     matrix.preRotate(90.0f);
331     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f));
332     matrix.preRotate(90.0f);
333     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f));
334     matrix.preRotate(90.0f);
335     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
336 
337     matrix.setTranslate(1.0f, 2.0f);
338     matrix.preRotate(45.0f, 0.0f, 1.0f);
339     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 3.0f));
340   }
341 
342   @Test
testSetSinCos()343   public void testSetSinCos() {
344     final Matrix matrix = new Matrix();
345     matrix.setSinCos(1.0f, 0.0f);
346     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f));
347     matrix.setSinCos(0.0f, -1.0f);
348     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f));
349     matrix.setSinCos(-1.0f, 0.0f);
350     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f));
351     matrix.setSinCos(0.0f, 1.0f);
352     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
353 
354     final float sinCos = (float) Math.sqrt(2) / 2;
355     matrix.setSinCos(sinCos, sinCos, 0.0f, 1.0f);
356     assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f));
357   }
358 
359   @Test
testSetSkew()360   public void testSetSkew() {
361     final Matrix matrix = new Matrix();
362     matrix.setSkew(2.0f, 2.0f);
363     assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(3.0f, 3.0f));
364     matrix.setSkew(-2.0f, -3.0f);
365     assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-4.0f, -3.0f));
366     matrix.setSkew(-2.0f, -3.0f, 1.0f, 1.0f);
367     assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-2.0f, 0.0f));
368   }
369 
370   @Test
testPostSkew()371   public void testPostSkew() {
372     final Matrix matrix1 = new Matrix();
373     matrix1.postSkew(2.0f, 2.0f);
374     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(3.0f, 3.0f));
375 
376     matrix1.postSkew(2.0f, 2.0f);
377     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(9.0f, 9.0f));
378 
379     final Matrix matrix2 = new Matrix();
380     matrix2.postSkew(2.0f, 2.0f, 1.0f, 1.0f);
381     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f));
382 
383     matrix2.setTranslate(1.0f, 2.0f);
384     matrix2.postSkew(2.0f, 2.0f, 1.0f, 1.0f);
385     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(6.0f, 5.0f));
386   }
387 
388   @Test
testPreSkew()389   public void testPreSkew() {
390     final Matrix matrix1 = new Matrix();
391     matrix1.preSkew(2.0f, 2.0f);
392     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(3.0f, 3.0f));
393 
394     matrix1.preSkew(2.0f, 2.0f);
395     assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(9.0f, 9.0f));
396 
397     final Matrix matrix2 = new Matrix();
398     matrix2.preSkew(2.0f, 2.0f, 1.0f, 1.0f);
399     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f));
400 
401     matrix2.setTranslate(1.0f, 2.0f);
402     matrix2.preSkew(2.0f, 2.0f, 1.0f, 1.0f);
403     assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(2.0f, 3.0f));
404   }
405 
406   @Test
testSetConcat()407   public void testSetConcat() {
408     final Matrix scaleMatrix = new Matrix();
409     scaleMatrix.setScale(2.0f, 3.0f);
410     final Matrix translateMatrix = new Matrix();
411     translateMatrix.postTranslate(5.0f, 7.0f);
412     final Matrix matrix = new Matrix();
413     matrix.setConcat(translateMatrix, scaleMatrix);
414     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(9.0f, 13.0f));
415 
416     final Matrix rotateMatrix = new Matrix();
417     rotateMatrix.postRotate(90.0f);
418     matrix.setConcat(rotateMatrix, matrix);
419     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(-13.0f, 9.0f));
420   }
421 
422   @Test
testPostConcat()423   public void testPostConcat() {
424     final Matrix matrix = new Matrix();
425     matrix.postScale(2.0f, 3.0f);
426     final Matrix translateMatrix = new Matrix();
427     translateMatrix.postTranslate(5.0f, 7.0f);
428     matrix.postConcat(translateMatrix);
429     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(9.0f, 13.0f));
430 
431     final Matrix rotateMatrix = new Matrix();
432     rotateMatrix.postRotate(90.0f);
433     matrix.postConcat(rotateMatrix);
434     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(-13.0f, 9.0f));
435   }
436 
437   @Test
testPreConcat()438   public void testPreConcat() {
439     final Matrix matrix = new Matrix();
440     matrix.preScale(2.0f, 3.0f);
441     final Matrix translateMatrix = new Matrix();
442     translateMatrix.setTranslate(5.0f, 7.0f);
443     matrix.preConcat(translateMatrix);
444     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(14.0f, 27.0f));
445 
446     final Matrix rotateMatrix = new Matrix();
447     rotateMatrix.setRotate(90.0f);
448     matrix.preConcat(rotateMatrix);
449     assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(6.0f, 27.0f));
450   }
451 
452   @Test
testInvert()453   public void testInvert() {
454     final Matrix matrix = new Matrix();
455     final Matrix inverse = new Matrix();
456     matrix.setScale(0.0f, 1.0f);
457     assertThat(matrix.invert(inverse)).isFalse();
458     matrix.setScale(1.0f, 0.0f);
459     assertThat(matrix.invert(inverse)).isFalse();
460 
461     matrix.setScale(1.0f, 1.0f);
462     checkInverse(matrix);
463     matrix.setScale(-3.0f, 5.0f);
464     checkInverse(matrix);
465     matrix.setTranslate(5.0f, 2.0f);
466     checkInverse(matrix);
467     matrix.setScale(-3.0f, 5.0f);
468     matrix.postTranslate(5.0f, 2.0f);
469     checkInverse(matrix);
470     matrix.setScale(-3.0f, 5.0f);
471     matrix.postRotate(-30f, 1.0f, 2.0f);
472     matrix.postTranslate(5.0f, 2.0f);
473     checkInverse(matrix);
474   }
475 
476   @Test
testMapRect()477   public void testMapRect() {
478     final Matrix matrix = new Matrix();
479     matrix.postScale(2.0f, 3.0f);
480     final RectF input = new RectF(1.0f, 1.0f, 2.0f, 2.0f);
481     final RectF output1 = new RectF();
482     matrix.mapRect(output1, input);
483     assertThat(output1).isEqualTo(new RectF(2.0f, 3.0f, 4.0f, 6.0f));
484 
485     matrix.postScale(-1.0f, -1.0f);
486     final RectF output2 = new RectF();
487     matrix.mapRect(output2, input);
488     assertThat(output2).isEqualTo(new RectF(-4.0f, -6.0f, -2.0f, -3.0f));
489   }
490 
491   @Test
testMapPoints()492   public void testMapPoints() {
493     final Matrix matrix = new Matrix();
494     matrix.postTranslate(-1.0f, -2.0f);
495     matrix.postScale(2.0f, 3.0f);
496     final float[] input = {
497       0.0f, 0.0f,
498       1.0f, 2.0f
499     };
500     final float[] output = new float[input.length];
501     matrix.mapPoints(output, input);
502     assertThat(output).usingExactEquality().containsExactly(-2.0f, -6.0f, 0.0f, 0.0f);
503   }
504 
505   @Test
testMapVectors()506   public void testMapVectors() {
507     final Matrix matrix = new Matrix();
508     matrix.postTranslate(-1.0f, -2.0f);
509     matrix.postScale(2.0f, 3.0f);
510     final float[] input = {
511       0.0f, 0.0f,
512       1.0f, 2.0f
513     };
514     final float[] output = new float[input.length];
515     matrix.mapVectors(output, input);
516     assertThat(output).usingExactEquality().containsExactly(0.0f, 0.0f, 2.0f, 6.0f);
517   }
518 
mapPoint(Matrix matrix, float x, float y)519   private static PointF mapPoint(Matrix matrix, float x, float y) {
520     float[] pf = new float[] {x, y};
521     matrix.mapPoints(pf);
522     return new PointF(pf[0], pf[1]);
523   }
524 
assertPointsEqual(PointF actual, PointF expected)525   private static void assertPointsEqual(PointF actual, PointF expected) {
526     assertThat(actual.x).isWithin(EPSILON).of(expected.x);
527     assertThat(actual.y).isWithin(EPSILON).of(expected.y);
528   }
529 
checkInverse(Matrix matrix)530   private static void checkInverse(Matrix matrix) {
531     final Matrix inverse = new Matrix();
532     assertThat(matrix.invert(inverse)).isTrue();
533     matrix.postConcat(inverse);
534     assertThat(matrix.isIdentity()).isTrue();
535   }
536 }
537