// 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.


class WhatchamaCallIt {
  WhatchamaCallIt() { }

  String foo() {
    // Test $this and Field name is defined in subclass.
    return "$this and $name";
  }
}

class ThingamaBob extends WhatchamaCallIt {
  ThingamaBob(String s) : super(), name = s { }
  String name;
  toString() => "Hansel";
}

class StringInterpolateTest {

  static const String A = "svin";
  static const String B = "hest";
  static const int N = 1 + 1;
  static String Printers;
  static String AAR_Printers;

  static testMain() {
    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);

    var t = new ThingamaBob("Gretel");
    print(t.foo());
    Expect.equals(t.foo(), "Hansel and Gretel");
  }
}

main() {
  StringInterpolateTest.testMain();
}
