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

#include "src/core/SkFontMetricsPriv.h"

#include "include/core/SkFont.h"
#include "include/core/SkFontMetrics.h"
#include "include/core/SkTypeface.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkScalerContext.h"
#include "src/core/SkStrikeSpec.h"
#include "src/core/SkWriteBuffer.h"
#include "tests/Test.h"

#include <optional>

DEF_TEST(SkFontMetricsPriv_Basic, reporter) {
    auto typeface = SkTypeface::MakeFromName("monospace", SkFontStyle());
    SkFont font{typeface};
    SkStrikeSpec spec = SkStrikeSpec::MakeWithNoDevice(font);
    auto context = spec.createScalerContext();
    SkFontMetrics srcMetrics;

    // Check that font metrics round-trip.
    context->getFontMetrics(&srcMetrics);

    SkBinaryWriteBuffer writeBuffer({});
    SkFontMetricsPriv::Flatten(writeBuffer, srcMetrics);

    auto data = writeBuffer.snapshotAsData();

    SkReadBuffer readBuffer{data->data(), data->size()};

    std::optional<SkFontMetrics> dstMetrics = SkFontMetricsPriv::MakeFromBuffer(readBuffer);

    REPORTER_ASSERT(reporter, dstMetrics.has_value());
    REPORTER_ASSERT(reporter, srcMetrics == dstMetrics.value());

    // Check that a broken buffer is detected.
    // Must be multiple of 4 for a valid buffer.
    std::uint8_t brokenData[] = {1, 2, 3, 4, 5, 6, 7, 8};
    SkReadBuffer brokenBuffer{brokenData, std::size(brokenData)};

    dstMetrics = SkFontMetricsPriv::MakeFromBuffer(brokenBuffer);
    REPORTER_ASSERT(reporter, !dstMetrics.has_value());
}


