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

import "package:expect/expect.dart";

class ConstListTest {

  static testMain() {
    List fixedList = new List(4);
    List fixedList2 = new List(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();
}
