// 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.
// Dart test program testing string interpolation of expressions.

// @dart = 2.9

import "package:expect/expect.dart";

class StringInterpolate2Test {
  static var F1;

  static void testMain() {
    F1 = "1 + 5 = ${1+5}";

    Expect.equals("1 + 5 = 6", F1);

    var fib = [1, 1, 2, 3, 5, 8, 13, 21];

    var i = 5;
    var s = "${i}";
    Expect.equals("5", s);

    s = "fib(${i}) = ${fib[i]}";
    Expect.equals("fib(5) = 8", s);

    i = 5;
    s = "$i squared is ${((x) => x*x)(i)}";
    Expect.equals("5 squared is 25", s);

    Expect.equals("8", "${fib.length}");
    // test single quote
    Expect.equals("8", '${fib.length}');
    // test multi-line
    Expect.equals(
        "8",
        '${fib.
    length}');

    var map = {"red": 1, "green": 2, "blue": 3};
    s = "green has value ${map["green"]}";
    Expect.equals("green has value 2", s);

    i = 0;
    b() => "${++i}";
    s = "aaa ${"bbb ${b()} bbb"} aaa ${b()}";
    Expect.equals("aaa bbb 1 bbb aaa 2", s);

    // test multiple levels of nesting, including changing quotes and
    // multiline string types
    s = "a ${(){ return 'b ${(){ return """
c""";}()}'; }()} d";
    Expect.equals("a b c d", s);
  }
}

main() {
  StringInterpolate2Test.testMain();
}
