"""板块列表(0x1231)排序键语义测试(Issue #53)。 背景实测(2026-08-26):响应中 price 与 pre_close 之间的值槽是 "当前排序列的值",板块与领涨股各一份;sort_column=0(涨跌幅)时 值槽恒 0,此前被误标为固定"涨速"且硬编码 0,导致整列恒 0。 """ import struct from unittest.mock import patch import pytest from easy_tdx.mac.client import MacClient from easy_tdx.mac.commands.board_list import _RECORD_SIZE, BoardListCmd from easy_tdx.mac.enums import BoardSortColumn, BoardType from easy_tdx.mac.models import BoardInfo # body: page_size(H), board_type(H), sort_col(B), order(B), start(H), flag(H) # 帧 = 10 字节头 + 2 字节 msg_id + body → sort_col 位于 body[4] = 帧偏移 16。 _SORT_COL_POS = 10 + 2 + 4 class TestBoardListRequest: def test_sort_column_packed_into_request(self): """sort_column 应写入请求第 3 个 body 字节(帧内偏移 15)。""" req_default = BoardListCmd(BoardType.ALL, 0, 10).build_request() assert req_default[_SORT_COL_POS] == int(BoardSortColumn.CHANGE_PCT) req_speed = BoardListCmd(BoardType.ALL, 0, 10, BoardSortColumn.SPEED).build_request() assert req_speed[_SORT_COL_POS] == int(BoardSortColumn.SPEED) == 1 req_ytd = BoardListCmd(BoardType.ALL, 0, 10, BoardSortColumn.YTD).build_request() assert req_ytd[_SORT_COL_POS] == int(BoardSortColumn.YTD) == 5 # 只差 sort_col 一个字节,其余请求布局不变 assert len(req_default) == len(req_speed) == len(req_ytd) def test_sort_column_enum_values(self): """实测锚定的排序列映射。""" assert [c.value for c in BoardSortColumn] == [0, 1, 2, 3, 4, 5, 6, 7] def _build_body(board_mid: float, symbol_mid: float) -> bytes: """构造一条"板块 + 领涨股"记录的响应 body。""" board_half = struct.pack( "