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

// Ensure that the inferrer looks at default values for parameters in
// synthetic constructors using the correct context. If the constructor call
// to D without optional parameters is inferred using D's context, the default
// value `_SECRET` will not be visible and compilation will fail.

import 'package:async_helper/async_helper.dart';
import 'memory_compiler.dart';

const Map MEMORY_SOURCE_FILES = const {
  "main.dart": r"""
  import "liba.dart";

  class Mixin {
      String get foo => "Mixin:$this";
  }

  class D = C with Mixin;

  main() {
    print(new D.a(42).foo);
    print(new D.b(42).foo);
    print(new D.a(42, "overt").foo);
    print(new D.b(42, b:"odvert").foo);
  }
""",
  "liba.dart": r"""
  class _SECRET { const _SECRET(); String toString() => "SECRET!"; }

  class C {
    final int x;
    final y;
    C.a(int x, [var b = const _SECRET()]) : this.x = x, this.y = b;
    C.b(int x, {var b : const _SECRET()}) : this.x = x, this.y = b;
    String toString() => "C($x,$y)";
  }
"""
};

main() {
  asyncTest(() => runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES));
}
