// Copyright 2017 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// ----------------

/*
This test program is typically run indirectly, by the "wuffs test" or "wuffs
bench" commands. These commands take an optional "-mimic" flag to check that
Wuffs' output mimics (i.e. exactly matches) other libraries' output, such as
giflib for GIF, libpng for PNG, etc.

To manually run this test:

for CC in clang gcc; do
  $CC -std=c99 -Wall -Werror deflate.c && ./a.out
  rm -f a.out
done

Each edition should print "PASS", amongst other information, and exit(0).

Add the "wuffs mimic cflags" (everything after the colon below) to the C
compiler flags (after the .c file) to run the mimic tests.

To manually run the benchmarks, replace "-Wall -Werror" with "-O3" and replace
the first "./a.out" with "./a.out -bench". Combine these changes with the
"wuffs mimic cflags" to run the mimic benchmarks.
*/

// !! wuffs mimic cflags: -DWUFFS_MIMIC -lz

// Wuffs ships as a "single file C library" or "header file library" as per
// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt
//
// To use that single file as a "foo.c"-like implementation, instead of a
// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or
// compiling it.
#define WUFFS_IMPLEMENTATION

// Defining the WUFFS_CONFIG__MODULE* macros are optional, but it lets users of
// release/c/etc.c whitelist which parts of Wuffs to build. That file contains
// the entire Wuffs standard library, implementing a variety of codecs and file
// formats. Without this macro definition, an optimizing compiler or linker may
// very well discard Wuffs code for unused codecs, but listing the Wuffs
// modules we use makes that process explicit. Preprocessing means that such
// code simply isn't compiled.
#define WUFFS_CONFIG__MODULES
#define WUFFS_CONFIG__MODULE__BASE
#define WUFFS_CONFIG__MODULE__DEFLATE

// If building this program in an environment that doesn't easily accommodate
// relative includes, you can use the script/inline-c-relative-includes.go
// program to generate a stand-alone C file.
#include "../../../release/c/wuffs-unsupported-snapshot.c"
#include "../testlib/testlib.c"
#ifdef WUFFS_MIMIC
#include "../mimiclib/deflate-gzip-zlib.c"
#endif

// ---------------- Golden Tests

// The src_offset0 and src_offset1 magic numbers come from:
//
// go run script/extract-flate-offsets.go test/data/*.gz
//
// The empty comments forces clang-format to place one element per line.

golden_test deflate_256_bytes_gt = {
    .want_filename = "test/data/artificial/256.bytes",    //
    .src_filename = "test/data/artificial/256.bytes.gz",  //
    .src_offset0 = 20,                                    //
    .src_offset1 = 281,                                   //
};

golden_test deflate_deflate_backref_crosses_blocks_gt = {
    .want_filename =
        "test/data/artificial/"
        "deflate-backref-crosses-blocks.deflate.decompressed",
    .src_filename =
        "test/data/artificial/"
        "deflate-backref-crosses-blocks.deflate",
};

golden_test deflate_deflate_degenerate_huffman_unused_gt = {
    .want_filename =
        "test/data/artificial/"
        "deflate-degenerate-huffman-unused.deflate.decompressed",
    .src_filename =
        "test/data/artificial/"
        "deflate-degenerate-huffman-unused.deflate",
};

golden_test deflate_deflate_distance_32768_gt = {
    .want_filename =
        "test/data/artificial/"
        "deflate-distance-32768.deflate.decompressed",
    .src_filename =
        "test/data/artificial/"
        "deflate-distance-32768.deflate",
};

golden_test deflate_deflate_distance_code_31_gt = {
    .want_filename =
        "test/data/artificial/"
        "qdeflate-distance-code-31.deflate.decompressed",
    .src_filename =
        "test/data/artificial/"
        "deflate-distance-code-31.deflate",
};

golden_test deflate_deflate_huffman_primlen_9_gt = {
    .want_filename =
        "test/data/artificial/"
        "deflate-huffman-primlen-9.deflate.decompressed",
    .src_filename =
        "test/data/artificial/"
        "deflate-huffman-primlen-9.deflate",
};

golden_test deflate_midsummer_gt = {
    .want_filename = "test/data/midsummer.txt",    //
    .src_filename = "test/data/midsummer.txt.gz",  //
    .src_offset0 = 24,                             //
    .src_offset1 = 5166,                           //
};

