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

// Verify semantics of the ?. operator when it appears in a postincrement or
// preincrement expression (or a postdecrement or predecrement expression).

import "package:expect/expect.dart";
import "conditional_access_helper.dart" as h;

class C {
  int v;
  C(this.v);
  static late int staticInt;
}

class D {
  E v;
  D(this.v);
  static late E staticE;
}

class E {
  G operator +(int i) => new I();
  G operator -(int i) => new I();
}

class F {}

class G extends E implements F {}

class H {}

class I extends G implements H {}

C? nullC() => null;

main() {
  // Make sure the "none" test fails if assignment to "?." is not implemented.
  // This makes status files easier to maintain.
  nullC()?.v = 1;

  // e1?.v++ is equivalent to ((x) => x == null ? null : x.v++)(e1).
  Expect.equals(null, nullC()?.v++);
  { var c = new C(1) as C?; Expect.equals(1, c?.v++); Expect.equals(2, c!.v); }

  // C?.v++ is equivalent to C.v++.
  { C.staticInt = 1; Expect.equals(1, C?.staticInt++); Expect.equals(2, C.staticInt); }
  { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt++); Expect.equals(2, h.C.staticInt); }

  // The static type of e1?.v++ is the same as the static type of e1.v.
  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v++; Expect.identical(e1, e2); }
  { G g = new G(); var d = new D(g) as D?; F? f = d?.v++; Expect.identical(f, g); }
  //                                              ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
  { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE++; Expect.identical(e1, e2); }
  { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE++; Expect.identical(e1, e2); }
  { G g = new G(); D.staticE = g; F? f = D?.staticE++; Expect.identical(f, g); }
  //                                     ^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                               ^
  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
  { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE++; Expect.identical(f, g); }
  //                                             ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                                         ^
  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.

  // e1?.v-- is equivalent to ((x) => x == null ? null : x.v--)(e1).
  Expect.equals(null, nullC()?.v--);
  { var c = new C(1) as C?; Expect.equals(1, c?.v--); Expect.equals(0, c!.v); }

  // C?.v-- is equivalent to C.v--.
  { C.staticInt = 1; Expect.equals(1, C?.staticInt--); Expect.equals(0, C.staticInt); }
  { h.C.staticInt = 1; Expect.equals(1, h.C?.staticInt--); Expect.equals(0, h.C.staticInt); }

  // The static type of e1?.v-- is the same as the static type of e1.v.
  { E e1 = new E(); var d = new D(e1) as D?; E? e2 = d?.v--; Expect.identical(e1, e2); }
  { G g = new G(); var d = new D(g) as D?; F? f = d?.v--; Expect.identical(f, g); }
  //                                              ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  // [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
  { E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE--; Expect.identical(e1, e2); }
  { h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE--; Expect.identical(e1, e2); }
  { G g = new G(); D.staticE = g; F? f = D?.staticE--; Expect.identical(f, g); }
  //                                     ^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                               ^
  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
  { h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE--; Expect.identical(f, g); }
  //                                             ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                                         ^
  // [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.

  // ++e1?.v is equivalent to e1?.v += 1.
  Expect.equals(null, ++nullC()?.v);
  { var c = new C(1) as C?; Expect.equals(2, ++c?.v); Expect.equals(2, c!.v); }

  // ++C?.v is equivalent to C?.v += 1.
  { C.staticInt = 1; Expect.equals(2, ++C?.staticInt); Expect.equals(2, C.staticInt); }
  { h.C.staticInt = 1; Expect.equals(2, ++h.C?.staticInt); Expect.equals(2, h.C.staticInt); }

  // The static type of ++e1?.v is the same as the static type of e1.v + 1.
  { var d = new D(new E()) as D?; F? f = ++d?.v; Expect.identical(d!.v, f); }
  { var d = new D(new E()) as D?; H? h = ++d?.v; Expect.identical(d!.v, h); }
  //                                     ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                       ^
  // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
  { D.staticE = new E(); F? f = ++D?.staticE; Expect.identical(D.staticE, f); }
  { h.D.staticE = new h.E(); h.F? f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
  { D.staticE = new E(); H? h = ++D?.staticE; Expect.identical(D.staticE, h); }
  //                            ^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                 ^
  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
  { h.D.staticE = new h.E(); h.H? hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
  //                                   ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                          ^
  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.

  // --e1?.v is equivalent to e1?.v -= 1.
  Expect.equals(null, --nullC()?.v);
  { var c = new C(1) as C?; Expect.equals(0, --c?.v); Expect.equals(0, c!.v); }

  // --C?.v is equivalent to C?.v -= 1.
  { C.staticInt = 1; Expect.equals(0, --C?.staticInt); Expect.equals(0, C.staticInt); }
  { h.C.staticInt = 1; Expect.equals(0, --h.C?.staticInt); Expect.equals(0, h.C.staticInt); }

  // The static type of --e1?.v is the same as the static type of e1.v - 1.
  { var d = new D(new E()) as D?; F? f = --d?.v; Expect.identical(d!.v, f); }
  { var d = new D(new E()) as D?; H? h = --d?.v; Expect.identical(d!.v, h); }
  //                                     ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                       ^
  // [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
  { D.staticE = new E(); F? f = --D?.staticE; Expect.identical(D.staticE, f); }
  { h.D.staticE = new h.E(); h.F? f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
  { D.staticE = new E(); H? h = --D?.staticE; Expect.identical(D.staticE, h); }
  //                            ^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                 ^
  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
  { h.D.staticE = new h.E(); h.H? hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
  //                                   ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
  //                                          ^
  // [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
}
