-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunit_test.cpp
More file actions
1191 lines (1023 loc) · 63.4 KB
/
unit_test.cpp
File metadata and controls
1191 lines (1023 loc) · 63.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#include <iostream>
#include <iomanip>
#include <string>
//console coloring stuff
#include <Windows.h>
#include <wincon.h>
#include "mymath/mymath.h"
using namespace mymath;
HANDLE console_handle = GetStdHandle( STD_OUTPUT_HANDLE );
#define OUTPUT_ERRORS_ONLY
class unit_test
{
public:
static void test( bool expr, const std::string& expr_str )
{
if( !expr )
{
SetConsoleTextAttribute( console_handle, FOREGROUND_RED );
std::cerr << "Test failed: " << expr_str << std::endl;
}
#ifndef OUTPUT_ERRORS_ONLY
else
{
SetConsoleTextAttribute( console_handle, FOREGROUND_GREEN );
std::cout << "Test successful: " << expr_str << std::endl;
}
#endif
SetConsoleTextAttribute( console_handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
}
};
#define STRINGIFY(S) (#S)
#define UNIT_TEST(S) unit_test::test(S, STRINGIFY(S))
bool MAT2_EQUAL( const mat2& A, const mat2& B )
{
return ( mm::all( mm::equal( A[0], B[0] ) ) &&
mm::all( mm::equal( A[1], B[1] ) ) );
}
bool MAT3_EQUAL( const mat3& A, const mat3& B )
{
return ( mm::all( mm::equal( A[0], B[0] ) ) &&
mm::all( mm::equal( A[1], B[1] ) ) &&
mm::all( mm::equal( A[2], B[2] ) ) );
}
bool MAT4_EQUAL( const mat4& A, const mat4& B )
{
return ( mm::all( mm::equal( A[0], B[0] ) ) &&
mm::all( mm::equal( A[1], B[1] ) ) &&
mm::all( mm::equal( A[2], B[2] ) ) &&
mm::all( mm::equal( A[3], B[3] ) ) );
}
bool QUAT_EQUAL( const quat& q1, const quat& q2 )
{
return mm::all( mm::equal( q1.value, q2.value ) ) || mm::all( mm::equal( q1.value, ( q2*-1.f ).value ) );
}
int main( int argc, char** args )
{
//vec4 v = vec4( 1, 2, 3, 4 );
//v.wxzy = vec4( 1, 2, 3, 4 );
{
//common.h tests
for( float eps = mm::epsilon, i = mm::epsilon; i < 100; i += ( eps *= 2 ) )
{
UNIT_TEST( mm::impl::is_eq( mm::inversesqrt( i ), 1.0f / std::sqrt( i ) ) );
}
UNIT_TEST( mm::step( 2, -1 ) == 0 );
UNIT_TEST( mm::step( -1, 2 ) == 1 );
for( float eps = mm::epsilon, i = mm::epsilon; i < 1; i += ( eps *= 2 ) )
{
UNIT_TEST( mm::impl::is_eq( mm::mix( -1, 1, i ), i * 2 - 1 ) );
}
UNIT_TEST( mm::impl::is_eq( mm::fract( 1.2f ), 0.2f ) );
UNIT_TEST( mm::impl::is_eq( mm::fract( -1.2f ), -0.2f ) );
UNIT_TEST( mm::impl::is_eq( mm::fract( 0.0f ), 0.0f ) );
UNIT_TEST( mm::impl::is_eq( mm::atan( 3, 2 ), 0.5880026f ) );
UNIT_TEST( mm::impl::is_eq( mm::atan( -3, 2 ), -0.588f ) );
UNIT_TEST( mm::impl::is_eq( mm::clamp( -2, -1, 1 ), -1 ) );
UNIT_TEST( mm::impl::is_eq( mm::clamp( 2, -1, 1 ), 1 ) );
UNIT_TEST( mm::impl::is_eq( mm::smoothstep( 1, 2, 3 ), 1 ) );
UNIT_TEST( mm::impl::is_eq( mm::smoothstep( 1, 2, 0.5 ), 0 ) );
UNIT_TEST( mm::impl::is_eq( mm::smoothstep( 1, 2, 1.5 ), 0.5f ) );
UNIT_TEST( mm::impl::is_eq( mm::smoothstep( 1, 2, 1.6 ), 0.648f ) );
UNIT_TEST( mm::fma( 2, 3, 4 ) == 10 );
UNIT_TEST( mm::fma( 2, -3, 4 ) == -2 );
UNIT_TEST( mm::fma( 2, 0, 4 ) == 4 );
UNIT_TEST( mm::impl::is_eq( mm::radians( 360 ), two_pi ) );
UNIT_TEST( mm::impl::is_eq( mm::degrees( pi ), 180 ) );
UNIT_TEST( mm::sign( -2 ) == -1 );
UNIT_TEST( mm::sign( 0 ) == 0 );
UNIT_TEST( mm::sign( 2 ) == 1 );
UNIT_TEST( mm::impl::is_eq( mm::asinh( -22 ), -3.784705763f ) );
UNIT_TEST( mm::impl::is_eq( mm::asinh( 22 ), 3.784705763f ) );
UNIT_TEST( mm::asinh( 0 ) == 0 );
UNIT_TEST( mm::impl::is_eq( mm::acosh( 22 ), 3.7836727f ) );
UNIT_TEST( mm::acosh( 1 ) == 0 );
UNIT_TEST( mm::impl::is_eq( mm::atanh( -0.5 ), -0.549306144334f ) );
UNIT_TEST( mm::impl::is_eq( mm::atanh( 0.5 ), 0.549306144334f ) );
UNIT_TEST( mm::atanh( 0 ) == 0 );
UNIT_TEST( mm::impl::is_eq( mm::log2( 22 ), 4.459431618637f ) );
UNIT_TEST( mm::trunc( -1.9f ) == -1 );
UNIT_TEST( mm::trunc( 1.9f ) == 1 );
UNIT_TEST( mm::trunc( 0 ) == 0 );
UNIT_TEST( mm::round( -1.9f ) == -2 );
UNIT_TEST( mm::round( 1.9f ) == 2 );
UNIT_TEST( mm::round( 0 ) == 0 );
UNIT_TEST( mm::isnan( nanf( 0 ) ) == true );
UNIT_TEST( mm::isnan( 0 ) == false );
UNIT_TEST( mm::isinf( INFINITY ) == true );
UNIT_TEST( mm::isinf( 0 ) == false );
UNIT_TEST( mm::min( 1, 2 ) == 1 );
UNIT_TEST( mm::min( 1, -2 ) == -2 );
UNIT_TEST( mm::min( 1, 0 ) == 0 );
UNIT_TEST( mm::max( 1, 2 ) == 2 );
UNIT_TEST( mm::max( 1, -2 ) == 1 );
UNIT_TEST( mm::max( 1, 0 ) == 1 );
}
{
//vec2 tests
vec2 a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.yx = a.xy, vec2( 2, 1 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.yx *= a.xy, vec2( 2, 2 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.yx /= a.yx, vec2( 1, 1 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.yx += a.xy, vec2( 3, 3 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.yx -= a.yx, vec2( 0, 0 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( a.xx = a.xx, vec2( 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a = uvec2( 1, 2 ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a = ivec2( 1, 2 ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a = vec2( uvec2( 1, 2 ) ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a = vec2( ivec2( 1, 2 ) ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec2( { 1.0f, 2.0f } ), vec2( 1, 2 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( a.x == 1 );
UNIT_TEST( a.y == 2 );
UNIT_TEST( a.r == 1 );
UNIT_TEST( a.g == 2 );
UNIT_TEST( a.s == 1 );
UNIT_TEST( a.t == 2 );
UNIT_TEST( mm::all( mm::equal( vec2( 1, 1 ), vec2( 1 ) ) ) );
UNIT_TEST( a[0] == 1 );
UNIT_TEST( a[1] == 2 );
UNIT_TEST( mm::all( mm::equal( ( a *= 2 ), vec2( 2, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( a /= 2 ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( a += a ), vec2( 2, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( a -= a ), vec2( 0, 0 ) ) ) );
ivec2 ai = ivec2( 10 );
uvec2 au = uvec2( 10 );
UNIT_TEST( mm::all( mm::equal( ( ai %= ivec2( 3 ) ), ivec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au %= uvec2( 3 ) ), uvec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( ai <<= ivec2( 1 ) ), ivec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au <<= uvec2( 1 ) ), uvec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( ai >>= ivec2( 1 ) ), ivec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au >>= uvec2( 1 ) ), uvec2( 1 ) ) ) );
ai = ivec2( 255 );
au = uvec2( 255 );
UNIT_TEST( mm::all( mm::equal( ( ai &= ivec2( 259 ) ), ivec2( 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au &= uvec2( 259 ) ), uvec2( 3 ) ) ) );
ai = ivec2( 255 );
au = uvec2( 255 );
UNIT_TEST( mm::all( mm::equal( ( ai ^= ivec2( 259 ) ), ivec2( 508 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au ^= uvec2( 259 ) ), uvec2( 508 ) ) ) );
ai = ivec2( 255 );
au = uvec2( 255 );
UNIT_TEST( mm::all( mm::equal( ( ai |= ivec2( 259 ) ), ivec2( 511 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( au |= uvec2( 259 ) ), uvec2( 511 ) ) ) );
a = vec2( 1, 2 );
UNIT_TEST( mm::all( mm::equal( ++a, vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a++, vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( --a, vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a--, vec2( 2, 3 ) ) ) );
UNIT_TEST( a.length() == 2 );
}
{
//vec3 tests
vec3 b = vec3( 1, 2, 3 );
#ifndef MYMATH_FAST_COMPILE
UNIT_TEST( mm::all( mm::equal( b.zyx = b.xyz, vec3( 3, 2, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.zyx *= b.xyz, vec3( 3, 4, 3 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.zyx /= b.zyx, vec3( 1, 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.zyx += b.xyz, vec3( 4, 4, 4 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST(mm::all(mm::equal(b.zyx -= b.zyx, vec3(0, 0, 0))));
#endif
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xxx = b.xxx, vec3( 1, 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.yxx = b.yxx, vec3( 2, 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xyx = b.xyx, vec3( 1, 2, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xxy = b.xxy, vec3( 1, 1, 2 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xx = b.xx, vec2( 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
#ifndef MYMATH_FAST_COMPILE
UNIT_TEST( mm::all( mm::equal( b.xy = b.xx, vec2( 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xy *= b.yy, vec2( 2, 4 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xy /= b.xy, vec2( 1, 1 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( b.xy += b.xy, vec2( 2, 4 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST(mm::all(mm::equal(b.xy -= b.xy, vec2(0, 0))));
#endif
UNIT_TEST( mm::all( mm::equal( b = uvec3( 1, 2, 3 ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b = ivec3( 1, 2, 3 ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b = vec3( uvec3( 1, 2, 3 ) ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b = vec3( ivec3( 1, 2, 3 ) ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec3( { 1.0f, 2.0f, 3.0f } ), vec3( 1, 2, 3 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( b.x == 1 );
UNIT_TEST( b.y == 2 );
UNIT_TEST( b.z == 3 );
UNIT_TEST( b.r == 1 );
UNIT_TEST( b.g == 2 );
UNIT_TEST( b.b == 3 );
UNIT_TEST( b.s == 1 );
UNIT_TEST( b.t == 2 );
UNIT_TEST( b.q == 3 );
UNIT_TEST( mm::all( mm::equal( vec3( 1, 1, 1 ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec3( 1, 2, 3 ), vec3( vec2( 1, 2 ), 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec3( 1, 2, 3 ), vec3( 1, vec2( 2, 3 ) ) ) ) );
UNIT_TEST( b[0] == 1 );
UNIT_TEST( b[1] == 2 );
UNIT_TEST( b[2] == 3 );
UNIT_TEST( mm::all( mm::equal( ( b *= 2 ), vec3( 2, 4, 6 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( b /= 2 ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( b += b ), vec3( 2, 4, 6 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( b -= b ), vec3( 0, 0, 0 ) ) ) );
ivec3 bi = ivec3( 10 );
uvec3 bu = uvec3( 10 );
UNIT_TEST( mm::all( mm::equal( ( bi %= ivec3( 3 ) ), ivec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu %= uvec3( 3 ) ), uvec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bi <<= ivec3( 1 ) ), ivec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu <<= uvec3( 1 ) ), uvec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bi >>= ivec3( 1 ) ), ivec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu >>= uvec3( 1 ) ), uvec3( 1 ) ) ) );
bi = ivec3( 255 );
bu = uvec3( 255 );
UNIT_TEST( mm::all( mm::equal( ( bi &= ivec3( 259 ) ), ivec3( 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu &= uvec3( 259 ) ), uvec3( 3 ) ) ) );
bi = ivec3( 255 );
bu = uvec3( 255 );
UNIT_TEST( mm::all( mm::equal( ( bi ^= ivec3( 259 ) ), ivec3( 508 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu ^= uvec3( 259 ) ), uvec3( 508 ) ) ) );
bi = ivec3( 255 );
bu = uvec3( 255 );
UNIT_TEST( mm::all( mm::equal( ( bi |= ivec3( 259 ) ), ivec3( 511 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( bu |= uvec3( 259 ) ), uvec3( 511 ) ) ) );
b = vec3( 1, 2, 3 );
UNIT_TEST( mm::all( mm::equal( ++b, vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b++, vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( --b, vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b--, vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( b.length() == 3 );
}
{
//vec4 tests
vec4 c = vec4( 1, 2, 3, 4 );
#ifndef MYMATH_FAST_COMPILE
UNIT_TEST( mm::all( mm::equal( c.wzyx = c.xyzw, vec4( 4, 3, 2, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.wzyx *= c.xyzw, vec4( 4, 6, 6, 4 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.wzyx /= c.wzyx, vec4( 1, 1, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.wzyx += c.xyzw, vec4( 5, 5, 5, 5 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST(mm::all(mm::equal(c.wzyx -= c.wzyx, vec4(0, 0, 0, 0))));
#endif
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xxxx = c.xxxx, vec4( 1, 1, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.yxxx = c.yxxx, vec4( 2, 1, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xyxx = c.xyxx, vec4( 1, 2, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xxyx = c.xxyx, vec4( 1, 1, 2, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xxxy = c.xxxy, vec4( 1, 1, 1, 2 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.zyxx = c.zyxx, vec4( 3, 2, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.zxyx = c.zxyx, vec4( 3, 1, 2, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.zxxy = c.zxxy, vec4( 3, 1, 1, 2 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.yxx = c.yxx, vec3( 2, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xyx = c.xyx, vec3( 1, 2, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xxy = c.xxy, vec3( 1, 1, 2 ) ) ) );
c = vec4( 1, 2, 3, 4 );
#ifndef MYMATH_FAST_COMPILE
UNIT_TEST( mm::all( mm::equal( c.zyx = c.zyx, vec3( 3, 2, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xyz *= c.xyz, vec3( 1, 4, 9 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xyz /= c.xyz, vec3( 1, 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xyz += c.xyz, vec3( 2, 4, 6 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST(mm::all(mm::equal(c.xyz -= c.xyz, vec3(0, 0, 0))));
#endif
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xx = c.xx, vec2( 1, 1 ) ) ) );
#ifndef MYMATH_FAST_COMPILE
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xy = c.xx, vec2( 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xy *= c.yy, vec2( 2, 4 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xy /= c.xy, vec2( 1, 1 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( c.xy += c.xy, vec2( 2, 4 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST(mm::all(mm::equal(c.xy -= c.xy, vec2(0, 0))));
#endif
UNIT_TEST( mm::all( mm::equal( c = uvec4( 1, 2, 3, 4 ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c = ivec4( 1, 2, 3, 4 ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c = vec4( uvec4( 1, 2, 3, 4 ) ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c = vec4( ivec4( 1, 2, 3, 4 ) ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( { 1.0f, 2.0f, 3.0f, 4.0f } ), vec4( 1, 2, 3, 4 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( c.x == 1 );
UNIT_TEST( c.y == 2 );
UNIT_TEST( c.z == 3 );
UNIT_TEST( c.w == 4 );
UNIT_TEST( c.r == 1 );
UNIT_TEST( c.g == 2 );
UNIT_TEST( c.b == 3 );
UNIT_TEST( c.a == 4 );
UNIT_TEST( c.s == 1 );
UNIT_TEST( c.t == 2 );
UNIT_TEST( c.q == 3 );
UNIT_TEST( c.p == 4 );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 1, 1, 1 ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( vec3( 1, 2, 3 ), 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( 1, vec3( 2, 3, 4 ) ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( vec2( 1, 2 ), vec2( 3, 4 ) ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( vec2( 1, 2 ), 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( 1, vec2( 2, 3 ), 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( vec4( 1, 2, 3, 4 ), vec4( 1, 2, vec2( 3, 4 ) ) ) ) );
UNIT_TEST( c[0] == 1 );
UNIT_TEST( c[1] == 2 );
UNIT_TEST( c[2] == 3 );
UNIT_TEST( c[3] == 4 );
UNIT_TEST( mm::all( mm::equal( ( c *= 2 ), vec4( 2, 4, 6, 8 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( c /= 2 ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( c += c ), vec4( 2, 4, 6, 8 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( c -= c ), vec4( 0, 0, 0, 0 ) ) ) );
ivec4 ci = ivec4( 10 );
uvec4 cu = uvec4( 10 );
UNIT_TEST( mm::all( mm::equal( ( ci %= ivec4( 3 ) ), ivec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu %= uvec4( 3 ) ), uvec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( ci <<= ivec4( 1 ) ), ivec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu <<= uvec4( 1 ) ), uvec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( ci >>= ivec4( 1 ) ), ivec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu >>= uvec4( 1 ) ), uvec4( 1 ) ) ) );
ci = ivec4( 255 );
cu = uvec4( 255 );
UNIT_TEST( mm::all( mm::equal( ( ci &= ivec4( 259 ) ), ivec4( 3 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu &= uvec4( 259 ) ), uvec4( 3 ) ) ) );
ci = ivec4( 255 );
cu = uvec4( 255 );
UNIT_TEST( mm::all( mm::equal( ( ci ^= ivec4( 259 ) ), ivec4( 508 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu ^= uvec4( 259 ) ), uvec4( 508 ) ) ) );
ci = ivec4( 255 );
cu = uvec4( 255 );
UNIT_TEST( mm::all( mm::equal( ( ci |= ivec4( 259 ) ), ivec4( 511 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( cu |= uvec4( 259 ) ), uvec4( 511 ) ) ) );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( ++c, vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c++, vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( --c, vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c--, vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( c.length() == 4 );
}
{
//swizzle out tests
vec2 a = vec2( 1, 2 );
vec3 b = vec3( 1, 2, 3 );
vec4 c = vec4( 1, 2, 3, 4 );
//don't believe intellisense, this is valid code
UNIT_TEST( mm::all( mm::equal( a.xxx, vec3( 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.yxx, vec3( 2, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xyx, vec3( 1, 2, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xxy, vec3( 1, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xxxx, vec4( 1, 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.yxxx, vec4( 2, 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xyxx, vec4( 1, 2, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xxyx, vec4( 1, 1, 2, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xxxy, vec4( 1, 1, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xyxy, vec4( 1, 2, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xyxy, vec4( 1, 2, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( a.xxyy, vec4( 1, 1, 2, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xxxx, vec4( 1, 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.yxxx, vec4( 2, 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xyxx, vec4( 1, 2, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xxyx, vec4( 1, 1, 2, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xxxy, vec4( 1, 1, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xyxy, vec4( 1, 2, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xyxy, vec4( 1, 2, 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.xxyy, vec4( 1, 1, 2, 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.yzxx, vec4( 2, 3, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.yxzx, vec4( 2, 1, 3, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b.yxxz, vec4( 2, 1, 1, 3 ) ) ) );
}
{
//vec func tests
vec2 a;
vec3 b;
vec4 c;
UNIT_TEST( mm::all( mm::equal( mm::not( bvec2( true, false ) ), bvec2( false, true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::not( bvec3( true, false, true ) ), bvec3( false, true, false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::not( bvec4( true, false, true, false ) ), bvec4( false, true, false, true ) ) ) );
UNIT_TEST( mm::all( mm::notEqual( mm::not( bvec2( true, false ) ), bvec2( true, false ) ) ) );
UNIT_TEST( mm::all( mm::notEqual( mm::not( bvec3( true, false, true ) ), bvec3( true, false, true ) ) ) );
UNIT_TEST( mm::all( mm::notEqual( mm::not( bvec4( true, false, true, false ) ), bvec4( true, false, true, false ) ) ) );
UNIT_TEST( mm::any( bvec2( true, false ) ) == true );
UNIT_TEST( mm::any( bvec3( true, false, false ) ) == true );
UNIT_TEST( mm::any( bvec4( true, false, false, false ) ) == true );
UNIT_TEST( mm::any( bvec2( false, false ) ) == false );
UNIT_TEST( mm::any( bvec3( false, false, false ) ) == false );
UNIT_TEST( mm::any( bvec4( false, false, false, false ) ) == false );
UNIT_TEST( mm::all( bvec2( true, false ) ) == false );
UNIT_TEST( mm::all( bvec3( true, false, false ) ) == false );
UNIT_TEST( mm::all( bvec4( true, false, false, false ) ) == false );
UNIT_TEST( mm::all( bvec2( true, true ) ) == true );
UNIT_TEST( mm::all( bvec3( true, true, true ) ) == true );
UNIT_TEST( mm::all( bvec4( true, true, true, true ) ) == true );
UNIT_TEST( mm::all( mm::equal( -vec2( 1 ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( -vec3( 1 ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( -vec4( 1 ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( -vec2( -1 ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( -vec3( -1 ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( -vec4( -1 ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec2( 1, 2 ), vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec2( -3, 2 ), vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec3( 1, 2, 3 ), vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec3( -3, 2, 3 ), vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec4( 1, 2, 3, 4 ), vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::lessThan( vec4( -3, 2, 3, 4 ), vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThan( vec2( 2, 3 ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThan( vec3( 2, 3, 4 ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThan( vec4( 2, 3, 4, 5 ), vec4( 1, 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec2( 2, 2 ), vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec2( -3, 2 ), vec2( 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec3( 2, 2, 3 ), vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec3( -3, 2, 3 ), vec3( 2, 3, 4 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec4( 2, 2, 3, 4 ), vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::lessThanEqual( vec4( -3, 2, 3, 4 ), vec4( 2, 3, 4, 5 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThanEqual( vec2( 1, 3 ), vec2( 1, 2 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThanEqual( vec3( 1, 3, 4 ), vec3( 1, 2, 3 ) ) ) );
UNIT_TEST( mm::all( mm::greaterThanEqual( vec4( 1, 3, 4, 5 ), vec4( 1, 2, 3, 4 ) ) ) );
a = vec2( 1, 2 );
b = vec3( 1, 2, 3 );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( a*a, vec2( 1, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b*b, vec3( 1, 4, 9 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c*c, vec4( 1, 4, 9, 16 ) ) ) );
a = vec2( 1, 2 );
b = vec3( 1, 2, 3 );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( a / a, vec2( 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b / b, vec3( 1, 1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c / c, vec4( 1, 1, 1, 1 ) ) ) );
a = vec2( 1, 2 );
b = vec3( 1, 2, 3 );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( a + a, vec2( 2, 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b + b, vec3( 2, 4, 6 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c + c, vec4( 2, 4, 6, 8 ) ) ) );
a = vec2( 1, 2 );
b = vec3( 1, 2, 3 );
c = vec4( 1, 2, 3, 4 );
UNIT_TEST( mm::all( mm::equal( a - a, vec2( 0, 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b - b, vec3( 0, 0, 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c - c, vec4( 0, 0, 0, 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec2( pi / 2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec2( -pi / 2 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec3( pi / 2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec3( -pi / 2 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec4( pi / 2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sin( vec4( -pi / 2 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec2( pi ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec2( pi / 2 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec3( pi ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec3( pi / 2 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec4( pi ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cos( vec4( pi / 2 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec2( pi / 6 ) ), vec2( 0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec2( -pi / 6 ) ), vec2( -0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec3( pi / 6 ) ), vec3( 0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec3( -pi / 6 ) ), vec3( -0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec4( pi / 6 ) ), vec4( 0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tan( vec4( -pi / 6 ) ), vec4( -0.57735f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec2( -0.5 ) ), vec2( -0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec2( 0.5 ) ), vec2( 0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec3( -0.5 ) ), vec3( -0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec3( 0.5 ) ), vec3( 0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec4( -0.5 ) ), vec4( -0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asin( vec4( 0.5 ) ), vec4( 0.5236 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec2( -0.5 ) ), vec2( 2.0944 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec2( 0 ) ), vec2( 1.5708 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec2( 0.5 ) ), vec2( 1.0472 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec3( -0.5 ) ), vec3( 2.0944 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec3( 0 ) ), vec3( 1.5708 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec3( 0.5 ) ), vec3( 1.0472 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec4( -0.5 ) ), vec4( 2.0944 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec4( 0 ) ), vec4( 1.5708 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acos( vec4( 0.5 ) ), vec4( 1.0472 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec2( -0.5 ) ), vec2( -0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec2( 0.5 ) ), vec2( 0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec3( -0.5 ) ), vec3( -0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec3( 0.5 ) ), vec3( 0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec4( -0.5 ) ), vec4( -0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atan( vec4( 0.5 ) ), vec4( 0.4636 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec2( -0.5 ) ), vec2( -0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec2( 0.5 ) ), vec2( 0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec3( -0.5 ) ), vec3( -0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec3( 0.5 ) ), vec3( 0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec4( -0.5 ) ), vec4( -0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sinh( vec4( 0.5 ) ), vec4( 0.5211 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec2( -0.5 ) ), vec2( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec2( 0.5 ) ), vec2( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec3( -0.5 ) ), vec3( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec3( 0.5 ) ), vec3( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec4( -0.5 ) ), vec4( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cosh( vec4( 0.5 ) ), vec4( 1.1276 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec2( -0.5 ) ), vec2( -0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec2( 0.5 ) ), vec2( 0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec3( -0.5 ) ), vec3( -0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec3( 0.5 ) ), vec3( 0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec4( -0.5 ) ), vec4( -0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::tanh( vec4( 0.5 ) ), vec4( 0.4621 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec2( -0.5 ) ), vec2( -0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec2( 0.5 ) ), vec2( 0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec3( -0.5 ) ), vec3( -0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec3( 0.5 ) ), vec3( 0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec4( -0.5 ) ), vec4( -0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::asinh( vec4( 0.5 ) ), vec4( 0.4812 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acosh( vec2( 2 ) ), vec2( 1.3170 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acosh( vec3( 2 ) ), vec3( 1.3170 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::acosh( vec4( 2 ) ), vec4( 1.3170 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec2( -0.5 ) ), vec2( -0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec2( 0.5 ) ), vec2( 0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec3( -0.5 ) ), vec3( -0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec3( 0.5 ) ), vec3( 0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec4( -0.5 ) ), vec4( -0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::atanh( vec4( 0.5 ) ), vec4( 0.5493 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec2( 0.5 ), vec2( 2 ) ), vec2( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec2( 0.5 ), vec2( -2 ) ), vec2( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec2( 0.5 ), vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec3( 0.5 ), vec3( 2 ) ), vec3( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec3( 0.5 ), vec3( -2 ) ), vec3( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec3( 0.5 ), vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec4( 0.5 ), vec4( 2 ) ), vec4( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec4( 0.5 ), vec4( -2 ) ), vec4( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::pow( vec4( 0.5 ), vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec2( 3 ) ), vec2( 20.0855 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec2( -3 ) ), vec2( 0.0498 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec3( 3 ) ), vec3( 20.0855 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec3( -3 ) ), vec3( 0.0498 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec4( 3 ) ), vec4( 20.0855 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec4( -3 ) ), vec4( 0.0498 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp( vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::log( vec2( 10 ) ), vec2( 2.3026 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::log( vec3( 10 ) ), vec3( 2.3026 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::log( vec4( 10 ) ), vec4( 2.3026 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec2( 4 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec3( 4 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec4( 4 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sqrt( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec2( 2 ) ), vec2( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec2( -2 ) ), vec2( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec3( 2 ) ), vec3( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec3( -2 ) ), vec3( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec4( 2 ) ), vec4( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec4( -2 ) ), vec4( 0.25 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::exp2( vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::inversesqrt( vec2( 4 ) ), vec2( 0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::inversesqrt( vec3( 4 ) ), vec3( 0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::inversesqrt( vec4( 4 ) ), vec4( 0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec2( 2 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec2( -2 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec3( 2 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec3( -2 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec4( 2 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec4( -2 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::abs( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec2( 1.2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec2( 1.9 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec2( -1.2 ) ), vec2( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec2( -1.9 ) ), vec2( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec3( 1.2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec3( 1.9 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec3( -1.2 ) ), vec3( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec3( -1.9 ) ), vec3( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec4( 1.2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec4( 1.9 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec4( -1.2 ) ), vec4( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::floor( vec4( -1.9 ) ), vec4( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec2( 1.2 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec2( 1.9 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec2( -1.2 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec2( -1.9 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec3( 1.2 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec3( 1.9 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec3( -1.2 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec3( -1.9 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec4( 1.2 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec4( 1.9 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec4( -1.2 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::ceil( vec4( -1.9 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec2( 1 ), vec2( 2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec2( 1 ), vec2( -2 ) ), vec2( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec2( 1 ), vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec3( 1 ), vec3( 2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec3( 1 ), vec3( -2 ) ), vec3( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec3( 1 ), vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec4( 1 ), vec4( 2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec4( 1 ), vec4( -2 ) ), vec4( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::min( vec4( 1 ), vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec2( 1 ), vec2( 2 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec2( 1 ), vec2( -2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec2( 1 ), vec2( 0 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec3( 1 ), vec3( 2 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec3( 1 ), vec3( -2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec3( 1 ), vec3( 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec4( 1 ), vec4( 2 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec4( 1 ), vec4( -2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::max( vec4( 1 ), vec4( 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec2( -2 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec2( 1 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec3( -2 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec3( 1 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec4( -2 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::sign( vec4( 1 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec2( 1.2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec2( 0 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec2( -1.2 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec3( 1.2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec3( 0 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec3( -1.2 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec4( 1.2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec4( 0 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::trunc( vec4( -1.2 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec2( 1.2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec2( 1.9 ) ), vec2( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec2( -1.2 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec2( -1.9 ) ), vec2( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec3( 1.2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec3( 1.9 ) ), vec3( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec3( -1.2 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec3( -1.9 ) ), vec3( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec4( 1.2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec4( 1.9 ) ), vec4( 2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec4( -1.2 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::round( vec4( -1.9 ) ), vec4( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec2( 1.2 ) ), vec2( 0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec2( -1.2 ) ), vec2( -0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec3( 1.2 ) ), vec3( 0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec3( -1.2 ) ), vec3( -0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec4( 1.2 ) ), vec4( 0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fract( vec4( -1.2 ) ), vec4( -0.2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec2( 1.2 ), vec2( 0.8 ) ), vec2( 0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec2( 1.2 ), vec2( -0.8 ) ), vec2( -0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec3( 1.2 ), vec3( 0.8 ) ), vec3( 0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec3( 1.2 ), vec3( -0.8 ) ), vec3( -0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec4( 1.2 ), vec4( 0.8 ) ), vec4( 0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mod( vec4( 1.2 ), vec4( -0.8 ) ), vec4( -0.4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec2( 0.5 ), vec2( 0.4 ), vec2( 0.5 ) ), vec2( 0.45 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec2( 0.5 ), vec2( -0.4 ), vec2( 0.5 ) ), vec2( 0.05 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec3( 0.5 ), vec3( 0.4 ), vec3( 0.5 ) ), vec3( 0.45 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec3( 0.5 ), vec3( -0.4 ), vec3( 0.5 ) ), vec3( 0.05 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec4( 0.5 ), vec4( 0.4 ), vec4( 0.5 ) ), vec4( 0.45 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::mix( vec4( 0.5 ), vec4( -0.4 ), vec4( 0.5 ) ), vec4( 0.05 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec2( 2 ), vec2( -1 ) ), vec2( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec2( -1 ), vec2( 2 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec3( 2 ), vec3( -1 ) ), vec3( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec3( -1 ), vec3( 2 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec4( 2 ), vec4( -1 ) ), vec4( 0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::step( vec4( -1 ), vec4( 2 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec2( -2 ), vec2( -1 ), vec2( 1 ) ), vec2( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec2( 2 ), vec2( -1 ), vec2( 1 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec3( -2 ), vec3( -1 ), vec3( 1 ) ), vec3( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec3( 2 ), vec3( -1 ), vec3( 1 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec4( -2 ), vec4( -1 ), vec4( 1 ) ), vec4( -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::clamp( vec4( 2 ), vec4( -1 ), vec4( 1 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::smoothstep( vec2( 1 ), vec2( 2 ), vec2( 1.6 ) ), vec2( 0.648f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::smoothstep( vec3( 1 ), vec3( 2 ), vec3( 1.6 ) ), vec3( 0.648f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::smoothstep( vec4( 1 ), vec4( 2 ), vec4( 1.6 ) ), vec4( 0.648f ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec2( 2 ), vec2( 3 ), vec2( 4 ) ), vec2( 10 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec2( 2 ), vec2( -3 ), vec2( 4 ) ), vec2( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec2( 2 ), vec2( 0 ), vec2( 4 ) ), vec2( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec3( 2 ), vec3( 3 ), vec3( 4 ) ), vec3( 10 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec3( 2 ), vec3( -3 ), vec3( 4 ) ), vec3( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec3( 2 ), vec3( 0 ), vec3( 4 ) ), vec3( 4 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec4( 2 ), vec4( 3 ), vec4( 4 ) ), vec4( 10 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec4( 2 ), vec4( -3 ), vec4( 4 ) ), vec4( -2 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::fma( vec4( 2 ), vec4( 0 ), vec4( 4 ) ), vec4( 4 ) ) ) );
UNIT_TEST( mm::dot( vec2( 1 ), vec2( 2 ) ) == 4 );
UNIT_TEST( mm::dot( vec2( 1, 0 ), vec2( -1, 0 ) ) == -1 );
UNIT_TEST( mm::dot( vec2( 1, 0 ), vec2( 1, 0 ) ) == 1 );
UNIT_TEST( mm::dot( vec3( 1 ), vec3( 2 ) ) == 6 );
UNIT_TEST( mm::dot( vec3( 1, 0, 0 ), vec3( -1, 0, 0 ) ) == -1 );
UNIT_TEST( mm::dot( vec3( 1, 0, 0 ), vec3( 1, 0, 0 ) ) == 1 );
UNIT_TEST( mm::dot( vec4( 1 ), vec4( 2 ) ) == 8 );
UNIT_TEST( mm::dot( vec4( 1, 0, 0, 0 ), vec4( -1, 0, 0, 0 ) ) == -1 );
UNIT_TEST( mm::dot( vec4( 1, 0, 0, 0 ), vec4( 1, 0, 0, 0 ) ) == 1 );
UNIT_TEST( mm::impl::is_eq( mm::length( vec2( 1, 2 ) ), std::sqrt( 5.0f ) ) );
UNIT_TEST( mm::impl::is_eq( mm::length( vec3( 2, 3, 4 ) ), std::sqrt( 29.0f ) ) );
UNIT_TEST( mm::impl::is_eq( mm::length( vec4( 2, 3, 4, 5 ) ), std::sqrt( 54.0f ) ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec2( 1, 2 ), vec2( 1, 3 ) ), 1 ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec2( 1, -2 ), vec2( 1, 3 ) ), 5 ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec3( 1, 2, 4 ), vec3( 1, 3, 4 ) ), 1 ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec3( 1, -2, 4 ), vec3( 1, 3, 4 ) ), 5 ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec4( 1, 2, 4, 5 ), vec4( 1, 3, 4, 5 ) ), 1 ) );
UNIT_TEST( mm::impl::is_eq( mm::distance( vec4( 1, -2, 4, 5 ), vec4( 1, 3, 4, 5 ) ), 5 ) );
UNIT_TEST( mm::all( mm::equal( mm::normalize( vec2( 1 ) ), vec2( 0.7071 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::normalize( vec3( 1 ) ), vec3( 0.57735 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::normalize( vec4( 1 ) ), vec4( 0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::reflect( vec2( -1 ), vec2( 0, 1 ) ), vec2( -1, 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::reflect( vec3( -1 ), vec3( 0, 1, 0 ) ), vec3( -1, 1, -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::reflect( vec4( -1 ), vec4( 0, 1, 0, 0 ) ), vec4( -1, 1, -1, -1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::refract( vec2( -1 ), vec2( 0, 1 ), 0.5 ), vec2( -0.5, -1.0 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::refract( vec3( -1 ), vec3( 0, 1, 0 ), 0.5 ), vec3( -0.5, -1.0, -0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::refract( vec4( -1 ), vec4( 0, 1, 0, 0 ), 0.5 ), vec4( -0.5, -1.0, -0.5, -0.5 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec2( -1 ), vec2( 1 ), vec2( 0, 1 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec2( 1 ), vec2( -1 ), vec2( 0, 1 ) ), vec2( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec3( -1 ), vec3( 1 ), vec3( 0, 1, 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec3( 1 ), vec3( -1 ), vec3( 0, 1, 0 ) ), vec3( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec4( -1 ), vec4( 1 ), vec4( 0, 1, 0, 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::faceforward( vec4( 1 ), vec4( -1 ), vec4( 0, 1, 0, 0 ) ), vec4( 1 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec2( _mm_set1_ps( nanf( 0 ) ), false ) ), bvec2( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec2( 0 ) ), bvec2( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec3( _mm_set1_ps( nanf( 0 ) ), false ) ), bvec3( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec3( 0 ) ), bvec3( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec4( _mm_set1_ps( nanf( 0 ) ), false ) ), bvec4( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isnan( vec4( 0 ) ), bvec4( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec2( INFINITY ) ), bvec2( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec2( 0 ) ), bvec2( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec3( INFINITY ) ), bvec3( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec3( 0 ) ), bvec3( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec4( INFINITY ) ), bvec4( true ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::isinf( vec4( 0 ) ), bvec4( false ) ) ) );
UNIT_TEST( mm::all( mm::equal( mm::cross( vec3( 1, 0, 0 ), vec3( 0, 1, 0 ) ), vec3( 0, 0, 1 ) ) ) );
}
{
//mat2 tests
//generated in Matlab using:
//randn( 2 ), randn( 3 ), randn( 4 )
mat2 ma = mat2::identity;
UNIT_TEST( MAT2_EQUAL( ma, mat2( vec2( 1, 0 ), vec2( 0, 1 ) ) ) );
UNIT_TEST( MAT2_EQUAL( ma, mat2( 1 ) ) );
UNIT_TEST( MAT2_EQUAL( mat2( { 1, 2, 3, 4 } ), mat2( 1, 2, 3, 4 ) ) );
UNIT_TEST( ma[0].x == 1 );
UNIT_TEST( ma[0].y == 0 );
ma = mat2( 0.2147, 1.0665,
0.16, 2.6088 );
UNIT_TEST( MAT2_EQUAL( ( ma *= mm::inverse( ma ) ), mat2::identity ) );
UNIT_TEST( MAT2_EQUAL( ( ma *= 2 ), mat2( 2 ) ) );
UNIT_TEST( MAT2_EQUAL( ( ++ma ), mat2( 3, 1, 1, 3 ) ) );
UNIT_TEST( MAT2_EQUAL( ( ma++ ), mat2( 3, 1, 1, 3 ) ) );
UNIT_TEST( MAT2_EQUAL( ( --ma ), mat2( 3, 1, 1, 3 ) ) );
UNIT_TEST( MAT2_EQUAL( ( ma-- ), mat2( 3, 1, 1, 3 ) ) );
}
{
//mat3 tests
mat3 mb = mat3::identity;
const mm::vec3 arbitraryAxis( 10, 11, 12 );
UNIT_TEST( MAT3_EQUAL( mat3( create_rotation( std::sqrt( 2.f ), arbitraryAxis ) ), mat3( quat( std::sqrt( 2.f ), arbitraryAxis ) ) ) );
UNIT_TEST( MAT3_EQUAL( mb, mat3( vec3( 1, 0, 0 ), vec3( 0, 1, 0 ), vec3( 0, 0, 1 ) ) ) );
UNIT_TEST( MAT3_EQUAL( mb, mat3( 1 ) ) );
UNIT_TEST( MAT3_EQUAL( mat3( { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ), mat3( 1, 2, 3, 4, 5, 6, 7, 8, 9 ) ) );
UNIT_TEST( mb[1].x == 0 );
UNIT_TEST( mb[1].y == 1 );
UNIT_TEST( MAT3_EQUAL( mat3( 2 ), mat3( mat4( 2 ) ) ) );
mb = mat3( 0.0313, -2.0781, -1.6148,
0.5045, 0.5253, -0.7856,
-1.1963, -0.6228, -0.2589 );
UNIT_TEST( MAT3_EQUAL( ( mb *= mm::inverse( mb ) ), mat3::identity ) );
UNIT_TEST( MAT3_EQUAL( ( mb *= 2 ), mat3( 2 ) ) );
UNIT_TEST( MAT3_EQUAL( ( ++mb ), mat3( 3, 1, 1, 1, 3, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT3_EQUAL( ( mb++ ), mat3( 3, 1, 1, 1, 3, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT3_EQUAL( ( --mb ), mat3( 3, 1, 1, 1, 3, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT3_EQUAL( ( mb-- ), mat3( 3, 1, 1, 1, 3, 1, 1, 1, 3 ) ) );
}
{
//mat4 tests
mat4 mc = mat4::identity;
const mm::vec3 arbitraryAxis( 10, 11, 12 );
UNIT_TEST( MAT4_EQUAL( mat4( create_rotation( std::sqrt( 2.f ), arbitraryAxis ) ), mat4( quat( std::sqrt( 2.f ), arbitraryAxis ) ) ) );
UNIT_TEST( MAT4_EQUAL( mc, mat4( vec4( 1, 0, 0, 0 ), vec4( 0, 1, 0, 0 ), vec4( 0, 0, 1, 0 ), vec4( 0, 0, 0, 1 ) ) ) );
UNIT_TEST( MAT4_EQUAL( mc, mat4( 1 ) ) );
UNIT_TEST( MAT4_EQUAL( mat4( { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } ), mat4( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ) ) );
UNIT_TEST( mc[2].y == 0 );
UNIT_TEST( mc[2].z == 1 );
UNIT_TEST( MAT4_EQUAL( mat4( 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1 ), mat4( mat3( 2 ) ) ) );
UNIT_TEST( MAT4_EQUAL( mat4( 2 ), mat4( mat2( 2 ), mat2( 0 ), mat2( 0 ), mat2( 2 ) ) ) );
mc = mat4( 0.3854, -0.0806, -0.8362, 0.4866,
-1.2877, -1.8971, 0.6112, -1.3552,
1.6993, -1.5248, -0.0907, 0.6628,
-1.2859, 0.1765, -0.4029, 0.0235 );
UNIT_TEST( MAT4_EQUAL( ( mc *= mm::inverse( mc ) ), mat4::identity ) );
UNIT_TEST( MAT4_EQUAL( ( mc *= 2 ), mat4( 2 ) ) );
UNIT_TEST( MAT4_EQUAL( ( ++mc ), mat4( 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT4_EQUAL( ( mc++ ), mat4( 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT4_EQUAL( ( --mc ), mat4( 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3 ) ) );
UNIT_TEST( MAT4_EQUAL( ( mc-- ), mat4( 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3 ) ) );
}
{
//mat func tests
vec2 a = vec2( 1, 2 );
vec3 b = vec3( 1, 2, 3 );
vec4 c = vec4( 1, 2, 3, 4 );
mat2 ma = mat2( 1, 2, 3, 4 );
mat3 mb = mat3( 1, 2, 3, 4, 5, 6, 7, 8, 9 );
mat4 mc = mat4( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
UNIT_TEST( mm::all( mm::equal( a * ma, vec2( 5, 11 ) ) ) );
UNIT_TEST( mm::all( mm::equal( b * mb, vec3( 14, 32, 50 ) ) ) );
UNIT_TEST( mm::all( mm::equal( c * mc, vec4( 30, 70, 110, 150 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ma * a, vec2( 7, 10 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mb * b, vec3( 30, 36, 42 ) ) ) );
UNIT_TEST( mm::all( mm::equal( mc * c, vec4( 90, 100, 110, 120 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( a *= ma ), vec2( 5, 11 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( b *= mb ), vec3( 14, 32, 50 ) ) ) );
UNIT_TEST( mm::all( mm::equal( ( c *= mc ), vec4( 30, 70, 110, 150 ) ) ) );