import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:image/image.dart' as img; import 'package:app_pfm_ocr_v2/features/camera/blur_detector.dart'; void main() { test('BlurDetector TDD algorithm test with document borders', () async { final tempDir = Directory.systemTemp.createTempSync(); final sharpFile = File('${tempDir.path}/sharp_doc.png'); final blurFile = File('${tempDir.path}/blur_doc.png'); // 1. Generate a sharp document with a black background // Size: 200x200 final sharpImg = img.Image(width: 200, height: 200); // Fill with black (background table) img.fill(sharpImg, color: img.ColorRgb8(0, 0, 0)); // Draw white document in the center (from 40 to 160) for (int y = 40; y < 160; y++) { for (int x = 40; x < 160; x++) { // Draw sharp alternating stripes inside the document to simulate sharp text final isStripe = (x % 6 < 3); final colorVal = isStripe ? 0 : 255; sharpImg.setPixelRgba(x, y, colorVal, colorVal, colorVal, 255); } } sharpFile.writeAsBytesSync(img.encodePng(sharpImg)); // 2. Generate a blurry document with the same black background final blurImg = img.Image(width: 200, height: 200); img.fill(blurImg, color: img.ColorRgb8(0, 0, 0)); // Draw white document in the center (from 40 to 160) for (int y = 40; y < 160; y++) { for (int x = 40; x < 160; x++) { // Draw solid white or very blurry gray stripes (low contrast) blurImg.setPixelRgba(x, y, 220, 220, 220, 255); } } // To make it look like a blurred document, we also blur the edges of the white card slightly final blurredDocImg = img.gaussianBlur(blurImg, radius: 2); blurFile.writeAsBytesSync(img.encodePng(blurredDocImg)); // 3. Run BlurDetector final sharpResult = await BlurDetector.checkBlur(sharpFile.path); final blurResult = await BlurDetector.checkBlur(blurFile.path); print('TDD Sharp Doc Score: ${sharpResult.score} (Raw: ${sharpResult.rawScore}, IsBlur: ${sharpResult.isBlur})'); print('TDD Blur Doc Score: ${blurResult.score} (Raw: ${blurResult.rawScore}, IsBlur: ${blurResult.isBlur})'); // 4. Assertions // The sharp document must be detected as sharp (score >= 80.0) expect(sharpResult.score, greaterThanOrEqualTo(80.0)); expect(sharpResult.isBlur, isFalse); // The blurry document must be detected as blurry (score < 80.0) expect(blurResult.score, lessThan(80.0)); expect(blurResult.isBlur, isTrue); // Clean up try { sharpFile.deleteSync(); blurFile.deleteSync(); tempDir.deleteSync(); } catch (_) {} }); }