// 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 type_variable_occurrence_test;

import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/elements.dart' show ClassElement;
import 'package:compiler/src/elements/resolution_types.dart';
import 'package:compiler/src/elements/types.dart';
import 'package:expect/expect.dart';

import 'type_test_helper.dart';

void main() {
  testTypeVariableOccurrence();
}

testTypeVariableOccurrence() {
  asyncTest(() => TypeEnvironment.create(r"""
      typedef S Typedef1<S>();
      typedef void Typedef2<S>(S s);
      typedef void Typedef3<S>(A<S> a);

      class A<T> {
        int field1;
        T field2;
        A<int> field3;
        A<T> field4;
        A<A<int>> field5;
        A<A<T>> field6;

        Typedef1 field7;
        Typedef1<int> field8;
        Typedef1<T> field9;
        Typedef1<Typedef1<T>> field10;

        Typedef2 field11;
        Typedef2<int> field12;
        Typedef2<T> field13;
        Typedef2<Typedef1<T>> field14;

        Typedef3 field15;
        Typedef3<int> field16;
        Typedef3<T> field17;
        Typedef3<Typedef1<T>> field18;

        void method1() {}
        T method2() => null;
        A<T> method3() => null;
        void method4(T t) {}
        void method5(A<T> t) {}
        void method6(void foo(T t)) {}
        void method7([T t]) {}
        void method8({T t}) {}
      }
      """).then((env) {
        ClassElement A = env.getElement('A');

        expect(bool expectResult, String memberName) {
          ResolutionDartType memberType = env.getMemberType(A, memberName);
          ResolutionTypeVariableType typeVariable =
              memberType.typeVariableOccurrence;
          if (expectResult) {
            Expect.isNotNull(typeVariable);
            Expect.equals(A, DartTypes.getClassContext(memberType));
          } else {
            Expect.isNull(typeVariable);
            Expect.isNull(DartTypes.getClassContext(memberType));
          }
        }

        // int field1;
        expect(false, 'field1');
        // T field2;
        expect(true, 'field2');
        // A<int> field3;
        expect(false, 'field3');
        // A<T> field4;
        expect(true, 'field4');
        // A<A<int>> field5;
        expect(false, 'field5');
        // A<A<T>> field6;
        expect(true, 'field6');

        // Typedef1 field7;
        expect(false, 'field7');
        // Typedef1<int> field8;
        expect(false, 'field8');
        // Typedef1<T> field9;
        expect(true, 'field9');
        // Typedef1<Typedef1<T>> field10;
        expect(true, 'field10');

        // Typedef2 field11;
        expect(false, 'field11');
        // Typedef2<int> field12;
        expect(false, 'field12');
        // Typedef2<T> field13;
        expect(true, 'field13');
        // Typedef2<Typedef1<T>> field14;
        expect(true, 'field14');

        // Typedef3 field15;
        expect(false, 'field15');
        // Typedef3<int> field16;
        expect(false, 'field16');
        // Typedef3<T> field17;
        expect(true, 'field17');
        // Typedef3<Typedef1<T>> field18;
        expect(true, 'field18');

        // void method1() {}
        expect(false, 'method1');
        // T method2() => null;
        expect(true, 'method2');
        // A<T> method3() => null;
        expect(true, 'method3');
        // void method4(T t) {}
        expect(true, 'method4');
        // void method5(A<T> t) {}
        expect(true, 'method5');
        // void method6(void foo(T t)) {}
        expect(true, 'method6');
        // void method7([T t]);
        expect(true, 'method7');
        // void method8({T t});
        expect(true, 'method8');
      }));
}
