/*
 * Copyright 2020 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

// Make sure SkUserConfig.h is included so #defines are available on
// Android.
#include "include/core/SkTypes.h"
#ifdef SK_ENABLE_ANDROID_UTILS
#include "client_utils/android/BitmapRegionDecoder.h"
#include "include/codec/SkAndroidCodec.h"
#include "include/codec/SkCodec.h"
#include "tests/Test.h"
#include "tools/Resources.h"

DEF_TEST(BRD_types, r) {
    static const struct {
        const char* name;
        bool supported;
    } gRec[] = {
        {"images/arrow.png", true},
        {"images/box.gif", false},
        {"images/baby_tux.webp", true},
        {"images/brickwork-texture.jpg", true},
#if defined(SK_CODEC_DECODES_ICO)
        {"images/color_wheel.ico", false},
#endif
#if defined(SK_CODEC_DECODES_RAW)
        {"images/sample_1mp.dng", false},
#endif
        {"images/mandrill.wbmp", false},
        {"images/randPixels.bmp", false},
    };

    for (const auto& rec : gRec) {
        skiatest::ReporterContext context(r, rec.name);
        auto data = GetResourceAsData(rec.name);
        if (!data) return;

        REPORTER_ASSERT(r, SkCodec::MakeFromData(data) != nullptr);
        REPORTER_ASSERT(r, SkAndroidCodec::MakeFromData(data) != nullptr);

        auto brd = android::skia::BitmapRegionDecoder::Make(data);
        if (rec.supported) {
            if (!brd) ERRORF(r, "Failed to create BRD from %s", rec.name);
        } else {
            if (brd) ERRORF(r, "Should *not* create BRD from %s", rec.name);
        }
    }
}
#endif // SK_ENABLE_ANDROID_UTILS
