Skip to content

Commit 0f1bc8b

Browse files
WyattBlueclaude
andcommitted
Add tests for enumerate_input/output_devices
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f5c43e3 commit 0f1bc8b

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Features:
4040
- Use zero-copy for Packet init from buffer data by :gh-user:`WyattBlue` in (:pr:`2199`).
4141
- Expose AVIndexEntry by :gh-user:`Queuecumber` in (:pr:`2136`).
4242
- Preserving hardware memory during cuvid decoding, exporting/importing via dlpack by :gh-user:`WyattBlue` in (:pr:`2155`).
43-
- Add enumerate_input_devices and enumerate_output_devices API by :gh-user:`WyattBlue` in (:pr:`2155`).
43+
- Add enumerate_input_devices and enumerate_output_devices API by :gh-user:`WyattBlue` in (:pr:`2174`).
4444

4545
Fixes:
4646

tests/test_device.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import sys
2+
3+
import pytest
4+
5+
import av.error
6+
from av.device import DeviceInfo, enumerate_input_devices, enumerate_output_devices
7+
8+
9+
def test_device_info_attributes() -> None:
10+
d = DeviceInfo("0", "FaceTime HD Camera", True, ["video"])
11+
assert d.name == "0"
12+
assert d.description == "FaceTime HD Camera"
13+
assert d.is_default is True
14+
assert d.media_types == ["video"]
15+
16+
17+
def test_device_info_repr_default() -> None:
18+
d = DeviceInfo("0", "FaceTime HD Camera", True, ["video"])
19+
assert repr(d) == "<av.DeviceInfo '0' 'FaceTime HD Camera' (default)>"
20+
21+
22+
def test_device_info_repr_non_default() -> None:
23+
d = DeviceInfo("1", "Built-in Microphone", False, ["audio"])
24+
assert repr(d) == "<av.DeviceInfo '1' 'Built-in Microphone'>"
25+
26+
27+
def test_enumerate_input_devices_unknown_format() -> None:
28+
with pytest.raises(ValueError, match="no such input format"):
29+
enumerate_input_devices("not_a_real_format_xyz")
30+
31+
32+
def test_enumerate_output_devices_unknown_format() -> None:
33+
with pytest.raises(ValueError, match="no such output format"):
34+
enumerate_output_devices("not_a_real_format_xyz")
35+
36+
37+
def _assert_valid_device_list(devices: list[DeviceInfo]) -> None:
38+
assert isinstance(devices, list)
39+
for device in devices:
40+
assert isinstance(device, DeviceInfo)
41+
assert isinstance(device.name, str)
42+
assert isinstance(device.description, str)
43+
assert isinstance(device.is_default, bool)
44+
assert isinstance(device.media_types, list)
45+
assert all(isinstance(mt, str) for mt in device.media_types)
46+
47+
48+
@pytest.mark.skipif(sys.platform != "darwin", reason="avfoundation is macOS only")
49+
def test_enumerate_input_devices_avfoundation() -> None:
50+
_assert_valid_device_list(enumerate_input_devices("avfoundation"))
51+
52+
53+
@pytest.mark.skipif(sys.platform != "linux", reason="v4l2 is Linux only")
54+
def test_enumerate_input_devices_v4l2() -> None:
55+
try:
56+
_assert_valid_device_list(enumerate_input_devices("video4linux2"))
57+
except av.error.OSError:
58+
pytest.skip("v4l2 device enumeration not available")
59+
60+
61+
@pytest.mark.skipif(sys.platform != "win32", reason="dshow is Windows only")
62+
def test_enumerate_input_devices_dshow() -> None:
63+
try:
64+
_assert_valid_device_list(enumerate_input_devices("dshow"))
65+
except av.error.OSError:
66+
pytest.skip("dshow device enumeration not available")

0 commit comments

Comments
 (0)