// Copyright (c) 2014, 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.

// Note: This test relies on LF line endings in the source file.

import "package:expect/expect.dart";
import 'dart:math';

// Test that String interpolation works in the code generated by the leg
// compiler.

bool get inscrutableFalse => new Random().nextDouble() > 2;

inscrutable(x) => inscrutableFalse ? [] : x;

int ifun() => 37;
double dfun() => 2.71828;
bool bfun() => true;
String sfun() => "sfun";
nfun() => null;

void testEscapes() {
  // Test that escaping the '$' prevents string interpolation.
  String x = inscrutable("NOT HERE");
  Expect.equals(r'a${x}', 'a\${x}');
  Expect.equals(r'a$x', 'a\$x');
  Expect.equals(r'a${x}', '''a\${x}''');
  Expect.equals(r'a$x', '''a\$x''');
  Expect.equals(r'a${x}', "a\${x}");
  Expect.equals(r'a$x', "a\$x");
  Expect.equals(r'a${x}', """a\${x}""");
  Expect.equals(r'a$x', """a\$x""");
}

void testMultiLine() {
  var a = inscrutable("string");
  var b = inscrutable(42);
  var c = inscrutable(3.1415);
  var d = inscrutable(false);
  var n = inscrutable(null);

  Expect.equals("string423.1415falsenull!", """$a$b$c$d$n!""");
  Expect.equals("string423.1415falsenull!", '''$a$b$c$d$n!''');
  Expect.equals("string423.1415falsenull!", """${a}${b}${c}${d}${n}!""");
  Expect.equals("string423.1415falsenull!", '''${a}${b}${c}${d}${n}!''');

  // Quotes as literals are included correctly..
  Expect.equals("'42''42'", """'$b''$b'""");
  Expect.equals('"42""42"', '''"$b""$b"''');

  Expect.equals('"42""42" ', """"$b""$b" """);
  Expect.equals("'42''42' ", ''''$b''$b' ''');

  Expect.equals('""42""42" ', """""$b""$b" """);
  Expect.equals("''42''42' ", '''''$b''$b' ''');

  // Newlines at beginning of multiline strings are not included, but only
  // if they are in the source.
  Expect.equals(
      "\n",
      """${''}
""");
  Expect.equals("\n", """${''}""");
  Expect.equals(
      "\n",
      """${''}
""");
  Expect.equals(
      "x",
      """
x""");
  Expect.equals("\n", """${'\n'}""");
  Expect.equals("\r", """${'\r'}""");
  Expect.equals("\r\n", """${'\r\n'}""");
}

void testSimple() {
  var a = inscrutable("string");
  var b = inscrutable(42);
  var c = inscrutable(3.1415);
  var d = inscrutable(false);
  var n = inscrutable(null);

  // Both kinds of quotes and both kinds of $-escapes.
  Expect.equals("string423.1415falsenull!", "$a$b$c$d$n!");
  Expect.equals("string423.1415falsenull!", '$a$b$c$d$n!');
  Expect.equals("string423.1415falsenull!", "${a}${b}${c}${d}${n}!");
  Expect.equals("string423.1415falsenull!", '${a}${b}${c}${d}${n}!');

  // Different types for first expression.
  Expect.equals("!string423.1415falsenull", "!$a$b$c$d$n");
  Expect.equals("null!string423.1415false", "$n!$a$b$c$d");
  Expect.equals("falsenull!string423.1415", "$d$n!$a$b$c");
  Expect.equals("3.1415falsenull!string42", "$c$d$n!$a$b");
  Expect.equals("423.1415falsenull!string", "$b$c$d$n!$a");

  // Function calls as expressions.
  Expect.equals(
      "sfun372.71828truenull", "${sfun()}${ifun()}${dfun()}${bfun()}${nfun()}");
  Expect.equals(
      "nullsfun372.71828true", "${nfun()}${sfun()}${ifun()}${dfun()}${bfun()}");
  Expect.equals(
      "truenullsfun372.71828", "${bfun()}${nfun()}${sfun()}${ifun()}${dfun()}");
  Expect.equals(
      "2.71828truenullsfun37", "${dfun()}${bfun()}${nfun()}${sfun()}${ifun()}");
  Expect.equals(
      "372.71828truenullsfun", "${ifun()}${dfun()}${bfun()}${nfun()}${sfun()}");

  // String contents around interpolated parts.
  Expect.equals("stringstring", "$a$a");
  Expect.equals("-stringstring", "-$a$a");
  Expect.equals("string-string", "$a-$a");
  Expect.equals("-string-string", "-$a-$a");
  Expect.equals("stringstring-", "$a$a-");
  Expect.equals("-stringstring-", "-$a$a-");
  Expect.equals("string-string-", "$a-$a-");
  Expect.equals("-string-string-", "-$a-$a-");

  // Quotes as literals are included correctly..
  Expect.equals("'42''42'", "'$b''$b'");
  Expect.equals('"42""42"', '"$b""$b"');

  // Nested string interpolation.
  Expect.equals("string423.1415false", "${'${a}'}$b${'$c${d}'}");
  // Quad-nested string interpolation.
  Expect.equals("string423.1415false", "${'${a}${"${b}${'${c}${"$d"}'}"}'}");
  // Lotsa-nested.
  Expect.equals("42", "${'${"${'${"${'${"$b"}'}"}'}"}'}");
}

void main() {
  testSimple();
  testMultiLine();
  testEscapes();
}
