v2math_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:12k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file v2math_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-02
  5.  * @brief v2math test cases.
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "../test/lltut.h" 
  36. #include "../v2math.h"
  37. namespace tut
  38. {
  39. struct v2math_data
  40. {
  41. };
  42. typedef test_group<v2math_data> v2math_test;
  43. typedef v2math_test::object v2math_object;
  44. tut::v2math_test v2math_testcase("v2math");
  45. template<> template<>
  46. void v2math_object::test<1>()
  47. {
  48. LLVector2 vec2;
  49. ensure("LLVector2:Fail to initialize ", (0.f == vec2.mV[VX] && 0.f == vec2.mV[VY]));
  50. F32 x =2.0f, y = 3.2f ;
  51. LLVector2 vec3(x,y);
  52. ensure("LLVector2(F32 x, F32 y):Fail to initialize ", (x == vec3.mV[VX]) && (y == vec3.mV[VY]));
  53. const F32 vec[2] = {3.2f, 4.5f};
  54. LLVector2 vec4(vec);
  55. ensure("LLVector2(const F32 *vec):Fail to initialize ", (vec[0] == vec4.mV[VX]) && (vec[1] == vec4.mV[VY]));
  56. vec4.clearVec();
  57. ensure("clearVec():Fail to clean the values ", (0.f == vec4.mV[VX] && 0.f == vec4.mV[VY]));
  58. vec3.zeroVec();
  59. ensure("zeroVec():Fail to fill the zero ", (0.f == vec3.mV[VX] && 0.f == vec3.mV[VY]));
  60. }
  61. template<> template<>
  62. void v2math_object::test<2>()
  63. {
  64. F32 x = 123.356f, y = 2387.453f;
  65. LLVector2 vec2,vec3;
  66. vec2.setVec(x, y);
  67. ensure("1:setVec: Fail  ", (x == vec2.mV[VX]) && (y == vec2.mV[VY]));
  68. vec3.setVec(vec2);
  69. ensure("2:setVec: Fail   " ,(vec2 == vec3));
  70. vec3.zeroVec();
  71. const F32 vec[2] = {3.24653f, 457653.4f};
  72. vec3.setVec(vec);
  73. ensure("3:setVec: Fail  ", (vec[0] == vec3.mV[VX]) && (vec[1] == vec3.mV[VY]));
  74. }
  75. template<> template<>
  76. void v2math_object::test<3>()
  77. {
  78. F32 x = 2.2345f, y = 3.5678f ;
  79. LLVector2 vec2(x,y);
  80. ensure("magVecSquared:Fail ", is_approx_equal(vec2.magVecSquared(), (x*x + y*y)));
  81. ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), fsqrtf(x*x + y*y)));
  82. }
  83. template<> template<>
  84. void v2math_object::test<4>()
  85. {
  86. F32 x =-2.0f, y = -3.0f ;
  87. LLVector2 vec2(x,y);
  88. ensure_equals("abs():Fail", vec2.abs(), TRUE);
  89. ensure("abs() x", is_approx_equal(vec2.mV[VX], 2.f));
  90. ensure("abs() y", is_approx_equal(vec2.mV[VY], 3.f));
  91. ensure("isNull():Fail ", FALSE == vec2.isNull()); //Returns TRUE if vector has a _very_small_ length
  92. x =.00000001f, y = .000001001f;
  93. vec2.setVec(x, y);
  94. ensure("isNull(): Fail ", TRUE == vec2.isNull());
  95. }
  96. template<> template<>
  97. void v2math_object::test<5>()
  98. {
  99. F32 x =1.f, y = 2.f;
  100. LLVector2 vec2(x, y), vec3;
  101. vec3 = vec3.scaleVec(vec2);
  102. ensure("scaleVec: Fail ", vec3.mV[VX] == 0. && vec3.mV[VY] == 0.);
  103. ensure("isExactlyZero(): Fail", TRUE == vec3.isExactlyZero());
  104. vec3.setVec(2.f, 1.f);
  105. vec3 = vec3.scaleVec(vec2);
  106. ensure("scaleVec: Fail ", (2.f == vec3.mV[VX]) && (2.f == vec3.mV[VY]));
  107. ensure("isExactlyZero():Fail", FALSE == vec3.isExactlyZero());
  108. }
  109. template<> template<>
  110. void v2math_object::test<6>()
  111. {
  112. F32 x1 =1.f, y1 = 2.f, x2 = -2.3f, y2 = 1.11f;
  113. F32 val1, val2;
  114. LLVector2 vec2(x1, y1), vec3(x2, y2), vec4;
  115. vec4 = vec2 + vec3 ;
  116. val1 = x1+x2;
  117. val2 = y1+y2;
  118. ensure("1:operator+ failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY]))); 
  119. vec2.clearVec();
  120. vec3.clearVec();
  121. x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f;
  122. vec2.setVec(x1, y1);
  123. vec3.setVec(x2, y2);
  124. vec4 = vec2 + vec3;
  125. val1 = x1+x2;
  126. val2 = y1+y2;
  127. ensure("2:operator+ failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY]))); 
  128. }
  129. template<> template<>
  130. void v2math_object::test<7>()
  131. {
  132. F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f;
  133. F32 val1, val2;
  134. LLVector2 vec2(x1, y1), vec3(x2, y2), vec4;
  135. vec4 = vec2 - vec3 ;
  136. val1 = x1-x2;
  137. val2 = y1-y2;
  138. ensure("1:operator- failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY]))); 
  139. vec2.clearVec();
  140. vec3.clearVec();
  141. vec4.clearVec();
  142. x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f;
  143. vec2.setVec(x1, y1);
  144. vec3.setVec(x2, y2);
  145. vec4 = vec2 - vec3;
  146. val1 = x1-x2;
  147. val2 = y1-y2;
  148. ensure("2:operator- failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY]))); 
  149. }
  150. template<> template<>
  151. void v2math_object::test<8>()
  152. {
  153. F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f;
  154. F32 val1, val2;
  155. LLVector2 vec2(x1, y1), vec3(x2, y2);
  156. val1 = vec2 * vec3;
  157. val2 = x1*x2 + y1*y2;
  158. ensure("1:operator* failed",(val1 == val2));
  159. vec3.clearVec();
  160. F32 mulVal = 4.332f;
  161. vec3 = vec2 * mulVal;
  162. val1 = x1*mulVal;
  163. val2 = y1*mulVal;
  164. ensure("2:operator* failed",(val1 == vec3.mV[VX]) && (val2 == vec3.mV[VY]));
  165. vec3.clearVec();
  166. vec3 = mulVal * vec2;
  167. ensure("3:operator* failed",(val1 == vec3.mV[VX]) && (val2 == vec3.mV[VY]));
  168. }
  169. template<> template<>
  170. void v2math_object::test<9>()
  171. {
  172. F32 x1 =1.f, y1 = 2.f, div = 3.2f;
  173. F32 val1, val2;
  174. LLVector2 vec2(x1, y1), vec3;
  175. vec3 = vec2 / div;
  176. val1 = x1 / div;
  177. val2 = y1 / div;
  178. ensure("1:operator/ failed", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]));
  179. vec3.clearVec();
  180. x1 = -.235f, y1 = -24.32f, div = -2.2f;
  181. vec2.setVec(x1, y1);
  182. vec3 = vec2 / div;
  183. val1 = x1 / div;
  184. val2 = y1 / div;
  185. ensure("2:operator/ failed", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]));
  186. }
  187. template<> template<>
  188. void v2math_object::test<10>()
  189. {
  190. F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f;
  191. F32 val1, val2;
  192. LLVector2 vec2(x1, y1), vec3(x2, y2), vec4;
  193. vec4 = vec2 % vec3;
  194. val1 = x1*y2 - x2*y1;
  195. val2 = y1*x2 - y2*x1;
  196. ensure("1:operator% failed",(val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY]));
  197. vec2.clearVec();
  198. vec3.clearVec();
  199. vec4.clearVec();
  200. x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f;
  201. vec2.setVec(x1, y1);
  202. vec3.setVec(x2, y2);
  203. vec4 = vec2 % vec3;
  204. val1 = x1*y2 - x2*y1;
  205. val2 = y1*x2 - y2*x1;
  206. ensure("2:operator% failed",(val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY]));
  207. }
  208. template<> template<>
  209. void v2math_object::test<11>()
  210. {
  211. F32 x1 =1.f, y1 = 2.f;
  212. LLVector2 vec2(x1, y1), vec3(x1, y1);
  213. ensure("1:operator== failed",(vec2 == vec3));
  214. vec2.clearVec();
  215. vec3.clearVec();
  216. x1 = -.235f, y1 = -24.32f;
  217. vec2.setVec(x1, y1);
  218. vec3.setVec(vec2);
  219. ensure("2:operator== failed",(vec2 == vec3));
  220. }
  221. template<> template<>
  222. void v2math_object::test<12>()
  223. {
  224. F32 x1 = 1.f, y1 = 2.f,x2 = 2.332f, y2 = -1.23f;
  225. LLVector2 vec2(x1, y1), vec3(x2, y2);
  226. ensure("1:operator!= failed",(vec2 != vec3));
  227. vec2.clearVec();
  228. vec3.clearVec();
  229. vec2.setVec(x1, y1);
  230. vec3.setVec(vec2);
  231. ensure("2:operator!= failed", (FALSE == (vec2 != vec3)));
  232. }
  233. template<> template<>
  234. void v2math_object::test<13>()
  235. {
  236. F32 x1 = 1.f, y1 = 2.f,x2 = 2.332f, y2 = -1.23f;
  237. F32 val1, val2;
  238. LLVector2 vec2(x1, y1), vec3(x2, y2);
  239. vec2 +=vec3;
  240. val1 = x1+x2;
  241. val2 = y1+y2;
  242. ensure("1:operator+= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  243. vec2.setVec(x1, y1);
  244. vec2 -=vec3;
  245. val1 = x1-x2;
  246. val2 = y1-y2;
  247. ensure("2:operator-= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  248. vec2.clearVec();
  249. vec3.clearVec();
  250. x1 = -21.000466f, y1 = 2.98382f,x2 = 0.332f, y2 = -01.23f;
  251. vec2.setVec(x1, y1);
  252. vec3.setVec(x2, y2);
  253. vec2 +=vec3;
  254. val1 = x1+x2;
  255. val2 = y1+y2;
  256. ensure("3:operator+= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  257. vec2.setVec(x1, y1);
  258. vec2 -=vec3;
  259. val1 = x1-x2;
  260. val2 = y1-y2;
  261. ensure("4:operator-= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY]));
  262. }
  263. template<> template<>
  264. void v2math_object::test<14>()
  265. {
  266. F32 x1 =1.f, y1 = 2.f;
  267. F32 val1, val2, mulVal = 4.332f;
  268. LLVector2 vec2(x1, y1);
  269. vec2 /=mulVal;
  270. val1 = x1 / mulVal;
  271. val2 = y1 / mulVal;
  272. ensure("1:operator/= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY]));
  273. vec2.clearVec();
  274. x1 = .213f, y1 = -2.34f, mulVal = -.23f;
  275. vec2.setVec(x1, y1);
  276. vec2 /=mulVal;
  277. val1 = x1 / mulVal;
  278. val2 = y1 / mulVal;
  279. ensure("2:operator/= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY]));
  280. }
  281. template<> template<>
  282. void v2math_object::test<15>()
  283. {
  284. F32 x1 =1.f, y1 = 2.f;
  285. F32 val1, val2, mulVal = 4.332f;
  286. LLVector2 vec2(x1, y1);
  287. vec2 *=mulVal;
  288. val1 = x1*mulVal;
  289. val2 = y1*mulVal;
  290. ensure("1:operator*= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  291. vec2.clearVec();
  292. x1 = .213f, y1 = -2.34f, mulVal = -.23f;
  293. vec2.setVec(x1, y1);
  294. vec2 *=mulVal;
  295. val1 = x1*mulVal;
  296. val2 = y1*mulVal;
  297. ensure("2:operator*= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  298. }
  299. template<> template<>
  300. void v2math_object::test<16>()
  301. {
  302. F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f;
  303. F32 val1, val2;
  304. LLVector2 vec2(x1, y1), vec3(x2, y2);
  305. vec2 %= vec3;
  306. val1 = x1*y2 - x2*y1;
  307. val2 = y1*x2 - y2*x1;
  308. ensure("1:operator%= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));
  309. }
  310. template<> template<>
  311. void v2math_object::test<17>()
  312. {
  313. F32 x1 =1.f, y1 = 2.f;
  314. LLVector2 vec2(x1, y1),vec3;
  315. vec3 = -vec2;
  316. ensure("1:operator- failed",(-vec3 == vec2));
  317. }
  318. template<> template<>
  319. void v2math_object::test<18>()
  320. {
  321. F32 x1 =1.f, y1 = 2.f;
  322. std::ostringstream stream1, stream2;
  323. LLVector2 vec2(x1, y1),vec3;
  324. stream1 << vec2;
  325. vec3.setVec(x1, y1);
  326. stream2 << vec3;
  327. ensure("1:operator << failed",(stream1.str() == stream2.str()));
  328. }
  329. template<> template<>
  330. void v2math_object::test<19>()
  331. {
  332. F32 x1 =1.0f, y1 = 2.0f, x2 = -.32f, y2 = .2234f;
  333. LLVector2 vec2(x1, y1),vec3(x2, y2);
  334. ensure("1:operator < failed",(vec3 < vec2));
  335. x1 = 1.0f, y1 = 2.0f, x2 = 1.0f, y2 = 3.2234f;
  336. vec2.setVec(x1, y1);
  337. vec3.setVec(x2, y2);
  338. ensure("2:operator < failed", (FALSE == (vec3 < vec2)));
  339. }
  340. template<> template<>
  341. void v2math_object::test<20>()
  342. {
  343. F32 x1 =1.0f, y1 = 2.0f;
  344. LLVector2 vec2(x1, y1);
  345. ensure("1:operator [] failed",( x1 ==  vec2[0]));
  346. ensure("2:operator [] failed",( y1 ==  vec2[1]));
  347. vec2.clearVec();
  348. x1 = 23.0f, y1 = -.2361f;
  349. vec2.setVec(x1, y1);
  350. F32 ref1 = vec2[0];
  351. ensure("3:operator [] failed", ( ref1 ==  x1));
  352. F32 ref2 = vec2[1];
  353. ensure("4:operator [] failed", ( ref2 ==  y1));
  354. }
  355. template<> template<>
  356. void v2math_object::test<21>()
  357. {
  358. F32 x1 =1.f, y1 = 2.f, x2 = -.32f, y2 = .2234f;
  359. F32 val1, val2;
  360. LLVector2 vec2(x1, y1),vec3(x2, y2);
  361. val1 = dist_vec_squared2D(vec2, vec3);
  362. val2 = (x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2);
  363. ensure_equals("dist_vec_squared2D values are not equal",val2, val1);
  364. val1 = dist_vec_squared(vec2, vec3);
  365. ensure_equals("dist_vec_squared values are not equal",val2, val1);
  366. val1 =  dist_vec(vec2, vec3);
  367. val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
  368. ensure_equals("dist_vec values are not equal",val2, val1);
  369. }
  370. template<> template<>
  371. void v2math_object::test<22>()
  372. {
  373. F32 x1 =1.f, y1 = 2.f, x2 = -.32f, y2 = .2234f,fVal = .0121f;
  374. F32 val1, val2;
  375. LLVector2 vec2(x1, y1),vec3(x2, y2);
  376. LLVector2 vec4 = lerp(vec2, vec3, fVal);
  377. val1 = x1 + (x2 - x1) * fVal;
  378. val2 = y1 + (y2 - y1) * fVal;
  379. ensure("lerp values are not equal", ((val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY])));
  380. }
  381. template<> template<>
  382. void v2math_object::test<23>()
  383. {
  384. F32 x1 =1.f, y1 = 2.f;
  385. F32 val1, val2;
  386. LLVector2 vec2(x1, y1);
  387. F32 vecMag = vec2.normVec();
  388. F32 mag = fsqrtf(x1*x1 + y1*y1);
  389. F32 oomag = 1.f / mag;
  390. val1 = x1 * oomag;
  391. val2 = y1 * oomag;
  392. ensure("normVec failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY]) && is_approx_equal(vecMag, mag));
  393. x1 =.00000001f, y1 = 0.f;
  394. vec2.setVec(x1, y1);
  395. vecMag = vec2.normVec();
  396. ensure("normVec failed should be 0.", 0. == vec2.mV[VX] && 0. == vec2.mV[VY] && vecMag == 0.);
  397. }
  398. }