// Copyright (c) 2021, 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.

// @dart = 2.9

import 'package:dev_compiler/src/kernel/module_symbols.dart';
import 'package:test/test.dart';

const source = '''
import 'dart:core';                  // pos:1
import 'package:lib2/lib2.dart;      // pos:2
MyClass g;                           // pos:10
class MyClass<T>                     // pos:20
  implements MyInterface
  extends Object {

  static final int f;                // pos:30
  int foo(int x, [int m], {int n}) { // pos:40
    int y = 0;                       // pos:50
    {                                // pos:60
      int z = 0;                     // pos:70
    }                                // pos:80
  }                                  // pos:90
}                                    // pos:100
''';

void main() {
  var intType = ClassSymbol(name: 'int', localId: 'int', scopeId: 'dart:core');

  var libraryId = 'lib1';
  var main = Script(
      uri: 'package:example/hello_world.dart',
      localId: '1',
      libraryId: libraryId);
  var myClassId = 'MyClass<T>';
  var fooId = 'foo';
  var scopeId = '1';

  var g = VariableSymbol(
    name: 'g',
    kind: VariableSymbolKind.global,
    localId: '_g',
    scopeId: libraryId,
    typeId: myClassId,
    location: SourceLocation(scriptId: main.id, tokenPos: 10, endTokenPos: 15),
  );

  var x = VariableSymbol(
    name: 'x',
    kind: VariableSymbolKind.formal,
    localId: '_x',
    scopeId: fooId,
    typeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 40, endTokenPos: 42),
  );

  var n = VariableSymbol(
    name: 'n',
    kind: VariableSymbolKind.formal,
    localId: '_n',
    scopeId: fooId,
    typeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 43, endTokenPos: 45),
  );

  var m = VariableSymbol(
    name: 'm',
    kind: VariableSymbolKind.formal,
    localId: '_m',
    scopeId: fooId,
    typeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 45, endTokenPos: 47),
  );

  var y = VariableSymbol(
    name: 'y',
    kind: VariableSymbolKind.local,
    localId: '_y',
    scopeId: fooId,
    typeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 50, endTokenPos: 55),
  );

  var z = VariableSymbol(
    name: 'z',
    kind: VariableSymbolKind.local,
    localId: '_z',
    scopeId: scopeId,
    typeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 70, endTokenPos: 75),
  );

  var f = VariableSymbol(
    name: 'f',
    kind: VariableSymbolKind.field,
    localId: '_f',
    scopeId: fooId,
    typeId: intType.id,
    isStatic: true,
    isFinal: true,
    isConst: true,
    location: SourceLocation(scriptId: main.id, tokenPos: 30, endTokenPos: 35),
  );

  var scope = ScopeSymbol(
    localId: scopeId,
    scopeId: fooId,
    variableIds: [z.id],
    scopeIds: [],
    location: SourceLocation(scriptId: main.id, tokenPos: 60, endTokenPos: 80),
  );

  var funType = FunctionTypeSymbol(
    localId: '($myClassId, int) => int',
    scopeId: libraryId,
    typeParameters: {'T': 'A'},
    parameterTypeIds: [intType.id],
    optionalParameterTypeIds: [m.id],
    namedParameterTypeIds: {n.name: n.id},
    returnTypeId: intType.id,
    location: SourceLocation(scriptId: main.id, tokenPos: 40, endTokenPos: 45),
  );

  var foo = FunctionSymbol(
    name: 'foo',
    localId: fooId,
    scopeId: myClassId,
    typeId: funType.id,
    isStatic: false,
    isConst: false,
    variableIds: [x.id, n.id, y.id],
    scopeIds: [scope.id],
    location: SourceLocation(scriptId: main.id, tokenPos: 40, endTokenPos: 90),
  );

  var myClass = ClassSymbol(
    name: 'MyClass',
    localId: myClassId,
    scopeId: libraryId,
    isAbstract: false,
    isConst: false,
    superClassId: 'dart:core|Object',
    interfaceIds: ['lib2|MyInterface'],
    variableIds: [f.id],
    scopeIds: [foo.id],
    typeParameters: {'T': 'B'},
    location: SourceLocation(scriptId: main.id, tokenPos: 20, endTokenPos: 100),
  );

  var library = LibrarySymbol(
    name: 'package:example/hello_world.dart',
    uri: 'package:example/hello_world.dart',
    dependencies: [
      LibrarySymbolDependency(isImport: true, targetId: 'dart:core'),
      LibrarySymbolDependency(isImport: true, targetId: 'lib2'),
    ],
    scriptIds: [main.id],
    variableIds: [g.id], // global variables
    scopeIds: [myClass.id], // global functions and classes
  );

  var info = ModuleSymbols(
    version: ModuleSymbols.current.version,
    moduleName: 'package:example/hello_world.dart',
    libraries: [library],
    scripts: [main],
    classes: [myClass],
    functionTypes: [funType],
    functions: [foo],
    scopes: [scope],
    variables: [x, y, z, n, g, f],
  );

  test('Read and write symbols', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);
    var write = read.toJson();

    expect(json, equals(write));
  });

  test('Write and read libraries', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.libraries.length, 1);
    expect(read.libraries[0], matchesLibrary(library));
  });

  test('Write and read classes', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.classes.length, 1);
    expect(read.classes[0], matchesClass(myClass));
  });

  test('Write and read function types', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.functionTypes.length, 1);
    expect(read.functionTypes[0], matchesFunctionType(funType));
  });

  test('Write and read functions', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.functions.length, 1);
    expect(read.functions[0], matchesFunction(foo));
  });

  test('Write and read scripts', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.scripts.length, 1);
    expect(read.scripts[0], matchesScript(main));
  });

  test('Write and read scopes', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.scopes.length, 1);
    expect(read.scopes[0], matchesScope(scope));
  });

  test('Write and read variables', () {
    var json = info.toJson();
    var read = ModuleSymbols.fromJson(json);

    expect(read.variables.length, 6);
    expect(read.variables[0], matchesVariable(x));
    expect(read.variables[1], matchesVariable(y));
    expect(read.variables[2], matchesVariable(z));
    expect(read.variables[3], matchesVariable(n));
    expect(read.variables[4], matchesVariable(g));
    expect(read.variables[5], matchesVariable(f));
  });

  test('Read supported version', () {
    var version = SemanticVersion(0, 2, 3).version;
    var json = ModuleSymbols(version: version).toJson();

    expect(ModuleSymbols.fromJson(json).version, equals(version));
  });

  test('Read unsupported version', () {
    var version = SemanticVersion(1, 2, 3).version;
    var json = ModuleSymbols(version: version).toJson();

    expect(() => ModuleSymbols.fromJson(json), throwsException);
  });
}

