mirror of
https://github.com/esphome/esphome.git
synced 2026-09-24 05:24:14 +00:00
93 lines
3.6 KiB
Python
93 lines
3.6 KiB
Python
"""Tests for RP2040 component public helpers and variant detection."""
|
|
|
|
import pytest
|
|
|
|
from esphome.components.rp2040 import _detect_variant, board_id_has_wifi
|
|
from esphome.components.rp2040.const import VARIANT_RP2040, VARIANT_RP2350
|
|
import esphome.config_validation as cv
|
|
from esphome.const import CONF_BOARD, CONF_VARIANT
|
|
|
|
|
|
def test_board_id_has_wifi_for_known_wifi_board() -> None:
|
|
"""``rpipicow`` is the canonical Pico W → True."""
|
|
assert board_id_has_wifi("rpipicow") is True
|
|
|
|
|
|
def test_board_id_has_wifi_for_known_non_wifi_board() -> None:
|
|
"""Plain ``rpipico`` has no CYW43 → False."""
|
|
assert board_id_has_wifi("rpipico") is False
|
|
|
|
|
|
def test_board_id_has_wifi_for_rp2350_w_variant() -> None:
|
|
"""``rpipico2w`` is the RP2350 Pico 2 W → True."""
|
|
assert board_id_has_wifi("rpipico2w") is True
|
|
|
|
|
|
def test_board_id_has_wifi_for_unknown_board_returns_true() -> None:
|
|
"""Unknown ids fail open so a custom board is not rejected.
|
|
|
|
The validator falls back to ESPHome's compile-time check; the
|
|
helper returning True here means the wizard emits a ``wifi:``
|
|
block and any genuinely-unsupported config trips the existing
|
|
"no CYW43" guard at compile time.
|
|
"""
|
|
assert board_id_has_wifi("not-a-real-board-id") is True
|
|
|
|
|
|
def test_detect_variant_derives_variant_from_board() -> None:
|
|
"""Board alone resolves to the matching variant."""
|
|
result = _detect_variant({CONF_BOARD: "rpipicow"})
|
|
assert result[CONF_BOARD] == "rpipicow"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2040
|
|
|
|
|
|
def test_detect_variant_derives_variant_from_rp2350_board() -> None:
|
|
"""An RP2350 board resolves to ``RP2350``."""
|
|
result = _detect_variant({CONF_BOARD: "rpipico2"})
|
|
assert result[CONF_BOARD] == "rpipico2"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2350
|
|
|
|
|
|
def test_detect_variant_only_picks_default_board_rp2040() -> None:
|
|
"""Variant alone picks Pico W as the canonical RP2040 board."""
|
|
result = _detect_variant({CONF_VARIANT: VARIANT_RP2040})
|
|
assert result[CONF_BOARD] == "rpipicow"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2040
|
|
|
|
|
|
def test_detect_variant_only_picks_default_board_rp2350() -> None:
|
|
"""Variant alone picks Pico 2 W as the canonical RP2350 board."""
|
|
result = _detect_variant({CONF_VARIANT: VARIANT_RP2350})
|
|
assert result[CONF_BOARD] == "rpipico2w"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2350
|
|
|
|
|
|
def test_detect_variant_matching_explicit_variant_passes() -> None:
|
|
"""Specifying both a board and the matching variant is allowed."""
|
|
result = _detect_variant({CONF_BOARD: "rpipico2", CONF_VARIANT: VARIANT_RP2350})
|
|
assert result[CONF_BOARD] == "rpipico2"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2350
|
|
|
|
|
|
def test_detect_variant_mismatched_variant_raises() -> None:
|
|
"""Board/variant mismatch must be rejected and name the offending board."""
|
|
with pytest.raises(
|
|
cv.Invalid, match=r"does not match the selected board 'rpipicow'"
|
|
):
|
|
_detect_variant({CONF_BOARD: "rpipicow", CONF_VARIANT: VARIANT_RP2350})
|
|
|
|
|
|
def test_detect_variant_unknown_board_without_variant_raises() -> None:
|
|
"""Unknown board with no variant tells the user how to recover."""
|
|
with pytest.raises(cv.Invalid, match="please specify the chip variant"):
|
|
_detect_variant({CONF_BOARD: "not-a-real-board"})
|
|
|
|
|
|
def test_detect_variant_unknown_board_with_variant_passes() -> None:
|
|
"""Unknown board + explicit variant is accepted (with a warning)."""
|
|
result = _detect_variant(
|
|
{CONF_BOARD: "not-a-real-board", CONF_VARIANT: VARIANT_RP2040}
|
|
)
|
|
assert result[CONF_BOARD] == "not-a-real-board"
|
|
assert result[CONF_VARIANT] == VARIANT_RP2040
|