Skip to content

Commit e1bca09

Browse files
authored
Merge pull request #92 from google/recovery-rust
Fix recovery bug in Rust
2 parents 6fa2965 + f5d4040 commit e1bca09

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

rust/src/interface.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,23 +272,23 @@ pub fn recover_nearest(_code: &str, ref_pt: Point<f64>) -> Result<String, String
272272

273273
let code_area = decode(code.as_str()).unwrap();
274274

275-
let area_range = compute_latitude_precision(prefix_len);
276-
let area_edge = area_range / 2f64;
275+
let resolution = compute_latitude_precision(prefix_len);
276+
let half_res = resolution / 2f64;
277277

278278
let mut latitude = code_area.center.lat();
279279
let mut longitude = code_area.center.lng();
280280

281-
let latitude_diff = latitude - clip_latitude(ref_pt.lat());
282-
if latitude_diff > area_edge {
283-
latitude -= area_range;
284-
} else if latitude_diff < -area_edge {
285-
latitude += area_range;
281+
let ref_lat = clip_latitude(ref_pt.lat());
282+
let ref_lng = normalize_longitude(ref_pt.lng());
283+
if ref_lat + half_res < latitude && latitude - resolution >= -LATITUDE_MAX {
284+
latitude -= resolution;
285+
} else if ref_lat - half_res > latitude && latitude + resolution <= LATITUDE_MAX {
286+
latitude += resolution;
286287
}
287-
let longitude_diff = longitude - normalize_longitude(ref_pt.lng());
288-
if longitude_diff > area_edge {
289-
longitude -= area_range;
290-
} else if longitude_diff < -area_edge {
291-
longitude += area_range;
288+
if ref_lng + half_res < longitude {
289+
longitude -= resolution;
290+
} else if ref_lng - half_res > longitude {
291+
longitude += resolution;
292292
}
293293
Ok(encode(Point::new(longitude, latitude), code_area.code_length))
294294
}

rust/tests/all_test.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,18 @@ fn shorten_recovery_test() {
7777
let lat = cols[1].parse::<f64>().unwrap();
7878
let lng = cols[2].parse::<f64>().unwrap();
7979
let short_code = cols[3];
80-
81-
assert_eq!(shorten(full_code, Point::new(lng, lat)).unwrap(), short_code, "shorten");
82-
assert_eq!(
83-
recover_nearest(short_code, Point::new(lng, lat)),
84-
Ok(full_code.to_string()),
85-
"recover"
86-
);
80+
let test_type = cols[4];
81+
82+
if test_type == "B" || test_type == "S" {
83+
assert_eq!(shorten(full_code, Point::new(lng, lat)).unwrap(), short_code, "shorten");
84+
}
85+
if test_type == "B" || test_type == "R" {
86+
assert_eq!(
87+
recover_nearest(short_code, Point::new(lng, lat)),
88+
Ok(full_code.to_string()),
89+
"recover"
90+
);
91+
}
8792

8893
tested += 1;
8994
}

0 commit comments

Comments
 (0)