// Copyright (c) 2018, 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:test/test.dart';

import '../../../tool/lsp_spec/typescript_parser.dart' as ast;

main() {
  group('dartType mapping', () {
    test('handles basic types', () {
      expect(_simple('string').dartType, equals('String'));
      expect(_simple('boolean').dartType, equals('bool'));
      expect(_simple('any').dartType, equals('dynamic'));
      expect(_simple('object').dartType, equals('dynamic'));
      expect(_simple('int').dartType, equals('int'));
      expect(_simple('num').dartType, equals('num'));
    });

    test('handles union types', () {
      expect(_union(['string', 'int']).dartTypeWithTypeArgs,
          equals('Either2<String, int>'));
    });

    test('handles arrays', () {
      expect(_array('string').dartTypeWithTypeArgs, equals('List<String>'));
    });
  });
}

ast.Type _simple(String name) =>
    new ast.Type(new ast.Token(ast.TokenType.IDENTIFIER, name), []);

ast.ArrayType _array(String name) => new ast.ArrayType(_simple(name));

ast.UnionType _union(List<String> names) =>
    new ast.UnionType(names.map(_simple).toList());
