// 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/meta_model.dart';
import 'matchers.dart';

void main() {
  group('meta model reader', () {
    test('reads an interface', () {
      final input = {
        "structures": [
          {
            "name": "SomeOptions",
            "properties": [
              {
                "name": "options",
                "type": {
                  "kind": "array",
                  "element": {"kind": "reference", "name": "string"}
                },
                "optional": true,
                "documentation": "Options used by something.",
              }
            ],
            "documentation": "Some options."
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.name, equals('SomeOptions'));
      expect(interface.comment, equals('Some options.'));
      expect(interface.baseTypes, hasLength(0));
      expect(interface.members, hasLength(1));
      expect(interface.members[0], const TypeMatcher<Field>());
      final field = interface.members[0] as Field;
      expect(field.name, equals('options'));
      expect(field.comment, equals('''Options used by something.'''));
      expect(field.allowsNull, isFalse);
      expect(field.allowsUndefined, isTrue);
      expect(field.type, isArrayOf(isSimpleType('string')));
    });

    test('reads an interface with a field with an inline/unnamed type', () {
      final input = {
        "structures": [
          {
            "name": "Capabilities",
            "properties": [
              {
                "name": "textDoc",
                "type": {
                  "kind": "literal",
                  "value": {
                    "properties": [
                      {
                        "name": "deprecated",
                        "type": {"kind": "base", "name": "bool"},
                        "optional": true,
                      }
                    ]
                  }
                },
                "optional": true,
              }
            ],
            "documentation": "Some options."
          },
        ],
      };
      final output = readModel(input);
      // Length is two because we'll fabricate the type of textDoc.
      expect(output, hasLength(2));

      // Check there was a full fabricated interface for this type.
      expect(output[0], const TypeMatcher<Interface>());
      var interface = output[0] as Interface;
      expect(interface.name, equals('CapabilitiesTextDoc'));
      expect(interface.members, hasLength(1));
      expect(interface.members[0], const TypeMatcher<Field>());
      var field = interface.members[0] as Field;
      expect(field.name, equals('deprecated'));
      expect(field.allowsNull, isFalse);
      expect(field.allowsUndefined, isTrue);
      expect(field.type, isSimpleType('bool'));
      expect(field.allowsUndefined, isTrue);

      expect(output[1], const TypeMatcher<Interface>());
      interface = output[1] as Interface;
      expect(interface.name, equals('Capabilities'));
      expect(interface.members, hasLength(1));
      expect(interface.members[0], const TypeMatcher<Field>());
      field = interface.members[0] as Field;
      expect(field.name, equals('textDoc'));
      expect(field.allowsNull, isFalse);
      expect(field.type, isSimpleType('CapabilitiesTextDoc'));
    });

    test('reads an interface with multiple fields', () {
      final input = {
        "structures": [
          {
            "name": "SomeOptions",
            "properties": [
              {
                "name": "options0",
                "type": {"kind": "reference", "name": "LSPAny"},
                "documentation": "Options0 used by something.",
              },
              {
                "name": "options1",
                "type": {"kind": "reference", "name": "LSPAny"},
                "documentation": "Options1 used by something.",
              }
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.members, hasLength(2));
      for (var i in [0, 1]) {
        expect(interface.members[i], const TypeMatcher<Field>());
        final field = interface.members[i] as Field;
        expect(field.name, equals('options$i'));
        expect(field.comment, equals('''Options$i used by something.'''));
      }
    });

    test('reads an interface with a map into a MapType', () {
      final input = {
        "structures": [
          {
            "name": "WorkspaceEdit",
            "properties": [
              {
                "name": "changes",
                "type": {
                  "kind": "map",
                  "key": {"kind": "base", "name": "string"},
                  "value": {
                    "kind": "array",
                    "element": {"kind": "reference", "name": "TextEdit"}
                  },
                },
              }
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.members, hasLength(1));
      final field = interface.members.first as Field;
      expect(field, const TypeMatcher<Field>());
      expect(field.name, equals('changes'));
      expect(field.type,
          isMapOf(isSimpleType('string'), isArrayOf(isSimpleType('TextEdit'))));
    });

    test('flags nullable undefined values', () {
      final input = {
        "structures": [
          {
            "name": "A",
            "properties": [
              {
                "name": "canBeBoth",
                "type": {
                  "kind": "or",
                  "items": [
                    {"kind": "base", "name": "string"},
                    {"kind": "base", "name": "null"}
                  ]
                },
                "optional": true,
              },
              {
                "name": "canBeNeither",
                "type": {"kind": "base", "name": "string"},
              },
              {
                "name": "canBeNull",
                "type": {
                  "kind": "or",
                  "items": [
                    {"kind": "base", "name": "string"},
                    {"kind": "base", "name": "null"}
                  ]
                },
              },
              {
                "name": "canBeUndefined",
                "type": {"kind": "base", "name": "string"},
                "optional": true,
              },
            ],
          },
        ],
      };
      final output = readModel(input);
      final interface = output[0] as Interface;
      expect(interface.members, hasLength(4));
      for (var m in interface.members) {
        expect(m, const TypeMatcher<Field>());
      }
      final canBeBoth = interface.members[0] as Field,
          canBeNeither = interface.members[1] as Field,
          canBeNull = interface.members[2] as Field,
          canBeUndefined = interface.members[3] as Field;
      expect(canBeNeither.allowsNull, isFalse);
      expect(canBeNeither.allowsUndefined, isFalse);
      expect(canBeNull.allowsNull, isTrue);
      expect(canBeNull.allowsUndefined, isFalse);
      expect(canBeUndefined.allowsNull, isFalse);
      expect(canBeUndefined.allowsUndefined, isTrue);
      expect(canBeBoth.allowsNull, isTrue);
      expect(canBeBoth.allowsUndefined, isTrue);
    });

    test('formats comments correctly', () {
      final input = {
        "structures": [
          {
            "name": "A",
            "properties": [],
            "documentation": r"""
Describes the what this class in lots of words that wrap onto multiple lines that will need re-wrapping to format nicely when converted into Dart.

Blank lines should remain in-tact, as should:
  - Indented
  - Things

Some docs have:
- List items that are not indented

Sometimes after a blank line we'll have a note.

*Note* that something.""",
          },
        ],
      };
      final output = readModel(input);
      final interface = output[0] as Interface;
      expect(interface.comment, equals('''
Describes the what this class in lots of words that wrap onto multiple lines that will need re-wrapping to format nicely when converted into Dart.

Blank lines should remain in-tact, as should:
  - Indented
  - Things

Some docs have:
- List items that are not indented

Sometimes after a blank line we'll have a note.

*Note* that something.'''));
    });

    test('reads a type alias', () {
      final input = {
        "typeAliases": [
          {
            "name": "DocumentSelector",
            "type": {
              "kind": "array",
              "element": {"kind": "reference", "name": "DocumentFilter"}
            },
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<TypeAlias>());
      final typeAlias = output[0] as TypeAlias;
      expect(typeAlias.name, equals('DocumentSelector'));
      expect(typeAlias.baseType, isArrayOf(isSimpleType('DocumentFilter')));
    });

    test('reads a type alias that is a union of unnamed types', () {
      final input = {
        "typeAliases": [
          {
            "name": "NameOrLength",
            "type": {
              "kind": "or",
              "items": [
                {
                  "kind": "literal",
                  "value": {
                    "properties": [
                      {
                        "name": "name",
                        "type": {"kind": "base", "name": "string"}
                      },
                    ]
                  },
                },
                {
                  "kind": "literal",
                  "value": {
                    "properties": [
                      {
                        "name": "length",
                        "type": {"kind": "base", "name": "number"}
                      },
                    ]
                  },
                },
              ]
            },
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(3));

      // Results should be the two inline interfaces followed by the type alias.

      expect(output[0], const TypeMatcher<Interface>());
      final interface1 = output[0] as Interface;
      expect(interface1.name, equals('NameOrLength1'));
      expect(interface1.members, hasLength(1));
      expect(interface1.members[0].name, equals('name'));

      expect(output[1], const TypeMatcher<Interface>());
      final interface2 = output[1] as Interface;
      expect(interface2.name, equals('NameOrLength2'));
      expect(interface2.members, hasLength(1));
      expect(interface2.members[0].name, equals('length'));

      expect(output[2], const TypeMatcher<TypeAlias>());
      final typeAlias = output[2] as TypeAlias;
      expect(typeAlias.name, equals('NameOrLength'));
      expect(typeAlias.baseType, const TypeMatcher<UnionType>());

      // The type alias should be a union of the two types above.
      final union = typeAlias.baseType as UnionType;
      expect(union.types, hasLength(2));
      expect(union.types[0], isSimpleType(interface1.name));
      expect(union.types[1], isSimpleType(interface2.name));
    });

    test('reads a namespace of constants', () {
      final input = {
        "enumerations": [
          {
            "name": "ResourceOperationKind",
            "type": {"kind": "base", "name": "string"},
            "values": [
              {
                "name": "Create",
                "value": "create",
                "documentation": "Supports creating new files and folders.",
              },
              {
                "name": "Delete",
                "value": "delete",
                "documentation":
                    "Supports deleting existing files and folders.",
              },
              {
                "name": "Rename",
                "value": "rename",
                "documentation":
                    "Supports renaming existing files and folders.",
              },
            ],
          },
        ]
      };
      final output = readModel(input);
      expect(output, hasLength(1));

      expect(output[0], const TypeMatcher<LspEnum>());
      final namespace = output[0] as LspEnum;
      expect(namespace.members, hasLength(3));
      for (var m in namespace.members) {
        expect(m, const TypeMatcher<Constant>());
      }
      final create = namespace.members[0] as Constant,
          delete = namespace.members[1] as Constant,
          rename = namespace.members[2] as Constant;
      expect(create.name, equals('Create'));
      expect(create.type, isSimpleType('ResourceOperationKind'));
      expect(
          create.comment, equals('Supports creating new files and folders.'));
      expect(rename.name, equals('Rename'));
      expect(rename.type, isSimpleType('ResourceOperationKind'));
      expect(rename.comment,
          equals('Supports renaming existing files and folders.'));
      expect(delete.name, equals('Delete'));
      expect(delete.type, isSimpleType('ResourceOperationKind'));
      expect(delete.comment,
          equals('Supports deleting existing files and folders.'));
    });

    test('reads a tuple in an array', () {
      final input = {
        "structures": [
          {
            "name": "SomeInformation",
            "properties": [
              {
                "name": "label",
                "type": {
                  "kind": "or",
                  "items": [
                    {"kind": "base", "name": "string"},
                    {
                      "kind": "tuple",
                      "items": [
                        {"kind": "base", "name": "number"},
                        {"kind": "base", "name": "number"}
                      ]
                    }
                  ]
                },
              },
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.members, hasLength(1));
      final field = interface.members.first as Field;
      expect(field, const TypeMatcher<Field>());
      expect(field.name, equals('label'));
      expect(field.type, const TypeMatcher<UnionType>());
      final union = field.type as UnionType;
      expect(union.types, hasLength(2));
      expect(union.types[0], isArrayOf(isSimpleType('number')));
      expect(union.types[1], isSimpleType('string'));
    });

    test('reads an union including LSPObject into a single type', () {
      final input = {
        "structures": [
          {
            "name": "SomeInformation",
            "properties": [
              {
                "name": "label",
                "type": {
                  "kind": "or",
                  "items": [
                    {"kind": "base", "name": "string"},
                    {"kind": "base", "name": "LSPObject"},
                  ]
                },
              },
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.members, hasLength(1));
      final field = interface.members.first as Field;
      expect(field, const TypeMatcher<Field>());
      expect(field.name, equals('label'));
      expect(field.type, isSimpleType('LSPObject'));
    });

    test('reads literal string values', () {
      final input = {
        "structures": [
          {
            "name": "MyType",
            "properties": [
              {
                "name": "kind",
                "type": {"kind": "stringLiteral", "value": "one"},
              },
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.name, equals('MyType'));
      expect(interface.members, hasLength(1));
      expect(interface.members[0], const TypeMatcher<Field>());
      final field = interface.members[0] as Field;
      expect(field.name, equals('kind'));
      expect(field.allowsNull, isFalse);
      expect(field.allowsUndefined, isFalse);
      expect(field.type, isLiteralOf(isSimpleType('string'), "'one'"));
    });

    test('reads literal union values', () {
      final input = {
        "structures": [
          {
            "name": "MyType",
            "properties": [
              {
                "name": "kind",
                "type": {
                  "kind": "or",
                  "items": [
                    {"kind": "stringLiteral", "value": "one"},
                    {"kind": "stringLiteral", "value": "two"},
                  ]
                },
              },
            ],
          },
        ],
      };
      final output = readModel(input);
      expect(output, hasLength(1));
      expect(output[0], const TypeMatcher<Interface>());
      final interface = output[0] as Interface;
      expect(interface.name, equals('MyType'));
      expect(interface.members, hasLength(1));
      expect(interface.members[0], const TypeMatcher<Field>());
      final field = interface.members[0] as Field;
      expect(field.name, equals('kind'));
      expect(field.allowsNull, isFalse);
      expect(field.allowsUndefined, isFalse);
      expect(field.type, const TypeMatcher<LiteralUnionType>());
      final union = field.type as LiteralUnionType;
      expect(union.types, hasLength(2));
      expect(union.types[0], isLiteralOf(isSimpleType('string'), "'one'"));
      expect(union.types[1], isLiteralOf(isSimpleType('string'), "'two'"));
    });
  });
}

List<LspEntity> readModel(Map<String, dynamic> model) =>
    LspMetaModelCleaner().cleanTypes(LspMetaModelReader().readMap(model).types);
