Skip to content

Commit

Permalink
Merge pull request #107 from YuukiToriyama/feature/enhance-parser/master
Browse files Browse the repository at this point in the history
parserモジュールのエンハンスをrelease/v0.1.0-beta.1にマージ
  • Loading branch information
YuukiToriyama authored Jan 5, 2024
2 parents 4d1bcf9 + 14d2b11 commit ab65bb9
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 96 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ wasm-bindgen-futures = "0.4.39"

[dev-dependencies]
csv = "1.3.0"
test-case = "3.3.1"
tokio = { version = "1.35.1", features = ["rt", "macros"] }
wasm-bindgen-test = "0.3.38"
103 changes: 74 additions & 29 deletions src/parser.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use crate::api::{Api, BlockingApi};
use crate::api::Api;
#[cfg(not(target_arch = "wasm32"))]
use crate::api::BlockingApi;
use crate::entity::{Address, ParseResult};
use crate::err::{Error, ParseErrorKind};
use crate::parser::read_city::read_city;
Expand All @@ -14,54 +16,51 @@ mod read_town;

pub async fn parse<T: Api>(api: T, input: &str) -> ParseResult {
// 都道府県を特定
let (rest, prefecture_name) = match read_prefecture(input) {
None => {
return ParseResult {
address: Address::new("", "", "", input),
error: Some(Error::new_parse_error(ParseErrorKind::Prefecture)),
}
}
Some(result) => result,
let (rest, prefecture_name) = if let Some(result) = read_prefecture(input) {
result
} else {
return ParseResult {
address: Address::new("", "", "", input),
error: Some(Error::new_parse_error(ParseErrorKind::Prefecture)),
};
};
// その都道府県の市町村名リストを取得
let prefecture = match api.get_prefecture_master(prefecture_name).await {
Err(error) => {
return ParseResult {
address: Address::new(prefecture_name, "", "", rest),
error: Some(error),
}
};
}
Ok(result) => result,
};
// 市町村名を特定
let (rest, city_name) = match read_city(rest, prefecture) {
None => {
return ParseResult {
address: Address::new(prefecture_name, "", "", rest),
error: Some(Error::new_parse_error(ParseErrorKind::City)),
}
}
Some(result) => result,
let (rest, city_name) = if let Some(result) = read_city(rest, prefecture) {
result
} else {
return ParseResult {
address: Address::new(prefecture_name, "", "", rest),
error: Some(Error::new_parse_error(ParseErrorKind::City)),
};
};
// その市町村の町名リストを取得
let city = match api.get_city_master(prefecture_name, &city_name).await {
Err(error) => {
return ParseResult {
address: Address::new(prefecture_name, &city_name, "", &rest),
error: Some(error),
}
};
}
Ok(result) => result,
};
// 町名を特定
let (rest, town_name) = match read_town(&rest, &city) {
None => {
return ParseResult {
address: Address::new(prefecture_name, &city_name, "", &rest),
error: Some(Error::new_parse_error(ParseErrorKind::Town)),
}
}
Some(result) => result,
let (rest, town_name) = if let Some(result) = read_town(&rest, &city) {
result
} else {
return ParseResult {
address: Address::new(prefecture_name, &city_name, "", &rest),
error: Some(Error::new_parse_error(ParseErrorKind::Town)),
};
};

ParseResult {
Expand All @@ -71,11 +70,57 @@ pub async fn parse<T: Api>(api: T, input: &str) -> ParseResult {
}

#[cfg(test)]
mod parser_tests {
mod non_blocking_tests {
use crate::api::client::ApiImpl;
use crate::err::ParseErrorKind;
use crate::parser::parse;
use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure};

#[tokio::test]
async fn 都道府県名が誤っている場合() {
let api = ApiImpl {};
let result = parse(api, "青盛県青森市長島1丁目1−1").await;
assert_eq!(result.address.prefecture, "");
assert_eq!(result.address.city, "");
assert_eq!(result.address.town, "");
assert_eq!(result.address.rest, "青盛県青森市長島1丁目1−1");
assert_eq!(result.error.is_some(), true);
assert_eq!(
result.error.unwrap().error_message,
ParseErrorKind::Prefecture.to_string()
);
}

#[tokio::test]
async fn 市区町村名が誤っている場合() {
let api = ApiImpl {};
let result = parse(api, "青森県青盛市長島1丁目1−1").await;
assert_eq!(result.address.prefecture, "青森県");
assert_eq!(result.address.city, "");
assert_eq!(result.address.town, "");
assert_eq!(result.address.rest, "青盛市長島1丁目1−1");
assert_eq!(result.error.is_some(), true);
assert_eq!(
result.error.unwrap().error_message,
ParseErrorKind::City.to_string()
);
}

#[tokio::test]
async fn 町名が誤っている場合() {
let api = ApiImpl {};
let result = parse(api, "青森県青森市永嶋1丁目1−1").await;
assert_eq!(result.address.prefecture, "青森県");
assert_eq!(result.address.city, "青森市");
assert_eq!(result.address.town, "");
assert_eq!(result.address.rest, "永嶋1丁目1−1");
assert_eq!(result.error.is_some(), true);
assert_eq!(
result.error.unwrap().error_message,
ParseErrorKind::Town.to_string()
);
}

wasm_bindgen_test_configure!(run_in_browser);

#[wasm_bindgen_test]
Expand Down Expand Up @@ -145,7 +190,7 @@ pub fn parse_blocking<T: BlockingApi>(api: T, input: &str) -> ParseResult {
}

#[cfg(all(test, not(target_arch = "wasm32")))]
mod parse_blocking_tests {
mod blocking_tests {
use crate::api;
use crate::err::ParseErrorKind;
use crate::parser::parse_blocking;
Expand Down
88 changes: 22 additions & 66 deletions src/parser/read_city.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub fn read_city(input: &str, prefecture: Prefecture) -> Option<(String, String)
return Some((rest.to_string(), city_name.to_string()));
}
let adapter = OrthographicalVariantAdapter {
variant_list: vec![vec!["ケ", "ヶ", "が"]],
variant_list: vec![vec!["ケ", "ヶ", "が"], vec!["龍", "竜"]],
};
if let Some(result) = adapter.apply(input, &city_name) {
return Some(result);
Expand All @@ -21,72 +21,28 @@ pub fn read_city(input: &str, prefecture: Prefecture) -> Option<(String, String)
None
}

#[cfg(test)]
mod parser_tests {
use crate::entity::Prefecture;
#[cfg(all(test, not(target_arch = "wasm32")))]
mod tests {
use crate::api::blocking::Client;
use crate::api::BlockingApi;
use crate::parser::read_city::read_city;
use test_case::test_case;

#[test]
fn read_city_成功_京都市山科区() {
let prefecture = Prefecture::new(
"京都府",
vec!["京都市北区", "京都市上京区", "京都市山科区", "京都市西京区"],
);
let (rest, city) = read_city("京都市山科区椥辻池尻町14-2", prefecture).unwrap();
assert_eq!(rest, "椥辻池尻町14-2");
assert_eq!(city, "京都市山科区");
}

#[test]
fn read_city_失敗_市区町村名が誤っている() {
let prefecture = Prefecture::new(
"京都府",
vec!["京都市北区", "京都市上京区", "京都市山科区", "京都市西京区"],
);
assert_eq!(read_city("港区芝公園4丁目2-8", prefecture), None);
}

#[test]
fn read_city_表記ゆれ_茅ヶ崎市() {
let prefecture = Prefecture::new(
"神奈川県",
vec!["鎌倉市", "藤沢市", "小田原市", "茅ヶ崎市", "逗子市"],
);
let (rest, city) = read_city("茅ケ崎市香川5丁目1", prefecture).unwrap();
assert_eq!(rest, "香川5丁目1");
assert_eq!(city, "茅ヶ崎市");
}

#[test]
fn read_city_表記ゆれ_横浜市保土ケ谷区() {
let prefecture = Prefecture::new(
"神奈川県",
vec![
"横浜市中区",
"横浜市南区",
"横浜市保土ケ谷区",
"横浜市磯子区",
],
);
let (rest, city) = read_city("横浜市保土ヶ谷区川辺町2番地9", prefecture).unwrap();
assert_eq!(rest, "川辺町2番地9");
assert_eq!(city, "横浜市保土ケ谷区");
}

#[test]
fn read_city_表記ゆれ_不破郡関ケ原町() {
let prefecture = Prefecture::new(
"岐阜県",
vec![
"養老郡養老町",
"不破郡垂井町",
"不破郡関ケ原町",
"安八郡神戸町",
"安八郡輪之内町",
],
);
let (rest, city) = read_city("不破郡関が原町大字関ケ原894番地の58", prefecture).unwrap();
assert_eq!(rest, "大字関ケ原894番地の58");
assert_eq!(city, "不破郡関ケ原町");
#[test_case("京都府", "京都市山科区椥辻池尻町14-2", "京都市山科区"; "success_京都市山科区")]
#[test_case("神奈川県", "茅ヶ崎市香川5丁目1", "茅ヶ崎市"; "success_茅ヶ崎市")]
#[test_case("神奈川県", "茅ケ崎市香川5丁目1", "茅ヶ崎市"; "success_茅ケ崎市_表記ゆれ")]
#[test_case("神奈川県", "横浜市保土ケ谷区川辺町2番地9", "横浜市保土ケ谷区"; "success_横浜市保土ケ谷区")]
#[test_case("神奈川県", "横浜市保土ヶ谷区川辺町2番地9", "横浜市保土ケ谷区"; "success_横浜市保土ヶ谷区_表記ゆれ")]
#[test_case("岐阜県", "不破郡関ケ原町大字関ケ原894番地の58", "不破郡関ケ原町"; "success_不破郡関ケ原町")]
#[test_case("岐阜県", "不破郡関が原町大字関ケ原894番地の58", "不破郡関ケ原町"; "success_不破郡関が原町_表記ゆれ")]
#[test_case("茨城県", "龍ヶ崎市佐貫町647", "龍ヶ崎市"; "success_龍ヶ崎市")]
#[test_case("茨城県", "龍ケ崎市佐貫町647", "龍ヶ崎市"; "success_龍ケ崎市_表記ゆれ")]
#[test_case("茨城県", "竜ヶ崎市佐貫町647", "龍ヶ崎市"; "success_竜ヶ崎市_表記ゆれ")]
#[test_case("茨城県", "竜ケ崎市佐貫町647", "龍ヶ崎市"; "success_竜ケ崎市_表記ゆれ")]
fn test_read_city(prefecture_name: &str, input: &str, expected: &str) {
let api = Client {};
let prefecture = api.get_prefecture_master(prefecture_name).unwrap();
let (_, city_name) = read_city(input, prefecture).unwrap();
assert_eq!(city_name, expected);
}
}
7 changes: 6 additions & 1 deletion tests/test_data/異字体旧字体への対応.csv
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@ address,prefecture,city,town,rest
神奈川県鎌倉市稲村ガ崎二丁目8,神奈川県,鎌倉市,稲村ガ崎二丁目,8
神奈川県鎌倉市稲村ガ﨑二丁目8,神奈川県,鎌倉市,稲村ガ崎二丁目,8
神奈川県鎌倉市稲村ヶ崎二丁目8,神奈川県,鎌倉市,稲村ガ崎二丁目,8
神奈川県鎌倉市稲村ヶ﨑二丁目8,神奈川県,鎌倉市,稲村ガ崎二丁目,8
神奈川県鎌倉市稲村ヶ﨑二丁目8,神奈川県,鎌倉市,稲村ガ崎二丁目,8
# 「龍ヶ崎市」の表記ゆれへの対応
茨城県龍ケ崎市馴馬町5387,茨城県,龍ヶ崎市,馴馬町,5387
茨城県龍ケ崎市馴馬町5387,茨城県,龍ヶ崎市,馴馬町,5387
茨城県竜ヶ崎市馴馬町5387,茨城県,龍ヶ崎市,馴馬町,5387
茨城県竜ケ崎市馴馬町5387,茨城県,龍ヶ崎市,馴馬町,5387

0 comments on commit ab65bb9

Please sign in to comment.