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

/// Checks that abstract instance variable declarations are allowed.

import "package:expect/expect.dart";

// Valid declarations for abstract class.
abstract class C {
  abstract int x1, x2;
  abstract var y1, y2, y3; // infers dynamic.
  abstract final z;
  abstract final int u1, u2;
  abstract covariant int v1, v2, v3;
  abstract covariant var w;
}

class D {
  int x1, x2;
  var y1, y2, y3;
  var z;
  int u1, u2;
  covariant int v1, v2, v3;
  covariant var w;
  D() :
      x1 = 0,
      x2 = 0,
      y1 = 1,
      y2 = 1,
      y3 = 1,
      z = 2,
      u1 = 3,
      u2 = 3,
      v1 = 4,
      v2 = 4,
      v3 = 4,
      w = 5;
}

/// Valid implementation of abstract interface.
class E extends D implements C {}

// Valid declarations when superclass has implementation.
class F extends D { // Class is not abstract.
  abstract int x1, x2;
  abstract var y1, y2, y3;
  abstract final z;
  abstract final int u1, u2;
  abstract covariant int v1, v2, v3;
  abstract covariant var w;
}

// Records accesses.
class Logger {
  Symbol? lastName;
  String _x = "x";
  int _y = 0;
  String get x {
    lastName = #x;
    return _x;
  }
  set x(String value) {
    lastName = #x;
    _x = value;
  }
  int get y {
    lastName = #y;
    return 0;
  }
  set y(int value) {
    lastName = #y;
    _y = value;
  }
}

/// Check that abstract declarations do not shadow implementation.
class Override extends Logger {
  abstract String x;
  abstract final int y;
}

void main() {
  C c = E();
  Expect.equals(0, c.x1);
  Expect.equals(0, c.x2);
  Expect.equals(1, c.y1);
  Expect.equals(1, c.y2);
  Expect.equals(1, c.y3);
  Expect.equals(2, c.z);
  Expect.equals(3, c.u1);
  Expect.equals(3, c.u2);
  Expect.equals(4, c.v1);
  Expect.equals(4, c.v2);
  Expect.equals(4, c.v3);
  Expect.equals(5, c.w);
  c.x1 = 6;
  Expect.equals(6, c.x1);
  c.y2 = 7;
  Expect.equals(7, c.y2);
  c.v3 = 8;
  Expect.equals(8, c.v3);
  c.w = 9;
  Expect.equals(9, c.w);

  // Class F is not abstract and can be instantiated.
  F f = F();
  Expect.equals(0, f.x1);
  Expect.equals(0, f.x2);
  Expect.equals(1, f.y1);
  Expect.equals(1, f.y2);
  Expect.equals(1, f.y3);
  Expect.equals(2, f.z);
  Expect.equals(3, f.u1);
  Expect.equals(3, f.u2);
  Expect.equals(4, f.v1);
  Expect.equals(4, f.v2);
  Expect.equals(4, f.v3);
  Expect.equals(5, f.w);
  f.x1 = 6;
  Expect.equals(6, f.x1);
  f.y2 = 7;
  Expect.equals(7, f.y2);
  f.v3 = 8;
  Expect.equals(8, f.v3);
  f.w = 9;
  Expect.equals(9, f.w);

  // Check that abstract declarations do not shadow superclass implementation.
  Override o = Override();
  Expect.equals("x", o.x);
  Expect.equals(#x, o.lastName);
  Expect.equals(0, o.y);
  Expect.equals(#y, o.lastName);
  o.x = "b";
  Expect.equals(#x, o.lastName);
  o.y = 42;
  Expect.equals(#y, o.lastName);
  Expect.equals("b", o.x);
  Expect.equals(#x, o.lastName);
  Expect.equals(42, o.y);
  Expect.equals(#y, o.lastName);
}
