Skip to content

Commit

Permalink
areas: allow hyphens in invalid items
Browse files Browse the repository at this point in the history
These are not parsed, they are used as a filter as-is, apart from
dropping slashes and converting to lowercase before comparison.

Addresses <#3892>.

Change-Id: I6d907cbb2afabd6169c576d96ea12ab5dc7a090e
  • Loading branch information
vmiklos committed Sep 19, 2024
1 parent ecd9d52 commit a27c9db
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/areas.rs
Original file line number Diff line number Diff line change
Expand Up @@ -790,7 +790,24 @@ impl<'a> Relation<'a> {

let mut used_invalids: Vec<String> = Vec::new();
if let Some(value) = lines.get(&ref_street_name) {
for house_number in value {
// Find 'invalid' items which are ranges.
let invalid_ranges: Vec<String> = street_invalid
.iter()
.filter(|i| i.contains('-'))
.map(|i| i.replace("/", "").to_lowercase())
.collect();

// Filter out ref items which match such invalid items.
let hns: Vec<_> = value
.iter()
.filter(|i| {
let mut it = i.split('\t');
let i = it.next().expect("token list should not be empty");
!invalid_ranges.contains(&i.replace("/", "").to_lowercase())
})
.collect();

for house_number in hns {
let normalized = normalize(
self,
house_number,
Expand Down
61 changes: 61 additions & 0 deletions src/areas/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1376,6 +1376,67 @@ fn test_relation_get_missing_housenumbers() {
);
}

/// Tests Relation::get_missing_housenumbers(), the case when 'invalid' contains hyphens.
#[test]
fn test_relation_get_missing_housenumbers_invalid_hyphens() {
let mut ctx = context::tests::make_test_context().unwrap();
let yamls_cache = serde_json::json!({
"relations.yaml": {
"myrelation": {
"refcounty": "0",
"refsettlement": "0",
},
},
"relation-myrelation.yaml": {
"housenumber-letters": true,
"filters": {
"mystreet": {
"invalid": ["42", "40-60", "48", "50a-b"],
}
},
},
});
let yamls_cache_value = context::tests::TestFileSystem::write_json_to_file(&yamls_cache);
let files = context::tests::TestFileSystem::make_files(
&ctx,
&[("data/yamls.cache", &yamls_cache_value)],
);
let file_system = context::tests::TestFileSystem::from_files(&files);
ctx.set_file_system(&file_system);
{
let conn = ctx.get_database_connection().unwrap();
// 1 is done, 2 is missing, 3 is invalid.
conn.execute_batch(
"insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '42', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '44-46', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '48', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '48/A', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '40-60', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '50/A', '');
insert into ref_housenumbers (county_code, settlement_code, street, housenumber, comment) values ('0', '0', 'mystreet', '50/A-B', '');
insert into osm_streets (relation, osm_id, name, highway, service, surface, leisure, osm_type) values ('myrelation', '2', 'mystreet', '', '', '', '', '');",
)
.unwrap();
}
let mut relations = Relations::new(&ctx).unwrap();
let relation_name = "myrelation";
let mut relation = relations.get_relation(relation_name).unwrap();
let missing_housenumbers = relation.get_missing_housenumbers().unwrap();
let ongoing_streets = numbered_streets_to_array(&missing_housenumbers.ongoing_streets);
assert_eq!(
ongoing_streets,
[(
"mystreet".to_string(),
vec![
"44".to_string(),
"46".to_string(),
"48/A".to_string(),
"50/A".to_string(),
]
),]
);
}

/// Tests Relation::get_lints().
#[test]
fn test_relation_get_lints() {
Expand Down
8 changes: 8 additions & 0 deletions src/validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ fn validate_filter_invalid_valid(
if regex::Regex::new(r"^[0-9]+/[0-9]$")?.is_match(invalid_data) {
continue;
}

// 40-60 or 50a-b: OK, but won't be parsed.
if regex::Regex::new(r"^[0-9]+-[0-9]+$")?.is_match(invalid_data) {
continue;
}
if regex::Regex::new(r"^[0-9]+[a-z]-[a-z]$")?.is_match(invalid_data) {
continue;
}
errors.push(format!(
"expected format for '{parent}[{index}]' is '42', '42a' or '42/1'"
));
Expand Down
20 changes: 20 additions & 0 deletions src/validator/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,26 @@ fn test_validate_filter_invalid_valid2() {
assert_success(content);
}

/// Tests validate_filter_invalid_valid(): 40-60 is a valid filter item.
#[test]
fn test_validate_filter_invalid_valid3() {
let content = r#"filters:
'mystreet':
invalid: ['40-60']
"#;
assert_success(content);
}

/// Tests validate_filter_invalid_valid(): 50a-b is a valid filter item.
#[test]
fn test_validate_filter_invalid_valid4() {
let content = r#"filters:
'mystreet':
invalid: ['50a-b']
"#;
assert_success(content);
}

/// Tests the relation path: bad source type.
#[test]
fn test_relation_source_bad_type() {
Expand Down

0 comments on commit a27c9db

Please sign in to comment.