blob: 40c9099135ac2ba1a464a130a927faaf31ec1bf5 [file] [log] [blame] [edit]
// Copyright (c) 2026, 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.
@TestOn('vm')
library;
import 'dart:async';
import 'dart:io';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/utilities.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:path/path.dart' as path;
import 'package:pub/src/path.dart';
import 'package:test/test.dart';
void main() {
test('withPathContext overrides p', () async {
final customContext = path.Context(
style: path.Style.posix,
current: '/custom',
);
expect(p.current, isNot('/custom'));
await withPathContext(() {
expect(p.current, '/custom');
expect(p.style, path.Style.posix);
return Future<void>.value();
}, pathContext: customContext);
expect(p.current, isNot('/custom'));
});
test('withPathContext works with nested zones', () async {
final context1 = path.Context(style: path.Style.posix, current: '/1');
final context2 = path.Context(style: path.Style.posix, current: '/2');
await withPathContext(() async {
expect(p.current, '/1');
await withPathContext(() async {
expect(p.current, '/2');
}, pathContext: context2);
expect(p.current, '/1');
}, pathContext: context1);
});
test('package:path/path.dart is only imported in lib/src/path.dart', () {
final libDir = Directory('lib');
final dartFiles = libDir
.listSync(recursive: true)
.whereType<File>()
.where((file) => file.path.endsWith('.dart'));
final offendingFiles = <String>[];
for (final file in dartFiles) {
if (p.basename(file.path) == 'path.dart' &&
p.dirname(file.path).endsWith(p.join('lib', 'src'))) {
continue;
}
final result = parseString(
content: file.readAsStringSync(),
featureSet: FeatureSet.latestLanguageVersion(),
);
final hasPathImport = result.unit.directives
.whereType<ImportDirective>()
.any(
(directive) =>
directive.uri.stringValue == 'package:path/path.dart',
);
if (hasPathImport) {
offendingFiles.add(file.path);
}
}
expect(
offendingFiles,
isEmpty,
reason:
'Files in lib/ should use the custom path context p from '
'lib/src/path.dart instead of directly importing '
'package:path/path.dart. This ensures that the path context can be '
'overridden for testing using withPathContext.',
);
});
}