// Copyright (c) 2011, 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 test program testing string interpolation. import "package:expect/expect.dart"; class WhatchamaCallIt { WhatchamaCallIt() {} String foo() { // Test $this and Field name is defined in subclass. dynamic self = this; dynamic name = self.name; return "$this and $name"; } } class ThingamaBob extends WhatchamaCallIt { ThingamaBob(String s) : name = s, super(); String name; toString() => "Hansel"; } const String A = "svin"; const String B = "hest"; const int N = 1 + 1; String Printers; String AAR_Printers; main() { Printers = "Printers: $A and $B"; AAR_Printers = "AAR has $N $Printers."; var x = 1; var s = "eins und \$x macht zwei."; print(s); Expect.equals(r"eins und $x macht zwei.", s); s = "eins und $x macht zwei."; print(s); Expect.equals(r"eins und 1 macht zwei.", s); print(AAR_Printers); Expect.equals(r"AAR has 2 Printers: svin and hest.", AAR_Printers); var s$eins = "eins"; var $1 = 1; var zw = "zw"; var ei = "ei"; var zw$ei = "\"Martini, dry? Nai zwai.\""; s = "${s$eins} und ${$1} macht $zw$ei."; print(s); Expect.equals(r"eins und 1 macht zwei.", s); dynamic t = new ThingamaBob("Gretel"); print(t.foo()); Expect.equals(t.foo(), "Hansel and Gretel"); testStringVariants(); } class Stringable { final String value; Stringable(this.value); String toString() => value; operator *(int count) => new Stringable(value * count); } void testStringVariants() { String latin = "ab\x00\xff"; String nonLatin = "\u2000\u{10000}\ufeff"; dynamic oLatin = new Stringable(latin); dynamic oNonLatin = new Stringable(nonLatin); // ASCII. Expect.equals(latin * 3, "$latin$latin$latin"); Expect.equals( latin * 64, "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin"); Expect.equals( latin * 64, "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}"); // Non-ASCII. Expect.equals(nonLatin * 3, "$nonLatin$nonLatin$nonLatin"); Expect.equals( nonLatin * 64, "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin" "$nonLatin$nonLatin$nonLatin$nonLatin"); Expect.equals( nonLatin * 64, "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}" "${nonLatin * 4}${nonLatin * 4}"); // Mixed. Expect.equals(latin * 3 + nonLatin, "$latin$latin$latin$nonLatin"); Expect.equals(nonLatin + latin * 3, "$nonLatin$latin$latin$latin"); Expect.equals( latin * 60 + nonLatin * 4, "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin" "$nonLatin$nonLatin$nonLatin$nonLatin"); Expect.equals( nonLatin * 4 + latin * 60, "$nonLatin$nonLatin$nonLatin$nonLatin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin$latin$latin$latin$latin" "$latin$latin$latin$latin"); Expect.equals( latin * 60 + nonLatin * 4, "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${nonLatin * 4}"); Expect.equals( nonLatin * 4 + latin * 60, "${nonLatin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}" "${latin * 4}${latin * 4}${latin * 4}${latin * 4}"); // With objects. Expect.equals(latin * 3, "$latin$oLatin$latin"); Expect.equals( latin * 64, "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin" "$latin$latin$latin$latin$latin$latin$latin$oLatin"); Expect.equals( latin * 64, "${latin * 4}${latin * 4}${latin * 4}${oLatin * 4}" "${latin * 4}${latin * 4}${latin * 4}${oLatin * 4}" "${latin * 4}${latin * 4}${latin * 4}${oLatin * 4}" "${latin * 4}${latin * 4}${latin * 4}${oLatin * 4}"); // Non-ASCII. Expect.equals(nonLatin * 3, "$nonLatin$oNonLatin$nonLatin"); Expect.equals( nonLatin * 64, "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin" "$nonLatin$nonLatin$nonLatin$oNonLatin"); Expect.equals( nonLatin * 64, "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}" "${nonLatin * 4}${oNonLatin * 4}"); // Mixed. Expect.equals(latin * 2 + nonLatin * 2, "$latin$oLatin$nonLatin$oNonLatin"); Expect.equals(nonLatin * 2 + latin * 2, "$nonLatin$oNonLatin$latin$oLatin"); Expect.equals( (latin * 2 + nonLatin * 2) * 8, "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin" "$latin$oLatin$nonLatin$oNonLatin"); Expect.equals( (nonLatin * 2 + latin * 2) * 8, "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin" "$nonLatin$oNonLatin$latin$oLatin"); // All combinations var o1 = new Stringable("x"); var o2 = new Stringable("\ufeff"); Expect.equals("a\u2000x\ufeff", "${"a"}${"\u2000"}${o1}${o2}"); Expect.equals("a\u2000\ufeffx", "${"a"}${"\u2000"}${o2}${o1}"); Expect.equals("ax\u2000\ufeff", "${"a"}${o1}${"\u2000"}${o2}"); Expect.equals("ax\ufeff\u2000", "${"a"}${o1}${o2}${"\u2000"}"); Expect.equals("a\ufeffx\u2000", "${"a"}${o2}${o1}${"\u2000"}"); Expect.equals("a\ufeff\u2000x", "${"a"}${o2}${"\u2000"}${o1}"); Expect.equals("\u2000ax\ufeff", "${"\u2000"}${"a"}${o1}${o2}"); Expect.equals("\u2000a\ufeffx", "${"\u2000"}${"a"}${o2}${o1}"); Expect.equals("xa\u2000\ufeff", "${o1}${"a"}${"\u2000"}${o2}"); Expect.equals("xa\ufeff\u2000", "${o1}${"a"}${o2}${"\u2000"}"); Expect.equals("\ufeffax\u2000", "${o2}${"a"}${o1}${"\u2000"}"); Expect.equals("\ufeffa\u2000x", "${o2}${"a"}${"\u2000"}${o1}"); Expect.equals("\u2000xa\ufeff", "${"\u2000"}${o1}${"a"}${o2}"); Expect.equals("\u2000\ufeffax", "${"\u2000"}${o2}${"a"}${o1}"); Expect.equals("x\u2000a\ufeff", "${o1}${"\u2000"}${"a"}${o2}"); Expect.equals("x\ufeffa\u2000", "${o1}${o2}${"a"}${"\u2000"}"); Expect.equals("\ufeffxa\u2000", "${o2}${o1}${"a"}${"\u2000"}"); Expect.equals("\ufeff\u2000ax", "${o2}${"\u2000"}${"a"}${o1}"); Expect.equals("\u2000x\ufeffa", "${"\u2000"}${o1}${o2}${"a"}"); Expect.equals("\u2000\ufeffxa", "${"\u2000"}${o2}${o1}${"a"}"); Expect.equals("x\u2000\ufeffa", "${o1}${"\u2000"}${o2}${"a"}"); Expect.equals("x\ufeff\u2000a", "${o1}${o2}${"\u2000"}${"a"}"); Expect.equals("\ufeffx\u2000a", "${o2}${o1}${"\u2000"}${"a"}"); Expect.equals("\ufeff\u2000xa", "${o2}${"\u2000"}${o1}${"a"}"); }