Files
clide/test/kernel/src/theme/controller_test.dart
T
jpmschweitzerandClaude Opus 4.8 6d0ebab721 chore: adopt Dart 3.9 toolchain — honest floor + tall-style reformat (T-353)
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>
2026-06-11 12:11:53 +02:00

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);
});
});
}