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

// @dart = 2.9

@JS()
library array_test;

import 'package:expect/expect.dart';
import 'package:js/js.dart';
import 'package:js/js_util.dart' as js;

main() {
  testArrayConstructor();
}

/// Test that we can access .constructor() on a JS Array instance, regardless
/// of the reified generic type.
///
/// Regression test for https://github.com/dart-lang/sdk/issues/36372
testArrayConstructor() {
  var list = <int>[1, 2, 3];
  testArray = list;

  // Call the consturctor with `new`.
  var array = js.callConstructor(js.getProperty(testArray, 'constructor'), []);
  var list2 = array as List;
  Expect.listEquals(list2, []);
  Expect.notEquals(list, list2, '$list2 should be a new list');

  // We could return a reified type here, but currently does not to match
  // dart2js, and because the Array is being returned to JS.
  Expect.isFalse(list2 is List<int>,
      '$list2 should not have a reified generic type (it was allocated by JS)');

  list2.addAll([1, 2, 3]);
  Expect.listEquals(list, list2);
}

external Object get testArray;
external set testArray(value);
