1
+ using Box2D . NET ;
2
+ using NUnit . Framework ;
3
+ using static Box2D . NET . B2MathFunction ;
4
+ using System ;
5
+
6
+ namespace Box2D . NET . Test ;
7
+
8
+ public class B2RotTest
9
+ {
10
+ [ Test ]
11
+ public void Test_B2Rot_Constructor ( )
12
+ {
13
+ var rot = b2MakeRot ( B2_PI / 4 ) ;
14
+ Assert . That ( rot . c , Is . EqualTo ( MathF . Cos ( B2_PI / 4 ) ) . Within ( FLT_EPSILON ) , "Cosine of 45 degrees should match MathF.Cos" ) ;
15
+ Assert . That ( rot . s , Is . EqualTo ( MathF . Sin ( B2_PI / 4 ) ) . Within ( FLT_EPSILON ) , "Sine of 45 degrees should match MathF.Sin" ) ;
16
+
17
+ var zeroRot = b2MakeRot ( 0.0f ) ;
18
+ Assert . That ( zeroRot . c , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Cosine of 0 degrees should be 1" ) ;
19
+ Assert . That ( zeroRot . s , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "Sine of 0 degrees should be 0" ) ;
20
+ }
21
+
22
+ [ Test ]
23
+ public void Test_B2Rot_Normalization ( )
24
+ {
25
+ var rot = new B2Rot ( 2.0f , 0.0f ) ;
26
+ var norm = b2NormalizeRot ( rot ) ;
27
+ Assert . That ( norm . c , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Normalized cosine should be 1" ) ;
28
+ Assert . That ( norm . s , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "Normalized sine should be 0" ) ;
29
+ Assert . That ( norm . c * norm . c + norm . s * norm . s , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Normalized rotation should have unit length" ) ;
30
+ }
31
+
32
+ [ Test ]
33
+ public void Test_B2Rot_VectorRotation ( )
34
+ {
35
+ var rot = b2MakeRot ( B2_PI / 2 ) ;
36
+ var vec = new B2Vec2 ( 1.0f , 0.0f ) ;
37
+ var result = b2RotateVector ( rot , vec ) ;
38
+ Assert . That ( result . X , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation should map (1,0) to (0,1)" ) ;
39
+ Assert . That ( result . Y , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation should map (1,0) to (0,1)" ) ;
40
+ }
41
+
42
+ [ Test ]
43
+ public void Test_B2Rot_Integration ( )
44
+ {
45
+ var rot = b2MakeRot ( 0.0f ) ;
46
+ float deltaAngle = B2_PI / 2 ;
47
+ var result = b2IntegrateRotation ( rot , deltaAngle ) ;
48
+ float expectedMag = MathF . Sqrt ( 1.0f + ( B2_PI / 2 ) * ( B2_PI / 2 ) ) ;
49
+ float expectedC = 1.0f / expectedMag ;
50
+ float expectedS = ( B2_PI / 2 ) / expectedMag ;
51
+ Assert . That ( result . c , Is . EqualTo ( expectedC ) . Within ( 0.0001f ) , "Integrated rotation cosine should match expected value" ) ;
52
+ Assert . That ( result . s , Is . EqualTo ( expectedS ) . Within ( 0.0001f ) , "Integrated rotation sine should match expected value" ) ;
53
+ Assert . That ( result . c * result . c + result . s * result . s , Is . EqualTo ( 1.0f ) . Within ( 0.0001f ) , "Integrated rotation should remain normalized" ) ;
54
+ }
55
+
56
+ [ Test ]
57
+ public void Test_B2Rot_Multiplication ( )
58
+ {
59
+ var rot1 = b2MakeRot ( B2_PI / 4 ) ;
60
+ var rot2 = b2MakeRot ( B2_PI / 4 ) ;
61
+ var result = b2MulRot ( rot1 , rot2 ) ;
62
+ Assert . That ( result . c , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "Multiplying two 45-degree rotations should give 90 degrees" ) ;
63
+ Assert . That ( result . s , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Multiplying two 45-degree rotations should give 90 degrees" ) ;
64
+ }
65
+
66
+ [ Test ]
67
+ public void Test_B2Rot_Validation ( )
68
+ {
69
+ var validRot = b2MakeRot ( B2_PI / 4 ) ;
70
+ Assert . That ( b2IsValidRotation ( validRot ) , Is . True , "Normalized rotation should be valid" ) ;
71
+
72
+ var invalidRot = new B2Rot ( 2.0f , 0.0f ) ;
73
+ Assert . That ( b2IsValidRotation ( invalidRot ) , Is . False , "Non-normalized rotation should be invalid" ) ;
74
+
75
+ var nanRot = new B2Rot ( float . NaN , 0.0f ) ;
76
+ Assert . That ( b2IsValidRotation ( nanRot ) , Is . False , "Rotation with NaN should be invalid" ) ;
77
+ }
78
+
79
+ [ Test ]
80
+ public void Test_B2Rot_GetAngle ( )
81
+ {
82
+ var rot = b2MakeRot ( B2_PI / 4 ) ;
83
+ Assert . That ( b2Rot_GetAngle ( rot ) , Is . EqualTo ( B2_PI / 4 ) . Within ( 0.0001f ) , "GetAngle should return the original angle" ) ;
84
+ }
85
+
86
+ [ Test ]
87
+ public void Test_B2Rot_GetAxes ( )
88
+ {
89
+ var rot = b2MakeRot ( B2_PI / 2 ) ;
90
+ var xAxis = b2Rot_GetXAxis ( rot ) ;
91
+ var yAxis = b2Rot_GetYAxis ( rot ) ;
92
+ Assert . That ( xAxis . X , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation X-axis should point up" ) ;
93
+ Assert . That ( xAxis . Y , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation X-axis should point up" ) ;
94
+ Assert . That ( yAxis . X , Is . EqualTo ( - 1.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation Y-axis should point left" ) ;
95
+ Assert . That ( yAxis . Y , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "90-degree rotation Y-axis should point left" ) ;
96
+ }
97
+
98
+ [ Test ]
99
+ public void Test_B2Rot_InvMulRot ( )
100
+ {
101
+ var rot1 = b2MakeRot ( B2_PI / 4 ) ;
102
+ var rot2 = b2MakeRot ( B2_PI / 4 ) ;
103
+ var result = b2InvMulRot ( rot1 , rot2 ) ;
104
+ Assert . That ( result . c , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Inverse multiplication of same rotations should give identity" ) ;
105
+ Assert . That ( result . s , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "Inverse multiplication of same rotations should give identity" ) ;
106
+ }
107
+
108
+ [ Test ]
109
+ public void Test_B2Rot_RelativeAngle ( )
110
+ {
111
+ var rot1 = b2MakeRot ( 0.0f ) ;
112
+ var rot2 = b2MakeRot ( B2_PI / 2 ) ;
113
+ Assert . That ( b2RelativeAngle ( rot2 , rot1 ) , Is . EqualTo ( B2_PI / 2 ) . Within ( FLT_EPSILON ) , "Relative angle between 0 and 90 degrees should be 90 degrees" ) ;
114
+ }
115
+
116
+ [ Test ]
117
+ public void Test_B2Rot_UnwindAngle ( )
118
+ {
119
+ Assert . That ( b2UnwindAngle ( 3 * B2_PI / 2 ) , Is . EqualTo ( - B2_PI / 2 ) . Within ( FLT_EPSILON ) , "Angle greater than PI should be normalized to [-PI, PI]" ) ;
120
+ Assert . That ( b2UnwindAngle ( - 3 * B2_PI / 2 ) , Is . EqualTo ( B2_PI / 2 ) . Within ( FLT_EPSILON ) , "Angle less than -PI should be normalized to [-PI, PI]" ) ;
121
+ Assert . That ( b2UnwindAngle ( B2_PI ) , Is . EqualTo ( B2_PI ) . Within ( FLT_EPSILON ) , "PI should remain unchanged" ) ;
122
+ Assert . That ( b2UnwindAngle ( - B2_PI ) , Is . EqualTo ( - B2_PI ) . Within ( FLT_EPSILON ) , "-PI should remain unchanged" ) ;
123
+ }
124
+
125
+ [ Test ]
126
+ public void Test_B2Rot_UnwindLargeAngle ( )
127
+ {
128
+ Assert . That ( b2UnwindLargeAngle ( 5 * B2_PI ) , Is . EqualTo ( B2_PI ) . Within ( 0.0001f ) , "Large angle should be normalized to [-PI, PI]" ) ;
129
+ Assert . That ( b2UnwindLargeAngle ( - 5 * B2_PI ) , Is . EqualTo ( - B2_PI ) . Within ( 0.0001f ) , "Large negative angle should be normalized to [-PI, PI]" ) ;
130
+ }
131
+
132
+ [ Test ]
133
+ public void Test_B2Rot_InvRotateVector ( )
134
+ {
135
+ var rot = b2MakeRot ( B2_PI / 2 ) ;
136
+ var vec = new B2Vec2 ( 0.0f , 1.0f ) ;
137
+ var result = b2InvRotateVector ( rot , vec ) ;
138
+ Assert . That ( result . X , Is . EqualTo ( 1.0f ) . Within ( FLT_EPSILON ) , "Inverse rotation should map (0,1) back to (1,0)" ) ;
139
+ Assert . That ( result . Y , Is . EqualTo ( 0.0f ) . Within ( FLT_EPSILON ) , "Inverse rotation should map (0,1) back to (1,0)" ) ;
140
+ }
141
+ }
0 commit comments