// 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.
    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();
}
