// 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 gif.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 -lgif

// 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__GIF
#define WUFFS_CONFIG__MODULE__LZW

// 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/gif.c"
#endif

// ---------------- Basic Tests

const char* test_basic_bad_receiver() {
  CHECK_FOCUS(__func__);
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  wuffs_base__status status =
      wuffs_gif__decoder__decode_image_config(NULL, &ic, NULL);
  if (status.repr != wuffs_base__error__bad_receiver) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__error__bad_receiver);
  }
  return NULL;
}

const char* test_basic_bad_sizeof_receiver() {
  CHECK_FOCUS(__func__);
  wuffs_gif__decoder dec;
  wuffs_base__status status = wuffs_gif__decoder__initialize(
      &dec, 0, WUFFS_VERSION,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
  if (status.repr != wuffs_base__error__bad_sizeof_receiver) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__error__bad_sizeof_receiver);
  }
  return NULL;
}

const char* test_basic_bad_wuffs_version() {
  CHECK_FOCUS(__func__);
  wuffs_gif__decoder dec;
  wuffs_base__status status = wuffs_gif__decoder__initialize(
      &dec, sizeof dec, WUFFS_VERSION ^ 0x123456789ABC,
      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
  if (status.repr != wuffs_base__error__bad_wuffs_version) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__error__bad_wuffs_version);
  }
  return NULL;
}

const char* test_basic_initialize_not_called() {
  CHECK_FOCUS(__func__);
  wuffs_gif__decoder dec = ((wuffs_gif__decoder){});
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  wuffs_base__status status =
      wuffs_gif__decoder__decode_image_config(&dec, &ic, NULL);
  if (status.repr != wuffs_base__error__initialize_not_called) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__error__initialize_not_called);
  }
  return NULL;
}

const char* test_basic_status_is_error() {
  CHECK_FOCUS(__func__);
  wuffs_base__status status;
  status.repr = NULL;
  if (wuffs_base__status__is_error(&status)) {
    RETURN_FAIL("is_error(NULL) returned true");
  }
  status.repr = wuffs_base__error__bad_wuffs_version;
  if (!wuffs_base__status__is_error(&status)) {
    RETURN_FAIL("is_error(BAD_WUFFS_VERSION) returned false");
  }
  status.repr = wuffs_base__suspension__short_write;
  if (wuffs_base__status__is_error(&status)) {
    RETURN_FAIL("is_error(SHORT_WRITE) returned true");
  }
  status.repr = wuffs_gif__error__bad_header;
  if (!wuffs_base__status__is_error(&status)) {
    RETURN_FAIL("is_error(BAD_HEADER) returned false");
  }
  return NULL;
}

const char* test_basic_status_strings() {
  CHECK_FOCUS(__func__);
  const char* s1 = wuffs_base__error__bad_wuffs_version;
  const char* t1 = "#base: bad wuffs version";
  if (strcmp(s1, t1)) {
    RETURN_FAIL("got \"%s\", want \"%s\"", s1, t1);
  }
  const char* s2 = wuffs_base__suspension__short_write;
  const char* t2 = "$base: short write";
  if (strcmp(s2, t2)) {
    RETURN_FAIL("got \"%s\", want \"%s\"", s2, t2);
  }
  const char* s3 = wuffs_gif__error__bad_header;
  const char* t3 = "#gif: bad header";
  if (strcmp(s3, t3)) {
    RETURN_FAIL("got \"%s\", want \"%s\"", s3, t3);
  }
  return NULL;
}

const char* test_basic_status_used_package() {
  CHECK_FOCUS(__func__);
  // The function call here is from "std/gif" but the argument is from
  // "std/lzw". The former package depends on the latter.
  const char* s0 = wuffs_lzw__error__bad_code;
  const char* t0 = "#lzw: bad code";
  if (strcmp(s0, t0)) {
    RETURN_FAIL("got \"%s\", want \"%s\"", s0, t0);
  }
  return NULL;
}

const char* test_basic_sub_struct_initializer() {
  CHECK_FOCUS(__func__);
  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  if (dec.private_impl.magic != WUFFS_BASE__MAGIC) {
    RETURN_FAIL("outer magic: got %" PRIu32 ", want %" PRIu32 "",
                dec.private_impl.magic, WUFFS_BASE__MAGIC);
  }
  if (dec.private_data.f_lzw.private_impl.magic != WUFFS_BASE__MAGIC) {
    RETURN_FAIL("inner magic: got %" PRIu32 ", want %" PRIu32,
                dec.private_data.f_lzw.private_impl.magic, WUFFS_BASE__MAGIC);
  }
  return NULL;
}

// ---------------- GIF Tests

const char* wuffs_gif_decode(wuffs_base__io_buffer* dst,
                             uint32_t wuffs_initialize_flags,
                             wuffs_base__pixel_format pixfmt,
                             wuffs_base__io_buffer* src) {
  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION,
                                              wuffs_initialize_flags));

  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, src));

  wuffs_base__pixel_config__set(
      &ic.pixcfg, pixfmt,
      wuffs_base__make_pixel_subsampling(WUFFS_BASE__PIXEL_SUBSAMPLING__NONE),
      wuffs_base__pixel_config__width(&ic.pixcfg),
      wuffs_base__pixel_config__height(&ic.pixcfg));

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));

  while (true) {
    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, &fc, src);
    if (status.repr == wuffs_base__note__end_of_data) {
      break;
    }
    CHECK_STATUS("decode_frame_config", status);

    CHECK_STATUS("decode_frame", wuffs_gif__decoder__decode_frame(
                                     &dec, &pb, src, global_work_slice, NULL));

    CHECK_STRING(copy_to_io_buffer_from_pixel_buffer(
        dst, &pb, wuffs_base__frame_config__bounds(&fc)));
  }
  return NULL;
}

