// 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* test_wuffs_deflate_decode_interface() {
  CHECK_FOCUS(__func__);
  wuffs_deflate__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_deflate__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  return do_test__wuffs_base__io_transformer(
      wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer(&dec),
      "test/data/romeo.txt.deflate", 0, SIZE_MAX, 942, 0x0A);
}

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_interface,                          //
    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);
}