golden_test deflate_pi_gt = {
    .want_filename = "test/data/pi.txt",    //
    .src_filename = "test/data/pi.txt.gz",  //
    .src_offset0 = 17,                      //
    .src_offset1 = 48335,                   //
};

golden_test deflate_romeo_gt = {
    .want_filename = "test/data/romeo.txt",    //
    .src_filename = "test/data/romeo.txt.gz",  //
    .src_offset0 = 20,                         //
    .src_offset1 = 550,                        //
};

golden_test deflate_romeo_fixed_gt = {
    .want_filename = "test/data/romeo.txt",                    //
    .src_filename = "test/data/romeo.txt.fixed-huff.deflate",  //
};

// ---------------- Deflate Tests

const char* wuffs_deflate_decode(wuffs_base__io_buffer* dst,
                                 wuffs_base__io_buffer* src,
                                 uint32_t wuffs_initialize_flags,
                                 uint64_t wlimit,
                                 uint64_t rlimit) {
  wuffs_deflate__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_deflate__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags));

  while (true) {
    wuffs_base__io_buffer limited_dst = make_limited_writer(*dst, wlimit);
    wuffs_base__io_buffer limited_src = make_limited_reader(*src, rlimit);

    wuffs_base__status status = wuffs_deflate__decoder__transform_io(
        &dec, &limited_dst, &limited_src, global_work_slice);

    dst->meta.wi += limited_dst.meta.wi;
    src->meta.ri += limited_src.meta.ri;

    if (((wlimit < UINT64_MAX) &&
         (status.repr == wuffs_base__suspension__short_write)) ||
        ((rlimit < UINT64_MAX) &&
         (status.repr == wuffs_base__suspension__short_read))) {
      continue;
    }
    return status.repr;
  }
}

const char* test_wuffs_deflate_decode_256_bytes() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_256_bytes_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_wuffs_deflate_decode_deflate_backref_crosses_blocks() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode,
                            &deflate_deflate_backref_crosses_blocks_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_wuffs_deflate_decode_deflate_degenerate_huffman_unused() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode,
                            &deflate_deflate_degenerate_huffman_unused_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_wuffs_deflate_decode_deflate_distance_32768() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode,
                            &deflate_deflate_distance_32768_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_wuffs_deflate_decode_deflate_distance_code_31() {
  CHECK_FOCUS(__func__);
  const char* got = do_test_io_buffers(wuffs_deflate_decode,
                                       &deflate_deflate_distance_code_31_gt,
                                       UINT64_MAX, UINT64_MAX);
  if (got != wuffs_deflate__error__bad_huffman_code) {
    RETURN_FAIL("got \"%s\", want \"%s\"", got,
                wuffs_deflate__error__bad_huffman_code);
  }
  return NULL;
}

const char* test_wuffs_deflate_decode_deflate_huffman_primlen_9() {
  CHECK_FOCUS(__func__);

  // First, treat this like any other compare-to-golden test.
  CHECK_STRING(do_test_io_buffers(wuffs_deflate_decode,
                                  &deflate_deflate_huffman_primlen_9_gt,
                                  UINT64_MAX, UINT64_MAX));

  // Second, check that the decoder's huffman table sizes match those predicted
  // by the script/print-deflate-huff-table-size.go program.
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
      .data = global_got_slice,
  });

  golden_test* gt = &deflate_deflate_huffman_primlen_9_gt;
  CHECK_STRING(read_file(&src, gt->src_filename));

  wuffs_deflate__decoder dec;
  CHECK_STATUS("initialize", wuffs_deflate__decoder__initialize(
                                 &dec, sizeof dec, WUFFS_VERSION,
                                 WUFFS_INITIALIZE__DEFAULT_OPTIONS));
  CHECK_STATUS("transform_io", wuffs_deflate__decoder__transform_io(
                                   &dec, &got, &src, global_work_slice));

  int i;
  for (i = 0; i < 2; i++) {
    // Find the first unused (i.e. zero) entry in the i'th huffs table.
    int got = WUFFS_DEFLATE__HUFFS_TABLE_SIZE;
    while ((got > 0) && (dec.private_data.f_huffs[i][got - 1] == 0)) {
      got--;
    }

    // See script/print-deflate-huff-table-size.go with primLen = 9 for how
    // these expected values are derived.
    int want = (i == 0) ? 852 : 592;
    if (got != want) {
      RETURN_FAIL("i=%d: got %d, want %d", i, got, want);
    }
  }

  return NULL;
}

