Raise the declared minimums in pubspec.yaml to what our deps already require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist 0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is the binding floor. Pin the exact build toolchain in .fvmrc (Flutter 3.44.1). Moving to the Dart 3.9 language level switches `dart format` to the new "tall" style and enables two new lints. This commit is the resulting mechanical churn, isolated from any behaviour change: - whole-tree `dart format` reformat (tall style) - `dart fix` for unnecessary_underscores + use_null_aware_elements No runtime behaviour change; `make test` green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
303 lines
12 KiB
Dart
303 lines
12 KiB
Dart
/// Unit tests for `ProjectManager` and `RecentProject` in
|
|
/// `lib/kernel/src/project.dart`. Uses an injected `onValidateProject`
|
|
/// hook so the manager doesn't shell out to git in tests.
|
|
library;
|
|
|
|
import 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:clide/kernel/kernel.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
Future<ProjectManager> _build({
|
|
Future<String?> Function(String path)? onValidateProject,
|
|
Future<void> Function(String path)? onProjectOpen,
|
|
Map<String, Object?> initialSettings = const {},
|
|
}) async {
|
|
final tmp = await Directory.systemTemp.createTemp('clide-project-test-');
|
|
final settings = SettingsStore(appDir: tmp);
|
|
await settings.load();
|
|
for (final entry in initialSettings.entries) {
|
|
await settings.set<Object>(entry.key, entry.value!);
|
|
}
|
|
final toolchain = Toolchain();
|
|
toolchain.applyResolved(const ResolvedPaths(git: '/usr/bin/git'));
|
|
final pm = ProjectManager(
|
|
log: Logger(minLevel: LogLevel.error),
|
|
events: DaemonBus(),
|
|
settings: settings,
|
|
toolchain: toolchain,
|
|
onValidateProject: onValidateProject,
|
|
onProjectOpen: onProjectOpen,
|
|
);
|
|
addTearDown(() async {
|
|
if (tmp.existsSync()) tmp.deleteSync(recursive: true);
|
|
});
|
|
return pm;
|
|
}
|
|
|
|
void main() {
|
|
group('RecentProject', () {
|
|
test(r'relativePath collapses $HOME prefix to ~', () {
|
|
final home = Platform.environment['HOME'] ?? '';
|
|
if (home.isEmpty) return;
|
|
final p = RecentProject(path: '$home/projects/clide', name: 'clide', lastOpened: DateTime.now());
|
|
expect(p.relativePath, startsWith('~/'));
|
|
});
|
|
|
|
test(r'relativePath returns the absolute path when not under $HOME', () {
|
|
final p = RecentProject(path: '/elsewhere/repo', name: 'repo', lastOpened: DateTime.now());
|
|
// If $HOME is /elsewhere... we'd collapse. Otherwise absolute is preserved.
|
|
if (!'/elsewhere/repo'.startsWith(Platform.environment['HOME'] ?? ' |