blob: 7b193815cd77a97936029fa6dd1ae39c6f00bd9f [file] [log] [blame] [edit]
// Copyright (c) 2024, 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:dart_style/src/analysis_options/file_system.dart';
import 'package:dart_style/src/analysis_options/io_file_system.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
void main() {
group('makePath()', () {
test('creates a relative path', () async {
var fs = IOFileSystem();
expect(
(await fs.makePath('relative/path.txt')).path,
'relative/path.txt',
);
});
test('creates an absolute path', () async {
var fs = IOFileSystem();
var absolutePath = p.style == p.Style.posix ? '/abs' : 'C:\\abs';
expect((await fs.makePath(absolutePath)).path, absolutePath);
});
});
group('fileExists()', () {
test('returns whether a file exists at that path', () async {
await d.dir('dir', [d.file('exists.txt', 'contents')]).create();
var fs = IOFileSystem();
expect(
await fs.fileExists(
await fs.makePath(p.join(d.sandbox, 'dir', 'exists.txt')),
),
isTrue,
);
expect(
await fs.fileExists(
await fs.makePath(p.join(d.sandbox, 'dir', 'nope.txt')),
),
isFalse,
);
});
test('returns false if the entry at that path is not a file', () async {
await d.dir('dir', [d.dir('sub', [])]).create();
var fs = IOFileSystem();
expect(
await fs.fileExists(await fs.makePath(p.join(d.sandbox, 'dir', 'sub'))),
isFalse,
);
});
});
group('join()', () {
test('joins paths', () async {
var fs = IOFileSystem();
expect(
(await fs.join(await fs.makePath('dir'), 'file.txt')).ioPath,
p.join('dir', 'file.txt'),
);
});
test('joins an absolute path', () async {
var fs = IOFileSystem();
var absolutePath = p.style == p.Style.posix ? '/abs' : 'C:\\abs';
expect(
(await fs.join(await fs.makePath('dir'), absolutePath)).ioPath,
absolutePath,
);
});
});
group('parentDirectory()', () {
var fs = IOFileSystem();
// Wrap [path] in an IOFileSystemPath, get the parent directory, and unwrap
// the result (which might be null).
Future<String?> parent(String path) async =>
(await fs.parentDirectory(await fs.makePath(path))).ioPath;
test('returns the containing directory', () async {
expect(
await parent(p.join('dir', 'sub', 'file.txt')),
p.absolute(p.join('dir', 'sub')),
);
expect(await parent(p.join('dir', 'sub')), p.absolute(p.join('dir')));
});
test('returns null at the root directory (POSIX)', () async {
var rootPath = p.style == p.Style.posix ? '/' : 'C:\\';
expect(await parent(rootPath), null);
});
});
group('readFile()', () {
test('reads a file', () async {
await d.dir('dir', [
d.file('some_file.txt', 'contents'),
d.dir('sub', [d.file('another.txt', 'more')]),
]).create();
var fs = IOFileSystem();
expect(
await fs.readFile(
await fs.makePath(p.join(d.sandbox, 'dir', 'some_file.txt')),
),
'contents',
);
expect(
await fs.readFile(
await fs.makePath(p.join(d.sandbox, 'dir', 'sub', 'another.txt')),
),
'more',
);
});
test('treats relative paths as relative to the CWD', () async {
await d.dir('dir', [
d.file('some_file.txt', 'contents'),
d.dir('sub', [d.file('another.txt', 'more')]),
]).create();
var fs = IOFileSystem();
expect(
await fs.readFile(
await fs.makePath(p.join(d.sandbox, 'dir', 'some_file.txt')),
),
'contents',
);
expect(
await fs.readFile(
await fs.makePath(p.join(d.sandbox, 'dir', 'sub', 'another.txt')),
),
'more',
);
});
});
}
extension on FileSystemPath? {
String? get ioPath => (this as IOFileSystemPath?)?.path;
}