114 lines
3.5 KiB
Rust
114 lines
3.5 KiB
Rust
use anagram_generator::{
|
|
analyzer::PronounceabilityAnalyzer, generator::AnagramGenerator, generator::GenerationConfig,
|
|
scorer::PronounceabilityScorer,
|
|
};
|
|
use rand::thread_rng;
|
|
|
|
#[test]
|
|
fn test_end_to_end_anagram_generation() {
|
|
let rng = thread_rng();
|
|
let scorer = PronounceabilityAnalyzer::with_defaults();
|
|
let mut generator = AnagramGenerator::new(rng, scorer);
|
|
|
|
let config = GenerationConfig::new(50, 1000);
|
|
let anagrams = generator.generate("example", 5, &config);
|
|
|
|
assert!(!anagrams.is_empty());
|
|
assert!(anagrams.len() <= 5);
|
|
|
|
for anagram in &anagrams {
|
|
assert!(anagram.score().value() >= 50);
|
|
assert_eq!(anagram.text().len(), "example".len());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_high_quality_anagrams_only() {
|
|
let rng = thread_rng();
|
|
let scorer = PronounceabilityAnalyzer::with_defaults();
|
|
let mut generator = AnagramGenerator::new(rng, scorer);
|
|
|
|
let config = GenerationConfig::new(80, 5000);
|
|
let anagrams = generator.generate("lawrence", 10, &config);
|
|
|
|
for anagram in &anagrams {
|
|
assert!(anagram.score().value() >= 80);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_generation_with_difficult_word() {
|
|
let rng = thread_rng();
|
|
let scorer = PronounceabilityAnalyzer::with_defaults();
|
|
let mut generator = AnagramGenerator::new(rng, scorer);
|
|
|
|
// A word with few vowels is harder to generate pronounceable anagrams from
|
|
let config = GenerationConfig::new(30, 5000);
|
|
let anagrams = generator.generate("rhythm", 3, &config);
|
|
|
|
// Should still be able to generate some anagrams
|
|
assert!(!anagrams.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_customizable_scoring_via_trait() {
|
|
// Test that we can use the trait abstraction
|
|
struct SimpleScorer;
|
|
|
|
impl PronounceabilityScorer for SimpleScorer {
|
|
fn score(&self, text: &str) -> anagram_generator::PronouncabilityScore {
|
|
// Simple scorer: just count vowels
|
|
let vowel_count = text
|
|
.chars()
|
|
.filter(|c| matches!(c, 'a' | 'e' | 'i' | 'o' | 'u'))
|
|
.count();
|
|
anagram_generator::PronouncabilityScore::new((vowel_count * 20) as u32)
|
|
}
|
|
}
|
|
|
|
let rng = thread_rng();
|
|
let scorer = SimpleScorer;
|
|
let mut generator = AnagramGenerator::new(rng, scorer);
|
|
|
|
let config = GenerationConfig::new(0, 100);
|
|
let anagrams = generator.generate("aeiou", 5, &config);
|
|
|
|
assert!(!anagrams.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_analyzer_with_custom_configuration() {
|
|
use anagram_generator::scorer::{
|
|
CharacterClassifier, ConsonantClusterRules, PatternAnalysisConfig, ScoringPenalties,
|
|
};
|
|
|
|
let classifier = CharacterClassifier::default_french();
|
|
let cluster_rules = ConsonantClusterRules::default_french();
|
|
let penalties = ScoringPenalties::default();
|
|
let config = PatternAnalysisConfig::default();
|
|
|
|
let analyzer = PronounceabilityAnalyzer::new(classifier, cluster_rules, penalties, config);
|
|
|
|
let score = analyzer.score("hello");
|
|
assert!(score.value() > 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_generation_config_builder_pattern() {
|
|
let config = GenerationConfig::default()
|
|
.with_min_score(70)
|
|
.with_max_attempts(3000);
|
|
|
|
assert_eq!(config.min_score.value(), 70);
|
|
assert_eq!(config.max_attempts_per_anagram, 3000);
|
|
|
|
let rng = thread_rng();
|
|
let scorer = PronounceabilityAnalyzer::with_defaults();
|
|
let mut generator = AnagramGenerator::new(rng, scorer);
|
|
|
|
let anagrams = generator.generate("test", 5, &config);
|
|
for anagram in &anagrams {
|
|
assert!(anagram.score().value() >= 70);
|
|
}
|
|
}
|