# Run this test script on the command line: # pytest test_vocabulary.py # # Last modified by Mr Lan Hui on 2025-05-08 from difficulty import ( user_difficulty_level, text_difficulty_level, get_difficulty_level_for_user, load_record ) # 词库加载(只加载一次) d_word_test = load_record("../../../updated_source_code/English Pal/app/oxford_words.txt") d_difficulty_default = get_difficulty_level_for_user({}, d_word_test) print(d_difficulty_default) # ----------------------------- 文章难度测试 ----------------------------- def test_article_level_empty_content(): level = text_difficulty_level('', d_difficulty_default) assert level == 0 def test_article_level_punctuation_only(): level = text_difficulty_level(',', d_difficulty_default) assert level == 0 def test_article_level_digit_only(): level = text_difficulty_level('1', d_difficulty_default) assert level == 0 def test_article_level_single_word(): level = text_difficulty_level('source', d_difficulty_default) assert 2 <= level <= 4 def test_article_level_subset_vs_superset(): level1 = text_difficulty_level('source', d_difficulty_default) level2 = text_difficulty_level('open source', d_difficulty_default) print(f"Word: 'source', Difficulty: {d_difficulty_default.get('source', 'Unknown')}") assert level1 <= level2 def test_article_level_multiple_words(): content = 'Producing Open Source Software - How to Run a Successful Free Software Project' level = text_difficulty_level(content, d_difficulty_default) assert 3 <= level <= 5 def test_article_level_short_paragraph(): content = ("At parties, people no longer give me a blank stare when I tell them I work in open source software. " "‘Oh, yes — like Linux?’ they say. I nod eagerly in agreement. ‘Yes, exactly! That’s what I do.’ " "It’s nice not to be completely fringe anymore...") level = text_difficulty_level(content, d_difficulty_default) assert 4 <= level <= 6 def test_article_level_medium_paragraph(): content = ("In considering the Origin of Species it is quite conceivable that a naturalist reflecting on the mutual affinities of organic being ") # truncated for brevity level = text_difficulty_level(content, d_difficulty_default) for word in content.split(): print(f"Word: {word} , Difficulty: {d_difficulty_default.get(word.lower(), 'Unknown')}") assert 5 <= level <= 7 def test_article_level_long_paragraph(): content = ("These several facts accord well with my theory. I believe in no fixed law of development, causing all the " "inhabitants of a country to change abruptly...") # truncated for brevity level = text_difficulty_level(content, d_difficulty_default) assert 4 <= level <= 8 # ----------------------------- 用户词汇难度测试 ----------------------------- def test_user_level_empty_dictionary(): d_user = {} d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert level == 0 def test_user_level_one_simple_word(): d_user = {'simple': ['202408050930']} d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert 0 < level <= 4 def test_user_level_invalid_word(): d_user = {'xyz': ['202408050930']} d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert level == 0 def test_user_level_one_hard_word(): d_user = {'pasture': ['202408050930']} d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert 5 <= level <= 8 def test_user_level_multiple_words(): d_user = { 'sessile': ['202408050930'], 'putrid': ['202408050930'], 'prodigal': ['202408050930'], 'presumptuous': ['202408050930'], 'prehension': ['202408050930'], 'pied': ['202408050930'], 'pedunculated': ['202408050930'], 'pasture': ['202408050930'], 'parturition': ['202408050930'], 'ovigerous': ['202408050930'], 'orifice': ['202408050930'], 'aberration': ['202408050930'], 'obliterate': ['202408050930'], 'niggard': ['202408050930'], 'neuter': ['202408050930'], 'locomotion': ['202408050930'], 'lineal': ['202408050930'], 'glottis': ['202408050930'], 'frivolous': ['202408050930'], 'frena': ['202408050930'], 'flotation': ['202408050930'], 'ductus': ['202408050930'], 'dorsal': ['202408050930'], 'dearth': ['202408050930'], 'crustacean': ['202408050930'], 'cornea': ['202408050930'], 'contrivance': ['202408050930'], 'collateral': ['202408050930'], 'cirriped': ['202408050930'], 'canon': ['202408050930'], 'branchiae': ['202408050930'], 'auditory': ['202408050930'], 'articulata': ['202408050930'], 'alimentary': ['202408050930'], 'adduce': ['202408050930'], } d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert 6 <= level <= 8 def test_user_level_consider_only_most_recent_words_difficult_words_most_recent(): d_user = { 'pasture': ['202408050930'], 'putrid': ['202408040000'], 'frivolous': ['202408030000'], 'simple': ['202408020000'], 'apple': ['202408010000'] } d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert 5 <= level <= 8 def test_user_level_consider_only_most_recent_words_easy_words_most_recent(): d_user = { 'simple': ['202408050930'], 'apple': ['202408040000'], 'happy': ['202408030000'], 'pasture': ['202408020000'], 'putrid': ['202408010000'], 'dearth': ['202407310000'] } d_diff = get_difficulty_level_for_user(d_user, d_word_test) level = user_difficulty_level(d_user, d_diff) assert 3 <= level <= 5