Box2.tests.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /* global QUnit */
  2. import { Box2 } from '../../../../src/math/Box2.js';
  3. import { Vector2 } from '../../../../src/math/Vector2.js';
  4. import {
  5. negInf2,
  6. posInf2,
  7. negOne2,
  8. zero2,
  9. one2,
  10. two2
  11. } from '../../utils/math-constants.js';
  12. export default QUnit.module( 'Maths', () => {
  13. QUnit.module( 'Box2', () => {
  14. // INSTANCING
  15. QUnit.test( 'Instancing', ( assert ) => {
  16. let a = new Box2();
  17. assert.ok( a.min.equals( posInf2 ), 'Passed!' );
  18. assert.ok( a.max.equals( negInf2 ), 'Passed!' );
  19. a = new Box2( zero2.clone(), zero2.clone() );
  20. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  21. assert.ok( a.max.equals( zero2 ), 'Passed!' );
  22. a = new Box2( zero2.clone(), one2.clone() );
  23. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  24. assert.ok( a.max.equals( one2 ), 'Passed!' );
  25. } );
  26. // PUBLIC STUFF
  27. QUnit.test( 'isBox2', ( assert ) => {
  28. const a = new Box2();
  29. assert.ok( a.isBox2 === true, 'Passed!' );
  30. const b = new Object();
  31. assert.ok( ! b.isBox2, 'Passed!' );
  32. } );
  33. QUnit.test( 'set', ( assert ) => {
  34. const a = new Box2();
  35. a.set( zero2, one2 );
  36. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  37. assert.ok( a.max.equals( one2 ), 'Passed!' );
  38. } );
  39. QUnit.test( 'setFromPoints', ( assert ) => {
  40. const a = new Box2();
  41. a.setFromPoints( [ zero2, one2, two2 ] );
  42. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  43. assert.ok( a.max.equals( two2 ), 'Passed!' );
  44. a.setFromPoints( [ one2 ] );
  45. assert.ok( a.min.equals( one2 ), 'Passed!' );
  46. assert.ok( a.max.equals( one2 ), 'Passed!' );
  47. a.setFromPoints( [] );
  48. assert.ok( a.isEmpty(), 'Passed!' );
  49. } );
  50. QUnit.test( 'setFromCenterAndSize', ( assert ) => {
  51. const a = new Box2();
  52. a.setFromCenterAndSize( zero2, two2 );
  53. assert.ok( a.min.equals( negOne2 ), 'Passed!' );
  54. assert.ok( a.max.equals( one2 ), 'Passed!' );
  55. a.setFromCenterAndSize( one2, two2 );
  56. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  57. assert.ok( a.max.equals( two2 ), 'Passed!' );
  58. a.setFromCenterAndSize( zero2, zero2 );
  59. assert.ok( a.min.equals( zero2 ), 'Passed!' );
  60. assert.ok( a.max.equals( zero2 ), 'Passed!' );
  61. } );
  62. QUnit.test( 'clone', ( assert ) => {
  63. let a = new Box2( zero2, zero2 );
  64. let b = a.clone();
  65. assert.ok( b.min.equals( zero2 ), 'Passed!' );
  66. assert.ok( b.max.equals( zero2 ), 'Passed!' );
  67. a = new Box2();
  68. b = a.clone();
  69. assert.ok( b.min.equals( posInf2 ), 'Passed!' );
  70. assert.ok( b.max.equals( negInf2 ), 'Passed!' );
  71. } );
  72. QUnit.test( 'copy', ( assert ) => {
  73. const a = new Box2( zero2.clone(), one2.clone() );
  74. const b = new Box2().copy( a );
  75. assert.ok( b.min.equals( zero2 ), 'Passed!' );
  76. assert.ok( b.max.equals( one2 ), 'Passed!' );
  77. // ensure that it is a true copy
  78. a.min = zero2;
  79. a.max = one2;
  80. assert.ok( b.min.equals( zero2 ), 'Passed!' );
  81. assert.ok( b.max.equals( one2 ), 'Passed!' );
  82. } );
  83. QUnit.test( 'empty/makeEmpty', ( assert ) => {
  84. let a = new Box2();
  85. assert.ok( a.isEmpty(), 'Passed!' );
  86. a = new Box2( zero2.clone(), one2.clone() );
  87. assert.ok( ! a.isEmpty(), 'Passed!' );
  88. a.makeEmpty();
  89. assert.ok( a.isEmpty(), 'Passed!' );
  90. } );
  91. QUnit.test( 'isEmpty', ( assert ) => {
  92. let a = new Box2( zero2.clone(), zero2.clone() );
  93. assert.ok( ! a.isEmpty(), 'Passed!' );
  94. a = new Box2( zero2.clone(), one2.clone() );
  95. assert.ok( ! a.isEmpty(), 'Passed!' );
  96. a = new Box2( two2.clone(), one2.clone() );
  97. assert.ok( a.isEmpty(), 'Passed!' );
  98. a = new Box2( posInf2.clone(), negInf2.clone() );
  99. assert.ok( a.isEmpty(), 'Passed!' );
  100. } );
  101. QUnit.test( 'getCenter', ( assert ) => {
  102. let a = new Box2( zero2.clone(), zero2.clone() );
  103. const center = new Vector2();
  104. assert.ok( a.getCenter( center ).equals( zero2 ), 'Passed!' );
  105. a = new Box2( zero2, one2 );
  106. const midpoint = one2.clone().multiplyScalar( 0.5 );
  107. assert.ok( a.getCenter( center ).equals( midpoint ), 'Passed!' );
  108. } );
  109. QUnit.test( 'getSize', ( assert ) => {
  110. let a = new Box2( zero2.clone(), zero2.clone() );
  111. const size = new Vector2();
  112. assert.ok( a.getSize( size ).equals( zero2 ), 'Passed!' );
  113. a = new Box2( zero2.clone(), one2.clone() );
  114. assert.ok( a.getSize( size ).equals( one2 ), 'Passed!' );
  115. } );
  116. QUnit.test( 'expandByPoint', ( assert ) => {
  117. const a = new Box2( zero2.clone(), zero2.clone() );
  118. const size = new Vector2();
  119. const center = new Vector2();
  120. a.expandByPoint( zero2 );
  121. assert.ok( a.getSize( size ).equals( zero2 ), 'Passed!' );
  122. a.expandByPoint( one2 );
  123. assert.ok( a.getSize( size ).equals( one2 ), 'Passed!' );
  124. a.expandByPoint( one2.clone().negate() );
  125. assert.ok( a.getSize( size ).equals( one2.clone().multiplyScalar( 2 ) ), 'Passed!' );
  126. assert.ok( a.getCenter( center ).equals( zero2 ), 'Passed!' );
  127. } );
  128. QUnit.test( 'expandByVector', ( assert ) => {
  129. const a = new Box2( zero2.clone(), zero2.clone() );
  130. const size = new Vector2();
  131. const center = new Vector2();
  132. a.expandByVector( zero2 );
  133. assert.ok( a.getSize( size ).equals( zero2 ), 'Passed!' );
  134. a.expandByVector( one2 );
  135. assert.ok( a.getSize( size ).equals( one2.clone().multiplyScalar( 2 ) ), 'Passed!' );
  136. assert.ok( a.getCenter( center ).equals( zero2 ), 'Passed!' );
  137. } );
  138. QUnit.test( 'expandByScalar', ( assert ) => {
  139. const a = new Box2( zero2.clone(), zero2.clone() );
  140. const size = new Vector2();
  141. const center = new Vector2();
  142. a.expandByScalar( 0 );
  143. assert.ok( a.getSize( size ).equals( zero2 ), 'Passed!' );
  144. a.expandByScalar( 1 );
  145. assert.ok( a.getSize( size ).equals( one2.clone().multiplyScalar( 2 ) ), 'Passed!' );
  146. assert.ok( a.getCenter( center ).equals( zero2 ), 'Passed!' );
  147. } );
  148. QUnit.test( 'containsPoint', ( assert ) => {
  149. const a = new Box2( zero2.clone(), zero2.clone() );
  150. assert.ok( a.containsPoint( zero2 ), 'Passed!' );
  151. assert.ok( ! a.containsPoint( one2 ), 'Passed!' );
  152. a.expandByScalar( 1 );
  153. assert.ok( a.containsPoint( zero2 ), 'Passed!' );
  154. assert.ok( a.containsPoint( one2 ), 'Passed!' );
  155. assert.ok( a.containsPoint( one2.clone().negate() ), 'Passed!' );
  156. } );
  157. QUnit.test( 'containsBox', ( assert ) => {
  158. const a = new Box2( zero2.clone(), zero2.clone() );
  159. const b = new Box2( zero2.clone(), one2.clone() );
  160. const c = new Box2( one2.clone().negate(), one2.clone() );
  161. assert.ok( a.containsBox( a ), 'Passed!' );
  162. assert.ok( ! a.containsBox( b ), 'Passed!' );
  163. assert.ok( ! a.containsBox( c ), 'Passed!' );
  164. assert.ok( b.containsBox( a ), 'Passed!' );
  165. assert.ok( c.containsBox( a ), 'Passed!' );
  166. assert.ok( ! b.containsBox( c ), 'Passed!' );
  167. } );
  168. QUnit.test( 'getParameter', ( assert ) => {
  169. const a = new Box2( zero2.clone(), one2.clone() );
  170. const b = new Box2( one2.clone().negate(), one2.clone() );
  171. const parameter = new Vector2();
  172. a.getParameter( zero2, parameter );
  173. assert.ok( parameter.equals( zero2 ), 'Passed!' );
  174. a.getParameter( one2, parameter );
  175. assert.ok( parameter.equals( one2 ), 'Passed!' );
  176. b.getParameter( one2.clone().negate(), parameter );
  177. assert.ok( parameter.equals( zero2 ), 'Passed!' );
  178. b.getParameter( zero2, parameter );
  179. assert.ok( parameter.equals( new Vector2( 0.5, 0.5 ) ), 'Passed!' );
  180. b.getParameter( one2, parameter );
  181. assert.ok( parameter.equals( one2 ), 'Passed!' );
  182. } );
  183. QUnit.test( 'intersectsBox', ( assert ) => {
  184. const a = new Box2( zero2.clone(), zero2.clone() );
  185. const b = new Box2( zero2.clone(), one2.clone() );
  186. const c = new Box2( one2.clone().negate(), one2.clone() );
  187. assert.ok( a.intersectsBox( a ), 'Passed!' );
  188. assert.ok( a.intersectsBox( b ), 'Passed!' );
  189. assert.ok( a.intersectsBox( c ), 'Passed!' );
  190. assert.ok( b.intersectsBox( a ), 'Passed!' );
  191. assert.ok( c.intersectsBox( a ), 'Passed!' );
  192. assert.ok( b.intersectsBox( c ), 'Passed!' );
  193. b.translate( two2 );
  194. assert.ok( ! a.intersectsBox( b ), 'Passed!' );
  195. assert.ok( ! b.intersectsBox( a ), 'Passed!' );
  196. assert.ok( ! b.intersectsBox( c ), 'Passed!' );
  197. } );
  198. QUnit.test( 'clampPoint', ( assert ) => {
  199. const a = new Box2( zero2.clone(), zero2.clone() );
  200. const b = new Box2( one2.clone().negate(), one2.clone() );
  201. const point = new Vector2();
  202. a.clampPoint( zero2, point );
  203. assert.ok( point.equals( new Vector2( 0, 0 ) ), 'Passed!' );
  204. a.clampPoint( one2, point );
  205. assert.ok( point.equals( new Vector2( 0, 0 ) ), 'Passed!' );
  206. a.clampPoint( one2.clone().negate(), point );
  207. assert.ok( point.equals( new Vector2( 0, 0 ) ), 'Passed!' );
  208. b.clampPoint( two2, point );
  209. assert.ok( point.equals( new Vector2( 1, 1 ) ), 'Passed!' );
  210. b.clampPoint( one2, point );
  211. assert.ok( point.equals( new Vector2( 1, 1 ) ), 'Passed!' );
  212. b.clampPoint( zero2, point );
  213. assert.ok( point.equals( new Vector2( 0, 0 ) ), 'Passed!' );
  214. b.clampPoint( one2.clone().negate(), point );
  215. assert.ok( point.equals( new Vector2( - 1, - 1 ) ), 'Passed!' );
  216. b.clampPoint( two2.clone().negate(), point );
  217. assert.ok( point.equals( new Vector2( - 1, - 1 ) ), 'Passed!' );
  218. } );
  219. QUnit.test( 'distanceToPoint', ( assert ) => {
  220. const a = new Box2( zero2.clone(), zero2.clone() );
  221. const b = new Box2( one2.clone().negate(), one2.clone() );
  222. assert.ok( a.distanceToPoint( new Vector2( 0, 0 ) ) == 0, 'Passed!' );
  223. assert.ok( a.distanceToPoint( new Vector2( 1, 1 ) ) == Math.sqrt( 2 ), 'Passed!' );
  224. assert.ok( a.distanceToPoint( new Vector2( - 1, - 1 ) ) == Math.sqrt( 2 ), 'Passed!' );
  225. assert.ok( b.distanceToPoint( new Vector2( 2, 2 ) ) == Math.sqrt( 2 ), 'Passed!' );
  226. assert.ok( b.distanceToPoint( new Vector2( 1, 1 ) ) == 0, 'Passed!' );
  227. assert.ok( b.distanceToPoint( new Vector2( 0, 0 ) ) == 0, 'Passed!' );
  228. assert.ok( b.distanceToPoint( new Vector2( - 1, - 1 ) ) == 0, 'Passed!' );
  229. assert.ok( b.distanceToPoint( new Vector2( - 2, - 2 ) ) == Math.sqrt( 2 ), 'Passed!' );
  230. } );
  231. QUnit.test( 'intersect', ( assert ) => {
  232. const a = new Box2( zero2.clone(), zero2.clone() );
  233. const b = new Box2( zero2.clone(), one2.clone() );
  234. const c = new Box2( one2.clone().negate(), one2.clone() );
  235. assert.ok( a.clone().intersect( a ).equals( a ), 'Passed!' );
  236. assert.ok( a.clone().intersect( b ).equals( a ), 'Passed!' );
  237. assert.ok( b.clone().intersect( b ).equals( b ), 'Passed!' );
  238. assert.ok( a.clone().intersect( c ).equals( a ), 'Passed!' );
  239. assert.ok( b.clone().intersect( c ).equals( b ), 'Passed!' );
  240. assert.ok( c.clone().intersect( c ).equals( c ), 'Passed!' );
  241. const d = new Box2( one2.clone().negate(), zero2.clone() );
  242. const e = new Box2( one2.clone(), two2.clone() ).intersect( d );
  243. assert.ok( e.min.equals( posInf2 ) && e.max.equals( negInf2 ), 'Infinite empty' );
  244. } );
  245. QUnit.test( 'union', ( assert ) => {
  246. const a = new Box2( zero2.clone(), zero2.clone() );
  247. const b = new Box2( zero2.clone(), one2.clone() );
  248. const c = new Box2( one2.clone().negate(), one2.clone() );
  249. assert.ok( a.clone().union( a ).equals( a ), 'Passed!' );
  250. assert.ok( a.clone().union( b ).equals( b ), 'Passed!' );
  251. assert.ok( a.clone().union( c ).equals( c ), 'Passed!' );
  252. assert.ok( b.clone().union( c ).equals( c ), 'Passed!' );
  253. } );
  254. QUnit.test( 'translate', ( assert ) => {
  255. const a = new Box2( zero2.clone(), zero2.clone() );
  256. const b = new Box2( zero2.clone(), one2.clone() );
  257. const c = new Box2( one2.clone().negate(), zero2.clone() );
  258. assert.ok( a.clone().translate( one2 ).equals( new Box2( one2, one2 ) ), 'Passed!' );
  259. assert.ok( a.clone().translate( one2 ).translate( one2.clone().negate() ).equals( a ), 'Passed!' );
  260. assert.ok( c.clone().translate( one2 ).equals( b ), 'Passed!' );
  261. assert.ok( b.clone().translate( one2.clone().negate() ).equals( c ), 'Passed!' );
  262. } );
  263. QUnit.test( 'equals', ( assert ) => {
  264. let a = new Box2();
  265. let b = new Box2();
  266. assert.ok( b.equals( a ), 'Passed!' );
  267. assert.ok( a.equals( b ), 'Passed!' );
  268. a = new Box2( one2, two2 );
  269. b = new Box2( one2, two2 );
  270. assert.ok( b.equals( a ), 'Passed!' );
  271. assert.ok( a.equals( b ), 'Passed!' );
  272. a = new Box2( one2, two2 );
  273. b = a.clone();
  274. assert.ok( b.equals( a ), 'Passed!' );
  275. assert.ok( a.equals( b ), 'Passed!' );
  276. a = new Box2( one2, two2 );
  277. b = new Box2( one2, one2 );
  278. assert.ok( ! b.equals( a ), 'Passed!' );
  279. assert.ok( ! a.equals( b ), 'Passed!' );
  280. a = new Box2();
  281. b = new Box2( one2, one2 );
  282. assert.ok( ! b.equals( a ), 'Passed!' );
  283. assert.ok( ! a.equals( b ), 'Passed!' );
  284. a = new Box2( one2, two2 );
  285. b = new Box2( one2, one2 );
  286. assert.ok( ! b.equals( a ), 'Passed!' );
  287. assert.ok( ! a.equals( b ), 'Passed!' );
  288. } );
  289. } );
  290. } );