2
0

utcvector.pp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2023 by Michael Van Canneyt
  4. member of the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit utcvector;
  12. {$mode ObjFPC}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testregistry, types, utmathvectorbase, system.math.vectors;
  16. Type
  17. { TTestVector }
  18. TTestVector = class(TCMathVectorsBase)
  19. Private
  20. FV : Array[1..3] of TVector;
  21. procedure ClearVectors;
  22. function GetV(AIndex: Integer): TVector;
  23. procedure SetV(AIndex: Integer; AValue: TVector);
  24. Protected
  25. procedure SetUp; override;
  26. procedure TearDown; override;
  27. Property V1 : TVector Index 1 Read GetV Write SetV;
  28. Property V2 : TVector Index 2 Read GetV Write SetV;
  29. Property V3 : TVector Index 3 Read GetV Write SetV;
  30. Published
  31. procedure TestHookUp;
  32. Procedure TestZero;
  33. Procedure TestCreate;
  34. Procedure TestCreateW;
  35. Procedure TestAssign;
  36. Procedure TestAssignPointf;
  37. Procedure TestAssignToPointf;
  38. Procedure TestAdd;
  39. Procedure TestMultiplyFactor;
  40. Procedure TestDivide;
  41. Procedure TestEqual;
  42. Procedure TestNotEqual;
  43. Procedure TestSubtract;
  44. Procedure TestLength;
  45. Procedure TestNormalize;
  46. Procedure TestCrossProduct;
  47. Procedure TestDotProduct;
  48. Procedure TestToPointF;
  49. end;
  50. implementation
  51. { TTestVector }
  52. function TTestVector.GetV(AIndex: Integer): TVector;
  53. begin
  54. Result:=FV[aIndex];
  55. end;
  56. procedure TTestVector.SetV(AIndex: Integer; AValue: TVector);
  57. begin
  58. FV[aIndex]:=aValue;
  59. end;
  60. procedure TTestVector.ClearVectors;
  61. var
  62. I : integer;
  63. begin
  64. For I:=1 to 3 do
  65. begin
  66. FV[I].X:=0;
  67. FV[I].Y:=0;
  68. FV[I].W:=0;
  69. end;
  70. end;
  71. procedure TTestVector.SetUp;
  72. begin
  73. inherited SetUp;
  74. ClearVectors;
  75. end;
  76. procedure TTestVector.TearDown;
  77. begin
  78. inherited TearDown;
  79. end;
  80. procedure TTestVector.TestHookUp;
  81. var
  82. I : Integer;
  83. begin
  84. For I:=1 to 3 do
  85. begin
  86. AssertEquals('Vector '+intTostr(i)+'.X',0.0,FV[I].X);
  87. AssertEquals('Vector '+intTostr(i)+'.Y',0.0,FV[I].Y);
  88. AssertEquals('Vector '+intTostr(i)+'.W',0.0,FV[I].W);
  89. end;
  90. end;
  91. procedure TTestVector.TestZero;
  92. begin
  93. V1:=TVector.Zero;
  94. AssertEquals('Vector.X',0.0,V1.X);
  95. AssertEquals('Vector.Y',0.0,V1.Y);
  96. AssertEquals('Vector.W',0.0,V1.W);
  97. end;
  98. procedure TTestVector.TestCreate;
  99. begin
  100. V1:=TVector.Create(1,2);
  101. AssertEquals('Vector.X',1.0,V1.X);
  102. AssertEquals('Vector.Y',2.0,V1.Y);
  103. AssertEquals('Vector.W',DefaultVectorWidth,V1.W);
  104. end;
  105. procedure TTestVector.TestCreateW;
  106. begin
  107. V1:=TVector.Create(1,2,3);
  108. AssertVector('Vector',1,2,3,V1);
  109. end;
  110. procedure TTestVector.TestAssign;
  111. begin
  112. V2:=TVector.Create(1,2,3);
  113. V1:=V2;
  114. AssertVector('Assign',1,2,3,V1);
  115. end;
  116. procedure TTestVector.TestAssignPointf;
  117. var
  118. P : TPointF;
  119. begin
  120. P:=PointF(1,2);
  121. V1:=P;
  122. AssertVector('Vector',1,2,DefaultVectorWidth,V1);
  123. end;
  124. procedure TTestVector.TestAssignToPointf;
  125. Var
  126. P : TPointF;
  127. begin
  128. V1:=TVector.Create(1,2,3);
  129. P:=V1;
  130. AssertEquals('Assign 1',PointF(0.3333,0.6666),P);
  131. V1:=TVector.Create(1,2,1);
  132. P:=V1;
  133. AssertEquals('Assign 2',PointF(1,2),P);
  134. V1:=TVector.Create(1,2,0);
  135. P:=V1;
  136. AssertEquals('Assign 3',PointF(1,2),P);
  137. end;
  138. procedure TTestVector.TestAdd;
  139. begin
  140. V1:=TVector.Create(1,2,3);
  141. V2:=TVector.Create(6,5,4);
  142. V3:=V1+V2;
  143. AssertVector('Vector',7,7,7,V3);
  144. end;
  145. procedure TTestVector.TestMultiplyFactor;
  146. begin
  147. V1:=TVector.Create(1,2,3);
  148. V2:=V1*3;
  149. AssertVector('Vector 1',3,6,9,V2);
  150. V2:=3*V1;
  151. AssertVector('Vector 2',3,6,9,V2);
  152. end;
  153. procedure TTestVector.TestDivide;
  154. begin
  155. V1:=TVector.Create(1,2,3);
  156. V2:=V1/3;
  157. AssertVector('Vector 1',0.3333,0.6666,1,V2);
  158. end;
  159. procedure TTestVector.TestEqual;
  160. begin
  161. V1:=TVector.Create(1,2,3);
  162. V2:=TVector.Create(1,2,3);
  163. AssertTrue('Equal 1',V1=V2);
  164. V2:=TVector.Create(3,2,1);
  165. AssertFalse('Equal 2',V1=V2);
  166. V2:=TVector.Create(1+TEpsilon.Vector*0.99,2,3);
  167. AssertTrue('Equal within precision',V1=V2);
  168. V2:=TVector.Create(1+TEpsilon.Vector*1.1,2,3);
  169. AssertFalse('Unequal outside precision',V1=V2);
  170. end;
  171. procedure TTestVector.TestNotEqual;
  172. begin
  173. V1:=TVector.Create(1,2,3);
  174. V2:=TVector.Create(1,2,3);
  175. AssertFalse('Not Equal',V1<>V2);
  176. V2:=TVector.Create(3,2,1);
  177. AssertTrue('Equal',V1<>V2);
  178. V2:=TVector.Create(1+TEpsilon.Vector*0.99,2,3);
  179. AssertFalse('Equal within precision',V1<>V2);
  180. V2:=TVector.Create(1+TEpsilon.Vector*1.1,2,3);
  181. AssertTrue('Unequal outside precision',V1<>V2);
  182. end;
  183. procedure TTestVector.TestSubtract;
  184. begin
  185. V1:=TVector.Create(1,2,3);
  186. V2:=TVector.Create(6,5,4);
  187. V3:=V2-V1;
  188. AssertVector('Vector',5,3,1,V3);
  189. end;
  190. procedure TTestVector.TestLength;
  191. begin
  192. V1:=TVector.Create(3,4,0);
  193. AssertEquals('Length 1',5,V1.Length);
  194. V1:=TVector.Create(3,4,1);
  195. AssertEquals('Length 1',Sqrt(26),V1.Length,TEpsilon.Vector);
  196. end;
  197. procedure TTestVector.TestNormalize;
  198. begin
  199. V1:=TVector.Create(3,4,0);
  200. V2:=V1.Normalize;
  201. AssertVector('No width',3/5,4/5,0,V2);
  202. AssertEquals('Length 1',1,V2.Length,TEpsilon.Vector);
  203. V1:=TVector.Create(3,4,1);
  204. V2:=V1.Normalize;
  205. AssertVector('No width',3/Sqrt(26),4/Sqrt(26),1/Sqrt(26),V2);
  206. AssertEquals('Length 1',1,V2.Length,TEpsilon.Vector);
  207. end;
  208. procedure TTestVector.TestCrossProduct;
  209. begin
  210. V1:=TVector.Create(1,1,0);
  211. V2:=TVector.Create(2,2,0);
  212. V3:=V2.CrossProduct(V1);
  213. AssertVector('T1',0,0,0,V3);
  214. V1:=TVector.Create(1,1,0);
  215. V2:=TVector.Create(2,2,0);
  216. V3:=V2.CrossProduct(V1);
  217. AssertVector('T1',0,0,0,V3);
  218. end;
  219. procedure TTestVector.TestDotProduct;
  220. begin
  221. V1:=TVector.Create(3,4,9);
  222. V2:=TVector.Create(3,4,9);
  223. AssertEquals('Test 1',9+16+81,V1.DotProduct(V2));
  224. V2:=TVector.Create(1,1,0);
  225. AssertEquals('Test 1',7,V1.DotProduct(V2));
  226. end;
  227. procedure TTestVector.TestToPointF;
  228. var
  229. P : TPointF;
  230. begin
  231. V1:=TVector.Create(1,2,3);
  232. P:=V1.ToPointF;
  233. AssertEquals('ToPointF 1',PointF(0.3333,0.6666),P);
  234. V1:=TVector.Create(1,2,1);
  235. P:=V1.ToPointF;
  236. AssertEquals('ToPointF 2',PointF(1,2),P);
  237. end;
  238. initialization
  239. RegisterTest(TTestVector);
  240. end.