276 lines
8.6 KiB
Python
276 lines
8.6 KiB
Python
"""
|
|
Tests d'intégration pour Phase 2 - Mode Enrichi.
|
|
Vérifie que la détection d'éléments UI fonctionne correctement.
|
|
"""
|
|
|
|
import sys
|
|
import numpy as np
|
|
import cv2
|
|
from pathlib import Path
|
|
|
|
# Ajouter le chemin du module
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from geniusia2.core import (
|
|
UIElementDetector,
|
|
EnrichedScreenCapture,
|
|
WindowInfo,
|
|
BoundingBox
|
|
)
|
|
from geniusia2.core.logger import Logger
|
|
|
|
|
|
def test_bounding_box():
|
|
"""Test de la classe BoundingBox."""
|
|
print("\n" + "=" * 70)
|
|
print("TEST 1: BoundingBox")
|
|
print("=" * 70)
|
|
|
|
bbox1 = BoundingBox(10, 10, 50, 50, confidence=0.9, source="test")
|
|
bbox2 = BoundingBox(30, 30, 70, 70, confidence=0.8, source="test")
|
|
|
|
print(f"✓ BBox1 créée: ({bbox1.x1},{bbox1.y1},{bbox1.x2},{bbox1.y2})")
|
|
print(f" Aire: {bbox1.area()}")
|
|
print(f" Centre: {bbox1.center()}")
|
|
print(f" Confiance: {bbox1.confidence}")
|
|
|
|
print(f"✓ BBox2 créée: ({bbox2.x1},{bbox2.y1},{bbox2.x2},{bbox2.y2})")
|
|
|
|
iou = bbox1.iou(bbox2)
|
|
print(f"✓ IoU calculé: {iou:.3f}")
|
|
|
|
assert 0 <= iou <= 1, "IoU doit être entre 0 et 1"
|
|
assert bbox1.area() > 0, "L'aire doit être positive"
|
|
|
|
print("✓ Test BoundingBox réussi")
|
|
|
|
|
|
def test_region_proposer():
|
|
"""Test du RegionProposer."""
|
|
print("\n" + "=" * 70)
|
|
print("TEST 2: RegionProposer")
|
|
print("=" * 70)
|
|
|
|
from geniusia2.core.ui_element_detector import RegionProposer
|
|
|
|
# Créer un screenshot synthétique avec des rectangles
|
|
screenshot = np.ones((600, 800, 3), dtype=np.uint8) * 255
|
|
|
|
# Dessiner quelques rectangles (simulent des boutons)
|
|
cv2.rectangle(screenshot, (100, 100), (200, 150), (0, 0, 0), 2)
|
|
cv2.rectangle(screenshot, (300, 200), (400, 250), (0, 0, 0), 2)
|
|
cv2.putText(screenshot, "Valider", (110, 130), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
|
|
|
|
# Créer le proposer
|
|
proposer = RegionProposer(config={
|
|
"use_text_detection": True,
|
|
"use_rectangle_detection": True,
|
|
"use_vlm_detection": False
|
|
})
|
|
|
|
print(f"✓ RegionProposer créé")
|
|
print(f" use_text_detection: {proposer.use_text_detection}")
|
|
print(f" use_rectangle_detection: {proposer.use_rectangle_detection}")
|
|
|
|
# Proposer des régions
|
|
window_info = WindowInfo(
|
|
app_name="test_app",
|
|
window_title="Test Window",
|
|
screen_resolution=(800, 600)
|
|
)
|
|
|
|
regions = proposer.propose_regions(screenshot, window_info)
|
|
|
|
print(f"✓ Régions proposées: {len(regions)}")
|
|
for i, region in enumerate(regions[:5]): # Afficher les 5 premières
|
|
print(f" Région {i+1}: ({region.x1},{region.y1},{region.x2},{region.y2}) - {region.source}")
|
|
|
|
assert len(regions) >= 0, "Doit retourner une liste (peut être vide)"
|
|
|
|
print("✓ Test RegionProposer réussi")
|
|
|
|
|
|
def test_ui_element_detector():
|
|
"""Test du UIElementDetector complet."""
|
|
print("\n" + "=" * 70)
|
|
print("TEST 3: UIElementDetector")
|
|
print("=" * 70)
|
|
|
|
logger = Logger(log_dir="test_logs")
|
|
|
|
# Créer un screenshot synthétique
|
|
screenshot = np.ones((600, 800, 3), dtype=np.uint8) * 255
|
|
cv2.rectangle(screenshot, (100, 100), (200, 150), (0, 0, 0), 2)
|
|
cv2.putText(screenshot, "Valider", (110, 130), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
|
|
|
|
# Créer le détecteur (sans VLM pour les tests)
|
|
detector = UIElementDetector(
|
|
llm_manager=None, # Pas de VLM pour les tests
|
|
logger=logger,
|
|
config={
|
|
"region_proposer": {
|
|
"use_text_detection": True,
|
|
"use_rectangle_detection": True,
|
|
"use_vlm_detection": False
|
|
}
|
|
}
|
|
)
|
|
|
|
print(f"✓ UIElementDetector créé")
|
|
|
|
# Détecter les éléments
|
|
window_info = WindowInfo(
|
|
app_name="test_app",
|
|
window_title="Test Window",
|
|
screen_resolution=(800, 600)
|
|
)
|
|
|
|
elements = detector.detect_elements(
|
|
screenshot=screenshot,
|
|
window_info=window_info,
|
|
data_dir="test_data"
|
|
)
|
|
|
|
print(f"✓ Éléments détectés: {len(elements)}")
|
|
for i, elem in enumerate(elements[:3]): # Afficher les 3 premiers
|
|
print(f" Élément {i+1}:")
|
|
print(f" ID: {elem.element_id}")
|
|
print(f" Type: {elem.type.value}")
|
|
print(f" Role: {elem.role}")
|
|
print(f" Label: {elem.label}")
|
|
print(f" BBox: {elem.bbox}")
|
|
print(f" Confiance: {elem.confidence:.2f}")
|
|
|
|
# Vérifications
|
|
for elem in elements:
|
|
assert elem.element_id, "element_id doit être non-vide"
|
|
assert elem.type, "type doit être défini"
|
|
assert elem.role, "role doit être défini"
|
|
assert len(elem.bbox) == 4, "bbox doit avoir 4 coordonnées"
|
|
assert 0 <= elem.confidence <= 1, "confidence doit être entre 0 et 1"
|
|
|
|
print("✓ Test UIElementDetector réussi")
|
|
|
|
|
|
def test_enriched_screen_capture():
|
|
"""Test du EnrichedScreenCapture."""
|
|
print("\n" + "=" * 70)
|
|
print("TEST 4: EnrichedScreenCapture")
|
|
print("=" * 70)
|
|
|
|
logger = Logger(log_dir="test_logs")
|
|
|
|
# Test mode light
|
|
print("\n Test mode light:")
|
|
capture_light = EnrichedScreenCapture(
|
|
logger=logger,
|
|
data_dir="test_data",
|
|
mode="light"
|
|
)
|
|
print(f" ✓ Mode: {capture_light.get_mode()}")
|
|
print(f" ✓ UI Detector actif: {capture_light.ui_detector is not None}")
|
|
assert capture_light.get_mode() == "light"
|
|
assert capture_light.ui_detector is None
|
|
|
|
# Test mode enriched
|
|
print("\n Test mode enriched:")
|
|
capture_enriched = EnrichedScreenCapture(
|
|
logger=logger,
|
|
data_dir="test_data",
|
|
mode="enriched"
|
|
)
|
|
print(f" ✓ Mode: {capture_enriched.get_mode()}")
|
|
print(f" ✓ UI Detector actif: {capture_enriched.ui_detector is not None}")
|
|
assert capture_enriched.get_mode() == "enriched"
|
|
assert capture_enriched.ui_detector is not None
|
|
|
|
# Test changement de mode
|
|
print("\n Test changement de mode:")
|
|
capture_enriched.set_mode("light")
|
|
print(f" ✓ Nouveau mode: {capture_enriched.get_mode()}")
|
|
print(f" ✓ UI Detector après changement: {capture_enriched.ui_detector is not None}")
|
|
assert capture_enriched.get_mode() == "light"
|
|
assert capture_enriched.ui_detector is None
|
|
|
|
# Test capture (sans sauvegarde)
|
|
print("\n Test capture sans sauvegarde:")
|
|
screenshot = np.ones((600, 800, 3), dtype=np.uint8) * 255
|
|
|
|
screen_state = capture_light.capture_and_enrich(
|
|
screenshot=screenshot,
|
|
session_id="test_session",
|
|
window_title="Test Window",
|
|
app_name="test_app",
|
|
screen_resolution=(800, 600),
|
|
save=False
|
|
)
|
|
|
|
print(f" ✓ ScreenState créé: {screen_state.screen_state_id}")
|
|
print(f" ✓ Mode: {screen_state.mode}")
|
|
print(f" ✓ UI Elements: {len(screen_state.ui_elements)}")
|
|
|
|
assert screen_state.screen_state_id
|
|
assert screen_state.mode == "light"
|
|
assert len(screen_state.ui_elements) == 0 # Mode light = pas d'éléments
|
|
|
|
print("\n✓ Test EnrichedScreenCapture réussi")
|
|
|
|
|
|
def cleanup():
|
|
"""Nettoie les fichiers de test."""
|
|
import shutil
|
|
|
|
if Path("test_data").exists():
|
|
shutil.rmtree("test_data")
|
|
if Path("test_logs").exists():
|
|
shutil.rmtree("test_logs")
|
|
|
|
|
|
def main():
|
|
"""Exécute tous les tests."""
|
|
print("\n" + "=" * 70)
|
|
print("TESTS D'INTÉGRATION - PHASE 2 MODE ENRICHI")
|
|
print("UI Element Detection - Détection d'Éléments Basique")
|
|
print("=" * 70)
|
|
|
|
try:
|
|
# Test 1: BoundingBox
|
|
test_bounding_box()
|
|
|
|
# Test 2: RegionProposer
|
|
test_region_proposer()
|
|
|
|
# Test 3: UIElementDetector
|
|
test_ui_element_detector()
|
|
|
|
# Test 4: EnrichedScreenCapture
|
|
test_enriched_screen_capture()
|
|
|
|
print("\n" + "=" * 70)
|
|
print("✓ TOUS LES TESTS RÉUSSIS!")
|
|
print("=" * 70)
|
|
print("\nRésumé:")
|
|
print(" ✓ BoundingBox: Calculs IoU, aire, centre")
|
|
print(" ✓ RegionProposer: Détection de régions")
|
|
print(" ✓ UIElementDetector: Pipeline complet de détection")
|
|
print(" ✓ EnrichedScreenCapture: Intégration complète")
|
|
print("\nPhase 2 (Mode Enrichi) implémentée avec succès!")
|
|
print("Le système peut maintenant détecter les éléments UI.")
|
|
print("=" * 70)
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n✗ ÉCHEC DU TEST: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
finally:
|
|
cleanup()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
success = main()
|
|
sys.exit(0 if success else 1)
|