// Copyright (c) 2015, Google Inc. 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.

import 'package:test/test.dart';

import 'package:vector_math/vector_math.dart';

import 'test_utils.dart';

void testQuadCopyNormalInto() {
  final quad = Quad.points(Vector3(1.0, 0.0, 1.0), Vector3(0.0, 2.0, 1.0),
      Vector3(1.0, 0.0, 0.0), Vector3(0.0, 2.0, 0.0));
  final normal = Vector3.zero();

  quad.copyNormalInto(normal);

  relativeTest(normal, Vector3(-0.8944271802902222, -0.4472135901451111, 0.0));
}

void testQuadCopyTriangles() {
  final quad = Quad.points(Vector3(1.0, 0.0, 1.0), Vector3(0.0, 2.0, 1.0),
      Vector3(1.0, 0.0, 0.0), Vector3(0.0, 2.0, 0.0));
  final t1 = Triangle();
  final t2 = Triangle();
  final normal = Vector3.zero();
  final t1Normal = Vector3.zero();
  final t2Normal = Vector3.zero();

  quad.copyNormalInto(normal);

  quad.copyTriangles(t1, t2);
  t1.copyNormalInto(t1Normal);
  t2.copyNormalInto(t2Normal);

  relativeTest(t1Normal, normal);
  relativeTest(t2Normal, normal);
}

void main() {
  group('Quad', () {
    test('CopyNormalInto', testQuadCopyNormalInto);
    test('CopyTriangles', testQuadCopyTriangles);
  });
}