const char* do_test_wuffs_gif_decode(const char* filename,
                                     const char* palette_filename,
                                     const char* indexes_filename,
                                     uint64_t rlimit,
                                     wuffs_base__pixel_format dst_pixfmt) {
  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,
  });
  CHECK_STRING(read_file(&src, filename));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});

  {
    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    CHECK_STATUS("decode_image_config",
                 wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));
    if (wuffs_base__pixel_config__pixel_format(&ic.pixcfg).repr !=
        WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY) {
      RETURN_FAIL("pixel_format: got 0x%08" PRIX32 ", want 0x%08" PRIX32,
                  wuffs_base__pixel_config__pixel_format(&ic.pixcfg).repr,
                  WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY);
    }

    // bricks-dither.gif is a 160 × 120, opaque, still (not animated) GIF.
    if (wuffs_base__pixel_config__width(&ic.pixcfg) != 160) {
      RETURN_FAIL("width: got %" PRIu32 ", want 160",
                  wuffs_base__pixel_config__width(&ic.pixcfg));
    }
    if (wuffs_base__pixel_config__height(&ic.pixcfg) != 120) {
      RETURN_FAIL("height: got %" PRIu32 ", want 120",
                  wuffs_base__pixel_config__height(&ic.pixcfg));
    }
    if (!wuffs_base__image_config__first_frame_is_opaque(&ic)) {
      RETURN_FAIL("first_frame_is_opaque: got false, want true");
    }

    wuffs_base__pixel_config__set(
        &ic.pixcfg, dst_pixfmt,
        wuffs_base__make_pixel_subsampling(WUFFS_BASE__PIXEL_SUBSAMPLING__NONE),
        160, 120);

    CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                       &pb, &ic.pixcfg, global_pixel_slice));

    uint32_t got = wuffs_gif__decoder__num_animation_loops(&dec);
    if (got != 1) {
      RETURN_FAIL("num_animation_loops: got %" PRIu32 ", want 1", got);
    }
  }

  if (wuffs_gif__decoder__workbuf_len(&dec).min_incl != 1) {
    RETURN_FAIL("workbuf_len: got %" PRIu64 ", want 1",
                wuffs_gif__decoder__workbuf_len(&dec).min_incl);
  }

  int num_iters = 0;
  while (true) {
    num_iters++;
    wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
    size_t old_ri = src.meta.ri;

    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, &fc, &limited_src);
    src.meta.ri += limited_src.meta.ri;

    if (wuffs_base__status__is_ok(&status)) {
      break;
    }
    if (status.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__suspension__short_read);
    }

    if (src.meta.ri < old_ri) {
      RETURN_FAIL("read index src.meta.ri went backwards");
    }
    if (src.meta.ri == old_ri) {
      RETURN_FAIL("no progress was made");
    }
  }

  while (true) {
    num_iters++;
    wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
    size_t old_ri = src.meta.ri;

    wuffs_base__status status = wuffs_gif__decoder__decode_frame(
        &dec, &pb, &limited_src, global_work_slice, NULL);
    src.meta.ri += limited_src.meta.ri;

    if (wuffs_base__status__is_ok(&status)) {
      break;
    }
    if (status.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__suspension__short_read);
    }

    if (src.meta.ri < old_ri) {
      RETURN_FAIL("read index src.meta.ri went backwards");
    }
    if (src.meta.ri == old_ri) {
      RETURN_FAIL("no progress was made");
    }
  }

  CHECK_STRING(copy_to_io_buffer_from_pixel_buffer(
      &got, &pb, wuffs_base__frame_config__bounds(&fc)));

  if (rlimit < UINT64_MAX) {
    if (num_iters <= 2) {
      RETURN_FAIL("num_iters: got %d, want > 2", num_iters);
    }
  } else {
    if (num_iters != 2) {
      RETURN_FAIL("num_iters: got %d, want 2", num_iters);
    }
  }

  uint8_t pal_want_array[1024];
  wuffs_base__io_buffer pal_want = ((wuffs_base__io_buffer){
      .data = ((wuffs_base__slice_u8){
          .ptr = pal_want_array,
          .len = 1024,
      }),
  });
  CHECK_STRING(read_file(&pal_want, palette_filename));
  if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY) {
    wuffs_base__io_buffer pal_got = ((wuffs_base__io_buffer){
        .data = wuffs_base__pixel_buffer__palette(&pb),
    });
    pal_got.meta.wi = pal_got.data.len;
    CHECK_STRING(check_io_buffers_equal("palette ", &pal_got, &pal_want));
  }

  wuffs_base__io_buffer ind_want = ((wuffs_base__io_buffer){
      .data = global_want_slice,
  });
  CHECK_STRING(read_file(&ind_want, indexes_filename));
  if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY) {
    CHECK_STRING(check_io_buffers_equal("indexes ", &got, &ind_want));
  } else {
    wuffs_base__io_buffer expanded_want = ((wuffs_base__io_buffer){
        .data = global_work_slice,
    });
    if (ind_want.meta.wi > (expanded_want.data.len / 4)) {
      RETURN_FAIL("indexes are too long to expand into the work buffer");
    }

    if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__BGR) {
      size_t i;
      for (i = 0; i < ind_want.meta.wi; i++) {
        uint8_t index = ind_want.data.ptr[i];
        expanded_want.data.ptr[3 * i + 0] = pal_want_array[4 * index + 0];
        expanded_want.data.ptr[3 * i + 1] = pal_want_array[4 * index + 1];
        expanded_want.data.ptr[3 * i + 2] = pal_want_array[4 * index + 2];
      }
      expanded_want.meta.wi = 3 * ind_want.meta.wi;
    } else if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL) {
      size_t i;
      for (i = 0; i < ind_want.meta.wi; i++) {
        uint8_t index = ind_want.data.ptr[i];
        expanded_want.data.ptr[4 * i + 0] = pal_want_array[4 * index + 0];
        expanded_want.data.ptr[4 * i + 1] = pal_want_array[4 * index + 1];
        expanded_want.data.ptr[4 * i + 2] = pal_want_array[4 * index + 2];
        expanded_want.data.ptr[4 * i + 3] = pal_want_array[4 * index + 3];
      }
      expanded_want.meta.wi = 4 * ind_want.meta.wi;
    } else if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__RGB) {
      size_t i;
      for (i = 0; i < ind_want.meta.wi; i++) {
        uint8_t index = ind_want.data.ptr[i];
        expanded_want.data.ptr[3 * i + 0] = pal_want_array[4 * index + 2];
        expanded_want.data.ptr[3 * i + 1] = pal_want_array[4 * index + 1];
        expanded_want.data.ptr[3 * i + 2] = pal_want_array[4 * index + 0];
      }
      expanded_want.meta.wi = 3 * ind_want.meta.wi;
    } else if (dst_pixfmt.repr == WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL) {
      size_t i;
      for (i = 0; i < ind_want.meta.wi; i++) {
        uint8_t index = ind_want.data.ptr[i];
        expanded_want.data.ptr[4 * i + 0] = pal_want_array[4 * index + 2];
        expanded_want.data.ptr[4 * i + 1] = pal_want_array[4 * index + 1];
        expanded_want.data.ptr[4 * i + 2] = pal_want_array[4 * index + 0];
        expanded_want.data.ptr[4 * i + 3] = pal_want_array[4 * index + 3];
      }
      expanded_want.meta.wi = 4 * ind_want.meta.wi;
    } else {
      return "unsupported pixel format";
    }

    CHECK_STRING(check_io_buffers_equal("pixels ", &got, &expanded_want));
  }

  {
    if (src.meta.ri == src.meta.wi) {
      RETURN_FAIL("decode_frame returned \"ok\" but src was exhausted");
    }
    wuffs_base__status status = wuffs_gif__decoder__decode_frame(
        &dec, &pb, &src, global_work_slice, NULL);
    if (status.repr != wuffs_base__note__end_of_data) {
      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__note__end_of_data);
    }
    if (src.meta.ri != src.meta.wi) {
      RETURN_FAIL(
          "decode_frame returned \"end of data\" but src was not exhausted");
    }
  }

  return NULL;
}

const char* do_test_wuffs_gif_decode_expecting(wuffs_base__io_buffer src,
                                               uint32_t quirk,
                                               const char* want_status,
                                               bool want_dirty_rect_is_empty) {
  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  if (quirk) {
    wuffs_gif__decoder__set_quirk_enabled(&dec, quirk, true);
  }

  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));

  wuffs_base__status status = wuffs_gif__decoder__decode_frame(
      &dec, &pb, &src, global_work_slice, NULL);
  if (status.repr != want_status) {
    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                want_status);
  }

  wuffs_base__rect_ie_u32 r = wuffs_gif__decoder__frame_dirty_rect(&dec);
  bool dirty_rect_is_empty = wuffs_base__rect_ie_u32__is_empty(&r);
  if (dirty_rect_is_empty != want_dirty_rect_is_empty) {
    RETURN_FAIL("dirty_rect.is_empty: got %s, want %s",
                dirty_rect_is_empty ? "true" : "false",
                want_dirty_rect_is_empty ? "true" : "false");
  }
  return NULL;
}

const char* test_wuffs_gif_call_interleaved() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/bricks-dither.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  {
    wuffs_base__io_buffer limited_src = make_limited_reader(src, 700);
    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, NULL, &limited_src);
    src.meta.ri += limited_src.meta.ri;
    if (status.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__suspension__short_read);
    }
  }

  // Calling another coroutine (decode_image_config) while suspended inside an
  // active coroutine (decode_frame_config) should be an error:
  // wuffs_base__error__interleaved_coroutine_calls.

  {
    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
    if (status.repr != wuffs_base__error__interleaved_coroutine_calls) {
      RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__error__interleaved_coroutine_calls);
    }
  }

  return NULL;
}

const char* test_wuffs_gif_call_sequence() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/bricks-dither.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, NULL, &src));

  wuffs_base__status status =
      wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
  if (status.repr != wuffs_base__error__bad_call_sequence) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__error__bad_call_sequence);
  }
  return NULL;
}

