| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import sys
- import os
- sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- from unittest.mock import MagicMock
- import pytest
- from ptz_camera import PTZCamera, PTZCommand
- @pytest.fixture
- def fake_sdk():
- return MagicMock()
- def make_camera(fake_sdk, **ptz_overrides):
- cam = PTZCamera(fake_sdk, camera_config={"ip": "1.2.3.4", "port": 37777,
- "username": "u", "password": "p",
- "channel": 0, **ptz_overrides})
- cam.connected = True
- cam.login_handle = 1
- fake_sdk.ptz_control.return_value = True
- return cam
- def capture_goto_call(cam):
- """返回最后一次 EXACTGOTO 调用的 (pan*10, tilt*10, zoom)。"""
- calls = cam.sdk.ptz_control.call_args_list
- for call in reversed(calls):
- args = call[0]
- if args[2] == PTZCommand.EXACTGOTO:
- return args[3], args[4], args[5]
- raise AssertionError("EXACTGOTO not called")
- def test_goto_no_flip(fake_sdk):
- cam = make_camera(fake_sdk, mount_type="wall", pan_flip=False, tilt_flip=False)
- assert cam.goto_exact_position(30.0, 10.0, 2)
- p1, p2, p3 = capture_goto_call(cam)
- assert p1 == 300
- assert p2 == 100
- assert p3 == 2
- def test_goto_tilt_flip(fake_sdk):
- cam = make_camera(fake_sdk, mount_type="wall", pan_flip=False, tilt_flip=True)
- assert cam.goto_exact_position(30.0, 10.0, 2)
- p1, p2, p3 = capture_goto_call(cam)
- assert p1 == 300
- assert p2 == -100
- assert p3 == 2
- def test_goto_ceiling_mount_flips_tilt(fake_sdk):
- cam = make_camera(fake_sdk, mount_type="ceiling", pan_flip=False, tilt_flip=False)
- assert cam.goto_exact_position(30.0, 10.0, 2)
- p1, p2, p3 = capture_goto_call(cam)
- assert p1 == 300
- assert p2 == -100
- assert p3 == 2
- def test_goto_pan_flip(fake_sdk):
- cam = make_camera(fake_sdk, mount_type="wall", pan_flip=True, tilt_flip=False)
- assert cam.goto_exact_position(30.0, 10.0, 2)
- p1, p2, p3 = capture_goto_call(cam)
- assert p1 == 2100 # (30+180)*10
- assert p2 == 100
- assert p3 == 2
- def test_goto_pan_and_tilt_flip(fake_sdk):
- cam = make_camera(fake_sdk, mount_type="wall", pan_flip=True, tilt_flip=True)
- assert cam.goto_exact_position(30.0, 10.0, 2)
- p1, p2, p3 = capture_goto_call(cam)
- assert p1 == 2100
- assert p2 == -100
- assert p3 == 2
- def test_calculate_position_does_not_apply_flips(fake_sdk):
- """calculate_ptz_position 返回视觉坐标,翻转统一在 goto_exact_position 处理。"""
- cam = make_camera(fake_sdk, mount_type="wall", pan_flip=True, tilt_flip=True,
- pan_range=(0, 90), tilt_range=(-45, 45), pan_center=45, tilt_center=0)
- pan, tilt, zoom = cam.calculate_ptz_position(0.5, 0.5, 3)
- assert pan == 45.0
- assert tilt == 0.0
- assert zoom == 3
|