blob: 5b9fb433f1bccc424437ffe55126d83f881951c9 [file]
// Copyright 2026 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/fx_codepage.h"
#include <array>
#include "build/build_config.h"
#include "core/fxcrt/bytestring.h"
#include "core/fxcrt/widestring.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::ElementsAre;
TEST(FXCodePageTest, GetACP) {
#if BUILDFLAG(IS_WIN)
EXPECT_NE(FX_CodePage::kFailure, FX_GetACP());
#else
EXPECT_EQ(FX_CodePage::kDefANSI, FX_GetACP());
#endif
}
TEST(FXCodePageTest, GetCodePageFromCharset) {
EXPECT_EQ(FX_CodePage::kMSWin_WesternEuropean,
FX_GetCodePageFromCharset(FX_Charset::kANSI));
EXPECT_EQ(FX_CodePage::kShiftJIS,
FX_GetCodePageFromCharset(FX_Charset::kShiftJIS));
EXPECT_EQ(FX_CodePage::kHangul,
FX_GetCodePageFromCharset(FX_Charset::kHangul));
EXPECT_EQ(FX_CodePage::kChineseSimplified,
FX_GetCodePageFromCharset(FX_Charset::kChineseSimplified));
EXPECT_EQ(FX_CodePage::kChineseTraditional,
FX_GetCodePageFromCharset(FX_Charset::kChineseTraditional));
EXPECT_EQ(FX_CodePage::kMSWin_Cyrillic,
FX_GetCodePageFromCharset(FX_Charset::kMSWin_Cyrillic));
EXPECT_EQ(FX_CodePage::kMSDOS_Thai,
FX_GetCodePageFromCharset(FX_Charset::kThai));
EXPECT_EQ(FX_CodePage::kMSWin_EasternEuropean,
FX_GetCodePageFromCharset(FX_Charset::kMSWin_EasternEuropean));
// Invalid charset returns kFailure.
EXPECT_EQ(FX_CodePage::kFailure,
FX_GetCodePageFromCharset(static_cast<FX_Charset>(253)));
}
TEST(FXCodePageTest, GetCharsetFromCodePage) {
EXPECT_EQ(FX_Charset::kANSI,
FX_GetCharsetFromCodePage(FX_CodePage::kMSWin_WesternEuropean));
EXPECT_EQ(FX_Charset::kShiftJIS,
FX_GetCharsetFromCodePage(FX_CodePage::kShiftJIS));
EXPECT_EQ(FX_Charset::kHangul,
FX_GetCharsetFromCodePage(FX_CodePage::kHangul));
EXPECT_EQ(FX_Charset::kChineseSimplified,
FX_GetCharsetFromCodePage(FX_CodePage::kChineseSimplified));
EXPECT_EQ(FX_Charset::kChineseTraditional,
FX_GetCharsetFromCodePage(FX_CodePage::kChineseTraditional));
EXPECT_EQ(FX_Charset::kMSWin_Cyrillic,
FX_GetCharsetFromCodePage(FX_CodePage::kMSWin_Cyrillic));
EXPECT_EQ(FX_Charset::kThai,
FX_GetCharsetFromCodePage(FX_CodePage::kMSDOS_Thai));
EXPECT_EQ(FX_Charset::kMSWin_EasternEuropean,
FX_GetCharsetFromCodePage(FX_CodePage::kMSWin_EasternEuropean));
// Unknown codepage defaults to kANSI.
EXPECT_EQ(FX_Charset::kANSI,
FX_GetCharsetFromCodePage(FX_CodePage::kFailure));
}
TEST(FXCodePageTest, GetCharsetFromInt) {
EXPECT_EQ(FX_Charset::kANSI, FX_GetCharsetFromInt(0));
EXPECT_EQ(FX_Charset::kDefault, FX_GetCharsetFromInt(1));
EXPECT_EQ(FX_Charset::kSymbol, FX_GetCharsetFromInt(2));
EXPECT_EQ(FX_Charset::kMAC_Roman, FX_GetCharsetFromInt(77));
EXPECT_EQ(FX_Charset::kMAC_ShiftJIS, FX_GetCharsetFromInt(78));
EXPECT_EQ(FX_Charset::kShiftJIS, FX_GetCharsetFromInt(128));
EXPECT_EQ(FX_Charset::kHangul, FX_GetCharsetFromInt(129));
EXPECT_EQ(FX_Charset::kJohab, FX_GetCharsetFromInt(130));
EXPECT_EQ(FX_Charset::kChineseSimplified, FX_GetCharsetFromInt(134));
EXPECT_EQ(FX_Charset::kChineseTraditional, FX_GetCharsetFromInt(136));
EXPECT_EQ(FX_Charset::kMSWin_Greek, FX_GetCharsetFromInt(161));
EXPECT_EQ(FX_Charset::kMSWin_Turkish, FX_GetCharsetFromInt(162));
EXPECT_EQ(FX_Charset::kMSWin_Vietnamese, FX_GetCharsetFromInt(163));
EXPECT_EQ(FX_Charset::kMSWin_Hebrew, FX_GetCharsetFromInt(177));
EXPECT_EQ(FX_Charset::kMSWin_Arabic, FX_GetCharsetFromInt(178));
EXPECT_EQ(FX_Charset::kMSWin_Baltic, FX_GetCharsetFromInt(186));
EXPECT_EQ(FX_Charset::kMSWin_Cyrillic, FX_GetCharsetFromInt(204));
EXPECT_EQ(FX_Charset::kThai, FX_GetCharsetFromInt(222));
EXPECT_EQ(FX_Charset::kMSWin_EasternEuropean, FX_GetCharsetFromInt(238));
EXPECT_EQ(FX_Charset::kOEM, FX_GetCharsetFromInt(255));
// Invalid values return kANSI.
EXPECT_EQ(FX_Charset::kANSI, FX_GetCharsetFromInt(-1));
EXPECT_EQ(FX_Charset::kANSI, FX_GetCharsetFromInt(999));
}
TEST(FXCodePageTest, CharsetFlagForCharset) {
EXPECT_EQ(FX_CharsetFlag::kANSI, FX_CharsetFlagForCharset(FX_Charset::kANSI));
EXPECT_EQ(FX_CharsetFlag::kSymbol,
FX_CharsetFlagForCharset(FX_Charset::kSymbol));
EXPECT_EQ(FX_CharsetFlag::kShiftJIS,
FX_CharsetFlagForCharset(FX_Charset::kShiftJIS));
EXPECT_EQ(FX_CharsetFlag::kHangul,
FX_CharsetFlagForCharset(FX_Charset::kHangul));
EXPECT_EQ(FX_CharsetFlag::kJohab,
FX_CharsetFlagForCharset(FX_Charset::kJohab));
EXPECT_EQ(FX_CharsetFlag::kChineseSimplified,
FX_CharsetFlagForCharset(FX_Charset::kChineseSimplified));
EXPECT_EQ(FX_CharsetFlag::kChineseTraditional,
FX_CharsetFlagForCharset(FX_Charset::kChineseTraditional));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Greek,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Greek));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Turkish,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Turkish));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Vietnamese,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Vietnamese));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Hebrew,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Hebrew));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Arabic,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Arabic));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Baltic,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Baltic));
EXPECT_EQ(FX_CharsetFlag::kMSWin_Cyrillic,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_Cyrillic));
EXPECT_EQ(FX_CharsetFlag::kThai, FX_CharsetFlagForCharset(FX_Charset::kThai));
EXPECT_EQ(FX_CharsetFlag::kMSWin_EasternEuropean,
FX_CharsetFlagForCharset(FX_Charset::kMSWin_EasternEuropean));
EXPECT_EQ(FX_CharsetFlag::kOEM, FX_CharsetFlagForCharset(FX_Charset::kOEM));
// Charsets without an explicit flag return kNone.
EXPECT_EQ(FX_CharsetFlag::kNone,
FX_CharsetFlagForCharset(FX_Charset::kDefault));
EXPECT_EQ(FX_CharsetFlag::kNone, FX_CharsetFlagForCharset(FX_Charset::kUS));
EXPECT_EQ(FX_CharsetFlag::kNone,
FX_CharsetFlagForCharset(static_cast<FX_Charset>(253)));
}
TEST(FXCodePageTest, CharSetIsCJK) {
EXPECT_TRUE(FX_CharSetIsCJK(FX_Charset::kShiftJIS));
EXPECT_TRUE(FX_CharSetIsCJK(FX_Charset::kHangul));
EXPECT_TRUE(FX_CharSetIsCJK(FX_Charset::kChineseSimplified));
EXPECT_TRUE(FX_CharSetIsCJK(FX_Charset::kChineseTraditional));
EXPECT_FALSE(FX_CharSetIsCJK(FX_Charset::kANSI));
EXPECT_FALSE(FX_CharSetIsCJK(FX_Charset::kSymbol));
EXPECT_FALSE(FX_CharSetIsCJK(FX_Charset::kMSWin_Cyrillic));
EXPECT_FALSE(FX_CharSetIsCJK(FX_Charset::kThai));
EXPECT_FALSE(FX_CharSetIsCJK(FX_Charset::kMSWin_EasternEuropean));
}
TEST(FXCodePageTest, CharacterConversion) {
std::array<char, 4> mb_buf;
EXPECT_EQ(4u, FX_WideCharToMultiByte(FX_CodePage::kDefANSI, L"Test", mb_buf));
EXPECT_THAT(mb_buf, ElementsAre('T', 'e', 's', 't'));
std::array<wchar_t, 4> wide_buf;
EXPECT_EQ(4u,
FX_MultiByteToWideChar(FX_CodePage::kDefANSI, "Test", wide_buf));
EXPECT_THAT(wide_buf, ElementsAre(L'T', L'e', L's', L't'));
}