const char* test_wuffs_deflate_decode_midsummer() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_midsummer_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_wuffs_deflate_decode_pi_just_one_read() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_pi_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_wuffs_deflate_decode_pi_many_big_reads() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_pi_gt, UINT64_MAX,
                            4096);
}

const char* test_wuffs_deflate_decode_pi_many_medium_reads() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_pi_gt, UINT64_MAX,
                            599);
}

const char* test_wuffs_deflate_decode_pi_many_small_writes_reads() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_pi_gt, 59, 61);
}

const char* test_wuffs_deflate_decode_romeo() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_romeo_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_wuffs_deflate_decode_romeo_fixed() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(wuffs_deflate_decode, &deflate_romeo_fixed_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_wuffs_deflate_decode_split_src() {
  CHECK_FOCUS(__func__);

  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
      .data = global_got_slice,
  });
  wuffs_base__io_buffer want = ((wuffs_base__io_buffer){
      .data = global_want_slice,
  });

  golden_test* gt = &deflate_256_bytes_gt;
  CHECK_STRING(read_file(&src, gt->src_filename));
  CHECK_STRING(read_file(&want, gt->want_filename));

  int i;
  for (i = 1; i < 32; i++) {
    size_t split = gt->src_offset0 + i;
    if (split >= gt->src_offset1) {
      RETURN_FAIL("i=%d: split was not an interior split", i);
    }
    got.meta.wi = 0;

    wuffs_deflate__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_deflate__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

    src.meta.closed = false;
    src.meta.ri = gt->src_offset0;
    src.meta.wi = split;
    wuffs_base__status z0 = wuffs_deflate__decoder__transform_io(
        &dec, &got, &src, global_work_slice);

    src.meta.closed = true;
    src.meta.ri = split;
    src.meta.wi = gt->src_offset1;
    wuffs_base__status z1 = wuffs_deflate__decoder__transform_io(
        &dec, &got, &src, global_work_slice);

    if (z0.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("i=%d: z0: got \"%s\", want \"%s\"", i, z0.repr,
                  wuffs_base__suspension__short_read);
    }

    if (z1.repr) {
      RETURN_FAIL("i=%d: z1: got \"%s\"", i, z1.repr);
    }

    char prefix[64];
    snprintf(prefix, 64, "i=%d: ", i);
    CHECK_STRING(check_io_buffers_equal(prefix, &got, &want));
  }
  return NULL;
}

const char* do_test_wuffs_deflate_history(int i,
                                          golden_test* gt,
                                          wuffs_base__io_buffer* src,
                                          wuffs_base__io_buffer* got,
                                          wuffs_deflate__decoder* dec,
                                          uint32_t starting_history_index,
                                          uint64_t wlimit,
                                          const char* want_z) {
  src->meta.ri = gt->src_offset0;
  src->meta.wi = gt->src_offset1;
  got->meta.ri = 0;
  got->meta.wi = 0;

  wuffs_base__io_buffer limited_got = make_limited_writer(*got, wlimit);

  dec->private_impl.f_history_index = starting_history_index;

  wuffs_base__status got_z = wuffs_deflate__decoder__transform_io(
      dec, &limited_got, src, global_work_slice);
  got->meta.wi += limited_got.meta.wi;
  if (got_z.repr != want_z) {
    RETURN_FAIL("i=%d: starting_history_index=0x%04" PRIX32
                ": decode: got \"%s\", want \"%s\"",
                i, starting_history_index, got_z.repr, want_z);
  }
  return NULL;
}

