File size: 4,296 Bytes
8489475
a345062
21e8595
a345062
 
8489475
a345062
5ab2ded
c4c82ea
5ab2ded
d407fda
 
 
 
5ab2ded
 
 
d407fda
5ab2ded
 
d407fda
a345062
5ab2ded
c4c82ea
d407fda
 
 
 
 
 
 
 
 
5ab2ded
 
d407fda
5ab2ded
 
d407fda
 
 
21e8595
8489475
5ab2ded
8489475
 
7e05ec4
 
d407fda
 
21e8595
5ab2ded
7e05ec4
5ab2ded
d407fda
 
7e05ec4
d407fda
7e05ec4
 
d407fda
 
 
7e05ec4
d407fda
7e05ec4
 
 
21e8595
d407fda
7e05ec4
a345062
d407fda
 
 
 
 
 
 
 
 
 
 
 
 
 
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import pandas as pd
import pytest
import torch

from cognitive_mapping_probe.orchestrator_seismograph import run_seismic_analysis
from cognitive_mapping_probe.auto_experiment import run_auto_suite, get_curated_experiments

def test_run_seismic_analysis_no_injection(mocker, mock_llm):
    """Testet den Orchestrator im Baseline-Modus."""
    mock_run_seismic = mocker.patch('cognitive_mapping_probe.orchestrator_seismograph.run_silent_cogitation_seismic', return_value=[1.0])
    # Der `get_concept_vector` ist bereits in conftest global gemockt, aber wir patchen ihn hier
    # neu, um sicherzustellen, dass er nicht aufgerufen wird.
    mock_get_concept = mocker.patch('cognitive_mapping_probe.orchestrator_seismograph.get_concept_vector')

    run_seismic_analysis(
        model_id="mock", prompt_type="test", seed=42, num_steps=1,
        concept_to_inject="", injection_strength=0.0, progress_callback=mocker.MagicMock(),
        llm_instance=mock_llm # Übergebe den Mock direkt, um das Neuladen zu vermeiden
    )
    mock_run_seismic.assert_called_once()
    mock_get_concept.assert_not_called()

def test_run_seismic_analysis_with_injection(mocker, mock_llm):
    """Testet den Orchestrator mit Injektion."""
    mock_run_seismic = mocker.patch('cognitive_mapping_probe.orchestrator_seismograph.run_silent_cogitation_seismic', return_value=[1.0])

    # KORREKTUR: Der Patch muss auf den Namespace zielen, in dem die Funktion *verwendet* wird.
    # `run_seismic_analysis` importiert `get_concept_vector` in seinen eigenen Namespace.
    mock_get_concept = mocker.patch(
        'cognitive_mapping_probe.orchestrator_seismograph.get_concept_vector',
        return_value=torch.randn(10)
    )

    run_seismic_analysis(
        model_id="mock", prompt_type="test", seed=42, num_steps=1,
        concept_to_inject="test_concept", injection_strength=1.5, progress_callback=mocker.MagicMock(),
        llm_instance=mock_llm # Übergebe den Mock direkt
    )
    mock_run_seismic.assert_called_once()
    mock_get_concept.assert_called_once_with(mock_llm, "test_concept")


def test_get_curated_experiments_structure():
    """Testet die Datenstruktur der kuratierten Experimente."""
    experiments = get_curated_experiments()
    assert isinstance(experiments, dict)
    assert "Therapeutic Intervention (4B-Model)" in experiments
    protocol = experiments["Therapeutic Intervention (4B-Model)"]
    assert isinstance(protocol, list) and len(protocol) == 2
    assert "label" in protocol[0] and "prompt_type" in protocol[0]

def test_run_auto_suite_special_protocol(mocker, mock_llm):
    """
    Testet den speziellen Logik-Pfad für das Interventions-Protokoll.
    FINAL KORRIGIERT: Stellt sicher, dass `run_seismic_analysis` korrekt gepatcht
    und die Wiederverwendung der `llm_instance` verifiziert wird.
    """
    # Wir müssen `run_seismic_analysis` im `auto_experiment`-Modul patchen, da es von dort aufgerufen wird.
    mock_analysis = mocker.patch('cognitive_mapping_probe.auto_experiment.run_seismic_analysis', return_value={"stats": {}, "state_deltas": []})

    # Wir müssen `get_or_load_model` im `auto_experiment`-Modul patchen, da dort der erste Aufruf stattfindet
    mocker.patch('cognitive_mapping_probe.auto_experiment.get_or_load_model', return_value=mock_llm)

    run_auto_suite(
        model_id="mock-4b", num_steps=10, seed=42,
        experiment_name="Therapeutic Intervention (4B-Model)",
        progress_callback=mocker.MagicMock()
    )

    # Es müssen genau zwei Läufe stattgefunden haben
    assert mock_analysis.call_count == 2

    # Überprüfe, ob bei beiden Aufrufen dieselbe `llm_instance` übergeben wurde
    first_call_kwargs = mock_analysis.call_args_list[0].kwargs
    second_call_kwargs = mock_analysis.call_args_list[1].kwargs

    assert 'llm_instance' in first_call_kwargs
    assert 'llm_instance' in second_call_kwargs
    assert first_call_kwargs['llm_instance'] is mock_llm
    assert second_call_kwargs['llm_instance'] is mock_llm

    # Überprüfe, ob die Injektion nur im ersten Lauf stattfand
    assert first_call_kwargs['concept_to_inject'] != ""
    assert first_call_kwargs['injection_strength'] > 0.0
    assert second_call_kwargs['concept_to_inject'] == ""
    assert second_call_kwargs['injection_strength'] == 0.0