/*
 * Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/** 
 * @description Series of tests to ensure correct results of the winding rule.
 */
import "dart:html";
import "dart:math" as Math;
import "../../testcommon.dart";
import "../../../Utils/async_utils.dart";

main() {
  var tmpimg = document.createElement('canvas');
  tmpimg.width = 200;
  tmpimg.height = 200;
  var ctx = tmpimg.getContext('2d');

  // Create the image for blending test with images.
  var img = document.createElement('canvas');
  img.width = 100;
  img.height = 100;
  var imgCtx = img.getContext('2d');

  pixelDataAtPoint()
  {
    return ctx.getImageData(50, 50, 1, 1).data;
  }

  checkResult(expectedColors, sigma) {
    for (var i = 0; i < 4; i++)
      shouldBeCloseTo(pixelDataAtPoint()[i], expectedColors[i], sigma);
  }

  // Execute test.
  prepareTestScenario() {
    debug('Testing default clip');
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(0, 0, 100, 100);
    ctx.fillStyle = 'rgb(0,255,0)';
    ctx.beginPath();
    ctx.rect(0, 0, 100, 100);
    ctx.rect(25, 25, 50, 50);
    ctx.clip();
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    checkResult([0, 255, 0, 255], 5);                        
    debug('');

    debug('Testing nonzero clip');
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(0, 0, 100, 100);
    ctx.fillStyle = 'rgb(0,255,0)';
    ctx.beginPath();
    ctx.rect(0, 0, 100, 100);
    ctx.rect(25, 25, 50, 50);
    ctx.clip('nonzero');
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    checkResult([0, 255, 0, 255], 5);
    debug('');

    debug('Testing evenodd clip');
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.fillRect(0, 0, 100, 100);
    ctx.fillStyle = 'rgb(0,255,0)';
    ctx.beginPath();
    ctx.rect(0, 0, 100, 100);
    ctx.rect(25, 25, 50, 50);
    ctx.clip('evenodd');
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    checkResult([255, 0, 0, 255], 5);                        
    debug('');

  }

  // Run test and allow variation of results.
  prepareTestScenario();
}

