<!DOCTYPE html>
<!--
Copyright (c) 2014 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.
-->
<link rel="import" href="/base/rect.html">
<link rel="import" href="/base/quad.html">
<script>
'use strict';

function assertQuadEquals(a, b, opt_message) {
  var ok = true;
  ok &= a.p1[0] === b.p1[0] && a.p1[1] === b.p1[1];
  ok &= a.p2[0] === b.p2[0] && a.p2[1] === b.p2[1];
  ok &= a.p3[0] === b.p3[0] && a.p3[1] === b.p3[1];
  ok &= a.p4[0] === b.p4[0] && a.p4[1] === b.p4[1];
  if (ok)
    return;
  var message = opt_message || 'Expected "' + a.toString() +
      '", got "' + b.toString() + '"';
  throw new tr.b.unittest.TestError(message);
}

tr.b.unittest.testSuite(function() {
  test('pointInTri', function() {
    var res = tr.b.pointInTriangle2(
        [0.25, 0.25],
        [0, 0],
        [1, 0],
        [0, 1]);
    assert.isTrue(res);
  });

  test('pointNotInTri', function() {
    var res = tr.b.pointInTriangle2(
        [0.75, 0.75],
        [0, 0],
        [1, 0],
        [0, 1]);
    assert.isFalse(res);
  });

  test('pointInside', function() {
    var q = tr.b.Quad.from4Vecs([0, 0],
                                [1, 0],
                                [1, 1],
                                [0, 1]);
    var res = q.pointInside([0.5, 0.5]);
    assert.isTrue(res);
  });

  test('pointNotInQuad', function() {
    var q = tr.b.Quad.from4Vecs([0, 0],
                                [1, 0],
                                [1, 1],
                                [0, 1]);
    var res = q.pointInside([1.5, 0.5]);
    assert.isFalse(res);
  });

  test('isRectangle', function() {
    assert.isTrue(tr.b.Quad.fromXYWH(0, 0, 10, 10).isRectangle());
    assert.isTrue(tr.b.Quad.fromXYWH(-10, -10, 5, 5).isRectangle());
    assert.isTrue(tr.b.Quad.fromXYWH(-10, -10, 20, 20).isRectangle());
    assert.isTrue(tr.b.Quad.fromXYWH(-10, 10, 5, 5).isRectangle());

    assert.isFalse(tr.b.Quad.fromXYWH(0, 0, -10, -10).isRectangle());
    assert.isFalse(
        tr.b.Quad.from8Array([0, 1, 2, 3, 4, 5, 6, 7]).isRectangle());
    assert.isFalse(
        tr.b.Quad.from8Array([0, 0, 0, 5, 5, 5, 0, 0]).isRectangle());
  });

  test('projectUnitRect', function() {
    var container = tr.b.Quad.fromXYWH(0, 0, 10, 10);
    var srcRect = tr.b.Rect.fromXYWH(0.1, 0.8, 0.8, 0.1);
    var expectedRect = srcRect.scale(10);

    var q = new tr.b.Quad();
    container.projectUnitRectFast(q, srcRect);

    assertQuadEquals(tr.b.Quad.fromRect(expectedRect), q);
  });

  test('projectUnitRectOntoUnitQuad', function() {
    var container = tr.b.Quad.fromXYWH(0, 0, 1, 1);
    var srcRect = tr.b.Rect.fromXYWH(0.0, 0, 1, 1);
    var expectedRect = srcRect;

    var q = new tr.b.Quad();
    container.projectUnitRectFast(q, srcRect);

    assertQuadEquals(tr.b.Quad.fromRect(expectedRect), q);
  });

  test('projectUnitRectOntoSizeTwoQuad', function() {
    var container = tr.b.Quad.fromXYWH(0, 0, 2, 2);
    var srcRect = tr.b.Rect.fromXYWH(0.0, 0, 1, 1);
    var expectedRect = srcRect.scale(2);

    var q = new tr.b.Quad();
    container.projectUnitRectFast(q, srcRect);

    assertQuadEquals(tr.b.Quad.fromRect(expectedRect), q);
  });

  test('projectUnitRectOntoTranslatedQuad', function() {
    var container = tr.b.Quad.fromXYWH(1, 1, 1, 1);
    var srcRect = tr.b.Rect.fromXYWH(0.0, 0, 1, 1);
    var expectedRect = srcRect.translate([1, 1]);

    var q = new tr.b.Quad();
    container.projectUnitRectFast(q, srcRect);

    assertQuadEquals(tr.b.Quad.fromRect(expectedRect), q);
  });

  test('projectShrunkUnitRectOntoUnitQuad', function() {
    var container = tr.b.Quad.fromXYWH(0, 0, 1, 1);
    var srcRect = tr.b.Rect.fromXYWH(0.1, 0.1, 0.8, 0.8);
    var expectedRect = srcRect;

    var q = new tr.b.Quad();
    container.projectUnitRectFast(q, srcRect);

    assertQuadEquals(tr.b.Quad.fromRect(expectedRect), q);
  });
});
</script>