const char* test_wuffs_deflate_history_full() {
  CHECK_FOCUS(__func__);

  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
      .data = global_got_slice,
  });
  wuffs_base__io_buffer want = ((wuffs_base__io_buffer){
      .data = global_want_slice,
  });

  golden_test* gt = &deflate_pi_gt;
  CHECK_STRING(read_file(&src, gt->src_filename));
  CHECK_STRING(read_file(&want, gt->want_filename));

  const int full_history_size = 0x8000;
  int i;
  for (i = -2; i <= +2; i++) {
    wuffs_deflate__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_deflate__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

    CHECK_STRING(do_test_wuffs_deflate_history(
        i, gt, &src, &got, &dec, 0, want.meta.wi + i,
        i >= 0 ? NULL : wuffs_base__suspension__short_write));

    uint32_t want_history_index = i >= 0 ? 0 : full_history_size;
    if (dec.private_impl.f_history_index != want_history_index) {
      RETURN_FAIL("i=%d: history_index: got %" PRIu32 ", want %" PRIu32, i,
                  dec.private_impl.f_history_index, want_history_index);
    }
    if (i >= 0) {
      continue;
    }

    wuffs_base__io_buffer history_got = ((wuffs_base__io_buffer){
        .data = ((wuffs_base__slice_u8){
            .ptr = dec.private_data.f_history,
            .len = full_history_size,
        }),
    });
    history_got.meta.wi = full_history_size;
    if (want.meta.wi < full_history_size - i) {
      RETURN_FAIL("i=%d: want file is too short", i);
    }
    wuffs_base__io_buffer history_want = ((wuffs_base__io_buffer){
        .data = ((wuffs_base__slice_u8){
            .ptr = global_want_array + want.meta.wi - (full_history_size - i),
            .len = full_history_size,
        }),
    });
    history_want.meta.wi = full_history_size;

    CHECK_STRING(check_io_buffers_equal("", &history_got, &history_want));
  }
  return NULL;
}

const char* test_wuffs_deflate_history_partial() {
  CHECK_FOCUS(__func__);

  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
      .data = global_got_slice,
  });

  golden_test* gt = &deflate_pi_gt;
  CHECK_STRING(read_file(&src, gt->src_filename));

  uint32_t starting_history_indexes[] = {
      0x0000, 0x0001, 0x1234, 0x7FFB, 0x7FFC, 0x7FFD, 0x7FFE, 0x7FFF,
      0x8000, 0x8001, 0x9234, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
  };

  int i;
  for (i = 0; i < WUFFS_TESTLIB_ARRAY_SIZE(starting_history_indexes); i++) {
    uint32_t starting_history_index = starting_history_indexes[i];

    // The flate_pi_gt golden test file decodes to the digits of pi.
    const char* fragment = "3.14";
    const uint32_t fragment_length = 4;

    wuffs_deflate__decoder dec;
    memset(&(dec.private_data.f_history), 0,
           sizeof(dec.private_data.f_history));
    CHECK_STATUS("initialize",
                 wuffs_deflate__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

    CHECK_STRING(do_test_wuffs_deflate_history(
        i, gt, &src, &got, &dec, starting_history_index, fragment_length,
        wuffs_base__suspension__short_write));

    bool got_full = dec.private_impl.f_history_index >= 0x8000;
    uint32_t got_history_index = dec.private_impl.f_history_index & 0x7FFF;
    bool want_full = (starting_history_index + fragment_length) >= 0x8000;
    uint32_t want_history_index =
        (starting_history_index + fragment_length) & 0x7FFF;
    if ((got_full != want_full) || (got_history_index != want_history_index)) {
      RETURN_FAIL("i=%d: starting_history_index=0x%04" PRIX32
                  ": history_index: got %d;%04" PRIX32 ", want %d;%04" PRIX32,
                  i, starting_history_index, (int)(got_full), got_history_index,
                  (int)(want_full), want_history_index);
    }

    int j;
    for (j = -2; j < (int)(fragment_length) + 2; j++) {
      uint32_t index = (starting_history_index + j) & 0x7FFF;
      uint8_t got = dec.private_data.f_history[index];
      uint8_t want = (0 <= j && j < fragment_length) ? fragment[j] : 0;
      if (got != want) {
        RETURN_FAIL("i=%d: starting_history_index=0x%04" PRIX32
                    ": j=%d: got 0x%02" PRIX8 ", want 0x%02" PRIX8,
                    i, starting_history_index, j, got, want);
      }
    }
  }
  return NULL;
}

