test_graph.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. import pytest
  2. from rdflib import Graph, Namespace, URIRef
  3. from lakesuperior.model.graph.graph import SimpleGraph, Imr
  4. @pytest.fixture(scope='class')
  5. def trp():
  6. return (
  7. (URIRef('urn:s:0'), URIRef('urn:p:0'), URIRef('urn:o:0')),
  8. # Exact same as [0].
  9. (URIRef('urn:s:0'), URIRef('urn:p:0'), URIRef('urn:o:0')),
  10. # NOTE: s and o are in reversed order.
  11. (URIRef('urn:o:0'), URIRef('urn:p:0'), URIRef('urn:s:0')),
  12. (URIRef('urn:s:0'), URIRef('urn:p:1'), URIRef('urn:o:0')),
  13. (URIRef('urn:s:0'), URIRef('urn:p:1'), URIRef('urn:o:1')),
  14. (URIRef('urn:s:1'), URIRef('urn:p:1'), URIRef('urn:o:1')),
  15. (URIRef('urn:s:1'), URIRef('urn:p:2'), URIRef('urn:o:2')),
  16. )
  17. @pytest.mark.usefixtures('trp')
  18. class TestGraphOps:
  19. """
  20. Test various graph operations.
  21. """
  22. def test_len(self, trp):
  23. """
  24. Test the length of a graph with and without duplicates.
  25. """
  26. gr = SimpleGraph()
  27. assert len(gr) == 0
  28. gr.add((trp[0],))
  29. assert len(gr) == 1
  30. gr.add((trp[1],)) # Same values
  31. assert len(gr) == 1
  32. gr.add((trp[2],))
  33. assert len(gr) == 2
  34. gr.add(trp)
  35. assert len(gr) == 6
  36. def test_dup(self, trp):
  37. """
  38. Test operations with duplicate triples.
  39. """
  40. gr = SimpleGraph()
  41. #import pdb; pdb.set_trace()
  42. gr.add((trp[0],))
  43. assert trp[1] in gr
  44. assert trp[2] not in gr
  45. def test_remove(self, trp):
  46. """
  47. Test adding and removing triples.
  48. """
  49. gr = SimpleGraph()
  50. gr.add(trp)
  51. gr.remove(trp[0])
  52. assert len(gr) == 5
  53. assert trp[0] not in gr
  54. assert trp[1] not in gr
  55. # This is the duplicate triple.
  56. gr.remove(trp[1])
  57. assert len(gr) == 5
  58. # This is the triple in reverse order.
  59. gr.remove(trp[2])
  60. assert len(gr) == 4
  61. gr.remove(trp[4])
  62. assert len(gr) == 3
  63. def test_union(self, trp):
  64. """
  65. Test graph union.
  66. """
  67. gr1 = SimpleGraph()
  68. gr2 = SimpleGraph()
  69. gr1.add(trp[0:3])
  70. gr2.add(trp[2:6])
  71. gr3 = gr1 | gr2
  72. assert len(gr3) == 5
  73. assert trp[0] in gr3
  74. assert trp[4] in gr3
  75. def test_ip_union(self, trp):
  76. """
  77. Test graph in-place union.
  78. """
  79. gr1 = SimpleGraph()
  80. gr2 = SimpleGraph()
  81. gr1.add(trp[0:3])
  82. gr2.add(trp[2:6])
  83. gr1 |= gr2
  84. assert len(gr1) == 5
  85. assert trp[0] in gr1
  86. assert trp[4] in gr1
  87. def test_addition(self, trp):
  88. """
  89. Test graph addition.
  90. """
  91. gr1 = SimpleGraph()
  92. gr2 = SimpleGraph()
  93. gr1.add(trp[0:3])
  94. gr2.add(trp[2:6])
  95. gr3 = gr1 + gr2
  96. assert len(gr3) == 5
  97. assert trp[0] in gr3
  98. assert trp[4] in gr3
  99. def test_ip_addition(self, trp):
  100. """
  101. Test graph in-place addition.
  102. """
  103. gr1 = SimpleGraph()
  104. gr2 = SimpleGraph()
  105. gr1.add(trp[0:3])
  106. gr2.add(trp[2:6])
  107. gr1 += gr2
  108. assert len(gr1) == 5
  109. assert trp[0] in gr1
  110. assert trp[4] in gr1
  111. def test_subtraction(self, trp):
  112. """
  113. Test graph addition.
  114. """
  115. gr1 = SimpleGraph()
  116. gr2 = SimpleGraph()
  117. gr1.add(trp[0:4])
  118. gr2.add(trp[2:6])
  119. gr3 = gr1 - gr2
  120. assert len(gr3) == 1
  121. assert trp[0] in gr3
  122. assert trp[1] in gr3
  123. assert trp[2] not in gr3
  124. assert trp[3] not in gr3
  125. assert trp[4] not in gr3
  126. gr3 = gr2 - gr1
  127. assert len(gr3) == 2
  128. assert trp[0] not in gr3
  129. assert trp[1] not in gr3
  130. assert trp[2] not in gr3
  131. assert trp[3] not in gr3
  132. assert trp[4] in gr3
  133. assert trp[5] in gr3
  134. def test_ip_subtraction(self, trp):
  135. """
  136. Test graph in-place addition.
  137. """
  138. gr1 = SimpleGraph()
  139. gr2 = SimpleGraph()
  140. gr1.add(trp[0:4])
  141. gr2.add(trp[2:6])
  142. gr1 -= gr2
  143. assert len(gr1) == 1
  144. assert trp[0] in gr1
  145. assert trp[1] in gr1
  146. assert trp[2] not in gr1
  147. assert trp[3] not in gr1
  148. assert trp[4] not in gr1
  149. def test_intersect(self, trp):
  150. """
  151. Test graph intersextion.
  152. """
  153. gr1 = SimpleGraph()
  154. gr2 = SimpleGraph()
  155. gr1.add(trp[0:4])
  156. gr2.add(trp[2:6])
  157. gr3 = gr1 & gr2
  158. assert len(gr3) == 2
  159. assert trp[2] in gr3
  160. assert trp[3] in gr3
  161. assert trp[0] not in gr3
  162. assert trp[5] not in gr3
  163. def test_ip_intersect(self, trp):
  164. """
  165. Test graph intersextion.
  166. """
  167. gr1 = SimpleGraph()
  168. gr2 = SimpleGraph()
  169. gr1.add(trp[0:4])
  170. gr2.add(trp[2:6])
  171. gr1 &= gr2
  172. assert len(gr1) == 2
  173. assert trp[2] in gr1
  174. assert trp[3] in gr1
  175. assert trp[0] not in gr1
  176. assert trp[5] not in gr1
  177. def test_xor(self, trp):
  178. """
  179. Test graph intersextion.
  180. """
  181. gr1 = SimpleGraph()
  182. gr2 = SimpleGraph()
  183. gr1.add(trp[0:4])
  184. gr2.add(trp[2:6])
  185. gr3 = gr1 ^ gr2
  186. assert len(gr3) == 3
  187. assert trp[2] not in gr3
  188. assert trp[3] not in gr3
  189. assert trp[0] in gr3
  190. assert trp[5] in gr3
  191. def test_ip_xor(self, trp):
  192. """
  193. Test graph intersextion.
  194. """
  195. gr1 = SimpleGraph()
  196. gr2 = SimpleGraph()
  197. gr1.add(trp[0:4])
  198. gr2.add(trp[2:6])
  199. gr1 ^= gr2
  200. assert len(gr1) == 3
  201. assert trp[2] not in gr1
  202. assert trp[3] not in gr1
  203. assert trp[0] in gr1
  204. assert trp[5] in gr1
  205. @pytest.mark.usefixtures('trp')
  206. class TestImrOps:
  207. """
  208. Test various graph operations.
  209. """
  210. def test_len(self, trp):
  211. """
  212. Test the length of a graph with and without duplicates.
  213. """
  214. imr = Imr(uri='http://example.edu/imr01')
  215. assert len(imr) == 0
  216. imr.add((trp[0],))
  217. assert len(imr) == 1
  218. imr.add((trp[1],)) # Same values
  219. assert len(imr) == 1
  220. imr.add((trp[2],))
  221. assert len(imr) == 2
  222. imr.add(trp)
  223. assert len(imr) == 6
  224. def test_dup(self, trp):
  225. """
  226. Test operations with duplicate triples.
  227. """
  228. imr = Imr(uri='http://example.edu/imr01')
  229. #import pdb; pdb.set_trace()
  230. imr.add((trp[0],))
  231. assert trp[1] in imr
  232. assert trp[2] not in imr
  233. def test_remove(self, trp):
  234. """
  235. Test adding and removing triples.
  236. """
  237. imr = Imr(uri='http://example.edu/imr01')
  238. imr.add(trp)
  239. imr.remove(trp[0])
  240. assert len(imr) == 5
  241. assert trp[0] not in imr
  242. assert trp[1] not in imr
  243. # This is the duplicate triple.
  244. imr.remove(trp[1])
  245. assert len(imr) == 5
  246. # This is the triple in reverse order.
  247. imr.remove(trp[2])
  248. assert len(imr) == 4
  249. imr.remove(trp[4])
  250. assert len(imr) == 3
  251. def test_union(self, trp):
  252. """
  253. Test graph union.
  254. """
  255. gr1 = Imr(uri='http://example.edu/imr01')
  256. gr2 = Imr(uri='http://example.edu/imr02')
  257. gr1.add(trp[0:3])
  258. gr2.add(trp[2:6])
  259. gr3 = gr1 | gr2
  260. assert len(gr3) == 5
  261. assert trp[0] in gr3
  262. assert trp[4] in gr3
  263. assert gr3.uri == 'http://example.edu/imr01'
  264. def test_ip_union(self, trp):
  265. """
  266. Test graph in-place union.
  267. """
  268. gr1 = Imr(uri='http://example.edu/imr01')
  269. gr2 = Imr(uri='http://example.edu/imr02')
  270. gr1.add(trp[0:3])
  271. gr2.add(trp[2:6])
  272. gr1 |= gr2
  273. assert len(gr1) == 5
  274. assert trp[0] in gr1
  275. assert trp[4] in gr1
  276. assert gr1.uri == 'http://example.edu/imr01'
  277. def test_addition(self, trp):
  278. """
  279. Test graph addition.
  280. """
  281. gr1 = Imr(uri='http://example.edu/imr01')
  282. gr2 = Imr(uri='http://example.edu/imr02')
  283. gr1.add(trp[0:3])
  284. gr2.add(trp[2:6])
  285. gr3 = gr1 + gr2
  286. assert len(gr3) == 5
  287. assert trp[0] in gr3
  288. assert trp[4] in gr3
  289. assert gr3.uri == 'http://example.edu/imr01'
  290. def test_ip_addition(self, trp):
  291. """
  292. Test graph in-place addition.
  293. """
  294. gr1 = Imr(uri='http://example.edu/imr01')
  295. gr2 = Imr(uri='http://example.edu/imr02')
  296. gr1.add(trp[0:3])
  297. gr2.add(trp[2:6])
  298. gr1 += gr2
  299. assert len(gr1) == 5
  300. assert trp[0] in gr1
  301. assert trp[4] in gr1
  302. assert gr1.uri == 'http://example.edu/imr01'
  303. def test_subtraction(self, trp):
  304. """
  305. Test graph addition.
  306. """
  307. gr1 = Imr(uri='http://example.edu/imr01')
  308. gr2 = Imr(uri='http://example.edu/imr02')
  309. gr1.add(trp[0:4])
  310. gr2.add(trp[2:6])
  311. gr3 = gr1 - gr2
  312. assert len(gr3) == 1
  313. assert trp[0] in gr3
  314. assert trp[1] in gr3
  315. assert trp[2] not in gr3
  316. assert trp[3] not in gr3
  317. assert trp[4] not in gr3
  318. gr3 = gr2 - gr1
  319. assert len(gr3) == 2
  320. assert trp[0] not in gr3
  321. assert trp[1] not in gr3
  322. assert trp[2] not in gr3
  323. assert trp[3] not in gr3
  324. assert trp[4] in gr3
  325. assert trp[5] in gr3
  326. assert gr3.uri == 'http://example.edu/imr01'
  327. def test_ip_subtraction(self, trp):
  328. """
  329. Test graph in-place addition.
  330. """
  331. gr1 = Imr(uri='http://example.edu/imr01')
  332. gr2 = Imr(uri='http://example.edu/imr02')
  333. gr1.add(trp[0:4])
  334. gr2.add(trp[2:6])
  335. gr1 -= gr2
  336. assert len(gr1) == 1
  337. assert trp[0] in gr1
  338. assert trp[1] in gr1
  339. assert trp[2] not in gr1
  340. assert trp[3] not in gr1
  341. assert trp[4] not in gr1
  342. assert gr1.uri == 'http://example.edu/imr01'
  343. def test_intersect(self, trp):
  344. """
  345. Test graph intersextion.
  346. """
  347. gr1 = Imr(uri='http://example.edu/imr01')
  348. gr2 = Imr(uri='http://example.edu/imr02')
  349. gr1.add(trp[0:4])
  350. gr2.add(trp[2:6])
  351. gr3 = gr1 & gr2
  352. assert len(gr3) == 2
  353. assert trp[2] in gr3
  354. assert trp[3] in gr3
  355. assert trp[0] not in gr3
  356. assert trp[5] not in gr3
  357. assert gr3.uri == 'http://example.edu/imr01'
  358. def test_ip_intersect(self, trp):
  359. """
  360. Test graph intersextion.
  361. """
  362. gr1 = Imr(uri='http://example.edu/imr01')
  363. gr2 = Imr(uri='http://example.edu/imr02')
  364. gr1.add(trp[0:4])
  365. gr2.add(trp[2:6])
  366. gr1 &= gr2
  367. assert len(gr1) == 2
  368. assert trp[2] in gr1
  369. assert trp[3] in gr1
  370. assert trp[0] not in gr1
  371. assert trp[5] not in gr1
  372. assert gr1.uri == 'http://example.edu/imr01'
  373. def test_xor(self, trp):
  374. """
  375. Test graph intersextion.
  376. """
  377. gr1 = Imr(uri='http://example.edu/imr01')
  378. gr2 = Imr(uri='http://example.edu/imr02')
  379. gr1.add(trp[0:4])
  380. gr2.add(trp[2:6])
  381. gr3 = gr1 ^ gr2
  382. assert len(gr3) == 3
  383. assert trp[2] not in gr3
  384. assert trp[3] not in gr3
  385. assert trp[0] in gr3
  386. assert trp[5] in gr3
  387. assert gr3.uri == 'http://example.edu/imr01'
  388. def test_ip_xor(self, trp):
  389. """
  390. Test graph intersextion.
  391. """
  392. gr1 = Imr(uri='http://example.edu/imr01')
  393. gr2 = Imr(uri='http://example.edu/imr02')
  394. gr1.add(trp[0:4])
  395. gr2.add(trp[2:6])
  396. gr1 ^= gr2
  397. assert len(gr1) == 3
  398. assert trp[2] not in gr1
  399. assert trp[3] not in gr1
  400. assert trp[0] in gr1
  401. assert trp[5] in gr1
  402. assert gr1.uri == 'http://example.edu/imr01'