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

#include "include/core/SkData.h"
#include "include/core/SkFont.h"
#include "include/core/SkRefCnt.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkStrikeCache.h"
#include "src/core/SkStrikeSpec.h"
#include "src/core/SkWriteBuffer.h"
#include "src/text/StrikeForGPU.h"
#include "tests/Test.h"

#include <cstdint>
#include <memory>
#include <optional>
#include <utility>

using namespace sktext;

DEF_TEST(SkStrikePromise_Basic, reporter) {
    auto strikeCache = std::make_unique<SkStrikeCache>();
    auto [strikeSpec, _] = SkStrikeSpec::MakeCanonicalized(SkFont());

    class Pinner : public ::SkStrikePinner {
    public:
        // Changing canDelete to return true causes this test to expectedly fail.
        bool canDelete() override { return false; }
    };

    intptr_t toCompareWith;
    sk_sp<SkData> data;

    // Ensure that the ref in srcPromise is dropped.
    {
        // Make a strike with a Pinner.
        auto strike = strikeCache->createStrike(strikeSpec, nullptr, std::make_unique<Pinner>());
        toCompareWith = reinterpret_cast<intptr_t>(strike.get());
        SkStrikePromise srcPromise(std::move(strike));
        SkBinaryWriteBuffer writeBuffer;
        srcPromise.flatten(writeBuffer);
        data = writeBuffer.snapshotAsData();
    }

    // Remove all unpinned strikes.
    strikeCache->purgeAll();

    SkReadBuffer readBuffer{data->data(), data->size()};
    std::optional<SkStrikePromise> dstPromise = SkStrikePromise::MakeFromBuffer(
            readBuffer, nullptr, strikeCache.get());

    REPORTER_ASSERT(reporter, dstPromise.has_value());
    REPORTER_ASSERT(reporter,
        reinterpret_cast<intptr_t>(dstPromise->strike()) == toCompareWith);
}
