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

import 'dart:html';
import 'dart:typed_data';

import 'package:expect/minitest.dart';

main() {
  var isList = predicate((x) => x is List, 'is a List');
  var isNumList = predicate((x) => x is List<num>, 'is a List<num>');
  var isNotStringList =
      predicate((x) => x is! List<String>, 'is not a List<String>');
  var expectation = Platform.supportsTypedData ? returnsNormally : throws;

  group('supported', () {
    test('supported', () {
      expect(Platform.supportsTypedData, true);
    });
  });

  group('arrays', () {
    test('createByLengthTest', () {
      expect(() {
        var a = new Float32List(10);
        expect(a.length, 10);
        expect(a.lengthInBytes, 40);
        expect(a[4], 0);
      }, expectation);
    });

    test('aliasTest', () {
      expect(() {
        var a1 = new Uint8List.fromList([0, 0, 1, 0x45]);
        var a2 = new Float32List.view(a1.buffer);

        expect(a1.lengthInBytes, a2.lengthInBytes);

        expect(a2.length, 1);

        // 0x45010000 = 2048+16
        expect(a2[0], 2048 + 16);

        a1[2] = 0;
        // 0x45000000 = 2048
        expect(a2[0], 2048);

        a1[3]--;
        a1[2] += 128;
        // 0x44800000 = 1024
        expect(a2[0], 1024);
      }, expectation);
    });

    // Generic type checking is not available in dart2js, so use this check to
    // see if we should check for it.
    var supportsTypeTest = !(new List<String>() is List<int>);

    if (supportsTypeTest) {
      test('typeTests', () {
        expect(() {
          var a = new Float32List(10);
          expect(a, isList);
          expect(a, isNumList);
          expect(a, isNotStringList);
        }, expectation);
      });
    }
  });
}
