// Copyright (c) 2013, 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.

// Tests typed-data buffer classes.

import "dart:typed_data";

import "package:test/test.dart";
import "package:typed_data/typed_buffers.dart";

main() {
  testUint(8, (l) => new Uint8Buffer(l));
  testInt(8, (l) => new Int8Buffer(l));
  test("Uint8ClampedBuffer", () {
    testIntBuffer(8, 0, 255, (l) => new Uint8ClampedBuffer(l), clampUint8);
  });
  testUint(16, (l) => new Uint16Buffer(l));
  testInt(16, (l) => new Int16Buffer(l));
  testUint(32, (l) => new Uint32Buffer(l));  /// 01: ok
  testInt(32, (l) => new Int32Buffer(l));
  testUint(64, (l) => new Uint64Buffer(l),   /// 01: continued
      // JS doesn't support 64-bit ints, so only test this on the VM.
      testOn: "dart-vm");
  testInt(64, (l) => new Int64Buffer(l),    /// 01: continued
      // JS doesn't support 64-bit ints, so only test this on the VM.
      testOn: "dart-vm");

  testInt32x4Buffer(intSamples);

  List roundedFloatSamples = floatSamples.map(roundToFloat).toList();
  testFloatBuffer(32, roundedFloatSamples,
                  () => new Float32Buffer(),
                  roundToFloat);
  testFloatBuffer(64, doubleSamples, () => new Float64Buffer(), (x) => x);

  testFloat32x4Buffer(roundedFloatSamples);

  group("addAll", () {
    for (var type in ['a list', 'an iterable']) {
      group("with $type", () {
        var source;
        var buffer;
        setUp(() {
          source = [1, 2, 3, 4, 5];
          if (type == 'an iterable') source = source.reversed.toList().reversed;
          buffer = new Uint8Buffer();
        });

        test("adds values to the buffer", () {
          buffer.addAll(source, 1, 4);
          expect(buffer, equals([2, 3, 4]));

          buffer.addAll(source, 4);
          expect(buffer, equals([2, 3, 4, 5]));

          buffer.addAll(source, 0, 1);
          expect(buffer, equals([2, 3, 4, 5, 1]));
        });

        test("does nothing for empty slices", () {
          buffer.addAll([6, 7, 8, 9, 10]);

          buffer.addAll(source, 0, 0);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.addAll(source, 3, 3);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.addAll(source, 5);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.addAll(source, 5, 5);
          expect(buffer, equals([6, 7, 8, 9, 10]));
        });

        test("throws errors for invalid start and end", () {
          expect(() => buffer.addAll(source, -1), throwsRangeError);
          expect(() => buffer.addAll(source, -1, 2), throwsRangeError);
          expect(() => buffer.addAll(source, 10), throwsStateError);
          expect(() => buffer.addAll(source, 10, 11), throwsStateError);
          expect(() => buffer.addAll(source, 3, 2), throwsRangeError);
          expect(() => buffer.addAll(source, 3, 10), throwsStateError);
          expect(() => buffer.addAll(source, 3, -1), throwsRangeError);
        });
      });
    }
  });

  group("insertAll", () {
    for (var type in ['a list', 'an iterable']) {
      group("with $type", () {
        var source;
        var buffer;
        setUp(() {
          source = [1, 2, 3, 4, 5];
          if (type == 'an iterable') source = source.reversed.toList().reversed;
          buffer = new Uint8Buffer()..addAll([6, 7, 8, 9, 10]);
        });

        test("inserts values into the buffer", () {
          buffer.insertAll(0, source, 1, 4);
          expect(buffer, equals([2, 3, 4, 6, 7, 8, 9, 10]));

          buffer.insertAll(3, source, 4);
          expect(buffer, equals([2, 3, 4, 5, 6, 7, 8, 9, 10]));

          buffer.insertAll(5, source, 0, 1);
          expect(buffer, equals([2, 3, 4, 5, 6, 1, 7, 8, 9, 10]));
        });

        // Regression test for #1.
        test("inserts values into the buffer after removeRange()", () {
          buffer.removeRange(1, 4);
          buffer.insertAll(1, source);
          expect(buffer, equals([6, 1, 2, 3, 4, 5, 10]));
        });

        test("does nothing for empty slices", () {
          buffer.insertAll(1, source, 0, 0);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.insertAll(2, source, 3, 3);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.insertAll(3, source, 5);
          expect(buffer, equals([6, 7, 8, 9, 10]));

          buffer.insertAll(4, source, 5, 5);
          expect(buffer, equals([6, 7, 8, 9, 10]));
        });

        test("throws errors for invalid start and end", () {
          expect(() => buffer.insertAll(-1, source), throwsRangeError);
          expect(() => buffer.insertAll(6, source), throwsRangeError);
          expect(() => buffer.insertAll(1, source, -1), throwsRangeError);
          expect(() => buffer.insertAll(2, source, -1, 2), throwsRangeError);
          expect(() => buffer.insertAll(3, source, 10), throwsStateError);
          expect(() => buffer.insertAll(4, source, 10, 11), throwsStateError);
          expect(() => buffer.insertAll(5, source, 3, 2), throwsRangeError);
          expect(() => buffer.insertAll(1, source, 3, 10), throwsStateError);
          expect(() => buffer.insertAll(2, source, 3, -1), throwsRangeError);
        });
      });
    }
  });
}

