Add a std/lzw test for a 0 literal width
diff --git a/test/c/std/lzw.c b/test/c/std/lzw.c
index 1a4c6f9..a6a1ca8 100644
--- a/test/c/std/lzw.c
+++ b/test/c/std/lzw.c
@@ -295,31 +295,9 @@
return NULL;
}
-const char* test_wuffs_lzw_decode_width_1() {
- CHECK_FOCUS(__func__);
-
- wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
- .data = global_got_slice,
- });
- wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
- .data = global_src_slice,
- });
-
- got.data.ptr[0] = 0xFF;
- got.data.ptr[1] = 0xFF;
- got.data.ptr[2] = 0xFF;
- got.data.ptr[3] = 0xFF;
-
- // Set src to be:
- // 0b...._...._...._..10 0x010 Clear code.
- // 0b...._...._...._00.. 0x000 Literal "0".
- // 0b...._...._.001_.... 0x001 Literal "1".
- // 0b...._..10_0..._.... 0x100 Back-ref "01".
- // 0b...0_11.._...._.... 0x011 End code.
- src.meta.wi = 2;
- src.data.ptr[0] = 0x12;
- src.data.ptr[1] = 0x0E;
-
+const char* do_test_wuffs_lzw_decode_width(uint32_t width,
+ wuffs_base__io_buffer src,
+ wuffs_base__io_buffer want) {
wuffs_lzw__decoder dec;
const char* status = wuffs_lzw__decoder__initialize(
&dec, sizeof dec, WUFFS_VERSION,
@@ -327,8 +305,11 @@
if (status) {
RETURN_FAIL("initialize: \"%s\"", status);
}
- wuffs_lzw__decoder__set_literal_width(&dec, 1);
+ wuffs_lzw__decoder__set_literal_width(&dec, width);
+ wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
+ .data = global_got_slice,
+ });
status = wuffs_lzw__decoder__decode_io_writer(
&dec, wuffs_base__io_buffer__writer(&got),
wuffs_base__io_buffer__reader(&src), global_work_slice);
@@ -336,16 +317,70 @@
RETURN_FAIL("decode: \"%s\"", status);
}
- if (got.meta.wi != 4) {
- RETURN_FAIL("got.meta.wi: got %d, want 4", (int)(got.meta.wi));
- }
- uint8_t* g = got.data.ptr;
- if ((g[0] != 0x00) || (g[1] != 0x01) || (g[2] != 0x00) || (g[3] != 0x01)) {
- RETURN_FAIL(
- "got {0x%02x, 0x%02x, 0x%02x, 0x%02x}, want {0x00, 0x01, 0x00, 0x01}",
- (int)(g[0]), (int)(g[1]), (int)(g[2]), (int)(g[3]));
- }
- return NULL;
+ return check_io_buffers_equal("", &got, &want);
+}
+
+// A zero literal width isn't very practical: the output bytes can only be 0x00
+// and it isn't possible to encode the empty string, as the End code requires
+// two bits but the first non-Clear code after a Clear code has only one bit,
+// so it must be the literal 0x00. Nonetheless, the giflib C library accepts a
+// zero literal width (it only rejects literal widths above 8), so we do too.
+const char* test_wuffs_lzw_decode_width_0() {
+ CHECK_FOCUS(__func__);
+
+ // 0b...._...._...._...1 0x001 Clear code.
+ // 0b...._...._...._..0. 0x000 Literal "0".
+ // 0b...._...._...._11.. 0x011 Back-ref "00"
+ // 0b...._...._.100_.... 0x100 Back-ref "000".
+ // 0b...._..00_0..._.... 0x000 Literal "0".
+ // 0b...0_10.._...._.... 0x010 End code.
+ wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
+ .data = global_src_slice,
+ });
+ src.meta.wi = 2;
+ src.data.ptr[0] = 0x4D;
+ src.data.ptr[1] = 0x08;
+
+ wuffs_base__io_buffer want = ((wuffs_base__io_buffer){
+ .data = global_want_slice,
+ });
+ want.meta.wi = 7;
+ want.data.ptr[0] = 0x00;
+ want.data.ptr[1] = 0x00;
+ want.data.ptr[2] = 0x00;
+ want.data.ptr[3] = 0x00;
+ want.data.ptr[4] = 0x00;
+ want.data.ptr[5] = 0x00;
+ want.data.ptr[6] = 0x00;
+
+ return do_test_wuffs_lzw_decode_width(0, src, want);
+}
+
+const char* test_wuffs_lzw_decode_width_1() {
+ CHECK_FOCUS(__func__);
+
+ // 0b...._...._...._..10 0x010 Clear code.
+ // 0b...._...._...._00.. 0x000 Literal "0".
+ // 0b...._...._.001_.... 0x001 Literal "1".
+ // 0b...._..10_0..._.... 0x100 Back-ref "01".
+ // 0b...0_11.._...._.... 0x011 End code.
+ wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
+ .data = global_src_slice,
+ });
+ src.meta.wi = 2;
+ src.data.ptr[0] = 0x12;
+ src.data.ptr[1] = 0x0E;
+
+ wuffs_base__io_buffer want = ((wuffs_base__io_buffer){
+ .data = global_want_slice,
+ });
+ want.meta.wi = 4;
+ want.data.ptr[0] = 0x00;
+ want.data.ptr[1] = 0x01;
+ want.data.ptr[2] = 0x00;
+ want.data.ptr[3] = 0x01;
+
+ return do_test_wuffs_lzw_decode_width(1, src, want);
}
// ---------------- LZW Benches
@@ -421,6 +456,7 @@
test_wuffs_lzw_decode_output_bad, //
test_wuffs_lzw_decode_output_empty, //
test_wuffs_lzw_decode_pi, //
+ test_wuffs_lzw_decode_width_0, //
test_wuffs_lzw_decode_width_1, //
NULL,