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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsd_new_tut.cpp
  3.  * @date   February 2006
  4.  * @brief LLSD unit tests
  5.  *
  6.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2006-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include <tut/tut.hpp>
  34. #include "linden_common.h"
  35. #include "lltut.h"
  36. #include "llsdtraits.h"
  37. #include "llstring.h"
  38. namespace tut
  39. {
  40. class SDCleanupCheck
  41. {
  42. private:
  43. U32 mOutstandingAtStart;
  44. public:
  45. SDCleanupCheck() : mOutstandingAtStart(LLSD::outstandingCount()) { }
  46. ~SDCleanupCheck()
  47. {
  48. ensure_equals("SDCleanupCheck",
  49. LLSD::outstandingCount(), mOutstandingAtStart);
  50. }
  51. };
  52. class SDAllocationCheck : public SDCleanupCheck
  53. {
  54. private:
  55. std::string mMessage;
  56. U32 mExpectedAllocations;
  57. U32 mAllocationAtStart;
  58. public:
  59. SDAllocationCheck(const std::string& message, int expectedAllocations)
  60. : mMessage(message),
  61. mExpectedAllocations(expectedAllocations),
  62. mAllocationAtStart(LLSD::allocationCount())
  63. { }
  64. ~SDAllocationCheck()
  65. {
  66. ensure_equals(mMessage + " SDAllocationCheck",
  67. LLSD::allocationCount() - mAllocationAtStart,
  68. mExpectedAllocations);
  69. }
  70. };
  71. struct SDTestData {
  72. template<class T>
  73. static void ensureTypeAndValue(const char* msg, const LLSD& actual,
  74. T expectedValue)
  75. {
  76. LLSDTraits<T> traits;
  77. std::string s(msg);
  78. ensure( s + " type", traits.checkType(actual));
  79. ensure_equals( s + " value", traits.get(actual), expectedValue);
  80. }
  81. };
  82. typedef test_group<SDTestData> SDTestGroup;
  83. typedef SDTestGroup::object SDTestObject;
  84. SDTestGroup sdTestGroup("LLSD(new)");
  85. template<> template<>
  86. void SDTestObject::test<1>()
  87. // construction and test of undefined
  88. {
  89. SDCleanupCheck check;
  90. LLSD u;
  91. ensure("is undefined", u.isUndefined());
  92. }
  93. template<> template<>
  94. void SDTestObject::test<2>()
  95. // setting and fetching scalar types
  96. {
  97. SDCleanupCheck check;
  98. LLSD v;
  99. v = true; ensureTypeAndValue("set true", v, true);
  100. v = false; ensureTypeAndValue("set false", v, false);
  101. v = true; ensureTypeAndValue("set true again", v, true);
  102. v = 42; ensureTypeAndValue("set to 42", v, 42);
  103. v = 0; ensureTypeAndValue("set to zero", v, 0);
  104. v = -12345; ensureTypeAndValue("set to neg", v, -12345);
  105. v = 2000000000; ensureTypeAndValue("set to big", v, 2000000000);
  106. v = 3.14159265359;
  107. ensureTypeAndValue("set to pi", v, 3.14159265359);
  108. ensure_not_equals("isn't float", v.asReal(),
  109. (float)3.14159265359);
  110. v = 6.7e256; ensureTypeAndValue("set to big", v, 6.7e256);
  111. LLUUID nullUUID;
  112. LLUUID newUUID;
  113. newUUID.generate();
  114. v = nullUUID; ensureTypeAndValue("set to null UUID", v, nullUUID);
  115. v = newUUID; ensureTypeAndValue("set to new UUID", v, newUUID);
  116. v = nullUUID; ensureTypeAndValue("set to null again", v, nullUUID);
  117. // strings must be tested with two types of string objects
  118. std::string s = "now is the time";
  119. const char* cs = "for all good zorks";
  120. v = s; ensureTypeAndValue("set to std::string", v, s);
  121. v = cs; ensureTypeAndValue("set to const char*", v, cs);
  122. LLDate epoch;
  123. LLDate aDay("2001-10-22T10:11:12.00Z");
  124. v = epoch; ensureTypeAndValue("set to epoch", v, epoch);
  125. v = aDay; ensureTypeAndValue("set to a day", v, aDay);
  126. LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
  127. v = path; ensureTypeAndValue("set to a uri", v, path);
  128. const char source[] = "once in a blue moon";
  129. std::vector<U8> data;
  130. copy(&source[0], &source[sizeof(source)], back_inserter(data));
  131. v = data; ensureTypeAndValue("set to data", v, data);
  132. v.clear();
  133. ensure("reset to undefined", v.type() == LLSD::TypeUndefined);
  134. }
  135. template<> template<>
  136. void SDTestObject::test<3>()
  137. // construction via scalar values
  138. // tests both constructor and initialize forms
  139. {
  140. SDCleanupCheck check;
  141. LLSD b1(true); ensureTypeAndValue("construct boolean", b1, true);
  142. LLSD b2 = true; ensureTypeAndValue("initialize  boolean", b2, true);
  143. LLSD i1(42); ensureTypeAndValue("construct int", i1, 42);
  144. LLSD i2 =42; ensureTypeAndValue("initialize  int", i2, 42);
  145. LLSD d1(1.2); ensureTypeAndValue("construct double", d1, 1.2);
  146. LLSD d2 = 1.2; ensureTypeAndValue("initialize double", d2, 1.2);
  147. LLUUID newUUID;
  148. newUUID.generate();
  149. LLSD u1(newUUID);
  150. ensureTypeAndValue("construct UUID", u1, newUUID);
  151. LLSD u2 = newUUID;
  152. ensureTypeAndValue("initialize UUID", u2, newUUID);
  153. LLSD ss1(std::string("abc"));
  154. ensureTypeAndValue("construct std::string", ss1, "abc");
  155. LLSD ss2 = std::string("abc");
  156. ensureTypeAndValue("initialize std::string",ss2, "abc");
  157. LLSD sl1(std::string("def"));
  158. ensureTypeAndValue("construct std::string", sl1, "def");
  159. LLSD sl2 = std::string("def");
  160. ensureTypeAndValue("initialize std::string", sl2, "def");
  161. LLSD sc1("ghi");
  162. ensureTypeAndValue("construct const char*", sc1, "ghi");
  163. LLSD sc2 = "ghi";
  164. ensureTypeAndValue("initialize const char*",sc2, "ghi");
  165. LLDate aDay("2001-10-22T10:11:12.00Z");
  166. LLSD t1(aDay); ensureTypeAndValue("construct LLDate", t1, aDay);
  167. LLSD t2 = aDay; ensureTypeAndValue("initialize LLDate", t2, aDay);
  168. LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
  169. LLSD p1(path); ensureTypeAndValue("construct LLURI", p1, path);
  170. LLSD p2 = path; ensureTypeAndValue("initialize LLURI", p2, path);
  171. const char source[] = "once in a blue moon";
  172. std::vector<U8> data;
  173. copy(&source[0], &source[sizeof(source)], back_inserter(data));
  174. LLSD x1(data); ensureTypeAndValue("construct vector<U8>", x1, data);
  175. LLSD x2 = data; ensureTypeAndValue("initialize vector<U8>", x2, data);
  176. }
  177. void checkConversions(const char* msg, const LLSD& v,
  178. LLSD::Boolean eBoolean, LLSD::Integer eInteger,
  179. LLSD::Real eReal, const LLSD::String& eString)
  180. {
  181. std::string s(msg);
  182. ensure_equals(s+" to bool", v.asBoolean(), eBoolean);
  183. ensure_equals(s+" to int", v.asInteger(), eInteger);
  184. if (eReal == eReal)
  185. {
  186. ensure_equals(s+" to real", v.asReal(), eReal);
  187. ensure_equals(s+" to string", v.asString(), eString);
  188. }
  189. else
  190. {
  191. // TODO: Fix on windows....
  192. #ifndef LL_WINDOWS
  193. # if !defined(fpclassify) && __GNUC__ >= 3
  194. #   define FPCLASSIFY_NAMESPACE std::
  195. # else
  196. #   define FPCLASSIFY_NAMESPACE
  197. # endif
  198. int left  = FPCLASSIFY_NAMESPACE fpclassify(v.asReal());
  199. int right = FPCLASSIFY_NAMESPACE fpclassify(eReal);
  200. ensure_equals(s+" to real",  left,  right);
  201. ensure_equals(s+" to string", v.asString(), eString);
  202. #endif
  203. }
  204. }
  205. template<> template<>
  206. void SDTestObject::test<4>()
  207. // conversion between undefined and basic scalar types:
  208. // boolean, integer, real and string
  209. {
  210. SDCleanupCheck check;
  211. LLSD v; checkConversions("untitled", v, false, 0, 0.0, "");
  212. v = false; checkConversions("false", v, false, 0, 0.0, "");
  213. v = true; checkConversions("true", v, true, 1, 1.0, "true");
  214. v = 0; checkConversions("zero", v, false, 0, 0.0, "0");
  215. v = 1; checkConversions("one", v, true, 1, 1.0, "1");
  216. v = -33; checkConversions("neg33", v, true, -33, -33.0, "-33");
  217. v = 0.0; checkConversions("0.0", v, false, 0, 0.0, "0");
  218. v = 0.5; checkConversions("point5", v, true, 0, 0.5, "0.5");
  219. v = 0.9; checkConversions("point9", v, true, 0, 0.9, "0.9");
  220. v = -3.9; checkConversions("neg3dot9", v, true, -3, -3.9, "-3.9");
  221. v = sqrt(-1.0); checkConversions("NaN", v, false, 0, sqrt(-1.0), "nan");
  222. v = ""; checkConversions("empty", v, false, 0, 0.0, "");
  223. v = "0"; checkConversions("digit0", v, true, 0, 0.0, "0");
  224. v = "10"; checkConversions("digit10", v, true, 10, 10.0, "10");
  225. v = "-2.345"; checkConversions("decdigits", v,
  226. true, -2, -2.345, "-2.345");
  227. v = "apple"; checkConversions("apple", v, true, 0, 0.0, "apple");
  228. v = "33bob"; checkConversions("digialpha", v, true, 0, 0.0, "33bob");
  229. v = " "; checkConversions("space", v, true, 0, 0.0, " ");
  230. v = "n"; checkConversions("newline", v, true, 0, 0.0, "n");
  231. }
  232. template<class T>
  233. void checkRoundTrip(const std::string& msg, const LLSD& actual,
  234. const char* sExpected, T vExpected)
  235. {
  236. std::string str = actual.asString();
  237. if (sExpected) {
  238. ensure_equals(msg + " string", str, sExpected);
  239. }
  240. LLSD u(str);
  241. LLSDTraits<T> traits;
  242. ensure_equals(msg + " value", traits.get(u), vExpected);
  243. }
  244. template<> template<>
  245. void SDTestObject::test<5>()
  246. // conversion of String to and from UUID, Date and URI.
  247. {
  248. SDCleanupCheck check;
  249. LLSD v;
  250. LLUUID nullUUID;
  251. LLUUID someUUID;
  252. someUUID.generate();
  253. v = nullUUID; checkRoundTrip("null uuid", v,
  254. "00000000-0000-0000-0000-000000000000", nullUUID);
  255. v = someUUID; checkRoundTrip("random uuid", v, 0, someUUID);
  256. LLDate epoch;
  257. LLDate beta("2003-04-30T04:00:00Z");
  258. LLDate oneOh("2003-06-23T04:00:00Z");
  259. v = epoch; checkRoundTrip("epoch date", v, 0, epoch);
  260. v = beta; checkRoundTrip("beta date", v,
  261. "2003-04-30T04:00:00Z", beta);
  262. v = oneOh; checkRoundTrip("1.0 date", v,
  263. "2003-06-23T04:00:00Z", oneOh);
  264. LLURI empty;
  265. LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
  266. LLURI mail("mailto:zero.linden@secondlife.com");
  267. v = empty; checkRoundTrip("empty URI", v, 0, empty);
  268. v = path; checkRoundTrip("path URI", v,
  269. "http://slurl.com/secondlife/Ambleside/57/104/26/",
  270. path);
  271. v = mail; checkRoundTrip("mail URI", v,
  272. "mailto:zero.linden@secondlife.com", mail);
  273. }
  274. template<> template<>
  275. void SDTestObject::test<6>()
  276. // copy construction and assignment
  277. // checking for shared values after constr. or assignment
  278. // checking in both the same type and change of type case
  279. {
  280. SDCleanupCheck check;
  281. {
  282. LLSD v = 42;
  283. LLSD w0(v);
  284. ensureTypeAndValue("int constr.", w0, 42);
  285. LLSD w1(v);
  286. w1 = 13;
  287. ensureTypeAndValue("int constr. change case 1", w1, 13);
  288. ensureTypeAndValue("int constr. change case 2", v, 42);
  289. LLSD w2(v);
  290. v = 7;
  291. ensureTypeAndValue("int constr. change case 3", w2, 42);
  292. ensureTypeAndValue("int constr. change case 4", v, 7);
  293. }
  294. {
  295. LLSD v = 42;
  296. LLSD w1(v);
  297. w1 = "bob";
  298. ensureTypeAndValue("string constr. change case 1", w1, "bob");
  299. ensureTypeAndValue("string constr. change case 2", v, 42);
  300. LLSD w2(v);
  301. v = "amy";
  302. ensureTypeAndValue("string constr. change case 3", w2, 42);
  303. ensureTypeAndValue("string constr. change case 4", v, "amy");
  304. }
  305. {
  306. LLSD v = 42;
  307. LLSD w0;
  308. w0 = v;
  309. ensureTypeAndValue("int assign", w0, 42);
  310. LLSD w1;
  311. w1 = v;
  312. w1 = 13;
  313. ensureTypeAndValue("int assign change case 1", w1, 13);
  314. ensureTypeAndValue("int assign change case 2", v, 42);
  315. LLSD w2;
  316. w2 = v;
  317. v = 7;
  318. ensureTypeAndValue("int assign change case 3", w2, 42);
  319. ensureTypeAndValue("int assign change case 4", v, 7);
  320. }
  321. {
  322. LLSD v = 42;
  323. LLSD w1;
  324. w1 = v;
  325. w1 = "bob";
  326. ensureTypeAndValue("string assign change case 1", w1, "bob");
  327. ensureTypeAndValue("string assign change case 2", v, 42);
  328. LLSD w2;
  329. w2 = v;
  330. v = "amy";
  331. ensureTypeAndValue("string assign change case 3", w2, 42);
  332. ensureTypeAndValue("string assign change case 4", v, "amy");
  333. }
  334. }
  335. template<> template<>
  336. void SDTestObject::test<7>()
  337. // Test assignment and casting to various scalar types.  These
  338. // assignments should invoke the right conversion without it being
  339. // mentioned explicitly.  The few exceptions are marked SAD.
  340. {
  341. SDCleanupCheck check;
  342. LLSD v("  42.375");
  343. bool b = false;
  344. b = v; ensure_equals("assign to bool", b, true);
  345. b = (bool)v; ensure_equals("cast to bool", b, true);
  346. int i = 99;
  347. i = v; ensure_equals("assign to int", i, 42);
  348. i = (int)v; ensure_equals("cast to int", i, 42);
  349. double d = 3.14159;
  350. d = v; ensure_equals("assign to double", d, 42.375);
  351. d = (double)v; ensure_equals("cast to double", d, 42.375);
  352. std::string s = "yo";
  353. // SAD s = v; ensure_equals("assign to string", s, "  42.375");
  354. s = (std::string)v; ensure_equals("cast to string", s, "  42.375");
  355. std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b";
  356. v = uuidStr;
  357. LLUUID u;
  358. u = v;
  359. ensure_equals("assign to LLUUID", u, LLUUID(uuidStr));
  360. // SAD u = (LLUUID)v;
  361. // ensure_equals("cast to LLUUID", u, LLUUID(uuidStr));
  362. std::string dateStr = "2005-10-24T15:00:00Z";
  363. v = dateStr;
  364. LLDate date;
  365. date = v;
  366. ensure_equals("assign to LLDate", date.asString(), dateStr);
  367. // SAD date = (LLDate)v;
  368. // ensure_equals("cast to LLDate", date.asString(), dateStr);
  369. std::string uriStr = "http://secondlife.com";
  370. v = uriStr;
  371. LLURI uri;
  372. uri = v;
  373. ensure_equals("assign to LLURI", uri.asString(), uriStr);
  374. // SAD  uri = (LLURI)v;
  375. // ensure_equals("cast to LLURI", uri.asString(), uriStr);
  376. }
  377. template<> template<>
  378. void SDTestObject::test<8>()
  379. // Test construction of various scalar types from LLSD.
  380. // Test both construction and initialization forms.
  381. // These should invoke the right conversion without it being
  382. // mentioned explicitly.  The few exceptions are marked SAD.
  383. {
  384. SDCleanupCheck check;
  385. LLSD v("  42.375");
  386. bool b1(v); ensure_equals("contruct bool", b1, true);
  387. bool b2 = v; ensure_equals("initialize bool", b2, true);
  388. int i1(v); ensure_equals("contruct int", i1, 42);
  389. int i2 = v; ensure_equals("initialize int", i2, 42);
  390. double d1(v); ensure_equals("contruct double", d1, 42.375);
  391. double d2 = v; ensure_equals("initialize double", d2, 42.375);
  392. std::string s1(v);
  393. std::string s2 = v;
  394. ensure_equals("contruct string", s1, "  42.375");
  395. ensure_equals("initialize string", s2, "  42.375");
  396. std::string t1(v);
  397. std::string t2 = v.asString(); // SAD
  398. ensure_equals("contruct std::string", t1, "  42.375");
  399. ensure_equals("initialize std::string", t2, "  42.375");
  400. std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b";
  401. v = uuidStr;
  402. LLUUID uuid1(v.asUUID()); // SAD
  403. LLUUID uuid2 = v;
  404. ensure_equals("contruct LLUUID", uuid1, LLUUID(uuidStr));
  405. ensure_equals("initialize LLUUID", uuid2, LLUUID(uuidStr));
  406. std::string dateStr = "2005-10-24T15:00:00Z";
  407. v = dateStr;
  408. LLDate date1(v.asDate()); // SAD
  409. LLDate date2 = v;
  410. ensure_equals("contruct LLDate", date1.asString(), dateStr);
  411. ensure_equals("initialize LLDate", date2.asString(), dateStr);
  412. std::string uriStr = "http://secondlife.com";
  413. v = uriStr;
  414. LLURI uri1(v.asURI()); // SAD
  415. LLURI uri2 = v;
  416. ensure_equals("contruct LLURI", uri1.asString(), uriStr);
  417. ensure_equals("initialize LLURI", uri2.asString(), uriStr);
  418. }
  419. template<> template<>
  420. void SDTestObject::test<9>()
  421. // test to make sure v is interpreted as a bool in a various
  422. // scenarios.
  423. {
  424. SDCleanupCheck check;
  425. LLSD v = "0";
  426. // magic value that is interpreted as boolean true, but integer false!
  427. ensure_equals("trinary operator bool", (v ? true : false), true);
  428. ensure_equals("convert to int, then bool",
  429. ((int)v ? true : false), false);
  430. if(v)
  431. {
  432. ensure("if converted to bool", true);
  433. }
  434. else
  435. {
  436. fail("bool did not convert to a bool in if statement.");
  437. }
  438. if(!v)
  439. {
  440. fail("bool did not convert to a bool in negated if statement.");
  441. }
  442. }
  443. template<> template<>
  444. void SDTestObject::test<10>()
  445. // map operations
  446. {
  447. SDCleanupCheck check;
  448. LLSD v;
  449. ensure("undefined has no members", !v.has("amy"));
  450. ensure("undefined get() is undefined", v.get("bob").isUndefined());
  451. v = LLSD::emptyMap();
  452. ensure("empty map is a map", v.isMap());
  453. ensure("empty map has no members", !v.has("cam"));
  454. ensure("empty map get() is undefined", v.get("don").isUndefined());
  455. v.clear();
  456. v.insert("eli", 43);
  457. ensure("insert converts to map", v.isMap());
  458. ensure("inserted key is present", v.has("eli"));
  459. ensureTypeAndValue("inserted value", v.get("eli"), 43);
  460. v.insert("fra", false);
  461. ensure("first key still present", v.has("eli"));
  462. ensure("second key is present", v.has("fra"));
  463. ensureTypeAndValue("first value", v.get("eli"), 43);
  464. ensureTypeAndValue("second value", v.get("fra"), false);
  465. v.erase("eli");
  466. ensure("first key now gone", !v.has("eli"));
  467. ensure("second key still present", v.has("fra"));
  468. ensure("first value gone", v.get("eli").isUndefined());
  469. ensureTypeAndValue("second value sill there", v.get("fra"), false);
  470. v.erase("fra");
  471. ensure("second key now gone", !v.has("fra"));
  472. ensure("second value gone", v.get("fra").isUndefined());
  473. v["gil"] = (std::string)"good morning";
  474. ensure("third key present", v.has("gil"));
  475. ensureTypeAndValue("third key value", v.get("gil"), "good morning");
  476. const LLSD& cv = v; // FIX ME IF POSSIBLE
  477. ensure("missing key", cv["ham"].isUndefined());
  478. ensure("key not present", !v.has("ham"));
  479. LLSD w = 43;
  480. const LLSD& cw = w; // FIX ME IF POSSIBLE
  481. int i = cw["ian"];
  482. ensureTypeAndValue("other missing value", i, 0);
  483. ensure("other missing key", !w.has("ian"));
  484. ensure("no conversion", w.isInteger());
  485. LLSD x;
  486. x = v;
  487. ensure("copy map type", x.isMap());
  488. ensureTypeAndValue("copy map value gil", x.get("gil"), "good morning");
  489. }
  490. template<> template<>
  491. void SDTestObject::test<11>()
  492. // array operations
  493. {
  494. SDCleanupCheck check;
  495. LLSD v;
  496. ensure_equals("undefined has no size", v.size(), 0);
  497. ensure("undefined get() is undefined", v.get(0).isUndefined());
  498. v = LLSD::emptyArray();
  499. ensure("empty array is an array", v.isArray());
  500. ensure_equals("empty array has no size", v.size(), 0);
  501. ensure("empty map get() is undefined", v.get(0).isUndefined());
  502. v.clear();
  503. v.append(88);
  504. v.append("noodle");
  505. v.append(true);
  506. ensure_equals("appened array size", v.size(), 3);
  507. ensure("append array is an array", v.isArray());
  508. ensureTypeAndValue("append 0", v[0], 88);
  509. ensureTypeAndValue("append 1", v[1], "noodle");
  510. ensureTypeAndValue("append 2", v[2], true);
  511. v.insert(0, 77);
  512. v.insert(2, "soba");
  513. v.insert(4, false);
  514. ensure_equals("inserted array size", v.size(), 6);
  515. ensureTypeAndValue("post insert 0", v[0], 77);
  516. ensureTypeAndValue("post insert 1", v[1], 88);
  517. ensureTypeAndValue("post insert 2", v[2], "soba");
  518. ensureTypeAndValue("post insert 3", v[3], "noodle");
  519. ensureTypeAndValue("post insert 4", v[4], false);
  520. ensureTypeAndValue("post insert 5", v[5], true);
  521. ensureTypeAndValue("get 1", v.get(1), 88);
  522. v.set(1, "hot");
  523. ensureTypeAndValue("set 1", v.get(1), "hot");
  524. v.erase(3);
  525. ensure_equals("post erase array size", v.size(), 5);
  526. ensureTypeAndValue("post erase 0", v[0], 77);
  527. ensureTypeAndValue("post erase 1", v[1], "hot");
  528. ensureTypeAndValue("post erase 2", v[2], "soba");
  529. ensureTypeAndValue("post erase 3", v[3], false);
  530. ensureTypeAndValue("post erase 4", v[4], true);
  531. v.append(34);
  532. ensure_equals("size after append", v.size(), 6);
  533. ensureTypeAndValue("post append 5", v[5], 34);
  534. LLSD w;
  535. w = v;
  536. ensure("copy array type", w.isArray());
  537. ensure_equals("copy array size", w.size(), 6);
  538. ensureTypeAndValue("copy array 0", w[0], 77);
  539. ensureTypeAndValue("copy array 1", w[1], "hot");
  540. ensureTypeAndValue("copy array 2", w[2], "soba");
  541. ensureTypeAndValue("copy array 3", w[3], false);
  542. ensureTypeAndValue("copy array 4", w[4], true);
  543. ensureTypeAndValue("copy array 5", w[5], 34);
  544. }
  545. template<> template<>
  546. void SDTestObject::test<12>()
  547. // no sharing
  548. {
  549. SDCleanupCheck check;
  550. LLSD a = 99;
  551. LLSD b = a;
  552. a = 34;
  553. ensureTypeAndValue("top level original changed", a, 34);
  554. ensureTypeAndValue("top level copy unaltered", b, 99);
  555. b = a;
  556. b = 66;
  557. ensureTypeAndValue("top level original unaltered", a, 34);
  558. ensureTypeAndValue("top level copy changed", b, 66);
  559. a[0] = "uno";
  560. a[1] = 99;
  561. a[2] = 1.414;
  562. b = a;
  563. a[1] = 34;
  564. ensureTypeAndValue("array member original changed", a[1], 34);
  565. ensureTypeAndValue("array member copy unaltered", b[1], 99);
  566. b = a;
  567. b[1] = 66;
  568. ensureTypeAndValue("array member original unaltered", a[1], 34);
  569. ensureTypeAndValue("array member copy changed", b[1], 66);
  570. a["alpha"] = "uno";
  571. a["beta"] = 99;
  572. a["gamma"] = 1.414;
  573. b = a;
  574. a["beta"] = 34;
  575. ensureTypeAndValue("map member original changed", a["beta"], 34);
  576. ensureTypeAndValue("map member copy unaltered", b["beta"], 99);
  577. b = a;
  578. b["beta"] = 66;
  579. ensureTypeAndValue("map member original unaltered", a["beta"], 34);
  580. ensureTypeAndValue("map member copy changed", b["beta"], 66);
  581. }
  582. template<> template<>
  583. void SDTestObject::test<13>()
  584. // sharing implementation
  585. {
  586. SDCleanupCheck check;
  587. {
  588. SDAllocationCheck check("copy construct undefinded", 0);
  589. LLSD v;
  590. LLSD w = v;
  591. }
  592. {
  593. SDAllocationCheck check("assign undefined", 0);
  594. LLSD v;
  595. LLSD w;
  596. w = v;
  597. }
  598. {
  599. SDAllocationCheck check("assign integer value", 1);
  600. LLSD v = 45;
  601. v = 33;
  602. v = 0;
  603. }
  604. {
  605. SDAllocationCheck check("copy construct integer", 1);
  606. LLSD v = 45;
  607. LLSD w = v;
  608. }
  609. {
  610. SDAllocationCheck check("assign integer", 1);
  611. LLSD v = 45;
  612. LLSD w;
  613. w = v;
  614. }
  615. {
  616. SDAllocationCheck check("avoids extra clone", 2);
  617. LLSD v = 45;
  618. LLSD w = v;
  619. w = "nice day";
  620. }
  621. }
  622. template<> template<>
  623. void SDTestObject::test<14>()
  624. // make sure that assignment of char* NULL in a string does not crash.
  625. {
  626. LLSD v;
  627. v = (const char*)NULL;
  628. ensure("type is a string", v.isString());
  629. }
  630. /* TO DO:
  631. conversion of undefined to UUID, Date, URI and Binary
  632. conversion of undefined to map and array
  633. test map operations
  634. test array operations
  635. test array extension
  636. test copying and assign maps and arrays (clone)
  637. test iteration over map
  638. test iteration over array
  639. test iteration over scalar
  640. test empty map and empty array are indeed shared
  641. test serializations
  642. */
  643. }