// Copyright 2019 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "core/fxcrt/cfx_seekablestreamproxy.h"

#include <iterator>

#include "core/fxcrt/cfx_read_only_span_stream.h"
#include "core/fxcrt/retain_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/base/span.h"

TEST(SeekableStreamProxyTest, NullStream) {
  auto proxy_stream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
      pdfium::MakeRetain<CFX_ReadOnlySpanStream>(
          pdfium::make_span<const uint8_t>(nullptr, 0)));

  wchar_t buffer[16];
  EXPECT_EQ(0u, proxy_stream->ReadBlock(buffer, std::size(buffer)));
}

TEST(SeekableStreamProxyTest, DefaultStreamBOMNotRecognized) {
  const char data[] = "abcd";
  auto proxy_stream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
      pdfium::MakeRetain<CFX_ReadOnlySpanStream>(pdfium::make_span(
          reinterpret_cast<const uint8_t*>(data), sizeof(data) - 1)));

  wchar_t buffer[16];
  EXPECT_EQ(0u, proxy_stream->ReadBlock(buffer, std::size(buffer)));
}

TEST(SeekableStreamProxyTest, UTF8Stream) {
  const char data[] = "\xEF\xBB\xBF*\xC2\xA2*";
  auto proxy_stream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
      pdfium::MakeRetain<CFX_ReadOnlySpanStream>(pdfium::make_span(
          reinterpret_cast<const uint8_t*>(data), sizeof(data) - 1)));

  wchar_t buffer[16];
  EXPECT_EQ(3u, proxy_stream->ReadBlock(buffer, std::size(buffer)));
  EXPECT_EQ(L'*', buffer[0]);
  EXPECT_EQ(L'\u00A2', buffer[1]);
  EXPECT_EQ(L'*', buffer[2]);
}

TEST(SeekableStreamProxyTest, UTF16LEStream) {
  const char data[] = "\xFF\xFE\x41\x00\x42\x01";
  auto proxy_stream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
      pdfium::MakeRetain<CFX_ReadOnlySpanStream>(pdfium::make_span(
          reinterpret_cast<const uint8_t*>(data), sizeof(data) - 1)));

  wchar_t buffer[16];
  EXPECT_EQ(2u, proxy_stream->ReadBlock(buffer, std::size(buffer)));
  EXPECT_EQ(L'A', buffer[0]);
  EXPECT_EQ(L'\u0142', buffer[1]);
}

TEST(SeekableStreamProxyTest, UTF16BEStream) {
  const char data[] = "\xFE\xFF\x00\x41\x01\x42";
  auto proxy_stream = pdfium::MakeRetain<CFX_SeekableStreamProxy>(
      pdfium::MakeRetain<CFX_ReadOnlySpanStream>(pdfium::make_span(
          reinterpret_cast<const uint8_t*>(data), sizeof(data) - 1)));

  wchar_t buffer[16];
  EXPECT_EQ(2u, proxy_stream->ReadBlock(buffer, std::size(buffer)));
  EXPECT_EQ(L'A', buffer[0]);
  EXPECT_EQ(L'\u0142', buffer[1]);
}
