// Copyright (c) 2016, 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";

import 'type_literal_test.dart' as prefix;

// TODO(rnystrom): This test has a lot of overlap with some other language
// tests, but those are sort of all over the place so I thought it useful to
// test all of the relevant bits in one place here.

class Foo {
  static var property;
  static method() => "result";
}

class Box<T> {
  Type get typeArg => T;
}

class G<A, B> {}

typedef int Func(bool b);
typedef int GenericFunc<T>(T t);

main() {
  // Primitive types.
  testType(Object, "Object");
  testType(Null, "Null");
  testType(bool, "bool");
  testType(double, "double");
  testType(int, "int");
  testType(num, "num");
  testType(String, "String");

  // Class types.
  testType(Foo, "Foo");

  // Generic classes.
  testType(Box, "Box", "<dynamic>");
  testType(new Box<Foo>().typeArg, "Foo");
  testType(new Box<dynamic>().typeArg, "dynamic");
  testType(new Box<Box<Foo>>().typeArg, "Box<Foo>");
  testType(G, "G", "<dynamic, dynamic>");
  testType(new Box<G<int, String>>().typeArg, "G<int, String>");

  // Typedef.
  testType(Func, "Func");
  testType(GenericFunc, "GenericFunc", "<dynamic>");
  testType(new Box<GenericFunc<int>>().typeArg, "GenericFunc<int>");

  // Literals are canonicalized.
  Expect.identical(Foo, Foo);
  Expect.identical(Box, Box);
  Expect.identical(new Box<Foo>().typeArg, new Box<Foo>().typeArg);
  Expect.identical(Func, Func);

  // Static member uses are not type literals.
  Foo.property = "value";
  Expect.equals("value", Foo.property);
  Expect.equals("result", Foo.method());

  // Prefixed types are type literals.
  testType(prefix.Foo, "Foo");

  // Prefix member uses are not.
  prefix.Foo.property = "value2";
  Expect.equals("value2", prefix.Foo.property);
  Expect.equals("result", prefix.Foo.method());
}

void testType(Type type, String string, [String genericArgs]) {
  if (genericArgs != null) {
    var s = type.toString();
    Expect.isTrue(
        s == string || s == '$string$genericArgs',
        'type `$type`.toString() should be `$string`, '
        'optionally with $genericArgs suffix.');
  } else {
    Expect.equals(string, type.toString());
  }
  Expect.isTrue(type is Type);
}
