// Copyright (c) 2023, 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 Interface class can be constructed and implemented but not
/// extended or mixed in and is not exhaustive
///
/// @description Checks that `interface class` can be constructed and
/// implemented outside of the library where it is defined
/// @author sgrekhov22@gmail.com

import "class_modifiers_lib.dart";

class ClassImplementsInterfaceClass implements InterfaceClass {}

base class BaseClassImplementsInterfaceClass implements InterfaceClass {}

interface class InterfaceClassImplementsInterfaceClass
    implements InterfaceClass {}

final class FinalClassImplementsInterfaceClass implements InterfaceClass {}

sealed class SealedClassImplementsInterfaceClass implements InterfaceClass {}

abstract class AbstractClassImplementsInterfaceClass
    implements InterfaceClass {}

abstract base class AbstractBaseClassImplementsInterfaceClass
    implements InterfaceClass {}

abstract interface class AbstractInterfaceClassImplementsInterfaceClass
    implements InterfaceClass {}

abstract final class AbstractFinalClassImplementsInterfaceClass
    implements InterfaceClass {}

mixin class MixinClassImplementsInterfaceClass implements InterfaceClass {}

base mixin class BaseMixinClassImplementsInterfaceClass
    implements InterfaceClass {}

abstract mixin class AbstractMixinClassImplementsInterfaceClass
    implements InterfaceClass {}

abstract base mixin class AbstractBaseMixinClassImplementsInterfaceClass
    implements InterfaceClass {}

mixin MixinImplementsInterfaceClass implements InterfaceClass {}

base mixin BaseMixinImplementsInterfaceClass implements InterfaceClass {}

enum EnumImplementsInterfaceClass implements InterfaceClass {e1, e2}

main() {
  InterfaceClass();

  print(ClassImplementsInterfaceClass);
  print(BaseClassImplementsInterfaceClass);
  print(InterfaceClassImplementsInterfaceClass);
  print(FinalClassImplementsInterfaceClass);
  print(SealedClassImplementsInterfaceClass);
  print(AbstractClassImplementsInterfaceClass);
  print(AbstractBaseClassImplementsInterfaceClass);
  print(AbstractInterfaceClassImplementsInterfaceClass);
  print(AbstractFinalClassImplementsInterfaceClass);
  print(MixinClassImplementsInterfaceClass);
  print(BaseMixinClassImplementsInterfaceClass);
  print(AbstractMixinClassImplementsInterfaceClass);
  print(AbstractBaseMixinClassImplementsInterfaceClass);
  print(MixinImplementsInterfaceClass);
  print(BaseMixinImplementsInterfaceClass);
  print(EnumImplementsInterfaceClass);
}
