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

// dart2jsOptions=--strong

// Regression test for http://dartbug.com/28749.
//
// This would crash at compile time because inner typedefs remain after calling
// [type.unalias].  Expanding the typedef causes the inputs to be used multiple
// types, breaking the invariant of HTypeInfoExpression that the type variable
// occurrences correspond to inputs.

import 'package:expect/expect.dart';

typedef void F<T>(T value);
typedef F<U> Converter<U>(F<U> function);
typedef Converter<V> ConvertFactory<V>(int input);

class B<W> {
  final field = new Wrap<ConvertFactory<W>>();
  @NoInline()
  B();
}

class Wrap<X> {
  @NoInline()
  Wrap();
}

foo<Y>(int x) {
  if (x == 0)
    return new Wrap<ConvertFactory<Y>>().runtimeType;
  else
    return new B<Y>().field.runtimeType;
}

void main() {
  var name = '${Wrap}';
  if ('$Object' != 'Object') return; // minified

  Expect.equals(
    'Wrap<(int) => ((int) => void) => (int) => void>',
    '${new B<int>().field.runtimeType}',
  );
  Expect.equals(
    'Wrap<(int) => ((bool) => void) => (bool) => void>',
    '${new B<bool>().field.runtimeType}',
  );

  Expect.equals(
    'Wrap<(int) => ((int) => void) => (int) => void>',
    '${foo<int>(0)}',
  );
  Expect.equals(
    'Wrap<(int) => ((String) => void) => (String) => void>',
    '${foo<String>(1)}',
  );
}
