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

/// @assertion Inside an extension method body, this does not refer to an
/// instance of a surrounding type. Instead it is bound to the original receiver,
/// and the static type of this is the declared on type of the surrounding
/// extension (which may contain unbound type variables).
///
/// @description Check that inside an extension method body 'this' refers  to the
/// original receiver
/// @author sgrekhov@unipro.ru


import "../../Utils/expect.dart";

class A {
  String a;
  A(this.a);
}

class C extends A {
  String c;
  C(this.c, String a): super(a);
}

extension ExtendedC on C {
  void test(C c) {
    Expect.equals("c", this.c);
    Expect.equals("a", this.a);
    Expect.isTrue(this == c);
  }
}

main() {
  C c = new C("c", "a");
  c.test(c);
}
