@graph-data-structure/specification Home Manual Reference Source

src/spec/multiGraph.js

  1. import {list} from '@iterable-iterator/list';
  2. import {range} from '@iterable-iterator/range';
  3. import {map} from '@iterable-iterator/map';
  4. import {chain} from '@iterable-iterator/chain';
  5. import {exhaust} from '@iterable-iterator/consume';
  6. import {all} from '@iterable-iterator/reduce';
  7. import {len, isEmpty} from '@iterable-iterator/cardinality';
  8. import {set} from '@collection-abstraction/set';
  9.  
  10. import methods from './methods.js';
  11.  
  12. export default function multiGraph(test, title, Constructor) {
  13. methods(test, title, Constructor);
  14.  
  15. test('graph-spec : MultiGraph simple test > ' + title, (t) => {
  16. const G = new Constructor();
  17.  
  18. const u = G.vadd('A');
  19. const v = G.vadd('B');
  20.  
  21. const uv = G.eadd(u, v);
  22.  
  23. t.true(set(G.vitr()).isequal(G.vertices()));
  24.  
  25. t.true(set([u, v]).isequal(G.vitr()));
  26. let [a, b] = G.edges().next().value;
  27. t.true(set([a, b]).isequal([u, v]));
  28.  
  29. G.reverse();
  30.  
  31. t.true(set([u, v]).isequal(G.vitr()));
  32. t.is(G.eitr().next().value, uv);
  33. [a, b] = G.edges().next().value;
  34. t.true(set([a, b]).isequal([u, v]));
  35.  
  36. const vu = G.eadd(v, u);
  37. t.is(len(G.eitr()), 2);
  38.  
  39. G.edel(uv);
  40. t.is(len(G.eitr()), 1);
  41.  
  42. t.is(G.eitr().next().value, vu);
  43.  
  44. G.edel(vu);
  45. t.true(isEmpty(G.eitr()));
  46.  
  47. G.vdel(u);
  48. G.vdel(v);
  49. t.true(isEmpty(G.vitr()));
  50. });
  51.  
  52. test('graph-spec : MultiGraph extensive test > ' + title, (t) => {
  53. const G = new Constructor();
  54.  
  55. const n = 10;
  56.  
  57. let V;
  58. let E;
  59.  
  60. const init = () => {
  61. const V = list(map((i) => G.vadd(i), range(n)));
  62. t.true(set(G.vitr()).isequal(G.vertices()));
  63.  
  64. const E = [
  65. G.eadd(V[0], V[1]),
  66. G.eadd(V[0], V[2]),
  67. G.eadd(V[0], V[3]),
  68.  
  69. G.eadd(V[4], V[1]),
  70. G.eadd(V[4], V[2]),
  71. G.eadd(V[4], V[3]),
  72.  
  73. G.eadd(V[5], V[6]),
  74. G.eadd(V[5], V[7]),
  75. G.eadd(V[5], V[8]),
  76.  
  77. G.eadd(V[9], V[6]),
  78. G.eadd(V[9], V[7]),
  79. G.eadd(V[9], V[8]),
  80.  
  81. G.eadd(V[0], V[1]),
  82. G.eadd(V[0], V[2]),
  83. G.eadd(V[0], V[3]),
  84. ];
  85.  
  86. return [V, E];
  87. };
  88.  
  89. const delete_all_edges = () => exhaust(map(G.edel.bind(G), E));
  90. const delete_all_vertices = () => exhaust(map(G.vdel.bind(G), V));
  91.  
  92. [V, E] = init();
  93.  
  94. t.is(len(G.vitr()), 10);
  95. t.is(len(G.eitr()), 15);
  96.  
  97. delete_all_edges();
  98.  
  99. t.is(len(G.vitr()), 10);
  100. t.true(isEmpty(G.eitr()));
  101.  
  102. delete_all_vertices();
  103.  
  104. t.true(isEmpty(G.vitr()));
  105. t.true(isEmpty(G.eitr()));
  106.  
  107. [V, E] = init();
  108.  
  109. t.is(len(G.vitr()), 10);
  110. t.is(len(G.eitr()), 15);
  111.  
  112. delete_all_vertices();
  113.  
  114. t.true(isEmpty(G.vitr()));
  115. t.true(isEmpty(G.eitr()));
  116.  
  117. [V, E] = init();
  118.  
  119. t.is(len(G.iitr(V[0])), 6);
  120. t.is(len(G.iitr(V[1])), 3);
  121. t.is(len(G.iitr(V[2])), 3);
  122. t.is(len(G.iitr(V[3])), 3);
  123. t.is(len(G.iitr(V[4])), 3);
  124. t.is(len(G.iitr(V[5])), 3);
  125. t.is(len(G.iitr(V[6])), 2);
  126. t.is(len(G.iitr(V[7])), 2);
  127. t.is(len(G.iitr(V[8])), 2);
  128. t.is(len(G.iitr(V[9])), 3);
  129.  
  130. t.is(len(G.initr(V[0])), 6);
  131. t.is(len(G.initr(V[1])), 3);
  132. t.is(len(G.initr(V[2])), 3);
  133. t.is(len(G.initr(V[3])), 3);
  134. t.is(len(G.initr(V[4])), 3);
  135. t.is(len(G.initr(V[5])), 3);
  136. t.is(len(G.initr(V[6])), 2);
  137. t.is(len(G.initr(V[7])), 2);
  138. t.is(len(G.initr(V[8])), 2);
  139. t.is(len(G.initr(V[9])), 3);
  140.  
  141. t.is(len(G.outitr(V[0])), 6);
  142. t.is(len(G.outitr(V[1])), 3);
  143. t.is(len(G.outitr(V[2])), 3);
  144. t.is(len(G.outitr(V[3])), 3);
  145. t.is(len(G.outitr(V[4])), 3);
  146. t.is(len(G.outitr(V[5])), 3);
  147. t.is(len(G.outitr(V[6])), 2);
  148. t.is(len(G.outitr(V[7])), 2);
  149. t.is(len(G.outitr(V[8])), 2);
  150. t.is(len(G.outitr(V[9])), 3);
  151.  
  152. G.reverse();
  153.  
  154. t.is(len(G.iitr(V[0])), 6);
  155. t.is(len(G.iitr(V[1])), 3);
  156. t.is(len(G.iitr(V[2])), 3);
  157. t.is(len(G.iitr(V[3])), 3);
  158. t.is(len(G.iitr(V[4])), 3);
  159. t.is(len(G.iitr(V[5])), 3);
  160. t.is(len(G.iitr(V[6])), 2);
  161. t.is(len(G.iitr(V[7])), 2);
  162. t.is(len(G.iitr(V[8])), 2);
  163. t.is(len(G.iitr(V[9])), 3);
  164.  
  165. t.is(len(G.outitr(V[0])), 6);
  166. t.is(len(G.outitr(V[1])), 3);
  167. t.is(len(G.outitr(V[2])), 3);
  168. t.is(len(G.outitr(V[3])), 3);
  169. t.is(len(G.outitr(V[4])), 3);
  170. t.is(len(G.outitr(V[5])), 3);
  171. t.is(len(G.outitr(V[6])), 2);
  172. t.is(len(G.outitr(V[7])), 2);
  173. t.is(len(G.outitr(V[8])), 2);
  174. t.is(len(G.outitr(V[9])), 3);
  175.  
  176. t.is(len(G.initr(V[0])), 6);
  177. t.is(len(G.initr(V[1])), 3);
  178. t.is(len(G.initr(V[2])), 3);
  179. t.is(len(G.initr(V[3])), 3);
  180. t.is(len(G.initr(V[4])), 3);
  181. t.is(len(G.initr(V[5])), 3);
  182. t.is(len(G.initr(V[6])), 2);
  183. t.is(len(G.initr(V[7])), 2);
  184. t.is(len(G.initr(V[8])), 2);
  185. t.is(len(G.initr(V[9])), 3);
  186.  
  187. t.true(set(G.nitr(V[0])).isequal([V[1], V[2], V[3]]));
  188. t.true(set(G.nitr(V[1])).isequal([V[0], V[4]]));
  189. t.true(set(G.nitr(V[2])).isequal([V[0], V[4]]));
  190. t.true(set(G.nitr(V[3])).isequal([V[0], V[4]]));
  191. t.true(set(G.nitr(V[4])).isequal([V[1], V[2], V[3]]));
  192. t.true(set(G.nitr(V[5])).isequal([V[6], V[7], V[8]]));
  193. t.true(set(G.nitr(V[6])).isequal([V[5], V[9]]));
  194. t.true(set(G.nitr(V[7])).isequal([V[5], V[9]]));
  195. t.true(set(G.nitr(V[8])).isequal([V[5], V[9]]));
  196. t.true(set(G.nitr(V[9])).isequal([V[6], V[7], V[8]]));
  197.  
  198. t.true(set(G.dsitr(V[0])).isequal([V[1], V[2], V[3]]));
  199. t.true(set(G.dsitr(V[1])).isequal([V[0], V[4]]));
  200. t.true(set(G.dsitr(V[2])).isequal([V[0], V[4]]));
  201. t.true(set(G.dsitr(V[3])).isequal([V[0], V[4]]));
  202. t.true(set(G.dsitr(V[4])).isequal([V[1], V[2], V[3]]));
  203. t.true(set(G.dsitr(V[5])).isequal([V[6], V[7], V[8]]));
  204. t.true(set(G.dsitr(V[6])).isequal([V[5], V[9]]));
  205. t.true(set(G.dsitr(V[7])).isequal([V[5], V[9]]));
  206. t.true(set(G.dsitr(V[8])).isequal([V[5], V[9]]));
  207. t.true(set(G.dsitr(V[9])).isequal([V[6], V[7], V[8]]));
  208.  
  209. t.true(set(G.dpitr(V[0])).isequal([V[1], V[2], V[3]]));
  210. t.true(set(G.dpitr(V[1])).isequal([V[0], V[4]]));
  211. t.true(set(G.dpitr(V[2])).isequal([V[0], V[4]]));
  212. t.true(set(G.dpitr(V[3])).isequal([V[0], V[4]]));
  213. t.true(set(G.dpitr(V[4])).isequal([V[1], V[2], V[3]]));
  214. t.true(set(G.dpitr(V[5])).isequal([V[6], V[7], V[8]]));
  215. t.true(set(G.dpitr(V[6])).isequal([V[5], V[9]]));
  216. t.true(set(G.dpitr(V[7])).isequal([V[5], V[9]]));
  217. t.true(set(G.dpitr(V[8])).isequal([V[5], V[9]]));
  218. t.true(set(G.dpitr(V[9])).isequal([V[6], V[7], V[8]]));
  219.  
  220. t.is(len(G.edges()), 15, 'G.edges( ) length');
  221.  
  222. const edges = set(E);
  223.  
  224. for (const [u, v, e] of G.edges()) {
  225. t.true(edges.has(e));
  226.  
  227. t.true(set([u, v]).isequal(G.endpoints(e)));
  228.  
  229. edges.remove(e);
  230. }
  231.  
  232. for (const i of range(n)) {
  233. t.true(all(map(([u, v]) => u === V[i] || v === V[i], G.incident(V[i]))));
  234.  
  235. t.true(
  236. set(map(([_u, _v, e]) => e, G.incident(V[i]))).isequal(
  237. chain(
  238. map(([_u, _v, e]) => e, G.ingoing(V[i])),
  239. map(([_u, _v, e]) => e, G.outgoing(V[i])),
  240. ),
  241. ),
  242. );
  243.  
  244. t.true(
  245. set(
  246. chain(
  247. map(([, v]) => v, G.incident(V[i])),
  248. map(([u]) => u, G.incident(V[i])),
  249. ),
  250. ).isequal(
  251. chain(
  252. [V[i]],
  253. map(([u]) => u, G.ingoing(V[i])),
  254. map(([, v]) => v, G.outgoing(V[i])),
  255. ),
  256. ),
  257. );
  258.  
  259. t.true(
  260. set(G.nitr(V[i])).isequal(
  261. map(([u, v]) => (u === V[i] ? v : u), G.incident(V[i])),
  262. ),
  263. );
  264. t.true(set(G.dpitr(V[i])).isequal(map(([u]) => u, G.ingoing(V[i]))));
  265. t.true(set(G.dsitr(V[i])).isequal(map(([, v]) => v, G.outgoing(V[i]))));
  266. }
  267.  
  268. delete_all_edges();
  269.  
  270. t.is(len(G.vitr()), 10);
  271. t.true(isEmpty(G.eitr()));
  272.  
  273. delete_all_vertices();
  274.  
  275. t.true(isEmpty(G.vitr()));
  276. t.true(isEmpty(G.eitr()));
  277. });
  278. }