import re

import pytest

import voicemeeterlib
from tests import data, vm


class TestErrors:
    __test__ = True

    def test_it_tests_an_unknown_kind(self):
        with pytest.raises(
            voicemeeterlib.error.VMError,
            match="Unknown Voicemeeter kind 'unknown_kind'",
        ):
            voicemeeterlib.api("unknown_kind")

    def test_it_tests_an_unknown_parameter(self):
        with pytest.raises(
            voicemeeterlib.error.CAPIError,
            match="VBVMR_SetParameterFloat returned -3",
        ) as exc_info:
            vm.set("unknown.parameter", 1)

        e = exc_info.value
        assert e.code == -3
        assert e.fn_name == "VBVMR_SetParameterFloat"

    def test_it_tests_an_unknown_config_name(self):
        EXPECTED_MSG = (
            "No config with name 'unknown' is loaded into memory",
            f"Known configs: {list(vm.configs.keys())}",
        )

        with pytest.raises(
            voicemeeterlib.error.VMError, match=re.escape("\n".join(EXPECTED_MSG))
        ):
            vm.apply_config("unknown")

    def test_it_tests_an_invalid_config_key(self):
        CONFIG = {
            "strip-0": {"A1": True, "B1": True, "gain": -6.0},
            "bus-0": {"mute": True, "eq": {"on": True}},
            "unknown-0": {"state": True},
            "vban-out-1": {"name": "streamname"},
        }
        with pytest.raises(ValueError, match="invalid config key 'unknown-0'"):
            vm.apply(CONFIG)