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

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);
}
