// Copyright (c) 2012, 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.

import "package:expect/expect.dart";

// Test cascades.

class A {
  int x;
  int y;

  A(this.x, this.y);

  A setX(int x) {
    this.x = x;
    return this;
  }

  void setY(int y) {
    this.y = y;
  }

  Function swap() {
    int tmp = x;
    x = y;
    y = tmp;
    return this.swap;
  }

  void check(int x, int y) {
    Expect.equals(x, this.x);
    Expect.equals(y, this.y);
  }

  operator [](var i) {
    if (i == 0) return x;
    if (i == 1) return y;
    if (i == "swap") return this.swap;
    return null;
  }

  operator []=(int i, int value) {
    if (i == 0) {
      x = value;
    } else if (i == 1) {
      y = value;
    }
  }

  /**
   * A pseudo-keyword.
   */
  import() {
    x++;
  }
}

main() {
  A a = new A(1, 2);
  a
    ..check(1, 2)
    ..swap()
    ..check(2, 1)
    ..x = 4
    ..y = 9
    ..check(4, 9)
    ..setX(10)
    ..check(10, 9)
    ..y = 5
    ..check(10, 5)
    ..swap()()()
    ..check(5, 10)
    ..[0] = 2
    ..check(2, 10)
    ..setX(10).setY(3)
    ..check(10, 3)
    ..setX(7)["swap"]()
    ..check(3, 7)
    ..import()
    ..check(4, 7)
    ..["swap"]()()()
    ..check(7, 4);
  a.check(7, 4);
  a..(42);
  // ^
  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
  // [cfe] Expected an identifier, but got ''.
  // ^
  // [cfe] Expected an identifier, but got '('.
  a..37;
  // ^^
  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
  // [cfe] Expected an identifier, but got '37'.
  a.."foo";
  // ^^^^^
  // [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
  // [cfe] Expected an identifier, but got '"foo"'.
}