const char* do_test_wuffs_gif_decode_animated(
    const char* filename,
    uint32_t want_num_loops,
    uint32_t want_num_frames,
    wuffs_base__rect_ie_u32* want_frame_config_bounds) {
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, filename));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  wuffs_base__image_config ic = ((wuffs_base__image_config){});

  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));

  uint32_t got_num_loops = wuffs_gif__decoder__num_animation_loops(&dec);
  if (got_num_loops != want_num_loops) {
    RETURN_FAIL("num_loops: got %" PRIu32 ", want %" PRIu32, got_num_loops,
                want_num_loops);
  }

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));

  uint32_t i;
  for (i = 0; i < want_num_frames; i++) {
    wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("decode_frame_config #%" PRIu32 ": \"%s\"", i, status.repr);
    }

    if (want_frame_config_bounds) {
      wuffs_base__rect_ie_u32 got = wuffs_base__frame_config__bounds(&fc);
      wuffs_base__rect_ie_u32 want = want_frame_config_bounds[i];
      if (!wuffs_base__rect_ie_u32__equals(&got, want)) {
        RETURN_FAIL("decode_frame_config #%" PRIu32 ": bounds: got (%" PRIu32
                    ", %" PRIu32 ")-(%" PRIu32 ", %" PRIu32 "), want (%" PRIu32
                    ", %" PRIu32 ")-(%" PRIu32 ", %" PRIu32 ")",
                    i, got.min_incl_x, got.min_incl_y, got.max_excl_x,
                    got.max_excl_y, want.min_incl_x, want.min_incl_y,
                    want.max_excl_x, want.max_excl_y);
      }
    }

    status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                              global_work_slice, NULL);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("decode_frame #%" PRIu32 ": \"%s\"", i, status.repr);
    }

    wuffs_base__rect_ie_u32 frame_rect = wuffs_base__frame_config__bounds(&fc);
    wuffs_base__rect_ie_u32 dirty_rect =
        wuffs_gif__decoder__frame_dirty_rect(&dec);
    if (!wuffs_base__rect_ie_u32__contains_rect(&frame_rect, dirty_rect)) {
      RETURN_FAIL("internal error: frame_rect does not contain dirty_rect");
    }
  }

  // There should be no more frames, no matter how many times we call
  // decode_frame.
  for (i = 0; i < 3; i++) {
    wuffs_base__status status = wuffs_gif__decoder__decode_frame(
        &dec, &pb, &src, global_work_slice, NULL);
    if (status.repr != wuffs_base__note__end_of_data) {
      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__note__end_of_data);
    }
  }

  uint64_t got_num_frames = wuffs_gif__decoder__num_decoded_frames(&dec);
  if (got_num_frames != want_num_frames) {
    RETURN_FAIL("frame_count: got %" PRIu64 ", want %" PRIu32, got_num_frames,
                want_num_frames);
  }

  return NULL;
}

const char* test_wuffs_gif_decode_animated_big() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode_animated("test/data/gifplayer-muybridge.gif",
                                           0, 380, NULL);
}

const char* test_wuffs_gif_decode_animated_medium() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode_animated("test/data/muybridge.gif", 0, 15,
                                           NULL);
}

const char* test_wuffs_gif_decode_animated_small() {
  CHECK_FOCUS(__func__);
  // animated-red-blue.gif's num_loops should be 3. The value explicitly in the
  // wire format is 0x0002, but that value means "repeat 2 times after the
  // first play", so the total number of loops is 3.
  const uint32_t want_num_loops = 3;
  wuffs_base__rect_ie_u32 want_frame_config_bounds[4] = {
      make_rect_ie_u32(0, 0, 64, 48),
      make_rect_ie_u32(15, 31, 52, 40),
      make_rect_ie_u32(15, 0, 64, 40),
      make_rect_ie_u32(15, 0, 64, 40),
  };
  return do_test_wuffs_gif_decode_animated(
      "test/data/animated-red-blue.gif", want_num_loops,
      WUFFS_TESTLIB_ARRAY_SIZE(want_frame_config_bounds),
      want_frame_config_bounds);
}