double roundToFloat(double value) {
  return (new Float32List(1)..[0] = value)[0];
}

typedef int Rounder(int value);

Rounder roundUint(bits) {
  int halfbits = (1 << (bits ~/ 2)) - 1;
  int mask = halfbits | (halfbits << (bits ~/ 2));
  return (int x) => x & mask;
}

Rounder roundInt(bits) {
  int highBit = 1 << (bits - 1);
  int mask = highBit - 1;
  return (int x) => (x & mask) - (x & highBit);
}

int clampUint8(x) => x < 0 ? 0 : x > 255 ? 255 : x;

void testUint(int bits, var buffer, {String testOn}) {
  int min = 0;
  Function round = roundUint(bits);
  int max = round(-1);
  test("Uint${bits}Buffer", () {
    testIntBuffer(bits, min, max, buffer, round);
  }, testOn: testOn);
}

void testInt(int bits, var buffer, {String testOn}) {
  int min = -(1 << (bits - 1));
  int max = -(min + 1);
  test("Int${bits}Buffer", () {
    testIntBuffer(bits, min, max, buffer, roundInt(bits));
  }, testOn: testOn);
}

const List<int> intSamples = const [
  0x10000000000000001,
  0x10000000000000000,  // 2^64
  0x0ffffffffffffffff,
  0xaaaaaaaaaaaaaaaa,
  0x8000000000000001,
  0x8000000000000000,   // 2^63
  0x7fffffffffffffff,
  0x5555555555555555,
  0x100000001,
  0x100000000,  // 2^32
  0x0ffffffff,
  0xaaaaaaaa,
  0x80000001,
  0x80000000,   // 2^31
  0x7fffffff,
  0x55555555,
  0x10001,
  0x10000,      // 2^16
  0x0ffff,
  0xaaaa,
  0x8001,
  0x8000,       // 2^15
  0x7fff,
  0x5555,
  0x101,
  0x100,        // 2^8
  0x0ff,
  0xaa,
  0x81,
  0x80,         // 2^7
  0x7f,
  0x55,
  0x02,
  0x01,
  0x00
];

// Takes bit-size, min value, max value, function to create a buffer, and
// the rounding that is applied when storing values outside the valid range
// into the buffer.
void testIntBuffer(int bits, int min, int max,
                   create(int length),
                   int round(int)) {
  assert(round(min) == min);
  assert(round(max) == max);
  // All int buffers default to the value 0.
  var buffer = create(0);
  List<int> list = buffer;  // Check the type.
  expect(buffer.length, equals(0));
  var bytes = bits ~/ 8;

  expect(buffer.elementSizeInBytes, equals(bytes));
  expect(buffer.lengthInBytes, equals(0));
  expect(buffer.offsetInBytes, equals(0));

  buffer.add(min);
  expect(buffer.length, equals(1));
  expect(buffer[0], equals(min));

  expect(buffer.elementSizeInBytes, equals(bytes));
  expect(buffer.lengthInBytes, equals(bytes));
  expect(buffer.offsetInBytes, equals(0));

  buffer.length = 0;
  expect(buffer.length, equals(0));

  List samples = intSamples.toList()..addAll(intSamples.map((x) => -x));
  for (int value in samples) {
    int length = buffer.length;
    buffer.add(value);
    expect(buffer.length, equals(length + 1));
    expect(buffer[length], equals(round(value)));
  }
  buffer.addAll(samples);  // Add all the values at once.
  for (int i = 0; i < samples.length; i++) {
    expect(buffer[samples.length + i], equals(buffer[i]));
  }

  // Remove range works and changes length.
  buffer.removeRange(samples.length, buffer.length);
  expect(buffer.length, equals(samples.length));

  // Both values are in `samples`, but equality is performed without rounding.
  expect(buffer.contains(min - 1), isFalse);
  expect(buffer.contains(max + 1), isFalse);
  expect(buffer.contains(round(min - 1)), isTrue);
  expect(buffer.contains(round(max + 1)), isTrue);

  // Accessing the underlying buffer works.
  buffer.length = 2;
  buffer[0] = min;
  buffer[1] = max;
  var byteBuffer = new Uint8List.view(buffer.buffer);
  int byteSize = buffer.elementSizeInBytes;
  for (int i = 0; i < byteSize; i++) {
    int tmp = byteBuffer[i];
    byteBuffer[i] = byteBuffer[byteSize + i];
    byteBuffer[byteSize + i] = tmp;
  }
  expect(buffer[0], equals(max));
  expect(buffer[1], equals(min));
}

