// Copyright 2024 Google LLC
// SPDX-License-Identifier: BSD-2-Clause

#include <algorithm>
#include <iostream>
#include <string>

#include "avif/avif.h"
#include "avifincrtest_helpers.h"
#include "aviftest_helpers.h"
#include "gtest/gtest.h"

namespace avif {
namespace {

// Used to pass the data folder path to the GoogleTest suites.
const char* data_path = nullptr;

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

TEST(IncrementalTest, Dimg) {
  testutil::AvifRwData avif =
      testutil::ReadFile(std::string(data_path) + "sofa_grid1x5_420.avif");
  ASSERT_NE(avif.size, 0u);
  ImagePtr decoded(avifImageCreateEmpty());
  ASSERT_NE(decoded, nullptr);
  DecoderPtr decoder(avifDecoderCreate());
  ASSERT_NE(decoder, nullptr);
  ASSERT_EQ(
      avifDecoderReadMemory(decoder.get(), decoded.get(), avif.data, avif.size),
      AVIF_RESULT_OK);

  testutil::AvifRwData avif_reversed_dimg_order = testutil::ReadFile(
      std::string(data_path) + "sofa_grid1x5_420_reversed_dimg_order.avif");
  ImagePtr decoded_reversed_dimg_order(avifImageCreateEmpty());
  ASSERT_NE(decoded_reversed_dimg_order, nullptr);
  ASSERT_EQ(avifDecoderReadMemory(decoder.get(), decoded.get(),
                                  avif_reversed_dimg_order.data,
                                  avif_reversed_dimg_order.size),
            AVIF_RESULT_OK);
  EXPECT_FALSE(
      testutil::AreImagesEqual(*decoded, *decoded_reversed_dimg_order));

  // Verify that it works incrementally.
  // enable_fine_incremental_check is false because the tiles are out-of-order.
  ASSERT_EQ(testutil::DecodeIncrementally(
                avif_reversed_dimg_order, decoder.get(), /*is_persistent=*/true,
                /*give_size_hint=*/true,
                /*use_nth_image_api=*/false, *decoded_reversed_dimg_order,
                /*cell_height=*/154, /*enable_fine_incremental_check=*/false),
            AVIF_RESULT_OK);
}

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

}  // namespace
}  // namespace avif

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  if (argc < 2) {
    std::cerr
        << "The path to the test data folder must be provided as an argument"
        << std::endl;
    return 1;
  }
  avif::data_path = argv[1];
  return RUN_ALL_TESTS();
}