const char* test_wuffs_gif_decode_delay_num_frames_decoded() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/animated-red-blue.gif"));
  if (src.meta.wi < 1) {
    return "src file is too short";
  }

  // A GIF image should end with the 0x3B Trailer byte.
  if (src.data.ptr[src.meta.wi - 1] != 0x3B) {
    RETURN_FAIL("final byte: got 0x%02X, want 0x%02X",
                src.data.ptr[src.meta.wi - 1], 0x3B);
  }
  // Replace that final byte with something invalid: neither 0x21 (Extension
  // Introducer), 0x2C (Image Separator) or 0x3B (Trailer).
  src.data.ptr[src.meta.wi - 1] = 0x99;

  int q;
  for (q = 0; q < 2; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
    wuffs_gif__decoder__set_quirk_enabled(
        &dec, WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES, q);

    while (true) {
      wuffs_base__status status =
          wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
      if (!wuffs_base__status__is_ok(&status)) {
        break;
      }
    }

    uint64_t got = wuffs_gif__decoder__num_decoded_frames(&dec);
    uint64_t want = q ? 3 : 4;
    if (got != want) {
      RETURN_FAIL("q=%d: num_decoded_frames: got %" PRIu64 ", want %" PRIu64, q,
                  got, want);
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_empty_palette() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/artificial/gif-empty-palette.gif"));
  int q;
  for (q = 0; q < 2; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
    wuffs_gif__decoder__set_quirk_enabled(
        &dec, WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE, q);

    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status.repr);
    }

    wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
    status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                      global_pixel_slice);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status.repr);
    }

    int i;
    for (i = 0; i < 2; i++) {
      status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                                global_work_slice, NULL);
      if ((q == 1) && (i == 1)) {
        if (status.repr != wuffs_gif__error__bad_palette) {
          RETURN_FAIL("q=%d: i=%d: decode_frame: got \"%s\", want \"%s\"", q, i,
                      status.repr, wuffs_gif__error__bad_palette);
        }
        break;
      }
      if (!wuffs_base__status__is_ok(&status)) {
        RETURN_FAIL("q=%d: i=%d: decode_frame: \"%s\"", q, i, status.repr);
      }

      wuffs_base__slice_u8 pal = wuffs_base__pixel_buffer__palette(&pb);
      if (pal.len < 4) {
        RETURN_FAIL("q=%d: i=%d: palette length: got %d, want >= 4", q, i,
                    (int)(pal.len));
      }
      uint8_t* p = pal.ptr;
      int blue = i ? 0x00 : 0xFF;
      if ((p[0] != blue) || (p[1] != 0x00) || (p[2] != 0x00) ||
          (p[3] != 0xFF)) {
        RETURN_FAIL(
            "q=%d: i=%d: palette[0] BGRA: got (0x%02X, 0x%02X, 0x%02X, "
            "0x%02X), want (0x%02X, 0x00, 0x00, 0xFF)",
            q, i, (int)(p[0]), (int)(p[1]), (int)(p[2]), (int)(p[3]), blue);
      }
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_background_color() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-background-color.gif"));
  int q;
  for (q = 0; q < 2; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
    wuffs_gif__decoder__set_quirk_enabled(
        &dec, WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR, q);

    wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: decode_frame_config: \"%s\"", q, status.repr);
    }

    wuffs_base__color_u32_argb_premul got =
        wuffs_base__frame_config__background_color(&fc);
    wuffs_base__color_u32_argb_premul want = q ? 0xFF80C3C3 : 0x00000000;

    if (got != want) {
      RETURN_FAIL("q=%d: got 0x%08" PRIX32 ", want 0x%08" PRIX32, q, got, want);
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_first_frame_is_opaque() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-frame-out-of-bounds.gif"));
  int q;
  for (q = 0; q < 2; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
    wuffs_gif__decoder__set_quirk_enabled(
        &dec, WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR, q);

    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status.repr);
    }

    bool got = wuffs_base__image_config__first_frame_is_opaque(&ic);
    bool want = q;

    if (got != want) {
      RETURN_FAIL("q=%d: got %s, want %s", q, got ? "true" : "false",
                  want ? "true" : "false");
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_frame_out_of_bounds() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-frame-out-of-bounds.gif"));
  int q;
  for (q = 0; q < 2; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
    wuffs_gif__decoder__set_quirk_enabled(
        &dec, WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT, q);

    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status.repr);
    }

    // The nominal width and height for the overall image is 2×2, but its first
    // frame extends those bounds to 4×2. See
    // test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt for
    // more discussion.

    const uint32_t width = q ? 2 : 4;
    const uint32_t height = 2;

    if (wuffs_base__pixel_config__width(&ic.pixcfg) != width) {
      RETURN_FAIL("q=%d: width: got %" PRIu32 ", want %" PRIu32, q,
                  wuffs_base__pixel_config__width(&ic.pixcfg), width);
    }
    if (wuffs_base__pixel_config__height(&ic.pixcfg) != height) {
      RETURN_FAIL("q=%d: height: got %" PRIu32 ", want %" PRIu32, q,
                  wuffs_base__pixel_config__height(&ic.pixcfg), height);
    }

    wuffs_base__pixel_config five_by_five = ((wuffs_base__pixel_config){});
    wuffs_base__pixel_config__set(
        &five_by_five, wuffs_base__pixel_config__pixel_format(&ic.pixcfg),
        wuffs_base__pixel_config__pixel_subsampling(&ic.pixcfg), 5, 5);
    wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
    status = wuffs_base__pixel_buffer__set_from_slice(&pb, &five_by_five,
                                                      global_pixel_slice);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status.repr);
    }

    // See test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt
    // for the want_frame_config_bounds and want_pixel_indexes source.

    wuffs_base__rect_ie_u32 want_frame_config_bounds[4] = {
        q ? make_rect_ie_u32(1, 0, 2, 1) : make_rect_ie_u32(1, 0, 4, 1),
        q ? make_rect_ie_u32(0, 1, 2, 2) : make_rect_ie_u32(0, 1, 2, 2),
        q ? make_rect_ie_u32(0, 2, 1, 2) : make_rect_ie_u32(0, 2, 1, 2),
        q ? make_rect_ie_u32(2, 0, 2, 2) : make_rect_ie_u32(2, 0, 4, 2),
    };

    const char* want_pixel_indexes[4] = {
        q ? ".1.." : ".123....",
        q ? "..89" : "....89..",
        q ? "...." : "........",
        q ? "...." : "..45..89",
    };

    uint32_t i;
    for (i = 0; true; i++) {
      wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
      {
        status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
        if (i == WUFFS_TESTLIB_ARRAY_SIZE(want_frame_config_bounds)) {
          if (status.repr != wuffs_base__note__end_of_data) {
            RETURN_FAIL("q=%d: decode_frame_config #%" PRIu32
                        ": got \"%s\", want \"%s\"",
                        q, i, status.repr, wuffs_base__note__end_of_data);
          }
          break;
        }
        if (!wuffs_base__status__is_ok(&status)) {
          RETURN_FAIL("q=%d: decode_frame_config #%" PRIu32 ": \"%s\"", q, i,
                      status.repr);
        }

        wuffs_base__rect_ie_u32 got = wuffs_base__frame_config__bounds(&fc);
        wuffs_base__rect_ie_u32 want = want_frame_config_bounds[i];
        if (!wuffs_base__rect_ie_u32__equals(&got, want)) {
          RETURN_FAIL("q=%d: decode_frame_config #%" PRIu32
                      ": bounds: got (%" PRIu32 ", %" PRIu32 ")-(%" PRIu32
                      ", %" PRIu32 "), want (%" PRIu32 ", %" PRIu32
                      ")-(%" PRIu32 ", %" PRIu32 ")",
                      q, i, got.min_incl_x, got.min_incl_y, got.max_excl_x,
                      got.max_excl_y, want.min_incl_x, want.min_incl_y,
                      want.max_excl_x, want.max_excl_y);
        }
      }

      {
        wuffs_base__table_u8 p = wuffs_base__pixel_buffer__plane(&pb, 0);
        uint32_t y, x;
        for (y = 0; y < 5; y++) {
          for (x = 0; x < 5; x++) {
            p.ptr[(y * p.stride) + x] = 0xEE;
          }
        }
        for (y = 0; y < height; y++) {
          for (x = 0; x < width; x++) {
            p.ptr[(y * p.stride) + x] = 0;
          }
        }

        status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                                  global_work_slice, NULL);
        if (!wuffs_base__status__is_ok(&status)) {
          RETURN_FAIL("q=%d: decode_frame #%" PRIu32 ": \"%s\"", q, i,
                      status.repr);
        }

        for (y = 0; y < 5; y++) {
          for (x = 0; x < 5; x++) {
            if ((x < width) && (y < height)) {
              continue;
            }
            if (p.ptr[(y * p.stride) + x] != 0xEE) {
              RETURN_FAIL("q=%d: decode_frame #%" PRIu32
                          ": dirty pixel (%" PRIu32 ", %" PRIu32
                          ") outside of image bounds",
                          q, i, x, y);
            }
          }
        }

        wuffs_base__rect_ie_u32 frame_rect =
            wuffs_base__frame_config__bounds(&fc);
        wuffs_base__rect_ie_u32 dirty_rect =
            wuffs_gif__decoder__frame_dirty_rect(&dec);
        if (!wuffs_base__rect_ie_u32__contains_rect(&frame_rect, dirty_rect)) {
          RETURN_FAIL(
              "q=%d: internal error: frame_rect does not contain dirty_rect",
              q);
        }

        char got[(width * height) + 1];
        for (y = 0; y < height; y++) {
          for (x = 0; x < width; x++) {
            uint8_t index = 0x0F & p.ptr[(y * p.stride) + x];
            got[(y * width) + x] = index ? ('0' + index) : '.';
          }
        }
        got[width * height] = 0;

        const char* want = want_pixel_indexes[i];
        if (memcmp(got, want, width * height)) {
          RETURN_FAIL("q=%d: decode_frame #%" PRIu32
                      ": got \"%s\", want \"%s\"",
                      q, i, got, want);
        }
      }
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_zero_width_frame() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-zero-width-frame.gif"));
  int q;
  for (q = 0; q < 3; q++) {
    src.meta.ri = 0;

    wuffs_gif__decoder dec;
    CHECK_STATUS("initialize",
                 wuffs_gif__decoder__initialize(
                     &dec, sizeof dec, WUFFS_VERSION,
                     WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

    const char* want = NULL;
    switch (q) {
      case 0:
        want = wuffs_base__error__too_much_data;
        break;
      case 1:
        want = NULL;
        wuffs_gif__decoder__set_quirk_enabled(
            &dec, WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA, true);
        break;
      case 2:
        want = wuffs_gif__error__bad_frame_size;
        wuffs_gif__decoder__set_quirk_enabled(
            &dec, WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME, true);
        break;
    }

    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status.repr);
    }

    wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
    status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                      global_pixel_slice);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status.repr);
    }

    wuffs_base__status got = wuffs_gif__decoder__decode_frame(
        &dec, &pb, &src, global_work_slice, NULL);
    if (got.repr != want) {
      RETURN_FAIL("q=%d: decode_frame: got \"%s\", want \"%s\"", q, got.repr,
                  want);
    }
  }
  return NULL;
}

const char* test_wuffs_gif_decode_pixfmt_bgr() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", UINT64_MAX,
      wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGR));
}

const char* test_wuffs_gif_decode_pixfmt_bgra_nonpremul() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", UINT64_MAX,
      wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL));
}

const char* test_wuffs_gif_decode_pixfmt_rgb() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", UINT64_MAX,
      wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__RGB));
}

const char* test_wuffs_gif_decode_pixfmt_rgba_nonpremul() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", UINT64_MAX,
      wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL));
}

const char* test_wuffs_gif_decode_input_is_a_gif_just_one_read() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", UINT64_MAX,
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY));
}

const char* test_wuffs_gif_decode_input_is_a_gif_many_big_reads() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", 4096,
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY));
}

const char* test_wuffs_gif_decode_input_is_a_gif_many_medium_reads() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", 787,
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY));
  // The magic 787 tickles being in the middle of a decode_extension skip
  // call.
  //
  // TODO: has 787 changed since we decode the image_config separately?
}

const char* test_wuffs_gif_decode_input_is_a_gif_many_small_reads() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode(
      "test/data/bricks-dither.gif", "test/data/bricks-dither.palette",
      "test/data/bricks-dither.indexes", 13,
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY));
}

const char* test_wuffs_gif_decode_input_is_a_png() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/bricks-dither.png"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  wuffs_base__image_config ic = ((wuffs_base__image_config){});

  wuffs_base__status status =
      wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
  if (status.repr != wuffs_gif__error__bad_header) {
    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                wuffs_gif__error__bad_header);
  }
  return NULL;
}

