// Copyright (c) 2013, 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";

class A {
  var missingSetterField;
  var missingGetterField;
  var getterInSuperClassField;
  var setterInSuperClassField;
  var getterSetterField;
  var missingAllField;
  var indexField = new List(2);

  set setterInSuperClass(a) { setterInSuperClassField = a; }
  get getterInSuperClass => getterInSuperClassField;
}

class B extends A {
  get missingSetter => missingSetterField;
  get setterInSuperClass => setterInSuperClassField;

  set missingGetter(a) { missingGetterField = a; }
  set getterInSuperClass(a) { getterInSuperClassField = a; }

  get getterSetter => getterSetterField;
  set getterSetter(a) { getterSetterField = a; }

  operator[](index) => indexField[index];
  operator[]=(index, value) { indexField[index] = value; }

  noSuchMethod(Invocation im) {
    if (im.memberName.startsWith('missingSetter')) {
      Expect.isTrue(im.isSetter);
      missingSetterField = im.positionalArguments[0];
    } else if (im.memberName.startsWith('missingGetter')) {
      Expect.isTrue(im.isGetter);
      return missingGetterField;
    } else if (im.memberName.startsWith('missingAll') && im.isGetter) {
      return missingAllField;
    } else if (im.memberName.startsWith('missingAll') && im.isSetter) {
      missingAllField = im.positionalArguments[0];
    } else {
      Expect.fail('Should not reach here');
    }
  }
}

class C extends B {
  test() {
    Expect.equals(42, super.missingSetter = 42);
    Expect.equals(42, super.missingSetter);
    Expect.equals(43, super.missingSetter += 1);
    Expect.equals(43, super.missingSetter);
    Expect.equals(43, super.missingSetter++);
    Expect.equals(44, super.missingSetter);

    Expect.equals(42, super.missingGetter = 42);
    Expect.equals(42, super.missingGetter);
    Expect.equals(43, super.missingGetter += 1);
    Expect.equals(43, super.missingGetter);
    Expect.equals(43, super.missingGetter++);
    Expect.equals(44, super.missingGetter);

    Expect.equals(42, super.setterInSuperClass = 42);
    Expect.equals(42, super.setterInSuperClass);
    Expect.equals(43, super.setterInSuperClass += 1);
    Expect.equals(43, super.setterInSuperClass);
    Expect.equals(43, super.setterInSuperClass++);
    Expect.equals(44, super.setterInSuperClass);

    Expect.equals(42, super.getterInSuperClass = 42);
    Expect.equals(42, super.getterInSuperClass);
    Expect.equals(43, super.getterInSuperClass += 1);
    Expect.equals(43, super.getterInSuperClass);
    Expect.equals(43, super.getterInSuperClass++);
    Expect.equals(44, super.getterInSuperClass);

    Expect.equals(42, super.missingAll = 42);
    Expect.equals(42, super.missingAll);
    Expect.equals(43, super.missingAll += 1);
    Expect.equals(43, super.missingAll);
    Expect.equals(43, super.missingAll++);
    Expect.equals(44, super.missingAll);

    Expect.equals(42, super[0] = 42);
    Expect.equals(42, super[0]);
    Expect.equals(43, super[0] += 1);
    Expect.equals(43, super[0]);
    Expect.equals(43, super[0]++);
    Expect.equals(44, super[0]);

    Expect.equals(2, super[0] = 2);
    Expect.equals(2, super[0]);
    Expect.equals(3, super[0] += 1);
    Expect.equals(3, super[0]);
    Expect.equals(3, super[0]++);
    Expect.equals(4, super[0]);
  }
}

main() {
  new C().test();
}