TypeMatcher<SourceLocation> matchesLocation(SourceLocation other) =>
    isA<SourceLocation>()
        .having((loc) => loc.scriptId, 'scriptId', other.scriptId)
        .having((loc) => loc.tokenPos, 'tokenPos', other.tokenPos)
        .having((loc) => loc.endTokenPos, 'endTokenPos', other.endTokenPos);

TypeMatcher<LibrarySymbolDependency> matchesDependency(
        LibrarySymbolDependency other) =>
    isA<LibrarySymbolDependency>()
        .having((dep) => dep.isDeferred, 'isDeferred', other.isDeferred)
        .having((dep) => dep.isImport, 'isImport', other.isImport)
        .having((dep) => dep.prefix, 'prefix', other.prefix)
        .having((dep) => dep.targetId, 'targetId', other.targetId);

Iterable<Matcher> matchDependencies(List<LibrarySymbolDependency> list) =>
    [for (var e in list) matchesDependency(e)];

TypeMatcher<LibrarySymbol> matchesLibrary(LibrarySymbol other) =>
    isA<LibrarySymbol>()
        .having((lib) => lib.name, 'name', other.name)
        .having((lib) => lib.uri, 'uri', other.uri)
        .having((lib) => lib.id, 'id', other.id)
        .having((lib) => lib.scriptIds, 'scriptIds', other.scriptIds)
        .having((lib) => lib.scopeIds, 'scopeIds', other.scopeIds)
        .having((lib) => lib.scopeIds, 'scopeIds', other.scopeIds)
        .having((lib) => lib.variableIds, 'variableIds', other.variableIds)
        .having((lib) => lib.location, 'location', isNull)
        .having((lib) => lib.dependencies, 'dependencies',
            matchDependencies(other.dependencies));