const char* test_wuffs_gif_decode_interlaced_truncated() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/hippopotamus.interlaced.truncated.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  wuffs_base__image_config ic = ((wuffs_base__image_config){});

  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));
  if (wuffs_base__pixel_config__width(&ic.pixcfg) != 36) {
    RETURN_FAIL("width: got %" PRIu32 ", want 36",
                wuffs_base__pixel_config__width(&ic.pixcfg));
  }
  if (wuffs_base__pixel_config__height(&ic.pixcfg) != 28) {
    RETURN_FAIL("height: got %" PRIu32 ", want 28",
                wuffs_base__pixel_config__height(&ic.pixcfg));
  }
  if (wuffs_base__pixel_config__pixel_format(&ic.pixcfg).repr !=
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY) {
    RETURN_FAIL("pixel_format: got 0x%08" PRIX32 ", want 0x%08" PRIX32,
                wuffs_base__pixel_config__pixel_format(&ic.pixcfg).repr,
                WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY);
  }
  const int num_pixel_indexes = 36 * 28 * 1;

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));
  uint8_t* pixel_ptr = wuffs_base__pixel_buffer__plane(&pb, 0).ptr;
  memset(pixel_ptr, 0xEE, num_pixel_indexes);

  if (pixel_ptr[num_pixel_indexes - 1] != 0xEE) {
    RETURN_FAIL("final pixel index, before: got 0x%02X, want 0x%02X",
                pixel_ptr[num_pixel_indexes - 1], 0xEE);
  }

  wuffs_base__status status = wuffs_gif__decoder__decode_frame(
      &dec, &pb, &src, global_work_slice, NULL);
  if (status.repr != wuffs_base__suspension__short_read) {
    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__suspension__short_read);
  }

  // Even though the source GIF data was truncated, replicating the interlaced
  // rows should have set the bottom right pixel.
  if (pixel_ptr[num_pixel_indexes - 1] == 0xEE) {
    RETURN_FAIL("final pixel index, after: got 0x%02X, want not 0x%02X",
                pixel_ptr[num_pixel_indexes - 1], 0xEE);
  }

  wuffs_base__rect_ie_u32 r = wuffs_gif__decoder__frame_dirty_rect(&dec);
  if (r.max_excl_y != 28) {
    RETURN_FAIL("frame_dirty_rect max_excl_y: got %" PRIu32 ", want 28",
                r.max_excl_y);
  }
  return NULL;
}

const char* do_test_wuffs_gif_decode_metadata(bool full) {
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, full ? "test/data/artificial/gif-metadata-full.gif"
                           : "test/data/artificial/gif-metadata-empty.gif"));

  int iccp;
  for (iccp = 0; iccp < 2; iccp++) {
    int xmp;
    for (xmp = 0; xmp < 2; xmp++) {
      bool seen_iccp = false;
      bool seen_xmp = false;

      wuffs_gif__decoder dec;
      CHECK_STATUS("initialize",
                   wuffs_gif__decoder__initialize(
                       &dec, sizeof dec, WUFFS_VERSION,
                       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

      if (iccp) {
        wuffs_gif__decoder__set_report_metadata(&dec, WUFFS_BASE__FOURCC__ICCP,
                                                true);
      }
      if (xmp) {
        wuffs_gif__decoder__set_report_metadata(&dec, WUFFS_BASE__FOURCC__XMP,
                                                true);
      }

      wuffs_base__image_config ic = ((wuffs_base__image_config){});
      src.meta.ri = 0;

      while (true) {
        wuffs_base__status status =
            wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
        if (wuffs_base__status__is_ok(&status)) {
          break;
        } else if (status.repr != wuffs_base__note__metadata_reported) {
          RETURN_FAIL(
              "decode_image_config (iccp=%d, xmp=%d): got \"%s\", want \"%s\"",
              iccp, xmp, status.repr, wuffs_base__note__metadata_reported);
        }

        const char* want = "";
        char got_buffer[100];
        int got_length = 0;
        uint32_t got_fourcc = wuffs_gif__decoder__metadata_fourcc(&dec);

        switch (wuffs_gif__decoder__metadata_fourcc(&dec)) {
          case WUFFS_BASE__FOURCC__ICCP:
            want = full ? "\x16\x26\x36\x46\x56\x76\x86\x96" : "";
            seen_iccp = true;
            break;
          case WUFFS_BASE__FOURCC__XMP:
            want = full ? "\x05\x17\x27\x37\x47\x57\x03\x77\x87\x97" : "";
            seen_xmp = true;
            break;
          default:
            RETURN_FAIL(
                "metadata_fourcc (iccp=%d, xmp=%d): unexpected FourCC "
                "0x%08" PRIX32,
                iccp, xmp, got_fourcc);
        }

        while (true) {
          uint64_t n = wuffs_gif__decoder__metadata_chunk_length(&dec);
          if ((n > 100) || (n + got_length > 100)) {
            RETURN_FAIL(
                "metadata_chunk_length (iccp=%d, xmp=%d): too much "
                "metadata (vs buffer size)",
                iccp, xmp);
          }
          if (n > wuffs_base__io_buffer__reader_available(&src)) {
            RETURN_FAIL(
                "metadata_chunk_length (iccp=%d, xmp=%d): too much "
                "metadata (vs available)",
                iccp, xmp);
          }
          memcpy(got_buffer + got_length, src.data.ptr + src.meta.ri, n);
          got_length += n;
          src.meta.ri += n;

          wuffs_base__status status =
              wuffs_gif__decoder__ack_metadata_chunk(&dec, &src);
          if (wuffs_base__status__is_ok(&status)) {
            break;
          } else if (status.repr != wuffs_base__note__metadata_reported) {
            RETURN_FAIL(
                "ack_metadata_chunk (iccp=%d, xmp=%d): got \"%s\", want \"%s\"",
                iccp, xmp, status.repr, wuffs_base__note__metadata_reported);
          }
        }

        int want_length = strlen(want);
        if ((got_length != want_length) ||
            strncmp(got_buffer, want, want_length)) {
          RETURN_FAIL("metadata (iccp=%d, xmp=%d): fourcc=0x%08" PRIX32
                      ": values differed",
                      iccp, xmp, got_fourcc);
        }
      }

      if (iccp != seen_iccp) {
        RETURN_FAIL("seen_iccp (iccp=%d, xmp=%d): got %d, want %d", iccp, xmp,
                    seen_iccp, iccp);
      }

      if (xmp != seen_xmp) {
        RETURN_FAIL("seen_xmp (iccp=%d, xmp=%d): got %d, want %d", iccp, xmp,
                    seen_xmp, xmp);
      }

      {
        uint64_t got = wuffs_base__image_config__first_frame_io_position(&ic);
        uint64_t want = 25;
        if (got != want) {
          RETURN_FAIL("first_frame_io_position: got %" PRIu64 ", want %" PRIu64,
                      got, want);
        }
      }

      {
        uint32_t got = wuffs_gif__decoder__num_animation_loops(&dec);
        uint32_t want = 2001;
        if (got != want) {
          RETURN_FAIL("num_animation_loops: got %" PRIu32 ", want %" PRIu32,
                      got, want);
        }
      }

      {
        wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
        wuffs_base__status status =
            wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
        if (!wuffs_base__status__is_ok(&status)) {
          RETURN_FAIL("decode_frame_config (iccp=%d, xmp=%d): %s", iccp, xmp,
                      status.repr);
        }
        uint32_t got = wuffs_base__frame_config__width(&fc);
        uint32_t want = 1;
        if (got != want) {
          RETURN_FAIL(
              "decode_frame_config (iccp=%d, xmp=%d): width: got %" PRIu32
              ", want %" PRIu32,
              iccp, xmp, got, want);
        }
      }
    }
  }

  return NULL;
}

const char* test_wuffs_gif_decode_metadata_empty() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode_metadata(false);
}

const char* test_wuffs_gif_decode_metadata_full() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_decode_metadata(true);
}

const char* test_wuffs_gif_decode_missing_two_src_bytes() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/pjw-thumbnail.gif"));

  // Trim the final two bytes: the 0x00 end-of-block and the 0x3B trailer.
  if (src.meta.wi < 2) {
    return "src file is too short";
  }
  src.meta.wi -= 2;

  return do_test_wuffs_gif_decode_expecting(
      src, 0, wuffs_base__suspension__short_read, false);
}

