OPEN SOURCE
software/tests/test_cross_references.py
このサイトで読み、必要なファイルを保存できます。
日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。
1"""Tests for cross-reference system."""23import json4import pytest5from pathlib import Path6from tempfile import TemporaryDirectory78from src.context.cross_references import (9CrossReference,10CrossReferenceManager,11CrossReferenceMatch,12JOHN_CROSS_REFERENCES,13ReferenceType,14create_default_cross_references,15)161718class TestReferenceType:19"""Tests for ReferenceType enum."""2021def test_all_types_exist(self):22"""Test all expected reference types exist."""23assert ReferenceType.QUOTATION.value == "quotation"24assert ReferenceType.ALLUSION.value == "allusion"25assert ReferenceType.PARALLEL.value == "parallel"26assert ReferenceType.THEMATIC.value == "thematic"27assert ReferenceType.FULFILLMENT.value == "fulfillment"28assert ReferenceType.TYPOLOGY.value == "typology"293031class TestCrossReference:32"""Tests for CrossReference model."""3334def test_basic_creation(self):35"""Test basic cross-reference creation."""36ref = CrossReference(37source_book="john",38source_chapter=1,39source_verse=1,40target_book="genesis",41target_chapter=1,42target_verse_start=1,43)44assert ref.source_book == "john"45assert ref.target_book == "genesis"46assert ref.reference_type == ReferenceType.THEMATIC4748def test_with_verse_range(self):49"""Test cross-reference with verse range."""50ref = CrossReference(51source_book="john",52source_chapter=1,53source_verse=14,54target_book="exodus",55target_chapter=33,56target_verse_start=7,57target_verse_end=11,58)59assert ref.target_verse_start == 760assert ref.target_verse_end == 116162def test_with_note_and_hint(self):63"""Test cross-reference with note and translation hint."""64ref = CrossReference(65source_book="john",66source_chapter=1,67source_verse=1,68target_book="genesis",69target_chapter=1,70target_verse_start=1,71reference_type=ReferenceType.ALLUSION,72note="John echoes Genesis opening",73translation_hint="Use similar phrasing",74)75assert ref.note == "John echoes Genesis opening"76assert ref.translation_hint == "Use similar phrasing"77assert ref.reference_type == ReferenceType.ALLUSION7879def test_source_ref_property(self):80"""Test source_ref property."""81ref = CrossReference(82source_book="john",83source_chapter=3,84source_verse=16,85target_book="genesis",86target_chapter=1,87target_verse_start=1,88)89assert ref.source_ref == "john 3:16"9091def test_target_ref_property_single_verse(self):92"""Test target_ref property for single verse."""93ref = CrossReference(94source_book="john",95source_chapter=1,96source_verse=1,97target_book="genesis",98target_chapter=1,99target_verse_start=1,100)101assert ref.target_ref == "genesis 1:1"102103def test_target_ref_property_verse_range(self):104"""Test target_ref property for verse range."""105ref = CrossReference(106source_book="john",107source_chapter=1,108source_verse=14,109target_book="exodus",110target_chapter=33,111target_verse_start=7,112target_verse_end=11,113)114assert ref.target_ref == "exodus 33:7-11"115116117class TestCrossReferenceMatch:118"""Tests for CrossReferenceMatch model."""119120def test_basic_creation(self):121"""Test basic match creation."""122ref = CrossReference(123source_book="john",124source_chapter=1,125source_verse=1,126target_book="genesis",127target_chapter=1,128target_verse_start=1,129)130match = CrossReferenceMatch(reference=ref)131assert match.reference == ref132assert match.target_text is None133assert match.target_translation is None134assert match.relevance_score == 1.0135136def test_with_context(self):137"""Test match with target text and translation."""138ref = CrossReference(139source_book="john",140source_chapter=1,141source_verse=1,142target_book="genesis",143target_chapter=1,144target_verse_start=1,145)146match = CrossReferenceMatch(147reference=ref,148target_text="In the beginning God created...",149target_translation="初めに神は天と地を創造された。",150relevance_score=0.95,151)152assert match.target_text is not None153assert match.target_translation is not None154assert match.relevance_score == 0.95155156157class TestCrossReferenceManager:158"""Tests for CrossReferenceManager."""159160def test_empty_manager(self):161"""Test empty manager initialization."""162manager = CrossReferenceManager()163assert len(manager) == 0164165def test_add_reference(self):166"""Test adding a reference."""167manager = CrossReferenceManager()168ref = CrossReference(169source_book="john",170source_chapter=1,171source_verse=1,172target_book="genesis",173target_chapter=1,174target_verse_start=1,175)176manager.add_reference(ref)177assert len(manager) == 1178179def test_find_references_for_verse(self):180"""Test finding references for a verse."""181manager = CrossReferenceManager()182ref = CrossReference(183source_book="john",184source_chapter=1,185source_verse=1,186target_book="genesis",187target_chapter=1,188target_verse_start=1,189)190manager.add_reference(ref)191192found = manager.find_references_for_verse("john", 1, 1)193assert len(found) == 1194assert found[0].target_book == "genesis"195196def test_find_references_for_verse_case_insensitive(self):197"""Test finding references is case insensitive."""198manager = CrossReferenceManager()199ref = CrossReference(200source_book="john",201source_chapter=1,202source_verse=1,203target_book="genesis",204target_chapter=1,205target_verse_start=1,206)207manager.add_reference(ref)208209found = manager.find_references_for_verse("John", 1, 1)210assert len(found) == 1211212def test_find_references_to_verse(self):213"""Test finding references TO a verse."""214manager = CrossReferenceManager()215ref = CrossReference(216source_book="john",217source_chapter=1,218source_verse=1,219target_book="genesis",220target_chapter=1,221target_verse_start=1,222)223manager.add_reference(ref)224225found = manager.find_references_to_verse("genesis", 1, 1)226assert len(found) == 1227assert found[0].source_book == "john"228229def test_find_references_by_type(self):230"""Test finding references by type."""231manager = CrossReferenceManager()232manager.add_reference(233CrossReference(234source_book="john",235source_chapter=1,236source_verse=1,237target_book="genesis",238target_chapter=1,239target_verse_start=1,240reference_type=ReferenceType.ALLUSION,241)242)243manager.add_reference(244CrossReference(245source_book="john",246source_chapter=1,247source_verse=23,248target_book="isaiah",249target_chapter=40,250target_verse_start=3,251reference_type=ReferenceType.QUOTATION,252)253)254255allusions = manager.find_references_by_type("john", 1, 1, ReferenceType.ALLUSION)256assert len(allusions) == 1257258quotations = manager.find_references_by_type("john", 1, 23, ReferenceType.QUOTATION)259assert len(quotations) == 1260261def test_get_quotation_sources(self):262"""Test getting quotation sources."""263manager = CrossReferenceManager()264manager.add_reference(265CrossReference(266source_book="john",267source_chapter=1,268source_verse=23,269target_book="isaiah",270target_chapter=40,271target_verse_start=3,272reference_type=ReferenceType.QUOTATION,273)274)275276quotes = manager.get_quotation_sources("john", 1, 23)277assert len(quotes) == 1278assert quotes[0].target_book == "isaiah"279280def test_get_parallel_passages(self):281"""Test getting parallel passages."""282manager = CrossReferenceManager()283manager.add_reference(284CrossReference(285source_book="matthew",286source_chapter=3,287source_verse=1,288target_book="mark",289target_chapter=1,290target_verse_start=2,291reference_type=ReferenceType.PARALLEL,292)293)294295parallels = manager.get_parallel_passages("matthew", 3, 1)296assert len(parallels) == 1297assert parallels[0].target_book == "mark"298299def test_format_for_prompt_empty(self):300"""Test formatting empty references."""301manager = CrossReferenceManager()302result = manager.format_for_prompt([])303assert result == ""304305def test_format_for_prompt(self):306"""Test formatting references for prompt."""307manager = CrossReferenceManager()308refs = [309CrossReference(310source_book="john",311source_chapter=1,312source_verse=1,313target_book="genesis",314target_chapter=1,315target_verse_start=1,316reference_type=ReferenceType.ALLUSION,317note="Echoes Genesis",318translation_hint="Use similar phrasing",319)320]321322result = manager.format_for_prompt(refs)323assert "CROSS-REFERENCES:" in result324assert "ALLUSION" in result325assert "genesis 1:1" in result326assert "Echoes Genesis" in result327assert "similar phrasing" in result328329def test_format_for_prompt_max_references(self):330"""Test formatting respects max_references limit."""331manager = CrossReferenceManager()332refs = [333CrossReference(334source_book="john",335source_chapter=1,336source_verse=i,337target_book="genesis",338target_chapter=1,339target_verse_start=i,340)341for i in range(1, 10)342]343344result = manager.format_for_prompt(refs, max_references=3)345# Should only include 3 references346assert result.count("genesis") == 3347348def test_get_translation_consistency_notes(self):349"""Test getting consistency notes."""350manager = CrossReferenceManager()351manager.add_reference(352CrossReference(353source_book="john",354source_chapter=1,355source_verse=23,356target_book="isaiah",357target_chapter=40,358target_verse_start=3,359reference_type=ReferenceType.QUOTATION,360translation_hint="Match Isaiah translation",361)362)363364notes = manager.get_translation_consistency_notes("john", 1, 23)365assert len(notes) > 0366assert any("quotes" in note for note in notes)367assert any("Match Isaiah" in note for note in notes)368369def test_save_and_load(self):370"""Test saving and loading cross-references."""371with TemporaryDirectory() as tmpdir:372data_dir = Path(tmpdir)373metadata_dir = data_dir / "metadata"374metadata_dir.mkdir(parents=True)375376# Create and populate manager377manager = CrossReferenceManager()378manager._data_dir = data_dir379manager.add_reference(380CrossReference(381source_book="john",382source_chapter=1,383source_verse=1,384target_book="genesis",385target_chapter=1,386target_verse_start=1,387reference_type=ReferenceType.ALLUSION,388)389)390391# Save392manager.save()393394# Load into new manager395manager2 = CrossReferenceManager(data_dir)396assert len(manager2) == 1397398found = manager2.find_references_for_verse("john", 1, 1)399assert len(found) == 1400assert found[0].target_book == "genesis"401402403class TestJohnCrossReferences:404"""Tests for pre-defined John cross-references."""405406def test_john_references_exist(self):407"""Test pre-defined John references exist."""408assert len(JOHN_CROSS_REFERENCES) > 0409410def test_john_1_1_genesis_reference(self):411"""Test John 1:1 -> Genesis 1:1 reference."""412ref = next(413(r for r in JOHN_CROSS_REFERENCES414if r.source_book == "john" and r.source_chapter == 1 and r.source_verse == 1),415None416)417assert ref is not None418assert ref.target_book == "genesis"419assert ref.reference_type == ReferenceType.ALLUSION420421def test_all_references_valid(self):422"""Test all pre-defined references are valid."""423for ref in JOHN_CROSS_REFERENCES:424assert ref.source_book == "john"425assert ref.source_chapter >= 1426assert ref.source_verse >= 1427assert ref.target_chapter >= 1428assert ref.target_verse_start >= 1429430431class TestCreateDefaultCrossReferences:432"""Tests for create_default_cross_references."""433434def test_creates_manager_with_defaults(self):435"""Test creating manager with default references."""436with TemporaryDirectory() as tmpdir:437data_dir = Path(tmpdir)438manager = create_default_cross_references(data_dir)439assert len(manager) > 0440