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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   llrect_test.cpp
  3.  * @author Martin Reddy
  4.  * @date   2009-06-25
  5.  * @brief  Test for llrect.cpp.
  6.  * 
  7.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2009-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 "../llrect.h"
  37. namespace tut
  38. {
  39. struct LLRectData
  40. {
  41. };
  42. typedef test_group<LLRectData> factory;
  43. typedef factory::object object;
  44. }
  45. namespace
  46. {
  47. tut::factory llrect_test_factory("LLRect");
  48. }
  49. namespace tut
  50. {
  51. template<> template<>
  52. void object::test<1>()
  53. {
  54. //
  55. // test the LLRect default constructor
  56. //
  57. LLSD zero;
  58. zero.append(0); zero.append(0); zero.append(0); zero.append(0);
  59. // default constructor
  60. LLRect rect1;
  61. ensure_equals("Empty rect", rect1.getValue(), zero);
  62. ensure_equals("Empty rect left", rect1.mLeft, 0);
  63. ensure_equals("Empty rect top", rect1.mTop, 0);
  64. ensure_equals("Empty rect right", rect1.mRight, 0);
  65. ensure_equals("Empty rect bottom", rect1.mBottom, 0);
  66. ensure_equals("Empty rect width", rect1.getWidth(), 0);
  67. ensure_equals("Empty rect height", rect1.getHeight(), 0);
  68. ensure_equals("Empty rect centerx", rect1.getCenterX(), 0);
  69. ensure_equals("Empty rect centery", rect1.getCenterY(), 0);
  70. }
  71. template<> template<>
  72. void object::test<2>()
  73. {
  74. //
  75. // test the LLRectf default constructor
  76. //
  77. LLSD zerof;
  78. zerof.append(0.0f); zerof.append(0.0f); zerof.append(0.0f); zerof.append(0.0f);
  79. LLRectf rect2;
  80. ensure_equals("Empty rectf", rect2.getValue(), zerof);
  81. ensure_equals("Empty rectf left", rect2.mLeft, 0.0f);
  82. ensure_equals("Empty rectf top", rect2.mTop, 0.0f);
  83. ensure_equals("Empty rectf right", rect2.mRight, 0.0f);
  84. ensure_equals("Empty rectf bottom", rect2.mBottom, 0.0f);
  85. ensure_equals("Empty rectf width", rect2.getWidth(), 0.0f);
  86. ensure_equals("Empty rectf height", rect2.getHeight(), 0.0f);
  87. ensure_equals("Empty rectf centerx", rect2.getCenterX(), 0.0f);
  88. ensure_equals("Empty rectf centery", rect2.getCenterY(), 0.0f);
  89. }
  90. template<> template<>
  91. void object::test<3>()
  92. {
  93. //
  94. // test the LLRect constructor from another LLRect
  95. //
  96. LLRect rect3(LLRect(1, 6, 7, 2));
  97. ensure_equals("Default rect left", rect3.mLeft, 1);
  98. ensure_equals("Default rect top", rect3.mTop, 6);
  99. ensure_equals("Default rect right", rect3.mRight, 7);
  100. ensure_equals("Default rect bottom", rect3.mBottom, 2);
  101. ensure_equals("Default rect width", rect3.getWidth(), 6);
  102. ensure_equals("Default rect height", rect3.getHeight(), 4);
  103. ensure_equals("Default rect centerx", rect3.getCenterX(), 4);
  104. ensure_equals("Default rect centery", rect3.getCenterY(), 4);
  105. }
  106. template<> template<>
  107. void object::test<4>()
  108. {
  109. //
  110. // test the LLRectf four-float constructor
  111. //
  112. LLRectf rect4(1.0f, 5.0f, 6.0f, 2.0f);
  113. ensure_equals("Default rectf left", rect4.mLeft, 1.0f);
  114. ensure_equals("Default rectf top", rect4.mTop, 5.0f);
  115. ensure_equals("Default rectf right", rect4.mRight, 6.0f);
  116. ensure_equals("Default rectf bottom", rect4.mBottom, 2.0f);
  117. ensure_equals("Default rectf width", rect4.getWidth(), 5.0f);
  118. ensure_equals("Default rectf height", rect4.getHeight(), 3.0f);
  119. ensure_equals("Default rectf centerx", rect4.getCenterX(), 3.5f);
  120. ensure_equals("Default rectf centery", rect4.getCenterY(), 3.5f);
  121. }
  122. template<> template<>
  123. void object::test<5>()
  124. {
  125. //
  126. // test the LLRectf LLSD constructor
  127. //
  128. LLSD array;
  129. array.append(-1.0f); array.append(0.0f); array.append(0.0f); array.append(-1.0f);
  130. LLRectf rect5(array);
  131. ensure_equals("LLSD rectf left", rect5.mLeft, -1.0f);
  132. ensure_equals("LLSD rectf top", rect5.mTop, 0.0f);
  133. ensure_equals("LLSD rectf right", rect5.mRight, 0.0f);
  134. ensure_equals("LLSD rectf bottom", rect5.mBottom, -1.0f);
  135. ensure_equals("LLSD rectf width", rect5.getWidth(), 1.0f);
  136. ensure_equals("LLSD rectf height", rect5.getHeight(), 1.0f);
  137. ensure_equals("LLSD rectf centerx", rect5.getCenterX(), -0.5f);
  138. ensure_equals("LLSD rectf centery", rect5.getCenterY(), -0.5f);
  139. }
  140. template<> template<>
  141. void object::test<6>()
  142. {
  143. //
  144. // test directly setting the member variables for dimensions
  145. //
  146. LLRectf rectf;
  147. rectf.mLeft = -1.0f;
  148. rectf.mTop = 1.0f;
  149. rectf.mRight = 1.0f;
  150. rectf.mBottom = -1.0f;
  151. ensure_equals("Member-set rectf left", rectf.mLeft, -1.0f);
  152. ensure_equals("Member-set rectf top", rectf.mTop, 1.0f);
  153. ensure_equals("Member-set rectf right", rectf.mRight, 1.0f);
  154. ensure_equals("Member-set rectf bottom", rectf.mBottom, -1.0f);
  155. ensure_equals("Member-set rectf width", rectf.getWidth(), 2.0f);
  156. ensure_equals("Member-set rectf height", rectf.getHeight(), 2.0f);
  157. ensure_equals("Member-set rectf centerx", rectf.getCenterX(), 0.0f);
  158. ensure_equals("Member-set rectf centery", rectf.getCenterY(), 0.0f);
  159. }
  160. template<> template<>
  161. void object::test<7>()
  162. {
  163. //
  164. // test the setValue() method
  165. //
  166. LLRectf rectf;
  167. LLSD array;
  168. array.append(-1.0f); array.append(0.0f); array.append(0.0f); array.append(-1.0f);
  169. rectf.setValue(array);
  170. ensure_equals("setValue() rectf left", rectf.mLeft, -1.0f);
  171. ensure_equals("setValue() rectf top", rectf.mTop, 0.0f);
  172. ensure_equals("setValue() rectf right", rectf.mRight, 0.0f);
  173. ensure_equals("setValue() rectf bottom", rectf.mBottom, -1.0f);
  174. ensure_equals("setValue() rectf width", rectf.getWidth(), 1.0f);
  175. ensure_equals("setValue() rectf height", rectf.getHeight(), 1.0f);
  176. ensure_equals("setValue() rectf centerx", rectf.getCenterX(), -0.5f);
  177. ensure_equals("setValue() rectf centery", rectf.getCenterY(), -0.5f);
  178. }
  179. template<> template<>
  180. void object::test<8>()
  181. {
  182. //
  183. // test the set() method
  184. //
  185. LLRect rect;
  186. rect.set(10, 90, 70, 10);
  187. ensure_equals("set() rectf left", rect.mLeft, 10);
  188. ensure_equals("set() rectf top", rect.mTop, 90);
  189. ensure_equals("set() rectf right", rect.mRight, 70);
  190. ensure_equals("set() rectf bottom", rect.mBottom, 10);
  191. ensure_equals("set() rectf width", rect.getWidth(), 60);
  192. ensure_equals("set() rectf height", rect.getHeight(), 80);
  193. ensure_equals("set() rectf centerx", rect.getCenterX(), 40);
  194. ensure_equals("set() rectf centery", rect.getCenterY(), 50);
  195. }
  196. template<> template<>
  197. void object::test<9>()
  198. {
  199. //
  200. // test the setOriginAndSize() method
  201. //
  202. LLRectf rectf;
  203. rectf.setOriginAndSize(0.0f, 0.0f, 2.0f, 1.0f);
  204. ensure_equals("setOriginAndSize() rectf left", rectf.mLeft, 0.0f);
  205. ensure_equals("setOriginAndSize() rectf top", rectf.mTop, 1.0f);
  206. ensure_equals("setOriginAndSize() rectf right", rectf.mRight, 2.0f);
  207. ensure_equals("setOriginAndSize() rectf bottom", rectf.mBottom, 0.0f);
  208. ensure_equals("setOriginAndSize() rectf width", rectf.getWidth(), 2.0f);
  209. ensure_equals("setOriginAndSize() rectf height", rectf.getHeight(), 1.0f);
  210. ensure_equals("setOriginAndSize() rectf centerx", rectf.getCenterX(), 1.0f);
  211. ensure_equals("setOriginAndSize() rectf centery", rectf.getCenterY(), 0.5f);
  212. }
  213. template<> template<>
  214. void object::test<10>()
  215. {
  216. //
  217. // test the setLeftTopAndSize() method
  218. //
  219. LLRectf rectf;
  220. rectf.setLeftTopAndSize(0.0f, 0.0f, 2.0f, 1.0f);
  221. ensure_equals("setLeftTopAndSize() rectf left", rectf.mLeft, 0.0f);
  222. ensure_equals("setLeftTopAndSize() rectf top", rectf.mTop, 0.0f);
  223. ensure_equals("setLeftTopAndSize() rectf right", rectf.mRight, 2.0f);
  224. ensure_equals("setLeftTopAndSize() rectf bottom", rectf.mBottom, -1.0f);
  225. ensure_equals("setLeftTopAndSize() rectf width", rectf.getWidth(), 2.0f);
  226. ensure_equals("setLeftTopAndSize() rectf height", rectf.getHeight(), 1.0f);
  227. ensure_equals("setLeftTopAndSize() rectf centerx", rectf.getCenterX(), 1.0f);
  228. ensure_equals("setLeftTopAndSize() rectf centery", rectf.getCenterY(), -0.5f);
  229. }
  230. template<> template<>
  231. void object::test<11>()
  232. {
  233. //
  234. // test the setCenterAndSize() method
  235. //
  236. LLRectf rectf;
  237. rectf.setCenterAndSize(0.0f, 0.0f, 2.0f, 1.0f);
  238. ensure_equals("setCenterAndSize() rectf left", rectf.mLeft, -1.0f);
  239. ensure_equals("setCenterAndSize() rectf top", rectf.mTop, 0.5f);
  240. ensure_equals("setCenterAndSize() rectf right", rectf.mRight, 1.0f);
  241. ensure_equals("setCenterAndSize() rectf bottom", rectf.mBottom, -0.5f);
  242. ensure_equals("setCenterAndSize() rectf width", rectf.getWidth(), 2.0f);
  243. ensure_equals("setCenterAndSize() rectf height", rectf.getHeight(), 1.0f);
  244. ensure_equals("setCenterAndSize() rectf centerx", rectf.getCenterX(), 0.0f);
  245. ensure_equals("setCenterAndSize() rectf centery", rectf.getCenterY(), 0.0f);
  246. }
  247. template<> template<>
  248. void object::test<12>()
  249. {
  250. //
  251. // test the validity checking method
  252. //
  253. LLRectf rectf;
  254. rectf.set(-1.0f, 1.0f, 1.0f, -1.0f);
  255. ensure("BBox is valid", rectf.isValid());
  256. rectf.mLeft = 2.0f;
  257. ensure("BBox is not valid", ! rectf.isValid());
  258. rectf.makeValid();
  259. ensure("BBox forced valid", rectf.isValid());
  260. rectf.set(-1.0f, -1.0f, -1.0f, -1.0f);
  261. ensure("BBox(0,0,0,0) is valid", rectf.isValid());
  262. }
  263. template<> template<>
  264. void object::test<13>()
  265. {
  266. //
  267. // test the null checking methods
  268. //
  269. LLRectf rectf;
  270. rectf.set(-1.0f, 1.0f, 1.0f, -1.0f);
  271. ensure("BBox is not Null", ! rectf.isEmpty());
  272. ensure("BBox notNull", rectf.notEmpty());
  273. rectf.mLeft = 2.0f;
  274. rectf.makeValid();
  275. ensure("BBox is now Null", rectf.isEmpty());
  276. rectf.set(-1.0f, -1.0f, -1.0f, -1.0f);
  277. ensure("BBox(0,0,0,0) is Null", rectf.isEmpty());
  278. }
  279. template<> template<>
  280. void object::test<14>()
  281. {
  282. //
  283. // test the (in)equality operators
  284. //
  285. LLRectf rect1, rect2;
  286. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  287. rect2.set(-1.0f, 0.9f, 1.0f, -1.0f);
  288. ensure("rect1 == rect2 (false)", ! (rect1 == rect2));
  289. ensure("rect1 != rect2 (true)", rect1 != rect2);
  290. ensure("rect1 == rect1 (true)", rect1 == rect1);
  291. ensure("rect1 != rect1 (false)", ! (rect1 != rect1));
  292. }
  293. template<> template<>
  294. void object::test<15>()
  295. {
  296. //
  297. // test the copy constructor
  298. //
  299. LLRectf rect1, rect2(rect1);
  300. ensure("rect1 == rect2 (true)", rect1 == rect2);
  301. ensure("rect1 != rect2 (false)", ! (rect1 != rect2));
  302. }
  303. template<> template<>
  304. void object::test<16>()
  305. {
  306. //
  307. // test the translate() method
  308. //
  309. LLRectf rect1(-1.0f, 1.0f, 1.0f, -1.0f);
  310. LLRectf rect2(rect1);
  311. rect1.translate(0.0f, 0.0f);
  312. ensure("translate(0, 0)", rect1 == rect2);
  313. rect1.translate(100.0f, 100.0f);
  314. rect1.translate(-100.0f, -100.0f);
  315. ensure("translate(100, 100) + translate(-100, -100)", rect1 == rect2);
  316. rect1.translate(10.0f, 0.0f);
  317. rect2.set(9.0f, 1.0f, 11.0f, -1.0f);
  318. ensure("translate(10, 0)", rect1 == rect2);
  319. rect1.translate(0.0f, 10.0f);
  320. rect2.set(9.0f, 11.0f, 11.0f, 9.0f);
  321. ensure("translate(0, 10)", rect1 == rect2);
  322. rect1.translate(-10.0f, -10.0f);
  323. rect2.set(-1.0f, 1.0f, 1.0f, -1.0f);
  324. ensure("translate(-10, -10)", rect1 == rect2);
  325. }
  326. template<> template<>
  327. void object::test<17>()
  328. {
  329. //
  330. // test the stretch() method
  331. //
  332. LLRectf rect1(-1.0f, 1.0f, 1.0f, -1.0f);
  333. LLRectf rect2(rect1);
  334. rect1.stretch(0.0f);
  335. ensure("stretch(0)", rect1 == rect2);
  336. rect1.stretch(0.0f, 0.0f);
  337. ensure("stretch(0, 0)", rect1 == rect2);
  338. rect1.stretch(10.0f);
  339. rect1.stretch(-10.0f);
  340. ensure("stretch(10) + stretch(-10)", rect1 == rect2);
  341. rect1.stretch(2.0f, 1.0f);
  342. rect2.set(-3.0f, 2.0f, 3.0f, -2.0f);
  343. ensure("stretch(2, 1)", rect1 == rect2);
  344. }
  345. template<> template<>
  346. void object::test<18>()
  347. {
  348. //
  349. // test the unionWith() method
  350. //
  351. LLRectf rect1, rect2, rect3;
  352. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  353. rect2.set(-1.0f, 1.0f, 1.0f, -1.0f);
  354. rect3 = rect1;
  355. rect3.unionWith(rect2);
  356. ensure_equals("union with self", rect3, rect1);
  357. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  358. rect2.set(-2.0f, 2.0f, 0.0f, 0.0f);
  359. rect3 = rect1;
  360. rect3.unionWith(rect2);
  361. ensure_equals("union - overlap", rect3, LLRectf(-2.0f, 2.0f, 1.0f, -1.0f));
  362. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  363. rect2.set(5.0f, 10.0f, 10.0f, 5.0f);
  364. rect3 = rect1;
  365. rect3.unionWith(rect2);
  366. ensure_equals("union - no overlap", rect3, LLRectf(-1.0f, 10.0f, 10.0f, -1.0f));
  367. }
  368. template<> template<>
  369. void object::test<19>()
  370. {
  371. //
  372. // test the intersectWith() methods
  373. //
  374. LLRectf rect1, rect2, rect3;
  375. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  376. rect2.set(-1.0f, 1.0f, 1.0f, -1.0f);
  377. rect3 = rect1;
  378. rect3.intersectWith(rect2);
  379. ensure_equals("intersect with self", rect3, rect1);
  380. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  381. rect2.set(-2.0f, 2.0f, 0.0f, 0.0f);
  382. rect3 = rect1;
  383. rect3.intersectWith(rect2);
  384. ensure_equals("intersect - overlap", rect3, LLRectf(-1.0f, 1.0f, 0.0f, 0.0f));
  385. rect1.set(-1.0f, 1.0f, 1.0f, -1.0f);
  386. rect2.set(5.0f, 10.0f, 10.0f, 5.0f);
  387. rect3 = rect1;
  388. rect3.intersectWith(rect2);
  389. ensure("intersect - no overlap", rect3.isEmpty());
  390. }
  391. template<> template<>
  392. void object::test<20>()
  393. {
  394. //
  395. // test the pointInRect() method
  396. //
  397. LLRectf rect(1.0f, 3.0f, 3.0f, 1.0f);
  398. ensure("(0,0) not in rect", rect.pointInRect(0.0f, 0.0f) == FALSE);
  399. ensure("(2,2) in rect", rect.pointInRect(2.0f, 2.0f) == TRUE);
  400. ensure("(1,1) in rect", rect.pointInRect(1.0f, 1.0f) == TRUE);
  401. ensure("(3,3) not in rect", rect.pointInRect(3.0f, 3.0f) == FALSE);
  402. ensure("(2.999,2.999) in rect", rect.pointInRect(2.999f, 2.999f) == TRUE);
  403. ensure("(2.999,3.0) not in rect", rect.pointInRect(2.999f, 3.0f) == FALSE);
  404. ensure("(3.0,2.999) not in rect", rect.pointInRect(3.0f, 2.999f) == FALSE);
  405. }
  406. template<> template<>
  407. void object::test<21>()
  408. {
  409. //
  410. // test the localPointInRect() method
  411. //
  412. LLRectf rect(1.0f, 3.0f, 3.0f, 1.0f);
  413. ensure("(0,0) in local rect", rect.localPointInRect(0.0f, 0.0f) == TRUE);
  414. ensure("(-0.0001,-0.0001) not in local rect", rect.localPointInRect(-0.0001f, -0.001f) == FALSE);
  415. ensure("(1,1) in local rect", rect.localPointInRect(1.0f, 1.0f) == TRUE);
  416. ensure("(2,2) not in local rect", rect.localPointInRect(2.0f, 2.0f) == FALSE);
  417. ensure("(1.999,1.999) in local rect", rect.localPointInRect(1.999f, 1.999f) == TRUE);
  418. ensure("(1.999,2.0) not in local rect", rect.localPointInRect(1.999f, 2.0f) == FALSE);
  419. ensure("(2.0,1.999) not in local rect", rect.localPointInRect(2.0f, 1.999f) == FALSE);
  420. }
  421. template<> template<>
  422. void object::test<22>()
  423. {
  424. //
  425. // test the clampPointToRect() method
  426. //
  427. LLRectf rect(1.0f, 3.0f, 3.0f, 1.0f);
  428. F32 x, y;
  429. x = 2.0f; y = 2.0f;
  430. rect.clampPointToRect(x, y);
  431. ensure_equals("clamp x-coord within rect", x, 2.0f);
  432. ensure_equals("clamp y-coord within rect", y, 2.0f);
  433. x = -100.0f; y = 100.0f;
  434. rect.clampPointToRect(x, y);
  435. ensure_equals("clamp x-coord outside rect", x, 1.0f);
  436. ensure_equals("clamp y-coord outside rect", y, 3.0f);
  437. x = 3.0f; y = 1.0f;
  438. rect.clampPointToRect(x, y);
  439. ensure_equals("clamp x-coord edge rect", x, 3.0f);
  440. ensure_equals("clamp y-coord edge rect", y, 1.0f);
  441. }
  442. }