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

library list_unmodifiable_cast_test;

import "package:expect/expect.dart";
import 'dart:collection';

void main() {
  test(const [37]);
  test(new UnmodifiableListView([37]));

  test(new UnmodifiableListView<num>(<num>[37]));
  test(new UnmodifiableListView<num>(<int>[37]));

  test(new UnmodifiableListView<num>(<num>[37]).cast<int>());
  test(new UnmodifiableListView<num>(<int>[37]).cast<int>());
  test(new UnmodifiableListView<Object>(<num>[37]).cast<int>());
  test(new UnmodifiableListView<Object>(<int>[37]).cast<num>());

  test(new UnmodifiableListView<num>(<num>[37]).retype<int>());
  test(new UnmodifiableListView<num>(<int>[37]).retype<int>());
  test(new UnmodifiableListView<Object>(<num>[37]).retype<int>());
  test(new UnmodifiableListView<Object>(<int>[37]).retype<num>());

  var m2 = new List<num>.unmodifiable([37]);
  test(m2);
  test(m2.cast<int>());
}

void test(List list) {
  Expect.equals(1, list.length);
  Expect.equals(37, list.first);

  Expect.throws(list.clear);
  Expect.throws(() {
    list.remove(37);
  });
  Expect.throws(() {
    list[0] = 42;
  });
  Expect.throws(() {
    list.addAll(<int>[42]);
  });
}
