"""Tests for hardware_mock.joint_model.JointModel."""

import pytest

from hardware_mock.joint_model import JointModel


def test_initial_positions_default_zero_when_missing():
    jm = JointModel(["1", "2", "3"], initial={"2": 1.5})
    assert jm.joint_ids == ["1", "2", "3"]
    assert jm.positions() == [0.0, 1.5, 0.0]


def test_set_by_index_partial_update_preserves_order():
    jm = JointModel(["a", "b", "c", "d"])
    jm.set_by_index([1, 3], [0.7, -0.2])
    assert jm.positions() == [0.0, 0.7, 0.0, -0.2]


def test_set_by_index_length_mismatch_raises():
    jm = JointModel(["a", "b"])
    with pytest.raises(ValueError):
        jm.set_by_index([0], [1.0, 2.0])


def test_set_by_index_out_of_range_raises():
    jm = JointModel(["a", "b"])
    with pytest.raises(IndexError):
        jm.set_by_index([5], [1.0])


def test_duplicate_joint_ids_rejected():
    with pytest.raises(ValueError):
        JointModel(["a", "a"])


def test_empty_joint_ids_rejected():
    with pytest.raises(ValueError):
        JointModel([])