1 # SPDX-License-Identifier: GPL-3.0-or-later
3 # This file is part of Nominatim. (https://nominatim.org)
5 # Copyright (C) 2026 by the Nominatim developer community.
6 # For a full list of authors see the git log.
8 Tests for the sanitizer that expands prefixes and suffixes.
12 from nominatim_db.data.place_info import PlaceInfo
13 from nominatim_db.tokenizer.place_sanitizer import PlaceSanitizer
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)
30 return PlaceInfo({'name': names, 'country_code': 'de', 'rank_address': 30})
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'})
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)}
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'})
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')}
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'})
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),
69 ('N H', 'name', 'de')}
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'})
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)}
83 def test_modes_full_name_given(run_sanitizer):
84 place = mk_place({'name': 'Full Name Street', 'name:prefix': 'Full'})
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)}
98 def test_modes_short_name_given(run_sanitizer):
99 place = mk_place({'name': 'My Street', 'name:suffix': 'extra'})
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)}