Initial commit

This commit is contained in:
Dom
2026-03-05 00:20:25 +01:00
commit dcd4de9945
1954 changed files with 669380 additions and 0 deletions

275
test_ui_element_phase2.py Normal file
View 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)