const char* test_wuffs_gif_decode_multiple_graphic_controls() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(
      &src, "test/data/artificial/gif-multiple-graphic-controls.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
  CHECK_STATUS("decode_frame_config",
               wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src));

  int got = wuffs_base__frame_config__duration(&fc) /
            WUFFS_BASE__FLICKS_PER_MILLISECOND;
  int want = 300;
  if (got != want) {
    RETURN_FAIL("duration: got %d, want %d", got, want);
  }
  return NULL;
}

const char* test_wuffs_gif_decode_multiple_loop_counts() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-multiple-loop-counts.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));

  // See test/data/artificial/gif-multiple-loop-counts.gif.make-artificial.txt
  // for the want_num_animation_loops source. Note that the GIF wire format's
  // loop counts are the number of animation loops *after* the first play
  // through, and Wuffs' are the number *including* the first play through.

  uint32_t want_num_animation_loops[4] = {1, 1, 51, 31};

  uint32_t i;
  for (i = 0; true; i++) {
    {
      wuffs_base__status status =
          wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
      if (i == WUFFS_TESTLIB_ARRAY_SIZE(want_num_animation_loops)) {
        if (status.repr != wuffs_base__note__end_of_data) {
          RETURN_FAIL("decode_frame_config #%" PRIu32
                      ": got \"%s\", want \"%s\"",
                      i, status.repr, wuffs_base__note__end_of_data);
        }
        break;
      }
      if (!wuffs_base__status__is_ok(&status)) {
        RETURN_FAIL("decode_frame_config #%" PRIu32 ": \"%s\"", i, status.repr);
      }
    }

    uint32_t got = wuffs_gif__decoder__num_animation_loops(&dec);
    uint32_t want = want_num_animation_loops[i];
    if (got != want) {
      RETURN_FAIL("num_animation_loops #%" PRIu32 ": got %" PRIu32
                  ", want %" PRIu32,
                  i, got, want);
    }
  }

  uint32_t got = wuffs_gif__decoder__num_animation_loops(&dec);
  uint32_t want = 41;
  if (got != want) {
    RETURN_FAIL("num_animation_loops #%" PRIu32 ": got %" PRIu32
                ", want %" PRIu32,
                i, got, want);
  }
  return NULL;
}

const char* test_wuffs_gif_decode_pixel_data_none() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/artificial/gif-pixel-data-none.gif"));

  return do_test_wuffs_gif_decode_expecting(
      src, 0, wuffs_base__error__not_enough_data, true);
}

const char* test_wuffs_gif_decode_pixel_data_not_enough() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-pixel-data-not-enough.gif"));

  return do_test_wuffs_gif_decode_expecting(
      src, 0, wuffs_base__error__not_enough_data, false);
}

const char* test_wuffs_gif_decode_pixel_data_too_much_sans_quirk() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-pixel-data-too-much.gif"));

  return do_test_wuffs_gif_decode_expecting(
      src, 0, wuffs_base__error__too_much_data, false);
}

const char* test_wuffs_gif_decode_pixel_data_too_much_with_quirk() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-pixel-data-too-much.gif"));

  return do_test_wuffs_gif_decode_expecting(
      src, WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA, NULL, false);
}

const char* test_wuffs_gif_frame_dirty_rect() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/hippopotamus.interlaced.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));

  // The hippopotamus.interlaced.gif image is 28 pixels high. As we decode rows
  // of pixels, interlacing means that we decode rows 0, 8, 16, 24, 4, 12, 20,
  // 2, 6, 10, ..., 22, 26, 1, 3, 5, ..., 25, 27. As we progress, the dirty
  // rect's max_excl_y should be one more than the highest decoded row so far,
  // until the row is complete, when it is replicated (to a multiple of 8). If
  // we haven't decoded any rows yet, max_excl_y should be zero.
  uint32_t wants[9] = {0, 1, 8, 9, 16, 17, 24, 25, 28};
  int i = 0;

  while (true) {
    wuffs_base__io_buffer limited_src = make_limited_reader(src, 1);

    wuffs_base__status status = wuffs_gif__decoder__decode_frame(
        &dec, &pb, &limited_src, global_work_slice, NULL);
    src.meta.ri += limited_src.meta.ri;

    wuffs_base__rect_ie_u32 r = wuffs_gif__decoder__frame_dirty_rect(&dec);
    if ((i < WUFFS_TESTLIB_ARRAY_SIZE(wants)) && (wants[i] == r.max_excl_y)) {
      i++;
    }

    if (wuffs_base__status__is_ok(&status)) {
      break;
    } else if (status.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                  wuffs_base__suspension__short_read);
    }
  }

  if (i != WUFFS_TESTLIB_ARRAY_SIZE(wants)) {
    RETURN_FAIL("i: got %d, want %d", i,
                (int)(WUFFS_TESTLIB_ARRAY_SIZE(wants)));
  }
  return NULL;
}

const char* do_test_wuffs_gif_num_decoded(bool frame_config) {
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/animated-red-blue.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  if (!frame_config) {
    wuffs_base__image_config ic = ((wuffs_base__image_config){});
    CHECK_STATUS("decode_image_config",
                 wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));

    CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                       &pb, &ic.pixcfg, global_pixel_slice));
  }

  const char* method = frame_config ? "decode_frame_config" : "decode_frame";
  bool end_of_data = false;
  uint64_t want = 0;
  while (true) {
    uint64_t got =
        frame_config
            ? (uint64_t)(wuffs_gif__decoder__num_decoded_frame_configs(&dec))
            : (uint64_t)(wuffs_gif__decoder__num_decoded_frames(&dec));
    if (got != want) {
      RETURN_FAIL("num_%ss: got %" PRIu64 ", want %" PRIu64, method, got, want);
    }

    if (end_of_data) {
      break;
    }

    wuffs_base__status status = wuffs_base__make_status(NULL);
    if (frame_config) {
      status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
    } else {
      status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                                global_work_slice, NULL);
    }

    if (wuffs_base__status__is_ok(&status)) {
      want++;
    } else if (status.repr == wuffs_base__note__end_of_data) {
      end_of_data = true;
    } else {
      RETURN_FAIL("%s: got \"%s\", want \"%s\"", method, status.repr,
                  wuffs_base__note__end_of_data);
    }
  }

  if (want != 4) {
    RETURN_FAIL("%s: got %" PRIu64 ", want 4", method, want);
  }
  return NULL;
}

const char* test_wuffs_gif_num_decoded_frame_configs() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_num_decoded(true);
}

const char* test_wuffs_gif_num_decoded_frames() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_num_decoded(false);
}

