test_term.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. #include "test.h"
  2. static int test_iriref()
  3. {
  4. char *uri1_data = "http://example.org/term#12345";
  5. char *uri2_data = "ns1:12345";
  6. char *uri3_data = "ns2:12345";
  7. VOLK_nsmap_add ("ns1", "http://example.org/term#");
  8. VOLK_nsmap_add ("ns2", "http://example.org/term#");
  9. VOLK_Term *uri1 = VOLK_iriref_new (uri1_data);
  10. ASSERT (uri1, "IRI is NULL!");
  11. char *pfx = VOLK_iriref_prefix (uri1);
  12. char *path = VOLK_iriref_path (uri1);
  13. char *frag = VOLK_iriref_frag (uri1);
  14. EXPECT_STR_EQ (pfx, "http://example.org");
  15. EXPECT_STR_EQ (path, "/term#12345");
  16. EXPECT_STR_EQ (frag, "12345");
  17. free (pfx);
  18. free (path);
  19. free (frag);
  20. VOLK_Term *uri2 = VOLK_iriref_new_ns (uri2_data);
  21. ASSERT (uri2, "IRI is NULL!");
  22. VOLK_Term *uri3 = VOLK_iriref_new_ns (uri3_data);
  23. ASSERT (uri3, "IRI is NULL!");
  24. VOLK_Term *uri4 = VOLK_iriref_new (NULL);
  25. ASSERT (uri4, "IRI is NULL!");
  26. VOLK_Term *uri5 = VOLK_iriref_new (NULL);
  27. ASSERT (uri5, "IRI is NULL!");
  28. EXPECT_INT_EQ (uri1->type, VOLK_TERM_IRIREF);
  29. EXPECT_INT_EQ (uri2->type, VOLK_TERM_IRIREF);
  30. EXPECT_INT_EQ (uri3->type, VOLK_TERM_IRIREF);
  31. EXPECT_INT_EQ (uri4->type, VOLK_TERM_IRIREF);
  32. EXPECT_INT_EQ (uri5->type, VOLK_TERM_IRIREF);
  33. ASSERT (VOLK_term_equals (uri1, uri2), "IRIs don't match!");
  34. ASSERT (VOLK_term_equals (uri2, uri3), "IRIs don't match!");
  35. ASSERT (!VOLK_term_equals (uri3, uri4), "IRIs shouldn't match!");
  36. ASSERT (!VOLK_term_equals (uri4, uri5), "IRIs shouldn't match!");
  37. VOLK_term_free (uri1);
  38. VOLK_term_free (uri2);
  39. VOLK_term_free (uri3);
  40. VOLK_term_free (uri4);
  41. VOLK_term_free (uri5);
  42. return 0;
  43. }
  44. static int test_iriref_parts()
  45. {
  46. char *data[18][4] = {
  47. {"http://example.org", "http://example.org", "", ""},
  48. {"http://example.org/", "http://example.org", "/", ""},
  49. {"http://example.org?option", "http://example.org", "?option", ""},
  50. {"http://example.org/?option", "http://example.org", "/?option", ""},
  51. {
  52. "http://example.org#anchor",
  53. "http://example.org", "#anchor", "anchor"},
  54. {
  55. "http://example.org/#anchor",
  56. "http://example.org", "/#anchor", "anchor"},
  57. {
  58. "http://example.org/?option#anchor",
  59. "http://example.org", "/?option#anchor", "anchor"},
  60. {
  61. "http://example.org?option#anchor",
  62. "http://example.org", "?option#anchor", "anchor"},
  63. {
  64. "http://hanzi.edu/漢魏六朝隋碑誌索引/53?option#anchor",
  65. "http://hanzi.edu", "/漢魏六朝隋碑誌索引/53?option#anchor",
  66. "anchor"},
  67. {"ftp:///", "ftp://", "/", ""},
  68. {
  69. "file:///usr/local/lib/libvolksdata.so",
  70. "file://", "/usr/local/lib/libvolksdata.so", ""},
  71. {"/", "", "/", ""},
  72. {"/tmp", "", "/tmp", ""},
  73. {"./tmp", "", "./tmp", ""},
  74. {"tmp/test.nt", "", "tmp/test.nt", ""},
  75. {"", "", "", ""},
  76. {"#hello", "", "#hello", "hello"},
  77. {
  78. "urn:uuid:950404b6-0e4f-4e21-8267-c8c00e83563b",
  79. "urn:", "uuid:950404b6-0e4f-4e21-8267-c8c00e83563b", ""}
  80. };
  81. for (size_t i = 0; i < 18; i++) {
  82. VOLK_Term *iri = VOLK_iriref_new(data[i][0]);
  83. char
  84. *pfx = VOLK_iriref_prefix (iri),
  85. *path = VOLK_iriref_path (iri),
  86. *frag = VOLK_iriref_frag (iri);
  87. EXPECT_STR_EQ (pfx, data[i][1]);
  88. EXPECT_STR_EQ (path, data[i][2]);
  89. EXPECT_STR_EQ (frag, data[i][3]);
  90. free (pfx);
  91. free (path);
  92. free (frag);
  93. VOLK_term_free (iri);
  94. }
  95. return 0;
  96. }
  97. static int test_iriref_abs_rel()
  98. {
  99. EXPECT_PASS (VOLK_nsmap_add ("ns1", "http://example.org/res/"));
  100. VOLK_Term *root1 = VOLK_iriref_new ("http://example.org/res/");
  101. VOLK_Term *root2 = VOLK_iriref_new ("urn:id:");
  102. VOLK_Term *rel_iri1 = VOLK_iriref_new ("http://anotherex.net/res/25");
  103. VOLK_Term *rel_iri2 = VOLK_iriref_new ("/admin/32");
  104. VOLK_Term *rel_iri3 = VOLK_iriref_new ("45/678");
  105. VOLK_Term *abs_iri1 = VOLK_iriref_new_abs (root1, rel_iri1);
  106. VOLK_Term *abs_iri2 = VOLK_iriref_new_abs (root1, rel_iri2);
  107. VOLK_Term *abs_iri3 = VOLK_iriref_new_abs (root1, rel_iri3);
  108. EXPECT_STR_EQ (abs_iri1->data, rel_iri1->data);
  109. EXPECT_STR_EQ (abs_iri2->data, "http://example.org/admin/32");
  110. EXPECT_STR_EQ (abs_iri3->data, "http://example.org/res/45/678");
  111. VOLK_Term *rel_iri1a = VOLK_iriref_new_rel (root1, abs_iri1);
  112. VOLK_Term *rel_iri2a = VOLK_iriref_new_rel (root1, abs_iri2);
  113. VOLK_Term *rel_iri3a = VOLK_iriref_new_rel (root1, abs_iri3);
  114. EXPECT_STR_EQ (rel_iri1a->data, rel_iri1->data);
  115. EXPECT_STR_EQ (rel_iri2a->data, abs_iri2->data);
  116. EXPECT_STR_EQ (rel_iri3a->data, "45/678");
  117. VOLK_term_free (root1);
  118. VOLK_term_free (root2);
  119. VOLK_term_free (rel_iri1);
  120. VOLK_term_free (rel_iri2);
  121. VOLK_term_free (rel_iri3);
  122. VOLK_term_free (abs_iri1);
  123. VOLK_term_free (abs_iri2);
  124. VOLK_term_free (abs_iri3);
  125. VOLK_term_free (rel_iri1a);
  126. VOLK_term_free (rel_iri2a);
  127. VOLK_term_free (rel_iri3a);
  128. return 0;
  129. }
  130. static int test_literal()
  131. {
  132. char *data = "hello";
  133. char *datatype = "urn:my:datatype";
  134. char *lang = "en-US";
  135. VOLK_Term *lit1 = VOLK_literal_new (data, VOLK_iriref_new (datatype));
  136. EXPECT_INT_EQ (lit1->type, VOLK_TERM_LITERAL);
  137. EXPECT_STR_EQ (lit1->data, data);
  138. EXPECT_STR_EQ (lit1->datatype->data, datatype);
  139. VOLK_Term *lit2 = VOLK_literal_new (data, VOLK_default_datatype);
  140. EXPECT_INT_EQ (lit2->type, VOLK_TERM_LITERAL);
  141. EXPECT_STR_EQ (lit2->data, data);
  142. EXPECT_STR_EQ (lit2->datatype->data, DEFAULT_DTYPE);
  143. VOLK_Term *lit3 = VOLK_literal_new (data, NULL);
  144. EXPECT_INT_EQ (lit3->type, VOLK_TERM_LITERAL);
  145. EXPECT_STR_EQ (lit3->data, data);
  146. EXPECT_STR_EQ (lit3->datatype->data, DEFAULT_DTYPE);
  147. ASSERT (lit1->datatype != lit2->datatype, "Wrong data type match!");
  148. ASSERT (lit2->datatype == lit3->datatype, "Data type mismatch!");
  149. ASSERT (!VOLK_term_equals (lit1, lit2), "Wrong term match!");
  150. ASSERT (VOLK_term_equals (lit2, lit3), "Term mismatch!");
  151. VOLK_Term *lt_lit1 = VOLK_lt_literal_new (data, lang);
  152. EXPECT_INT_EQ (lt_lit1->type, VOLK_TERM_LT_LITERAL);
  153. EXPECT_STR_EQ (lt_lit1->data, data);
  154. EXPECT_STR_EQ (lt_lit1->lang, lang);
  155. // LT-literal without lang is a normal string literal.
  156. VOLK_Term *lt_lit2 = VOLK_lt_literal_new (data, NULL);
  157. EXPECT_INT_EQ (lt_lit2->type, VOLK_TERM_LITERAL);
  158. EXPECT_STR_EQ (lt_lit2->data, data);
  159. ASSERT (VOLK_term_equals (lt_lit2, lit2), "Term mismatch!");
  160. EXPECT_STR_EQ (lt_lit2->datatype->data, DEFAULT_DTYPE);
  161. VOLK_term_free (lit1);
  162. VOLK_term_free (lit2);
  163. VOLK_term_free (lit3);
  164. VOLK_term_free (lt_lit1);
  165. VOLK_term_free (lt_lit2);
  166. return 0;
  167. }
  168. static int test_undefined()
  169. {
  170. VOLK_Term *undef1 = VOLK_term_new (VOLK_TERM_UNDEFINED, NULL, NULL);
  171. ASSERT (undef1 != NULL, "Error creating undefined term without data!");
  172. char *data = "bogus";
  173. VOLK_Term *undef2 = VOLK_term_new (VOLK_TERM_UNDEFINED, data, NULL);
  174. ASSERT (undef2 != NULL, "Error creating undefined term with data!");
  175. EXPECT_STR_EQ (undef2->data, data);
  176. VOLK_term_free (undef1);
  177. VOLK_term_free (undef2);
  178. return 0;
  179. }
  180. static int test_term_copy()
  181. {
  182. VOLK_Term *uri1 = VOLK_iriref_new ("http://hello.org");
  183. VOLK_Term *lit1 = VOLK_literal_new ("hello", NULL);
  184. VOLK_Term *tlit1 = VOLK_literal_new (
  185. "hello", VOLK_iriref_new ("urn:mydatatype:string"));
  186. VOLK_Term *llit1 = VOLK_lt_literal_new ("hello", "en-US");
  187. VOLK_Term *uri2 = VOLK_term_copy (uri1);
  188. VOLK_Term *lit2 = VOLK_term_copy (lit1);
  189. VOLK_Term *tlit2 = VOLK_term_copy (tlit1);
  190. VOLK_Term *llit2 = VOLK_term_copy (llit1);
  191. ASSERT (VOLK_term_equals (uri1, uri2), "Term mismatch!");
  192. ASSERT (VOLK_term_equals (lit1, lit2), "Term mismatch!");
  193. ASSERT (VOLK_term_equals (tlit1, tlit2), "Term mismatch!");
  194. ASSERT (VOLK_term_equals (llit1, llit2), "Term mismatch!");
  195. VOLK_term_free (uri1);
  196. VOLK_term_free (uri2);
  197. VOLK_term_free (lit1);
  198. VOLK_term_free (lit2);
  199. VOLK_term_free (tlit1);
  200. VOLK_term_free (tlit2);
  201. VOLK_term_free (llit1);
  202. VOLK_term_free (llit2);
  203. return 0;
  204. }
  205. static int test_term_serialize_deserialize()
  206. {
  207. VOLK_Term *uri = VOLK_iriref_new ("http://hello.org");
  208. VOLK_Term *lit = VOLK_literal_new ("hello", NULL);
  209. VOLK_Term *tlit = VOLK_literal_new (
  210. "hello", VOLK_iriref_new ("urn:mydatatype:string"));
  211. VOLK_Term *llit = VOLK_lt_literal_new ("hello", "en-US");
  212. VOLK_Buffer *sterm;
  213. VOLK_Term *dsterm;
  214. sterm = VOLK_term_serialize (uri);
  215. ASSERT (sterm != NULL, "Error serializing term!");
  216. //log_info ("%s", "Serialized URI: ");
  217. //VOLK_buffer_print (sterm);
  218. //log_info ("%s", "\n");
  219. dsterm = VOLK_term_new_from_buffer (sterm);
  220. ASSERT (dsterm != NULL, "Error deserializing term!");
  221. ASSERT (VOLK_term_equals (dsterm, uri), "URI serialization error!");
  222. VOLK_term_free (uri);
  223. VOLK_buffer_free (sterm);
  224. VOLK_term_free (dsterm);
  225. sterm = VOLK_term_serialize (lit);
  226. ASSERT (sterm != NULL, "Error serializing term!");
  227. //log_info ("%s", "Serialized literal: ");
  228. //VOLK_buffer_print (sterm);
  229. //log_info ("%s", "\n");
  230. dsterm = VOLK_term_new_from_buffer (sterm);
  231. ASSERT (dsterm != NULL, "Error deserializing term!");
  232. ASSERT (VOLK_term_equals (dsterm, lit), "lit serialization error!");
  233. VOLK_term_free (lit);
  234. VOLK_buffer_free (sterm);
  235. VOLK_term_free (dsterm);
  236. sterm = VOLK_term_serialize (tlit);
  237. ASSERT (sterm != NULL, "Error serializing term!");
  238. //log_info ("%s", "Serialized typed literal: ");
  239. //VOLK_buffer_print (sterm);
  240. //log_info ("%s", "\n");
  241. dsterm = VOLK_term_new_from_buffer (sterm);
  242. ASSERT (dsterm != NULL, "Error deserializing term!");
  243. ASSERT (VOLK_term_equals (dsterm, tlit), "tlit serialization error!");
  244. VOLK_term_free (tlit);
  245. VOLK_buffer_free (sterm);
  246. VOLK_term_free (dsterm);
  247. sterm = VOLK_term_serialize (llit);
  248. ASSERT (sterm != NULL, "Error serializing term!");
  249. //log_info ("%s", "Serialized typed and language-tagged URI: ");
  250. //VOLK_buffer_print (sterm);
  251. //log_info ("%s", "\n");
  252. dsterm = VOLK_term_new_from_buffer (sterm);
  253. ASSERT (dsterm != NULL, "Error deserializing term!");
  254. ASSERT (VOLK_term_equals (dsterm, llit), "URI serialization error!");
  255. VOLK_term_free (llit);
  256. VOLK_buffer_free (sterm);
  257. VOLK_term_free (dsterm);
  258. return 0;
  259. }
  260. static int test_term_to_key()
  261. {
  262. VOLK_nsmap_add ("ns1", "http://hello.org/term#");
  263. VOLK_Term *uri1 = VOLK_iriref_new ("http://hello.org/term#bye");
  264. VOLK_Term *uri2 = VOLK_iriref_new_ns ("ns1:bye");
  265. VOLK_Term *lit = VOLK_literal_new ("hello", NULL);
  266. VOLK_Term *tlit = VOLK_literal_new ("hello", VOLK_default_datatype);
  267. VOLK_Term *llit1 = VOLK_lt_literal_new ("hello", "en-US");
  268. VOLK_Term *llit2 = VOLK_lt_literal_new ("hello", "en-GB");
  269. VOLK_Term *llit3 = VOLK_lt_literal_new ("hello", NULL);
  270. VOLK_Key uri1_key = VOLK_term_hash (uri1);
  271. VOLK_Key uri2_key = VOLK_term_hash (uri2);
  272. VOLK_Key lit_key = VOLK_term_hash (lit);
  273. VOLK_Key tlit_key = VOLK_term_hash (tlit);
  274. VOLK_Key llit1_key = VOLK_term_hash (llit1);
  275. VOLK_Key llit2_key = VOLK_term_hash (llit2);
  276. VOLK_Key llit3_key = VOLK_term_hash (llit3);
  277. ASSERT (uri1_key == uri2_key, "URI keys differ!");
  278. ASSERT (uri1_key != lit_key, "URI key conflict!");
  279. ASSERT (lit_key == tlit_key, "URI keys differ!");
  280. ASSERT (lit_key != llit1_key, "URI key conflict!");
  281. ASSERT (tlit_key != llit1_key, "URI key conflict!");
  282. ASSERT (llit1_key != llit2_key, "URI key conflict!");
  283. ASSERT (tlit_key == llit3_key, "URI keys differ!");
  284. VOLK_term_free (uri1);
  285. VOLK_term_free (uri2);
  286. VOLK_term_free (lit);
  287. VOLK_term_free (tlit);
  288. VOLK_term_free (llit1);
  289. VOLK_term_free (llit2);
  290. VOLK_term_free (llit3);
  291. return 0;
  292. }
  293. int term_tests() {
  294. RUN (test_iriref);
  295. RUN (test_iriref_parts);
  296. RUN (test_iriref_abs_rel);
  297. RUN (test_literal);
  298. RUN (test_undefined);
  299. RUN (test_term_copy);
  300. RUN (test_term_serialize_deserialize);
  301. RUN (test_term_to_key);
  302. return 0;
  303. }