TypeMatcher<ClassSymbol> matchesClass(ClassSymbol other) => isA<ClassSymbol>()
    .having((cls) => cls.name, 'name', other.name)
    .having((cls) => cls.id, 'id', other.id)
    .having((fun) => fun.localId, 'localId', other.localId)
    .having((fun) => fun.scopeId, 'scopeId', other.scopeId)
    .having((cls) => cls.superClassId, 'superClassId', other.superClassId)
    .having((cls) => cls.typeParameters, 'typeParameters', other.typeParameters)
    .having((cls) => cls.functionIds, 'functionIds', other.functionIds)
    .having((cls) => cls.interfaceIds, 'interfaceIds', other.interfaceIds)
    .having((cls) => cls.isAbstract, 'isAbstract', other.isAbstract)
    .having((cls) => cls.isConst, 'isConst', other.isConst)
    .having((cls) => cls.libraryId, 'libraryId', other.libraryId)
    .having((cls) => cls.scopeIds, 'scopeIds', other.scopeIds)
    .having((cls) => cls.variableIds, 'variableIds', other.variableIds)
    .having((cls) => cls.location, 'location', matchesLocation(other.location));

TypeMatcher<FunctionTypeSymbol> matchesFunctionType(FunctionTypeSymbol other) =>
    isA<FunctionTypeSymbol>()
        .having((fun) => fun.id, 'id', other.id)
        .having((fun) => fun.localId, 'localId', other.localId)
        .having((fun) => fun.scopeId, 'scopeId', other.scopeId)
        .having(
            (fun) => fun.typeParameters, 'typeParameters', other.typeParameters)
        .having((fun) => fun.parameterTypeIds, 'parameterTypeIds',
            other.parameterTypeIds)
        .having((fun) => fun.optionalParameterTypeIds,
            'optionalParameterTypeIds', other.optionalParameterTypeIds)
        .having((fun) => fun.namedParameterTypeIds, 'namedParameterTypeIds',
            other.namedParameterTypeIds)
        .having(
            (fun) => fun.location, 'location', matchesLocation(other.location));

TypeMatcher<FunctionSymbol> matchesFunction(FunctionSymbol other) =>
    isA<FunctionSymbol>()
        .having((fun) => fun.name, 'name', other.name)
        .having((fun) => fun.localId, 'localId', other.localId)
        .having((fun) => fun.scopeId, 'scopeId', other.scopeId)
        .having((fun) => fun.id, 'id', other.id)
        .having((fun) => fun.isConst, 'isConst', other.isConst)
        .having((fun) => fun.isStatic, 'isStatic', other.isStatic)
        .having((fun) => fun.typeId, 'typeId', other.typeId)
        .having((fun) => fun.scopeIds, 'scopeIds', other.scopeIds)
        .having((fun) => fun.variableIds, 'variableIds', other.variableIds)
        .having(
            (fun) => fun.location, 'location', matchesLocation(other.location));

TypeMatcher<ScopeSymbol> matchesScope(ScopeSymbol other) => isA<ScopeSymbol>()
    .having((scope) => scope.localId, 'localId', other.localId)
    .having((scope) => scope.scopeId, 'scopeId', other.scopeId)
    .having((scope) => scope.id, 'id', other.id)
    .having((scope) => scope.scopeIds, 'scopeIds', other.scopeIds)
    .having((scope) => scope.variableIds, 'variableIds', other.variableIds)
    .having(
        (scope) => scope.location, 'location', matchesLocation(other.location));

TypeMatcher<VariableSymbol> matchesVariable(VariableSymbol other) =>
    isA<VariableSymbol>()
        .having((variable) => variable.name, 'name', other.name)
        .having((variable) => variable.localId, 'localId', other.localId)
        .having((variable) => variable.scopeId, 'scopeId', other.scopeId)
        .having((variable) => variable.id, 'id', other.id)
        .having((variable) => variable.isConst, 'isConst', other.isConst)
        .having((variable) => variable.isStatic, 'isStatic', other.isStatic)
        .having((variable) => variable.isFinal, 'isFinal', other.isFinal)
        .having((variable) => variable.location, 'location',
            matchesLocation(other.location));

TypeMatcher<Script> matchesScript(Script other) => isA<Script>()
    .having((script) => script.uri, 'uri', other.uri)
    .having((script) => script.id, 'id', other.id);
