import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; import 'package:ocideck/models/deck.dart'; import 'package:ocideck/models/slide.dart'; import 'package:ocideck/services/markdown_service.dart'; import 'package:ocideck/services/markdown_validator.dart'; void main() { final service = MarkdownService(); final validator = MarkdownValidator(); test('valid generated deck has no errors', () { final markdown = service.generateDeck( Deck( title: 'Demo', slides: [ Slide.create(SlideType.bullets).copyWith( title: 'Kop', bullets: ['Eerste punt'], ), ], ), ); final result = validator.validate(markdown); expect(result.isValid, isTrue); expect(result.hasIssues, isFalse); }); test('detects unclosed front matter', () { const markdown = '---\nmarp: true\ntheme: ocideck\n# Titel\n'; final result = validator.validate(markdown); expect(result.isValid, isFalse); expect( result.issues.any( (issue) => issue.message.contains('Front matter is niet afgesloten'), ), isTrue, ); }); test('detects unclosed code fence', () { const markdown = ''' --- marp: true --- # Code ```dart void main() {} '''; final result = validator.validate(markdown); expect(result.isValid, isFalse); expect( result.issues.any( (issue) => issue.message.contains('Codeblok is niet afgesloten'), ), isTrue, ); }); test('detects code slide without fenced block', () { const markdown = ''' --- marp: true --- # Titel print('hi'); '''; final result = validator.validate(markdown); expect(result.isValid, isFalse); expect( result.issues.any( (issue) => issue.message.contains('broncode-slide vereist'), ), isTrue, ); }); test('detects invalid chart JSON', () { const markdown = ''' --- marp: true --- ```chart { broken json ``` '''; final result = validator.validate(markdown); expect(result.isValid, isFalse); expect( result.issues.any( (issue) => issue.message.contains('grafiek-JSON is ongeldig'), ), isTrue, ); }); test('detects split slide with missing divs', () { const markdown = ''' --- marp: true ---