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

// Test that a final list literal is not expandable nor modifiable.

class ConstListLiteralTest {

  static void testMain() {
    var list = const [4, 2, 3];
    Expect.equals(3, list.length);

    var exception = null;
    try {
      list.add(4);
    } on UnsupportedError catch (e) {
      exception = e;
    }
    Expect.equals(true, exception != null);
    Expect.equals(3, list.length);
    exception = null;

    exception = null;
    try {
      list.addAll([4, 5]);
    } on UnsupportedError catch (e) {
      exception = e;
    }
    Expect.equals(true, exception != null);
    Expect.equals(3, list.length);

    exception = null;
    try {
      list[0] = 0;
    } on UnsupportedError catch (e) {
      exception = e;
    }
    Expect.equals(true, exception != null);
    Expect.equals(3, list.length);

    exception = null;
    try {
      list.sort((a, b) => a < b);
    } on UnsupportedError catch (e) {
      exception = e;
    }
    Expect.equals(true, exception != null);
    Expect.equals(3, list.length);
    Expect.equals(4, list[0]);
    Expect.equals(2, list[1]);
    Expect.equals(3, list[2]);

    exception = null;
    try {
      list.setRange(0, 1, [1], 0);
    } on UnsupportedError catch (e) {
      exception = e;
    }
    Expect.equals(true, exception != null);
    Expect.equals(3, list.length);
    Expect.equals(4, list[0]);
    Expect.equals(2, list[1]);
    Expect.equals(3, list[2]);

    // Note: the next check is a regression test for dart2js. The immutable list
    // overrides the 'length' property of List, but relies on using the native
    // 'forEach' construct in Array. This test ensures that our strategy works
    // correctly.
    int x = 0;
    list.forEach((e) { x += e; });
    Expect.equals(9, x);
  }
}

main() {
  ConstListLiteralTest.testMain();
}
