// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * Casts a map of options as an incoming load request to test CopyParameters.
 *
 * @param {Image} source
 * @param {Object} options
 * @return {!ImageLoaderUtil.CopyParameters} Calculated copy parameters.
 */
function calculateCopyParametersFromOptions(source, options) {
  return ImageLoaderUtil.calculateCopyParameters(
      source, /** @type{!LoadImageRequest} */ (options));
}

/**
 * Test case:
 * - Source image: 200x50
 * - Target: max size is 100x100
 */
function testNormalImage() {
  var source = new Image();
  source.width = 200;
  source.height = 50;
  var options = {
    maxWidth: 100,
    maxHeight: 100,
    orientation: ImageOrientation.fromClockwiseRotation(0)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(0, result.source.x);
  assertEquals(0, result.source.y);
  assertEquals(200, result.source.width);
  assertEquals(50, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(100, result.target.width);
  assertEquals(25, result.target.height);
  assertEquals(100, result.canvas.width);
  assertEquals(25, result.canvas.height);
}

/**
 * Test case:
 * - Source image: 50x200 90 deg clock-wise rotated image.
 * - Target: max size is 100x100
 */
function testRotatedImage() {
  var source = new Image();
  source.width = 50;
  source.height = 200;
  var options = {
    maxWidth: 100,
    maxHeight: 100,
    orientation: ImageOrientation.fromClockwiseRotation(1)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(0, result.source.x);
  assertEquals(0, result.source.y);
  assertEquals(50, result.source.width);
  assertEquals(200, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(25, result.target.width);
  assertEquals(100, result.target.height);
  assertEquals(100, result.canvas.width);
  assertEquals(25, result.canvas.height);
}

/**
 * Test case:
 * - Source image: 800x100
 * - Target: 50x50 cropped image.
 */
function testCroppedImage() {
  var source = new Image();
  source.width = 800;
  source.height = 100;
  var options = {
    width: 50,
    height: 50,
    crop: true,
    orientation: ImageOrientation.fromClockwiseRotation(0)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(350, result.source.x);
  assertEquals(0, result.source.y);
  assertEquals(100, result.source.width);
  assertEquals(100, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(50, result.target.width);
  assertEquals(50, result.target.height);
  assertEquals(50, result.canvas.width);
  assertEquals(50, result.canvas.height);
}

/**
 * Test case:
 * - Source image: 200x25
 * - Target: 50x50 cropped image.
 */
function testCroppedImageWithResize() {
  var source = new Image();
  source.width = 200;
  source.height = 25;
  var options = {
    width: 50,
    height: 50,
    crop: true,
    orientation: ImageOrientation.fromClockwiseRotation(0)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(87, result.source.x);
  assertEquals(0, result.source.y);
  assertEquals(25, result.source.width);
  assertEquals(25, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(50, result.target.width);
  assertEquals(50, result.target.height);
  assertEquals(50, result.canvas.width);
  assertEquals(50, result.canvas.height);
}

/**
 * Test case:
 * - Source image: 20x10
 * - Target: 50x50 cropped image.
 */
function testCroppedTinyImage() {
  var source = new Image();
  source.width = 20;
  source.height = 10;
  var options = {
    width: 50,
    height: 50,
    crop: true,
    orientation: ImageOrientation.fromClockwiseRotation(0)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(5, result.source.x);
  assertEquals(0, result.source.y);
  assertEquals(10, result.source.width);
  assertEquals(10, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(50, result.target.width);
  assertEquals(50, result.target.height);
  assertEquals(50, result.canvas.width);
  assertEquals(50, result.canvas.height);
}

/**
 * Test case:
 * - Source image: 100x400 90 degree clock-wise rotated.
 * - Target: 50x50 cropped image
 */
function testCroppedRotatedImage() {
  var source = new Image();
  source.width = 100;
  source.height = 400;
  var options = {
    width: 50,
    height: 50,
    crop: true,
    orientation: ImageOrientation.fromClockwiseRotation(1)
  };
  var result = calculateCopyParametersFromOptions(source, options);
  assertEquals(0, result.source.x);
  assertEquals(150, result.source.y);
  assertEquals(100, result.source.width);
  assertEquals(100, result.source.height);
  assertEquals(0, result.target.x);
  assertEquals(0, result.target.y);
  assertEquals(50, result.target.width);
  assertEquals(50, result.target.height);
  assertEquals(50, result.canvas.width);
  assertEquals(50, result.canvas.height);
}