const char* test_wuffs_deflate_table_redirect() {
  CHECK_FOCUS(__func__);

  // Call init_huff with a Huffman code that looks like:
  //
  //           code_bits  cl   c   r   s          1st  2nd
  //  0b_______________0   1   1   1   0  0b........0
  //  0b______________10   2   1   1   1  0b.......01
  //  0b_____________110   3   1   1   2  0b......011
  //  0b____________1110   4   1   1   3  0b.....0111
  //  0b__________1_1110   5   1   1   4  0b....01111
  //  0b_________11_1110   6   1   1   5  0b...011111
  //  0b________111_1110   7   1   1   6  0b..0111111
  //                       8   0   2
  //  0b_____1_1111_1100   9   1   3   7  0b001111111
  //  0b____11_1111_1010  10   1   5   8  0b101111111  0b..0   (3 bits)
  //                      11   0  10
  //  0b__1111_1110_1100  12  19  19   9  0b101111111  0b001
  //  0b__1111_1110_1101  12      18  10  0b101111111  0b101
  //  0b__1111_1110_1110  12      17  11  0b101111111  0b011
  //  0b__1111_1110_1111  12      16  12  0b101111111  0b111
  //  0b__1111_1111_0000  12      15  13  0b011111111  0b000   (3 bits)
  //  0b__1111_1111_0001  12      14  14  0b011111111  0b100
  //  0b__1111_1111_0010  12      13  15  0b011111111  0b010
  //  0b__1111_1111_0011  12      12  16  0b011111111  0b110
  //  0b__1111_1111_0100  12      11  17  0b011111111  0b001
  //  0b__1111_1111_0101  12      10  18  0b011111111  0b101
  //  0b__1111_1111_0110  12       9  19  0b011111111  0b011
  //  0b__1111_1111_0111  12       8  20  0b011111111  0b111
  //  0b__1111_1111_1000  12       7  21  0b111111111  0b.000  (4 bits)
  //  0b__1111_1111_1001  12       6  22  0b111111111  0b.100
  //  0b__1111_1111_1010  12       5  23  0b111111111  0b.010
  //  0b__1111_1111_1011  12       4  24  0b111111111  0b.110
  //  0b__1111_1111_1100  12       3  25  0b111111111  0b.001
  //  0b__1111_1111_1101  12       2  26  0b111111111  0b.101
  //  0b__1111_1111_1110  12       1  27  0b111111111  0b.011
  //  0b1_1111_1111_1110  13   2   1  28  0b111111111  0b0111
  //  0b1_1111_1111_1111  13       0  29  0b111111111  0b1111
  //
  // cl  is the code_length.
  // c   is counts[code_length]
  // r   is the number of codes (of that code_length) remaining.
  // s   is the symbol
  // 1st is the key in the first level table (9 bits).
  // 2nd is the key in the second level table (variable bits).

  wuffs_deflate__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_deflate__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  memset(&(dec.private_data.f_huffs), 0, sizeof(dec.private_data.f_huffs));

  int i;
  int n = 0;
  dec.private_data.f_code_lengths[n++] = 1;
  dec.private_data.f_code_lengths[n++] = 2;
  dec.private_data.f_code_lengths[n++] = 3;
  dec.private_data.f_code_lengths[n++] = 4;
  dec.private_data.f_code_lengths[n++] = 5;
  dec.private_data.f_code_lengths[n++] = 6;
  dec.private_data.f_code_lengths[n++] = 7;
  dec.private_data.f_code_lengths[n++] = 9;
  dec.private_data.f_code_lengths[n++] = 10;
  for (i = 0; i < 19; i++) {
    dec.private_data.f_code_lengths[n++] = 12;
  }
  dec.private_data.f_code_lengths[n++] = 13;
  dec.private_data.f_code_lengths[n++] = 13;

  CHECK_STATUS("init_huff",
               wuffs_deflate__decoder__init_huff(&dec, 0, 0, n, 257));

  // There is one 1st-level table (9 bits), and three 2nd-level tables (3, 3
  // and 4 bits). f_huffs[0]'s elements should be non-zero for those tables and
  // should be zero outside of those tables.
  const int n_f_huffs = sizeof(dec.private_data.f_huffs[0]) /
                        sizeof(dec.private_data.f_huffs[0][0]);
  for (i = 0; i < n_f_huffs; i++) {
    bool got = dec.private_data.f_huffs[0][i] == 0;
    bool want = i >= (1 << 9) + (1 << 3) + (1 << 3) + (1 << 4);
    if (got != want) {
      RETURN_FAIL("huffs[0][%d] == 0: got %d, want %d", i, got, want);
    }
  }

  // The redirects in the 1st-level table should be at:
  //  - 0b101111111 (0x017F) to the table offset 512 (0x0200), a 3-bit table.
  //  - 0b011111111 (0x00FF) to the table offset 520 (0x0208), a 3-bit table.
  //  - 0b111111111 (0x01FF) to the table offset 528 (0x0210), a 4-bit table.
  uint32_t got;
  uint32_t want;
  got = dec.private_data.f_huffs[0][0x017F];
  want = 0x10020039;
  if (got != want) {
    RETURN_FAIL("huffs[0][0x017F]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
                want);
  }
  got = dec.private_data.f_huffs[0][0x00FF];
  want = 0x10020839;
  if (got != want) {
    RETURN_FAIL("huffs[0][0x00FF]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
                want);
  }
  got = dec.private_data.f_huffs[0][0x01FF];
  want = 0x10021049;
  if (got != want) {
    RETURN_FAIL("huffs[0][0x01FF]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
                want);
  }

  // The first 2nd-level table should look like wants.
  const uint32_t wants[8] = {
      0x80000801, 0x80000903, 0x80000801, 0x80000B03,
      0x80000801, 0x80000A03, 0x80000801, 0x80000C03,
  };
  for (i = 0; i < 8; i++) {
    got = dec.private_data.f_huffs[0][0x0200 + i];
    want = wants[i];
    if (got != want) {
      RETURN_FAIL("huffs[0][0x%04" PRIX32 "]: got 0x%08" PRIX32
                  ", want 0x%08" PRIX32,
                  (uint32_t)(0x0200 + i), got, want);
    }
  }
  return NULL;
}

  // ---------------- Mimic Tests

