// Copyright (c) 2015, 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 = 2.9

import "package:expect/expect.dart";

// Regression test for issue #24839 - http://dartbug.com/24839

const u1 = null;
const int u2 = null;
const List u3 = null;
const u4 = const bool.hasEnvironment("XXXXX")
    ? const String.fromEnvironment("XXXXX")
    : null;
const u5 = const bool.hasEnvironment("XXXXX")
    ? const int.fromEnvironment("XXXXX")
    : null;
const u6 = bool.hasEnvironment("XXXXX")
    ? const bool.fromEnvironment("XXXXX")
    : null;
const n1 = 42;
const n2 = 3.1415;
const int n3 = 37;
const double n4 = 4.6692;
const num n5 = b3 ? 1 : 2.71828;
const n6 = const int.fromEnvironment("XXXXX", defaultValue: 87);
const s1 = "s1";
const String s2 = "s2";
const String s3 = "$s1$s2";
const s4 = const String.fromEnvironment("XXXXX", defaultValue: "s4");
const b1 = true;
const b2 = false;
const b3 = b1 && (b2 || !b1);
const b4 = const bool.fromEnvironment("XXXXX", defaultValue: true);

// Individually
const su1 = "$u1";
const su2 = "$u2";
const su3 = "$u3";
const su4 = "$u4";
const su5 = "$u5";
const su6 = "$u6";
const sn1 = "$n1";
const sn2 = "$n2";
const sn3 = "$n3";
const sn4 = "$n4";
const sn5 = "$n5";
const sn6 = "$n6";
const ss1 = "$s1";
const ss2 = "$s2";
const ss3 = "$s3";
const ss4 = "$s4";
const sb1 = "$b1";
const sb2 = "$b2";
const sb3 = "$b3";
const sb4 = "$b4";

// Constant variables in interpolation.
const interpolation1 =
    "$u1 $u2 $u3 $u4 $u5 $u6 $n1 $n2 $n3 $n4 $n5 $n6 $s1 $s2 $s3 $s4 $b1 $b2 $b3 $b4";
// Constant expressions in interpolation.
// (Single string, the linebreak to fit this into 80 chars is inside an
// interpolation, which is allowed, even for single-line strings).
const interpolation2 =
    "${u1} ${u2} ${u3} ${u4} ${u5} ${u6} ${n1} ${n2} ${n3} ${n4} ${n5} ${n6} ${
     s1} ${s2} ${s3} ${s4} ${b1} ${b2} ${b3} ${b4}";
// Adjacent string literals are combined.
const interpolation3 = "$u1 $u2 $u3 $u4 $u5 "
    '$u6 $n1 $n2 $n3 $n4 '
    """$n5 $n6 $s1 $s2 $s3 """
    '''$s4 $b1 $b2 $b3 $b4''';
// Nested interpolations.
const interpolation4 = "${"$u1 $u2 $u3 $u4 $u5 " '$u6 $n1 $n2 $n3 $n4'} ${
     """$n5 $n6 $s1 $s2 $s3 """ '''$s4 $b1 $b2 $b3 $b4'''}";

main() {
  Expect.equals(u1.toString(), su1);
  Expect.equals(u2.toString(), su2);
  Expect.equals(u3.toString(), su3);
  Expect.equals(u4.toString(), su4);
  Expect.equals(u5.toString(), su5);
  Expect.equals(u6.toString(), su6);
  Expect.equals(n1.toString(), sn1);
  Expect.equals(n2.toString(), sn2);
  Expect.equals(n3.toString(), sn3);
  Expect.equals(n4.toString(), sn4);
  Expect.equals(n5.toString(), sn5);
  Expect.equals(n6.toString(), sn6);
  Expect.equals(s1.toString(), ss1);
  Expect.equals(s2.toString(), ss2);
  Expect.equals(s3.toString(), ss3);
  Expect.equals(s4.toString(), ss4);
  Expect.equals(b1.toString(), sb1);
  Expect.equals(b2.toString(), sb2);
  Expect.equals(b3.toString(), sb3);
  Expect.equals(b4.toString(), sb4);
  var expect = "null null null null null null 42 3.1415 37 4.6692 2.71828 87 "
      "s1 s2 s1s2 s4 true false false true";
  Expect.equals(expect, interpolation1);
  Expect.equals(expect, interpolation2);
  Expect.equals(expect, interpolation3);
  Expect.equals(expect, interpolation4);
}
