Initial commit
This commit is contained in:
275
test_ui_element_phase2.py
Normal file
275
test_ui_element_phase2.py
Normal file
@@ -0,0 +1,275 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user