// 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. // @dart = 2.7 // 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(); }