公開前の確認用サイト
日常訳NICHIJOYAKUEnglish ↗

OPEN SOURCE

software/tests/test_cross_references.py

このサイトで読み、必要なファイルを保存できます。

日常訳はAIを用いて作成された翻訳です。人間の聖書学・原語の専門家による全訳の検証は確認されていません。既存の翻訳や原語資料と照らし合わせてお読みください。

← オープンソースの案内へ

software/tests/test_cross_references.py440 行このファイルを保存 ↓

ZIPに含まれるものと同じ公開ソースです。行番号から、その行へのリンクを保存できます。

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