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

import "package:expect/expect.dart";

// Test various conditions around instantiating an abstract class.

// From The Dart Programming Langauge Specification, 11.11.1 "New":
//   If q is a constructor of an abstract class then an
//   AbstractClassInstantiation- Error is thrown.


abstract class Interface {
  void foo();
}

abstract class AbstractClass {
  toString() => 'AbstractClass';
}

class ConcreteSubclass extends AbstractClass {
  toString() => 'ConcreteSubclass';
}

class NonAbstractClass implements Interface {
  toString() => 'NonAbstractClass';
}

Interface interface() => new Interface();

AbstractClass abstractClass() => new AbstractClass();

bool isAbstractClassInstantiationError(e) {
  return e is AbstractClassInstantiationError;
}

void main() {
  Expect.throws(interface, isAbstractClassInstantiationError,
                "expected AbstractClassInstantiationError");
  Expect.throws(abstractClass, isAbstractClassInstantiationError,
                "expected AbstractClassInstantiationError");
  Expect.stringEquals('ConcreteSubclass', '${new ConcreteSubclass()}');
  Expect.stringEquals('NonAbstractClass', '${new NonAbstractClass()}');
}
