]> git.openstreetmap.org Git - nominatim.git/blob - test/python/tokenizer/sanitizers/test_affix_expansion.py
prepare release 5.3.2.post5
[nominatim.git] / test / python / tokenizer / sanitizers / test_affix_expansion.py
1 # SPDX-License-Identifier: GPL-3.0-or-later
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2026 by the Nominatim developer community.
6 # For a full list of authors see the git log.
7 """
8 Tests for the sanitizer that expands prefixes and suffixes.
9 """
10 import pytest
11
12 from nominatim_db.data.place_info import PlaceInfo
13 from nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer
14
15
16 @pytest.fixture
17 def run_sanitizer(def_config):
18     def _f(place, **kwargs):
19         args = {k.replace('_', '-'): v for k, v in kwargs.items()}
20         san = PlaceSanitizer([args | {'step': 'affix-expansion'}], def_config)
21         names, _ = san.process_names(place)
22         nameset = {(p.name, p.kind, p.suffix) for p in names}
23         assert len(names) == len(nameset)
24         return nameset
25
26     return _f
27
28
29 def mk_place(names):
30     return PlaceInfo({'name': names, 'country_code': 'de', 'rank_address': 30})
31
32
33 def test_default_settings(run_sanitizer):
34     place = mk_place({'name': 'Foo Street', 'name:prefix': 'North',
35                       'alt_name': 'Foo Street South', 'alt_name:suffix': 'South',
36                       'loc_name': 'Fun Mile'})
37
38     assert run_sanitizer(place) == {('Foo Street', 'name', None),
39                                     ('North Foo Street', 'name', None),
40                                     ('Foo Street South', 'alt_name', None),
41                                     ('Foo Street', 'alt_name', None),
42                                     ('Fun Mile', 'loc_name', None)}
43
44
45 def test_custom_prefix(run_sanitizer):
46     place = mk_place({'name': 'Foo Street', 'name:start': 'North',
47                       'name:fr': 'West Bubble Street', 'name:begin:fr': 'West',
48                       'name:prefix': 'other'})
49
50     assert run_sanitizer(place, prefix_tags=['start', 'begin']) == \
51         {('Foo Street', 'name', None),
52          ('North Foo Street', 'name', None),
53          ('West Bubble Street', 'name', 'fr'),
54          ('Bubble Street', 'name', 'fr'),
55          ('other', 'name', 'prefix')}
56
57
58 def test_custom_suffix(run_sanitizer):
59     place = mk_place({'name': 'Foo Street', 'name:end': 'B',
60                       'alt_name': 'Balula', 'alt_name:final': 'Loo',
61                       'name:de': 'H', 'name:de:prefix': 'N'})
62
63     assert run_sanitizer(place, suffix_tags=['end', 'final']) == \
64         {('Foo Street', 'name', None),
65          ('Foo Street B', 'name', None),
66          ('Balula', 'alt_name', None),
67          ('Balula Loo', 'alt_name', None),
68          ('H', 'name', 'de'),
69          ('N H', 'name', 'de')}
70
71
72 @pytest.mark.parametrize('stem', ['Stem Road', 'Pre Stem Road',
73                                   'Stem Road Post', 'Pre Stem Road Post'])
74 def test_prefix_and_suffix_given(run_sanitizer, stem):
75     place = mk_place({'name': stem, 'name:prefix': 'Pre', 'name:suffix': 'Post'})
76
77     assert run_sanitizer(place, mode='full-name') == \
78         {('Pre Stem Road Post', 'name', None)}
79     assert run_sanitizer(place, mode='short-name') == \
80         {('Stem Road', 'name', None), ('Pre', 'prefix', None), ('Post', 'suffix', None)}
81
82
83 def test_modes_full_name_given(run_sanitizer):
84     place = mk_place({'name': 'Full Name Street', 'name:prefix': 'Full'})
85
86     assert run_sanitizer(place, mode='full-name') == \
87         {('Full Name Street', 'name', None)}
88     assert run_sanitizer(place, mode='short-name') == \
89         {('Name Street', 'name', None), ('Full', 'prefix', None)}
90     assert run_sanitizer(place, mode='all-variants') == \
91         {('Full Name Street', 'name', None), ('Name Street', 'name', None)}
92     assert run_sanitizer(place, mode='add-expanded') == \
93         {('Full Name Street', 'name', None)}
94     assert run_sanitizer(place, mode='add-contracted') == \
95         {('Full Name Street', 'name', None), ('Name Street', 'name', None)}
96
97
98 def test_modes_short_name_given(run_sanitizer):
99     place = mk_place({'name': 'My Street', 'name:suffix': 'extra'})
100
101     assert run_sanitizer(place, mode='full-name') == \
102         {('My Street extra', 'name', None)}
103     assert run_sanitizer(place, mode='short-name') == \
104         {('My Street', 'name', None), ('extra', 'suffix', None)}
105     assert run_sanitizer(place, mode='all-variants') == \
106         {('My Street extra', 'name', None), ('My Street', 'name', None)}
107     assert run_sanitizer(place, mode='add-expanded') == \
108         {('My Street extra', 'name', None), ('My Street', 'name', None)}
109     assert run_sanitizer(place, mode='add-contracted') == \
110         {('My Street', 'name', None)}