blob: e82d3ac0a5330957f80867da31486b4ced1f8ec4 [file] [log] [blame]
// 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.
// Check that arrays from const array literals are immutable.
class ListLiteral3Test {
static const List<String> canonicalJoke = const ["knock", "knock"];
static testMain() {
List<String> joke = const ["knock", "knock"];
// Elements of canonical lists are canonicalized.
Expect.equals(true, joke === canonicalJoke);
Expect.equals(true, joke[0] === joke[1]);
Expect.equals(true, joke[0] === canonicalJoke[0]);
// Lists from literals are immutable.
bool caughtException = false;
try {
joke[0] = "sock";
} on UnsupportedOperationException catch (e) {
caughtException = true;
}
Expect.equals(true, caughtException);
Expect.equals(true, joke[0] === joke[1]);
// Make sure lists allocated at runtime are mutable and are
// not canonicalized.
List<String> lame_joke = ["knock", "knock"]; // Invokes operator new.
Expect.equals(true, joke[1] === lame_joke[1]);
// Operator new creates a mutable list.
Expect.equals(false, joke === lame_joke);
lame_joke[1] = "who";
Expect.equals(true, "who" === lame_joke[1]);
// Elements of canonical lists are canonicalized.
List<List<int>> a = const <List<int>>[ const [1, 2], const [1, 2]];
Expect.equals(true, a[0] === a[1]);
Expect.equals(true, a[0][0] === a[1][0]);
try {
caughtException = false;
a[0][0] = 42;
} on UnsupportedOperationException catch (e) {
caughtException = true;
}
Expect.equals(true, caughtException);
List<List<double>> b = const [ const [1.0, 2.0], const [1.0, 2.0]];
Expect.equals(true, b[0] === b[1]);
Expect.equals(true, b[0][0] === 1.0);
Expect.equals(true, b[0][0] === b[1][0]);
try {
caughtException = false;
b[0][0] = 42.0;
} on UnsupportedOperationException catch (e) {
caughtException = true;
}
Expect.equals(true, caughtException);
}
}
main() {
ListLiteral3Test.testMain();
}