PageRenderTime 32ms CodeModel.GetById 1ms RepoModel.GetById 1ms app.codeStats 0ms

/indra/newview/tests/llworldmap_test.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 515 lines | 339 code | 46 blank | 130 comment | 35 complexity | 2bf98cebfef3d7ef7444f45ce34e43f3 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llworldmap_test.cpp
  3. * @author Merov Linden
  4. * @date 2009-03-09
  5. *
  6. * $LicenseInfo:firstyear=2006&license=viewerlgpl$
  7. * Second Life Viewer Source Code
  8. * Copyright (C) 2010, Linden Research, Inc.
  9. *
  10. * This library is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU Lesser General Public
  12. * License as published by the Free Software Foundation;
  13. * version 2.1 of the License only.
  14. *
  15. * This library is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public
  21. * License along with this library; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23. *
  24. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  25. * $/LicenseInfo$
  26. */
  27. // Dependencies
  28. #include "linden_common.h"
  29. #include "llapr.h"
  30. #include "llsingleton.h"
  31. #include "lltrans.h"
  32. #include "lluistring.h"
  33. #include "../llviewertexture.h"
  34. #include "../llworldmapmessage.h"
  35. // Class to test
  36. #include "../llworldmap.h"
  37. // Tut header
  38. #include "../test/lltut.h"
  39. // -------------------------------------------------------------------------------------------
  40. // Stubbing: Declarations required to link and run the class being tested
  41. // Notes:
  42. // * Add here stubbed implementation of the few classes and methods used in the class to be tested
  43. // * Add as little as possible (let the link errors guide you)
  44. // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
  45. // * A simulator for a class can be implemented here. Please comment and document thoroughly.
  46. // Stub image calls
  47. void LLViewerTexture::setBoostLevel(S32 ) { }
  48. void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { }
  49. LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLViewerTexture::EBoostLevel, S8,
  50. LLGLint, LLGLenum, LLHost ) { return NULL; }
  51. // Stub related map calls
  52. LLWorldMapMessage::LLWorldMapMessage() { }
  53. LLWorldMapMessage::~LLWorldMapMessage() { }
  54. void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { }
  55. void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { }
  56. LLWorldMipmap::LLWorldMipmap() { }
  57. LLWorldMipmap::~LLWorldMipmap() { }
  58. void LLWorldMipmap::reset() { }
  59. void LLWorldMipmap::dropBoostLevels() { }
  60. void LLWorldMipmap::equalizeBoostLevels() { }
  61. LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { return NULL; }
  62. // Stub other stuff
  63. std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t& ) { return std::string("test_trans"); }
  64. void LLUIString::updateResult() const { }
  65. void LLUIString::setArg(const std::string& , const std::string& ) { }
  66. void LLUIString::assign(const std::string& ) { }
  67. // End Stubbing
  68. // -------------------------------------------------------------------------------------------
  69. // -------------------------------------------------------------------------------------------
  70. // TUT
  71. // -------------------------------------------------------------------------------------------
  72. const F32 X_WORLD_TEST = 1000.0f * REGION_WIDTH_METERS;
  73. const F32 Y_WORLD_TEST = 2000.0f * REGION_WIDTH_METERS;
  74. const F32 Z_WORLD_TEST = 240.0f;
  75. const std::string ITEM_NAME_TEST = "Item Foo";
  76. const std::string TOOLTIP_TEST = "Tooltip Foo";
  77. const std::string SIM_NAME_TEST = "Sim Foo";
  78. namespace tut
  79. {
  80. // Test wrapper declarations
  81. struct iteminfo_test
  82. {
  83. // Instance to be tested
  84. LLItemInfo* mItem;
  85. // Constructor and destructor of the test wrapper
  86. iteminfo_test()
  87. {
  88. LLUUID id;
  89. mItem = new LLItemInfo(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
  90. }
  91. ~iteminfo_test()
  92. {
  93. delete mItem;
  94. }
  95. };
  96. struct siminfo_test
  97. {
  98. // Instance to be tested
  99. LLSimInfo* mSim;
  100. // Constructor and destructor of the test wrapper
  101. siminfo_test()
  102. {
  103. U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
  104. mSim = new LLSimInfo(handle);
  105. }
  106. ~siminfo_test()
  107. {
  108. delete mSim;
  109. }
  110. };
  111. struct worldmap_test
  112. {
  113. // Instance to be tested
  114. LLWorldMap* mWorld;
  115. // Constructor and destructor of the test wrapper
  116. worldmap_test()
  117. {
  118. mWorld = LLWorldMap::getInstance();
  119. }
  120. ~worldmap_test()
  121. {
  122. mWorld = NULL;
  123. }
  124. };
  125. // Tut templating thingamagic: test group, object and test instance
  126. typedef test_group<iteminfo_test> iteminfo_t;
  127. typedef iteminfo_t::object iteminfo_object_t;
  128. tut::iteminfo_t tut_iteminfo("LLItemInfo");
  129. typedef test_group<siminfo_test> siminfo_t;
  130. typedef siminfo_t::object siminfo_object_t;
  131. tut::siminfo_t tut_siminfo("LLSimInfo");
  132. typedef test_group<worldmap_test> worldmap_t;
  133. typedef worldmap_t::object worldmap_object_t;
  134. tut::worldmap_t tut_worldmap("LLWorldMap");
  135. // ---------------------------------------------------------------------------------------
  136. // Test functions
  137. // Notes:
  138. // * Test as many as you possibly can without requiring a full blown simulation of everything
  139. // * The tests are executed in sequence so the test instance state may change between calls
  140. // * Remember that you cannot test private methods with tut
  141. // ---------------------------------------------------------------------------------------
  142. // ---------------------------------------------------------------------------------------
  143. // Test the LLItemInfo interface
  144. // ---------------------------------------------------------------------------------------
  145. template<> template<>
  146. void iteminfo_object_t::test<1>()
  147. {
  148. // Test 1 : setCount() / getCount()
  149. mItem->setCount(10);
  150. ensure("LLItemInfo::setCount() test failed", mItem->getCount() == 10);
  151. // Test 2 : setTooltip() / getToolTip()
  152. std::string tooltip = TOOLTIP_TEST;
  153. mItem->setTooltip(tooltip);
  154. ensure("LLItemInfo::setTooltip() test failed", mItem->getToolTip() == TOOLTIP_TEST);
  155. // Test 3 : setElevation() / getGlobalPosition()
  156. mItem->setElevation(Z_WORLD_TEST);
  157. LLVector3d pos = mItem->getGlobalPosition();
  158. LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, Z_WORLD_TEST);
  159. ensure("LLItemInfo::getGlobalPosition() test failed", pos == ref);
  160. // Test 4 : getName()
  161. std::string name = mItem->getName();
  162. ensure("LLItemInfo::getName() test failed", name == ITEM_NAME_TEST);
  163. // Test 5 : isName()
  164. ensure("LLItemInfo::isName() test failed", mItem->isName(name));
  165. // Test 6 : getUUID()
  166. LLUUID id;
  167. ensure("LLItemInfo::getUUID() test failed", mItem->getUUID() == id);
  168. // Test 7 : getRegionHandle()
  169. U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
  170. ensure("LLItemInfo::getRegionHandle() test failed", mItem->getRegionHandle() == handle);
  171. }
  172. // ---------------------------------------------------------------------------------------
  173. // Test the LLSimInfo interface
  174. // ---------------------------------------------------------------------------------------
  175. // Test Setters and Accessors methods
  176. template<> template<>
  177. void siminfo_object_t::test<1>()
  178. {
  179. // Test 1 : setName() / getName()
  180. std::string name = SIM_NAME_TEST;
  181. mSim->setName(name);
  182. ensure("LLSimInfo::setName() test failed", mSim->getName() == SIM_NAME_TEST);
  183. // Test 2 : isName()
  184. ensure("LLSimInfo::isName() test failed", mSim->isName(name));
  185. // Test 3 : getGlobalPos()
  186. LLVector3 local;
  187. LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, 0.0f);
  188. LLVector3d pos = mSim->getGlobalPos(local);
  189. ensure("LLSimInfo::getGlobalPos() test failed", pos == ref);
  190. // Test 4 : getGlobalOrigin()
  191. pos = mSim->getGlobalOrigin();
  192. ensure("LLSimInfo::getGlobalOrigin() test failed", pos == ref);
  193. // Test 5 : clearImage()
  194. try {
  195. mSim->clearImage();
  196. } catch (...) {
  197. fail("LLSimInfo::clearImage() test failed");
  198. }
  199. // Test 6 : dropImagePriority()
  200. try {
  201. mSim->dropImagePriority();
  202. } catch (...) {
  203. fail("LLSimInfo::dropImagePriority() test failed");
  204. }
  205. // Test 7 : updateAgentCount()
  206. try {
  207. mSim->updateAgentCount(0.0f);
  208. } catch (...) {
  209. fail("LLSimInfo::updateAgentCount() test failed");
  210. }
  211. // Test 8 : getAgentCount()
  212. S32 agents = mSim->getAgentCount();
  213. ensure("LLSimInfo::getAgentCount() test failed", agents == 0);
  214. // Test 9 : setLandForSaleImage() / getLandForSaleImage()
  215. LLUUID id;
  216. mSim->setLandForSaleImage(id);
  217. LLPointer<LLViewerFetchedTexture> image = mSim->getLandForSaleImage();
  218. ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull());
  219. // Test 10 : isPG()
  220. mSim->setAccess(SIM_ACCESS_PG);
  221. ensure("LLSimInfo::isPG() test failed", mSim->isPG());
  222. // Test 11 : isDown()
  223. mSim->setAccess(SIM_ACCESS_DOWN);
  224. ensure("LLSimInfo::isDown() test failed", mSim->isDown());
  225. // Test 12 : Access strings can't be accessed from unit test...
  226. //ensure("LLSimInfo::getAccessString() test failed", mSim->getAccessString() == "Offline");
  227. // Test 13 : Region strings can't be accessed from unit test...
  228. //mSim->setRegionFlags(REGION_FLAGS_SANDBOX);
  229. //ensure("LLSimInfo::setRegionFlags() test failed", mSim->getFlagsString() == "Sandbox");
  230. }
  231. // Test management of LLInfoItem lists
  232. template<> template<>
  233. void siminfo_object_t::test<2>()
  234. {
  235. // Test 14 : clearItems()
  236. try {
  237. mSim->clearItems();
  238. } catch (...) {
  239. fail("LLSimInfo::clearItems() at init test failed");
  240. }
  241. // Test 15 : Verify that all the lists are empty
  242. LLSimInfo::item_info_list_t list;
  243. list = mSim->getTeleHub();
  244. ensure("LLSimInfo::getTeleHub() empty at init test failed", list.empty());
  245. list = mSim->getInfoHub();
  246. ensure("LLSimInfo::getInfoHub() empty at init test failed", list.empty());
  247. list = mSim->getPGEvent();
  248. ensure("LLSimInfo::getPGEvent() empty at init test failed", list.empty());
  249. list = mSim->getMatureEvent();
  250. ensure("LLSimInfo::getMatureEvent() empty at init test failed", list.empty());
  251. list = mSim->getLandForSale();
  252. ensure("LLSimInfo::getLandForSale() empty at init test failed", list.empty());
  253. list = mSim->getAgentLocation();
  254. ensure("LLSimInfo::getAgentLocation() empty at init test failed", list.empty());
  255. // Create an item to be inserted
  256. LLUUID id;
  257. LLItemInfo item(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
  258. // Insert the item in each list
  259. mSim->insertTeleHub(item);
  260. mSim->insertInfoHub(item);
  261. mSim->insertPGEvent(item);
  262. mSim->insertMatureEvent(item);
  263. mSim->insertLandForSale(item);
  264. mSim->insertAgentLocation(item);
  265. // Test 16 : Verify that the lists contain 1 item each
  266. list = mSim->getTeleHub();
  267. ensure("LLSimInfo::insertTeleHub() test failed", list.size() == 1);
  268. list = mSim->getInfoHub();
  269. ensure("LLSimInfo::insertInfoHub() test failed", list.size() == 1);
  270. list = mSim->getPGEvent();
  271. ensure("LLSimInfo::insertPGEvent() test failed", list.size() == 1);
  272. list = mSim->getMatureEvent();
  273. ensure("LLSimInfo::insertMatureEvent() test failed", list.size() == 1);
  274. list = mSim->getLandForSale();
  275. ensure("LLSimInfo::insertLandForSale() test failed", list.size() == 1);
  276. list = mSim->getAgentLocation();
  277. ensure("LLSimInfo::insertAgentLocation() test failed", list.size() == 1);
  278. // Test 17 : clearItems()
  279. try {
  280. mSim->clearItems();
  281. } catch (...) {
  282. fail("LLSimInfo::clearItems() at end test failed");
  283. }
  284. // Test 18 : Verify that all the lists are empty again... *except* agent which is persisted!! (on purpose)
  285. list = mSim->getTeleHub();
  286. ensure("LLSimInfo::getTeleHub() empty after clear test failed", list.empty());
  287. list = mSim->getInfoHub();
  288. ensure("LLSimInfo::getInfoHub() empty after clear test failed", list.empty());
  289. list = mSim->getPGEvent();
  290. ensure("LLSimInfo::getPGEvent() empty after clear test failed", list.empty());
  291. list = mSim->getMatureEvent();
  292. ensure("LLSimInfo::getMatureEvent() empty after clear test failed", list.empty());
  293. list = mSim->getLandForSale();
  294. ensure("LLSimInfo::getLandForSale() empty after clear test failed", list.empty());
  295. list = mSim->getAgentLocation();
  296. ensure("LLSimInfo::getAgentLocation() empty after clear test failed", list.size() == 1);
  297. }
  298. // ---------------------------------------------------------------------------------------
  299. // Test the LLWorldMap interface
  300. // ---------------------------------------------------------------------------------------
  301. // Test Setters and Accessors methods
  302. template<> template<>
  303. void worldmap_object_t::test<1>()
  304. {
  305. // Test 1 : reset()
  306. try {
  307. mWorld->reset();
  308. } catch (...) {
  309. fail("LLWorldMap::reset() at init test failed");
  310. }
  311. // Test 2 : clearImageRefs()
  312. try {
  313. mWorld->clearImageRefs();
  314. } catch (...) {
  315. fail("LLWorldMap::clearImageRefs() test failed");
  316. }
  317. // Test 3 : dropImagePriorities()
  318. try {
  319. mWorld->dropImagePriorities();
  320. } catch (...) {
  321. fail("LLWorldMap::dropImagePriorities() test failed");
  322. }
  323. // Test 4 : reloadItems()
  324. try {
  325. mWorld->reloadItems(true);
  326. } catch (...) {
  327. fail("LLWorldMap::reloadItems() test failed");
  328. }
  329. // Test 5 : updateRegions()
  330. try {
  331. mWorld->updateRegions(1000, 1000, 1004, 1004);
  332. } catch (...) {
  333. fail("LLWorldMap::updateRegions() test failed");
  334. }
  335. // Test 6 : equalizeBoostLevels()
  336. try {
  337. mWorld->equalizeBoostLevels();
  338. } catch (...) {
  339. fail("LLWorldMap::equalizeBoostLevels() test failed");
  340. }
  341. // Test 7 : getObjectsTile()
  342. try {
  343. LLPointer<LLViewerFetchedTexture> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);
  344. ensure("LLWorldMap::getObjectsTile() failed", image.isNull());
  345. } catch (...) {
  346. fail("LLWorldMap::getObjectsTile() test failed with exception");
  347. }
  348. }
  349. // Test management of LLSimInfo lists
  350. template<> template<>
  351. void worldmap_object_t::test<2>()
  352. {
  353. // Test 8 : reset()
  354. try {
  355. mWorld->reset();
  356. } catch (...) {
  357. fail("LLWorldMap::reset() at init test failed");
  358. }
  359. // Test 9 : Verify that all the region list is empty
  360. LLWorldMap::sim_info_map_t list;
  361. list = mWorld->getRegionMap();
  362. ensure("LLWorldMap::getRegionMap() empty at init test failed", list.empty());
  363. // Test 10 : Insert a region
  364. bool success;
  365. LLUUID id;
  366. std::string name_sim = SIM_NAME_TEST;
  367. success = mWorld->insertRegion( U32(X_WORLD_TEST),
  368. U32(Y_WORLD_TEST),
  369. name_sim,
  370. id,
  371. SIM_ACCESS_PG,
  372. REGION_FLAGS_SANDBOX);
  373. list = mWorld->getRegionMap();
  374. ensure("LLWorldMap::insertRegion() failed", success && (list.size() == 1));
  375. // Test 11 : Insert an item in the same region -> number of regions doesn't increase
  376. std::string name_item = ITEM_NAME_TEST;
  377. success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS/2),
  378. U32(Y_WORLD_TEST + REGION_WIDTH_METERS/2),
  379. name_item,
  380. id,
  381. MAP_ITEM_LAND_FOR_SALE,
  382. 0, 0);
  383. list = mWorld->getRegionMap();
  384. ensure("LLWorldMap::insertItem() in existing region failed", success && (list.size() == 1));
  385. // Test 12 : Insert an item in another region -> number of regions increases
  386. success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS*2),
  387. U32(Y_WORLD_TEST + REGION_WIDTH_METERS*2),
  388. name_item,
  389. id,
  390. MAP_ITEM_LAND_FOR_SALE,
  391. 0, 0);
  392. list = mWorld->getRegionMap();
  393. ensure("LLWorldMap::insertItem() in unexisting region failed", success && (list.size() == 2));
  394. // Test 13 : simInfoFromPosGlobal() in region
  395. LLVector3d pos1( X_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2,
  396. Y_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2,
  397. 0.0f);
  398. LLSimInfo* sim;
  399. sim = mWorld->simInfoFromPosGlobal(pos1);
  400. ensure("LLWorldMap::simInfoFromPosGlobal() test on existing region failed", sim != NULL);
  401. // Test 14 : simInfoFromPosGlobal() outside region
  402. LLVector3d pos2( X_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2,
  403. Y_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2,
  404. 0.0f);
  405. sim = mWorld->simInfoFromPosGlobal(pos2);
  406. ensure("LLWorldMap::simInfoFromPosGlobal() test outside region failed", sim == NULL);
  407. // Test 15 : simInfoFromName()
  408. sim = mWorld->simInfoFromName(name_sim);
  409. ensure("LLWorldMap::simInfoFromName() test on existing region failed", sim != NULL);
  410. // Test 16 : simInfoFromHandle()
  411. U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
  412. sim = mWorld->simInfoFromHandle(handle);
  413. ensure("LLWorldMap::simInfoFromHandle() test on existing region failed", sim != NULL);
  414. // Test 17 : simNameFromPosGlobal()
  415. LLVector3d pos3( X_WORLD_TEST + REGION_WIDTH_METERS/2,
  416. Y_WORLD_TEST + REGION_WIDTH_METERS/2,
  417. 0.0f);
  418. success = mWorld->simNameFromPosGlobal(pos3, name_sim);
  419. ensure("LLWorldMap::simNameFromPosGlobal() test on existing region failed", success && (name_sim == SIM_NAME_TEST));
  420. // Test 18 : reset()
  421. try {
  422. mWorld->reset();
  423. } catch (...) {
  424. fail("LLWorldMap::reset() at end test failed");
  425. }
  426. // Test 19 : Verify that all the region list is empty
  427. list = mWorld->getRegionMap();
  428. ensure("LLWorldMap::getRegionMap() empty at end test failed", list.empty());
  429. }
  430. // Test tracking
  431. template<> template<>
  432. void worldmap_object_t::test<3>()
  433. {
  434. // Point to track
  435. LLVector3d pos( X_WORLD_TEST + REGION_WIDTH_METERS/2, Y_WORLD_TEST + REGION_WIDTH_METERS/2, Z_WORLD_TEST);
  436. // Test 20 : no tracking
  437. mWorld->cancelTracking();
  438. ensure("LLWorldMap::cancelTracking() at begin test failed", mWorld->isTracking() == false);
  439. // Test 21 : set tracking
  440. mWorld->setTracking(pos);
  441. ensure("LLWorldMap::setTracking() failed", mWorld->isTracking() && !mWorld->isTrackingValidLocation());
  442. // Test 22 : set click and commit flags
  443. mWorld->setTrackingDoubleClick();
  444. ensure("LLWorldMap::setTrackingDoubleClick() failed", mWorld->isTrackingDoubleClick());
  445. mWorld->setTrackingCommit();
  446. ensure("LLWorldMap::setTrackingCommit() failed", mWorld->isTrackingCommit());
  447. // Test 23 : in rectangle test
  448. bool inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST, Y_WORLD_TEST,
  449. X_WORLD_TEST + REGION_WIDTH_METERS,
  450. Y_WORLD_TEST + REGION_WIDTH_METERS);
  451. ensure("LLWorldMap::isTrackingInRectangle() in rectangle failed", inRect);
  452. inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST + REGION_WIDTH_METERS,
  453. Y_WORLD_TEST + REGION_WIDTH_METERS,
  454. X_WORLD_TEST + 2 * REGION_WIDTH_METERS,
  455. Y_WORLD_TEST + 2 * REGION_WIDTH_METERS);
  456. ensure("LLWorldMap::isTrackingInRectangle() outside rectangle failed", !inRect);
  457. // Test 24 : set tracking to valid and invalid
  458. mWorld->setTrackingValid();
  459. ensure("LLWorldMap::setTrackingValid() failed", mWorld->isTrackingValidLocation() && !mWorld->isTrackingInvalidLocation());
  460. mWorld->setTrackingInvalid();
  461. ensure("LLWorldMap::setTrackingInvalid() failed", !mWorld->isTrackingValidLocation() && mWorld->isTrackingInvalidLocation());
  462. // Test 25 : getTrackedPositionGlobal()
  463. LLVector3d res = mWorld->getTrackedPositionGlobal();
  464. ensure("LLWorldMap::getTrackedPositionGlobal() failed", res == pos);
  465. // Test 26 : reset tracking
  466. mWorld->cancelTracking();
  467. ensure("LLWorldMap::cancelTracking() at end test failed", mWorld->isTracking() == false);
  468. }
  469. }