// 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 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/workspace/gn.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../generated/test_support.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(GnWorkspaceTest);
    defineReflectiveTests(GnWorkspacePackageTest);
  });
}

@reflectiveTest
class GnWorkspacePackageTest with ResourceProviderMixin {
  void test_contains_differentPackageInWorkspace() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    var targetFile = newFile2('/ws/some/code/lib/code.dart', '');

    var package = workspace.findPackageFor(targetFile.path)!;
    // A file that is _not_ in this package is not required to have a BUILD.gn
    // file above it, for simplicity and reduced I/O.
    expect(
        package
            .contains(TestSource(convertPath('/ws/some/other/code/file.dart'))),
        isFalse);
  }

  void test_contains_differentWorkspace() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    var targetFile = newFile2('/ws/some/code/lib/code.dart', '');

    var package = workspace.findPackageFor(targetFile.path)!;
    expect(package.contains(TestSource(convertPath('/ws2/some/file.dart'))),
        isFalse);
  }

  void test_contains_samePackage() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    var targetFile = newFile2('/ws/some/code/lib/code.dart', '');
    var targetFile2 = newFile2('/ws/some/code/lib/code2.dart', '');
    var targetFile3 = newFile2('/ws/some/code/lib/src/code3.dart', '');
    var targetBinFile = newFile2('/ws/some/code/bin/code.dart', '');
    var targetTestFile = newFile2('/ws/some/code/test/code_test.dart', '');

    var package = workspace.findPackageFor(targetFile.path)!;
    expect(package.contains(TestSource(targetFile2.path)), isTrue);
    expect(package.contains(TestSource(targetFile3.path)), isTrue);
    expect(package.contains(TestSource(targetBinFile.path)), isTrue);
    expect(package.contains(TestSource(targetTestFile.path)), isTrue);
  }

  void test_contains_subPackage() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    newFile2('/ws/some/code/lib/code.dart', '');
    newFile2('/ws/some/code/testing/BUILD.gn', '');
    newFile2('/ws/some/code/testing/lib/testing.dart', '');

    var package =
        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'))!;
    expect(
        package.contains(
            TestSource(convertPath('/ws/some/code/testing/lib/testing.dart'))),
        isFalse);
  }

  void test_findPackageFor_buildFileExists() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    var targetFile = newFile2('/ws/some/code/lib/code.dart', '');

    var package = workspace.findPackageFor(targetFile.path)!;
    expect(package.root, convertPath('/ws/some/code'));
    expect(package.workspace, equals(workspace));
  }

  void test_findPackageFor_missingBuildFile() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/lib/code.dart', '');

    var package =
        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'));
    expect(package, isNull);
  }

  void test_packagesAvailableTo() {
    GnWorkspace workspace = _buildStandardGnWorkspace();
    newFile2('/ws/some/code/BUILD.gn', '');
    var libraryPath = newFile2('/ws/some/code/lib/code.dart', '').path;
    var package = workspace.findPackageFor(libraryPath)!;
    var packageMap = package.packagesAvailableTo(libraryPath);
    expect(packageMap.keys, unorderedEquals(['p1', 'workspace']));
  }

  GnWorkspace _buildStandardGnWorkspace() {
    newFolder('/ws/.jiri_root');
    String buildDir = convertPath('out/debug-x87_128');
    newFile2('/ws/.fx-build-dir', '$buildDir\n');
    newFile2(
        '/ws/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "p1",
      "packageUri": "lib",
      "rootUri": "some/path/"
    },
    {
      "languageVersion": "2.2",
      "name": "workspace",
      "packageUri": "lib",
      "rootUri": ""
    }
  ]
}''');
    newFolder('/ws/some/code');
    var gnWorkspace =
        GnWorkspace.find(resourceProvider, convertPath('/ws/some/code'))!;
    expect(gnWorkspace.isBazel, isFalse);
    return gnWorkspace;
  }
}

@reflectiveTest
class GnWorkspaceTest with ResourceProviderMixin {
  void test_find_noJiriRoot() {
    newFolder('/workspace');
    var workspace =
        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
    expect(workspace, isNull);
  }

  void test_find_noPackagesFiles() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    var workspace =
        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
    expect(workspace, isNull);
  }

  void test_find_notAbsolute() {
    expect(
        () => GnWorkspace.find(resourceProvider, convertPath('not_absolute')),
        throwsA(const TypeMatcher<ArgumentError>()));
  }

  void test_find_withRoot() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String buildDir = convertPath('out/debug-x87_128');
    newFile2('/workspace/.fx-build-dir', '$buildDir\n');
    newFile2(
      '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
      '',
    );
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
  }

  void test_packages() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String buildDir = convertPath('out/debug-x87_128');
    newFile2('/workspace/.fx-build-dir', '$buildDir\n');
    String packageLocation = convertPath('/workspace/this/is/the/package');
    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "lib",
      "rootUri": "$packageUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 1);
    expect(workspace.packageMap['flutter']![0].path,
        convertPath("$packageLocation/lib"));
  }

  void test_packages_absoluteBuildDir() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String buildDir = convertPath('/workspace/out/debug-x87_128');
    newFile2('/workspace/.fx-build-dir', '$buildDir\n');
    String packageLocation = convertPath('/workspace/this/is/the/package');
    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "lib",
      "rootUri": "$packageUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 1);
    expect(workspace.packageMap['flutter']![0].path,
        convertPath("$packageLocation/lib"));
  }

  void test_packages_fallbackBuildDir() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String packageLocation = convertPath('/workspace/this/is/the/package');
    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "lib",
      "rootUri": "$packageUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 1);
    expect(workspace.packageMap['flutter']![0].path,
        convertPath("$packageLocation/lib"));
  }

  void test_packages_fallbackBuildDirWithUselessConfig() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    newFile2('/workspace/.fx-build-dir', '');
    String packageLocation = convertPath('/workspace/this/is/the/package');
    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "lib",
      "rootUri": "$packageUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 1);
    expect(workspace.packageMap['flutter']![0].path,
        convertPath("$packageLocation/lib"));
  }

  void test_packages_multipleCandidates() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String buildDir = convertPath('out/release-y22_256');
    newFile2('/workspace/.fx-build-dir', '$buildDir\n');
    String packageLocation = convertPath('/workspace/this/is/the/package');
    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "lib1",
      "rootUri": "$packageUri"
    }
  ]
}''');
    String otherPackageLocation = convertPath('/workspace/here/too');
    Uri otherPackageUri =
        resourceProvider.pathContext.toUri(otherPackageLocation);
    newFile2(
        '/workspace/out/release-y22_256/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "rettulf",
      "packageUri": "lib2",
      "rootUri": "$otherPackageUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 1);
    expect(workspace.packageMap['rettulf']![0].path,
        convertPath("$otherPackageLocation/lib2"));
  }

  void test_packages_multipleFiles() {
    newFolder('/workspace/.jiri_root');
    newFolder('/workspace/some/code');
    newPubspecYamlFile('/workspace/some/code', '');
    String buildDir = convertPath('out/debug-x87_128');
    newFile2('/workspace/.fx-build-dir', '$buildDir\n');
    String packageOneLocation = convertPath('/workspace/this/is/the/package');
    Uri packageOneUri = resourceProvider.pathContext.toUri(packageOneLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "flutter",
      "packageUri": "one/lib",
      "rootUri": "$packageOneUri"
    }
  ]
}''');
    String packageTwoLocation =
        convertPath('/workspace/this/is/the/other/package');
    Uri packageTwoUri = resourceProvider.pathContext.toUri(packageTwoLocation);
    newFile2(
        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_test_package_config.json',
        '''{
  "configVersion": 2,
  "packages": [
    {
      "languageVersion": "2.2",
      "name": "rettulf",
      "packageUri": "two/lib",
      "rootUri": "$packageTwoUri"
    }
  ]
}''');
    var workspace = GnWorkspace.find(
        resourceProvider, convertPath('/workspace/some/code'))!;
    expect(workspace.root, convertPath('/workspace'));
    expect(workspace.packageMap.length, 2);
    expect(workspace.packageMap['flutter']![0].path,
        convertPath("$packageOneLocation/one/lib"));
    expect(workspace.packageMap['rettulf']![0].path,
        convertPath("$packageTwoLocation/two/lib"));
  }
}