const char* do_test_wuffs_gif_io_position(bool chunked) {
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, "test/data/animated-red-blue.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  if (chunked) {
    if (src.meta.wi < 50) {
      RETURN_FAIL("src is too short");
    }
    size_t saved_wi = src.meta.wi;
    bool saved_closed = src.meta.closed;
    src.meta.wi = 30;
    src.meta.closed = false;

    wuffs_base__status status =
        wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
    if (status.repr != wuffs_base__suspension__short_read) {
      RETURN_FAIL("decode_image_config (chunked): got \"%s\", want \"%s\"",
                  status.repr, wuffs_base__suspension__short_read);
    }

    src.meta.wi = saved_wi;
    src.meta.closed = saved_closed;

    if (src.meta.pos != 0) {
      RETURN_FAIL("src.meta.pos: got %" PRIu64 ", want zero", src.meta.pos);
    }
    wuffs_base__io_buffer__compact(&src);
    if (src.meta.pos == 0) {
      RETURN_FAIL("src.meta.pos: got %" PRIu64 ", want non-zero", src.meta.pos);
    }
  }

  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, NULL, &src));

  wuffs_base__frame_config fcs[4];
  uint32_t width_wants[4] = {64, 37, 49, 49};
  uint64_t pos_wants[4] = {781, 2126, 2187, 2542};
  int i;
  for (i = 0; i < 4; i++) {
    fcs[i] = ((wuffs_base__frame_config){});
    wuffs_base__status status =
        wuffs_gif__decoder__decode_frame_config(&dec, &fcs[i], &src);
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("decode_frame_config #%d: \"%s\"", i, status.repr);
    }

    uint64_t index_got = wuffs_base__frame_config__index(&fcs[i]);
    uint64_t index_want = i;
    if (index_got != index_want) {
      RETURN_FAIL("index #%d: got %" PRIu64 ", want %" PRIu64, i, index_got,
                  index_want);
    }

    uint32_t width_got = wuffs_base__frame_config__width(&fcs[i]);
    uint32_t width_want = width_wants[i];
    if (width_got != width_want) {
      RETURN_FAIL("width #%d: got %" PRIu32 ", want %" PRIu32, i, width_got,
                  width_want);
    }

    uint64_t pos_got = wuffs_base__frame_config__io_position(&fcs[i]);
    uint64_t pos_want = pos_wants[i];
    if (pos_got != pos_want) {
      RETURN_FAIL("io_position #%d: got %" PRIu64 ", want %" PRIu64, i, pos_got,
                  pos_want);
    }

    // Look for the 0x21 byte that's a GIF's Extension Introducer. Not every
    // GIF's frame_config's I/O position will point to 0x21, as an 0x2C Image
    // Separator is also valid. But for animated-red-blue.gif, it'll be 0x21.
    if (pos_got < src.meta.pos) {
      RETURN_FAIL("io_position #%d: got %" PRIu64 ", was too small", i,
                  pos_got);
    }
    uint64_t src_ptr_offset = pos_got - src.meta.pos;
    if (src_ptr_offset >= src.meta.wi) {
      RETURN_FAIL("io_position #%d: got %" PRIu64 ", was too large", i,
                  pos_got);
    }
    uint8_t x = src.data.ptr[src_ptr_offset];
    if (x != 0x21) {
      RETURN_FAIL("Image Descriptor byte #%d: got 0x%02X, want 0x2C", i,
                  (int)x);
    }
  }

  wuffs_base__status status =
      wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
  if (status.repr != wuffs_base__note__end_of_data) {
    RETURN_FAIL("decode_frame_config EOD: got \"%s\", want \"%s\"", status.repr,
                wuffs_base__note__end_of_data);
  }

  // If we're chunked, we've discarded some source bytes due to an earlier
  // wuffs_base__io_buffer__compact call. We won't bother testing
  // wuffs_gif__decoder__restart_frame in that case.
  if (chunked) {
    return NULL;
  }

  for (i = 0; i < 4; i++) {
    src.meta.ri = pos_wants[i];

    status = wuffs_gif__decoder__restart_frame(
        &dec, i, wuffs_base__frame_config__io_position(&fcs[i]));
    if (!wuffs_base__status__is_ok(&status)) {
      RETURN_FAIL("restart_frame #%d: \"%s\"", i, status.repr);
    }

    int j;
    for (j = i; j < 4; j++) {
      wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
      status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
      if (!wuffs_base__status__is_ok(&status)) {
        RETURN_FAIL("decode_frame_config #%d, #%d: \"%s\"", i, j, status.repr);
      }

      uint64_t index_got = wuffs_base__frame_config__index(&fc);
      uint64_t index_want = j;
      if (index_got != index_want) {
        RETURN_FAIL("index #%d, #%d: got %" PRIu64 ", want %" PRIu64, i, j,
                    index_got, index_want);
      }

      uint32_t width_got = wuffs_base__frame_config__width(&fc);
      uint32_t width_want = width_wants[j];
      if (width_got != width_want) {
        RETURN_FAIL("width #%d, #%d: got %" PRIu32 ", want %" PRIu32, i, j,
                    width_got, width_want);
      }
    }

    status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
    if (status.repr != wuffs_base__note__end_of_data) {
      RETURN_FAIL("decode_frame_config #%d: got \"%s\", want \"%s\"", i,
                  status.repr, wuffs_base__note__end_of_data);
    }
  }

  return NULL;
}

const char* test_wuffs_gif_io_position_one_chunk() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_io_position(false);
}

const char* test_wuffs_gif_io_position_two_chunks() {
  CHECK_FOCUS(__func__);
  return do_test_wuffs_gif_io_position(true);
}

const char* test_wuffs_gif_small_frame_interlaced() {
  CHECK_FOCUS(__func__);
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(
      read_file(&src, "test/data/artificial/gif-small-frame-interlaced.gif"));

  wuffs_gif__decoder dec;
  CHECK_STATUS("initialize",
               wuffs_gif__decoder__initialize(
                   &dec, sizeof dec, WUFFS_VERSION,
                   WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));

  wuffs_base__image_config ic = ((wuffs_base__image_config){});
  CHECK_STATUS("decode_image_config",
               wuffs_gif__decoder__decode_image_config(&dec, &ic, &src));
  if (wuffs_base__pixel_config__width(&ic.pixcfg) != 5) {
    RETURN_FAIL("width: got %" PRIu32 ", want 5",
                wuffs_base__pixel_config__width(&ic.pixcfg));
  }
  if (wuffs_base__pixel_config__height(&ic.pixcfg) != 5) {
    RETURN_FAIL("height: got %" PRIu32 ", want 5",
                wuffs_base__pixel_config__height(&ic.pixcfg));
  }

  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
  CHECK_STATUS("set_from_slice", wuffs_base__pixel_buffer__set_from_slice(
                                     &pb, &ic.pixcfg, global_pixel_slice));

  wuffs_base__frame_config fc;
  CHECK_STATUS("decode_frame_config",
               wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src));

  wuffs_base__rect_ie_u32 fr = wuffs_base__frame_config__bounds(&fc);
  if (fr.max_excl_y != 3) {
    RETURN_FAIL("frame rect max_excl_y: got %" PRIu32 ", want 3",
                fr.max_excl_y);
  }

  CHECK_STATUS("decode_frame", wuffs_gif__decoder__decode_frame(
                                   &dec, &pb, &src, global_work_slice, NULL));

  wuffs_base__rect_ie_u32 dr = wuffs_gif__decoder__frame_dirty_rect(&dec);
  if (dr.max_excl_y != 3) {
    RETURN_FAIL("dirty rect max_excl_y: got %" PRIu32 ", want 3",
                dr.max_excl_y);
  }

  return NULL;
}

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

#ifdef WUFFS_MIMIC

const char* do_test_mimic_gif_decode(const char* filename) {
  wuffs_base__io_buffer src = ((wuffs_base__io_buffer){
      .data = global_src_slice,
  });
  CHECK_STRING(read_file(&src, filename));

  src.meta.ri = 0;
  wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
      .data = global_got_slice,
  });
  CHECK_STRING(
      wuffs_gif_decode(&got, 0,
                       wuffs_base__make_pixel_format(
                           WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
                       &src));

  src.meta.ri = 0;
  wuffs_base__io_buffer want = ((wuffs_base__io_buffer){
      .data = global_want_slice,
  });
  CHECK_STRING(
      mimic_gif_decode(&want, 0,
                       wuffs_base__make_pixel_format(
                           WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
                       &src));

  CHECK_STRING(check_io_buffers_equal("", &got, &want));

  // TODO: check the palette RGB values, not just the palette indexes
  // (pixels).

  return NULL;
}

const char* test_mimic_gif_decode_animated_small() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/animated-red-blue.gif");
}

const char* test_mimic_gif_decode_bricks_dither() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/bricks-dither.gif");
}

const char* test_mimic_gif_decode_bricks_gray() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/bricks-gray.gif");
}

const char* test_mimic_gif_decode_bricks_nodither() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/bricks-nodither.gif");
}

const char* test_mimic_gif_decode_gifplayer_muybridge() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/gifplayer-muybridge.gif");
}

const char* test_mimic_gif_decode_harvesters() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/harvesters.gif");
}

const char* test_mimic_gif_decode_hat() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/hat.gif");
}

const char* test_mimic_gif_decode_hibiscus_primitive() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/hibiscus.primitive.gif");
}

const char* test_mimic_gif_decode_hibiscus_regular() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/hibiscus.regular.gif");
}

const char* test_mimic_gif_decode_hippopotamus_interlaced() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/hippopotamus.interlaced.gif");
}

const char* test_mimic_gif_decode_hippopotamus_regular() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/hippopotamus.regular.gif");
}

const char* test_mimic_gif_decode_muybridge() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/muybridge.gif");
}

const char* test_mimic_gif_decode_pjw_thumbnail() {
  CHECK_FOCUS(__func__);
  return do_test_mimic_gif_decode("test/data/pjw-thumbnail.gif");
}

#endif  // WUFFS_MIMIC

// ---------------- GIF Benches

