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

// @dart = 2.9

import "package:expect/expect.dart";

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.identical(joke, canonicalJoke);
    Expect.identical(joke[0], joke[1]);
    Expect.identical(joke[0], canonicalJoke[0]);

    // Lists from literals are immutable.
    Expect.throwsUnsupportedError(() => joke[0] = "sock");
    Expect.identical(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.identical(joke[1], lame_joke[1]);
    // Operator new creates a mutable list.
    Expect.equals(false, identical(joke, lame_joke));
    lame_joke[1] = "who";
    Expect.identical("who", lame_joke[1]);

    // Elements of canonical lists are canonicalized.
    List<List<int>> a = const <List<int>>[
      const [1, 2],
      const [1, 2]
    ];
    Expect.identical(a[0], a[1]);
    Expect.identical(a[0][0], a[1][0]);
    Expect.throwsUnsupportedError(() => a[0][0] = 42);

    List<List<double>> b = const [
      const [1.0, 2.0],
      const [1.0, 2.0]
    ];
    Expect.identical(b[0], b[1]);
    Expect.equals(true, b[0][0] == 1.0);
    Expect.identical(b[0][0], b[1][0]);
    Expect.throwsUnsupportedError(() => b[0][0] = 42.0);
  }
}

main() {
  ListLiteral3Test.testMain();
}
