File size: 1,824 Bytes
24c5a49 | 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 | import pytest
from tiny_computer_agent import Element, FakeScreen, Observation
def test_element_center_is_the_middle_of_the_box():
assert Element("Save", x=320, y=120, width=80, height=24).center == (360, 132)
def test_element_center_falls_back_to_corner_without_size():
assert Element("dot", x=5, y=7).center == (5, 7)
def test_element_rejects_empty_label():
with pytest.raises(ValueError, match="non-empty"):
Element(" ")
def test_element_rejects_negative_geometry():
with pytest.raises(ValueError, match="non-negative"):
Element("Save", x=-5)
def test_fake_screen_advances_then_holds_the_last_frame():
screen = FakeScreen([(Element("A"),), (Element("B"),)])
assert [e.label for f in range(4) for e in screen.capture().elements] == ["A", "B", "B", "B"]
assert screen.captures == 4
def test_find_prefers_exact_match_over_substring():
observation = Observation(elements=(
Element("Save as"), Element("Save"), Element("Save all"),
))
assert observation.find("Save").label == "Save" # exact wins
assert observation.find("save as").label == "Save as" # case-insensitive
assert observation.find("ave a").label == "Save as" # substring fallback
assert observation.find("Quit") is None
def test_summary_lists_elements_and_truncates():
observation = Observation(
index=2,
elements=tuple(Element(f"button {i}") for i in range(5)),
text=" Untitled\n document ",
)
summary = observation.summary(max_elements=3)
assert "step 2" in summary
assert "Untitled document" in summary # whitespace collapsed
assert "button 0" in summary
assert "and 2 more" in summary
def test_summary_admits_when_there_is_no_index():
assert "no element index" in Observation().summary()
|