// Copyright (c) 2025, 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:coverage/src/coverage_options.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; import '../bin/collect_coverage.dart' as collect_coverage; import '../bin/format_coverage.dart' as format_coverage; import '../bin/test_with_coverage.dart' as test_with_coverage; void main() { final formatCoverageArgs = ['--in=./test/collect_coverage_config_test.dart']; group('defaults when no yaml or command-line args provided', () { // Setup final defaults = CoverageOptionsProvider().coverageOptions; test('collect coverage', () { final collectedCoverage = collect_coverage.parseArgs([], defaults); expect(collectedCoverage.scopedOutput, defaults.scopeOutput); expect(collectedCoverage.functionCoverage, defaults.functionCoverage); expect(collectedCoverage.branchCoverage, defaults.branchCoverage); expect(collectedCoverage.out, isNull); }); test('format coverage', () { final formattedCoverage = format_coverage.parseArgs(formatCoverageArgs, defaults); expect(formattedCoverage.output, isNull); expect(formattedCoverage.packagePath, defaults.packageDirectory); }); test('test with coverage', () async { final testCoverage = await test_with_coverage.parseArgs([], defaults); expect(path.canonicalize(testCoverage.packageDir), path.canonicalize(defaults.packageDirectory)); expect(path.canonicalize(testCoverage.outDir), path.canonicalize('coverage')); expect(testCoverage.testScript, defaults.testScript); expect(testCoverage.functionCoverage, defaults.functionCoverage); expect(testCoverage.branchCoverage, defaults.branchCoverage); expect(testCoverage.scopeOutput, defaults.scopeOutput); }); }); test('uses yaml values when all values are provided in yaml file', () async { final configuredOptions = CoverageOptionsProvider( filePath: 'test/test_coverage_options/all_field.yaml', ).coverageOptions; // Parse arguments with empty command line args final collectedCoverage = collect_coverage.parseArgs([], configuredOptions); final formattedCoverage = format_coverage.parseArgs(formatCoverageArgs, configuredOptions); final testCoverage = await test_with_coverage.parseArgs([], configuredOptions); // Verify collect coverage yaml values expect(collectedCoverage.scopedOutput, ['lib', 'src']); expect(collectedCoverage.functionCoverage, isTrue); expect(collectedCoverage.branchCoverage, isFalse); expect(path.canonicalize(collectedCoverage.out!), path.canonicalize('var/coverage_data/coverage.json')); // Verify format coverage yaml values expect(path.canonicalize(formattedCoverage.output!), path.canonicalize('var/coverage_data/lcov.info')); expect(path.canonicalize(formattedCoverage.packagePath), path.canonicalize('test/test_files')); // Verify test with coverage yaml values expect(path.canonicalize(testCoverage.packageDir), path.canonicalize('test/test_files')); expect(path.canonicalize(testCoverage.outDir), path.canonicalize('var/coverage_data')); expect(testCoverage.testScript, 'test1'); expect(testCoverage.functionCoverage, isTrue); expect(testCoverage.branchCoverage, isFalse); expect(testCoverage.scopeOutput, ['lib', 'src']); }); group('partial yaml configuration', () { test('override default values with partial yaml values 1', () async { final configuredOptions = CoverageOptionsProvider( filePath: 'test/test_coverage_options/partial_fields1.yaml', ).coverageOptions; // Parse arguments with empty command line args final collectedCoverage = collect_coverage.parseArgs([], configuredOptions); final testCoverage = await test_with_coverage.parseArgs([], configuredOptions); final formattedCoverage = format_coverage.parseArgs([], configuredOptions); expect(path.canonicalize(collectedCoverage.out!), path.canonicalize('var/coverage_data/custom_coverage/coverage.json')); expect(collectedCoverage.scopedOutput, ['lib', 'test']); expect(collectedCoverage.functionCoverage, isFalse); expect(path.canonicalize(formattedCoverage.output!), path.canonicalize('var/coverage_data/custom_coverage/lcov.info')); expect(testCoverage.scopeOutput, ['lib', 'test']); }); test('override default values with partial yaml values 2', () async { final configuredOptions = CoverageOptionsProvider( filePath: 'test/test_coverage_options/partial_fields2.yaml', ).coverageOptions; // Parse arguments with empty command line args final collectedCoverage = collect_coverage.parseArgs([], configuredOptions); final formattedCoverage = format_coverage.parseArgs([], configuredOptions); final testCoverage = await test_with_coverage.parseArgs([], configuredOptions); // Verify collect coverage yaml values expect(collectedCoverage.scopedOutput, ['lib', 'tools']); expect(collectedCoverage.branchCoverage, isFalse); expect(collectedCoverage.functionCoverage, isTrue); expect(path.canonicalize(collectedCoverage.out!), path.canonicalize('var/coverage_data/custom_lcov/coverage.json')); // Verify format coverage yaml values expect(path.canonicalize(formattedCoverage.output!), path.canonicalize('var/coverage_data/custom_lcov/lcov.info')); expect(path.canonicalize(formattedCoverage.packagePath), path.canonicalize('test/test_coverage_options')); // Verify test with coverage yaml values expect(path.canonicalize(testCoverage.outDir), path.canonicalize('var/coverage_data/custom_lcov')); expect(testCoverage.testScript, 'custom_test'); expect(testCoverage.functionCoverage, isTrue); }); }); group('override yaml values with command line args', () { test('override 1', () async { final configuredOptions = CoverageOptionsProvider( filePath: 'test/test_coverage_options/all_field.yaml', ).coverageOptions; // Parse arguments with command line args final collectedCoverage = collect_coverage.parseArgs([ '--out=var/coverage_data/coverage.json', '--scope-output=lib', '--no-function-coverage', '--branch-coverage', ], configuredOptions); final formattedCoverage = format_coverage.parseArgs([ '--out=var/coverage_data/out_test.info', '--package=../code_builder', ], configuredOptions); final testCoverage = await test_with_coverage.parseArgs([ '--package-name=test', '--out=test_coverage.json', '--test=test_test.dart', '--function-coverage', ], configuredOptions); // Verify collect coverage command line args expect(collectedCoverage.out, path.normalize('var/coverage_data/coverage.json')); expect(collectedCoverage.scopedOutput, ['lib']); expect(collectedCoverage.functionCoverage, isFalse); expect(collectedCoverage.branchCoverage, isTrue); // Verify format coverage command line args expect(formattedCoverage.output, path.normalize('var/coverage_data/out_test.info')); expect(formattedCoverage.packagePath, '../code_builder'); // Verify test with coverage command line args expect(testCoverage.outDir, 'test_coverage.json'); expect(testCoverage.testScript, 'test_test.dart'); expect(testCoverage.functionCoverage, isTrue); }); test('override 2', () async { final configuredOptions = CoverageOptionsProvider( filePath: 'test/test_coverage_options/all_field.yaml', ).coverageOptions; // Parse arguments with command line args final collectedCoverage = collect_coverage.parseArgs([ '--out=stdout', '--scope-output=src', '--function-coverage', '--no-branch-coverage', ], configuredOptions); final formattedCoverage = format_coverage.parseArgs([ '--out=stdout', '--package=../cli_config', ], configuredOptions); final testCoverage = await test_with_coverage.parseArgs([ '--package-name=cli_config', '--out=cli_config_coverage.json', '--test=cli_config_test.dart', '--function-coverage', ], configuredOptions); // Verify collect coverage command line args expect(collectedCoverage.out, isNull); expect(collectedCoverage.scopedOutput, ['src']); expect(collectedCoverage.functionCoverage, isTrue); expect(collectedCoverage.branchCoverage, isFalse); // Verify format coverage command line args expect(formattedCoverage.output, isNull); expect(formattedCoverage.packagePath, '../cli_config'); // Verify test with coverage command line args expect(testCoverage.outDir, 'cli_config_coverage.json'); expect(testCoverage.testScript, 'cli_config_test.dart'); expect(testCoverage.functionCoverage, isTrue); }); }); test('format exception when empty yaml file', () { expect( () => CoverageOptionsProvider( filePath: 'test/test_coverage_options/empty.yaml', ), throwsFormatException); }); }