// 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.

class ConstListTest {

  static testMain() {
    List fixedList = new List.fixedLength(4);
    List fixedList2 = new List.fixedLength(4);
    List growableList = new List();
    List growableList2 = new List();
    for (int i = 0; i < 4; i++) {
      fixedList[i] = i;
      fixedList2[i] = i;
      growableList.add(i);
      growableList2.add(i);
    }
    Expect.equals(true, growableList == growableList);
    Expect.equals(false, growableList == growableList2);
    Expect.equals(true, fixedList == fixedList);
    Expect.equals(false, fixedList == fixedList2);
    Expect.equals(false, fixedList == growableList);
    growableList.add(4);
    Expect.equals(false, fixedList == growableList);
    Expect.equals(4, growableList.removeLast());
    Expect.equals(false, fixedList == growableList);
    fixedList[3] = 0;
    Expect.equals(false, fixedList == growableList);
    var a = [1, 2, 3.1];
    var b = [1, 2, 3.1];
    Expect.equals(false, a == b);
    a = const [1, 2, 3.1];
    b = const [1, 2, 3.1];
    Expect.equals(true, a == b);
  }
}

main() {
  ConstListTest.testMain();
}
