返回 last30days-skill
test_relevance_core_v3.py
根目录 / tests / test_relevance_core_v3.py
1 import unittest
2
3 from lib import relevance
4
5
6 class RelevanceCoreV3Tests(unittest.TestCase):
7 def test_tokenize_removes_stopwords_and_expands_synonyms(self):
8 tokens = relevance.tokenize("How to use JS for hip hop apps")
9 self.assertIn("js", tokens)
10 self.assertIn("javascript", tokens)
11 self.assertIn("hiphop", tokens)
12 self.assertNotIn("how", tokens)
13
14 def test_token_overlap_relevance_returns_neutral_for_stopword_only_query(self):
15 self.assertEqual(0.5, relevance.token_overlap_relevance("how to", "anything at all"))
16
17 def test_token_overlap_relevance_returns_zero_for_no_overlap(self):
18 self.assertEqual(0.0, relevance.token_overlap_relevance("openclaw", "corsair gaming mouse"))
19
20 def test_token_overlap_relevance_rewards_exact_phrase_matches(self):
21 phrase_score = relevance.token_overlap_relevance(
22 "openclaw nanoclaw",
23 "A detailed openclaw nanoclaw comparison for agents.",
24 )
25 partial_score = relevance.token_overlap_relevance(
26 "openclaw nanoclaw",
27 "A detailed openclaw comparison for agents.",
28 )
29 self.assertGreater(phrase_score, partial_score)
30
31 def test_token_overlap_relevance_caps_generic_only_matches(self):
32 score = relevance.token_overlap_relevance(
33 "anthropic odds",
34 "Latest odds and prediction updates for markets",
35 )
36 self.assertLessEqual(score, 0.24)
37
38 def test_token_overlap_relevance_splits_concatenated_hashtags(self):
39 score = relevance.token_overlap_relevance(
40 "claude code",
41 "Agent workflow discussion",
42 hashtags=["ClaudeCode", "BuildInPublic"],
43 )
44 self.assertGreater(score, 0.0)
45
46 if __name__ == "__main__":
47 unittest.main()
48
48 lines PYTHON