// 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.

// @dart=2.9

class Class {
  int field;
}

extension Extension on Class {
  int get simpleSetter => field;

  set simpleSetter(int value) {
    field = value;
  }

  int get mutatingSetter => field;

  set mutatingSetter(int value) {
    value = value + 1;
    field = value;
  }

  int get setterWithReturn => field;

  set setterWithReturn(int value) {
    if (value < 0) {
      field = -value;
      return;
    }
    field = value;
  }

  int get setterWithClosure => field;

  set setterWithClosure(int value) {
    abs(value) {
      return value < 0 ? -value : value;
    }
    field = abs(value);
  }
  
  testInternal() {
    expect(null, field);

    simpleSetter = 0;
    expect(0, field);
    expect(1, simpleSetter = 1);

    mutatingSetter = 0;
    expect(1, field);
    expect(2, mutatingSetter = 2);
    expect(3, field);

    setterWithReturn = 1;
    expect(1, field);
    setterWithReturn = -2;
    expect(2, field);
    expect(3, setterWithReturn = 3);
    expect(3, field);
    expect(-4, setterWithReturn = -4);
    expect(4, field);

    setterWithClosure = 1;
    expect(1, field);
    setterWithClosure = -2;
    expect(2, field);
    expect(3, setterWithClosure = 3);
    expect(3, field);
    expect(-4, setterWithClosure = -4);
    expect(4, field);
  }
}

class GenericClass<T> {}

extension GenericExtension<T> on GenericClass<T> {
  set setter(T value) {}
}

main() {
  var c = new Class();
  expect(null, c.field);

  c.simpleSetter = 0;
  expect(0, c.field);
  expect(1, c.simpleSetter = 1);
  Extension(c).simpleSetter = 2;
  expect(2, c.field);
  expect(3, Extension(c).simpleSetter = 3);

  c.mutatingSetter = 0;
  expect(1, c.field);
  expect(2, c.mutatingSetter = 2);
  expect(3, c.field);
  Extension(c).mutatingSetter = 4;
  expect(5, c.field);
  expect(6, Extension(c).mutatingSetter = 6);
  expect(7, c.field);

  c.setterWithReturn = 1;
  expect(1, c.field);
  c.setterWithReturn = -2;
  expect(2, c.field);
  expect(3, c.setterWithReturn = 3);
  expect(3, c.field);
  expect(-4, c.setterWithReturn = -4);
  expect(4, c.field);
  Extension(c).setterWithReturn = 5;
  expect(5, c.field);
  Extension(c).setterWithReturn = -6;
  expect(6, c.field);
  expect(7, Extension(c).setterWithReturn = 7);
  expect(7, c.field);
  expect(-8, Extension(c).setterWithReturn = -8);
  expect(8, c.field);

  c.setterWithClosure = 1;
  expect(1, c.field);
  c.setterWithClosure = -2;
  expect(2, c.field);
  expect(3, c.setterWithClosure = 3);
  expect(3, c.field);
  expect(-4, c.setterWithClosure = -4);
  expect(4, c.field);
  Extension(c).setterWithClosure = 5;
  expect(5, c.field);
  Extension(c).setterWithClosure = -6;
  expect(6, c.field);
  expect(7, Extension(c).setterWithClosure = 7);
  expect(7, c.field);
  expect(-8, Extension(c).setterWithClosure = -8);
  expect(8, c.field);

  c.simpleSetter = 0;
  expect(0, c?.field);
  expect(1, c?.simpleSetter = 1);
  Extension(c).simpleSetter = 2;
  expect(2, c?.field);
  expect(3, Extension(c).simpleSetter = 3);

  c.mutatingSetter = 0;
  expect(1, c?.field);
  expect(2, c?.mutatingSetter = 2);
  expect(3, c?.field);
  Extension(c).mutatingSetter = 4;
  expect(5, c?.field);
  expect(6, Extension(c).mutatingSetter = 6);
  expect(7, c?.field);

  c?.setterWithReturn = 1;
  expect(1, c?.field);
  c?.setterWithReturn = -2;
  expect(2, c?.field);
  expect(3, c?.setterWithReturn = 3);
  expect(3, c?.field);
  expect(-4, c?.setterWithReturn = -4);
  expect(4, c?.field);
  Extension(c).setterWithReturn = 5;
  expect(5, c?.field);
  Extension(c).setterWithReturn = -6;
  expect(6, c?.field);
  expect(7, Extension(c).setterWithReturn = 7);
  expect(7, c?.field);
  expect(-8, Extension(c).setterWithReturn = -8);
  expect(8, c?.field);

  c?.setterWithClosure = 1;
  expect(1, c?.field);
  c?.setterWithClosure = -2;
  expect(2, c?.field);
  expect(3, c?.setterWithClosure = 3);
  expect(3, c?.field);
  expect(-4, c?.setterWithClosure = -4);
  expect(4, c?.field);
  Extension(c).setterWithClosure = 5;
  expect(5, c?.field);
  Extension(c).setterWithClosure = -6;
  expect(6, c?.field);
  expect(7, Extension(c).setterWithClosure = 7);
  expect(7, c?.field);
  expect(-8, Extension(c).setterWithClosure = -8);
  expect(8, c?.field);

  c.field = null;
  c.simpleSetter ??= 1;
  expect(1, c.field);
  expect(1, c.simpleSetter ??= 2);
  c.field = null;
  expect(2, c.simpleSetter ??= 2);

  c?.field = null;
  c?.simpleSetter ??= 1;
  expect(1, c?.field);
  expect(1, c?.simpleSetter ??= 2);
  c?.field = null;
  expect(2, c?.simpleSetter ??= 2);

  new Class().testInternal();

  GenericClass<int> genericClass = new GenericClass<int>();
  expect(1, GenericExtension(genericClass).setter = 1);
}

expect(expected, actual) {
  if (expected != actual) {
    throw 'Mismatch: expected=$expected, actual=$actual';
  }
}