blob: 115f070205cb28d160b766fc089b2c8d662be424 [file] [log] [blame]
 // 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(); }