File size: 2,629 Bytes
343eed9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

import unittest
import sys
from pathlib import Path

# Add project root to path
ROOT_DIR = Path(__file__).resolve().parent.parent.parent
sys.path.append(str(ROOT_DIR))

from engine.utils.normalizer import normalize_content

class TestNormalizer(unittest.TestCase):

    def test_gemini_messy_format(self):
        """Teste le format typique renvoyé par Gemini."""
        messy_input = """
## Scene 1 : Le Phare (0-5s)
L'Histoire : Il était une fois un phare.
Audio : Corne de brume.
**Visual Prompt** : Establishing shot of lighthouse, dark anime style --ar 9:16
"""
        output = normalize_content(messy_input)
        self.assertIn('**Visual Prompt :** Establishing shot of lighthouse, dark anime style --ar 9:16', output)
        self.assertIn('**Narration :** "Il était une fois un phare. Corne de brume."', output)
        self.assertNotIn('(0-5s)', output)

    def test_english_prompt_only(self):
        """Teste le cas où Gemini renvoie juste un 'Visual Prompt' sans narration explicite."""
        messy_input = """
## Scene 6
**Visual Prompt** : Inside the staircase. Thousands of eyes. --ar 9:16
"""
        output = normalize_content(messy_input)
        # Le visuel doit être capturé
        self.assertIn('**Visual Prompt :** Inside the staircase. Thousands of eyes. --ar 9:16', output)
        # La narration doit être vide (et non contenir le label Visual Prompt)
        self.assertIn('**Narration :** ""', output)

    def test_cinematic_fallback(self):
        """Teste le cas sans aucun label (brut)."""
        messy_input = """
## Scene 1
Plan de drone sur la forêt.
"Ils arrivent."
"""
        output = normalize_content(messy_input)
        self.assertIn('**Visual Prompt :** Plan de drone sur la forêt.', output)
        self.assertIn('**Narration :** "Ils arrivent."', output)

    def test_idempotency(self):
        """Vérifie que normaliser un fichier déjà standard ne change rien."""
        standard = """## Scene 1\n**Visual Prompt :** Test\n**Narration :** "Test"\n\n"""
        output = normalize_content(standard)
        # On ignore les différences de sauts de ligne finaux pour ce test
        self.assertEqual(output.strip(), standard.strip())

    def test_cleaning_markers(self):
        """Vérifie le nettoyage des ** et des guillemets dans les champs."""
        messy = """## Scene 1\n**Visual Prompt** : **Un monstre**\nNarration : "L'horreur"\n"""
        output = normalize_content(messy)
        self.assertIn('**Visual Prompt :** Un monstre', output)
        self.assertIn('**Narration :** "L\'horreur"', output)

if __name__ == "__main__":
    unittest.main()