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

library test.constructor_kinds_test;

import 'dart:mirrors';
import 'package:expect/expect.dart';

class ClassWithDefaultConstructor {}

class Class {
  Class.generativeConstructor();
  Class.redirectingGenerativeConstructor() : this.generativeConstructor();
  factory Class.factoryConstructor() => new Class.generativeConstructor();
  factory Class.redirectingFactoryConstructor() = Class.factoryConstructor;

  const Class.constGenerativeConstructor();
  const Class.constRedirectingGenerativeConstructor()
      : this.constGenerativeConstructor();
  // Not legal.
  // const factory Class.constFactoryConstructor() => ...
  const factory Class.constRedirectingFactoryConstructor() =
      Class.constGenerativeConstructor;
}

main() {
  ClassMirror cm;
  MethodMirror mm;

  // Multitest with and without constructor calls. On the VM, we want to check
  // that constructor properties are correctly set even if the constructor
  // hasn't been fully compiled. On dart2js, we want to check that constructors
  // are retain even if there are no base-level calls.
  new ClassWithDefaultConstructor(); // //# 01: ok
  new Class.generativeConstructor(); // //# 01: ok
  new Class.redirectingGenerativeConstructor(); // //# 01: ok
  new Class.factoryConstructor(); // //# 01: ok
  new Class.redirectingFactoryConstructor(); // //# 01: ok
  const Class.constGenerativeConstructor(); // //# 01: ok
  const Class.constRedirectingGenerativeConstructor(); // //# 01: ok
  const Class.constRedirectingFactoryConstructor(); // //# 01: ok

  cm = reflectClass(ClassWithDefaultConstructor);
  mm = cm.declarations.values
      .where((d) => d is MethodMirror && d.isConstructor)
      .single as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isTrue(mm.isGenerativeConstructor);
  Expect.isFalse(mm.isFactoryConstructor);
  Expect.isFalse(mm.isRedirectingConstructor);
  Expect.isFalse(mm.isConstConstructor);

  cm = reflectClass(Class);

  mm = cm.declarations[#Class.generativeConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isTrue(mm.isGenerativeConstructor);
  Expect.isFalse(mm.isFactoryConstructor);
  Expect.isFalse(mm.isRedirectingConstructor);
  Expect.isFalse(mm.isConstConstructor);

  mm = cm.declarations[#Class.redirectingGenerativeConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isTrue(mm.isGenerativeConstructor);
  Expect.isFalse(mm.isFactoryConstructor);
  Expect.isTrue(mm.isRedirectingConstructor);
  Expect.isFalse(mm.isConstConstructor);

  mm = cm.declarations[#Class.factoryConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isFalse(mm.isGenerativeConstructor);
  Expect.isTrue(mm.isFactoryConstructor);
  Expect.isFalse(mm.isRedirectingConstructor);
  Expect.isFalse(mm.isConstConstructor);

  mm = cm.declarations[#Class.redirectingFactoryConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isFalse(mm.isGenerativeConstructor);
  Expect.isTrue(mm.isFactoryConstructor);
  Expect.isTrue(mm.isRedirectingConstructor);
  Expect.isFalse(mm.isConstConstructor);

  mm = cm.declarations[#Class.constGenerativeConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isTrue(mm.isGenerativeConstructor);
  Expect.isFalse(mm.isFactoryConstructor);
  Expect.isFalse(mm.isRedirectingConstructor);
  Expect.isTrue(mm.isConstConstructor);

  mm = cm.declarations[#Class.constRedirectingGenerativeConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isTrue(mm.isGenerativeConstructor);
  Expect.isFalse(mm.isFactoryConstructor);
  Expect.isTrue(mm.isRedirectingConstructor);
  Expect.isTrue(mm.isConstConstructor);

  // Not legal.
  // mm = cm.declarations[#Class.constFactoryConstructor] as MethodMirror;
  // Expect.isTrue(mm.isConstructor);
  // Expect.isFalse(mm.isGenerativeConstructor);
  // Expect.isTrue(mm.isFactoryConstructor);
  // Expect.isFalse(mm.isRedirectingConstructor);
  // Expect.isTrue(mm.isConstConstructor);

  mm = cm.declarations[#Class.constRedirectingFactoryConstructor] as MethodMirror;
  Expect.isTrue(mm.isConstructor);
  Expect.isFalse(mm.isGenerativeConstructor);
  Expect.isTrue(mm.isFactoryConstructor);
  Expect.isTrue(mm.isRedirectingConstructor);
  Expect.isTrue(mm.isConstConstructor);
}
