# tests/test_codec.py import pytest from etpgrf import codec # Вообще, проверять кодирование HTML-мнемоников в Unicode не обязательно, так как это внутренняя библиотека html, # но так как мнемоники были собраны из разных сторонников, полезно проверить какие из них работают, а какие нет... # Это способствует тому, что обратное преобразование из Unicode в HTML-мнемоники будет работать корректно. STRINGS_FOR_DECODE = [ # Тестовые строки для декодирования html-метаккода в uft-8 ("", ""), # Пустая строка ("Hello world!", "Hello world!"), # Строка ("Привет типограф!", "Привет типограф!"), # Строка русского текста ("< > & "", "< > & \""), # Самый простой набор HTML-мнемоников ("­", "\u00AD"), # Мягкий перенос ("    ‍‌", "\u00A0\u2002\u2003\u2009\u200D\u200C"), # Набор пробелов и невидимых символов ("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов ("' « »", "' « »"), # Апостроф и ёлочки ("“ ” „", "“ ” „"), # Двойные кавычки ("‘ ’ ‚", "‘ ’ ‚"), # Одиночные кавычки ("‹ ›", "‹ ›"), # Французские угловые кавычки ("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы ("+ − × ÷ = ≠", "+ − × ÷ = ≠"), # Математические символы ("± ¬ ° ¹ ² ³", "± ¬ ° ¹ ² ³"), ("ƒ % ‰ ‱", "ƒ % ‰ ‱"), ("∀ ∁ ∂ ∃ ∄", "∀ ∁ ∂ ∃ ∄"), ("∅ ∇ ∈ ∉ ∋ ∌", "∅ ∇ ∈ ∉ ∋ ∌"), ("∏ ∐ ∑ ∓ ∸", "∏ ∐ ∑ ∓ ∸"), ("∔ ∖ ∗ ∘ √", "∔ ∖ ∗ ∘ √"), ("∝ ∞ ∠ ∟ ∡ ∣", "∝ ∞ ∠ ∟ ∡ ∣"), ("∢ ∤ '∥ ∦ ∧ ∨", "∢ ∤ '∥ ∦ ∧ ∨"), ("∩ ∪ ∫ ∬ ∭ ∮", "∩ ∪ ∫ ∬ ∭ ∮"), ("∯ ∰ ∱ ∲", "∯ ∰ ∱ ∲"), ("∳ ∴ ∵ ∶ ∷", "∳ ∴ ∵ ∶ ∷"), ("∺ ∻ ∼ ∽ ∾ ∿", "∺ ∻ ∼ ∽ ∾ ∿"), ("≀ ≁ ≂ ≃ ≄ ≅", "≀ ≁ ≂ ≃ ≄ ≅"), ("≈ ≆ ≇ ≉ ≊ ≋", "≈ ≆ ≇ ≉ ≊ ≋"), ("≌ ≍ ≎ ≏ ≐ ≑", "≌ ≍ ≎ ≏ ≐ ≑"), ("≒ ≓ ≔ ≕ ≖ ≗", "≒ ≓ ≔ ≕ ≖ ≗"), ("≙ ≚ ≜ ≟ ≡", "≙ ≚ ≜ ≟ ≡"), ("≢ ≤ ≥ ≦ ≧ ≨ ≩", "≢ ≤ ≥ ≦ ≧ ≨ ≩"), ("≪ ≫ ≬ ≭ ≮ ≯", "≪ ≫ ≬ ≭ ≮ ≯"), ("≰ ≱ ≲ ≳ ≴ ≵", "≰ ≱ ≲ ≳ ≴ ≵"), ("≶ ≷ ≸ ≹ ≺ ≻", "≶ ≷ ≸ ≹ ≺ ≻"), ("≼ ≽ ≾ ≿ ⊀ ⊁", "≼ ≽ ≾ ≿ ⊀ ⊁"), ("⊂ ⊃ ⊄ ⊅ ⊆ ⊇", "⊂ ⊃ ⊄ ⊅ ⊆ ⊇"), ("⊈ ⊉ ⊊ ⊋ ⊍", "⊈ ⊉ ⊊ ⊋ ⊍"), ("⊎ ⊏ ⊐ ⊑ ⊒", "⊎ ⊏ ⊐ ⊑ ⊒"), ("⊓ ⊔ ⊕ ⊖ ⊗", "⊓ ⊔ ⊕ ⊖ ⊗"), ("⊘ ⊙ ⊚ ⊛ ⊝ ⊞", "⊘ ⊙ ⊚ ⊛ ⊝ ⊞"), ("⊟ ⊠ ⊡ ⊢ ⊣ ⊤", "⊟ ⊠ ⊡ ⊢ ⊣ ⊤"), ("⊥ ⊧ ⊨ ⊩ ⊪", "⊥ ⊧ ⊨ ⊩ ⊪"), ("⊫ ⊬ ⊭ ⊮ ⊯", "⊫ ⊬ ⊭ ⊮ ⊯"), ("⊰ ⊲ ⊳ ⊴ ⊵", "⊰ ⊲ ⊳ ⊴ ⊵"), ("⊶ ⊷ ⊸ ⊹ ⊺", "⊶ ⊷ ⊸ ⊹ ⊺"), ("⊻ ⊽ ⊾ ⊿ ⋀", "⊻ ⊽ ⊾ ⊿ ⋀"), ("⋁ ⋂ ⋃ ⋄ ⋅ ⋆", "⋁ ⋂ ⋃ ⋄ ⋅ ⋆"), ("⋇ ⋈ ⋉ ⋊ ⋋", "⋇ ⋈ ⋉ ⋊ ⋋"), ("⋌ ⋍ ⋎ ⋏ ⋐ ⋑", "⋌ ⋍ ⋎ ⋏ ⋐ ⋑"), ("⋒ ⋓ ⋔ ⋕ ⋖ ⋗", "⋒ ⋓ ⋔ ⋕ ⋖ ⋗"), ("⋘ ⋙ ⋚ ⋛ ⋞ ⋟", "⋘ ⋙ ⋚ ⋛ ⋞ ⋟"), ("⋠ ⋡ ⋢ ⋣", "⋠ ⋡ ⋢ ⋣"), ("⪉ ⪊ ⋦ ⋧ ⋨", "⪉ ⪊ ⋦ ⋧ ⋨"), ("⋩ ⋪ ⋫ ⋬ ⋭", "⋩ ⋪ ⋫ ⋬ ⋭"), ("⋮ ⋯ ⋰ ⋱ ⋲", "⋮ ⋯ ⋰ ⋱ ⋲"), ("⋳ ⋴ ⋵ ⋶ ⋷", "⋳ ⋴ ⋵ ⋶ ⋷"), ("⋹ ⋺ ⋻ ⋼ ⋽", "⋹ ⋺ ⋻ ⋼ ⋽"), ("⋾ ⌅ ⌆ ⌈ ⌈", "⋾ ⌅ ⌆ ⌈ ⌈"), ("⌉ ⌊ ⌋ ⟨ ⟩", "⌉ ⌊ ⌋ ⟨ ⟩"), ("© ® ™ ℗ @", "© ® ™ ℗ @"), # Другие символы ("ℂ ℅ ℊ ℋ ℌ ℍ", "ℂ ℅ ℊ ℋ ℌ ℍ"), ("ℎ ℏ ℐ ℑ ℒ ℓ", "ℎ ℏ ℐ ℑ ℒ ℓ"), ("ℕ № ℘ ℙ ℚ ℛ", "ℕ № ℘ ℙ ℚ ℛ"), ("ℝ ℞ ℤ ℧ ℨ ℩", "ℝ ℞ ℤ ℧ ℨ ℩"), ("ℬ ℭ ℯ ℰ ℱ ℳ", "ℬ ℭ ℯ ℰ ℱ ℳ"), ("ℴ ℵ ℶ ℷ ℸ", "ℴ ℵ ℶ ℷ ℸ"), ("ⅅ ⅆ ⅇ ⅈ ffi ff", "ⅅ ⅆ ⅇ ⅈ ffi ff"), ("fi fl ★ ☆ ☎", "fi fl ★ ☆ ☎"), ("♀ ♂ ♠ ♣ ♥ ♦", "♀ ♂ ♠ ♣ ♥ ♦"), ("◊ ♪ ♭ ♮ ♯ ✓", "◊ ♪ ♭ ♮ ♯ ✓"), ("✗ ✠ ✶ ❘", "✗ ✠ ✶ ❘"), ("❲ ❳", "❲ ❳"), ("! # % ( ) *", "! # % ( ) *"), # Знаки препинания (", . / : ;", ", . / : ;"), ("? [ \ ] ^ _", "? [ \\ ] ^ _"), ("` { | } ˜", "` { | } ˜"), ("ˆ ‎ ‏ ¡ ¦ §", "ˆ \u200e \u200f ¡ ¦ §"), ("¨ ª ¬ ¯ ´ µ ‵", "¨ ª ¬ ¯ ´ µ ‵"), ("¶ · ¸ º ¿ ‖", "¶ · ¸ º ¿ ‖"), ("† ‡ • ‥ …", "† ‡ • ‥ …"), ("‰ ‱ ′ ″ ‴", "‰ ‱ ′ ″ ‴"), ("‾ ⁁ ⁃ ⁄ ⁏ ⁗", "‾ ⁁ ⁃ ⁄ ⁏ ⁗"), ("½ ⅓ ¼ ⅕ ⅙", "½ ⅓ ¼ ⅕ ⅙"), # Дробные символы и знаки ("⅛ ⅔ ⅖ ¾ ⅗", "⅛ ⅔ ⅖ ¾ ⅗"), ("⅜ ⅘ ⅚ ⅝ ⅞", "⅜ ⅘ ⅚ ⅝ ⅞"), ("Α Β Γ Δ Ε Ζ", "Α Β Γ Δ Ε Ζ"), # Греческие символы ("Η Θ Ι Κ Λ Μ", "Η Θ Ι Κ Λ Μ"), ("Ν Ξ Ο Π Ρ Σ Τ", "Ν Ξ Ο Π Ρ Σ Τ"), ("Υ Φ Χ Ψ Ω α", "Υ Φ Χ Ψ Ω α"), ("β γ δ ε ζ η", "β γ δ ε ζ η"), ("θ ι κ λ μ ν", "θ ι κ λ μ ν"), ("ξ ο π ρ ς τ", "ξ ο π ρ ς τ"), ("υ φ χ ψ ω", "υ φ χ ψ ω"), ("ϑ ϒ ϖ", "ϑ ϒ ϖ"), ("", ""), ("", ""), ] @pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_DECODE) def test_html_mnemo_to_utf(input_string, expected_output): """ Проверяет ПОВЕДЕНИЕ: декодирование HTML-мнемоников в Unicode-строки. """ # Act (действие) - тестируем actual_output = codec.decode_to_unicode(input_string) # Assert (проверка) assert actual_output == expected_output