// 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/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/domain_analysis.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../analysis_abstract.dart';
import '../mocks.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(SetPriorityFilesTest);
  });
}

@reflectiveTest
class SetPriorityFilesTest extends AbstractAnalysisTest {
  @override
  Future<void> setUp() async {
    super.setUp();
    server.handlers = [
      AnalysisDomainHandler(server),
    ];
    await createProject();
  }

  Future<void> test_fileDoesNotExist() async {
    var file = convertPath('$projectPath/doesNotExist.dart');
    var response = await _setPriorityFile(file);
    expect(response, isResponseSuccess('0'));
  }

  Future<void> test_fileInAnalysisRoot() async {
    addTestFile('');
    // set priority files
    var response = await _setPriorityFile(testFile);
    expect(response, isResponseSuccess('0'));
    // verify
    _verifyPriorityFiles(testFile);
  }

  Future<void> test_fileInAnalysisRootAddedLater() async {
    var path = convertPath('/other/file.dart');
    newFile(path);
    await _setPriorityFile(path);
    await _setAnalysisRoots('/other');
    _verifyPriorityFiles(path);
  }

  Future<void> test_fileInSdk() async {
    addTestFile('');
    // set priority files
    var filePath = convertPath('/lib/convert/convert.dart');
    var response = await _setPriorityFile(filePath);
    expect(response, isResponseSuccess('0'));
    // verify
    _verifyPriorityFiles(filePath);
  }

  Future<void> test_fileNotInAnalysisRoot() async {
    var path = convertPath('/other/file.dart');
    newFile(path);
    await _setPriorityFile(path);
    _verifyPriorityFiles(path);
  }

  Future<void> test_ignoredInAnalysisOptions() async {
    var sampleFile = convertPath('$projectPath/samples/sample.dart');
    newFile('$projectPath/${file_paths.analysisOptionsYaml}', content: r'''
analyzer:
  exclude:
    - 'samples/**'
''');
    newFile(sampleFile);
    // attempt to set priority file
    await _setPriorityFile(sampleFile);
    _verifyPriorityFiles(sampleFile);
  }

  Future<void> test_ignoredInAnalysisOptions_inChildContext() async {
    newDotPackagesFile(projectPath);
    newDotPackagesFile('$projectPath/child');
    var sampleFile = convertPath('$projectPath/child/samples/sample.dart');
    newFile('$projectPath/child/${file_paths.analysisOptionsYaml}',
        content: r'''
analyzer:
  exclude:
    - 'samples/**'
''');
    newFile(sampleFile);
    // attempt to set priority file
    await _setPriorityFile(sampleFile);
    _verifyPriorityFiles(sampleFile);
  }

  Future<void> test_ignoredInAnalysisOptions_inRootContext() async {
    newDotPackagesFile(projectPath);
    newDotPackagesFile('$projectPath/child');
    var sampleFile = convertPath('$projectPath/child/samples/sample.dart');
    newFile('$projectPath/${file_paths.analysisOptionsYaml}', content: r'''
analyzer:
  exclude:
    - 'child/samples/**'
''');
    newFile(sampleFile);
    // attempt to set priority file
    await _setPriorityFile(sampleFile);
    _verifyPriorityFiles(sampleFile);
  }

  Future<void> test_invalidFilePathFormat_notAbsolute() async {
    var request = AnalysisSetPriorityFilesParams(['test.dart']).toRequest('0');
    var response = await waitResponse(request);
    expect(
      response,
      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
    );
  }

  Future<void> test_invalidFilePathFormat_notNormalized() async {
    var request =
        AnalysisSetPriorityFilesParams([convertPath('/foo/../bar/test.dart')])
            .toRequest('0');
    var response = await waitResponse(request);
    expect(
      response,
      isResponseFailure('0', RequestErrorCode.INVALID_FILE_PATH_FORMAT),
    );
  }

  Future<void> test_sentToPlugins() async {
    addTestFile('');
    // set priority files
    var response = await _setPriorityFile(testFile);
    expect(response, isResponseSuccess('0'));
    // verify
    var params = pluginManager.analysisSetPriorityFilesParams!;
    expect(params.files, <String>[testFile]);
  }

  Future<Response> _setAnalysisRoots(String folder) async {
    var request = AnalysisSetAnalysisRootsParams([folder], []).toRequest('1');
    return await serverChannel.sendRequest(request);
  }

  Future<Response> _setPriorityFile(String file) async {
    var request = AnalysisSetPriorityFilesParams(<String>[file]).toRequest('0');
    return await serverChannel.sendRequest(request);
  }

  void _verifyPriorityFiles(String path) {
    var driver = server.getAnalysisDriver(path)!;
    var prioritySources = driver.priorityFiles;
    expect(prioritySources, [path]);
  }
}