const List doubleSamples = const [
  0.0,
  5e-324,                    // Minimal denormal value.
  2.225073858507201e-308,    // Maximal denormal value.
  2.2250738585072014e-308,   // Minimal normal value.
  0.9999999999999999,        // Maximum value < 1.
  1.0,
  1.0000000000000002,        // Minimum value > 1.
  4294967295.0,              // 2^32 -1.
  4294967296.0,              // 2^32.
  4503599627370495.5,        // Maximal fractional value.
  9007199254740992.0,        // Maximal exact value (adding one gets lost).
  1.7976931348623157e+308,   // Maximal value.
  1.0/0.0,                   // Infinity.
  0.0/0.0,                   // NaN.
  0.49999999999999994,       // Round-traps 1-3 (adding 0.5 and rounding towards
  4503599627370497.0,        // minus infinity will not be the same as rounding
  9007199254740991.0         // to nearest with 0.5 rounding up).
];

const List floatSamples = const [
  0.0,
  1.4e-45,          // Minimal denormal value.
  1.1754942E-38,    // Maximal denormal value.
  1.17549435E-38,   // Minimal normal value.
  0.99999994,       // Maximal value < 1.
  1.0,
  1.0000001,        // Minimal value > 1.
  8388607.5,        // Maximal fractional value.
  16777216.0,       // Maximal exact value.
  3.4028235e+38,    // Maximal value.
  1.0/0.0,          // Infinity.
  0.0/0.0,          // NaN.
  0.99999994,       // Round traps 1-3.
  8388609.0,
  16777215.0
];

void doubleEqual(x, y) {
  if (y.isNaN) {
    expect(x.isNaN, isTrue);
  } else {
    if (x != y) {
    }
    expect(x, equals(y));
  }
}

testFloatBuffer(int bitSize, List samples, create(), double round(double v)) {
  test("Float${bitSize}Buffer", () {
    var buffer = create();
    List<double> list = buffer;  // Test type.
    int byteSize = bitSize ~/ 8;

    expect(buffer.length, equals(0));
    buffer.add(0.0);
    expect(buffer.length, equals(1));
    expect(buffer.removeLast(), equals(0.0));
    expect(buffer.length, equals(0));

    for (double value in samples) {
      buffer.add(value);
      doubleEqual(buffer[buffer.length - 1], round(value));
    }
    expect(buffer.length, equals(samples.length));

    buffer.addAll(samples);
    expect(buffer.length, equals(samples.length * 2));
    for (int i = 0; i < samples.length; i++) {
      doubleEqual(buffer[i], buffer[samples.length + i]);
    }

    buffer.removeRange(samples.length, buffer.length);
    expect(buffer.length, equals(samples.length));

    buffer.insertAll(0, samples);
    expect(buffer.length, equals(samples.length * 2));
    for (int i = 0; i < samples.length; i++) {
      doubleEqual(buffer[i], buffer[samples.length + i]);
    }

    buffer.length = samples.length;
    expect(buffer.length, equals(samples.length));

    // TypedData.
    expect(buffer.elementSizeInBytes, equals(byteSize));
    expect(buffer.lengthInBytes, equals(byteSize * buffer.length));
    expect(buffer.offsetInBytes, equals(0));

    // Accessing the buffer works.
    // Accessing the underlying buffer works.
    buffer.length = 2;
    buffer[0] = samples[0];
    buffer[1] = samples[1];
    var bytes = new Uint8List.view(buffer.buffer);
    for (int i = 0; i < byteSize; i++) {
      int tmp = bytes[i];
      bytes[i] = bytes[byteSize + i];
      bytes[byteSize + i] = tmp;
    }
    doubleEqual(buffer[0], round(samples[1]));
    doubleEqual(buffer[1], round(samples[0]));
  });
}

