// 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 for testing super operator calls

// @dart = 2.9

import "package:expect/expect.dart";

class A {
  String val = "";
  List things;

  A() : things = ['D', 'a', 'r', 't', 42];

  operator +(String s) {
    val = "${val}${s}";
    return this;
  }

  operator [](i) {
    return things[i];
  }

  operator []=(i, val) {
    return things[i] = val;
  }
}

class B extends A {
  operator +(String s) {
    super + ("${s}${s}"); // Call A.operator+(this, "${s}${s}").
    return this;
  }

  operator [](i) {
    var temp = super[i];
    if (temp is String) {
      return "$temp$temp";
    }
    return temp + temp;
  }

  operator []=(i, val) {
    // Make sure the index expression is only evaluated
    // once in the presence of a compound assignment.
    return super[i++] += val;
  }
}


main() {
  var a = new A();
  a = a + "William"; // operator + of class A.
  Expect.equals("William", a.val);
  Expect.equals("r", a[2]); // operator [] of class A.

  a = new B();
  a += "Tell"; //   operator + of class B.
  Expect.equals("TellTell", a.val);
  Expect.equals("rr", a[2]); // operator [] of class B.

  a[4] = 1; // operator []= of class B.
  Expect.equals(43, a.things[4]);
  Expect.equals(86, a[4]);
}