const char* do_bench_gif_decode(
    const char* (*decode_func)(wuffs_base__io_buffer*,
                               uint32_t wuffs_initialize_flags,
                               wuffs_base__pixel_format,
                               wuffs_base__io_buffer*),
    uint32_t wuffs_initialize_flags,
    const char* filename,
    wuffs_base__pixel_format pixfmt,
    uint64_t iters_unscaled) {
  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,
  });
  CHECK_STRING(read_file(&src, filename));

  bench_start();
  uint64_t n_bytes = 0;
  uint64_t i;
  uint64_t iters = iters_unscaled * iterscale;
  for (i = 0; i < iters; i++) {
    got.meta.wi = 0;
    src.meta.ri = 0;
    CHECK_STRING(decode_func(&got, wuffs_initialize_flags, pixfmt, &src));
    n_bytes += got.meta.wi;
  }
  bench_finish(iters, n_bytes);
  return NULL;
}

const char* bench_wuffs_gif_decode_1k_bw() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/pjw-thumbnail.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      2000);
}

const char* bench_wuffs_gif_decode_1k_color_full_init() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__DEFAULT_OPTIONS,
      "test/data/hippopotamus.regular.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1000);
}

const char* bench_wuffs_gif_decode_1k_color_part_init() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/hippopotamus.regular.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1000);
}

const char* bench_wuffs_gif_decode_10k_bgra() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/hat.gif",
      wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL),
      100);
}

const char* bench_wuffs_gif_decode_10k_indexed() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/hat.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      100);
}

const char* bench_wuffs_gif_decode_20k() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/bricks-gray.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      50);
}

const char* bench_wuffs_gif_decode_100k_artificial() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/hibiscus.primitive.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      15);
}

const char* bench_wuffs_gif_decode_100k_realistic() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/hibiscus.regular.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      10);
}

const char* bench_wuffs_gif_decode_1000k_full_init() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__DEFAULT_OPTIONS,
      "test/data/harvesters.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1);
}

const char* bench_wuffs_gif_decode_1000k_part_init() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/harvesters.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1);
}

const char* bench_wuffs_gif_decode_anim_screencap() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
      "test/data/gifplayer-muybridge.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1);
}

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

#ifdef WUFFS_MIMIC

const char* bench_mimic_gif_decode_1k_bw() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/pjw-thumbnail.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      2000);
}

const char* bench_mimic_gif_decode_1k_color() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/hippopotamus.regular.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1000);
}

const char* bench_mimic_gif_decode_10k_indexed() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/hat.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      100);
}

const char* bench_mimic_gif_decode_20k() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/bricks-gray.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      50);
}

const char* bench_mimic_gif_decode_100k_artificial() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/hibiscus.primitive.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      15);
}

const char* bench_mimic_gif_decode_100k_realistic() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/hibiscus.regular.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      10);
}

const char* bench_mimic_gif_decode_1000k() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/harvesters.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1);
}

const char* bench_mimic_gif_decode_anim_screencap() {
  CHECK_FOCUS(__func__);
  return do_bench_gif_decode(
      mimic_gif_decode, 0, "test/data/gifplayer-muybridge.gif",
      wuffs_base__make_pixel_format(
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
      1);
}

#endif  // WUFFS_MIMIC

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

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

    // These basic tests are really testing the Wuffs compiler. They aren't
    // specific to the std/gif code, but putting them here is as good as any
    // other place.
    test_basic_bad_receiver,            //
    test_basic_bad_sizeof_receiver,     //
    test_basic_bad_wuffs_version,       //
    test_basic_initialize_not_called,   //
    test_basic_status_is_error,         //
    test_basic_status_strings,          //
    test_basic_status_used_package,     //
    test_basic_sub_struct_initializer,  //

    test_wuffs_gif_call_interleaved,                         //
    test_wuffs_gif_call_sequence,                            //
    test_wuffs_gif_decode_animated_big,                      //
    test_wuffs_gif_decode_animated_medium,                   //
    test_wuffs_gif_decode_animated_small,                    //
    test_wuffs_gif_decode_background_color,                  //
    test_wuffs_gif_decode_delay_num_frames_decoded,          //
    test_wuffs_gif_decode_empty_palette,                     //
    test_wuffs_gif_decode_first_frame_is_opaque,             //
    test_wuffs_gif_decode_frame_out_of_bounds,               //
    test_wuffs_gif_decode_input_is_a_gif_just_one_read,      //
    test_wuffs_gif_decode_input_is_a_gif_many_big_reads,     //
    test_wuffs_gif_decode_input_is_a_gif_many_medium_reads,  //
    test_wuffs_gif_decode_input_is_a_gif_many_small_reads,   //
    test_wuffs_gif_decode_input_is_a_png,                    //
    test_wuffs_gif_decode_interlaced_truncated,              //
    test_wuffs_gif_decode_metadata_empty,                    //
    test_wuffs_gif_decode_metadata_full,                     //
    test_wuffs_gif_decode_missing_two_src_bytes,             //
    test_wuffs_gif_decode_multiple_graphic_controls,         //
    test_wuffs_gif_decode_multiple_loop_counts,              //
    test_wuffs_gif_decode_pixel_data_none,                   //
    test_wuffs_gif_decode_pixel_data_not_enough,             //
    test_wuffs_gif_decode_pixel_data_too_much_sans_quirk,    //
    test_wuffs_gif_decode_pixel_data_too_much_with_quirk,    //
    test_wuffs_gif_decode_pixfmt_bgr,                        //
    test_wuffs_gif_decode_pixfmt_bgra_nonpremul,             //
    test_wuffs_gif_decode_pixfmt_rgb,                        //
    test_wuffs_gif_decode_pixfmt_rgba_nonpremul,             //
    test_wuffs_gif_decode_zero_width_frame,                  //
    test_wuffs_gif_frame_dirty_rect,                         //
    test_wuffs_gif_num_decoded_frame_configs,                //
    test_wuffs_gif_num_decoded_frames,                       //
    test_wuffs_gif_io_position_one_chunk,                    //
    test_wuffs_gif_io_position_two_chunks,                   //
    test_wuffs_gif_small_frame_interlaced,                   //

#ifdef WUFFS_MIMIC

    test_mimic_gif_decode_animated_small,           //
    test_mimic_gif_decode_bricks_dither,            //
    test_mimic_gif_decode_bricks_gray,              //
    test_mimic_gif_decode_bricks_nodither,          //
    test_mimic_gif_decode_gifplayer_muybridge,      //
    test_mimic_gif_decode_harvesters,               //
    test_mimic_gif_decode_hat,                      //
    test_mimic_gif_decode_hibiscus_primitive,       //
    test_mimic_gif_decode_hibiscus_regular,         //
    test_mimic_gif_decode_hippopotamus_interlaced,  //
    test_mimic_gif_decode_hippopotamus_regular,     //
    test_mimic_gif_decode_muybridge,                //
    test_mimic_gif_decode_pjw_thumbnail,            //

#endif  // WUFFS_MIMIC

    NULL,
};

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

    bench_wuffs_gif_decode_1k_bw,               //
    bench_wuffs_gif_decode_1k_color_full_init,  //
    bench_wuffs_gif_decode_1k_color_part_init,  //
    bench_wuffs_gif_decode_10k_bgra,            //
    bench_wuffs_gif_decode_10k_indexed,         //
    bench_wuffs_gif_decode_20k,                 //
    bench_wuffs_gif_decode_100k_artificial,     //
    bench_wuffs_gif_decode_100k_realistic,      //
    bench_wuffs_gif_decode_1000k_full_init,     //
    bench_wuffs_gif_decode_1000k_part_init,     //
    bench_wuffs_gif_decode_anim_screencap,      //

#ifdef WUFFS_MIMIC

    bench_mimic_gif_decode_1k_bw,            //
    bench_mimic_gif_decode_1k_color,         //
    bench_mimic_gif_decode_10k_indexed,      //
    bench_mimic_gif_decode_20k,              //
    bench_mimic_gif_decode_100k_artificial,  //
    bench_mimic_gif_decode_100k_realistic,   //
    bench_mimic_gif_decode_1000k,            //
    bench_mimic_gif_decode_anim_screencap,   //

#endif  // WUFFS_MIMIC

    NULL,
};

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