blob: 3469969aa777f02e4dc7dd9c09c3a772b3311f41 [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/cfx_bidi_resolver.h"
#include "testing/gtest/include/gtest/gtest.h"
TEST(fxcrt, BidiResolverPureLTR) {
auto resolver = CFX_BidiResolver::Create(
u"abc", CFX_BidiResolver::ParagraphDirection::kLeftToRight);
ASSERT_TRUE(resolver);
auto runs = resolver->GetVisualRunsForLine(0, 3);
ASSERT_EQ(1u, runs.size());
EXPECT_EQ(0, runs[0].start);
EXPECT_EQ(3, runs[0].length);
EXPECT_FALSE(runs[0].is_rtl);
}
TEST(fxcrt, BidiResolverPureRTL) {
// Hebrew characters Aleph, Bet, Gimel (RTL characters).
auto resolver = CFX_BidiResolver::Create(
u"\x05D0\x05D1\x05D2",
CFX_BidiResolver::ParagraphDirection::kRightToLeft);
ASSERT_TRUE(resolver);
auto runs = resolver->GetVisualRunsForLine(0, 3);
ASSERT_EQ(1u, runs.size());
EXPECT_EQ(0, runs[0].start);
EXPECT_EQ(3, runs[0].length);
EXPECT_TRUE(runs[0].is_rtl);
}
TEST(fxcrt, BidiResolverMixed) {
auto resolver = CFX_BidiResolver::Create(
u"ab \x05D0\x05D1 cd",
CFX_BidiResolver::ParagraphDirection::kLeftToRight);
ASSERT_TRUE(resolver);
auto runs = resolver->GetVisualRunsForLine(0, 8);
ASSERT_EQ(3u, runs.size());
// "ab " (LTR) -> "Aleph Bet" (RTL) -> " cd" (LTR)
EXPECT_EQ(0, runs[0].start);
EXPECT_EQ(3, runs[0].length);
EXPECT_FALSE(runs[0].is_rtl);
EXPECT_EQ(3, runs[1].start);
EXPECT_EQ(2, runs[1].length);
EXPECT_TRUE(runs[1].is_rtl);
EXPECT_EQ(5, runs[2].start);
EXPECT_EQ(3, runs[2].length);
EXPECT_FALSE(runs[2].is_rtl);
}
TEST(fxcrt, BidiResolverLineWrap) {
auto resolver = CFX_BidiResolver::Create(
u"abc def ghi", CFX_BidiResolver::ParagraphDirection::kLeftToRight);
ASSERT_TRUE(resolver);
// Get runs for the middle word "def "
auto runs = resolver->GetVisualRunsForLine(4, 4);
ASSERT_EQ(1u, runs.size());
EXPECT_EQ(4, runs[0].start);
EXPECT_EQ(4, runs[0].length);
EXPECT_FALSE(runs[0].is_rtl);
}
TEST(fxcrt, BidiResolverEmpty) {
auto resolver = CFX_BidiResolver::Create(
std::u16string(), CFX_BidiResolver::ParagraphDirection::kAuto);
// Just proving it doesn't crash or leak memory.
EXPECT_FALSE(resolver);
}