// Copyright (c) 2017, 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 'dart:async';

import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/computer/imported_elements_computer.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../abstract_context.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ImportElementsComputerTest);
  });
}

@reflectiveTest
class ImportElementsComputerTest extends AbstractContextTest {
  String sourcePath;

  setUp() {
    super.setUp();
    sourcePath = convertPath('/home/test/lib/test.dart');
  }

  test_dartAsync_noPrefix() async {
    String selection = "Future<String> f = null;";
    String content = """
import 'dart:async';
printer() {
  $selection
  print(await f);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(2));
    ImportedElements elements1 = elementsList[0];
    ImportedElements elements2 = elementsList[1];
    ImportedElements asyncElements;
    ImportedElements coreElements;
    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
      coreElements = elements1;
      asyncElements = elements2;
    } else {
      coreElements = elements2;
      asyncElements = elements1;
    }
    expect(coreElements, isNotNull);
    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
    expect(coreElements.prefix, '');
    expect(coreElements.elements, unorderedEquals(['String']));

    expect(asyncElements, isNotNull);
    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
    expect(asyncElements.prefix, '');
    expect(asyncElements.elements, unorderedEquals(['Future']));
  }

  test_dartAsync_prefix() async {
    String selection = "a.Future<String> f = null;";
    String content = """
import 'dart:async' as a;
printer() {
  $selection
  print(await f);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(2));
    ImportedElements elements1 = elementsList[0];
    ImportedElements elements2 = elementsList[1];
    ImportedElements asyncElements;
    ImportedElements coreElements;
    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
      coreElements = elements1;
      asyncElements = elements2;
    } else {
      coreElements = elements2;
      asyncElements = elements1;
    }
    expect(coreElements, isNotNull);
    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
    expect(coreElements.prefix, '');
    expect(coreElements.elements, unorderedEquals(['String']));

    expect(asyncElements, isNotNull);
    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
    expect(asyncElements.prefix, 'a');
    expect(asyncElements.elements, unorderedEquals(['Future']));
  }

  test_dartCore_noPrefix() async {
    String selection = "String s = '';";
    String content = """
blankLine() {
  $selection
  print(s);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['String']));
  }

  test_dartCore_prefix() async {
    String selection = "core.String s = '';";
    String content = """
import 'dart:core' as core;
blankLine() {
  $selection
  print(s);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
    expect(elements.prefix, 'core');
    expect(elements.elements, unorderedEquals(['String']));
  }

  test_dartMath_noPrefix() async {
    String selection = "new Random();";
    String content = """
import 'dart:math';
bool randomBool() {
  Random r = $selection
  return r.nextBool();
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/sdk/lib/math/math.dart'));
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['Random']));
  }

  test_multiple() async {
    String selection = r'''
main() {
  Random r = new Random();
  String s = r.nextBool().toString();
  print(s);
}
''';
    String content = '''
import 'dart:math';

$selection
''';
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(2));

    ImportedElements mathElements = elementsList[0];
    expect(mathElements, isNotNull);
    expect(mathElements.path, convertPath('/sdk/lib/math/math.dart'));
    expect(mathElements.prefix, '');
    expect(mathElements.elements, unorderedEquals(['Random']));

    ImportedElements coreElements = elementsList[1];
    expect(coreElements, isNotNull);
    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
    expect(coreElements.prefix, '');
    expect(coreElements.elements, unorderedEquals(['String', 'print']));
  }

  test_none_comment() async {
    String selection = 'comment';
    String content = """
// Method $selection.
blankLine() {
  print('');
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(0));
  }

  test_none_constructorDeclarationReturnType() async {
    String selection = r'''
class A {
  A();
  A.named();
}
''';
    String content = """
$selection
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(0));
  }

  test_none_partialNames() async {
    String selection = 'x + y';
    String content = """
plusThree(int xx) {
  int yy = 2;
  print(x${selection}y);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(0));
  }

  test_none_wholeNames() async {
    String selection = 'x + y + 1';
    String content = """
plusThree(int x) {
  int y = 2;
  print($selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(0));
  }

  test_package_multipleInSame() async {
    addPackageFile('foo', 'foo.dart', '''
class A {
  static String a = '';
}
class B {
  static String b = '';
}
''');
    String selection = "A.a + B.b";
    String content = """
import 'package:foo/foo.dart';
blankLine() {
  print($selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['A', 'B']));
  }

  test_package_noPrefix() async {
    addPackageFile('foo', 'foo.dart', '''
class Foo {
  static String first = '';
}
''');
    String selection = "Foo.first";
    String content = """
import 'package:foo/foo.dart';
blankLine() {
  print($selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['Foo']));
  }

  test_package_prefix_selected() async {
    addPackageFile('foo', 'foo.dart', '''
class Foo {
  static String first = '';
}
''');
    String selection = "f.Foo.first";
    String content = """
import 'package:foo/foo.dart' as f;
blankLine() {
  print($selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(elements.prefix, 'f');
    expect(elements.elements, unorderedEquals(['Foo']));
  }

  test_package_prefix_unselected() async {
    addPackageFile('foo', 'foo.dart', '''
class Foo {
  static String first = '';
}
''');
    String selection = "Foo.first";
    String content = """
import 'package:foo/foo.dart' as f;
blankLine() {
  print(f.$selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['Foo']));
  }

  test_package_prefixedAndNot() async {
    addPackageFile('foo', 'foo.dart', '''
class Foo {
  static String first = '';
  static String second = '';
}
''');
    String selection = "f.Foo.first + Foo.second";
    String content = """
import 'package:foo/foo.dart';
import 'package:foo/foo.dart' as f;
blankLine() {
  print($selection);
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);

    expect(elementsList, hasLength(2));
    ImportedElements elements1 = elementsList[0];
    ImportedElements elements2 = elementsList[1];
    ImportedElements notPrefixedElements;
    ImportedElements prefixedElements;
    if (elements1.prefix == '') {
      prefixedElements = elements2;
      notPrefixedElements = elements1;
    } else {
      prefixedElements = elements1;
      notPrefixedElements = elements2;
    }

    expect(notPrefixedElements, isNotNull);
    expect(
        notPrefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(notPrefixedElements.prefix, '');
    expect(notPrefixedElements.elements, unorderedEquals(['Foo']));

    expect(prefixedElements, isNotNull);
    expect(prefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
    expect(prefixedElements.prefix, 'f');
    expect(prefixedElements.elements, unorderedEquals(['Foo']));
  }

  test_self() async {
    String selection = 'A parent;';
    String content = """
class A {
  $selection
}
""";
    List<ImportedElements> elementsList = await _computeElements(
        content, content.indexOf(selection), selection.length);
    expect(elementsList, hasLength(1));
    ImportedElements elements = elementsList[0];
    expect(elements, isNotNull);
    expect(elements.path, sourcePath);
    expect(elements.prefix, '');
    expect(elements.elements, unorderedEquals(['A']));
  }

  Future<List<ImportedElements>> _computeElements(
      String sourceContent, int offset, int length) async {
    newFile(sourcePath, content: sourceContent);
    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
    ImportedElementsComputer computer =
        new ImportedElementsComputer(result.unit, offset, length);
    return computer.compute();
  }
}
