feat(f1): per-tool settings memory (color/width per tool) pure model
Some checks failed
CI / Windows build (push) Has been cancelled
Some checks failed
CI / Windows build (push) Has been cancelled
ToolSettings: the active tool + each tool's OWN remembered ToolConfig (color/width), so pen→highlighter→pen restores the pen's last color/width instead of bleeding the highlighter's. Immutable copy-on-write (withActive/ withColor/withWidth only touch the active tool); sensible defaults (black thin pen, yellow fat highlighter, medium eraser). The toolbar holds + persists one. Pure model; fully unit-tested (per-tool isolation, immutability, equality). flutter analyze lib/editor clean; 204/204 tests (+6). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
58
test/tool_settings_test.dart
Normal file
58
test/tool_settings_test.dart
Normal file
@@ -0,0 +1,58 @@
|
||||
// Tests for per-tool settings memory (F1/F5/F11).
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:badnote/editor/input/tool_settings.dart';
|
||||
|
||||
void main() {
|
||||
test('defaults: pen active, per-tool colors/widths', () {
|
||||
final s = ToolSettings.defaults();
|
||||
expect(s.active, EditorToolType.pen);
|
||||
expect(s.configFor(EditorToolType.pen).color, 0xFF000000);
|
||||
expect(s.configFor(EditorToolType.highlighter).width, 0.02);
|
||||
expect(s.activeConfig, s.configFor(EditorToolType.pen));
|
||||
});
|
||||
|
||||
test('switching tools remembers each tool\'s own config', () {
|
||||
var s = ToolSettings.defaults();
|
||||
// Customize pen, switch to highlighter, customize it, switch back.
|
||||
s = s.withColor(0xFFFF0000).withWidth(0.005); // pen → red, 0.005
|
||||
s = s.withActive(EditorToolType.highlighter);
|
||||
expect(s.activeConfig.color, 0x80FFEB3B); // highlighter unchanged
|
||||
s = s.withColor(0x8000FF00); // highlighter → green
|
||||
s = s.withActive(EditorToolType.pen);
|
||||
// Pen restored to its red/0.005, NOT the highlighter's green.
|
||||
expect(s.activeConfig.color, 0xFFFF0000);
|
||||
expect(s.activeConfig.width, 0.005);
|
||||
// Highlighter kept its green.
|
||||
expect(s.configFor(EditorToolType.highlighter).color, 0x8000FF00);
|
||||
});
|
||||
|
||||
test('withColor/withWidth only touch the active tool', () {
|
||||
var s = ToolSettings.defaults().withActive(EditorToolType.highlighter);
|
||||
final penBefore = s.configFor(EditorToolType.pen);
|
||||
s = s.withColor(0x80123456);
|
||||
expect(s.configFor(EditorToolType.pen), penBefore); // pen untouched
|
||||
expect(s.activeConfig.color, 0x80123456);
|
||||
});
|
||||
|
||||
test('immutability: updates return new instances, original unchanged', () {
|
||||
final a = ToolSettings.defaults();
|
||||
final b = a.withActive(EditorToolType.eraser);
|
||||
expect(a.active, EditorToolType.pen);
|
||||
expect(b.active, EditorToolType.eraser);
|
||||
expect(a == b, isFalse);
|
||||
});
|
||||
|
||||
test('value equality', () {
|
||||
expect(ToolSettings.defaults(), ToolSettings.defaults());
|
||||
expect(ToolSettings.defaults().withActive(EditorToolType.eraser) ==
|
||||
ToolSettings.defaults(), isFalse);
|
||||
});
|
||||
|
||||
test('ToolConfig copyWith + equality', () {
|
||||
const c = ToolConfig(color: 0xFF000000, width: 0.003);
|
||||
expect(c.copyWith(width: 0.01), const ToolConfig(color: 0xFF000000, width: 0.01));
|
||||
expect(c.copyWith(), c);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user