File size: 2,229 Bytes
6e649fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""Baseline tests for the rule-based interpretation layer."""

from skyread.interpret import assess, build_grandma_prompt, interpret_rule_based


def _indices(cape: float, cin: float) -> dict[str, float]:
    return {
        "cape_jkg": cape,
        "cin_jkg": cin,
        "lcl_hpa": 900.0,
        "lfc_hpa": 850.0,
        "el_hpa": 200.0,
        "k_index": 36.0,
        "lifted_index": -6.0,
        "total_totals": 53.0,
        "pwat_mm": 40.0,
    }


def test_assess_extreme_cape_returns_extreme_label() -> None:
    assert assess(_indices(4500.0, -10.0))["label"] == "extreme"


def test_assess_zero_cape_returns_stable_label() -> None:
    assert assess(_indices(0.0, 0.0))["label"] == "stable"


def test_assess_nan_cape_treated_as_stable() -> None:
    assert assess(_indices(float("nan"), 0.0))["label"] == "stable"


def test_assess_stable_cap_note_does_not_claim_easy_initiation() -> None:
    # CAPE 0 + CIN 0 means "no convection at all", not "convection starts easily".
    note = assess(_indices(0.0, 0.0))["cap_note"]
    assert "容易啟動" not in note


def test_interpret_rule_based_marginal_advises_umbrella_not_carefree_sunning() -> None:
    # "可能有雷雨" must not be followed by "棉被可以放心曬".
    cards = interpret_rule_based(_indices(300.0, -200.0), "test")
    assert "傘" in cards["grandma"]
    assert "放心曬" not in cards["grandma"]


def test_interpret_rule_based_unstable_advises_umbrella() -> None:
    cards = interpret_rule_based(_indices(2000.0, -50.0), "test")
    assert "帶傘" in cards["grandma"]


def test_interpret_rule_based_stable_allows_sunbathing_quilt() -> None:
    cards = interpret_rule_based(_indices(0.0, 0.0), "test")
    assert "曬" in cards["grandma"]


def test_build_grandma_prompt_embeds_rule_based_draft() -> None:
    prompt = build_grandma_prompt(_indices(2000.0, -50.0), "test")
    draft = interpret_rule_based(_indices(2000.0, -50.0), "test")
    assert draft["grandma"].removeprefix("【生活版】") in prompt


def test_build_grandma_prompt_requests_rewrite_only() -> None:
    prompt = build_grandma_prompt(_indices(1500.0, -30.0), "test")
    assert "繁體中文" in prompt
    assert "只輸出改寫後的句子" in prompt