describe("MergeUtils suite", function() {
  var B = '#000000';
  var R = '#ff0000';
  var T = Constants.TRANSPARENT_COLOR;

  var createPiskelFromGrid = function (grid, name) {
    var frame = pskl.model.Frame.fromPixelGrid(grid);
    var layer = pskl.model.Layer.fromFrames("l1", [frame]);
    return pskl.model.Piskel.fromLayers([layer], 12, {
      name: name || "piskel",
      description: "desc"
    });
  };

  /**
   * Simple helper to create a monochrome sprite for the provided color,
   * number of rows and columns.
   */
  var getPiskel = function (color, rows, cols) {
    var grid = [];
    for (var i = 0 ; i < rows ; i++) {
      grid[i] = [];
      for (var j = 0 ; j < cols ; j++) {
        grid[i][j] = color;
      }
    }
    return createPiskelFromGrid(grid);
  };

  it("merges 2 piskel - insertMode:add same size", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 2, 2);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "add"
    });

    expect(mergedPiskel.getWidth()).toBe(2);
    expect(mergedPiskel.getHeight()).toBe(2);
    expect(mergedPiskel.getLayers().length).toBe(2);
    expect(mergedPiskel.getLayers()[0].getFrames().length).toBe(2);
  });

  it("merges 2 piskel - insertMode:insert same size", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 2, 2);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(2);
    expect(mergedPiskel.getHeight()).toBe(2);
    expect(mergedPiskel.getLayers().length).toBe(2);
    expect(mergedPiskel.getLayers()[0].getFrames().length).toBe(1);
  });

  it("merges 2 piskel - resize:expand with bigger imported piskel", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 4, 4);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(4);
    expect(mergedPiskel.getHeight()).toBe(4);
  });

  it("merges 2 piskel - resize:keep with bigger imported piskel", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 4, 4);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "keep",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(2);
    expect(mergedPiskel.getHeight()).toBe(2);
  });

  it("merges 2 piskel - resize:expand with taller but thinner imported piskel", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 1, 4);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(2);
    expect(mergedPiskel.getHeight()).toBe(4);
  });

  it("merges 2 piskel - resize:expand with wider but shorter imported piskel", function () {
    var piskel1 = getPiskel(B, 2, 2);
    var piskel2 = getPiskel(R, 4, 1);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(4);
    expect(mergedPiskel.getHeight()).toBe(2);
  });

  it("merges 2 piskel - resize:expand with bigger original piskel", function () {
    var piskel1 = getPiskel(B, 3, 3);
    var piskel2 = getPiskel(R, 1, 1);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "expand",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(3);
    expect(mergedPiskel.getHeight()).toBe(3);
  });

  it("merges 2 piskel - resize:keep with bigger original piskel", function () {
    var piskel1 = getPiskel(B, 3, 3);
    var piskel2 = getPiskel(R, 1, 1);

    var mergedPiskel = pskl.utils.MergeUtils.merge(piskel1, piskel2, {
      index: 0,
      resize: "keep",
      origin: "TOPLEFT",
      insertMode: "insert"
    });

    expect(mergedPiskel.getWidth()).toBe(3);
    expect(mergedPiskel.getHeight()).toBe(3);
  });
});