cf-vision/tests/test_models.py
pyr0ball 353525c1f4 feat: initial cf-vision scaffold — ImageFrame API, stub inference modules
- cf_vision/models.py: ImageFrame + ImageElement + BoundingBox (MIT)
  Full Dolphin-v2 element taxonomy (21 types), convenience accessors
  (text_blocks, barcodes, tables, full_text)
- cf_vision/router.py: VisionRouter — mock + real paths, task routing
  (document, barcode, receipt, general)
- cf_vision/barcode.py: BarcodeScanner — pyzbar wrapper, CPU-only, MIT
- cf_vision/ocr.py: DolphinOCR — ByteDance/Dolphin-v2 async stub (BSL 1.1)
- cf_vision/receipt.py: ReceiptParser stub — Kiwi Phase 2 target (BSL 1.1)
- cf_vision/camera.py: CameraCapture — OpenCV single-frame capture (MIT)
- pyproject.toml: inference / barcode / camera optional extras
- .env.example: HF_TOKEN, CF_VISION_DEVICE, CF_VISION_MOCK
- README: module map, ImageFrame API reference, consumer roadmap
- tests: 6 passing (ImageFrame accessors, VisionRouter mock/real)

Extracted from circuitforge_core.vision per cf-core#36.
2026-04-06 17:59:00 -07:00

71 lines
2.2 KiB
Python

"""Tests for ImageFrame API contract."""
import pytest
from cf_vision.models import BoundingBox, ImageElement, ImageFrame
def test_imageframe_text_blocks():
frame = ImageFrame(
source="mock",
image_bytes=None,
elements=[
ImageElement(element_type="title", text="My Doc", confidence=0.99),
ImageElement(element_type="barcode", text="123456", confidence=1.0),
ImageElement(element_type="plain_text", text="Body text.", confidence=0.9),
],
model="mock",
)
blocks = frame.text_blocks()
assert len(blocks) == 2
assert all(b.element_type in ("title", "plain_text") for b in blocks)
def test_imageframe_barcodes():
frame = ImageFrame(
source="mock",
image_bytes=None,
elements=[
ImageElement(element_type="barcode", text="0123456789012", confidence=1.0,
metadata={"format": "EAN13"}),
],
model="mock",
)
barcodes = frame.barcodes()
assert len(barcodes) == 1
assert barcodes[0].text == "0123456789012"
def test_imageframe_full_text():
frame = ImageFrame(
source="mock",
image_bytes=None,
elements=[
ImageElement(element_type="title", text="Title", confidence=0.99),
ImageElement(element_type="plain_text", text="Paragraph.", confidence=0.9),
],
model="mock",
)
assert frame.full_text() == "Title\nParagraph."
def test_visionrouter_mock():
from cf_vision.router import VisionRouter
router = VisionRouter(mock=True)
frame = router.analyze(b"fake_image_bytes", task="document")
assert frame.source == "mock"
assert len(frame.elements) > 0
def test_visionrouter_mock_barcode():
from cf_vision.router import VisionRouter
router = VisionRouter(mock=True)
frame = router.analyze(b"fake", task="barcode")
barcodes = frame.barcodes()
assert len(barcodes) == 1
assert barcodes[0].element_type == "barcode"
def test_visionrouter_real_raises():
from cf_vision.router import VisionRouter
router = VisionRouter(mock=False)
with pytest.raises(NotImplementedError):
router.analyze(b"fake")