00001
00040 #include "linden_common.h"
00041 #include "lltut.h"
00042
00043 #include <algorithm>
00044 #include <iomanip>
00045 #include <iterator>
00046
00047 #include "llmemorystream.h"
00048 #include "llsd.h"
00049 #include "llsdserialize.h"
00050 #include "u64.h"
00051
00052 namespace tut
00053 {
00054 struct sd_data
00055 {
00056 };
00057 typedef test_group<sd_data> sd_test;
00058 typedef sd_test::object sd_object;
00059 tut::sd_test sd("llsd");
00060
00061 template<> template<>
00062 void sd_object::test<1>()
00063 {
00064 std::ostringstream resp;
00065 resp << "{'connect':true, 'position':[r128,r128,r128], 'look_at':[r0,r1,r0], 'agent_access':'M', 'region_x':i8192, 'region_y':i8192}";
00066 std::string str = resp.str();
00067 LLMemoryStream mstr((U8*)str.c_str(), str.size());
00068 LLSD response;
00069 S32 count = LLSDSerialize::fromNotation(response, mstr);
00070 ensure("stream parsed", response.isDefined());
00071 ensure_equals("stream parse count", count, 13);
00072 ensure_equals("sd type", response.type(), LLSD::TypeMap);
00073 ensure_equals("map element count", response.size(), 6);
00074 ensure_equals("value connect", response["connect"].asBoolean(), true);
00075 ensure_equals("value region_x", response["region_x"].asInteger(),8192);
00076 ensure_equals("value region_y", response["region_y"].asInteger(),8192);
00077 }
00078
00079 template<> template<>
00080 void sd_object::test<2>()
00081 {
00082 const std::string decoded("random");
00083
00084 const std::string streamed("b(6)\"random\"");
00085 typedef std::vector<U8> buf_t;
00086 buf_t buf;
00087 std::copy(
00088 decoded.begin(),
00089 decoded.end(),
00090 std::back_insert_iterator<buf_t>(buf));
00091 LLSD sd;
00092 sd = buf;
00093 std::stringstream str;
00094 S32 count = LLSDSerialize::toNotation(sd, str);
00095 ensure_equals("output count", count, 1);
00096 std::string actual(str.str());
00097 ensure_equals("formatted binary encoding", actual, streamed);
00098 sd.clear();
00099 LLSDSerialize::fromNotation(sd, str);
00100 std::vector<U8> after;
00101 after = sd.asBinary();
00102 ensure_equals("binary decoded size", after.size(), decoded.size());
00103 ensure("binary decoding", (0 == memcmp(
00104 &after[0],
00105 decoded.c_str(),
00106 decoded.size())));
00107 }
00108
00109 template<> template<>
00110 void sd_object::test<3>()
00111 {
00112 for(S32 i = 0; i < 100; ++i)
00113 {
00114
00115 typedef std::vector<U8> buf_t;
00116 buf_t source;
00117 srand(i);
00118 S32 size = rand() % 1000 + 10;
00119 std::generate_n(
00120 std::back_insert_iterator<buf_t>(source),
00121 size,
00122 rand);
00123 LLSD sd(source);
00124 std::stringstream str;
00125 S32 count = LLSDSerialize::toNotation(sd, str);
00126 sd.clear();
00127 ensure_equals("format count", count, 1);
00128 LLSD sd2;
00129 count = LLSDSerialize::fromNotation(sd2, str);
00130 ensure_equals("parse count", count, 1);
00131 buf_t dest = sd2.asBinary();
00132 str.str("");
00133 str << "binary encoding size " << i;
00134 ensure_equals(str.str().c_str(), dest.size(), source.size());
00135 str.str("");
00136 str << "binary encoding " << i;
00137 ensure(str.str().c_str(), (source == dest));
00138 }
00139 }
00140
00141 template<> template<>
00142 void sd_object::test<4>()
00143 {
00144 std::ostringstream ostr;
00145 ostr << "{'task_id':u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}\n"
00146 << "{\n\tname\tObject|\n}\n";
00147 std::string expected = ostr.str();
00148 std::stringstream serialized;
00149 serialized << "'" << LLSDNotationFormatter::escapeString(expected)
00150 << "'";
00151 LLSD sd;
00152 S32 count = LLSDSerialize::fromNotation(sd, serialized);
00153 ensure_equals("parse count", count, 1);
00154 ensure_equals("String streaming", sd.asString(), expected);
00155 }
00156
00157 template<> template<>
00158 void sd_object::test<5>()
00159 {
00160 for(S32 i = 0; i < 100; ++i)
00161 {
00162
00163 typedef std::vector<U8> buf_t;
00164 buf_t source;
00165 srand(666 + i);
00166 S32 size = rand() % 1000 + 10;
00167 std::generate_n(
00168 std::back_insert_iterator<buf_t>(source),
00169 size,
00170 rand);
00171 std::stringstream str;
00172 str << "b(" << size << ")\"";
00173 str.write((const char*)&source[0], size);
00174 str << "\"";
00175 LLSD sd;
00176 S32 count = LLSDSerialize::fromNotation(sd, str);
00177 ensure_equals("binary parse", count, 1);
00178 buf_t actual = sd.asBinary();
00179 ensure_equals("binary size", actual.size(), (size_t)size);
00180 ensure("binary data", (0 == memcmp(&source[0], &actual[0], size)));
00181 }
00182 }
00183
00184 template<> template<>
00185 void sd_object::test<6>()
00186 {
00187 std::string expected("'{\"task_id\":u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}'\t\n\t\t");
00188 std::stringstream str;
00189 str << "s(" << expected.size() << ")'";
00190 str.write(expected.c_str(), expected.size());
00191 str << "'";
00192 LLSD sd;
00193 S32 count = LLSDSerialize::fromNotation(sd, str);
00194 ensure_equals("parse count", count, 1);
00195 std::string actual = sd.asString();
00196 ensure_equals("string sizes", actual.size(), expected.size());
00197 ensure_equals("string content", actual, expected);
00198 }
00199
00200 template<> template<>
00201 void sd_object::test<7>()
00202 {
00203 std::string msg("come on in");
00204 std::stringstream stream;
00205 stream << "{'connect':1, 'message':'" << msg << "',"
00206 << " 'position':[r45.65,r100.1,r25.5],"
00207 << " 'look_at':[r0,r1,r0],"
00208 << " 'agent_access':'PG'}";
00209 LLSD sd;
00210 S32 count = LLSDSerialize::fromNotation(sd, stream);
00211 ensure_equals("parse count", count, 12);
00212 ensure_equals("bool value", sd["connect"].asBoolean(), true);
00213 ensure_equals("message value", sd["message"].asString(), msg);
00214 ensure_equals("pos x", sd["position"][0].asReal(), 45.65);
00215 ensure_equals("pos y", sd["position"][1].asReal(), 100.1);
00216 ensure_equals("pos z", sd["position"][2].asReal(), 25.5);
00217 ensure_equals("look x", sd["look_at"][0].asReal(), 0.0);
00218 ensure_equals("look y", sd["look_at"][1].asReal(), 1.0);
00219 ensure_equals("look z", sd["look_at"][2].asReal(), 0.0);
00220 }
00221
00222 template<> template<>
00223 void sd_object::test<8>()
00224 {
00225 std::stringstream resp;
00226 resp << "{'label':'short string test', 'singlechar':'a', 'empty':'', 'endoftest':'end' }";
00227 LLSD response;
00228 S32 count = LLSDSerialize::fromNotation(response, resp);
00229 ensure_equals("parse count", count, 5);
00230 ensure_equals("sd type", response.type(), LLSD::TypeMap);
00231 ensure_equals("map element count", response.size(), 4);
00232 ensure_equals("singlechar", response["singlechar"].asString(), "a");
00233 ensure_equals("empty", response["empty"].asString(), "");
00234 }
00235
00236 template<> template<>
00237 void sd_object::test<9>()
00238 {
00239 std::ostringstream resp;
00240 resp << "{'label':'short binary test', 'singlebinary':b(1)\"A\", 'singlerawstring':s(1)\"A\", 'endoftest':'end' }";
00241 std::string str = resp.str();
00242 LLSD sd;
00243 LLMemoryStream mstr((U8*)str.c_str(), str.size());
00244 S32 count = LLSDSerialize::fromNotation(sd, mstr);
00245 ensure_equals("parse count", count, 5);
00246 ensure("sd created", sd.isDefined());
00247 ensure_equals("sd type", sd.type(), LLSD::TypeMap);
00248 ensure_equals("map element count", sd.size(), 4);
00249 ensure_equals(
00250 "label",
00251 sd["label"].asString(),
00252 "short binary test");
00253 std::vector<U8> bin = sd["singlebinary"].asBinary();
00254 std::vector<U8> expected;
00255 expected.resize(1);
00256 expected[0] = 'A';
00257 ensure("single binary", (0 == memcmp(&bin[0], &expected[0], 1)));
00258 ensure_equals(
00259 "single string",
00260 sd["singlerawstring"].asString(),
00261 std::string("A"));
00262 ensure_equals("end", sd["endoftest"].asString(), "end");
00263 }
00264
00265 template<> template<>
00266 void sd_object::test<10>()
00267 {
00268
00269 std::string message("parcel '' is naughty.");
00270 std::stringstream str;
00271 str << "{'message':'" << LLSDNotationFormatter::escapeString(message)
00272 << "'}";
00273 std::string expected_str("{'message':'parcel \\'\\' is naughty.'}");
00274 std::string actual_str = str.str();
00275 ensure_equals("stream contents", actual_str, expected_str);
00276 LLSD sd;
00277 S32 count = LLSDSerialize::fromNotation(sd, str);
00278 ensure_equals("parse count", count, 2);
00279 ensure("valid parse", sd.isDefined());
00280 std::string actual = sd["message"].asString();
00281 ensure_equals("message contents", actual, message);
00282 }
00283
00284 template<> template<>
00285 void sd_object::test<11>()
00286 {
00287 std::string expected("\"\"\"\"''''''\"");
00288 std::stringstream str;
00289 str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
00290 LLSD sd;
00291 S32 count = LLSDSerialize::fromNotation(sd, str);
00292 ensure_equals("parse count", count, 1);
00293 ensure_equals("string value", sd.asString(), expected);
00294 }
00295
00296 template<> template<>
00297 void sd_object::test<12>()
00298 {
00299 std::string expected("mytest\\");
00300 std::stringstream str;
00301 str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
00302 LLSD sd;
00303 S32 count = LLSDSerialize::fromNotation(sd, str);
00304 ensure_equals("parse count", count, 1);
00305 ensure_equals("string value", sd.asString(), expected);
00306 }
00307
00308 template<> template<>
00309 void sd_object::test<13>()
00310 {
00311 for(S32 i = 0; i < 1000; ++i)
00312 {
00313
00314 std::string expected;
00315 srand(1337 + i);
00316 S32 size = rand() % 30 + 5;
00317 std::generate_n(
00318 std::back_insert_iterator<std::string>(expected),
00319 size,
00320 rand);
00321 std::stringstream str;
00322 str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
00323 LLSD sd;
00324 S32 count = LLSDSerialize::fromNotation(sd, str);
00325 ensure_equals("parse count", count, 1);
00326 std::string actual = sd.asString();
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 ensure_equals("string value", actual, expected);
00357 }
00358 }
00359
00360 template<> template<>
00361 void sd_object::test<14>()
00362 {
00363 std::string param = "[{'version':i1},{'data':{'binary_bucket':b(0)\"\"},'from_id':u3c115e51-04f4-523c-9fa6-98aff1034730,'from_name':'Phoenix Linden','id':u004e45e5-5576-277a-fba7-859d6a4cb5c8,'message':'hey','offline':i0,'timestamp':i0,'to_id':u3c5f1bb4-5182-7546-6401-1d329b4ff2f8,'type':i0},{'agent_id':u3c115e51-04f4-523c-9fa6-98aff1034730,'god_level':i0,'limited_to_estate':i1}]";
00364 std::istringstream istr;
00365 istr.str(param);
00366 LLSD param_sd;
00367 LLSDSerialize::fromNotation(param_sd, istr);
00368 ensure_equals("parsed type", param_sd.type(), LLSD::TypeArray);
00369 LLSD version_sd = param_sd[0];
00370 ensure_equals("version type", version_sd.type(), LLSD::TypeMap);
00371 ensure("has version", version_sd.has("version"));
00372 ensure_equals("version number", version_sd["version"].asInteger(), 1);
00373 LLSD src_sd = param_sd[1];
00374 ensure_equals("src type", src_sd.type(), LLSD::TypeMap);
00375 LLSD dst_sd = param_sd[2];
00376 ensure_equals("dst type", dst_sd.type(), LLSD::TypeMap);
00377 }
00378
00379 template<> template<>
00380 void sd_object::test<15>()
00381 {
00382 std::string val = "[{'failures':!,'successfuls':[u3c115e51-04f4-523c-9fa6-98aff1034730]}]";
00383 std::istringstream istr;
00384 istr.str(val);
00385 LLSD sd;
00386 LLSDSerialize::fromNotation(sd, istr);
00387 ensure_equals("parsed type", sd.type(), LLSD::TypeArray);
00388 ensure_equals("parsed size", sd.size(), 1);
00389 LLSD failures = sd[0]["failures"];
00390 ensure("no failures.", failures.isUndefined());
00391 LLSD success = sd[0]["successfuls"];
00392 ensure_equals("success type", success.type(), LLSD::TypeArray);
00393 ensure_equals("success size", success.size(), 1);
00394 ensure_equals("success instance type", success[0].type(), LLSD::TypeUUID);
00395 }
00396
00397 template<> template<>
00398 void sd_object::test<16>()
00399 {
00400 std::string val = "[f,t,0,1,{'foo':t,'bar':f}]";
00401 std::istringstream istr;
00402 istr.str(val);
00403 LLSD sd;
00404 LLSDSerialize::fromNotation(sd, istr);
00405 ensure_equals("parsed type", sd.type(), LLSD::TypeArray);
00406 ensure_equals("parsed size", sd.size(), 5);
00407 ensure_equals("element 0 false", sd[0].asBoolean(), false);
00408 ensure_equals("element 1 true", sd[1].asBoolean(), true);
00409 ensure_equals("element 2 false", sd[2].asBoolean(), false);
00410 ensure_equals("element 3 true", sd[3].asBoolean(), true);
00411 LLSD map = sd[4];
00412 ensure_equals("element 4 type", map.type(), LLSD::TypeMap);
00413 ensure_equals("map foo type", map["foo"].type(), LLSD::TypeBoolean);
00414 ensure_equals("map foo value", map["foo"].asBoolean(), true);
00415 ensure_equals("map bar type", map["bar"].type(), LLSD::TypeBoolean);
00416 ensure_equals("map bar value", map["bar"].asBoolean(), false);
00417 }
00418
00419
00420
00421
00422
00423
00424
00425 }
00426
00427 #if 0
00428 '{\'task_id\':u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}\n{\n\tname\tObject|\n\tpermissions 0\n\t{\n\t\tbase_mask\t7fffffff\n\t\towner_mask\t7fffffff\n\t\tgroup_mask\t00000000\n\t\teveryone_mask\t00000000\n\t\tnext_owner_mask\t00082000\n\t\tcreator_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\towner_id\t3c115e51-04f4-523c-9fa6-98aff1034730\n\t\tlast_owner_id\t00000000-0000-0000-0000-000000000000\n\t\tgroup_id\t00000000-0000-0000-0000-000000000000\n\t}\n\tlocal_id\t10284\n\ttotal_crc\t35\n\ttype\t1\n\ttask_valid\t2\n\ttravel_access\t21\n\tdisplayopts\t2\n\tdisplaytype\tv\n\tpos\t0\t0\t0\n\toldpos\t0\t0\t0\n\trotation\t4.371139183945160766597837e-08\t1\t4.371139183945160766597837e-08\t0\n\tvelocity\t0\t0\t0\n\tangvel\t0\t0\t0\n\tscale\t0.2816932\t0.2816932\t0.2816932\n\tsit_offset\t0\t0\t0\n\tcamera_eye_offset\t0\t0\t0\n\tcamera_at_offset\t0\t0\t0\n\tsit_quat\t0\t0\t0\t1\n\tsit_hint\t0\n\tstate\t80\n\tmaterial\t3\n\tsoundid\t00000000-0000-0000-0000-000000000000\n\tsoundgain\t0\n\tsoundradius\t0\n\tsoundflags\t0\n\ttextcolor\t0 0 0 1\n\tselected\t0\n\tselector\t00000000-0000-0000-0000-000000000000\n\tusephysics\t0\n\trotate_x\t1\n\trotate_y\t1\n\trotate_z\t1\n\tphantom\t0\n\tremote_script_access_pin\t0\n\tvolume_detect\t0\n\tblock_grabs\t0\n\tdie_at_edge\t0\n\treturn_at_edge\t0\n\ttemporary\t0\n\tsandbox\t0\n\tsandboxhome\t0\t0\t0\n\tshape 0\n\t{\n\t\tpath 0\n\t\t{\n\t\t\tcurve\t16\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\tscale_x\t1\n\t\t\tscale_y\t1\n\t\t\tshear_x\t0\n\t\t\tshear_y\t0\n\t\t\ttwist\t0\n\t\t\ttwist_begin\t0\n\t\t\tradius_offset\t0\n\t\t\ttaper_x\t0\n\t\t\ttaper_y\t0\n\t\t\trevolutions\t1\n\t\t\tskew\t0\n\t\t}\n\t\tprofile 0\n\t\t{\n\t\t\tcurve\t1\n\t\t\tbegin\t0\n\t\t\tend\t1\n\t\t\thollow\t0\n\t\t}\n\t}\n\tfaces\t6\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\t{\n\t\timageid\t89556747-24cb-43ed-920b-47caed15465f\n\t\tcolors\t1 1 1 1\n\t\tscales\t0.56\n\t\tscalet\t0.56\n\t\toffsets\t0\n\t\toffsett\t0\n\t\timagerot\t0\n\t\tbump\t0\n\t\tfullbright\t0\n\t\tmedia_flags\t0\n\t}\n\tps_next_crc\t1\n\tgpw_bias\t1\n\tip\t0\n\tcomplete\tTRUE\n\tdelay\t50000\n\tnextstart\t1132625972249870\n\tbirthtime\t1132625953120694\n\treztime\t1132625953120694\n\tparceltime\t1132625953120694\n\ttax_rate\t1.01615\n\tnamevalue\tAttachmentOrientation VEC3 RW DS -3.141593, 0.000000, -3.141593\n\tnamevalue\tAttachmentOffset VEC3 RW DS 0.000000, 0.000000, 0.000000\n\tnamevalue\tAttachPt U32 RW S 5\n\tnamevalue\tAttachItemID STRING RW SV 1f9975c0-2951-1b93-dd83-46e2b932fcc8\n\tscratchpad\t0\n\t{\n\t\n\t}\n\tsale_info\t0\n\t{\n\t\tsale_type\tnot\n\t\tsale_price\t10\n\t}\n\torig_asset_id\t52019cdd-b464-ba19-e66d-3da751fef9da\n\torig_item_id\t1f9975c0-2951-1b93-dd83-46e2b932fcc8\n\tcorrect_family_id\t00000000-0000-0000-0000-000000000000\n\thas_rezzed\t0\n\tpre_link_base_mask\t7fffffff\n\tdefault_pay_price\t-2\t1\t5\t10\t20\n}\n'
00429 #endif
00430
00431 namespace tut
00432 {
00433 struct mem_data
00434 {
00435 };
00436 typedef test_group<mem_data> mem_test;
00437 typedef mem_test::object mem_object;
00438 tut::mem_test mem_stream("memory_stream");
00439
00440 template<> template<>
00441 void mem_object::test<1>()
00442 {
00443 const char HELLO_WORLD[] = "hello world";
00444 LLMemoryStream mem((U8*)&HELLO_WORLD[0], strlen(HELLO_WORLD));
00445 std::string hello;
00446 std::string world;
00447 mem >> hello >> world;
00448 ensure_equals("first word", hello, std::string("hello"));
00449 ensure_equals("second word", world, std::string("world"));
00450 }
00451 }
00452
00453 namespace tut
00454 {
00455 struct U64_data
00456 {
00457 };
00458 typedef test_group<U64_data> U64_test;
00459 typedef U64_test::object U64_object;
00460 tut::U64_test U64_testcase("U64_conversion");
00461
00462
00463 template<> template<>
00464 void U64_object::test<1>()
00465 {
00466 U64 val;
00467 std::string val_str;
00468 char result[256];
00469 std::string result_str;
00470
00471 val = U64L(18446744073709551610);
00472 val_str = "18446744073709551610";
00473
00474 U64_to_str(val, result, sizeof(result));
00475 result_str = (const char*) result;
00476 ensure_equals("U64_to_str converted 1.1", val_str, result_str);
00477
00478 val = 0;
00479 val_str = "0";
00480 U64_to_str(val, result, sizeof(result));
00481 result_str = (const char*) result;
00482 ensure_equals("U64_to_str converted 1.2", val_str, result_str);
00483
00484 val = U64L(18446744073709551615);
00485 val_str = "18446744073709551615";
00486 U64_to_str(val, result, sizeof(result));
00487 result_str = (const char*) result;
00488 ensure_equals("U64_to_str converted 1.3", val_str, result_str);
00489
00490
00491 val = U64L(18446744073709551615) + 1;
00492 val_str = "0";
00493 U64_to_str(val, result, sizeof(result));
00494 result_str = (const char*) result;
00495 ensure_equals("U64_to_str converted 1.4", val_str, result_str);
00496
00497 val = U64L(-1);
00498 val_str = "18446744073709551615";
00499 U64_to_str(val, result, sizeof(result));
00500 result_str = (const char*) result;
00501 ensure_equals("U64_to_str converted 1.5", val_str, result_str);
00502
00503 val = U64L(10000000000000000000);
00504 val_str = "10000000000000000000";
00505 U64_to_str(val, result, sizeof(result));
00506 result_str = (const char*) result;
00507 ensure_equals("U64_to_str converted 1.6", val_str, result_str);
00508
00509 val = 1;
00510 val_str = "1";
00511 U64_to_str(val, result, sizeof(result));
00512 result_str = (const char*) result;
00513 ensure_equals("U64_to_str converted 1.7", val_str, result_str);
00514
00515 val = U64L(18446744073709551615);
00516 val_str = "18446744073709551615";
00517 memset(result, 'A', sizeof(result));
00518 U64_to_str(val, result, sizeof("18446744073709551615"));
00519 result_str = (const char*) result;
00520 ensure_equals("U64_to_str converted 1.8", val_str, result_str);
00521
00522 val = U64L(18446744073709551615);
00523 val_str = "1844";
00524 memset(result, 'A', sizeof(result));
00525 U64_to_str(val, result, 5);
00526 result_str = (const char*) result;
00527 ensure_equals("U64_to_str converted 1.9", val_str, result_str);
00528 }
00529
00530
00531 template<> template<>
00532 void U64_object::test<2>()
00533 {
00534 U64 val;
00535 U64 result;
00536
00537 val = U64L(18446744073709551610);
00538 result = str_to_U64("18446744073709551610");
00539 ensure_equals("str_to_U64 converted 2.1", val, result);
00540
00541 val = U64L(0);
00542 result = str_to_U64("");
00543 ensure_equals("str_to_U64 converted 2.2", val, result);
00544
00545 val = U64L(0);
00546 result = str_to_U64("0");
00547 ensure_equals("str_to_U64 converted 2.3", val, result);
00548
00549 val = U64L(18446744073709551615);
00550 result = str_to_U64("18446744073709551615");
00551 ensure_equals("str_to_U64 converted 2.4", val, result);
00552
00553
00554 val = U64L(18446744073709551615) + 1;
00555 result = str_to_U64("18446744073709551616");
00556 ensure_equals("str_to_U64 converted 2.5", val, result);
00557
00558 val = U64L(1234);
00559 result = str_to_U64("1234A5678");
00560 ensure_equals("str_to_U64 converted 2.6", val, result);
00561
00562 val = U64L(5678);
00563 result = str_to_U64("ABCD5678");
00564 ensure_equals("str_to_U64 converted 2.7", val, result);
00565
00566
00567
00568 val = U64L(1234);
00569 result = str_to_U64("-1234");
00570 ensure_equals("str_to_U64 converted 2.8", val, result);
00571
00572 val = U64L(5678);
00573 result = str_to_U64("5678-1234");
00574 ensure_equals("str_to_U64 converted 2.9", val, result);
00575
00576 val = U64L(0);
00577 result = str_to_U64("AaCD");
00578 ensure_equals("str_to_U64 converted 2.10", val, result);
00579 }
00580
00581
00582 template<> template<>
00583 void U64_object::test<3>()
00584 {
00585 F64 val;
00586 F64 result;
00587
00588 result = 18446744073709551610.0;
00589 val = U64_to_F64(U64L(18446744073709551610));
00590 ensure_equals("U64_to_F64 converted 3.1", val, result);
00591
00592 result = 18446744073709551615.0;
00593 val = U64_to_F64(U64L(18446744073709551615));
00594 ensure_equals("U64_to_F64 converted 3.2", val, result);
00595
00596 result = 0.0;
00597
00598 val = U64_to_F64(U64L(18446744073709551615)+1);
00599 ensure_equals("U64_to_F64 converted 3.3", val, result);
00600
00601 result = 0.0;
00602 val = U64_to_F64(U64L(0));
00603 ensure_equals("U64_to_F64 converted 3.4", val, result);
00604
00605 result = 1.0;
00606 val = U64_to_F64(U64L(1));
00607 ensure_equals("U64_to_F64 converted 3.5", val, result);
00608
00609 result = 2.0;
00610 val = U64_to_F64(U64L(2));
00611 ensure_equals("U64_to_F64 converted 3.6", val, result);
00612
00613 result = U64L(0x7FFFFFFFFFFFFFFF) * 1.0L;
00614 val = U64_to_F64(U64L(0x7FFFFFFFFFFFFFFF));
00615 ensure_equals("U64_to_F64 converted 3.7", val, result);
00616 }
00617
00618
00619
00620
00621 }
00622
00623