1 # SPDX-License-Identifier: GPL-2.0-only
3 # This file is part of Nominatim. (https://nominatim.org)
5 # Copyright (C) 2022 by the Nominatim developer community.
6 # For a full list of authors see the git log.
8 Tests for special postcode analysis and variant generation.
12 from icu import Transliterator
14 import nominatim.tokenizer.token_analysis.postcodes as module
15 from nominatim.data.place_name import PlaceName
16 from nominatim.errors import UsageError
18 DEFAULT_NORMALIZATION = """ :: NFD ();
20 [[:Nonspacing Mark:] [:Cf:]] >;
22 [[:Punctuation:][:Space:]]+ > ' ';
26 DEFAULT_TRANSLITERATION = """ :: Latin ();
32 rules = { 'analyzer': 'postcodes'}
33 config = module.configure(rules, DEFAULT_NORMALIZATION)
35 trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
36 norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
38 return module.create(norm, trans, config)
41 def get_normalized_variants(proc, name):
42 norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
43 return proc.compute_variants(norm.transliterate(name).strip())
46 @pytest.mark.parametrize('name,norm', [('12', '12'),
49 def test_get_canonical_id(analyser, name, norm):
50 assert analyser.get_canonical_id(PlaceName(name=name, kind='', suffix='')) == norm
53 @pytest.mark.parametrize('postcode,variants', [('12345', {'12345'}),
54 ('AB-998', {'ab 998', 'ab998'}),
55 ('23 FGH D3', {'23 fgh d3', '23fgh d3',
56 '23 fghd3', '23fghd3'})])
57 def test_compute_variants(analyser, postcode, variants):
58 out = analyser.compute_variants(postcode)
60 assert len(out) == len(set(out))
61 assert set(out) == variants