Files
clide/test/draw/draw_dispatch_test.dart
T
jpmschweitzerandClaude Opus 4.8 1d9000988d test(draw): cover the 2.9.0 drawing-card additions to clear the coverage floor
The drawing-card feature batch (icon/image/compare/graph/d2 cards, --stdin,
tool resolution) added widget + wiring code that dipped total coverage under
the 95% floor — surfaced by `make release` (push-check skips coverage). Cover
the gaps: ProblemsController.refresh, every SVG shape-type bbox + the style
vocabulary, _spawnD2 via a real /bin/cat, the icon-show bus path + error
branches, and quad/arc/close marker paths.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 22:00:56 +02:00

59 lines
2.6 KiB
Dart

import 'package:clide/src/draw/draw_dispatch.dart';
import 'package:clide/src/draw/draw_doc.dart';
import 'package:test/test.dart';
void main() {
DrawingFileReader reader(Map<String, String> files) =>
(p) async => files[p];
Future<DrawResult> resolve(DrawingCardDoc doc, DrawingRegistry reg, {Map<String, String> files = const {}}) =>
resolveDrawingSvg(doc, reg, readFile: reader(files));
test('a fresh registry is empty; registering a handler fills it', () {
expect(DrawingRegistry().isEmpty, isTrue);
final reg = DrawingRegistry()..register('x', (_) async => const DrawOk('<svg/>'));
expect(reg.isEmpty, isFalse);
expect(reg.handlerFor('x'), isNotNull);
});
group('resolveDrawingSvg', () {
test('primitive: inline svg passes through', () async {
final r = await resolve(parseDrawingCardDoc({'svg': '<svg id="x"/>'})!, DrawingRegistry());
expect((r as DrawOk).svg, '<svg id="x"/>');
});
test('primitive: svgPath is read via the injected reader', () async {
final r = await resolve(parseDrawingCardDoc({'svgPath': 'd.svg'})!, DrawingRegistry(), files: {'d.svg': '<svg id="file"/>'});
expect((r as DrawOk).svg, '<svg id="file"/>');
});
test('primitive: an unreadable svgPath is an honest error', () async {
final r = await resolve(parseDrawingCardDoc({'svgPath': 'missing.svg'})!, DrawingRegistry());
expect(r, isA<DrawErr>());
expect((r as DrawErr).message, contains('missing.svg'));
});
test('primitive: no source at all is an error', () async {
final r = await resolve(parseDrawingCardDoc(const {})!, DrawingRegistry());
expect(r, isA<DrawErr>());
});
test('template: an unknown template is an error', () async {
final r = await resolve(parseDrawingCardDoc({'template': 'd2', 'source': 'a -> b'})!, DrawingRegistry());
expect(r, isA<DrawErr>());
expect((r as DrawErr).message, contains('d2'));
});
test('template: a registered handler lowers the doc to SVG', () async {
final reg = DrawingRegistry()..register('d2', (doc) async => DrawOk('<svg data-src="${doc.fields['source']}"/>'));
final r = await resolve(parseDrawingCardDoc({'template': 'd2', 'source': 'a -> b'})!, reg);
expect((r as DrawOk).svg, '<svg data-src="a -> b"/>');
});
test('template: a handler error propagates with its message', () async {
final reg = DrawingRegistry()..register('d2', (_) async => const DrawErr('d2 not found'));
final r = await resolve(parseDrawingCardDoc({'template': 'd2'})!, reg);
expect((r as DrawErr).message, contains('d2 not found'));
});
});
}