Spaces:
Sleeping
Sleeping
File size: 3,587 Bytes
f592868 f9a6345 f592868 f9a6345 f592868 f9a6345 f592868 f9a6345 f592868 | 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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | """Unit tests for the robust parser contract."""
import pytest
from utils.parser import parse_llm_action
from utils.schemas import ParsedAction
from utils.constants import PARSER_DEFAULT_U, PARSER_DEFAULT_F, INVALID_ACTION_PENALTY
def test_valid_json():
text = '{"U_target": 0.3, "F_target": 0.7}'
result = parse_llm_action(text)
assert result.u_target == 0.3
assert result.f_target == 0.7
assert result.source == "json"
assert result.invalid_output is False
assert result.penalty_applied == 0.0
assert result.parse_error is None
def test_json_missing_keys():
text = '{"U_target": 0.3}'
result = parse_llm_action(text)
assert result.source == "default"
assert result.invalid_output is True
assert result.penalty_applied == -INVALID_ACTION_PENALTY
assert result.parse_error is not None and "missing required keys" in result.parse_error
assert result.u_target == PARSER_DEFAULT_U
assert result.f_target == PARSER_DEFAULT_F
def test_anchored_extraction():
# Quoted
text1 = 'Here is the action: "U_target":0.3 and later "F_target":0.7.'
result1 = parse_llm_action(text1)
assert result1.source == "fallback"
assert result1.invalid_output is True
assert result1.u_target == 0.3
assert result1.f_target == 0.7
# Unquoted with equals
text2 = 'U_target = 0.2, F_target = 0.8'
result2 = parse_llm_action(text2)
assert result2.source == "fallback"
assert result2.invalid_output is True
assert result2.u_target == 0.2
assert result2.f_target == 0.8
# Unquoted with space and case insensitivity
text3 = 'u_target 0.1 f_target 0.9'
result3 = parse_llm_action(text3)
assert result3.source == "fallback"
assert result3.invalid_output is True
assert result3.u_target == 0.1
assert result3.f_target == 0.9
def test_pair_format():
# Whitespace
text1 = ' 0.3 0.7 '
result1 = parse_llm_action(text1)
assert result1.source == "fallback"
assert result1.invalid_output is False
assert result1.penalty_applied == 0.0
assert result1.u_target == 0.3
assert result1.f_target == 0.7
# Comma separation
text2 = '0.3,0.7'
result2 = parse_llm_action(text2)
assert result2.source == "fallback"
assert result2.invalid_output is False
assert result2.u_target == 0.3
assert result2.f_target == 0.7
# Semicolon
text3 = '0.3; 0.7'
result3 = parse_llm_action(text3)
assert result3.source == "fallback"
assert result3.invalid_output is False
assert result3.u_target == 0.3
assert result3.f_target == 0.7
def test_out_of_range_clamping():
text = '{"U_target": -1.0, "F_target": 2.0}'
result = parse_llm_action(text)
assert result.source == "json"
assert result.u_target == 0.0
assert result.f_target == 1.0
def test_empty_string_fallback():
text = ''
result = parse_llm_action(text, previous_valid_action=None)
assert result.source == "default"
assert result.invalid_output is True
assert result.penalty_applied == -INVALID_ACTION_PENALTY
assert result.u_target == PARSER_DEFAULT_U
assert result.f_target == PARSER_DEFAULT_F
def test_previous_valid_action():
text = 'invalid nonsens'
prev_action = {"U_target": 0.45, "F_target": 0.55}
result = parse_llm_action(text, previous_valid_action=prev_action)
assert result.source == "previous_valid"
assert result.invalid_output is True
assert result.penalty_applied == -INVALID_ACTION_PENALTY
assert result.u_target == 0.45
assert result.f_target == 0.55
|