Pre-publication review draft
日常訳NICHIJOYAKU日本語 ↗

OPEN SOURCE

software/tests/test_pericope_generator.py

Read on this site and download the files you need.

Nichijoyaku was created using AI. A complete review by human biblical-language and biblical-studies specialists has not been established. Read alongside established translations and original-language resources.

← Back to the open-source guide

software/tests/test_pericope_generator.py285 linesDownload this file ↓

This is the same source included in the download. Each line number is a link you can save or share.

File verification detailsSHA-256 4ad5a5d57a2870244c4432e01eb58b350986c5d06b5bac490fbb6f8b9398fcbf
1"""Tests for pericope auto-generation."""23import json4import pytest5from pathlib import Path6from tempfile import TemporaryDirectory78from src.context.pericope_generator import (9    MAX_PERICOPE_SIZE,10    MIN_PERICOPE_SIZE,11    PARAGRAPH_MARKER,12    PericopeGenerator,13    merge_pericope_indexes,14)15from src.models.pericope import Pericope, PericopeIndex161718class TestPericopeGenerator:19    """Tests for PericopeGenerator."""2021    @pytest.fixture22    def sample_greek_data(self):23        """Create sample Greek data with paragraph markers."""24        return {25            "1:1": {"text": "¶ Ἐν ἀρχῇ ἦν ὁ λόγος"},26            "1:2": {"text": "οὗτος ἦν ἐν ἀρχῇ"},27            "1:3": {"text": "πάντα δι᾽ αὐτοῦ ἐγένετο"},28            "1:4": {"text": "ἐν αὐτῷ ζωὴ ἦν"},29            "1:5": {"text": "¶ καὶ τὸ φῶς ἐν τῇ σκοτίᾳ"},30            "1:6": {"text": "ἐγένετο ἄνθρωπος"},31            "1:7": {"text": "οὗτος ἦλθεν εἰς μαρτυρίαν"},32            "1:8": {"text": "¶ οὐκ ἦν ἐκεῖνος τὸ φῶς"},33            "1:9": {"text": "ἦν τὸ φῶς τὸ ἀληθινόν"},34            "1:10": {"text": "ἐν τῷ κόσμῳ ἦν"},35        }3637    @pytest.fixture38    def temp_data_dir(self, sample_greek_data):39        """Create temporary data directory with Greek data."""40        with TemporaryDirectory() as tmpdir:41            data_dir = Path(tmpdir)42            greek_dir = data_dir / "sources" / "greek"43            greek_dir.mkdir(parents=True)4445            with (greek_dir / "john.json").open("w") as f:46                json.dump(sample_greek_data, f)4748            yield data_dir4950    def test_init(self, temp_data_dir):51        """Test generator initialization."""52        generator = PericopeGenerator(temp_data_dir)53        assert generator._data_dir == temp_data_dir5455    def test_find_paragraph_markers(self, temp_data_dir, sample_greek_data):56        """Test finding paragraph markers."""57        generator = PericopeGenerator(temp_data_dir)58        markers = generator._find_paragraph_markers(sample_greek_data)5960        assert "1:1" in markers  # Has ¶61        assert "1:5" in markers  # Has ¶62        assert "1:8" in markers  # Has ¶63        assert "1:2" not in markers  # No ¶6465    def test_get_all_verses(self, temp_data_dir, sample_greek_data):66        """Test getting all verses in order."""67        generator = PericopeGenerator(temp_data_dir)68        verses = generator._get_all_verses(sample_greek_data)6970        assert verses == ["1:1", "1:2", "1:3", "1:4", "1:5", "1:6", "1:7", "1:8", "1:9", "1:10"]7172    def test_ref_sort_key(self, temp_data_dir):73        """Test reference sort key."""74        generator = PericopeGenerator(temp_data_dir)7576        assert generator._ref_sort_key("1:1") == (1, 1)77        assert generator._ref_sort_key("2:15") == (2, 15)78        assert generator._ref_sort_key("10:5") == (10, 5)79        assert generator._ref_sort_key("invalid") == (0, 0)8081    def test_split_large_pericope(self, temp_data_dir):82        """Test splitting large pericopes."""83        generator = PericopeGenerator(temp_data_dir)8485        # Small list should not be split86        small = ["1:1", "1:2", "1:3"]87        result = generator._split_large_pericope(small, max_size=10)88        assert len(result) == 189        assert result[0] == small9091        # Large list should be split92        large = [f"1:{i}" for i in range(1, 31)]  # 30 verses93        result = generator._split_large_pericope(large, max_size=10)94        assert len(result) == 395        assert all(len(part) <= 10 for part in result)9697    def test_generate_pericopes(self, temp_data_dir):98        """Test generating pericopes from paragraph markers."""99        generator = PericopeGenerator(temp_data_dir)100        index = generator.generate_pericopes("john", min_size=2)101102        assert index.book == "john"103        assert len(index.pericopes) > 0104105        # All pericopes should be auto-generated106        for p in index.pericopes:107            assert p.auto_generated is True108            assert p.id.startswith("john-auto-")109110    def test_generate_pericopes_respects_min_size(self, temp_data_dir):111        """Test that small pericopes are merged."""112        generator = PericopeGenerator(temp_data_dir)113        index = generator.generate_pericopes("john", min_size=5)114115        # Should have fewer pericopes due to merging116        for p in index.pericopes:117            assert len(p.verses) >= 5 or p == index.pericopes[-1]  # Last may be smaller118119    def test_generate_pericopes_empty_book(self, temp_data_dir):120        """Test generating pericopes for non-existent book."""121        generator = PericopeGenerator(temp_data_dir)122        index = generator.generate_pericopes("nonexistent")123124        assert index.book == "nonexistent"125        assert len(index.pericopes) == 0126127    def test_create_pericope(self, temp_data_dir):128        """Test creating a single pericope."""129        generator = PericopeGenerator(temp_data_dir)130        verses = ["1:1", "1:2", "1:3"]131        pericope = generator._create_pericope("john", verses, 1)132133        assert pericope.id == "john-auto-001"134        assert pericope.start_chapter == 1135        assert pericope.start_verse == 1136        assert pericope.end_chapter == 1137        assert pericope.end_verse == 3138        assert pericope.verses == verses139        assert pericope.auto_generated is True140141    def test_generate_and_save(self, temp_data_dir):142        """Test generating and saving pericopes."""143        generator = PericopeGenerator(temp_data_dir)144        index = generator.generate_and_save("john")145146        # Check file was created147        output_path = temp_data_dir / "metadata" / "pericopes_generated.json"148        assert output_path.exists()149150        # Check content151        with output_path.open() as f:152            data = json.load(f)153        assert "john" in data154        assert data["john"]["auto_generated"] is True155156    def test_generate_all_books(self, temp_data_dir):157        """Test generating pericopes for multiple books."""158        generator = PericopeGenerator(temp_data_dir)159160        # Only john.json exists in our fixture161        result = generator.generate_all_books()162163        assert "john" in result164        assert len(result["john"].pericopes) > 0165166167class TestMergePericopeIndexes:168    """Tests for merge_pericope_indexes function."""169170    def test_both_none(self):171        """Test merging two None values."""172        result = merge_pericope_indexes(None, None)173        assert result is None174175    def test_manual_only(self):176        """Test when only manual exists."""177        manual = PericopeIndex(178            book="john",179            name="John",180            pericopes=[181                Pericope(182                    id="john-prologue",183                    start_chapter=1,184                    start_verse=1,185                    end_chapter=1,186                    end_verse=18,187                    verses=["1:1", "1:2"],188                )189            ],190        )191        result = merge_pericope_indexes(manual, None)192        assert result == manual193194    def test_generated_only(self):195        """Test when only generated exists."""196        generated = PericopeIndex(197            book="john",198            name="John",199            pericopes=[200                Pericope(201                    id="john-auto-001",202                    start_chapter=1,203                    start_verse=1,204                    end_chapter=1,205                    end_verse=4,206                    verses=["1:1", "1:2", "1:3", "1:4"],207                    auto_generated=True,208                )209            ],210        )211        result = merge_pericope_indexes(None, generated)212        assert result == generated213214    def test_manual_takes_precedence(self):215        """Test that manual pericopes take precedence."""216        manual = PericopeIndex(217            book="john",218            name="John",219            pericopes=[220                Pericope(221                    id="john-prologue",222                    start_chapter=1,223                    start_verse=1,224                    end_chapter=1,225                    end_verse=18,226                    verses=["1:1"],227                )228            ],229        )230        generated = PericopeIndex(231            book="john",232            name="John",233            pericopes=[234                Pericope(235                    id="john-auto-001",236                    start_chapter=1,237                    start_verse=1,238                    end_chapter=1,239                    end_verse=4,240                    verses=["1:1", "1:2", "1:3", "1:4"],241                    auto_generated=True,242                )243            ],244        )245        result = merge_pericope_indexes(manual, generated)246        assert result == manual247248    def test_empty_manual_uses_generated(self):249        """Test that empty manual index falls back to generated."""250        manual = PericopeIndex(book="john", name="John", pericopes=[])251        generated = PericopeIndex(252            book="john",253            name="John",254            pericopes=[255                Pericope(256                    id="john-auto-001",257                    start_chapter=1,258                    start_verse=1,259                    end_chapter=1,260                    end_verse=4,261                    verses=["1:1", "1:2", "1:3", "1:4"],262                    auto_generated=True,263                )264            ],265        )266        result = merge_pericope_indexes(manual, generated)267        assert result == generated268269270class TestConstants:271    """Tests for module constants."""272273    def test_paragraph_marker(self):274        """Test paragraph marker constant."""275        assert PARAGRAPH_MARKER == "¶"276277    def test_min_pericope_size(self):278        """Test minimum pericope size."""279        assert MIN_PERICOPE_SIZE >= 1280281    def test_max_pericope_size(self):282        """Test maximum pericope size."""283        assert MAX_PERICOPE_SIZE > MIN_PERICOPE_SIZE284        assert MAX_PERICOPE_SIZE <= 50  # Reasonable upper bound285