-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_run.log
More file actions
567 lines (565 loc) · 56 KB
/
test_run.log
File metadata and controls
567 lines (565 loc) · 56 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
============================= test session starts ==============================
platform darwin -- Python 3.14.2, pytest-9.0.2, pluggy-1.6.0 -- /opt/homebrew/opt/python@3.14/bin/python3.14
cachedir: .pytest_cache
rootdir: /Users/keithavery/Projects/sidequest
configfile: pyproject.toml
plugins: anyio-4.12.1, mock-3.15.1, asyncio-1.3.0
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collecting ... collected 556 items
tests/test_agent_prompt_composition.py::TestNarratorComposePrompt::test_appends_extension PASSED [ 0%]
tests/test_agent_prompt_composition.py::TestNarratorComposePrompt::test_extension_comes_after_base PASSED [ 0%]
tests/test_agent_prompt_composition.py::TestNarratorComposePrompt::test_empty_extension_returns_base_unchanged PASSED [ 0%]
tests/test_agent_prompt_composition.py::TestNarratorComposePrompt::test_none_like_empty_extension_returns_base PASSED [ 0%]
tests/test_agent_prompt_composition.py::TestCombatComposePrompt::test_appends_extension PASSED [ 0%]
tests/test_agent_prompt_composition.py::TestCombatComposePrompt::test_empty_extension_returns_base_unchanged PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestNpcComposePrompt::test_appends_extension PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestNpcComposePrompt::test_empty_extension_returns_base_unchanged PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestWorldStateComposePrompt::test_appends_extension PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestWorldStateComposePrompt::test_empty_extension_returns_base_unchanged PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestGenreContextHeaderFormat::test_header_on_its_own_line PASSED [ 1%]
tests/test_agent_prompt_composition.py::TestGenreContextHeaderFormat::test_blank_line_separates_base_from_header PASSED [ 2%]
tests/test_agent_prompt_composition.py::TestGenreContextHeaderFormat::test_extension_follows_header PASSED [ 2%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_orchestrator_accepts_genre_pack_param PASSED [ 2%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_orchestrator_stores_genre_pack_none_by_default PASSED [ 2%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_narrator_session_has_genre_extension PASSED [ 2%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_combat_session_has_genre_extension PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_npc_session_has_genre_extension PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_world_state_session_has_genre_extension PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_all_sessions_get_composed_prompts PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorGenrePack::test_composed_prompts_retain_base PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorNoGenrePack::test_narrator_uses_base_prompt PASSED [ 3%]
tests/test_agent_prompt_composition.py::TestOrchestratorNoGenrePack::test_combat_uses_base_prompt PASSED [ 4%]
tests/test_agent_prompt_composition.py::TestOrchestratorNoGenrePack::test_npc_uses_base_prompt PASSED [ 4%]
tests/test_agent_prompt_composition.py::TestOrchestratorNoGenrePack::test_world_state_uses_base_prompt PASSED [ 4%]
tests/test_agent_prompt_composition.py::TestOrchestratorNoGenrePack::test_no_genre_context_header_without_pack PASSED [ 4%]
tests/test_agent_prompt_composition.py::TestBaseLowFantasyFallback::test_narrator_base_has_low_fantasy PASSED [ 4%]
tests/test_agent_prompt_composition.py::TestBaseLowFantasyFallback::test_combat_base_has_low_fantasy PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestBaseLowFantasyFallback::test_npc_base_has_low_fantasy PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestBaseLowFantasyFallback::test_world_state_base_has_low_fantasy PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestBaseLowFantasyFallback::test_genre_extension_does_not_remove_low_fantasy PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestComposePromptEdgeCases::test_multiline_extension PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestComposePromptEdgeCases::test_extension_with_special_characters PASSED [ 5%]
tests/test_agent_prompt_composition.py::TestComposePromptEdgeCases::test_whitespace_only_extension_treated_as_empty PASSED [ 6%]
tests/test_agent_prompt_composition.py::TestComposePromptEdgeCases::test_each_agent_has_independent_compose PASSED [ 6%]
tests/test_char_creation_scenes.py::TestSceneCount::test_pack_has_five_scenes PASSED [ 6%]
tests/test_char_creation_scenes.py::TestSceneCount::test_scene_ids_match_spec PASSED [ 6%]
tests/test_char_creation_scenes.py::TestSceneCount::test_each_scene_has_title PASSED [ 6%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_narration[origins] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_narration[crucible] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_narration[companion] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_narration[the_road] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_narration_is_multiline[origins] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_narration_is_multiline[crucible] PASSED [ 7%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_narration_is_multiline[companion] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_narration_is_multiline[the_road] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_choices[origins] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_choices[crucible] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_choices[companion] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_choices[the_road] PASSED [ 8%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_at_most_four_choices[origins] PASSED [ 9%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_at_most_four_choices[crucible] PASSED [ 9%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_at_most_four_choices[companion] PASSED [ 9%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_has_at_most_four_choices[the_road] PASSED [ 9%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_allows_freeform[origins] PASSED [ 9%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_allows_freeform[crucible] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_allows_freeform[companion] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestSceneStructure::test_scene_allows_freeform[the_road] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_labels[origins] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_labels[crucible] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_labels[companion] PASSED [ 10%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_labels[the_road] PASSED [ 11%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_descriptions[origins] PASSED [ 11%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_descriptions[crucible] PASSED [ 11%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_descriptions[companion] PASSED [ 11%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_descriptions[the_road] PASSED [ 11%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_mechanical_effects[origins] PASSED [ 12%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_mechanical_effects[crucible] PASSED [ 12%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_mechanical_effects[companion] PASSED [ 12%]
tests/test_char_creation_scenes.py::TestChoiceStructure::test_choices_have_mechanical_effects[the_road] PASSED [ 12%]
tests/test_char_creation_scenes.py::TestOriginsEffects::test_origins_choices_have_race_hint PASSED [ 12%]
tests/test_char_creation_scenes.py::TestOriginsEffects::test_origins_choices_have_background PASSED [ 12%]
tests/test_char_creation_scenes.py::TestCrucibleEffects::test_crucible_choices_have_class_hint PASSED [ 13%]
tests/test_char_creation_scenes.py::TestCrucibleEffects::test_crucible_choices_have_personality_trait PASSED [ 13%]
tests/test_char_creation_scenes.py::TestCompanionEffects::test_companion_choices_have_relationship PASSED [ 13%]
tests/test_char_creation_scenes.py::TestCompanionEffects::test_companion_choices_have_personality_trait PASSED [ 13%]
tests/test_char_creation_scenes.py::TestTheRoadEffects::test_the_road_choices_have_goals PASSED [ 13%]
tests/test_char_creation_scenes.py::TestTheRoadEffects::test_the_road_choices_have_emotional_state PASSED [ 14%]
tests/test_char_creation_scenes.py::TestConfirmationScene::test_confirmation_has_no_choices PASSED [ 14%]
tests/test_char_creation_scenes.py::TestConfirmationScene::test_confirmation_has_narration_template PASSED [ 14%]
tests/test_char_creation_scenes.py::TestConfirmationScene::test_confirmation_is_last_scene PASSED [ 14%]
tests/test_char_creation_scenes.py::TestMechanicalEffectsValidation::test_all_race_hints_are_allowed PASSED [ 14%]
tests/test_char_creation_scenes.py::TestMechanicalEffectsValidation::test_all_class_hints_are_allowed PASSED [ 14%]
tests/test_char_creation_scenes.py::TestSchemaValidation::test_all_scenes_are_char_creation_scene_instances PASSED [ 15%]
tests/test_char_creation_scenes.py::TestSchemaValidation::test_all_scene_ids_are_strings PASSED [ 15%]
tests/test_char_creation_scenes.py::TestBuilderIntegration::test_builder_loads_all_five_scenes PASSED [ 15%]
tests/test_char_creation_scenes.py::TestBuilderIntegration::test_builder_walks_through_all_scenes_with_choices PASSED [ 15%]
tests/test_char_creation_scenes.py::TestBuilderIntegration::test_builder_produces_character_from_full_scenes PASSED [ 15%]
tests/test_char_creation_scenes.py::TestBuilderIntegration::test_builder_accumulates_effects_from_scenes PASSED [ 16%]
tests/test_char_creation_scenes.py::TestBuilderIntegration::test_builder_freeform_through_all_scenes PASSED [ 16%]
tests/test_character_builder.py::TestBuilderStateEnum::test_idle_state_exists PASSED [ 16%]
tests/test_character_builder.py::TestBuilderStateEnum::test_in_progress_state_exists PASSED [ 16%]
tests/test_character_builder.py::TestBuilderStateEnum::test_confirmation_state_exists PASSED [ 16%]
tests/test_character_builder.py::TestBuilderStateEnum::test_complete_state_exists PASSED [ 16%]
tests/test_character_builder.py::TestBuilderStateEnum::test_states_are_distinct PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_initial_state_is_idle PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_start_transitions_to_in_progress PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_applying_choices_through_scenes_reaches_confirmation PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_build_transitions_to_complete PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_cannot_apply_choice_in_idle_state PASSED [ 17%]
tests/test_character_builder.py::TestStateTransitions::test_cannot_apply_choice_in_complete_state PASSED [ 18%]
tests/test_character_builder.py::TestBuilderInitialization::test_loads_scenes_from_genre_pack PASSED [ 18%]
tests/test_character_builder.py::TestBuilderInitialization::test_stores_genre_pack_reference PASSED [ 18%]
tests/test_character_builder.py::TestBuilderInitialization::test_initial_scene_index_is_zero PASSED [ 18%]
tests/test_character_builder.py::TestBuilderInitialization::test_choices_made_initially_empty PASSED [ 18%]
tests/test_character_builder.py::TestBuilderInitialization::test_freeform_inputs_initially_empty PASSED [ 19%]
tests/test_character_builder.py::TestCurrentScene::test_current_scene_returns_first_scene_after_start PASSED [ 19%]
tests/test_character_builder.py::TestCurrentScene::test_current_scene_advances_after_choice PASSED [ 19%]
tests/test_character_builder.py::TestCurrentScene::test_current_scene_is_confirmation_at_end PASSED [ 19%]
tests/test_character_builder.py::TestCurrentScene::test_current_scene_none_before_start PASSED [ 19%]
tests/test_character_builder.py::TestCurrentScene::test_start_returns_first_scene PASSED [ 19%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_accumulates_mechanical_effects PASSED [ 20%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_sets_race_hint PASSED [ 20%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_sets_class_hint PASSED [ 20%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_stores_personality_trait PASSED [ 20%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_stores_background PASSED [ 20%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_advances_scene PASSED [ 21%]
tests/test_character_builder.py::TestApplyChoice::test_apply_choice_returns_next_scene_or_none PASSED [ 21%]
tests/test_character_builder.py::TestApplyChoice::test_out_of_range_choice_raises PASSED [ 21%]
tests/test_character_builder.py::TestApplyChoice::test_negative_choice_index_raises PASSED [ 21%]
tests/test_character_builder.py::TestApplyFreeform::test_freeform_stores_text PASSED [ 21%]
tests/test_character_builder.py::TestApplyFreeform::test_freeform_returns_raw_text PASSED [ 21%]
tests/test_character_builder.py::TestApplyFreeform::test_freeform_advances_scene PASSED [ 22%]
tests/test_character_builder.py::TestApplyFreeform::test_freeform_on_non_freeform_scene_raises PASSED [ 22%]
tests/test_character_builder.py::TestApplyFreeform::test_freeform_stores_backstory_fragment PASSED [ 22%]
tests/test_character_builder.py::TestApplyFreeform::test_multiple_freeform_inputs_accumulate PASSED [ 22%]
tests/test_character_builder.py::TestBuild::test_build_produces_character PASSED [ 22%]
tests/test_character_builder.py::TestBuild::test_build_character_has_name PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_character_has_class PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_character_has_race PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_without_name_raises PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_before_all_scenes_raises PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_defaults_class_to_fighter PASSED [ 23%]
tests/test_character_builder.py::TestBuild::test_build_defaults_race_to_human PASSED [ 24%]
tests/test_character_builder.py::TestRuleEnforcement::test_disallowed_class_raises_invalid_choice PASSED [ 24%]
tests/test_character_builder.py::TestRuleEnforcement::test_disallowed_race_raises_invalid_choice PASSED [ 24%]
tests/test_character_builder.py::TestRuleEnforcement::test_allowed_class_does_not_raise PASSED [ 24%]
tests/test_character_builder.py::TestRuleEnforcement::test_allowed_race_does_not_raise PASSED [ 24%]
tests/test_character_builder.py::TestStatGeneration::test_point_buy_generates_six_stats PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_point_buy_stat_names PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_point_buy_scores_in_valid_range PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_point_buy_total_within_budget PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_4d6_drop_lowest_generates_six_stats PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_4d6_drop_lowest_scores_in_valid_range PASSED [ 25%]
tests/test_character_builder.py::TestStatGeneration::test_generate_stats_stores_on_builder PASSED [ 26%]
tests/test_character_builder.py::TestStatGeneration::test_stats_included_in_built_character PASSED [ 26%]
tests/test_character_builder.py::TestSerialization::test_to_dict_returns_dict PASSED [ 26%]
tests/test_character_builder.py::TestSerialization::test_to_dict_includes_state PASSED [ 26%]
tests/test_character_builder.py::TestSerialization::test_to_dict_includes_scene_index PASSED [ 26%]
tests/test_character_builder.py::TestSerialization::test_to_dict_includes_choices_made PASSED [ 26%]
tests/test_character_builder.py::TestSerialization::test_to_dict_includes_freeform_inputs PASSED [ 27%]
tests/test_character_builder.py::TestSerialization::test_from_dict_restores_state PASSED [ 27%]
tests/test_character_builder.py::TestSerialization::test_from_dict_restores_choices PASSED [ 27%]
tests/test_character_builder.py::TestSerialization::test_from_dict_restores_freeform PASSED [ 27%]
tests/test_character_builder.py::TestSerialization::test_roundtrip_mid_creation PASSED [ 27%]
tests/test_character_builder.py::TestSerialization::test_from_dict_restores_name PASSED [ 28%]
tests/test_character_builder.py::TestSerialization::test_from_dict_restores_intermediate_fields PASSED [ 28%]
tests/test_character_builder.py::TestErrorStates::test_builder_incomplete_error_is_exception PASSED [ 28%]
tests/test_character_builder.py::TestErrorStates::test_invalid_choice_error_is_exception PASSED [ 28%]
tests/test_character_builder.py::TestErrorStates::test_set_name_stores_name PASSED [ 28%]
tests/test_character_builder.py::TestErrorStates::test_set_name_empty_raises PASSED [ 28%]
tests/test_character_builder.py::TestErrorStates::test_set_name_whitespace_only_raises PASSED [ 29%]
tests/test_character_builder.py::TestErrorStates::test_empty_scenes_pack PASSED [ 29%]
tests/test_character_builder.py::TestFullWalkthrough::test_complete_character_creation_flow PASSED [ 29%]
tests/test_character_builder.py::TestFullWalkthrough::test_freeform_walkthrough PASSED [ 29%]
tests/test_character_creation_cli.py::TestCharacterCreationFlowExists::test_character_creation_flow_importable PASSED [ 29%]
tests/test_character_creation_cli.py::TestCharacterCreationFlowExists::test_character_creation_flow_signature PASSED [ 30%]
tests/test_character_creation_cli.py::TestCharacterCreationFlowExists::test_run_single_creation_importable PASSED [ 30%]
tests/test_character_creation_cli.py::TestMainGenrePackWiring::test_main_loads_genre_pack PASSED [ 30%]
tests/test_character_creation_cli.py::TestMainGenrePackWiring::test_main_passes_genre_pack_to_creation_flow PASSED [ 30%]
tests/test_character_creation_cli.py::TestMainGenrePackWiring::test_main_passes_genre_pack_to_orchestrator PASSED [ 30%]
tests/test_character_creation_cli.py::TestDisplayScene::test_display_scene_importable PASSED [ 30%]
tests/test_character_creation_cli.py::TestDisplayScene::test_display_scene_shows_narration PASSED [ 31%]
tests/test_character_creation_cli.py::TestDisplayScene::test_display_scene_shows_scene_title PASSED [ 31%]
tests/test_character_creation_cli.py::TestDisplayScene::test_display_scene_shows_numbered_choices PASSED [ 31%]
tests/test_character_creation_cli.py::TestDisplayScene::test_display_scene_no_choices_for_confirmation PASSED [ 31%]
tests/test_character_creation_cli.py::TestSceneProgression::test_walks_all_scenes PASSED [ 31%]
tests/test_character_creation_cli.py::TestSceneProgression::test_scene_input_choice_by_number PASSED [ 32%]
tests/test_character_creation_cli.py::TestSceneProgression::test_reject_character_returns_none PASSED [ 32%]
tests/test_character_creation_cli.py::TestFreeformEscapeHatch::test_freeform_text_accepted PASSED [ 32%]
tests/test_character_creation_cli.py::TestFreeformEscapeHatch::test_question_mark_triggers_freeform_prompt PASSED [ 32%]
tests/test_character_creation_cli.py::TestFreeformEscapeHatch::test_mixed_freeform_and_choices PASSED [ 32%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_has_name PASSED [ 32%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_has_class_from_choice PASSED [ 33%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_has_race_from_choice PASSED [ 33%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_has_stats PASSED [ 33%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_passes_validation PASSED [ 33%]
tests/test_character_creation_cli.py::TestCharacterAssembly::test_built_character_has_personality PASSED [ 33%]
tests/test_character_creation_cli.py::TestDisplayCharacterSummary::test_display_character_summary_importable PASSED [ 33%]
tests/test_character_creation_cli.py::TestDisplayCharacterSummary::test_display_character_summary_shows_name PASSED [ 34%]
tests/test_character_creation_cli.py::TestDisplayCharacterSummary::test_display_character_summary_shows_class PASSED [ 34%]
tests/test_character_creation_cli.py::TestDisplayCharacterSummary::test_display_character_summary_shows_race PASSED [ 34%]
tests/test_character_creation_cli.py::TestCharacterAddedToGameState::test_characters_passed_to_game_state PASSED [ 34%]
tests/test_character_creation_cli.py::TestCharacterAddedToGameState::test_multiple_characters_in_game_state PASSED [ 34%]
tests/test_character_creation_cli.py::TestEdgeCases::test_ctrl_c_during_creation_exits_cleanly PASSED [ 35%]
tests/test_character_creation_cli.py::TestEdgeCases::test_genre_pack_not_found_graceful PASSED [ 35%]
tests/test_character_creation_cli.py::TestEdgeCases::test_no_characters_created PASSED [ 35%]
tests/test_character_creation_cli.py::TestEdgeCases::test_empty_name_reprompts PASSED [ 35%]
tests/test_character_creation_cli.py::TestIntegrationWithLowFantasy::test_full_flow_with_real_pack PASSED [ 35%]
tests/test_character_creation_cli.py::TestIntegrationWithLowFantasy::test_freeform_with_real_pack PASSED [ 35%]
tests/test_character_creation_cli.py::TestIntegrationWithLowFantasy::test_display_scenes_render_without_errors PASSED [ 36%]
tests/test_combat_agent.py::TestCombatPrompt::test_prompt_mentions_personality PASSED [ 36%]
tests/test_combat_agent.py::TestCombatPrompt::test_prompt_mentions_narrative PASSED [ 36%]
tests/test_combat_agent.py::TestCombatPrompt::test_prompt_mentions_low_fantasy PASSED [ 36%]
tests/test_combat_agent.py::TestCombatPrompt::test_prompt_wraps_mechanics_in_story PASSED [ 36%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_name_and_class PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_hp_and_ac PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_personality_for_combat_flavour PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_emotional_state PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_inventory PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_includes_relationships_for_ally_awareness PASSED [ 37%]
tests/test_combat_agent.py::TestFormatCombatContext::test_omits_empty_optional_fields PASSED [ 38%]
tests/test_freeform_parser.py::TestParseFreeformImportable::test_parse_freeform_character_importable PASSED [ 38%]
tests/test_freeform_parser.py::TestParseFreeformImportable::test_parse_freeform_character_signature PASSED [ 38%]
tests/test_freeform_parser.py::TestParseFreeformImportable::test_fallback_keyword_parse_importable PASSED [ 38%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_name_from_claude_response PASSED [ 38%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_race_from_claude_response PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_class_from_claude_response PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_backstory PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_personality PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_relationships PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_goals PASSED [ 39%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_extracts_emotional_state PASSED [ 40%]
tests/test_freeform_parser.py::TestClaudeInterpretation::test_sends_prompt_to_claude PASSED [ 40%]
tests/test_freeform_parser.py::TestGenreRuleValidation::test_banned_class_remapped_to_allowed PASSED [ 40%]
tests/test_freeform_parser.py::TestGenreRuleValidation::test_banned_race_remapped_to_allowed PASSED [ 40%]
tests/test_freeform_parser.py::TestGenreRuleValidation::test_allowed_class_passes_through PASSED [ 40%]
tests/test_freeform_parser.py::TestGenreRuleValidation::test_allowed_race_passes_through PASSED [ 41%]
tests/test_freeform_parser.py::TestGenreRuleValidation::test_empty_allowed_lists_accept_anything PASSED [ 41%]
tests/test_freeform_parser.py::TestStatsGeneration::test_stats_generated_for_character PASSED [ 41%]
tests/test_freeform_parser.py::TestStatsGeneration::test_ranger_hp_matches_class PASSED [ 41%]
tests/test_freeform_parser.py::TestStatsGeneration::test_fighter_hp_matches_class PASSED [ 41%]
tests/test_freeform_parser.py::TestStatsGeneration::test_rogue_hp_matches_class PASSED [ 41%]
tests/test_freeform_parser.py::TestPydanticValidation::test_returned_character_is_valid_model PASSED [ 42%]
tests/test_freeform_parser.py::TestPydanticValidation::test_character_has_correct_type_fields PASSED [ 42%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_when_no_session PASSED [ 42%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_when_session_raises PASSED [ 42%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_extracts_name PASSED [ 42%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_extracts_class_keyword PASSED [ 42%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_extracts_race_keyword PASSED [ 43%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_defaults_when_no_match PASSED [ 43%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_case_insensitive PASSED [ 43%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_minimal_input PASSED [ 43%]
tests/test_freeform_parser.py::TestFallbackParser::test_fallback_stores_original_text_as_backstory PASSED [ 43%]
tests/test_freeform_parser.py::TestEdgeCases::test_claude_returns_invalid_json PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_claude_returns_partial_json PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_empty_text_produces_default_character PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_very_long_text_handled PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_claude_returns_goals_as_string_falls_back PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_claude_returns_whitespace_relationship_target PASSED [ 44%]
tests/test_freeform_parser.py::TestEdgeCases::test_substring_class_not_matched PASSED [ 45%]
tests/test_freeform_parser.py::TestEdgeCases::test_substring_race_not_matched PASSED [ 45%]
tests/test_freeform_parser.py::TestIntegration::test_full_freeform_flow_with_claude PASSED [ 45%]
tests/test_freeform_parser.py::TestIntegration::test_full_freeform_flow_fallback PASSED [ 45%]
tests/test_genre_pack.py::TestPackMetaModel::test_valid_pack_meta PASSED [ 45%]
tests/test_genre_pack.py::TestPackMetaModel::test_missing_name_raises PASSED [ 46%]
tests/test_genre_pack.py::TestPackMetaModel::test_missing_version_raises PASSED [ 46%]
tests/test_genre_pack.py::TestPackMetaModel::test_missing_description_raises PASSED [ 46%]
tests/test_genre_pack.py::TestPackMetaModel::test_min_sidequest_version_defaults PASSED [ 46%]
tests/test_genre_pack.py::TestPackMetaModel::test_semver_string_accepted PASSED [ 46%]
tests/test_genre_pack.py::TestLoreModel::test_valid_lore PASSED [ 46%]
tests/test_genre_pack.py::TestLoreModel::test_missing_world_name_raises PASSED [ 47%]
tests/test_genre_pack.py::TestLoreModel::test_lore_with_factions PASSED [ 47%]
tests/test_genre_pack.py::TestFactionModel::test_valid_faction PASSED [ 47%]
tests/test_genre_pack.py::TestFactionModel::test_missing_name_raises PASSED [ 47%]
tests/test_genre_pack.py::TestStatGenMethod::test_point_buy PASSED [ 47%]
tests/test_genre_pack.py::TestStatGenMethod::test_four_d6_drop PASSED [ 48%]
tests/test_genre_pack.py::TestStatGenMethod::test_standard_array PASSED [ 48%]
tests/test_genre_pack.py::TestRulesConfigModel::test_defaults PASSED [ 48%]
tests/test_genre_pack.py::TestRulesConfigModel::test_custom_rules_dict PASSED [ 48%]
tests/test_genre_pack.py::TestPromptExtensionsModel::test_defaults_empty PASSED [ 48%]
tests/test_genre_pack.py::TestPromptExtensionsModel::test_with_values PASSED [ 48%]
tests/test_genre_pack.py::TestNpcArchetypeModel::test_valid_archetype PASSED [ 49%]
tests/test_genre_pack.py::TestNpcArchetypeModel::test_missing_name_raises PASSED [ 49%]
tests/test_genre_pack.py::TestCharCreationModels::test_char_creation_choice PASSED [ 49%]
tests/test_genre_pack.py::TestCharCreationModels::test_char_creation_scene PASSED [ 49%]
tests/test_genre_pack.py::TestCharCreationModels::test_scene_missing_id_raises PASSED [ 49%]
tests/test_genre_pack.py::TestVisualStyleModel::test_empty_default PASSED [ 50%]
tests/test_genre_pack.py::TestVisualStyleModel::test_extra_keys_allowed PASSED [ 50%]
tests/test_genre_pack.py::TestVoicePresetsModel::test_empty_default PASSED [ 50%]
tests/test_genre_pack.py::TestVoicePresetsModel::test_extra_keys_allowed PASSED [ 50%]
tests/test_genre_pack.py::TestGenrePackModel::test_valid_genre_pack PASSED [ 50%]
tests/test_genre_pack.py::TestGenrePackModel::test_missing_meta_raises PASSED [ 50%]
tests/test_genre_pack.py::TestGenrePackModel::test_missing_lore_raises PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackModel::test_extra_keys_preserved_on_genre_pack PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_load_valid_pack PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_load_nonexistent_pack_raises PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_load_missing_required_file_raises PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_load_invalid_yaml_content_raises PASSED [ 51%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_load_malformed_yaml_raises PASSED [ 52%]
tests/test_genre_pack.py::TestGenrePackLoaderLoad::test_error_message_names_file PASSED [ 52%]
tests/test_genre_pack.py::TestOptionalFilesDefault::test_no_visual_style_file PASSED [ 52%]
tests/test_genre_pack.py::TestOptionalFilesDefault::test_no_voice_presets_file PASSED [ 52%]
tests/test_genre_pack.py::TestOptionalFilesDefault::test_optional_file_present_is_loaded PASSED [ 52%]
tests/test_genre_pack.py::TestExtraKeysPreserved::test_extra_keys_in_pack_yaml PASSED [ 53%]
tests/test_genre_pack.py::TestExtraKeysPreserved::test_extra_keys_in_lore_yaml PASSED [ 53%]
tests/test_genre_pack.py::TestExtraKeysPreserved::test_extra_keys_survive_round_trip PASSED [ 53%]
tests/test_genre_pack.py::TestGenrePackLoaderDiscovery::test_list_packs PASSED [ 53%]
tests/test_genre_pack.py::TestGenrePackLoaderDiscovery::test_list_packs_empty_dir PASSED [ 53%]
tests/test_genre_pack.py::TestGenrePackLoaderDiscovery::test_custom_genre_packs_dir PASSED [ 53%]
tests/test_genre_pack.py::TestGenrePackLoaderDiscovery::test_nonexistent_dir_raises PASSED [ 54%]
tests/test_genre_pack.py::TestGenrePackLoaderDiscovery::test_default_genre_packs_dir PASSED [ 54%]
tests/test_genre_pack.py::TestGenreCLIFlag::test_genre_flag_parsed_from_argv PASSED [ 54%]
tests/test_genre_pack.py::TestGenreCLIFlag::test_genre_flag_defaults_to_low_fantasy PASSED [ 54%]
tests/test_genre_pack.py::TestGenreCLIFlag::test_genre_flag_selects_pack_directory PASSED [ 54%]
tests/test_genre_pack.py::TestLoaderEdgeCases::test_empty_archetypes_yaml_returns_list PASSED [ 55%]
tests/test_genre_pack.py::TestLoaderEdgeCases::test_empty_char_creation_yaml_returns_list PASSED [ 55%]
tests/test_genre_pack.py::TestLoaderEdgeCases::test_path_traversal_blocked PASSED [ 55%]
tests/test_genre_pack.py::TestLoaderEdgeCases::test_dotdot_in_pack_name_blocked PASSED [ 55%]
tests/test_low_fantasy_pack.py::TestLowFantasyLoads::test_load_low_fantasy_returns_genre_pack PASSED [ 55%]
tests/test_low_fantasy_pack.py::TestLowFantasyLoads::test_low_fantasy_listed_in_packs PASSED [ 55%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_directory_exists PASSED [ 56%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[pack.yaml] PASSED [ 56%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[lore.yaml] PASSED [ 56%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[rules.yaml] PASSED [ 56%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[prompts.yaml] PASSED [ 56%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[archetypes.yaml] PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[char_creation.yaml] PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[visual_style.yaml] PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyDirectoryStructure::test_required_file_exists[voice_presets.yaml] PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyPackMeta::test_pack_name PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyPackMeta::test_pack_version PASSED [ 57%]
tests/test_low_fantasy_pack.py::TestLowFantasyPackMeta::test_pack_has_description PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyPackMeta::test_pack_has_min_sidequest_version PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_world_name_present PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_history_is_multi_paragraph PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_at_least_three_factions PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_factions_have_descriptions PASSED [ 58%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_factions_have_dispositions PASSED [ 59%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_cosmology_present PASSED [ 59%]
tests/test_low_fantasy_pack.py::TestLowFantasyLore::test_geography_present PASSED [ 59%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_stat_generation_is_point_buy PASSED [ 59%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_point_buy_budget_is_27 PASSED [ 59%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_magic_level_is_low PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Fighter] PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Ranger] PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Rogue] PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Cleric] PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Druid] PASSED [ 60%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Bard] PASSED [ 61%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Barbarian] PASSED [ 61%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_class_present[Monk] PASSED [ 61%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_high_magic_class_excluded[Wizard] PASSED [ 61%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_high_magic_class_excluded[Sorcerer] PASSED [ 61%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_high_magic_class_excluded[Warlock] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_race_present[Human] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_race_present[Dwarf] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_race_present[Elf] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_allowed_race_present[Halfling] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_exotic_race_excluded[Tiefling] PASSED [ 62%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_exotic_race_excluded[Dragonborn] PASSED [ 63%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_exotic_race_excluded[Aasimar] PASSED [ 63%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_fireball_banned PASSED [ 63%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_wish_banned PASSED [ 63%]
tests/test_low_fantasy_pack.py::TestLowFantasyRules::test_banned_spells_not_empty PASSED [ 63%]
tests/test_low_fantasy_pack.py::TestLowFantasyPrompts::test_narrator_prompt_non_empty PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyPrompts::test_combat_prompt_non_empty PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyPrompts::test_npc_prompt_non_empty PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyPrompts::test_world_state_prompt_non_empty PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyPrompts::test_prompts_reinforce_low_fantasy_tone PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyArchetypes::test_at_least_six_archetypes PASSED [ 64%]
tests/test_low_fantasy_pack.py::TestLowFantasyArchetypes::test_archetypes_have_names PASSED [ 65%]
tests/test_low_fantasy_pack.py::TestLowFantasyArchetypes::test_archetypes_have_descriptions PASSED [ 65%]
tests/test_low_fantasy_pack.py::TestLowFantasyArchetypes::test_archetypes_have_personality_traits PASSED [ 65%]
tests/test_low_fantasy_pack.py::TestLowFantasyArchetypes::test_archetypes_have_dialogue_quirks PASSED [ 65%]
tests/test_low_fantasy_pack.py::TestLowFantasyCharCreation::test_at_least_one_scene PASSED [ 65%]
tests/test_low_fantasy_pack.py::TestLowFantasyCharCreation::test_scenes_have_ids PASSED [ 66%]
tests/test_low_fantasy_pack.py::TestLowFantasyCharCreation::test_scenes_have_titles PASSED [ 66%]
tests/test_low_fantasy_pack.py::TestLowFantasyCharCreation::test_scene_ids_are_unique PASSED [ 66%]
tests/test_low_fantasy_pack.py::TestLowFantasyStubs::test_visual_style_loads PASSED [ 66%]
tests/test_low_fantasy_pack.py::TestLowFantasyStubs::test_voice_presets_loads PASSED [ 66%]
tests/test_narrative_character.py::TestCoreIdentity::test_create_character_with_required_fields PASSED [ 66%]
tests/test_narrative_character.py::TestCoreIdentity::test_character_has_description PASSED [ 67%]
tests/test_narrative_character.py::TestCoreIdentity::test_character_has_backstory PASSED [ 67%]
tests/test_narrative_character.py::TestCoreIdentity::test_description_defaults_to_empty_string PASSED [ 67%]
tests/test_narrative_character.py::TestCoreIdentity::test_backstory_defaults_to_empty_string PASSED [ 67%]
tests/test_narrative_character.py::TestCoreIdentity::test_character_has_personality PASSED [ 67%]
tests/test_narrative_character.py::TestCoreIdentity::test_personality_defaults_to_empty_string PASSED [ 67%]
tests/test_narrative_character.py::TestRelationships::test_relationship_has_target_and_description PASSED [ 68%]
tests/test_narrative_character.py::TestRelationships::test_character_has_relationships_list PASSED [ 68%]
tests/test_narrative_character.py::TestRelationships::test_relationships_default_to_empty_list PASSED [ 68%]
tests/test_narrative_character.py::TestRelationships::test_multiple_relationships PASSED [ 68%]
tests/test_narrative_character.py::TestRelationships::test_relationship_requires_target PASSED [ 68%]
tests/test_narrative_character.py::TestRelationships::test_relationship_requires_description PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_narrative_state_has_situation PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_narrative_state_has_emotional_state PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_narrative_state_has_goals PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_narrative_state_defaults PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_character_has_narrative_state PASSED [ 69%]
tests/test_narrative_character.py::TestNarrativeState::test_character_gets_default_narrative_state PASSED [ 70%]
tests/test_narrative_character.py::TestPydanticIntegration::test_is_pydantic_model PASSED [ 70%]
tests/test_narrative_character.py::TestPydanticIntegration::test_narrative_state_is_pydantic_model PASSED [ 70%]
tests/test_narrative_character.py::TestPydanticIntegration::test_relationship_is_pydantic_model PASSED [ 70%]
tests/test_narrative_character.py::TestPydanticIntegration::test_model_serializes_to_dict PASSED [ 70%]
tests/test_narrative_character.py::TestPydanticIntegration::test_model_serializes_to_json PASSED [ 71%]
tests/test_narrative_character.py::TestPydanticIntegration::test_model_deserializes_from_dict PASSED [ 71%]
tests/test_narrative_character.py::TestValidation::test_name_cannot_be_empty_string PASSED [ 71%]
tests/test_narrative_character.py::TestValidation::test_name_cannot_be_whitespace_only PASSED [ 71%]
tests/test_narrative_character.py::TestValidation::test_name_is_required PASSED [ 71%]
tests/test_narrative_character.py::TestValidation::test_name_gets_stripped PASSED [ 71%]
tests/test_narrative_character.py::TestValidation::test_goals_must_be_list_of_strings PASSED [ 72%]
tests/test_narrative_character.py::TestValidation::test_relationships_must_be_list PASSED [ 72%]
tests/test_narrative_character.py::TestValidation::test_relationship_target_cannot_be_empty PASSED [ 72%]
tests/test_narrative_character.py::TestValidation::test_relationship_description_cannot_be_empty PASSED [ 72%]
tests/test_narrative_character.py::TestEdgeCases::test_character_with_all_fields_populated PASSED [ 72%]
tests/test_narrative_character.py::TestEdgeCases::test_two_characters_are_independent PASSED [ 73%]
tests/test_narrative_character.py::TestEdgeCases::test_character_equality_by_fields PASSED [ 73%]
tests/test_narrative_character.py::TestEdgeCases::test_character_inequality PASSED [ 73%]
tests/test_narrative_character.py::TestEdgeCases::test_long_backstory_accepted PASSED [ 73%]
tests/test_narrator_agent.py::TestNarratorPrompt::test_prompt_mentions_backstory PASSED [ 73%]
tests/test_narrator_agent.py::TestNarratorPrompt::test_prompt_mentions_personality PASSED [ 73%]
tests/test_narrator_agent.py::TestNarratorPrompt::test_prompt_mentions_relationships PASSED [ 74%]
tests/test_narrator_agent.py::TestNarratorPrompt::test_prompt_mentions_emotional_state PASSED [ 74%]
tests/test_narrator_agent.py::TestNarratorPrompt::test_prompt_mentions_low_fantasy PASSED [ 74%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_name_and_class PASSED [ 74%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_description PASSED [ 74%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_personality PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_backstory PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_relationships PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_narrative_state PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_omits_empty_optional_fields PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_includes_mechanical_stats PASSED [ 75%]
tests/test_narrator_agent.py::TestFormatCharacterContext::test_multiple_characters PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_personality PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_backstory PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_relationships PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_emotional_state PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_low_fantasy PASSED [ 76%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_instructs_personality_driven_tone PASSED [ 77%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_instructs_mechanical_awareness PASSED [ 77%]
tests/test_npc_agent.py::TestNpcPrompt::test_prompt_mentions_goals PASSED [ 77%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_name_and_class PASSED [ 77%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_personality PASSED [ 77%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_backstory PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_hp PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_ac PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_inventory PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_description PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_emotional_state PASSED [ 78%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_situation PASSED [ 79%]
tests/test_npc_agent.py::TestFormatNpcContext::test_includes_goals PASSED [ 79%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_name PASSED [ 79%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_race_and_class PASSED [ 79%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_personality PASSED [ 79%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_backstory PASSED [ 80%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_description PASSED [ 80%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_emotional_state PASSED [ 80%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_goals PASSED [ 80%]
tests/test_npc_agent.py::TestFormatNPCContextCoreFields::test_includes_situation PASSED [ 80%]
tests/test_npc_agent.py::TestNpcRelationships::test_includes_relationships PASSED [ 80%]
tests/test_npc_agent.py::TestNpcRelationships::test_multiple_relationships PASSED [ 81%]
tests/test_npc_agent.py::TestFormatNPCContextRelationships::test_single_relationship PASSED [ 81%]
tests/test_npc_agent.py::TestFormatNPCContextRelationships::test_multiple_relationships PASSED [ 81%]
tests/test_npc_agent.py::TestFormatNPCContextRelationships::test_no_relationships_no_clutter PASSED [ 81%]
tests/test_npc_agent.py::TestNpcGameStateAwareness::test_includes_game_location PASSED [ 81%]
tests/test_npc_agent.py::TestNpcGameStateAwareness::test_includes_game_time PASSED [ 82%]
tests/test_npc_agent.py::TestNpcGameStateAwareness::test_works_without_game_state PASSED [ 82%]
tests/test_npc_agent.py::TestFormatNPCContextDefaults::test_minimal_character PASSED [ 82%]
tests/test_npc_agent.py::TestFormatNPCContextDefaults::test_omits_empty_personality PASSED [ 82%]
tests/test_npc_agent.py::TestFormatNPCContextDefaults::test_omits_empty_backstory PASSED [ 82%]
tests/test_npc_agent.py::TestNpcContextEdgeCases::test_omits_empty_optional_fields PASSED [ 82%]
tests/test_npc_agent.py::TestNpcContextEdgeCases::test_wounded_npc_hp_visible PASSED [ 83%]
tests/test_npc_agent.py::TestNpcContextEdgeCases::test_level_visible PASSED [ 83%]
tests/test_npc_agent.py::TestFormatNPCContextIntegration::test_full_character PASSED [ 83%]
tests/test_npc_agent.py::TestFormatNPCContextIntegration::test_return_type_is_string PASSED [ 83%]
tests/test_session_persistence.py::TestGameStateSave::test_save_creates_file PASSED [ 83%]
tests/test_session_persistence.py::TestGameStateSave::test_save_writes_valid_json PASSED [ 83%]
tests/test_session_persistence.py::TestGameStateSave::test_save_includes_characters PASSED [ 84%]
tests/test_session_persistence.py::TestGameStateSave::test_save_includes_quest_log PASSED [ 84%]
tests/test_session_persistence.py::TestGameStateSave::test_save_overwrites_existing_file PASSED [ 84%]
tests/test_session_persistence.py::TestGameStateSave::test_save_accepts_pathlib_path PASSED [ 84%]
tests/test_session_persistence.py::TestGameStateLoad::test_load_restores_location PASSED [ 84%]
tests/test_session_persistence.py::TestGameStateLoad::test_load_restores_characters PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateLoad::test_load_restores_quest_log PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateLoad::test_load_returns_game_state_instance PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateLoad::test_load_raises_on_missing_file PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateRoundTrip::test_round_trip_default_state PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateRoundTrip::test_round_trip_full_state PASSED [ 85%]
tests/test_session_persistence.py::TestGameStateRoundTrip::test_round_trip_multiple_characters PASSED [ 86%]
tests/test_session_persistence.py::TestNarrativeLogAppend::test_append_creates_file PASSED [ 86%]
tests/test_session_persistence.py::TestNarrativeLogAppend::test_append_writes_jsonl_format PASSED [ 86%]
tests/test_session_persistence.py::TestNarrativeLogAppend::test_append_multiple_entries PASSED [ 86%]
tests/test_session_persistence.py::TestNarrativeLogAppend::test_append_preserves_existing_entries PASSED [ 86%]
tests/test_session_persistence.py::TestNarrativeLogAppend::test_each_line_is_valid_json PASSED [ 87%]
tests/test_session_persistence.py::TestNarrativeLogLoad::test_load_returns_list_of_dicts PASSED [ 87%]
tests/test_session_persistence.py::TestNarrativeLogLoad::test_load_multiple_entries PASSED [ 87%]
tests/test_session_persistence.py::TestNarrativeLogLoad::test_load_empty_file PASSED [ 87%]
tests/test_session_persistence.py::TestNarrativeLogLoad::test_load_nonexistent_file_returns_empty PASSED [ 87%]
tests/test_session_persistence.py::TestNarrativeLogLoad::test_round_trip_preserves_data PASSED [ 87%]
tests/test_session_resume.py::TestSessionManagerLoad::test_load_restores_game_state PASSED [ 88%]
tests/test_session_resume.py::TestSessionManagerLoad::test_load_restores_narrative_log PASSED [ 88%]
tests/test_session_resume.py::TestSessionManagerLoad::test_load_restores_characters PASSED [ 88%]
tests/test_session_resume.py::TestSessionManagerLoad::test_load_returns_session_result PASSED [ 88%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_includes_event_descriptions PASSED [ 88%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_has_previously_on_header PASSED [ 89%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_empty_when_no_narrative_log PASSED [ 89%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_preserves_event_order PASSED [ 89%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_includes_location_context PASSED [ 89%]
tests/test_session_resume.py::TestRecapGeneration::test_recap_includes_character_names PASSED [ 89%]
tests/test_session_resume.py::TestSessionResume::test_resume_returns_state_and_recap PASSED [ 89%]
tests/test_session_resume.py::TestSessionResume::test_resume_with_quest_log PASSED [ 90%]
tests/test_session_resume.py::TestSessionResume::test_resume_with_full_character_state PASSED [ 90%]
tests/test_session_resume.py::TestSessionErrorHandling::test_missing_state_file_raises PASSED [ 90%]
tests/test_session_resume.py::TestSessionErrorHandling::test_missing_narrative_log_loads_with_empty_history PASSED [ 90%]
tests/test_session_resume.py::TestSessionErrorHandling::test_corrupted_state_file_raises PASSED [ 90%]
tests/test_session_resume.py::TestSessionErrorHandling::test_empty_session_dir PASSED [ 91%]
tests/test_session_resume.py::TestSessionErrorHandling::test_session_manager_accepts_path PASSED [ 91%]
tests/test_unified_character.py::TestUnifiedFields::test_character_has_narrative_fields PASSED [ 91%]
tests/test_unified_character.py::TestUnifiedFields::test_character_has_mechanical_fields PASSED [ 91%]
tests/test_unified_character.py::TestUnifiedFields::test_full_character_creation PASSED [ 91%]
tests/test_unified_character.py::TestUnifiedFields::test_narrative_defaults PASSED [ 91%]
tests/test_unified_character.py::TestUnifiedFields::test_mechanical_defaults PASSED [ 92%]
tests/test_unified_character.py::TestHPDefaults::test_fighter_hp_default PASSED [ 92%]
tests/test_unified_character.py::TestHPDefaults::test_wizard_hp_default PASSED [ 92%]
tests/test_unified_character.py::TestHPDefaults::test_hp_scales_with_level PASSED [ 92%]
tests/test_unified_character.py::TestHPDefaults::test_explicit_hp_overrides_default PASSED [ 92%]
tests/test_unified_character.py::TestValidation::test_name_cannot_be_empty PASSED [ 92%]
tests/test_unified_character.py::TestValidation::test_name_cannot_be_whitespace PASSED [ 93%]
tests/test_unified_character.py::TestValidation::test_name_is_stripped PASSED [ 93%]
tests/test_unified_character.py::TestValidation::test_name_is_required PASSED [ 93%]
tests/test_unified_character.py::TestValidation::test_relationship_target_cannot_be_empty PASSED [ 93%]
tests/test_unified_character.py::TestValidation::test_relationship_description_cannot_be_empty PASSED [ 93%]
tests/test_unified_character.py::TestGameStateIntegration::test_gamestate_accepts_unified_character PASSED [ 94%]
tests/test_unified_character.py::TestGameStateIntegration::test_gamestate_hp_patch_works PASSED [ 94%]
tests/test_unified_character.py::TestGameStateIntegration::test_gamestate_serialization_includes_narrative PASSED [ 94%]
tests/test_unified_character.py::TestSerialization::test_model_dump_includes_all_fields PASSED [ 94%]
tests/test_unified_character.py::TestSerialization::test_json_round_trip PASSED [ 94%]
tests/test_unified_character.py::TestSerialization::test_dict_round_trip PASSED [ 94%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_narrative PASSED [ 95%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_emotional PASSED [ 95%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_relationships PASSED [ 95%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_low_fantasy PASSED [ 95%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_consistency PASSED [ 95%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_backstory PASSED [ 96%]
tests/test_world_state_agent.py::TestWorldStatePrompt::test_prompt_mentions_personality PASSED [ 96%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_location PASSED [ 96%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_time_of_day PASSED [ 96%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_quest_log PASSED [ 96%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_notes PASSED [ 96%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_character_names PASSED [ 97%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_character_hp PASSED [ 97%]
tests/test_world_state_agent.py::TestFormatWorldStateContext::test_includes_character_inventory PASSED [ 97%]
tests/test_world_state_agent.py::TestWorldStateEmotionalContext::test_includes_character_emotional_state PASSED [ 97%]
tests/test_world_state_agent.py::TestWorldStateEmotionalContext::test_includes_character_relationships PASSED [ 97%]
tests/test_world_state_agent.py::TestWorldStateEmotionalContext::test_includes_character_goals PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateEmotionalContext::test_includes_character_situation PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_narrative_log_field_exists PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_narrative_log_defaults_empty PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_narrative_log_entry_has_timestamp PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_narrative_log_entry_has_description PASSED [ 98%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_narrative_log_in_context PASSED [ 99%]
tests/test_world_state_agent.py::TestWorldStateNarrativeLog::test_apply_patch_adds_narrative_log_entry PASSED [ 99%]
tests/test_world_state_agent.py::TestWorldStateContextEdgeCases::test_empty_state PASSED [ 99%]
tests/test_world_state_agent.py::TestWorldStateContextEdgeCases::test_no_characters PASSED [ 99%]
tests/test_world_state_agent.py::TestWorldStateContextEdgeCases::test_empty_quest_log PASSED [ 99%]
tests/test_world_state_agent.py::TestWorldStateContextEdgeCases::test_multiple_characters PASSED [100%]
============================= 556 passed in 0.98s ==============================