exercism/rust/anagram/tests/anagram.rs
2025-12-04 15:38:26 +03:00

171 lines
4.7 KiB
Rust

use anagram::*;
use std::collections::HashSet;
#[test]
fn no_matches() {
let word = "diaper";
let inputs = &["hello", "world", "zombies", "pants"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn detects_two_anagrams() {
let word = "solemn";
let inputs = &["lemons", "cherry", "melons"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["lemons", "melons"]);
assert_eq!(output, expected);
}
#[test]
fn does_not_detect_anagram_subsets() {
let word = "good";
let inputs = &["dog", "goody"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn detects_anagram() {
let word = "listen";
let inputs = &["enlists", "google", "inlets", "banana"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["inlets"]);
assert_eq!(output, expected);
}
#[test]
fn detects_three_anagrams() {
let word = "allergy";
let inputs = &[
"gallery",
"ballerina",
"regally",
"clergy",
"largely",
"leading",
];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["gallery", "regally", "largely"]);
assert_eq!(output, expected);
}
#[test]
fn detects_multiple_anagrams_with_different_case() {
let word = "nose";
let inputs = &["Eons", "ONES"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["Eons", "ONES"]);
assert_eq!(output, expected);
}
#[test]
fn does_not_detect_non_anagrams_with_identical_checksum() {
let word = "mass";
let inputs = &["last"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn detects_anagrams_case_insensitively() {
let word = "Orchestra";
let inputs = &["cashregister", "Carthorse", "radishes"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["Carthorse"]);
assert_eq!(output, expected);
}
#[test]
fn detects_anagrams_using_case_insensitive_subject() {
let word = "Orchestra";
let inputs = &["cashregister", "carthorse", "radishes"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["carthorse"]);
assert_eq!(output, expected);
}
#[test]
fn detects_anagrams_using_case_insensitive_possible_matches() {
let word = "orchestra";
let inputs = &["cashregister", "Carthorse", "radishes"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["Carthorse"]);
assert_eq!(output, expected);
}
#[test]
fn does_not_detect_an_anagram_if_the_original_word_is_repeated() {
let word = "go";
let inputs = &["goGoGO"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn anagrams_must_use_all_letters_exactly_once() {
let word = "tapper";
let inputs = &["patter"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn words_are_not_anagrams_of_themselves() {
let word = "BANANA";
let inputs = &["BANANA"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn words_are_not_anagrams_of_themselves_even_if_letter_case_is_partially_different() {
let word = "BANANA";
let inputs = &["Banana"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn words_are_not_anagrams_of_themselves_even_if_letter_case_is_completely_different() {
let word = "BANANA";
let inputs = &["banana"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}
#[test]
fn words_other_than_themselves_can_be_anagrams() {
let word = "LISTEN";
let inputs = &["LISTEN", "Silent"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["Silent"]);
assert_eq!(output, expected);
}
#[test]
fn handles_case_of_greek_letters() {
let word = "ΑΒΓ";
let inputs = &["ΒΓΑ", "ΒΓΔ", "γβα", "αβγ"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter(["ΒΓΑ", "γβα"]);
assert_eq!(output, expected);
}
#[test]
fn different_characters_may_have_the_same_bytes() {
let word = "a⬂";
let inputs = &["€a"];
let output = anagrams_for(word, inputs);
let expected = HashSet::from_iter([]);
assert_eq!(output, expected);
}