1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.euclidean.oned;
18
19 import java.util.function.UnaryOperator;
20
21 import org.apache.commons.geometry.core.GeometryTestUtils;
22 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
23 import org.apache.commons.numbers.angle.PlaneAngleRadians;
24 import org.junit.Assert;
25 import org.junit.Test;
26
27 public class AffineTransformMatrix1DTest {
28
29 private static final double EPS = 1e-12;
30
31 @Test
32 public void testOf() {
33
34 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.of(1, 2);
35
36
37 Assert.assertTrue(transform.preservesOrientation());
38
39 final double[] result = transform.toArray();
40 Assert.assertArrayEquals(new double[] {1, 2}, result, 0.0);
41 }
42
43 @Test
44 public void testOf_invalidDimensions() {
45
46 GeometryTestUtils.assertThrows(() -> AffineTransformMatrix1D.of(1),
47 IllegalArgumentException.class, "Dimension mismatch: 1 != 2");
48 }
49
50 @Test
51 public void testFrom() {
52
53 Assert.assertArrayEquals(new double[] {1, 0},
54 AffineTransformMatrix1D.from(UnaryOperator.identity()).toArray(), EPS);
55 Assert.assertArrayEquals(new double[] {1, 2},
56 AffineTransformMatrix1D.from(v -> v.add(Vector1D.of(2))).toArray(), EPS);
57 Assert.assertArrayEquals(new double[] {3, 0},
58 AffineTransformMatrix1D.from(v -> v.multiply(3)).toArray(), EPS);
59 Assert.assertArrayEquals(new double[] {3, 6},
60 AffineTransformMatrix1D.from(v -> v.add(Vector1D.of(2)).multiply(3)).toArray(), EPS);
61 }
62
63 @Test
64 public void testFrom_invalidFunction() {
65
66 GeometryTestUtils.assertThrows(() -> {
67 AffineTransformMatrix1D.from(v -> v.multiply(0));
68 }, IllegalArgumentException.class);
69 }
70
71 @Test
72 public void testIdentity() {
73
74 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity();
75
76
77 Assert.assertTrue(transform.preservesOrientation());
78
79 final double[] expected = {1, 0};
80 Assert.assertArrayEquals(expected, transform.toArray(), 0.0);
81 }
82
83 @Test
84 public void testCreateTranslation_value() {
85
86 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createTranslation(2);
87
88
89 Assert.assertTrue(transform.preservesOrientation());
90
91 final double[] expected = {1, 2};
92 Assert.assertArrayEquals(expected, transform.toArray(), 0.0);
93 }
94
95 @Test
96 public void testCreateTranslation_vector() {
97
98 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createTranslation(Vector1D.of(5));
99
100
101 Assert.assertTrue(transform.preservesOrientation());
102
103 final double[] expected = {1, 5};
104 Assert.assertArrayEquals(expected, transform.toArray(), 0.0);
105 }
106
107 @Test
108 public void testTranslate_value() {
109
110 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 10);
111
112
113 final AffineTransformMatrix1D result = a.translate(4);
114
115
116 Assert.assertTrue(result.preservesOrientation());
117
118 final double[] expected = {2, 14};
119 Assert.assertArrayEquals(expected, result.toArray(), 0.0);
120 }
121
122 @Test
123 public void testTranslate_vector() {
124
125 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 10);
126
127
128 final AffineTransformMatrix1D result = a.translate(Vector1D.of(7));
129
130
131 Assert.assertTrue(result.preservesOrientation());
132
133 final double[] expected = {2, 17};
134 Assert.assertArrayEquals(expected, result.toArray(), 0.0);
135 }
136
137 @Test
138 public void testCreateScale_vector() {
139
140 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createScale(Vector1D.of(4));
141
142
143 Assert.assertTrue(transform.preservesOrientation());
144
145 final double[] expected = {4, 0};
146 Assert.assertArrayEquals(expected, transform.toArray(), 0.0);
147 }
148
149 @Test
150 public void testCreateScale_value() {
151
152 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createScale(7);
153
154
155 Assert.assertTrue(transform.preservesOrientation());
156
157 final double[] expected = {7, 0};
158 Assert.assertArrayEquals(expected, transform.toArray(), 0.0);
159 }
160
161 @Test
162 public void testScale_value() {
163
164 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 10);
165
166
167 final AffineTransformMatrix1D result = a.scale(4);
168
169
170 Assert.assertTrue(result.preservesOrientation());
171
172 final double[] expected = {8, 40};
173 Assert.assertArrayEquals(expected, result.toArray(), 0.0);
174 }
175
176 @Test
177 public void testScale_vector() {
178
179 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 10);
180
181
182 final AffineTransformMatrix1D result = a.scale(Vector1D.of(7));
183
184
185 Assert.assertTrue(result.preservesOrientation());
186
187 final double[] expected = {14, 70};
188 Assert.assertArrayEquals(expected, result.toArray(), 0.0);
189 }
190
191 @Test
192 public void testApply_identity() {
193
194 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity();
195
196
197 runWithCoordinates(x -> {
198 final Vector1D v = Vector1D.of(x);
199
200 EuclideanTestUtils.assertCoordinatesEqual(v, transform.apply(v), EPS);
201 });
202 }
203
204 @Test
205 public void testApply_translate() {
206
207 final Vector1D translation = Vector1D.of(-PlaneAngleRadians.PI);
208
209 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
210 .translate(translation);
211
212
213 runWithCoordinates(x -> {
214 final Vector1D vec = Vector1D.of(x);
215
216 final Vector1D expectedVec = vec.add(translation);
217
218 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
219 });
220 }
221
222 @Test
223 public void testApply_scale() {
224
225 final Vector1D factor = Vector1D.of(2.0);
226
227 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
228 .scale(factor);
229
230
231 runWithCoordinates(x -> {
232 final Vector1D vec = Vector1D.of(x);
233
234 final Vector1D expectedVec = Vector1D.of(factor.getX() * x);
235
236 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
237 });
238 }
239
240 @Test
241 public void testApply_translateThenScale() {
242
243 final Vector1D translation = Vector1D.of(-2.0);
244 final Vector1D scale = Vector1D.of(5.0);
245
246 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
247 .translate(translation)
248 .scale(scale);
249
250
251 EuclideanTestUtils.assertCoordinatesEqual(Vector1D.of(-5), transform.apply(Vector1D.of(1)), EPS);
252
253 runWithCoordinates(x -> {
254 final Vector1D vec = Vector1D.of(x);
255
256 final Vector1D expectedVec = Vector1D.of(
257 (x + translation.getX()) * scale.getX()
258 );
259
260 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
261 });
262 }
263
264 @Test
265 public void testApply_scaleThenTranslate() {
266
267 final Vector1D scale = Vector1D.of(5.0);
268 final Vector1D translation = Vector1D.of(-2.0);
269
270 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
271 .scale(scale)
272 .translate(translation);
273
274
275 runWithCoordinates(x -> {
276 final Vector1D vec = Vector1D.of(x);
277
278 final Vector1D expectedVec = Vector1D.of(
279 (x * scale.getX()) + translation.getX()
280 );
281
282 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
283 });
284 }
285
286 @Test
287 public void testApplyVector_identity() {
288
289 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity();
290
291
292 runWithCoordinates(x -> {
293 final Vector1D v = Vector1D.of(x);
294
295 EuclideanTestUtils.assertCoordinatesEqual(v, transform.applyVector(v), EPS);
296 });
297 }
298
299 @Test
300 public void testApplyVector_translate() {
301
302 final Vector1D translation = Vector1D.of(-PlaneAngleRadians.PI);
303
304 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
305 .translate(translation);
306
307
308 runWithCoordinates(x -> {
309 final Vector1D vec = Vector1D.of(x);
310
311 EuclideanTestUtils.assertCoordinatesEqual(vec, transform.applyVector(vec), EPS);
312 });
313 }
314
315 @Test
316 public void testApplyVector_scale() {
317
318 final Vector1D factor = Vector1D.of(2.0);
319
320 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
321 .scale(factor);
322
323
324 runWithCoordinates(x -> {
325 final Vector1D vec = Vector1D.of(x);
326
327 final Vector1D expectedVec = Vector1D.of(factor.getX() * x);
328
329 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.applyVector(vec), EPS);
330 });
331 }
332
333 @Test
334 public void testApplyVector_representsDisplacement() {
335
336 final Vector1D p1 = Vector1D.of(PlaneAngleRadians.PI);
337
338 final Vector1D translation = Vector1D.of(-2.0);
339 final Vector1D scale = Vector1D.of(5.0);
340
341 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
342 .translate(translation)
343 .scale(scale);
344
345
346 runWithCoordinates(x -> {
347 final Vector1D p2 = Vector1D.of(x);
348 final Vector1D input = p1.subtract(p2);
349
350 final Vector1D expectedVec = transform.apply(p1).subtract(transform.apply(p2));
351
352 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.applyVector(input), EPS);
353 });
354 }
355
356 @Test
357 public void testApplyDirection_identity() {
358
359 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity();
360
361
362 runWithCoordinates(x -> {
363 final Vector1D v = Vector1D.of(x);
364
365 EuclideanTestUtils.assertCoordinatesEqual(v.normalize(), transform.applyDirection(v), EPS);
366 }, true);
367 }
368
369 @Test
370 public void testApplyDirection_translate() {
371
372 final Vector1D translation = Vector1D.of(-PlaneAngleRadians.PI);
373
374 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
375 .translate(translation);
376
377
378 runWithCoordinates(x -> {
379 final Vector1D vec = Vector1D.of(x);
380
381 EuclideanTestUtils.assertCoordinatesEqual(vec.normalize(), transform.applyDirection(vec), EPS);
382 }, true);
383 }
384
385 @Test
386 public void testApplyDirection_scale() {
387
388 final Vector1D factor = Vector1D.of(2.0);
389
390 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
391 .scale(factor);
392
393
394 runWithCoordinates(x -> {
395 final Vector1D vec = Vector1D.of(x);
396
397 final Vector1D expectedVec = Vector1D.of(factor.getX() * x).normalize();
398
399 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.applyDirection(vec), EPS);
400 }, true);
401 }
402
403 @Test
404 public void testApplyDirection_representsNormalizedDisplacement() {
405
406 final Vector1D p1 = Vector1D.of(PlaneAngleRadians.PI);
407
408 final Vector1D translation = Vector1D.of(-2.0);
409 final Vector1D scale = Vector1D.of(5.0);
410
411 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.identity()
412 .translate(translation)
413 .scale(scale);
414
415
416 runWithCoordinates(x -> {
417 final Vector1D p2 = Vector1D.of(x);
418 final Vector1D input = p1.subtract(p2);
419
420 final Vector1D expectedVec = transform.apply(p1).subtract(transform.apply(p2)).normalize();
421
422 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.applyDirection(input), EPS);
423 });
424 }
425
426 @Test
427 public void testApplyDirection_illegalNorm() {
428
429 GeometryTestUtils.assertThrows(() -> AffineTransformMatrix1D.createScale(0).applyDirection(Vector1D.Unit.PLUS),
430 IllegalArgumentException.class);
431 GeometryTestUtils.assertThrows(() -> AffineTransformMatrix1D.createScale(2).applyDirection(Vector1D.ZERO),
432 IllegalArgumentException.class);
433 }
434
435 @Test
436 public void testDeterminant() {
437
438 Assert.assertEquals(0.0, AffineTransformMatrix1D.of(0, 1).determinant(), EPS);
439 Assert.assertEquals(1.0, AffineTransformMatrix1D.of(1, 0).determinant(), EPS);
440 Assert.assertEquals(-1.0, AffineTransformMatrix1D.of(-1, 2).determinant(), EPS);
441 }
442
443 @Test
444 public void testPreservesOrientation() {
445
446 Assert.assertFalse(AffineTransformMatrix1D.of(0, 1).preservesOrientation());
447 Assert.assertTrue(AffineTransformMatrix1D.of(1, 0).preservesOrientation());
448 Assert.assertFalse(AffineTransformMatrix1D.of(-1, 2).preservesOrientation());
449 }
450
451 @Test
452 public void testMultiply() {
453
454 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 3);
455 final AffineTransformMatrix1D b = AffineTransformMatrix1D.of(13, 14);
456
457
458 final AffineTransformMatrix1D result = a.multiply(b);
459
460
461 final double[] arr = result.toArray();
462 Assert.assertArrayEquals(new double[] {26, 31}, arr, EPS);
463 }
464
465 @Test
466 public void testMultiply_combinesTransformOperations() {
467
468 final Vector1D translation1 = Vector1D.of(1);
469 final double scale = 2.0;
470 final Vector1D translation2 = Vector1D.of(4);
471
472 final AffineTransformMatrix1D a = AffineTransformMatrix1D.createTranslation(translation1);
473 final AffineTransformMatrix1D b = AffineTransformMatrix1D.createScale(scale);
474 final AffineTransformMatrix1D c = AffineTransformMatrix1D.identity();
475 final AffineTransformMatrix1D d = AffineTransformMatrix1D.createTranslation(translation2);
476
477
478 final AffineTransformMatrix1D transform = d.multiply(c).multiply(b).multiply(a);
479
480
481 runWithCoordinates(x -> {
482 final Vector1D vec = Vector1D.of(x);
483
484 final Vector1D expectedVec = vec
485 .add(translation1)
486 .multiply(scale)
487 .add(translation2);
488
489 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
490 });
491 }
492
493 @Test
494 public void testPremultiply() {
495
496 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(2, 3);
497 final AffineTransformMatrix1D b = AffineTransformMatrix1D.of(13, 14);
498
499
500 final AffineTransformMatrix1D result = b.premultiply(a);
501
502
503 final double[] arr = result.toArray();
504 Assert.assertArrayEquals(new double[] {26, 31}, arr, EPS);
505 }
506
507 @Test
508 public void testPremultiply_combinesTransformOperations() {
509
510 final Vector1D translation1 = Vector1D.of(1);
511 final double scale = 2.0;
512 final Vector1D translation2 = Vector1D.of(4);
513
514 final AffineTransformMatrix1D a = AffineTransformMatrix1D.createTranslation(translation1);
515 final AffineTransformMatrix1D b = AffineTransformMatrix1D.createScale(scale);
516 final AffineTransformMatrix1D c = AffineTransformMatrix1D.identity();
517 final AffineTransformMatrix1D d = AffineTransformMatrix1D.createTranslation(translation2);
518
519
520 final AffineTransformMatrix1D transform = a.premultiply(b).premultiply(c).premultiply(d);
521
522
523 runWithCoordinates(x -> {
524 final Vector1D vec = Vector1D.of(x);
525
526 final Vector1D expectedVec = vec
527 .add(translation1)
528 .multiply(scale)
529 .add(translation2);
530
531 EuclideanTestUtils.assertCoordinatesEqual(expectedVec, transform.apply(vec), EPS);
532 });
533 }
534
535 @Test
536 public void testLinear() {
537
538 final AffineTransformMatrix1D mat = AffineTransformMatrix1D.of(2, 3);
539
540
541 final AffineTransformMatrix1D result = mat.linear();
542
543
544 Assert.assertArrayEquals(new double[] {2, 0}, result.toArray(), 0.0);
545 }
546
547 @Test
548 public void testLinearTranspose() {
549
550 final AffineTransformMatrix1D mat = AffineTransformMatrix1D.of(2, 3);
551
552
553 final AffineTransformMatrix1D result = mat.linearTranspose();
554
555
556 Assert.assertArrayEquals(new double[] {2, 0}, result.toArray(), 0.0);
557 }
558
559 @Test
560 public void testNormalTransform() {
561
562 checkNormalTransform(AffineTransformMatrix1D.identity());
563
564 checkNormalTransform(AffineTransformMatrix1D.createTranslation(4));
565 checkNormalTransform(AffineTransformMatrix1D.createTranslation(-4));
566
567 checkNormalTransform(AffineTransformMatrix1D.createScale(2));
568 checkNormalTransform(AffineTransformMatrix1D.createScale(-2));
569
570 checkNormalTransform(AffineTransformMatrix1D.createScale(2).translate(3));
571 checkNormalTransform(AffineTransformMatrix1D.createScale(2).translate(-3));
572 checkNormalTransform(AffineTransformMatrix1D.createTranslation(2).scale(-3));
573 checkNormalTransform(AffineTransformMatrix1D.createTranslation(-4).scale(-1));
574 }
575
576 private void checkNormalTransform(final AffineTransformMatrix1D transform) {
577 final AffineTransformMatrix1D normalTransform = transform.normalTransform();
578
579 final Vector1D expectedPlus = transform.apply(Vector1D.Unit.PLUS)
580 .subtract(transform.apply(Vector1D.ZERO))
581 .normalize();
582
583 final Vector1D expectedMinus = transform.apply(Vector1D.Unit.MINUS)
584 .subtract(transform.apply(Vector1D.ZERO))
585 .normalize();
586
587 EuclideanTestUtils.assertCoordinatesEqual(expectedPlus,
588 normalTransform.apply(Vector1D.Unit.PLUS).normalize(), EPS);
589 EuclideanTestUtils.assertCoordinatesEqual(expectedMinus,
590 normalTransform.apply(Vector1D.Unit.MINUS).normalize(), EPS);
591 }
592
593 @Test
594 public void testNormalTransform_nonInvertible() {
595
596 GeometryTestUtils.assertThrows(() -> {
597 AffineTransformMatrix1D.createScale(0).normalTransform();
598 }, IllegalStateException.class);
599 }
600
601 @Test
602 public void testInverse_identity() {
603
604 final AffineTransformMatrix1D inverse = AffineTransformMatrix1D.identity().inverse();
605
606
607 final double[] expected = {1, 0};
608 Assert.assertArrayEquals(expected, inverse.toArray(), 0.0);
609 }
610
611 @Test
612 public void testInverse_multiplyByInverse_producesIdentity() {
613
614 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(1, 3);
615
616 final AffineTransformMatrix1D inv = a.inverse();
617
618
619 final AffineTransformMatrix1D result = inv.multiply(a);
620
621
622 final double[] expected = {1, 0};
623 Assert.assertArrayEquals(expected, result.toArray(), EPS);
624 }
625
626 @Test
627 public void testInverse_translate() {
628
629 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createTranslation(3);
630
631
632 final AffineTransformMatrix1D inverse = transform.inverse();
633
634
635 final double[] expected = {1, -3};
636 Assert.assertArrayEquals(expected, inverse.toArray(), 0.0);
637 }
638
639 @Test
640 public void testInverse_scale() {
641
642 final AffineTransformMatrix1D transform = AffineTransformMatrix1D.createScale(10);
643
644
645 final AffineTransformMatrix1D inverse = transform.inverse();
646
647
648 final double[] expected = {0.1, 0};
649 Assert.assertArrayEquals(expected, inverse.toArray(), 0.0);
650 }
651
652 @Test
653 public void testInverse_undoesOriginalTransform_translationAndScale() {
654
655 final Vector1D v1 = Vector1D.ZERO;
656 final Vector1D v2 = Vector1D.Unit.PLUS;
657 final Vector1D v3 = Vector1D.of(1.5);
658 final Vector1D v4 = Vector1D.of(-2);
659
660
661 runWithCoordinates(x -> {
662 final AffineTransformMatrix1D transform = AffineTransformMatrix1D
663 .createTranslation(x)
664 .scale(2)
665 .translate(x / 3);
666
667 final AffineTransformMatrix1D inverse = transform.inverse();
668
669 EuclideanTestUtils.assertCoordinatesEqual(v1, inverse.apply(transform.apply(v1)), EPS);
670 EuclideanTestUtils.assertCoordinatesEqual(v2, inverse.apply(transform.apply(v2)), EPS);
671 EuclideanTestUtils.assertCoordinatesEqual(v3, inverse.apply(transform.apply(v3)), EPS);
672 EuclideanTestUtils.assertCoordinatesEqual(v4, inverse.apply(transform.apply(v4)), EPS);
673 });
674 }
675
676 @Test
677 public void testInverse_nonInvertible() {
678
679 GeometryTestUtils.assertThrows(() -> {
680 AffineTransformMatrix1D.of(0, 0).inverse();
681 }, IllegalStateException.class, "Matrix is not invertible; matrix determinant is 0.0");
682
683 GeometryTestUtils.assertThrows(() -> {
684 AffineTransformMatrix1D.of(Double.NaN, 0).inverse();
685 }, IllegalStateException.class, "Matrix is not invertible; matrix determinant is NaN");
686
687 GeometryTestUtils.assertThrows(() -> {
688 AffineTransformMatrix1D.of(Double.NEGATIVE_INFINITY, 0.0).inverse();
689 }, IllegalStateException.class, "Matrix is not invertible; matrix determinant is -Infinity");
690
691 GeometryTestUtils.assertThrows(() -> {
692 AffineTransformMatrix1D.of(Double.POSITIVE_INFINITY, 0).inverse();
693 }, IllegalStateException.class, "Matrix is not invertible; matrix determinant is Infinity");
694
695 GeometryTestUtils.assertThrows(() -> {
696 AffineTransformMatrix1D.of(1, Double.NaN).inverse();
697 }, IllegalStateException.class, "Matrix is not invertible; invalid matrix element: NaN");
698
699 GeometryTestUtils.assertThrows(() -> {
700 AffineTransformMatrix1D.of(1, Double.NEGATIVE_INFINITY).inverse();
701 }, IllegalStateException.class, "Matrix is not invertible; invalid matrix element: -Infinity");
702
703 GeometryTestUtils.assertThrows(() -> {
704 AffineTransformMatrix1D.of(1, Double.POSITIVE_INFINITY).inverse();
705 }, IllegalStateException.class, "Matrix is not invertible; invalid matrix element: Infinity");
706 }
707
708 @Test
709 public void testHashCode() {
710
711 final int orig = AffineTransformMatrix1D.of(1, 2).hashCode();
712 final int same = AffineTransformMatrix1D.of(1, 2).hashCode();
713
714
715 Assert.assertEquals(orig, same);
716
717 Assert.assertNotEquals(orig, AffineTransformMatrix1D.of(0, 2).hashCode());
718 Assert.assertNotEquals(orig, AffineTransformMatrix1D.of(1, 0).hashCode());
719 }
720
721 @Test
722 public void testEquals() {
723
724 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(1, 2);
725
726
727 Assert.assertEquals(a, a);
728
729 Assert.assertFalse(a.equals(null));
730 Assert.assertFalse(a.equals(new Object()));
731
732 Assert.assertNotEquals(a, AffineTransformMatrix1D.of(0, 2));
733 Assert.assertNotEquals(a, AffineTransformMatrix1D.of(1, 0));
734 }
735
736 @Test
737 public void testEqualsAndHashCode_signedZeroConsistency() {
738
739 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(0.0, -0.0);
740 final AffineTransformMatrix1D b = AffineTransformMatrix1D.of(-0.0, 0.0);
741 final AffineTransformMatrix1D c = AffineTransformMatrix1D.of(0.0, -0.0);
742 final AffineTransformMatrix1D d = AffineTransformMatrix1D.of(-0.0, 0.0);
743
744
745 Assert.assertFalse(a.equals(b));
746
747 Assert.assertTrue(a.equals(c));
748 Assert.assertEquals(a.hashCode(), c.hashCode());
749
750 Assert.assertTrue(b.equals(d));
751 Assert.assertEquals(b.hashCode(), d.hashCode());
752 }
753
754 @Test
755 public void testToString() {
756
757 final AffineTransformMatrix1D a = AffineTransformMatrix1D.of(1, 2);
758
759
760 final String result = a.toString();
761
762
763 Assert.assertEquals("[ 1.0, 2.0 ]", result);
764 }
765
766 @FunctionalInterface
767 private interface Coordinate1DTest {
768
769 void run(double x);
770 }
771
772 private static void runWithCoordinates(final Coordinate1DTest test) {
773 runWithCoordinates(test, false);
774 }
775
776 private static void runWithCoordinates(final Coordinate1DTest test, final boolean skipZero) {
777 runWithCoordinates(test, -1e-2, 1e-2, 5e-3, skipZero);
778 runWithCoordinates(test, -1e2, 1e2, 5, skipZero);
779 }
780
781 private static void runWithCoordinates(final Coordinate1DTest test, final double min, final double max, final double step, final boolean skipZero) {
782 for (double x = min; x <= max; x += step) {
783 if (!skipZero || x != 0.0) {
784 test.run(x);
785 }
786 }
787 }
788 }