#ifdef WUFFS_MIMIC

const char* test_mimic_deflate_decode_256_bytes() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_256_bytes_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_mimic_deflate_decode_deflate_backref_crosses_blocks() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode,
                            &deflate_deflate_backref_crosses_blocks_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_mimic_deflate_decode_deflate_degenerate_huffman_unused() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode,
                            &deflate_deflate_degenerate_huffman_unused_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_mimic_deflate_decode_deflate_distance_32768() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode,
                            &deflate_deflate_distance_32768_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_mimic_deflate_decode_deflate_distance_code_31() {
  CHECK_FOCUS(__func__);
  const char* got = do_test_io_buffers(mimic_deflate_decode,
                                       &deflate_deflate_distance_code_31_gt,
                                       UINT64_MAX, UINT64_MAX);
  const char* want = "inflate failed (data error)";
  if ((got != want) && ((got == NULL) || (want == NULL) || strcmp(got, want))) {
    RETURN_FAIL("got \"%s\", want \"%s\"", got, want);
  }
  return NULL;
}

const char* test_mimic_deflate_decode_deflate_huffman_primlen_9() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode,
                            &deflate_deflate_huffman_primlen_9_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_mimic_deflate_decode_midsummer() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_midsummer_gt,
                            UINT64_MAX, UINT64_MAX);
}

const char* test_mimic_deflate_decode_pi_just_one_read() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_pi_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_mimic_deflate_decode_pi_many_big_reads() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_pi_gt, UINT64_MAX,
                            4096);
}

const char* test_mimic_deflate_decode_romeo() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_romeo_gt, UINT64_MAX,
                            UINT64_MAX);
}

const char* test_mimic_deflate_decode_romeo_fixed() {
  CHECK_FOCUS(__func__);
  return do_test_io_buffers(mimic_deflate_decode, &deflate_romeo_fixed_gt,
                            UINT64_MAX, UINT64_MAX);
}

#endif  // WUFFS_MIMIC

// ---------------- Deflate Benches

const char* bench_wuffs_deflate_decode_1k_full_init() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(wuffs_deflate_decode,
                             WUFFS_INITIALIZE__DEFAULT_OPTIONS, tc_dst,
                             &deflate_romeo_gt, UINT64_MAX, UINT64_MAX, 2000);
}

const char* bench_wuffs_deflate_decode_1k_part_init() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(
      wuffs_deflate_decode,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
      &deflate_romeo_gt, UINT64_MAX, UINT64_MAX, 2000);
}

const char* bench_wuffs_deflate_decode_10k_full_init() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(
      wuffs_deflate_decode, WUFFS_INITIALIZE__DEFAULT_OPTIONS, tc_dst,
      &deflate_midsummer_gt, UINT64_MAX, UINT64_MAX, 300);
}

const char* bench_wuffs_deflate_decode_10k_part_init() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(
      wuffs_deflate_decode,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
      &deflate_midsummer_gt, UINT64_MAX, UINT64_MAX, 300);
}

