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

// SharedOptions=--enable-experiment=extension-methods

// Tests getters and setters where one or both is defined
// by an extension.

import "package:expect/expect.dart";

main() {
  C c = C();
  // v1: C get, C set
  expectGet("C.v1", c.v1);
  expectSet("C.v1=1", c.v1 = Result("1"));
  // v2: C get, E1 get/set, C wins.
  expectGet("C.v2", c.v2);
  expectSet("E1.v2=2", E1(c).v2 = Result("2"));
  // v3: E1 get/set, C set, C wins.
  expectGet("E1.v3", E1(c).v3);
  expectSet("C.v3=3", c.v3 = Result("3"));
  // v4: E1 get/set
  expectGet("E1.v4", c.v4);
  expectSet("E1.v4=4", c.v4 = Result("4"));
  // v5: E1 get, E2 set, neither more specific.
  expectGet("E1.v5", E1(c).v5);
  expectSet("E2.v5=5", E2(c).v5 = Result("5"));

  expectSet("C.v1=C.v1+1", c.v1++);
  expectSet("E1.v4=E1.v4+1", c.v4++);

  expectSet("C.v1=C.v1+a", c.v1 += "a");
  expectSet("C.v1=C.v1-b", c.v1 -= "b");
  expectSet("E1.v4=E1.v4-b", c.v4 -= "b");

  // Explicit application used by all accesses of read/write operations
  expectSet("E1.v1=E1.v1+1", E1(c).v1++);
  expectSet("E1.v2=E1.v2+1", E1(c).v2++);
  expectSet("E1.v3=E1.v3+1", E1(c).v3++);
  // Same using `+= 1` instead of `++`.
  expectSet("E1.v1=E1.v1+1", E1(c).v1 += 1);
  expectSet("E1.v2=E1.v2+1", E1(c).v2 += 1);
  expectSet("E1.v3=E1.v3+1", E1(c).v3 += 1);
  // Same fully expanded.
  expectSet("E1.v1=E1.v1+1", E1(c).v1 = E1(c).v1 + 1);
  expectSet("E1.v2=E1.v2+1", E1(c).v2 = E1(c).v2 + 1);
  expectSet("E1.v3=E1.v3+1", E1(c).v3 = E1(c).v3 + 1);

  // Cascades work.
  expectSet(
      "E1.v4=E1.v4+[C.v1=C.v1-[C.v3=a]]",
      c
        ..v3 = Result("a")
        ..v1 -= Result("[$lastSetter]")
        ..v4 += Result("[$lastSetter]"));
}

/// Expect the value of [result] to be the [expected] string
expectGet(String expected, Result result) {
  Expect.equals(expected, result.value);
}

/// Expect the [lastSetter] value set by evaluating [assignment] to be
/// [expected].
expectSet(String expected, void assignment) {
  Expect.equals(expected, lastSetter);
}

/// Last value passed to any of our tested setters.
String lastSetter = null;

/// A type which supports a `+` operation accepting `int`,
/// so we can test `+=` and `++`.
class Result {
  final String value;
  Result(this.value);
  Result operator +(Object o) => Result("$value+$o");
  Result operator -(Object o) => Result("$value-$o");
  String toString() => value;
}

/// Target type for extensions.
///
/// Declares [v1] getter and setter, [v2] getter and [v3] setter.
class C {
  Result get v1 => Result("C.v1");
  void set v1(Result value) {
    lastSetter = "C.v1=$value";
  }

  Result get v2 => Result("C.v2");

  void set v3(Result value) {
    lastSetter = "C.v3=$value";
  }
}

/// Primary extension on [C].
///
/// Declares [v1], [v2] and [v3] getters and setters.
///
/// Declares [v4] getter and setter, and [v5] getter
/// which are supplemented by a setter from the [E2] extension.
extension E1 on C {
  // Same basename as C getter and setter.
  Result get v1 => Result("E1.v1");

  void set v1(Result value) {
    lastSetter = "E1.v1=$value";
  }

  // Same basename as C getter.
  Result get v2 => Result("E1.v2");

  void set v2(Result value) {
    lastSetter = "E1.v2=$value";
  }

  // Same basename as C setter.
  Result get v3 => Result("E1.v3");

  void set v3(Result value) {
    lastSetter = "E1.v3=$value";
  }

  // No other declarations with same basename.
  Result get v4 => Result("E1.v4");

  void set v4(Result value) {
    lastSetter = "E1.v4=$value";
  }

  // Same basename as E2 setter.
  Result get v5 => Result("E1.v5");
}

/// A different extension than [E1] on [C].
///
/// Declares [v5] setter.
extension E2 on C {
  void set v5(Result value) {
    lastSetter = "E2.v5=$value";
  }
}
