// Copyright (c) 2022, 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/minitest.dart'; // ignore: deprecated_member_use
import 'package:front_end/src/api_prototype/expression_compilation_tools.dart';

void main() {
  // null value.
  expect(parseDefinitionTypes(["null"]), [new ParsedType.nullType()]);

  // String, kNonNullable
  expect(
      parseDefinitionTypes([
        "dart:core",
        "_OneByteString",
        "1",
        "0",
      ]),
      [new ParsedType("dart:core", "_OneByteString", 1)]);

  // List<something it can't represent which thus becomes an explicit
  // dynamic/null>, kNonNullable.
  expect(parseDefinitionTypes(["dart:core", "List", "1", "1", "null"]), [
    new ParsedType("dart:core", "List", 1)
      ..arguments!.add(new ParsedType.nullType())
  ]);

  // List<int>, kNonNullable
  expect(
      parseDefinitionTypes([
        "dart:core",
        "_GrowableList",
        "1",
        "1",
        "dart:core",
        "int",
        "1",
        "0",
      ]),
      [
        new ParsedType("dart:core", "_GrowableList", 1)
          ..arguments!.add(new ParsedType("dart:core", "int", 1))
      ]);

  // Map<int, int>, kNonNullable
  expect(
      parseDefinitionTypes([
        "dart:core",
        "Map",
        "1",
        "2",
        "dart:core",
        "int",
        "1",
        "0",
        "dart:core",
        "int",
        "1",
        "0",
      ]),
      [
        new ParsedType("dart:core", "Map", 1)
          ..arguments!.add(new ParsedType("dart:core", "int", 1))
          ..arguments!.add(new ParsedType("dart:core", "int", 1))
      ]);

  // [0] = String
  // [1] = int
  // [2] = List<String>
  // [3] = Bar
  // [4] = null
  // [5] = HashMap<Map<int, List<int>>, List<String>>
  expect(
      parseDefinitionTypes([
        // String, kNonNullable, no arguments
        "dart:core", "_OneByteString", "1", "0",
        // Int, kNonNullable, no arguments
        "dart:core", "_Smi", "1", "0",
        // List, kNonNullable, 1 argument
        "dart:core", "_GrowableList", "1", "1",
        //  -> String, kNonNullable (i.e. the above is List<String>)
        /**/ "dart:core", "String", "1", "0",
        // "Bar", kNonNullable, no arguments
        "file://wherever/t.dart", "Bar", "1", "0",
        // null value
        "null",
        // HashMap, kNonNullable, 2 arguments
        "dart:collection", "_InternalLinkedHashMap", "1", "2",
        //   -> Map, kNonNullable, 2 arguments
        /**/ "dart:core", "Map", "1", "2",
        //   -> -> int, kNonNullable, no arguments
        /*/**/*/ "dart:core", "int", "1", "0",
        //   -> -> List, kNonNullable, 1 argument
        /*/**/*/ "dart:core", "List", "1", "1",
        //   -> -> -> int, kNonNullable, no arguments
        /*/*/**/*/*/ "dart:core", "int", "1", "0",
        //   -> List, kNonNullable, 1 argument
        "dart:core", "List", "1", "1",
        //   -> -> String, kNonNullable, no arguments
        "dart:core", "String", "1", "0"
      ]),
      <ParsedType>[
        // String
        new ParsedType("dart:core", "_OneByteString", 1),
        // int
        new ParsedType("dart:core", "_Smi", 1),
        // List<String>
        new ParsedType("dart:core", "_GrowableList", 1)
          ..arguments!.addAll([
            new ParsedType("dart:core", "String", 1),
          ]),
        // Bar
        new ParsedType("file://wherever/t.dart", "Bar", 1),
        // null value
        new ParsedType.nullType(),
        // HashMap<Map<int, List<int>>, List<String>>
        new ParsedType("dart:collection", "_InternalLinkedHashMap", 1)
          ..arguments!.addAll([
            new ParsedType("dart:core", "Map", 1)
              ..arguments!.addAll([
                new ParsedType("dart:core", "int", 1),
                new ParsedType("dart:core", "List", 1)
                  ..arguments!.addAll([
                    new ParsedType("dart:core", "int", 1),
                  ]),
              ]),
            new ParsedType("dart:core", "List", 1)
              ..arguments!.addAll([
                new ParsedType("dart:core", "String", 1),
              ]),
          ]),
      ]);
}