const char* bench_wuffs_deflate_decode_100k_just_one_read() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(
      wuffs_deflate_decode,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
      &deflate_pi_gt, UINT64_MAX, UINT64_MAX, 30);
}

const char* bench_wuffs_deflate_decode_100k_many_big_reads() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(
      wuffs_deflate_decode,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
      &deflate_pi_gt, UINT64_MAX, 4096, 30);
}

  // ---------------- Mimic Benches

#ifdef WUFFS_MIMIC

const char* bench_mimic_deflate_decode_1k() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_romeo_gt,
                             UINT64_MAX, UINT64_MAX, 2000);
}

const char* bench_mimic_deflate_decode_10k() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst,
                             &deflate_midsummer_gt, UINT64_MAX, UINT64_MAX,
                             300);
}

const char* bench_mimic_deflate_decode_100k_just_one_read() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_pi_gt,
                             UINT64_MAX, UINT64_MAX, 30);
}

const char* bench_mimic_deflate_decode_100k_many_big_reads() {
  CHECK_FOCUS(__func__);
  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_pi_gt,
                             UINT64_MAX, 4096, 30);
}

#endif  // WUFFS_MIMIC

// ---------------- Manifest

// The empty comments forces clang-format to place one element per line.
proc tests[] = {

    test_wuffs_deflate_decode_256_bytes,                          //
    test_wuffs_deflate_decode_deflate_backref_crosses_blocks,     //
    test_wuffs_deflate_decode_deflate_degenerate_huffman_unused,  //
    test_wuffs_deflate_decode_deflate_distance_32768,             //
    test_wuffs_deflate_decode_deflate_distance_code_31,           //
    test_wuffs_deflate_decode_deflate_huffman_primlen_9,          //
    test_wuffs_deflate_decode_midsummer,                          //
    test_wuffs_deflate_decode_pi_just_one_read,                   //
    test_wuffs_deflate_decode_pi_many_big_reads,                  //
    test_wuffs_deflate_decode_pi_many_medium_reads,               //
    test_wuffs_deflate_decode_pi_many_small_writes_reads,         //
    test_wuffs_deflate_decode_romeo,                              //
    test_wuffs_deflate_decode_romeo_fixed,                        //
    test_wuffs_deflate_decode_split_src,                          //
    test_wuffs_deflate_history_full,                              //
    test_wuffs_deflate_history_partial,                           //
    test_wuffs_deflate_table_redirect,                            //

#ifdef WUFFS_MIMIC

    test_mimic_deflate_decode_256_bytes,                          //
    test_mimic_deflate_decode_deflate_backref_crosses_blocks,     //
    test_mimic_deflate_decode_deflate_degenerate_huffman_unused,  //
    test_mimic_deflate_decode_deflate_distance_32768,             //
    test_mimic_deflate_decode_deflate_distance_code_31,           //
    test_mimic_deflate_decode_deflate_huffman_primlen_9,          //
    test_mimic_deflate_decode_midsummer,                          //
    test_mimic_deflate_decode_pi_just_one_read,                   //
    test_mimic_deflate_decode_pi_many_big_reads,                  //
    test_mimic_deflate_decode_romeo,                              //
    test_mimic_deflate_decode_romeo_fixed,                        //

#endif  // WUFFS_MIMIC

    NULL,
};

// The empty comments forces clang-format to place one element per line.
proc benches[] = {

    bench_wuffs_deflate_decode_1k_full_init,         //
    bench_wuffs_deflate_decode_1k_part_init,         //
    bench_wuffs_deflate_decode_10k_full_init,        //
    bench_wuffs_deflate_decode_10k_part_init,        //
    bench_wuffs_deflate_decode_100k_just_one_read,   //
    bench_wuffs_deflate_decode_100k_many_big_reads,  //

#ifdef WUFFS_MIMIC

    bench_mimic_deflate_decode_1k,                   //
    bench_mimic_deflate_decode_10k,                  //
    bench_mimic_deflate_decode_100k_just_one_read,   //
    bench_mimic_deflate_decode_100k_many_big_reads,  //

#endif  // WUFFS_MIMIC

    NULL,
};

int main(int argc, char** argv) {
  proc_package_name = "std/deflate";
  return test_main(argc, argv, tests, benches);
}
