| // 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; | |
| late String Printers; | |
| late 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"}"); | |
| } |