| from character import INTRO_CARDS, INTRO_SEQUENCES, build_system_prompt |
|
|
|
|
| def test_intro_cards_and_sequences(): |
| |
| assert len(INTRO_CARDS) == 5 |
| assert all(isinstance(c, str) and c.strip() for c in INTRO_CARDS) |
| |
| assert INTRO_SEQUENCES["tester"] == [0, 4, 3] |
| assert INTRO_SEQUENCES["full"] == [0, 1, 2, 3] |
| |
| for seq in INTRO_SEQUENCES.values(): |
| assert all(0 <= i < len(INTRO_CARDS) for i in seq) |
| |
| assert any("memory" in INTRO_CARDS[i].lower() for i in INTRO_SEQUENCES["tester"]) |
|
|
|
|
| class TestMimicry: |
| def test_always_present(self): |
| assert "mirror the visitor's writing style" in build_system_prompt(20, []) |
|
|
| def test_present_with_recall_too(self): |
| p = build_system_prompt(60, ["had a dog"], recall_memory="had a dog") |
| assert "mirror the visitor's writing style" in p |
|
|
|
|
| class TestToneBands: |
| def test_warm_band_at_15(self): |
| assert "gentle with you" in build_system_prompt(50, [], tone=15) |
|
|
| def test_no_band_when_neutral(self): |
| p = build_system_prompt(50, [], tone=0) |
| assert "gentle with you" not in p |
| assert "words have hurt you" not in p |
| assert "curdled" not in p |
|
|
| def test_no_band_at_minus_14(self): |
| p = build_system_prompt(50, [], tone=-14) |
| assert "words have hurt you" not in p |
|
|
| def test_wounded_band_at_minus_15(self): |
| assert "words have hurt you" in build_system_prompt(50, [], tone=-15) |
|
|
| def test_wounded_band_at_minus_21(self): |
| assert "words have hurt you" in build_system_prompt(50, [], tone=-21) |
|
|
| def test_hostile_band_at_minus_22(self): |
| assert "curdled" in build_system_prompt(50, [], tone=-22) |
|
|
|
|
| class TestWoundEcho: |
| def test_hostile_injects_last_two_wounds(self): |
| p = build_system_prompt(50, [], tone=-50, |
| wounds=["one", "two", "three"]) |
| assert '"two"' in p and '"three"' in p |
| assert '"one"' not in p |
|
|
| def test_wounded_band_does_not_inject(self): |
| p = build_system_prompt(50, [], tone=-20, wounds=["one"]) |
| assert '"one"' not in p |
|
|
| def test_hostile_without_wounds_safe(self): |
| p = build_system_prompt(50, [], tone=-50, wounds=[]) |
| assert "curdled" in p |
|
|
|
|
| class TestBackwardCompat: |
| def test_old_call_signature_still_works(self): |
| p = build_system_prompt(60, ["had a dog"], "had a dog") |
| assert "claim this one specific memory" in p |
|
|
|
|
| class TestVarietyDirective: |
| def test_variety_directive_present(self): |
| p = build_system_prompt(30, []) |
| assert "ONE or TWO short lines" in p |
| assert "at most every other turn" in p |
|
|
|
|
| class TestStayInWood: |
| def test_injection_hardening_always_present(self): |
| assert "not from the wood" in build_system_prompt(20, []) |
|
|
|
|
| class TestAskForMemory: |
| def test_nudge_when_asked(self): |
| p = build_system_prompt(30, [], memory_plea=1) |
| assert "one small true thing" in p |
|
|
| def test_no_nudge_by_default(self): |
| p = build_system_prompt(30, []) |
| assert "one small true thing" not in p |
|
|
|
|
| class TestMemoryPlea: |
| def test_memory_plea_levels_escalate(self): |
| p0 = build_system_prompt(20, [], memory_plea=0) |
| p1 = build_system_prompt(20, [], memory_plea=1) |
| p2 = build_system_prompt(20, [], memory_plea=2) |
| p3 = build_system_prompt(20, [], memory_plea=3) |
| |
| assert "memory" not in p0.lower() or "claim this one" in p0.lower() |
| |
| assert p1 != p0 and p2 != p1 and p3 != p2 |
| assert "a person they loved" in p3 and "a moment they can still see" in p3 |
|
|
|
|
| def test_own_fragments_caor_arc(): |
| from character import OWN_FRAGMENTS |
| assert len(OWN_FRAGMENTS) == 5 |
| joined = " ".join(OWN_FRAGMENTS).lower() |
| assert "caor" in joined and "gaunt" in joined and "brother" in joined |
| assert "hunger" in OWN_FRAGMENTS[0].lower() |
|
|
|
|
| def test_system_prompt_carries_world(): |
| from character import build_system_prompt |
| p = build_system_prompt(20, [], recall_memory=None, tone=0, wounds=None, |
| memory_plea=0, own_fragment=None, style="concise", |
| aware_memory=None) |
| assert "Caor" in p and "Gaunt" in p |
|
|