// 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.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

// @dart = 2.9

// Library tag to be able to run in html test framework.
library typed_data_hierarchy_test;

import 'dart:typed_data';
import 'package:expect/expect.dart';

var inscrutable = null;

void testClampedList() {
  // Force lookup of Uint8List first.
  Expect.isTrue(inscrutable(new Uint8List(1)) is Uint8List);

  Expect.isFalse(
      new Uint8ClampedList(1) is Uint8List,
      'Uint8ClampedList should not be a subtype of Uint8List '
      'in optimizable test');
  Expect.isFalse(inscrutable(new Uint8ClampedList(1)) is Uint8List,
      'Uint8ClampedList should not be a subtype of Uint8List in dynamic test');
}

void implementsTypedData() {
  Expect.isTrue(inscrutable(new ByteData(1)) is TypedData);
  Expect.isTrue(inscrutable(new Float32List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Float32x4List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Float64List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Int8List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Int16List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Int32List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Uint8List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Uint8ClampedList(1)) is TypedData);
  Expect.isTrue(inscrutable(new Uint16List(1)) is TypedData);
  Expect.isTrue(inscrutable(new Uint32List(1)) is TypedData);
}

void implementsList() {
  Expect.isTrue(inscrutable(new Float32List(1)) is List<double>);
  Expect.isTrue(inscrutable(new Float32x4List(1)) is List<Float32x4>);
  Expect.isTrue(inscrutable(new Float64List(1)) is List<double>);
  Expect.isTrue(inscrutable(new Int8List(1)) is List<int>);
  Expect.isTrue(inscrutable(new Int16List(1)) is List<int>);
  Expect.isTrue(inscrutable(new Int32List(1)) is List<int>);
  Expect.isTrue(inscrutable(new Uint8List(1)) is List<int>);
  Expect.isTrue(inscrutable(new Uint8ClampedList(1)) is List<int>);
  Expect.isTrue(inscrutable(new Uint16List(1)) is List<int>);
  Expect.isTrue(inscrutable(new Uint32List(1)) is List<int>);
}

main() {
  inscrutable = (x) => x;

  // Note: this test must come first to control order of lookup on Uint8List and
  // Uint8ClampedList.
  testClampedList();

  implementsTypedData();
  implementsList();
}