testFloat32x4Buffer(List floatSamples) {
  List float4Samples = [];
  for (int i = 0; i < floatSamples.length - 3; i++) {
    float4Samples.add(new Float32x4(floatSamples[i],
                                    floatSamples[i + 1],
                                    floatSamples[i + 2],
                                    floatSamples[i + 3]));
  }

  void floatEquals(x, y) {
    if (y.isNaN) {
      expect(x.isNaN, isTrue);
    } else {
      expect(x, equals(y));
    }
  }

  void x4Equals(Float32x4 x, Float32x4 y) {
    floatEquals(x.x, y.x);
    floatEquals(x.y, y.y);
    floatEquals(x.z, y.z);
    floatEquals(x.w, y.w);
  }

  test("Float32x4Buffer", () {
    var buffer = new Float32x4Buffer(5);
    List<Float32x4> list = buffer;

    expect(buffer.length, equals(5));
    expect(buffer.elementSizeInBytes, equals(128 ~/ 8));
    expect(buffer.lengthInBytes, equals(5 * 128 ~/ 8));
    expect(buffer.offsetInBytes, equals(0));

    x4Equals(buffer[0], new Float32x4.zero());
    buffer.length = 0;
    expect(buffer.length, equals(0));

    for (var sample in float4Samples) {
      buffer.add(sample);
      x4Equals(buffer[buffer.length - 1], sample);
    }
    expect(buffer.length, equals(float4Samples.length));

    buffer.addAll(float4Samples);
    expect(buffer.length, equals(float4Samples.length * 2));
    for (int i = 0; i < float4Samples.length; i++) {
      x4Equals(buffer[i], buffer[float4Samples.length + i]);
    }

    buffer.removeRange(4, 4 + float4Samples.length);
    for (int i = 0; i < float4Samples.length; i++) {
      x4Equals(buffer[i], float4Samples[i]);
    }

    // Test underlying buffer.
    buffer.length = 1;
    buffer[0] = float4Samples[0];  // Does not contain NaN.

    Float32List floats = new Float32List.view(buffer.buffer);
    expect(floats[0], equals(buffer[0].x));
    expect(floats[1], equals(buffer[0].y));
    expect(floats[2], equals(buffer[0].z));
    expect(floats[3], equals(buffer[0].w));
  });
}

void testInt32x4Buffer(intSamples) {
  test("Int32x4Buffer", () {
    Function round = roundInt(32);
    int bits = 128;
    int bytes = 128 ~/ 8;
    Matcher equals32x4(Int32x4 expected) => new MatchesInt32x4(expected);

    var buffer = new Int32x4Buffer(0);
    List<Int32x4> list = buffer;     // It's a List.
    expect(buffer.length, equals(0));

    expect(buffer.elementSizeInBytes, equals(bytes));
    expect(buffer.lengthInBytes, equals(0));
    expect(buffer.offsetInBytes, equals(0));

    Int32x4 sample = new Int32x4(-0x80000000, -1, 0, 0x7fffffff);
    buffer.add(sample);
    expect(buffer.length, equals(1));
    expect(buffer[0], equals32x4(sample));

    expect(buffer.elementSizeInBytes, equals(bytes));
    expect(buffer.lengthInBytes, equals(bytes));
    expect(buffer.offsetInBytes, equals(0));

    buffer.length = 0;
    expect(buffer.length, equals(0));

    var samples = intSamples
        .where((value) => value == round(value))   // Issue 15130
        .map((value) => new Int32x4(value, -value, ~value, ~-value))
        .toList();
    for (Int32x4 value in samples) {
      int length = buffer.length;
      buffer.add(value);
      expect(buffer.length, equals(length + 1));
      expect(buffer[length], equals32x4(value));
    }

    buffer.addAll(samples);  // Add all the values at once.
    for (int i = 0; i < samples.length; i++) {
      expect(buffer[samples.length + i], equals32x4(buffer[i]));
    }

    // Remove range works and changes length.
    buffer.removeRange(samples.length, buffer.length);
    expect(buffer.length, equals(samples.length));

    // Accessing the underlying buffer works.
    buffer.length = 2;
    buffer[0] = new Int32x4(-80000000, 0x7fffffff, 0, -1);
    var byteBuffer = new Uint8List.view(buffer.buffer);
    int halfBytes = bytes ~/ 2;
    for (int i = 0; i < halfBytes; i++) {
      int tmp = byteBuffer[i];
      byteBuffer[i] = byteBuffer[halfBytes + i];
      byteBuffer[halfBytes + i] = tmp;
    }
    var result = new Int32x4(0, -1, -80000000, 0x7fffffff);
    expect(buffer[0], equals32x4(result));
  });
}

class MatchesInt32x4 extends Matcher {
  Int32x4 result;
  MatchesInt32x4(this.result);
  bool matches(item, Map matchState) {
    if (item is! Int32x4) return false;
    Int32x4 value = item;
    return result.x == value.x && result.y == value.y &&
           result.z == value.z && result.w == value.w;
  }

  Description describe(Description description) =>
      description.add('Int32x4.==');
}
