// Copyright (c) 2014, 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:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:path/path.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'completion_contributor_util.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(UriContributorTest);
    defineReflectiveTests(UriContributorWindowsTest);
  });
}

@reflectiveTest
class UriContributorTest extends DartCompletionContributorTest {
  String get testPackageTestPath => '$testPackageRootPath/test';

  @override
  DartCompletionContributor createContributor() {
    return UriContributor();
  }

  Future<void> test_after_import() async {
    addTestSource('import "p"^');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_after_import_raw() async {
    addTestSource('import r"p"^');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_before_import() async {
    addTestSource('import ^"p"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_before_import_raw() async {
    addTestSource('import ^r"p"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_before_import_raw2() async {
    addTestSource('import r^"p"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_export_package2() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart', content: 'library foo;');
    newFile('$fooRootPath/lib/baz/too.dart', content: 'library too;');
    newFile('$barRootPath/lib/bar.dart', content: 'library bar;');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('export "package:foo/baz/^" import');
    await computeSuggestions();
    assertSuggest('package:foo/baz/too.dart',
        csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_export_package2_off() async {
    try {
      UriContributor.suggestFilePaths = false;

      var fooRootPath = '$workspaceRootPath/foo';
      var barRootPath = '$workspaceRootPath/bar';
      newFile('$fooRootPath/lib/foo.dart', content: 'library foo;');
      newFile('$fooRootPath/lib/baz/too.dart', content: 'library too;');
      newFile('$barRootPath/lib/bar.dart', content: 'library bar;');

      writeTestPackageConfig(
        config: PackageConfigFileBuilder()
          ..add(name: 'foo', rootPath: fooRootPath)
          ..add(name: 'bar', rootPath: barRootPath),
      );

      addTestSource('export "package:foo/baz/^" import');
      await computeSuggestions();
      assertNotSuggested('package:foo/baz/too.dart');
    } finally {
      UriContributor.suggestFilePaths = true;
    }
  }

  Future<void> test_import() async {
    addTestSource('import "^"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import2() async {
    addTestSource('import "^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import3() async {
    addTestSource('import "^ import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 7);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_dart() async {
    addTestSource('import "d^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('dart:_internal');
    assertSuggest('dart:async', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('dart:math', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_dart2() async {
    addTestSource('import "dart:async"; import "d^"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('dart:core', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('dart:_internal');
    assertSuggest('dart:async', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('dart:math', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_file() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "..^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 2);
    expect(replacementLength, 2);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file2_off() async {
    try {
      UriContributor.suggestFilePaths = false;

      testFile = convertPath('$testPackageRootPath/test.dart');
      newFile('$testPackageRootPath/other.dart');
      newFile('$testPackageRootPath/foo/bar.dart');
      newFile('$workspaceRootPath/blat.dart');

      addTestSource('import "..^" import');
      await computeSuggestions();
      expect(replacementOffset, completionOffset - 2);
      expect(replacementLength, 2);
      assertNotSuggested('completion.dart');
      assertNotSuggested('other.dart');
      assertNotSuggested('foo');
      assertNotSuggested('foo/');
      assertNotSuggested('foo/bar.dart');
      assertNotSuggested('../blat.dart');
    } finally {
      UriContributor.suggestFilePaths = true;
    }
  }

  Future<void> test_import_file_child() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "foo/^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertSuggest('foo/bar.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file_outside_lib() async {
    newFile('$testPackageLibPath/other.dart');
    newFile('$testPackageLibPath/foo/bar.dart');
    newFile('$testPackageRootPath/blat.dart');
    newFile('$testPackageRootPath/bin/boo.dart');

    addTestSource('import "../^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 3);
    expect(replacementLength, 3);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../bin');
    assertNotSuggested('../bin/');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file_parent() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');
    newFile('$workspaceRootPath/aaa/boo.dart');

    addTestSource('import "../^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 3);
    expect(replacementLength, 3);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('../aaa/', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_file_parent2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "../b^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_no_dot_folders() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFolder('$testPackageRootPath/.foo');

    addTestSource('import "package:^";');
    await computeSuggestions();
    assertNotSuggested('.foo/');
  }

  Future<void> test_import_only_dart_files() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/analysis_options.yaml');

    addTestSource('import "package:^";');
    await computeSuggestions();
    assertNotSuggested('analysis_options.yaml');
  }

  Future<void> test_import_package() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart');
    newFile('$fooRootPath/lib/baz/too.dart');
    newFile('$barRootPath/lib/bar.dart');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import "p^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/foo.dart',
        csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/baz/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('package:foo/baz/too.dart');
    assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:bar/bar.dart',
        csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_package2() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart');
    newFile('$fooRootPath/lib/baz/too.dart');
    newFile('$barRootPath/lib/bar.dart');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import "package:foo/baz/^" import');
    await computeSuggestions();
    assertSuggest('package:foo/baz/too.dart',
        csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_package2_off() async {
    try {
      UriContributor.suggestFilePaths = false;

      var fooRootPath = '$workspaceRootPath/foo';
      var barRootPath = '$workspaceRootPath/bar';
      newFile('$fooRootPath/lib/foo.dart');
      newFile('$fooRootPath/lib/baz/too.dart');
      newFile('$barRootPath/lib/bar.dart');

      writeTestPackageConfig(
        config: PackageConfigFileBuilder()
          ..add(name: 'foo', rootPath: fooRootPath)
          ..add(name: 'bar', rootPath: barRootPath),
      );

      addTestSource('import "package:foo/baz/^" import');
      await computeSuggestions();
      assertNotSuggested('package:foo/baz/too.dart');
    } finally {
      UriContributor.suggestFilePaths = true;
    }
  }

  Future<void> test_import_package2_raw() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart');
    newFile('$fooRootPath/lib/baz/too.dart');
    newFile('$barRootPath/lib/bar.dart');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import r"package:foo/baz/^" import');
    await computeSuggestions();
    assertSuggest('package:foo/baz/too.dart',
        csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_package2_with_trailing() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart');
    newFile('$fooRootPath/lib/baz/too.dart');
    newFile('$barRootPath/lib/bar.dart');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import "package:foo/baz/^.dart" import');
    await computeSuggestions();
    assertSuggest('package:foo/baz/too.dart',
        csKind: CompletionSuggestionKind.IMPORT);
    expect(replacementOffset, completionOffset - 16);
    expect(replacementLength, 5 + 16);
  }

  Future<void> test_import_package_missing_lib() async {
    var barRootPath = '$workspaceRootPath/bar';
    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import "p^" class');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('package:bar/bar.dart');
  }

  Future<void> test_import_package_raw() async {
    var fooRootPath = '$workspaceRootPath/foo';
    var barRootPath = '$workspaceRootPath/bar';
    newFile('$fooRootPath/lib/foo.dart');
    newFile('$fooRootPath/lib/baz/too.dart');
    newFile('$barRootPath/lib/bar.dart');

    writeTestPackageConfig(
      config: PackageConfigFileBuilder()
        ..add(name: 'foo', rootPath: fooRootPath)
        ..add(name: 'bar', rootPath: barRootPath),
    );

    addTestSource('import r"p^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/foo.dart',
        csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:foo/baz/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('package:foo/baz/too.dart');
    assertSuggest('package:bar/', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:bar/bar.dart',
        csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_raw() async {
    addTestSource('import r"^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_without_any_quotes() async {
    addTestSource('import ^ import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_import_without_any_quotes_eof() async {
    addTestSource('import ^');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNoSuggestions();
  }

  Future<void> test_import_without_closing_quote_eof() async {
    addTestSource('import "^');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_without_closing_quote_eof2() async {
    addTestSource('import "^d');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 1);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_without_closing_quote_eof3() async {
    addTestSource('import "d^');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_without_closing_quote_eof4() async {
    addTestSource('import "d^"');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 1);
    expect(replacementLength, 1);
    assertSuggest('dart:', csKind: CompletionSuggestionKind.IMPORT);
    assertSuggest('package:', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_outside_import() async {
    addTestSource('import ^"d" import');
    await computeSuggestions();
    assertNoSuggestions();
  }

  Future<void> test_outside_import2() async {
    addTestSource('import "d"^ import');
    await computeSuggestions();
    assertNoSuggestions();
  }

  Future<void> test_part_file() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "..^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 2);
    expect(replacementLength, 2);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file_child() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "foo/^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertSuggest('foo/bar.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file_parent() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "../^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 3);
    expect(replacementLength, 3);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
  }
}

@reflectiveTest
class UriContributorWindowsTest extends DartCompletionContributorTest {
  @override
  DartCompletionContributor createContributor() {
    return UriContributor();
  }

  @override
  void setupResourceProvider() {
    resourceProvider = MemoryResourceProvider(context: windows);
  }

  Future<void> test_import_file() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "..^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 2);
    expect(replacementLength, 2);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file_child() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "foo/^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertSuggest('foo/bar.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_import_file_parent() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "../^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 3);
    expect(replacementLength, 3);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_import_file_parent2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('import "../b^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
  }

  Future<void> test_part_file() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset);
    expect(replacementLength, 0);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file2() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "..^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 2);
    expect(replacementLength, 2);
    assertNotSuggested('completion.dart');
    assertSuggest('other.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo');
    assertSuggest('foo/', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('foo/bar.dart');
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file_child() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "foo/^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 4);
    expect(replacementLength, 4);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertSuggest('foo/bar.dart', csKind: CompletionSuggestionKind.IMPORT);
    assertNotSuggested('../blat.dart');
  }

  Future<void> test_part_file_parent() async {
    testFile = convertPath('$testPackageRootPath/test.dart');
    newFile('$testPackageRootPath/other.dart');
    newFile('$testPackageRootPath/foo/bar.dart');
    newFile('$workspaceRootPath/blat.dart');

    addTestSource('library x; part "../^" import');
    await computeSuggestions();
    expect(replacementOffset, completionOffset - 3);
    expect(replacementLength, 3);
    assertNotSuggested('completion.dart');
    assertNotSuggested('other.dart');
    assertNotSuggested('foo');
    assertNotSuggested('foo/');
    assertNotSuggested('foo/bar.dart');
    assertSuggest('../blat.dart', csKind: CompletionSuggestionKind.IMPORT);
  }
}
