use fancy_regex::Regex; #[cfg(test)] mod split_tests { use super::*; fn split_to_vec<'a>(re_str: &'a str, target: &'a str) -> Vec<&'a str> { let re = Regex::new(re_str).unwrap(); re.split(target).map(|x| x.unwrap()).collect() } #[test] fn split_left() { let result: Vec<&str> = split_to_vec("1", "123"); assert_eq!(result, vec!["", "23"]); } #[test] fn split_center() { let result: Vec<&str> = split_to_vec("2", "123"); assert_eq!(result, vec!["1", "3"]); } #[test] fn split_right() { let result: Vec<&str> = split_to_vec("3", "123"); assert_eq!(result, vec!["12", ""]); } #[test] fn split_no_matches() { let result: Vec<&str> = split_to_vec("4", "123"); assert_eq!(result, vec!["123"]); } #[test] fn split_empty() { let result: Vec<&str> = split_to_vec("1", ""); assert_eq!(result, vec![""]); } #[test] fn split_by_empty() { let result: Vec<&str> = split_to_vec("", "123"); assert_eq!(result, vec!["", "1", "2", "3", ""]); } #[test] fn split_by_own() { let result: Vec<&str> = split_to_vec("123", "123"); assert_eq!(result, vec!["", ""]); } #[test] fn split_consecutive_matches() { let result: Vec<&str> = split_to_vec("1", "111"); assert_eq!(result, vec!["", "", "", ""]); } #[test] fn split_by_substring() { let result: Vec<&str> = split_to_vec("123", "123456"); assert_eq!(result, vec!["", "456"]); let result: Vec<&str> = split_to_vec("234|678", "123456789"); assert_eq!(result, vec!["1", "5", "9"]); } #[test] fn split_multiple_different_characters() { let result: Vec<&str> = split_to_vec("[1-3]", "123456"); assert_eq!(result, vec!["", "", "", "456"]); } #[test] fn split_mixed_characters() { let result: Vec<&str> = split_to_vec("[236]", "123456"); assert_eq!(result, vec!["1", "", "45", ""]); } #[test] fn split_with_backreferences() { let result: Vec<&str> = split_to_vec(r"(1|2)\1", "12112122"); assert_eq!(result, vec!["12", "21", ""]); } #[test] fn split_with_look_around() { let result: Vec<&str> = split_to_vec(r"(?<=1)2", "12112122"); assert_eq!(result, vec!["1", "11", "1", "2"]); let result: Vec<&str> = split_to_vec(r"1(?=2)", "12112122"); assert_eq!(result, vec!["", "21", "2", "22"]); let result: Vec<&str> = split_to_vec(r"(?<=2)1(?=2)", "12112122"); assert_eq!(result, vec!["12112", "22"]); } } #[cfg(test)] mod splitn_tests { use super::*; fn splitn_to_vec<'a>(re_str: &'a str, target: &'a str, limit: usize) -> Vec<&'a str> { let re = Regex::new(re_str).unwrap(); re.splitn(target, limit).map(|x| x.unwrap()).collect() } #[test] fn splitn_limit_lt_num_mathes() { let splitn_test_cases = [ ("1", "123", vec!["", "23"]), ("2", "123", vec!["1", "3"]), ("3", "123", vec!["12", ""]), ("", "123", vec!["", "1", "2", "3", ""]), ("1", "", vec![""]), ]; for (re_str, target, expected) in splitn_test_cases { let result: Vec<&str> = splitn_to_vec(re_str, target, 6); assert_eq!(result, expected); } } #[test] fn splitn_limit_eq_num_mathes() { let splitn_test_cases = [ ("1", "123", vec!["", "23"]), ("2", "123", vec!["1", "3"]), ("3", "123", vec!["12", ""]), ("", "123", vec!["", "1", "2", "3", ""]), ("1", "", vec![""]), ]; for (re_str, target, expected) in splitn_test_cases { let result: Vec<&str> = splitn_to_vec(re_str, target, expected.len()); assert_eq!(result, expected); } } #[test] fn splitn_limit_st_num_mathes() { let splitn_test_cases = [ ("1", "123", vec!["123"]), ("2", "123", vec!["123"]), ("3", "123", vec!["123"]), ("", "123", vec!["123"]), ]; for (re_str, target, expected) in splitn_test_cases { let result: Vec<&str> = splitn_to_vec(re_str, target, 1); assert_eq!(result, expected); } } #[test] fn splitn_limit_zero() { let vec_empty: Vec<&str> = Vec::new(); let splitn_test_cases = [ ("1", "123", &vec_empty), ("2", "123", &vec_empty), ("3", "123", &vec_empty), ("", "123", &vec_empty), ("1", "", &vec_empty), ]; for (re_str, target, expected) in splitn_test_cases { let result: Vec<&str> = splitn_to_vec(re_str, target, 0); assert_eq!(&result, expected); } } }