from __future__ import annotations from multi_swarm.metrics.diversity import population_prompt_diversity def test_empty_or_single_prompt_zero_diversity() -> None: assert population_prompt_diversity([]) == 0.0 assert population_prompt_diversity(["solo prompt"]) == 0.0 def test_identical_prompts_zero_diversity() -> None: prompts = ["Strategia RSI < 30 long"] * 5 assert population_prompt_diversity(prompts) == 0.0 def test_completely_different_prompts_high_diversity() -> None: prompts = [ "AAAAAA AAAA AAAAA", "BBBBBB BBBB BBBBB", "CCCCCC CCCC CCCCC", "DDDDDD DDDD DDDDD", ] d = population_prompt_diversity(prompts) # SequenceMatcher considera spazi e lunghezza simili → similarity > 0 # anche su stringhe completamente "diverse". Soglia realistica: 0.8. assert d > 0.8 def test_partial_overlap_intermediate_diversity() -> None: prompts = [ "Strategia momentum 1h con RSI", "Strategia momentum 1h con SMA", "Strategia momentum 4h con RSI", ] d = population_prompt_diversity(prompts) assert 0.05 < d < 0.5 def test_diversity_symmetric() -> None: prompts_a = ["x", "yy", "zzz"] prompts_b = ["zzz", "x", "yy"] assert ( abs(population_prompt_diversity(prompts_a) - population_prompt_diversity(prompts_b)) < 1e-9 )