describe("FrameUtils suite", function() {
  var black = '#000000';
  var red = '#ff0000';
  var transparent = Constants.TRANSPARENT_COLOR;

  // shortcuts
  var toFrameGrid = test.testutils.toFrameGrid;
  var frameEqualsGrid = test.testutils.frameEqualsGrid;

  it("merges 2 frames", function () {
    var B = black, R = red, T = transparent;
    var frame1 = pskl.model.Frame.fromPixelGrid([
      [B, T],
      [T, B]
    ]);

    var frame2 = pskl.model.Frame.fromPixelGrid([
      [T, R],
      [R, T]
    ]);

    var mergedFrame = pskl.utils.FrameUtils.merge([frame1, frame2]);
    frameEqualsGrid(mergedFrame, [
      [B, R],
      [R, B]
    ]);
  });

  it("returns same frame when merging single frame", function () {
    var B = black, T = transparent;
    var frame1 = pskl.model.Frame.fromPixelGrid(toFrameGrid([
      [B, T],
      [B, T]
    ]));

    var mergedFrame = pskl.utils.FrameUtils.merge([frame1]);
    frameEqualsGrid(mergedFrame, [
      [B, T],
      [B, T]
    ]);
  });

  var checkPixelsColor = function (frame, pixels, color) {
    pixels.forEach(function (pixel) {
      var pixelColor = frame.getPixel(pixel[0], pixel[1]);
      expect(pixelColor).toBe(color);
    });
  };

  it ("converts an image to a frame", function () {
    var B = black, T = transparent;
    var frame1 = pskl.model.Frame.fromPixelGrid([
      [B, T],
      [T, B]
    ]);

    var image = pskl.utils.FrameUtils.toImage(frame1);
    expect(image.width).toBe(2);
    expect(image.height).toBe(2);

    var biggerImage = pskl.utils.FrameUtils.toImage(frame1, 3);
    expect(biggerImage.width).toBe(6);
    expect(biggerImage.height).toBe(6);

    var biggerFrame = pskl.utils.FrameUtils.createFromImage(biggerImage);

    frameEqualsGrid(biggerFrame, [
      [B, B, B, T, T, T],
      [B, B, B, T, T, T],
      [B, B, B, T, T, T],
      [T, T, T, B, B, B],
      [T, T, T, B, B, B],
      [T, T, T, B, B, B]
    ]);
  });

  it ("[LayerUtils] creates frames from a simple spritesheet", function () {
    var B = black, R = red;

    // original image in 4x2
    var frame = pskl.model.Frame.fromPixelGrid(toFrameGrid([
      [B, R, B, R],
      [R, B, B, R]
    ]));

    var spritesheet = pskl.utils.FrameUtils.toImage(frame);

    // split the spritesheet by 4
    var frames = pskl.utils.LayerUtils.createFramesFromSpritesheet(spritesheet, 4);

    // expect 4 frames of 1x2
    expect(frames.length).toBe(4);

    // verify frame content
    frameEqualsGrid(frames[0], [
      [B],
      [R]
    ]);
    frameEqualsGrid(frames[1], [
      [R],
      [B]
    ]);
    frameEqualsGrid(frames[2], [
      [B],
      [B]
    ]);
    frameEqualsGrid(frames[3], [
      [R],
      [R]
    ]);
  });

  it ("supports null values in frame array", function () {
    var B = black, T = transparent;
    var frame = pskl.model.Frame.fromPixelGrid([
      [B, null],
      [null, B]
    ]);

    var image = pskl.utils.FrameUtils.toImage(frame);

    // transform back to frame for ease of testing
    var testFrame = pskl.utils.FrameUtils.createFromImage(image);
    frameEqualsGrid(testFrame, [
      [B, T],
      [T, B]
    ]);
  });
});