1
0
mirror of https://github.com/MarkParker5/STARK.git synced 2026-06-13 16:42:26 +02:00
Files
STARK/tests/test_patterns/test_pattern_parameters.py
2023-10-02 07:10:12 +02:00

47 lines
1.8 KiB
Python

import re
import pytest
from stark.core import Pattern
from stark.core.types import Object, Word, String
from stark.core.patterns import expressions
from stark.general.classproperty import classproperty
from stark.general.localisation import Localizer
word = fr'[{expressions.alphanumerics}]*'
words = fr'[{expressions.alphanumerics}\s]*'
class ExtraParameterInPattern(Object):
word1: Word
word2: Word
@classproperty
def pattern(cls) -> Pattern:
return Pattern('$word1:Word $word2:Word $word3:Word')
async def test_typed_parameters(get_transcription):
p = Pattern('lorem $name:Word dolor')
p.get_compiled('en', Localizer())
assert p.parameters == {'name': Word}
# assert p._compiled['en'] == fr'lorem (?P<name>{word}) dolor'
m = await p.match(get_transcription('lorem ipsum dolor'), Localizer())
assert m
assert m[0].subtrack.text == 'lorem ipsum dolor'
assert m[0].parameters == {'name': Word('ipsum')}
assert not await p.match(get_transcription('lorem ipsum foo dolor'), Localizer())
p = Pattern('lorem $name:String dolor')
assert p.parameters == {'name': String}
m = await p.match(get_transcription('lorem ipsum foo bar dolor'), Localizer())
assert m
assert m[0].subtrack.text == 'lorem ipsum foo bar dolor'
assert m[0].parameters == {'name': String('ipsum foo bar')}
def test_undefined_typed_parameters():
pattern = 'lorem $name:Lorem dolor'
with pytest.raises(NameError, match=re.escape(f'Unknown type: "Lorem" for parameter: "name" in pattern: "{pattern}"')):
Pattern(pattern)
def test_extra_parameter_in_pattern():
with pytest.raises(AssertionError, match='Can`t add parameter type "ExtraParameterInPattern": pattern parameters do not match properties annotated in class'):
Pattern.add_parameter_type(ExtraParameterInPattern)