Skip to content

Commit 5ac79f5

Browse files
test: add RowsResponse round-trip tests for 16/17/33 columns
Row type headers are nibble-packed and padded to word boundaries. At 17 columns the header crosses from 1 word to 2 words (9 nibble bytes, padded to 16). These tests exercise the padding boundary at 16 (exact word), 17 (first crossing), and 33 (second crossing). Closes #115 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent ab67947 commit 5ac79f5

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

tests/test_messages_responses.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,64 @@ def test_empty_column_types_with_rows_ok(self) -> None:
621621
assert decoded.rows == [[42]]
622622

623623

624+
class TestRowsResponseWordBoundary:
625+
"""115: row header padding crosses word boundary at 17+ columns."""
626+
627+
def test_16_columns_exact_word(self) -> None:
628+
"""16 columns = 8 nibble bytes = exactly 1 word, no padding."""
629+
n = 16
630+
types = [ValueType.INTEGER] * n
631+
names = [f"c{i}" for i in range(n)]
632+
values = list(range(n))
633+
resp = RowsResponse(
634+
column_names=names,
635+
column_types=types,
636+
row_types=[types],
637+
rows=[values],
638+
)
639+
encoded = resp.encode_body()
640+
decoded = RowsResponse.decode_body(encoded)
641+
assert decoded.column_names == names
642+
assert decoded.rows == [values]
643+
assert decoded.row_types[0] == types
644+
645+
def test_17_columns_crosses_word_boundary(self) -> None:
646+
"""17 columns = 9 nibble bytes, padded to 16 = 2 words."""
647+
n = 17
648+
types = [ValueType.INTEGER] * n
649+
names = [f"c{i}" for i in range(n)]
650+
values = list(range(n))
651+
resp = RowsResponse(
652+
column_names=names,
653+
column_types=types,
654+
row_types=[types],
655+
rows=[values],
656+
)
657+
encoded = resp.encode_body()
658+
decoded = RowsResponse.decode_body(encoded)
659+
assert decoded.column_names == names
660+
assert decoded.rows == [values]
661+
assert decoded.row_types[0] == types
662+
663+
def test_33_columns_third_word_boundary(self) -> None:
664+
"""33 columns = 17 nibble bytes, padded to 24 = 3 words."""
665+
n = 33
666+
types = [ValueType.INTEGER] * n
667+
names = [f"c{i}" for i in range(n)]
668+
values = list(range(n))
669+
resp = RowsResponse(
670+
column_names=names,
671+
column_types=types,
672+
row_types=[types],
673+
rows=[values],
674+
)
675+
encoded = resp.encode_body()
676+
decoded = RowsResponse.decode_body(encoded)
677+
assert decoded.column_names == names
678+
assert decoded.rows == [values]
679+
assert decoded.row_types[0] == types
680+
681+
624682
class TestRowsResponseValueTypes:
625683
"""Full RowsResponse round-trips with BOOLEAN, UNIXTIME, ISO8601, and BLOB."""
626684

0 commit comments

Comments
 (0)