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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file common.cpp
  3.  * @author Phoenix
  4.  * @date 2005-10-12
  5.  * @brief Common templates for test framework
  6.  *
  7.  * $LicenseInfo:firstyear=2005&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2005-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. /** 
  35.  * 
  36.  * THOROUGH_DESCRIPTION of common.cpp
  37.  *
  38.  */
  39. #include <algorithm>
  40. #include <iomanip>
  41. #include <iterator>
  42. #include "linden_common.h"
  43. #include "../llmemorystream.h"
  44. #include "../llsd.h"
  45. #include "../llsdserialize.h"
  46. #include "../u64.h"
  47. #include "../llhash.h"
  48. #include "../test/lltut.h"
  49. #if LL_WINDOWS
  50. // disable overflow warnings
  51. #pragma warning(disable: 4307)
  52. #endif
  53. namespace tut
  54. {
  55. struct sd_data
  56. {
  57. };
  58. typedef test_group<sd_data> sd_test;
  59. typedef sd_test::object sd_object;
  60. tut::sd_test sd("llsd");
  61. template<> template<>
  62. void sd_object::test<1>()
  63. {
  64. std::ostringstream resp;
  65. resp << "{'connect':true,  'position':[r128,r128,r128], 'look_at':[r0,r1,r0], 'agent_access':'M', 'region_x':i8192, 'region_y':i8192}";
  66. std::string str = resp.str();
  67. LLMemoryStream mstr((U8*)str.c_str(), str.size());
  68. LLSD response;
  69. S32 count = LLSDSerialize::fromNotation(response, mstr, str.size());
  70. ensure("stream parsed", response.isDefined());
  71. ensure_equals("stream parse count", count, 13);
  72. ensure_equals("sd type", response.type(), LLSD::TypeMap);
  73. ensure_equals("map element count", response.size(), 6);
  74. ensure_equals("value connect", response["connect"].asBoolean(), true);
  75. ensure_equals("value region_x", response["region_x"].asInteger(),8192);
  76. ensure_equals("value region_y", response["region_y"].asInteger(),8192);
  77. }
  78. template<> template<>
  79. void sd_object::test<2>()
  80. {
  81. const std::string decoded("random");
  82. //const std::string encoded("cmFuZG9tn");
  83. const std::string streamed("b(6)"random"");
  84. typedef std::vector<U8> buf_t;
  85. buf_t buf;
  86. std::copy(
  87. decoded.begin(),
  88. decoded.end(),
  89. std::back_insert_iterator<buf_t>(buf));
  90. LLSD sd;
  91. sd = buf;
  92. std::stringstream str;
  93. S32 count = LLSDSerialize::toNotation(sd, str);
  94. ensure_equals("output count", count, 1);
  95. std::string actual(str.str());
  96. ensure_equals("formatted binary encoding", actual, streamed);
  97. sd.clear();
  98. LLSDSerialize::fromNotation(sd, str, str.str().size());
  99. std::vector<U8> after;
  100. after = sd.asBinary();
  101. ensure_equals("binary decoded size", after.size(), decoded.size());
  102. ensure("binary decoding", (0 == memcmp(
  103.    &after[0],
  104.    decoded.c_str(),
  105.    decoded.size())));
  106. }
  107. template<> template<>
  108. void sd_object::test<3>()
  109. {
  110. for(S32 i = 0; i < 100; ++i)
  111. {
  112. // gen up a starting point
  113. typedef std::vector<U8> buf_t;
  114. buf_t source;
  115. srand(i); /* Flawfinder: ignore */
  116. S32 size = rand() % 1000 + 10;
  117. std::generate_n(
  118. std::back_insert_iterator<buf_t>(source),
  119. size,
  120. rand);
  121. LLSD sd(source);
  122. std::stringstream str;
  123. S32 count = LLSDSerialize::toNotation(sd, str);
  124. sd.clear();
  125. ensure_equals("format count", count, 1);
  126. LLSD sd2;
  127. count = LLSDSerialize::fromNotation(sd2, str, str.str().size());
  128. ensure_equals("parse count", count, 1);
  129. buf_t dest = sd2.asBinary();
  130. str.str("");
  131. str << "binary encoding size " << i;
  132. ensure_equals(str.str().c_str(), dest.size(), source.size());
  133. str.str("");
  134. str << "binary encoding " << i;
  135. ensure(str.str().c_str(), (source == dest));
  136. }
  137. }
  138. template<> template<>
  139. void sd_object::test<4>()
  140. {
  141. std::ostringstream ostr;
  142. ostr << "{'task_id':u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}n"
  143.  << "{ntnametObject|n}n";
  144. std::string expected = ostr.str();
  145. std::stringstream serialized;
  146. serialized << "'" << LLSDNotationFormatter::escapeString(expected)
  147.    << "'";
  148. LLSD sd;
  149. S32 count = LLSDSerialize::fromNotation(
  150. sd,
  151. serialized,
  152. serialized.str().size());
  153. ensure_equals("parse count", count, 1);
  154. ensure_equals("String streaming", sd.asString(), expected);
  155. }
  156. template<> template<>
  157. void sd_object::test<5>()
  158. {
  159. for(S32 i = 0; i < 100; ++i)
  160. {
  161. // gen up a starting point
  162. typedef std::vector<U8> buf_t;
  163. buf_t source;
  164. srand(666 + i); /* Flawfinder: ignore */
  165. S32 size = rand() % 1000 + 10;
  166. std::generate_n(
  167. std::back_insert_iterator<buf_t>(source),
  168. size,
  169. rand);
  170. std::stringstream str;
  171. str << "b(" << size << ")"";
  172. str.write((const char*)&source[0], size);
  173. str << """;
  174. LLSD sd;
  175. S32 count = LLSDSerialize::fromNotation(sd, str, str.str().size());
  176. ensure_equals("binary parse", count, 1);
  177. buf_t actual = sd.asBinary();
  178. ensure_equals("binary size", actual.size(), (size_t)size);
  179. ensure("binary data", (0 == memcmp(&source[0], &actual[0], size)));
  180. }
  181. }
  182. template<> template<>
  183. void sd_object::test<6>()
  184. {
  185. std::string expected("'{"task_id":u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}'tntt");
  186. std::stringstream str;
  187. str << "s(" << expected.size() << ")'";
  188. str.write(expected.c_str(), expected.size());
  189. str << "'";
  190. LLSD sd;
  191. S32 count = LLSDSerialize::fromNotation(sd, str, str.str().size());
  192. ensure_equals("parse count", count, 1);
  193. std::string actual = sd.asString();
  194. ensure_equals("string sizes", actual.size(), expected.size());
  195. ensure_equals("string content", actual, expected);
  196. }
  197. template<> template<>
  198. void sd_object::test<7>()
  199. {
  200. std::string msg("come on in");
  201. std::stringstream stream;
  202. stream << "{'connect':1, 'message':'" << msg << "',"
  203.    << " 'position':[r45.65,r100.1,r25.5],"
  204.    << " 'look_at':[r0,r1,r0],"
  205.    << " 'agent_access':'PG'}";
  206. LLSD sd;
  207. S32 count = LLSDSerialize::fromNotation(
  208. sd,
  209. stream,
  210. stream.str().size());
  211. ensure_equals("parse count", count, 12);
  212. ensure_equals("bool value", sd["connect"].asBoolean(), true);
  213. ensure_equals("message value", sd["message"].asString(), msg);
  214. ensure_equals("pos x", sd["position"][0].asReal(), 45.65);
  215. ensure_equals("pos y", sd["position"][1].asReal(), 100.1);
  216. ensure_equals("pos z", sd["position"][2].asReal(), 25.5);
  217. ensure_equals("look x", sd["look_at"][0].asReal(), 0.0);
  218. ensure_equals("look y", sd["look_at"][1].asReal(), 1.0);
  219. ensure_equals("look z", sd["look_at"][2].asReal(), 0.0);
  220. }
  221. template<> template<>
  222. void sd_object::test<8>()
  223. {
  224. std::stringstream resp;
  225. resp << "{'label':'short string test', 'singlechar':'a', 'empty':'', 'endoftest':'end' }";
  226. LLSD response;
  227. S32 count = LLSDSerialize::fromNotation(
  228. response,
  229. resp,
  230. resp.str().size());
  231. ensure_equals("parse count", count, 5);
  232. ensure_equals("sd type", response.type(), LLSD::TypeMap);
  233. ensure_equals("map element count", response.size(), 4);
  234. ensure_equals("singlechar", response["singlechar"].asString(), "a");
  235. ensure_equals("empty", response["empty"].asString(), "");
  236. }
  237. template<> template<>
  238. void sd_object::test<9>()
  239. {
  240. std::ostringstream resp;
  241. resp << "{'label':'short binary test', 'singlebinary':b(1)"A", 'singlerawstring':s(1)"A", 'endoftest':'end' }";
  242. std::string str = resp.str();
  243. LLSD sd;
  244. LLMemoryStream mstr((U8*)str.c_str(), str.size());
  245. S32 count = LLSDSerialize::fromNotation(sd, mstr, str.size());
  246. ensure_equals("parse count", count, 5);
  247. ensure("sd created", sd.isDefined());
  248. ensure_equals("sd type", sd.type(), LLSD::TypeMap);
  249. ensure_equals("map element count", sd.size(), 4);
  250. ensure_equals(
  251. "label",
  252. sd["label"].asString(),
  253. "short binary test");
  254. std::vector<U8> bin =  sd["singlebinary"].asBinary();
  255. std::vector<U8> expected;
  256. expected.resize(1);
  257. expected[0] = 'A';
  258. ensure("single binary", (0 == memcmp(&bin[0], &expected[0], 1)));
  259. ensure_equals(
  260. "single string",
  261. sd["singlerawstring"].asString(),
  262. std::string("A"));
  263. ensure_equals("end", sd["endoftest"].asString(), "end");
  264. }
  265. template<> template<>
  266. void sd_object::test<10>()
  267. {
  268. std::string message("parcel '' is naughty.");
  269. std::stringstream str;
  270. str << "{'message':'" << LLSDNotationFormatter::escapeString(message)
  271. << "'}";
  272. std::string expected_str("{'message':'parcel \'\' is naughty.'}");
  273. std::string actual_str = str.str();
  274. ensure_equals("stream contents", actual_str, expected_str);
  275. LLSD sd;
  276. S32 count = LLSDSerialize::fromNotation(sd, str, actual_str.size());
  277. ensure_equals("parse count", count, 2);
  278. ensure("valid parse", sd.isDefined());
  279. std::string actual = sd["message"].asString();
  280. ensure_equals("message contents", actual, message);
  281. }
  282. template<> template<>
  283. void sd_object::test<11>()
  284. {
  285. std::string expected("""""''''''"");
  286. std::stringstream str;
  287. str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
  288. LLSD sd;
  289. S32 count = LLSDSerialize::fromNotation(sd, str, str.str().size());
  290. ensure_equals("parse count", count, 1);
  291. ensure_equals("string value", sd.asString(), expected);
  292. }
  293. template<> template<>
  294. void sd_object::test<12>()
  295. {
  296. std::string expected("mytest\");
  297. std::stringstream str;
  298. str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
  299. LLSD sd;
  300. S32 count = LLSDSerialize::fromNotation(sd, str, str.str().size());
  301. ensure_equals("parse count", count, 1);
  302. ensure_equals("string value", sd.asString(), expected);
  303. }
  304. template<> template<>
  305. void sd_object::test<13>()
  306. {
  307. for(S32 i = 0; i < 1000; ++i)
  308. {
  309. // gen up a starting point
  310. std::string expected;
  311. srand(1337 + i); /* Flawfinder: ignore */
  312. S32 size = rand() % 30 + 5;
  313. std::generate_n(
  314. std::back_insert_iterator<std::string>(expected),
  315. size,
  316. rand);
  317. std::stringstream str;
  318. str << "'" << LLSDNotationFormatter::escapeString(expected) << "'";
  319. LLSD sd;
  320. S32 count = LLSDSerialize::fromNotation(sd, str, expected.size());
  321. ensure_equals("parse count", count, 1);
  322. std::string actual = sd.asString();
  323. /*
  324. if(actual != expected)
  325. {
  326. llwarns << "iteration " << i << llendl;
  327. std::ostringstream e_str;
  328. std::string::iterator iter = expected.begin();
  329. std::string::iterator end = expected.end();
  330. for(; iter != end; ++iter)
  331. {
  332. e_str << (S32)((U8)(*iter)) << " ";
  333. }
  334. e_str << std::endl;
  335. llsd_serialize_string(e_str, expected);
  336. llwarns << "expected size: " << expected.size() << llendl;
  337. llwarns << "expected:      " << e_str.str() << llendl;
  338. std::ostringstream a_str;
  339. iter = actual.begin();
  340. end = actual.end();
  341. for(; iter != end; ++iter)
  342. {
  343. a_str << (S32)((U8)(*iter)) << " ";
  344. }
  345. a_str << std::endl;
  346. llsd_serialize_string(a_str, actual);
  347. llwarns << "actual size:   " << actual.size() << llendl;
  348. llwarns << "actual:      " << a_str.str() << llendl;
  349. }
  350. */
  351. ensure_equals("string value", actual, expected);
  352. }
  353. }
  354. template<> template<>
  355. void sd_object::test<14>()
  356. {
  357. //#if LL_WINDOWS && _MSC_VER >= 1400
  358. //        skip_fail("Fails on VS2005 due to broken LLSDSerialize::fromNotation() parser.");
  359. //#endif
  360. 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}]";
  361. std::istringstream istr;
  362. istr.str(param);
  363. LLSD param_sd;
  364. LLSDSerialize::fromNotation(param_sd, istr, param.size());
  365. ensure_equals("parsed type", param_sd.type(), LLSD::TypeArray);
  366. LLSD version_sd = param_sd[0];
  367. ensure_equals("version type", version_sd.type(), LLSD::TypeMap);
  368. ensure("has version", version_sd.has("version"));
  369. ensure_equals("version number", version_sd["version"].asInteger(), 1);
  370. LLSD src_sd = param_sd[1];
  371. ensure_equals("src type", src_sd.type(), LLSD::TypeMap);
  372. LLSD dst_sd = param_sd[2];
  373. ensure_equals("dst type", dst_sd.type(), LLSD::TypeMap);
  374. }
  375. template<> template<>
  376. void sd_object::test<15>()
  377. {
  378. std::string val = "[{'failures':!,'successfuls':[u3c115e51-04f4-523c-9fa6-98aff1034730]}]";
  379. std::istringstream istr;
  380. istr.str(val);
  381. LLSD sd;
  382. LLSDSerialize::fromNotation(sd, istr, val.size());
  383. ensure_equals("parsed type", sd.type(), LLSD::TypeArray);
  384. ensure_equals("parsed size", sd.size(), 1);
  385. LLSD failures = sd[0]["failures"];
  386. ensure("no failures.", failures.isUndefined());
  387. LLSD success = sd[0]["successfuls"];
  388. ensure_equals("success type", success.type(), LLSD::TypeArray);
  389. ensure_equals("success size", success.size(), 1);
  390. ensure_equals("success instance type", success[0].type(), LLSD::TypeUUID);
  391. }
  392. template<> template<>
  393. void sd_object::test<16>()
  394. {
  395. std::string val = "[f,t,0,1,{'foo':t,'bar':f}]";
  396. std::istringstream istr;
  397. istr.str(val);
  398. LLSD sd;
  399. LLSDSerialize::fromNotation(sd, istr, val.size());
  400. ensure_equals("parsed type", sd.type(), LLSD::TypeArray);
  401. ensure_equals("parsed size", sd.size(), 5);
  402. ensure_equals("element 0 false", sd[0].asBoolean(), false);
  403. ensure_equals("element 1 true", sd[1].asBoolean(), true);
  404. ensure_equals("element 2 false", sd[2].asBoolean(), false);
  405. ensure_equals("element 3 true", sd[3].asBoolean(), true);
  406. LLSD map = sd[4];
  407. ensure_equals("element 4 type", map.type(), LLSD::TypeMap);
  408. ensure_equals("map foo type", map["foo"].type(), LLSD::TypeBoolean);
  409. ensure_equals("map foo value", map["foo"].asBoolean(), true);
  410. ensure_equals("map bar type", map["bar"].type(), LLSD::TypeBoolean);
  411. ensure_equals("map bar value", map["bar"].asBoolean(), false);
  412. }
  413. /*
  414. template<> template<>
  415. void sd_object::test<16>()
  416. {
  417. }
  418. */
  419. }
  420. #if 0
  421. '{'task_id':u1fd77b79-a8e7-25a5-9454-02a4d948ba1c}n{ntnametObject|ntpermissions 0nt{nttbase_maskt7fffffffnttowner_maskt7fffffffnttgroup_maskt00000000ntteveryone_maskt00000000nttnext_owner_maskt00082000nttcreator_idt3c115e51-04f4-523c-9fa6-98aff1034730nttowner_idt3c115e51-04f4-523c-9fa6-98aff1034730nttlast_owner_idt00000000-0000-0000-0000-000000000000nttgroup_idt00000000-0000-0000-0000-000000000000nt}ntlocal_idt10284nttotal_crct35nttypet1nttask_validt2nttravel_accesst21ntdisplayoptst2ntdisplaytypetvntpost0t0t0ntoldpost0t0t0ntrotationt4.371139183945160766597837e-08t1t4.371139183945160766597837e-08t0ntvelocityt0t0t0ntangvelt0t0t0ntscalet0.2816932t0.2816932t0.2816932ntsit_offsett0t0t0ntcamera_eye_offsett0t0t0ntcamera_at_offsett0t0t0ntsit_quatt0t0t0t1ntsit_hintt0ntstatet80ntmaterialt3ntsoundidt00000000-0000-0000-0000-000000000000ntsoundgaint0ntsoundradiust0ntsoundflagst0nttextcolort0 0 0 1ntselectedt0ntselectort00000000-0000-0000-0000-000000000000ntusephysicst0ntrotate_xt1ntrotate_yt1ntrotate_zt1ntphantomt0ntremote_script_access_pint0ntvolume_detectt0ntblock_grabst0ntdie_at_edget0ntreturn_at_edget0nttemporaryt0ntsandboxt0ntsandboxhomet0t0t0ntshape 0nt{nttpath 0ntt{ntttcurvet16ntttbegint0ntttendt1ntttscale_xt1ntttscale_yt1ntttshear_xt0ntttshear_yt0nttttwistt0nttttwist_begint0ntttradius_offsett0nttttaper_xt0nttttaper_yt0ntttrevolutionst1ntttskewt0ntt}nttprofile 0ntt{ntttcurvet1ntttbegint0ntttendt1nttthollowt0ntt}nt}ntfacest6nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}nt{nttimageidt89556747-24cb-43ed-920b-47caed15465fnttcolorst1 1 1 1nttscalest0.56nttscalett0.56nttoffsetst0nttoffsettt0nttimagerott0nttbumpt0nttfullbrightt0nttmedia_flagst0nt}ntps_next_crct1ntgpw_biast1ntipt0ntcompletetTRUEntdelayt50000ntnextstartt1132625972249870ntbirthtimet1132625953120694ntreztimet1132625953120694ntparceltimet1132625953120694nttax_ratet1.01615ntnamevaluetAttachmentOrientation VEC3 RW DS -3.141593, 0.000000, -3.141593ntnamevaluetAttachmentOffset VEC3 RW DS 0.000000, 0.000000, 0.000000ntnamevaluetAttachPt U32 RW S 5ntnamevaluetAttachItemID STRING RW SV 1f9975c0-2951-1b93-dd83-46e2b932fcc8ntscratchpadt0nt{ntnt}ntsale_infot0nt{nttsale_typetnotnttsale_pricet10nt}ntorig_asset_idt52019cdd-b464-ba19-e66d-3da751fef9dantorig_item_idt1f9975c0-2951-1b93-dd83-46e2b932fcc8ntcorrect_family_idt00000000-0000-0000-0000-000000000000nthas_rezzedt0ntpre_link_base_maskt7fffffffntdefault_pay_pricet-2t1t5t10t20n}n'
  422. #endif
  423. namespace tut
  424. {
  425. struct mem_data
  426. {
  427. };
  428. typedef test_group<mem_data> mem_test;
  429. typedef mem_test::object mem_object;
  430. tut::mem_test mem_stream("memory_stream");
  431. template<> template<>
  432. void mem_object::test<1>()
  433. {
  434. const char HELLO_WORLD[] = "hello world";
  435. LLMemoryStream mem((U8*)&HELLO_WORLD[0], strlen(HELLO_WORLD)); /* Flawfinder: ignore */
  436. std::string hello;
  437. std::string world;
  438. mem >> hello >> world;
  439. ensure_equals("first word", hello, std::string("hello"));
  440. ensure_equals("second word", world, std::string("world"));
  441. }
  442. }
  443. namespace tut
  444. {
  445. struct U64_data
  446. {
  447. };
  448. typedef test_group<U64_data> U64_test;
  449. typedef U64_test::object U64_object;
  450. tut::U64_test U64_testcase("U64_conversion");
  451. // U64_to_str
  452. template<> template<>
  453. void U64_object::test<1>()
  454. {
  455. U64 val;
  456. std::string val_str;
  457. char result[256];
  458. std::string result_str;
  459. val = U64L(18446744073709551610); // slightly less than MAX_U64
  460. val_str = "18446744073709551610";
  461. U64_to_str(val, result, sizeof(result));
  462. result_str = (const char*) result;
  463. ensure_equals("U64_to_str converted 1.1", val_str, result_str);
  464. val = 0;
  465. val_str = "0";
  466. U64_to_str(val, result, sizeof(result));
  467. result_str = (const char*) result;
  468. ensure_equals("U64_to_str converted 1.2", val_str, result_str);
  469. val = U64L(18446744073709551615); // 0xFFFFFFFFFFFFFFFF
  470. val_str = "18446744073709551615";
  471. U64_to_str(val, result, sizeof(result));
  472. result_str = (const char*) result;
  473. ensure_equals("U64_to_str converted 1.3", val_str, result_str);
  474. // overflow - will result in warning at compile time
  475. val = U64L(18446744073709551615) + 1; // overflow 0xFFFFFFFFFFFFFFFF + 1 == 0
  476. val_str = "0";
  477. U64_to_str(val, result, sizeof(result));
  478. result_str = (const char*) result;
  479. ensure_equals("U64_to_str converted 1.4", val_str, result_str);
  480. val = U64L(-1); // 0xFFFFFFFFFFFFFFFF == 18446744073709551615
  481. val_str = "18446744073709551615";
  482. U64_to_str(val, result, sizeof(result));
  483. result_str = (const char*) result;
  484. ensure_equals("U64_to_str converted 1.5", val_str, result_str);
  485. val = U64L(10000000000000000000); // testing preserving of 0s
  486. val_str = "10000000000000000000";
  487. U64_to_str(val, result, sizeof(result));
  488. result_str = (const char*) result;
  489. ensure_equals("U64_to_str converted 1.6", val_str, result_str);
  490. val = 1; // testing no leading 0s
  491. val_str = "1";
  492. U64_to_str(val, result, sizeof(result));
  493. result_str = (const char*) result;
  494. ensure_equals("U64_to_str converted 1.7", val_str, result_str);
  495. val = U64L(18446744073709551615); // testing exact sized buffer for result
  496. val_str = "18446744073709551615";
  497. memset(result, 'A', sizeof(result)); // initialize buffer with all 'A'
  498. U64_to_str(val, result, sizeof("18446744073709551615")); //pass in the exact size
  499. result_str = (const char*) result;
  500. ensure_equals("U64_to_str converted 1.8", val_str, result_str);
  501. val = U64L(18446744073709551615); // testing smaller sized buffer for result
  502. val_str = "1844";
  503. memset(result, 'A', sizeof(result)); // initialize buffer with all 'A'
  504. U64_to_str(val, result, 5); //pass in a size of 5. should only copy first 4 integers and add a null terminator
  505. result_str = (const char*) result;
  506. ensure_equals("U64_to_str converted 1.9", val_str, result_str);
  507. }
  508. // str_to_U64
  509. template<> template<>
  510. void U64_object::test<2>()
  511. {
  512. U64 val;
  513. U64 result;
  514. val = U64L(18446744073709551610); // slightly less than MAX_U64
  515. result = str_to_U64("18446744073709551610");
  516. ensure_equals("str_to_U64 converted 2.1", val, result);
  517. val = U64L(0); // empty string
  518. result = str_to_U64(LLStringUtil::null);
  519. ensure_equals("str_to_U64 converted 2.2", val, result);
  520. val = U64L(0); // 0
  521. result = str_to_U64("0");
  522. ensure_equals("str_to_U64 converted 2.3", val, result);
  523. val = U64L(18446744073709551615); // 0xFFFFFFFFFFFFFFFF
  524. result = str_to_U64("18446744073709551615");
  525. ensure_equals("str_to_U64 converted 2.4", val, result);
  526. // overflow - will result in warning at compile time
  527. val = U64L(18446744073709551615) + 1; // overflow 0xFFFFFFFFFFFFFFFF + 1 == 0
  528. result = str_to_U64("18446744073709551616");
  529. ensure_equals("str_to_U64 converted 2.5", val, result);
  530. val = U64L(1234); // process till first non-integral character
  531. result = str_to_U64("1234A5678");
  532. ensure_equals("str_to_U64 converted 2.6", val, result);
  533. val = U64L(5678); // skip all non-integral characters
  534. result = str_to_U64("ABCD5678");
  535. ensure_equals("str_to_U64 converted 2.7", val, result);
  536. // should it skip negative sign and process 
  537. // rest of string or return 0
  538. val = U64L(1234); // skip initial negative sign 
  539. result = str_to_U64("-1234");
  540. ensure_equals("str_to_U64 converted 2.8", val, result);
  541. val = U64L(5678); // stop at negative sign in the middle
  542. result = str_to_U64("5678-1234");
  543. ensure_equals("str_to_U64 converted 2.9", val, result);
  544. val = U64L(0); // no integers
  545. result = str_to_U64("AaCD");
  546. ensure_equals("str_to_U64 converted 2.10", val, result);
  547. }
  548. // U64_to_F64
  549. template<> template<>
  550. void U64_object::test<3>()
  551. {
  552. F64 val;
  553. F64 result;
  554. result = 18446744073709551610.0;
  555. val = U64_to_F64(U64L(18446744073709551610));
  556. ensure_equals("U64_to_F64 converted 3.1", val, result);
  557. result = 18446744073709551615.0; // 0xFFFFFFFFFFFFFFFF
  558. val = U64_to_F64(U64L(18446744073709551615));
  559. ensure_equals("U64_to_F64 converted 3.2", val, result);
  560. result = 0.0; // overflow 0xFFFFFFFFFFFFFFFF + 1 == 0
  561. // overflow - will result in warning at compile time
  562. val = U64_to_F64(U64L(18446744073709551615)+1);
  563. ensure_equals("U64_to_F64 converted 3.3", val, result);
  564. result = 0.0; // 0
  565. val = U64_to_F64(U64L(0));
  566. ensure_equals("U64_to_F64 converted 3.4", val, result);
  567. result = 1.0; // odd
  568. val = U64_to_F64(U64L(1));
  569. ensure_equals("U64_to_F64 converted 3.5", val, result);
  570. result = 2.0; // even
  571. val = U64_to_F64(U64L(2));
  572. ensure_equals("U64_to_F64 converted 3.6", val, result);
  573. result = U64L(0x7FFFFFFFFFFFFFFF) * 1.0L; // 0x7FFFFFFFFFFFFFFF
  574. val = U64_to_F64(U64L(0x7FFFFFFFFFFFFFFF));
  575. ensure_equals("U64_to_F64 converted 3.7", val, result);
  576. }
  577. // llstrtou64 
  578. // seems to be deprecated - could not find it being used 
  579. // anywhere in the tarball - skipping unit tests for now
  580. }
  581. namespace tut
  582. {
  583. struct hash_data
  584. {
  585. };
  586. typedef test_group<hash_data> hash_test;
  587. typedef hash_test::object hash_object;
  588. tut::hash_test hash_tester("hash_test");
  589. template<> template<>
  590. void hash_object::test<1>()
  591. {
  592. const char * str1 = "test string one";
  593. const char * same_as_str1 = "test string one";
  594. size_t hash1 = llhash(str1);
  595. size_t same_as_hash1 = llhash(same_as_str1);
  596. ensure("Hashes from identical strings should be equal", hash1 == same_as_hash1);
  597. char str[100];
  598. strcpy( str, "Another test" );
  599. size_t hash2 = llhash(str);
  600. strcpy( str, "Different string, same pointer" );
  601. size_t hash3 = llhash(str);
  602. ensure("Hashes from same pointer but different string should not be equal", hash2 != hash3);
  603. }
  604. }