00001
00033 #include <tut/tut.h>
00034 #include "linden_common.h"
00035 #include "lltut.h"
00036
00037 #include "llsdtraits.h"
00038 #include "llstring.h"
00039
00040 namespace tut
00041 {
00042 class SDCleanupCheck
00043 {
00044 private:
00045 U32 mOutstandingAtStart;
00046 public:
00047 SDCleanupCheck() : mOutstandingAtStart(LLSD::outstandingCount()) { }
00048 ~SDCleanupCheck()
00049 {
00050 ensure_equals("SDCleanupCheck",
00051 LLSD::outstandingCount(), mOutstandingAtStart);
00052 }
00053 };
00054
00055 class SDAllocationCheck : public SDCleanupCheck
00056 {
00057 private:
00058 std::string mMessage;
00059 U32 mExpectedAllocations;
00060 U32 mAllocationAtStart;
00061 public:
00062 SDAllocationCheck(const std::string& message, int expectedAllocations)
00063 : mMessage(message),
00064 mExpectedAllocations(expectedAllocations),
00065 mAllocationAtStart(LLSD::allocationCount())
00066 { }
00067 ~SDAllocationCheck()
00068 {
00069 ensure_equals(mMessage + " SDAllocationCheck",
00070 LLSD::allocationCount() - mAllocationAtStart,
00071 mExpectedAllocations);
00072 }
00073 };
00074
00075 struct SDTestData {
00076 template<class T>
00077 static void ensureTypeAndValue(const char* msg, const LLSD& actual,
00078 T expectedValue)
00079 {
00080 LLSDTraits<T> traits;
00081
00082 std::string s(msg);
00083
00084 ensure( s + " type", traits.checkType(actual));
00085 ensure_equals( s + " value", traits.get(actual), expectedValue);
00086 }
00087 };
00088
00089 typedef test_group<SDTestData> SDTestGroup;
00090 typedef SDTestGroup::object SDTestObject;
00091
00092 SDTestGroup sdTestGroup("LLSD(new)");
00093
00094 template<> template<>
00095 void SDTestObject::test<1>()
00096
00097 {
00098 SDCleanupCheck check;
00099
00100 LLSD u;
00101 ensure("is undefined", u.isUndefined());
00102 }
00103
00104 template<> template<>
00105 void SDTestObject::test<2>()
00106
00107 {
00108 SDCleanupCheck check;
00109
00110 LLSD v;
00111
00112 v = true; ensureTypeAndValue("set true", v, true);
00113 v = false; ensureTypeAndValue("set false", v, false);
00114 v = true; ensureTypeAndValue("set true again", v, true);
00115
00116 v = 42; ensureTypeAndValue("set to 42", v, 42);
00117 v = 0; ensureTypeAndValue("set to zero", v, 0);
00118 v = -12345; ensureTypeAndValue("set to neg", v, -12345);
00119 v = 2000000000; ensureTypeAndValue("set to big", v, 2000000000);
00120
00121 v = 3.14159265359;
00122 ensureTypeAndValue("set to pi", v, 3.14159265359);
00123 ensure_not_equals("isn't float", v.asReal(),
00124 (float)3.14159265359);
00125 v = 6.7e256; ensureTypeAndValue("set to big", v, 6.7e256);
00126
00127 LLUUID nullUUID;
00128 LLUUID newUUID;
00129 newUUID.generate();
00130
00131 v = nullUUID; ensureTypeAndValue("set to null UUID", v, nullUUID);
00132 v = newUUID; ensureTypeAndValue("set to new UUID", v, newUUID);
00133 v = nullUUID; ensureTypeAndValue("set to null again", v, nullUUID);
00134
00135
00136 std::string s = "now is the time";
00137 LLString ls = "for all good zorks";
00138 const char* cs = "to come to the air of their planet";
00139
00140 v = s; ensureTypeAndValue("set to std::string", v, s);
00141 v = ls; ensureTypeAndValue("set to LLString", v, ls);
00142 v = cs; ensureTypeAndValue("set to const char*", v, cs);
00143
00144 LLDate epoch;
00145 LLDate aDay("2001-10-22T10:11:12.00Z");
00146
00147 v = epoch; ensureTypeAndValue("set to epoch", v, epoch);
00148 v = aDay; ensureTypeAndValue("set to a day", v, aDay);
00149
00150 LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
00151
00152 v = path; ensureTypeAndValue("set to a uri", v, path);
00153
00154 const char source[] = "once in a blue moon";
00155 std::vector<U8> data;
00156 copy(&source[0], &source[sizeof(source)], back_inserter(data));
00157
00158 v = data; ensureTypeAndValue("set to data", v, data);
00159
00160 v.clear();
00161 ensure("reset to undefined", v.type() == LLSD::TypeUndefined);
00162 }
00163
00164 template<> template<>
00165 void SDTestObject::test<3>()
00166
00167
00168 {
00169 SDCleanupCheck check;
00170
00171 LLSD b1(true); ensureTypeAndValue("construct boolean", b1, true);
00172 LLSD b2 = true; ensureTypeAndValue("initialize boolean", b2, true);
00173 LLSD i1(42); ensureTypeAndValue("construct int", i1, 42);
00174 LLSD i2 =42; ensureTypeAndValue("initialize int", i2, 42);
00175 LLSD d1(1.2); ensureTypeAndValue("construct double", d1, 1.2);
00176 LLSD d2 = 1.2; ensureTypeAndValue("initialize double", d2, 1.2);
00177
00178 LLUUID newUUID;
00179 newUUID.generate();
00180 LLSD u1(newUUID);
00181 ensureTypeAndValue("construct UUID", u1, newUUID);
00182 LLSD u2 = newUUID;
00183 ensureTypeAndValue("initialize UUID", u2, newUUID);
00184
00185 LLSD ss1(std::string("abc"));
00186 ensureTypeAndValue("construct std::string", ss1, "abc");
00187 LLSD ss2 = std::string("abc");
00188 ensureTypeAndValue("initialize std::string",ss2, "abc");
00189 LLSD sl1(LLString("def"));
00190 ensureTypeAndValue("construct LLString", sl1, "def");
00191 LLSD sl2 = LLString("def");
00192 ensureTypeAndValue("initialize LLString", sl2, "def");
00193 LLSD sc1("ghi");
00194 ensureTypeAndValue("construct const char*", sc1, "ghi");
00195 LLSD sc2 = "ghi";
00196 ensureTypeAndValue("initialize const char*",sc2, "ghi");
00197
00198 LLDate aDay("2001-10-22T10:11:12.00Z");
00199 LLSD t1(aDay); ensureTypeAndValue("construct LLDate", t1, aDay);
00200 LLSD t2 = aDay; ensureTypeAndValue("initialize LLDate", t2, aDay);
00201
00202 LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
00203 LLSD p1(path); ensureTypeAndValue("construct LLURI", p1, path);
00204 LLSD p2 = path; ensureTypeAndValue("initialize LLURI", p2, path);
00205
00206 const char source[] = "once in a blue moon";
00207 std::vector<U8> data;
00208 copy(&source[0], &source[sizeof(source)], back_inserter(data));
00209 LLSD x1(data); ensureTypeAndValue("construct vector<U8>", x1, data);
00210 LLSD x2 = data; ensureTypeAndValue("initialize vector<U8>", x2, data);
00211 }
00212
00213 void checkConversions(const char* msg, const LLSD& v,
00214 LLSD::Boolean eBoolean, LLSD::Integer eInteger,
00215 LLSD::Real eReal, const LLSD::String& eString)
00216 {
00217 std::string s(msg);
00218
00219 ensure_equals(s+" to bool", v.asBoolean(), eBoolean);
00220 ensure_equals(s+" to int", v.asInteger(), eInteger);
00221 if (eReal == eReal)
00222 {
00223 ensure_equals(s+" to real", v.asReal(), eReal);
00224 ensure_equals(s+" to string", v.asString(), eString);
00225 }
00226 else
00227 {
00228
00229 #ifndef LL_WINDOWS
00230 # if !defined(fpclassify) && __GNUC__ >= 3
00231 # define FPCLASSIFY_NAMESPACE std::
00232 # else
00233 # define FPCLASSIFY_NAMESPACE
00234 # endif
00235 int left = FPCLASSIFY_NAMESPACE fpclassify(v.asReal());
00236 int right = FPCLASSIFY_NAMESPACE fpclassify(eReal);
00237
00238 ensure_equals(s+" to real", left, right);
00239 ensure_equals(s+" to string", v.asString(), eString);
00240 #endif
00241 }
00242 }
00243
00244 template<> template<>
00245 void SDTestObject::test<4>()
00246
00247
00248 {
00249 SDCleanupCheck check;
00250
00251 LLSD v; checkConversions("untitled", v, false, 0, 0.0, "");
00252
00253 v = false; checkConversions("false", v, false, 0, 0.0, "");
00254 v = true; checkConversions("true", v, true, 1, 1.0, "true");
00255
00256 v = 0; checkConversions("zero", v, false, 0, 0.0, "0");
00257 v = 1; checkConversions("one", v, true, 1, 1.0, "1");
00258 v = -33; checkConversions("neg33", v, true, -33, -33.0, "-33");
00259
00260 v = 0.0; checkConversions("0.0", v, false, 0, 0.0, "0");
00261 v = 0.5; checkConversions("point5", v, true, 0, 0.5, "0.5");
00262 v = 0.9; checkConversions("point9", v, true, 0, 0.9, "0.9");
00263 v = -3.9; checkConversions("neg3dot9", v, true, -3, -3.9, "-3.9");
00264 v = sqrt(-1.0); checkConversions("NaN", v, false, 0, sqrt(-1.0), "nan");
00265
00266 v = ""; checkConversions("empty", v, false, 0, 0.0, "");
00267 v = "0"; checkConversions("digit0", v, true, 0, 0.0, "0");
00268 v = "10"; checkConversions("digit10", v, true, 10, 10.0, "10");
00269 v = "-2.345"; checkConversions("decdigits", v,
00270 true, -2, -2.345, "-2.345");
00271 v = "apple"; checkConversions("apple", v, true, 0, 0.0, "apple");
00272 v = "33bob"; checkConversions("digialpha", v, true, 0, 0.0, "33bob");
00273 v = " "; checkConversions("space", v, true, 0, 0.0, " ");
00274 v = "\n"; checkConversions("newline", v, true, 0, 0.0, "\n");
00275 }
00276
00277 template<class T>
00278 void checkRoundTrip(const std::string& msg, const LLSD& actual,
00279 const char* sExpected, T vExpected)
00280 {
00281 std::string str = actual.asString();
00282
00283 if (sExpected) {
00284 ensure_equals(msg + " string", str, sExpected);
00285 }
00286
00287 LLSD u(str);
00288 LLSDTraits<T> traits;
00289
00290 ensure_equals(msg + " value", traits.get(u), vExpected);
00291 }
00292
00293
00294 template<> template<>
00295 void SDTestObject::test<5>()
00296
00297 {
00298 SDCleanupCheck check;
00299
00300 LLSD v;
00301
00302 LLUUID nullUUID;
00303 LLUUID someUUID;
00304 someUUID.generate();
00305
00306 v = nullUUID; checkRoundTrip("null uuid", v,
00307 "00000000-0000-0000-0000-000000000000", nullUUID);
00308 v = someUUID; checkRoundTrip("random uuid", v, 0, someUUID);
00309
00310 LLDate epoch;
00311 LLDate beta("2003-04-30T04:00:00Z");
00312 LLDate oneOh("2003-06-23T04:00:00Z");
00313
00314 v = epoch; checkRoundTrip("epoch date", v, 0, epoch);
00315 v = beta; checkRoundTrip("beta date", v,
00316 "2003-04-30T04:00:00Z", beta);
00317 v = oneOh; checkRoundTrip("1.0 date", v,
00318 "2003-06-23T04:00:00Z", oneOh);
00319
00320 LLURI empty;
00321 LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
00322 LLURI mail("mailto:zero.linden@secondlife.com");
00323
00324 v = empty; checkRoundTrip("empty URI", v, 0, empty);
00325 v = path; checkRoundTrip("path URI", v,
00326 "http://slurl.com/secondlife/Ambleside/57/104/26/",
00327 path);
00328 v = mail; checkRoundTrip("mail URI", v,
00329 "mailto:zero.linden@secondlife.com", mail);
00330 }
00331
00332 template<> template<>
00333 void SDTestObject::test<6>()
00334
00335
00336
00337 {
00338 SDCleanupCheck check;
00339
00340 {
00341 LLSD v = 42;
00342
00343 LLSD w0(v);
00344 ensureTypeAndValue("int constr.", w0, 42);
00345
00346 LLSD w1(v);
00347 w1 = 13;
00348 ensureTypeAndValue("int constr. change case 1", w1, 13);
00349 ensureTypeAndValue("int constr. change case 2", v, 42);
00350
00351 LLSD w2(v);
00352 v = 7;
00353 ensureTypeAndValue("int constr. change case 3", w2, 42);
00354 ensureTypeAndValue("int constr. change case 4", v, 7);
00355 }
00356
00357 {
00358 LLSD v = 42;
00359
00360 LLSD w1(v);
00361 w1 = "bob";
00362 ensureTypeAndValue("string constr. change case 1", w1, "bob");
00363 ensureTypeAndValue("string constr. change case 2", v, 42);
00364
00365 LLSD w2(v);
00366 v = "amy";
00367 ensureTypeAndValue("string constr. change case 3", w2, 42);
00368 ensureTypeAndValue("string constr. change case 4", v, "amy");
00369 }
00370
00371 {
00372 LLSD v = 42;
00373
00374 LLSD w0;
00375 w0 = v;
00376 ensureTypeAndValue("int assign", w0, 42);
00377
00378 LLSD w1;
00379 w1 = v;
00380 w1 = 13;
00381 ensureTypeAndValue("int assign change case 1", w1, 13);
00382 ensureTypeAndValue("int assign change case 2", v, 42);
00383
00384 LLSD w2;
00385 w2 = v;
00386 v = 7;
00387 ensureTypeAndValue("int assign change case 3", w2, 42);
00388 ensureTypeAndValue("int assign change case 4", v, 7);
00389 }
00390
00391 {
00392 LLSD v = 42;
00393
00394 LLSD w1;
00395 w1 = v;
00396 w1 = "bob";
00397 ensureTypeAndValue("string assign change case 1", w1, "bob");
00398 ensureTypeAndValue("string assign change case 2", v, 42);
00399
00400 LLSD w2;
00401 w2 = v;
00402 v = "amy";
00403 ensureTypeAndValue("string assign change case 3", w2, 42);
00404 ensureTypeAndValue("string assign change case 4", v, "amy");
00405 }
00406 }
00407
00408
00409 template<> template<>
00410 void SDTestObject::test<7>()
00411
00412
00413
00414 {
00415 SDCleanupCheck check;
00416
00417 LLSD v(" 42.375");
00418
00419 bool b = false;
00420 b = v; ensure_equals("assign to bool", b, true);
00421 b = (bool)v; ensure_equals("cast to bool", b, true);
00422
00423 int i = 99;
00424 i = v; ensure_equals("assign to int", i, 42);
00425 i = (int)v; ensure_equals("cast to int", i, 42);
00426
00427 double d = 3.14159;
00428 d = v; ensure_equals("assign to double", d, 42.375);
00429 d = (double)v; ensure_equals("cast to double", d, 42.375);
00430
00431 std::string s = "yo";
00432
00433 s = (std::string)v; ensure_equals("cast to string", s, " 42.375");
00434
00435 LLString t = "yo";
00436
00437 t = (LLString)v; ensure_equals("cast to LLString", t, " 42.375");
00438
00439 std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b";
00440 v = uuidStr;
00441 LLUUID u;
00442 u = v;
00443 ensure_equals("assign to LLUUID", u, LLUUID(uuidStr));
00444
00445
00446
00447 std::string dateStr = "2005-10-24T15:00:00Z";
00448 v = dateStr;
00449 LLDate date;
00450 date = v;
00451 ensure_equals("assign to LLDate", date.asString(), dateStr);
00452
00453
00454
00455 std::string uriStr = "http://secondlife.com";
00456 v = uriStr;
00457 LLURI uri;
00458 uri = v;
00459 ensure_equals("assign to LLURI", uri.asString(), uriStr);
00460
00461
00462 }
00463
00464 template<> template<>
00465 void SDTestObject::test<8>()
00466
00467
00468
00469
00470 {
00471 SDCleanupCheck check;
00472
00473 LLSD v(" 42.375");
00474
00475 bool b1(v); ensure_equals("contruct bool", b1, true);
00476 bool b2 = v; ensure_equals("initialize bool", b2, true);
00477
00478 int i1(v); ensure_equals("contruct int", i1, 42);
00479 int i2 = v; ensure_equals("initialize int", i2, 42);
00480
00481 double d1(v); ensure_equals("contruct double", d1, 42.375);
00482 double d2 = v; ensure_equals("initialize double", d2, 42.375);
00483
00484 std::string s1(v);
00485 std::string s2 = v;
00486 ensure_equals("contruct string", s1, " 42.375");
00487 ensure_equals("initialize string", s2, " 42.375");
00488
00489 LLString t1(v);
00490 LLString t2 = v.asString();
00491 ensure_equals("contruct LLString", t1, " 42.375");
00492 ensure_equals("initialize LLString", t2, " 42.375");
00493
00494 std::string uuidStr = "b1e50c2b-b627-4d23-8a86-a65d97b6319b";
00495 v = uuidStr;
00496 LLUUID uuid1(v.asUUID());
00497 LLUUID uuid2 = v;
00498 ensure_equals("contruct LLUUID", uuid1, LLUUID(uuidStr));
00499 ensure_equals("initialize LLUUID", uuid2, LLUUID(uuidStr));
00500
00501 std::string dateStr = "2005-10-24T15:00:00Z";
00502 v = dateStr;
00503 LLDate date1(v.asDate());
00504 LLDate date2 = v;
00505 ensure_equals("contruct LLDate", date1.asString(), dateStr);
00506 ensure_equals("initialize LLDate", date2.asString(), dateStr);
00507
00508 std::string uriStr = "http://secondlife.com";
00509 v = uriStr;
00510 LLURI uri1(v.asURI());
00511 LLURI uri2 = v;
00512 ensure_equals("contruct LLURI", uri1.asString(), uriStr);
00513 ensure_equals("initialize LLURI", uri2.asString(), uriStr);
00514 }
00515
00516
00517 template<> template<>
00518 void SDTestObject::test<9>()
00519
00520
00521 {
00522 SDCleanupCheck check;
00523
00524 LLSD v = "0";
00525
00526
00527 ensure_equals("trinary operator bool", (v ? true : false), true);
00528 ensure_equals("convert to int, then bool",
00529 ((int)v ? true : false), false);
00530
00531 if(v)
00532 {
00533 ensure("if converted to bool", true);
00534 }
00535 else
00536 {
00537 fail("bool did not convert to a bool in if statement.");
00538 }
00539
00540 if(!v)
00541 {
00542 fail("bool did not convert to a bool in negated if statement.");
00543 }
00544 }
00545
00546 template<> template<>
00547 void SDTestObject::test<10>()
00548
00549 {
00550 SDCleanupCheck check;
00551
00552 LLSD v;
00553 ensure("undefined has no members", !v.has("amy"));
00554 ensure("undefined get() is undefined", v.get("bob").isUndefined());
00555
00556 v = LLSD::emptyMap();
00557 ensure("empty map is a map", v.isMap());
00558 ensure("empty map has no members", !v.has("cam"));
00559 ensure("empty map get() is undefined", v.get("don").isUndefined());
00560
00561 v.clear();
00562 v.insert("eli", 43);
00563 ensure("insert converts to map", v.isMap());
00564 ensure("inserted key is present", v.has("eli"));
00565 ensureTypeAndValue("inserted value", v.get("eli"), 43);
00566
00567 v.insert("fra", false);
00568 ensure("first key still present", v.has("eli"));
00569 ensure("second key is present", v.has("fra"));
00570 ensureTypeAndValue("first value", v.get("eli"), 43);
00571 ensureTypeAndValue("second value", v.get("fra"), false);
00572
00573 v.erase("eli");
00574 ensure("first key now gone", !v.has("eli"));
00575 ensure("second key still present", v.has("fra"));
00576 ensure("first value gone", v.get("eli").isUndefined());
00577 ensureTypeAndValue("second value sill there", v.get("fra"), false);
00578
00579 v.erase("fra");
00580 ensure("second key now gone", !v.has("fra"));
00581 ensure("second value gone", v.get("fra").isUndefined());
00582
00583 v["gil"] = (std::string)"good morning";
00584 ensure("third key present", v.has("gil"));
00585 ensureTypeAndValue("third key value", v.get("gil"), "good morning");
00586
00587 const LLSD& cv = v;
00588 ensure("missing key", cv["ham"].isUndefined());
00589 ensure("key not present", !v.has("ham"));
00590
00591 LLSD w = 43;
00592 const LLSD& cw = w;
00593 int i = cw["ian"];
00594 ensureTypeAndValue("other missing value", i, 0);
00595 ensure("other missing key", !w.has("ian"));
00596 ensure("no conversion", w.isInteger());
00597
00598 LLSD x;
00599 x = v;
00600 ensure("copy map type", x.isMap());
00601 ensureTypeAndValue("copy map value gil", x.get("gil"), "good morning");
00602 }
00603
00604
00605 template<> template<>
00606 void SDTestObject::test<11>()
00607
00608 {
00609 SDCleanupCheck check;
00610
00611 LLSD v;
00612 ensure_equals("undefined has no size", v.size(), 0);
00613 ensure("undefined get() is undefined", v.get(0).isUndefined());
00614
00615 v = LLSD::emptyArray();
00616 ensure("empty array is an array", v.isArray());
00617 ensure_equals("empty array has no size", v.size(), 0);
00618 ensure("empty map get() is undefined", v.get(0).isUndefined());
00619
00620 v.clear();
00621 v.append(88);
00622 v.append("noodle");
00623 v.append(true);
00624 ensure_equals("appened array size", v.size(), 3);
00625 ensure("append array is an array", v.isArray());
00626 ensureTypeAndValue("append 0", v[0], 88);
00627 ensureTypeAndValue("append 1", v[1], "noodle");
00628 ensureTypeAndValue("append 2", v[2], true);
00629
00630 v.insert(0, 77);
00631 v.insert(2, "soba");
00632 v.insert(4, false);
00633 ensure_equals("inserted array size", v.size(), 6);
00634 ensureTypeAndValue("post insert 0", v[0], 77);
00635 ensureTypeAndValue("post insert 1", v[1], 88);
00636 ensureTypeAndValue("post insert 2", v[2], "soba");
00637 ensureTypeAndValue("post insert 3", v[3], "noodle");
00638 ensureTypeAndValue("post insert 4", v[4], false);
00639 ensureTypeAndValue("post insert 5", v[5], true);
00640
00641 ensureTypeAndValue("get 1", v.get(1), 88);
00642 v.set(1, "hot");
00643 ensureTypeAndValue("set 1", v.get(1), "hot");
00644
00645 v.erase(3);
00646 ensure_equals("post erase array size", v.size(), 5);
00647 ensureTypeAndValue("post erase 0", v[0], 77);
00648 ensureTypeAndValue("post erase 1", v[1], "hot");
00649 ensureTypeAndValue("post erase 2", v[2], "soba");
00650 ensureTypeAndValue("post erase 3", v[3], false);
00651 ensureTypeAndValue("post erase 4", v[4], true);
00652
00653 v.append(34);
00654 ensure_equals("size after append", v.size(), 6);
00655 ensureTypeAndValue("post append 5", v[5], 34);
00656
00657 LLSD w;
00658 w = v;
00659 ensure("copy array type", w.isArray());
00660 ensure_equals("copy array size", w.size(), 6);
00661 ensureTypeAndValue("copy array 0", w[0], 77);
00662 ensureTypeAndValue("copy array 1", w[1], "hot");
00663 ensureTypeAndValue("copy array 2", w[2], "soba");
00664 ensureTypeAndValue("copy array 3", w[3], false);
00665 ensureTypeAndValue("copy array 4", w[4], true);
00666 ensureTypeAndValue("copy array 5", w[5], 34);
00667 }
00668
00669
00670 template<> template<>
00671 void SDTestObject::test<12>()
00672
00673 {
00674 SDCleanupCheck check;
00675
00676 LLSD a = 99;
00677 LLSD b = a;
00678 a = 34;
00679 ensureTypeAndValue("top level original changed", a, 34);
00680 ensureTypeAndValue("top level copy unaltered", b, 99);
00681 b = a;
00682 b = 66;
00683 ensureTypeAndValue("top level original unaltered", a, 34);
00684 ensureTypeAndValue("top level copy changed", b, 66);
00685
00686 a[0] = "uno";
00687 a[1] = 99;
00688 a[2] = 1.414;
00689 b = a;
00690 a[1] = 34;
00691 ensureTypeAndValue("array member original changed", a[1], 34);
00692 ensureTypeAndValue("array member copy unaltered", b[1], 99);
00693 b = a;
00694 b[1] = 66;
00695 ensureTypeAndValue("array member original unaltered", a[1], 34);
00696 ensureTypeAndValue("array member copy changed", b[1], 66);
00697
00698 a["alpha"] = "uno";
00699 a["beta"] = 99;
00700 a["gamma"] = 1.414;
00701 b = a;
00702 a["beta"] = 34;
00703 ensureTypeAndValue("map member original changed", a["beta"], 34);
00704 ensureTypeAndValue("map member copy unaltered", b["beta"], 99);
00705 b = a;
00706 b["beta"] = 66;
00707 ensureTypeAndValue("map member original unaltered", a["beta"], 34);
00708 ensureTypeAndValue("map member copy changed", b["beta"], 66);
00709 }
00710
00711 template<> template<>
00712 void SDTestObject::test<13>()
00713
00714 {
00715 SDCleanupCheck check;
00716
00717 {
00718 SDAllocationCheck check("copy construct undefinded", 0);
00719 LLSD v;
00720 LLSD w = v;
00721 }
00722
00723 {
00724 SDAllocationCheck check("assign undefined", 0);
00725 LLSD v;
00726 LLSD w;
00727 w = v;
00728 }
00729
00730 {
00731 SDAllocationCheck check("assign integer value", 1);
00732 LLSD v = 45;
00733 v = 33;
00734 v = 0;
00735 }
00736
00737 {
00738 SDAllocationCheck check("copy construct integer", 1);
00739 LLSD v = 45;
00740 LLSD w = v;
00741 }
00742
00743 {
00744 SDAllocationCheck check("assign integer", 1);
00745 LLSD v = 45;
00746 LLSD w;
00747 w = v;
00748 }
00749
00750 {
00751 SDAllocationCheck check("avoids extra clone", 2);
00752 LLSD v = 45;
00753 LLSD w = v;
00754 w = "nice day";
00755 }
00756 }
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773 }
00774