Home Reference Source Test Repository

test/serialize-test.js

// graph serialize unit tests
/* eslint no-unused-expressions: 0 */

import chai from 'chai';
chai.should();

import { Serializer } from '../src/js/util/graph-serialize';
import { Graph } from '../src/js/data/graph';
import { CircleNode as Node } from '../src/js/data/node/circle-node';
import { HexagonNode } from '../src/js/data/node/hexagon-node';
import { SolidEdge as Edge } from '../src/js/data/edge/solid-edge';

let IDSET = '_$$SET$$_';

describe('Serializer', () => {
  describe('#constructor', () => {
    it('creates instance of Serializer', () => {
      let graph = new Graph();
      let fn = function (g) {};
      (new Serializer(graph, fn)).should.be.instanceof(Serializer);
    });
  });

  describe('#emptyGraph', () => {
    it('should create valid graph obj export', () => {
      let graph = new Graph();
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let serialObj = serializer.serializeGraph();
      (serialObj.hasOwnProperty(IDSET +'edges')).should.be.true;
      (serialObj.hasOwnProperty(IDSET + 'nodes')).should.be.true;
      (serialObj[IDSET + 'nodes'].length).should.equal(0);
      (serialObj[IDSET + 'edges'].length).should.equal(0);
    });

    it('should create valid graph obj import', () => {
      let graph = new Graph();
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let serialObj = serializer.serializeGraph();
      let deserializeInfo = serializer.deserializeGraph(serialObj);
      let graph2 = deserializeInfo.graph;
      (graph2).should.be.instanceof(Graph);
      graph2.nodes.size.should.equal(0);
      graph2.edges.size.should.equal(0);
      (graph2 === graph).should.be.false;
    });

    it('should fail cleanly on importing malformed input', () => {
      let graph = new Graph();
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let badInput = JSON.parse('{"_$$SET$$_nodes":[{"NotANode":0}],"Everything":42}');
      let deserializeInfo = null;
      try {
        deserializeInfo = serializer.deserializeGraph(badInput);
        // should never be reached
        (0).should.equal(1);
      } catch(ex) {
        (ex).should.be.instanceof(Error);
        (deserializeInfo === null).should.be.true;
      }
    });
  });

  describe('#populatedGraph', () => {
    it('should create valid graph obj export', () => {
      let node1 = new Node(0, 0);
      let node2 = new Node(1, 0);
      let edge1 = new Edge(node1, node2);

      let nodes = new Set();
      nodes.add(node1);
      nodes.add(node2);

      let edges = new Set();
      edges.add(edge1);

      let graph = new Graph(nodes, edges);
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let serialObj = serializer.serializeGraph();
      (serialObj.hasOwnProperty(IDSET + 'edges')).should.be.true;
      (serialObj.hasOwnProperty(IDSET + 'nodes')).should.be.true;
      let edgeArray = serialObj[IDSET + 'edges'];
      let nodeArray = serialObj[IDSET + 'nodes'];
      (nodeArray.length).should.equal(2);
      (edgeArray.length).should.equal(1);
    });

    it('should create valid graph obj import', () => {
      let node1 = new Node(0, 0);
      let node2 = new Node(1, 0);
      let edge1 = new Edge(node1, node2);

      let nodes = new Set();
      nodes.add(node1);
      nodes.add(node2);

      let edges = new Set();
      edges.add(edge1);

      let graph = new Graph(nodes, edges);
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let serialObj = serializer.serializeGraph();
      let edgeArray = serialObj[IDSET + 'edges'];
      let nodeArray = serialObj[IDSET + 'nodes'];
      (nodeArray.length).should.equal(2);
      (edgeArray.length).should.equal(1);
      let deserializeInfo = serializer.deserializeGraph(serialObj);
      let graph2 = deserializeInfo.graph;
      (graph2).should.be.instanceof(Graph);
      (graph2.edges.size).should.equal(1);
      (graph2.nodes.size).should.equal(2);
      for (let testNode of graph2.nodes) {
        (testNode.id === node1.id || testNode.id === node2.id).should.be.true;
      }
      for (let testEdge of graph2.edges) {
        (testEdge.id === edge1.id).should.be.true;
      }
    });

    it('should create valid graph obj import', () => {
      let node1 = new Node(0, 0);
      let node2 = new Node(1, 0);
      let node3 = new HexagonNode(2, 0);
      let node4 = new Node(3, 0);
      let edge1 = new Edge(node1, node2);
      let edge2 = new Edge(node1, node3);

      let nodes = new Set();
      nodes.add(node1);
      nodes.add(node2);
      nodes.add(node3);
      nodes.add(node4);

      let edges = new Set();
      edges.add(edge1);
      edges.add(edge2);

      let graph = new Graph(nodes, edges);
      let fn = function (g) {};
      let serializer = new Serializer(graph, fn);
      let serialObj = serializer.serializeGraph();
      let edgeArray = serialObj[IDSET + 'edges'];
      let nodeArray = serialObj[IDSET + 'nodes'];
      (nodeArray.length).should.equal(4);
      (edgeArray.length).should.equal(2);
      let deserializeInfo = serializer.deserializeGraph(serialObj);
      let graph2 = deserializeInfo.graph;
      (graph2).should.be.instanceof(Graph);
      (graph2.edges.size).should.equal(2);
      (graph2.nodes.size).should.equal(4);
      for (let testNode of graph2.nodes) {
        switch (testNode.id) {
        case node1.id:
          (testNode).should.be.instanceof(Node);
          for(let testEdge of testNode.edges) {
            (testEdge.id === edge1.id || testEdge.id === edge2.id).should.be.true;
          }
          break;
        case node2.id:
          (testNode).should.be.instanceof(Node);
          for(let testEdge of testNode.edges) {
            (testEdge.id === edge1.id).should.be.true;
          }
          break;
        case node3.id:
          (testNode).should.be.instanceof(HexagonNode);
          for(let testEdge of testNode.edges) {
            (testEdge.id === edge2.id).should.be.true;
          }
          break;
        case node4.id:
          (testNode).should.be.instanceof(Node);
          testNode.edges.size.should.equal(0);
          break;
        default:
          // should never be reached
          (0).should.equal(1);
        }
      }
      for (let testEdge of graph2.edges) {
        switch (testEdge.id) {
        case edge1.id:
          (testEdge).should.be.instanceof(Edge);
          (testEdge.startNode.id).should.equal(node1.id);
          (testEdge.destNode.id).should.equal(node2.id);
          break;
        case edge2.id:
          (testEdge).should.be.instanceof(Edge);
          (testEdge.startNode.id).should.equal(node1.id);
          (testEdge.destNode.id).should.equal(node3.id);
          break;
        default:
          // should never be reached
          (0).should.equal(1);
        }
      }
    });
  });
});