// 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.

library vector_math.test.test_utils;

import 'package:test/test.dart';

import 'package:vector_math/vector_math.dart';

Vector2 $v2(double x, double y) => Vector2(x, y);

Vector3 $v3(double x, double y, double z) => Vector3(x, y, z);

Vector4 $v4(double x, double y, double z, double w) => Vector4(x, y, z, w);

void relativeTest(dynamic output, dynamic expectedOutput) {
  final num errorThreshold = 0.0005;
  final num error = relativeError(output, expectedOutput).abs();
  expect(error >= errorThreshold, isFalse,
      reason: '$output != $expectedOutput : relativeError = $error');
}

void absoluteTest(dynamic output, dynamic expectedOutput) {
  final num errorThreshold = 0.0005;
  final num error = absoluteError(output, expectedOutput).abs();
  expect(error >= errorThreshold, isFalse,
      reason: '$output != $expectedOutput : absoluteError = $error');
}

dynamic makeMatrix(int rows, int cols) {
  if (rows != cols) {
    return null;
  }

  if (cols == 2) {
    return Matrix2.zero();
  }
  if (cols == 3) {
    return Matrix3.zero();
  }
  if (cols == 4) {
    return Matrix4.zero();
  }

  return null;
}

T parseMatrix<T>(String input) {
  input = input.trim();
  final rows = input.split('\n');
  final values = <double>[];
  var col_count = 0;
  for (var i = 0; i < rows.length; i++) {
    rows[i] = rows[i].trim();
    final cols = rows[i].split(' ');
    for (var j = 0; j < cols.length; j++) {
      cols[j] = cols[j].trim();
    }

    for (var j = 0; j < cols.length; j++) {
      if (cols[j].isEmpty) {
        continue;
      }
      if (i == 0) {
        col_count++;
      }
      values.add(double.parse(cols[j]));
    }
  }

  final dynamic m = makeMatrix(rows.length, col_count);
  for (var j = 0; j < rows.length; j++) {
    for (var i = 0; i < col_count; i++) {
      m[m.index(j, i)] = values[j * col_count + i];
      //m[i][j] = values[j*col_count+i];
    }
  }

  return m as T;
}

T parseVector<T extends Vector>(String v) {
  v = v.trim();
  final Pattern pattern =
      RegExp('[\\s]+', multiLine: true, caseSensitive: false);
  final rows = v.split(pattern);
  final values = <double>[];
  for (var i = 0; i < rows.length; i++) {
    rows[i] = rows[i].trim();
    if (rows[i].isEmpty) {
      continue;
    }
    values.add(double.parse(rows[i]));
  }

  Vector r;
  if (values.length == 2) {
    r = Vector2(values[0], values[1]);
  } else if (values.length == 3) {
    r = Vector3(values[0], values[1], values[2]);
  } else if (values.length == 4) {
    r = Vector4(values[0], values[1], values[2], values[3]);
  }

  return r as T;
}
