import re from discovery import Camera, discover_cameras, select_cameras CARD_RE = re.compile(r"\s*(\d+)\s+\[([A-Za-z0-9_]+)\s*\]:\s*(.*)") def test_padded_c920_card_line_matches(): line = " 2 [C920 ]: USB-Audio - HD Pro Webcam C920" m = CARD_RE.match(line) assert m is not None assert int(m.group(1)) == 2 assert m.group(2) == "C920" def test_naive_word_regex_misses_padding(): line = " 2 [C920 ]: USB-Audio - HD Pro Webcam C920" assert re.match(r"\s*(\d+)\s+\[(\w+)\]:", line) is None def test_live_discover_present_cameras(): cams = discover_cameras() assert len(cams) >= 1 assert all(c.audio_card is not None for c in cams) assert all(c.serial for c in cams) assert all(re.match(r"cam-\d{2}$", c.identity) for c in cams) ids = [c.identity for c in cams] assert ids == sorted(ids) def test_select_cameras_by_identity_not_index(): cams = [ Camera(index=0, identity="cam-01", video_device="/dev/cam01", audio_card=2, serial="A"), Camera(index=1, identity="cam-05", video_device="/dev/cam05", audio_card=6, serial="B"), Camera(index=2, identity="cam-20", video_device="/dev/cam20", audio_card=21, serial="C"), ] out = select_cameras(cams, ["1", "5"]) assert [c.identity for c in out] == ["cam-01", "cam-05"] def test_select_cameras_all(): cams = [ Camera(index=0, identity="cam-01", video_device="/dev/cam01", audio_card=2, serial="A"), ] assert select_cameras(cams, ["all"]) == cams