spec/utils/compare.js

/* eslint-disable no-console */
/* global XMLHttpRequest, expect, fail */
var globalVar =
  (typeof self !== "undefined" && self) ||
  (typeof global !== "undefined" && global) ||
  (typeof window !== "undefined" && window) ||
  Function("return this")();

function cleanUpUnicode(value) {
  var i = 0;
  var byteArray = [];
  var StringFromCharCode = String.fromCharCode;
  for (i = 0; i < value.length; i += 1) {
    byteArray.push(StringFromCharCode(value.charCodeAt(i) & 0xff));
  }
  return byteArray.join("");
}

globalVar.sendReference = function() {};
globalVar.loadBinaryResource = function() {};

var prefix = globalVar.isNode ? "/../" : "/base/spec/";

if (globalVar.isNode === true) {
  var fs = require("fs");
  var path = require("path");
  globalVar.loadBinaryResource = function(url) {
    var result = "";
    try {
      result = fs.readFileSync(path.resolve(__dirname + prefix + url), {
        encoding: "latin1"
      });
    } catch (e) {
      console.log(e);
    }
    return result;
  };
} else {
  globalVar.sendReference = function(filename, data) {
    const req = new XMLHttpRequest();
    req.open("POST", `http://localhost:9090${filename}`, true);
    req.setRequestHeader("Content-Type", "text/plain; charset=x-user-defined");
    req.onload = e => {
      //console.log(e)
    };

    const uint8Array = new Uint8Array(data.length);
    for (let i = 0; i < data.length; i++) {
      uint8Array[i] = data.charCodeAt(i);
    }
    const blob = new Blob([uint8Array], {
      type: "text/plain; charset=x-user-defined"
    });

    req.send(blob);
  };

  globalVar.loadBinaryResource = function(url, unicodeCleanUp) {
    const req = new XMLHttpRequest();
    req.open("GET", prefix + url, false);
    // XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
    req.overrideMimeType("text/plain; charset=x-user-defined");
    req.send(null);
    if (req.status !== 200) {
      throw new Error("Unable to load file");
    }

    const responseText = req.responseText;
    if (unicodeCleanUp) {
      const StringFromCharCode = String.fromCharCode;
      const byteArray = new Array(req.responseText.length);

      for (let i = 0; i < responseText.length; i += 1) {
        byteArray[i] = StringFromCharCode(responseText.charCodeAt(i) & 0xff);
      }
      return byteArray.join("");
    }

    return req.responseText;
  };
}

function resetFile(pdfFile) {
  pdfFile = pdfFile.replace(
    /\/CreationDate \(D:(.*?)\)/,
    "/CreationDate (D:19871210000000+00'00')"
  );
  pdfFile = pdfFile.replace(
    /(\/ID \[ (<[0-9a-fA-F]+> ){2}\])/,
    "/ID [ <00000000000000000000000000000000> <00000000000000000000000000000000> ]"
  );
  pdfFile = pdfFile.replace(
    /(\/Producer \(jsPDF [1-9].[0-9].[0-9]\))/,
    "/Producer (jsPDF 0.0.0)"
  );
  return pdfFile;
}
/**
 * Find a better way to set this
 * @type {Boolean}
 */
globalVar.comparePdf = function(actual, expectedFile, suite, unicodeCleanUp) {
  unicodeCleanUp = unicodeCleanUp || true;
  var pdf;
  try {
    pdf = globalVar.loadBinaryResource(
      "reference/" + expectedFile,
      unicodeCleanUp
    );
    if (typeof pdf !== "string") {
      throw Error("Error loading 'reference/" + expectedFile + "'");
    }
  } catch (error) {
    fail(error.message);
    globalVar.sendReference(
      "/spec/reference/" + expectedFile,
      cleanUpUnicode(resetFile(actual.replace(/^\s+|\s+$/g, "")))
    );
    return;
  }
  var expected = cleanUpUnicode(resetFile(pdf.replace(/^\s+|\s+$/g, "")));
  actual = cleanUpUnicode(resetFile(actual.replace(/^\s+|\s+$/g, "")));

  expect(actual.replace(/[\r]/g, "").split("\n")).toEqual(
    expected.replace(/[\r]/g, "").split("\n")
  );
};