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>
75 lines
2.5 KiB
Dart
75 lines
2.5 KiB
Dart
import 'dart:ui';
|
|
|
|
import 'package:clide/kernel/kernel.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
ThemeDefinition _def(String name, Color primary) => ThemeDefinition(
|
|
name: name,
|
|
displayName: name,
|
|
dark: true,
|
|
palette: Palette({
|
|
'primary': primary,
|
|
'accent': primary,
|
|
'background': const Color(0xFF000000),
|
|
'surface': const Color(0xFF111111),
|
|
'panel': const Color(0xFF222222),
|
|
'foreground': const Color(0xFFFFFFFF),
|
|
'success': const Color(0xFF00FF00),
|
|
'warning': const Color(0xFFFFFF00),
|
|
'error': const Color(0xFFFF0000),
|
|
}),
|
|
);
|
|
|
|
void main() {
|
|
group('ThemeController', () {
|
|
test('starts on first bundled theme', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF111111)), _def('b', const Color(0xFF222222))]);
|
|
expect(c.currentName, 'a');
|
|
});
|
|
|
|
test('honors initialName when present', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF000000)), _def('b', const Color(0xFF999999))], initialName: 'b');
|
|
expect(c.currentName, 'b');
|
|
});
|
|
|
|
test('silently falls back to first when initialName is unknown', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF000000))], initialName: 'missing');
|
|
expect(c.currentName, 'a');
|
|
});
|
|
|
|
test('select changes current + notifies listeners', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF000000)), _def('b', const Color(0xFF333333))]);
|
|
var count = 0;
|
|
c.addListener(() => count++);
|
|
c.select('b');
|
|
expect(c.currentName, 'b');
|
|
expect(count, 1);
|
|
});
|
|
|
|
test('select on same theme is a no-op', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF000000))]);
|
|
var count = 0;
|
|
c.addListener(() => count++);
|
|
c.select('a');
|
|
expect(count, 0);
|
|
});
|
|
|
|
test('select throws on unknown name', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFF000000))]);
|
|
expect(() => c.select('nope'), throwsA(isA<ArgumentError>()));
|
|
});
|
|
|
|
test('registerTheme adds a new theme and rebuilds current if matching', () {
|
|
final c = ThemeController(bundled: [_def('a', const Color(0xFFAAAAAA))]);
|
|
expect(c.available.length, 1);
|
|
c.registerTheme(_def('b', const Color(0xFFBBBBBB)));
|
|
expect(c.available.length, 2);
|
|
// re-register 'a' with a different palette — current rebuilds
|
|
var count = 0;
|
|
c.addListener(() => count++);
|
|
c.registerTheme(_def('a', const Color(0xFF123456)));
|
|
expect(count, 1);
|
|
});
|
|
});
|
|
}
|