From c689e2ad8273b22e1ce8ae4ec58013d3e43010dc Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Fri, 5 Nov 2021 22:58:26 +0000 Subject: [rust] Anagram --- rust/anagram/tests/anagram.rs | 173 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 rust/anagram/tests/anagram.rs (limited to 'rust/anagram/tests/anagram.rs') diff --git a/rust/anagram/tests/anagram.rs b/rust/anagram/tests/anagram.rs new file mode 100644 index 0000000..40fc03e --- /dev/null +++ b/rust/anagram/tests/anagram.rs @@ -0,0 +1,173 @@ +use std::collections::HashSet; + +fn process_anagram_case(word: &str, inputs: &[&str], expected: &[&str]) { + let result = anagram::anagrams_for(word, inputs); + + let expected: HashSet<&str> = expected.iter().cloned().collect(); + + assert_eq!(result, expected); +} + +#[test] +fn test_no_matches() { + let word = "diaper"; + + let inputs = ["hello", "world", "zombies", "pants"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_detect_simple_anagram() { + let word = "ant"; + + let inputs = ["tan", "stand", "at"]; + + let outputs = vec!["tan"]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_does_not_confuse_different_duplicates() { + let word = "galea"; + + let inputs = ["eagle"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_eliminate_anagram_subsets() { + let word = "good"; + + let inputs = ["dog", "goody"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_detect_anagram() { + let word = "listen"; + + let inputs = ["enlists", "google", "inlets", "banana"]; + + let outputs = vec!["inlets"]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_multiple_anagrams() { + let word = "allergy"; + + let inputs = [ + "gallery", + "ballerina", + "regally", + "clergy", + "largely", + "leading", + ]; + + let outputs = vec!["gallery", "regally", "largely"]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_case_insensitive_anagrams() { + let word = "Orchestra"; + + let inputs = ["cashregister", "Carthorse", "radishes"]; + + let outputs = vec!["Carthorse"]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_unicode_anagrams() { + let word = "ΑΒΓ"; + + // These words don't make sense, they're just greek letters cobbled together. + let inputs = ["ΒΓΑ", "ΒΓΔ", "γβα"]; + + let outputs = vec!["ΒΓΑ", "γβα"]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_misleading_unicode_anagrams() { + // Despite what a human might think these words contain different letters, the input uses Greek + // A and B while the list of potential anagrams uses Latin A and B. + let word = "ΑΒΓ"; + + let inputs = ["ABΓ"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_does_not_detect_a_word_as_its_own_anagram() { + let word = "banana"; + + let inputs = ["banana"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_does_not_detect_a_differently_cased_word_as_its_own_anagram() { + let word = "banana"; + + let inputs = ["bAnana"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_does_not_detect_a_differently_cased_unicode_word_as_its_own_anagram() { + let word = "ΑΒΓ"; + + let inputs = ["ΑΒγ"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_same_bytes_different_chars() { + let word = "a⬂"; // 61 E2 AC 82 + + let inputs = ["€a"]; // E2 82 AC 61 + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} + +#[test] +fn test_different_words_but_same_ascii_sum() { + let word = "bc"; + + let inputs = ["ad"]; + + let outputs = vec![]; + + process_anagram_case(word, &inputs, &outputs); +} -- cgit v1.2.3