mirror of
https://github.com/diasurgical/DevilutionX.git
synced 2026-11-07 09:26:09 -10:00
205 lines
5.2 KiB
C++
205 lines
5.2 KiB
C++
|
|
#include <string_view>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "utils/sheen_bidi.hpp"
|
|
|
|
namespace devilution {
|
|
namespace {
|
|
|
|
TEST(SheenBidiTest, AlgorithmCreated)
|
|
{
|
|
sb::Algorithm algorithm = sb::Algorithm::create("Hello");
|
|
EXPECT_TRUE(algorithm);
|
|
EXPECT_NE(algorithm.get(), nullptr);
|
|
}
|
|
|
|
TEST(SheenBidiTest, CreateParagraphEnglish)
|
|
{
|
|
std::string_view text = "Hello, World!";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
EXPECT_TRUE(paragraph);
|
|
}
|
|
|
|
TEST(SheenBidiTest, CreateParagraphHebrew)
|
|
{
|
|
std::string_view text = "שלום עולם";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultRTL);
|
|
EXPECT_TRUE(paragraph);
|
|
}
|
|
|
|
TEST(SheenBidiTest, CreateParagraphMixed)
|
|
{
|
|
std::string_view text = "Hello שלום World";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
EXPECT_TRUE(paragraph);
|
|
}
|
|
|
|
TEST(SheenBidiTest, CreateLineFromParagraph)
|
|
{
|
|
std::string_view text = "Hello, World!";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
EXPECT_TRUE(paragraph);
|
|
|
|
sb::Line line = paragraph.createLine(0, text.size());
|
|
EXPECT_TRUE(line);
|
|
}
|
|
|
|
TEST(SheenBidiTest, GetRunsFromLine)
|
|
{
|
|
std::string_view text = "Hello, World!";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
sb::Line line = paragraph.createLine(0, text.size());
|
|
|
|
SBUInteger runCount = line.runCount();
|
|
EXPECT_GT(runCount, 0);
|
|
|
|
const SBRun *runs = line.runsPtr();
|
|
EXPECT_NE(runs, nullptr);
|
|
}
|
|
|
|
TEST(SheenBidiTest, IsRTLDetectsLTRRun)
|
|
{
|
|
SBRun run;
|
|
run.level = 0; // LTR (even level)
|
|
|
|
EXPECT_FALSE(sb::IsRTL(run));
|
|
}
|
|
|
|
TEST(SheenBidiTest, IsRTLDetectsRTLRun)
|
|
{
|
|
SBRun run;
|
|
run.level = 1; // RTL (odd level)
|
|
|
|
EXPECT_TRUE(sb::IsRTL(run));
|
|
}
|
|
|
|
TEST(SheenBidiTest, MixedLanguageAnalysis)
|
|
{
|
|
std::string_view text = "Hello שלום World";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
EXPECT_TRUE(paragraph);
|
|
|
|
sb::Line line = paragraph.createLine(0, text.size());
|
|
EXPECT_TRUE(line);
|
|
|
|
SBUInteger runCount = line.runCount();
|
|
EXPECT_GT(runCount, 0);
|
|
|
|
// We expect multiple runs due to the directional changes
|
|
// (English -> Hebrew -> English)
|
|
const SBRun *runs = line.runsPtr();
|
|
EXPECT_NE(runs, nullptr);
|
|
|
|
// Verify each run has valid level
|
|
for (const SBRun &run : line.runs()) {
|
|
EXPECT_GE(run.level, 0);
|
|
EXPECT_LE(run.level, 125); // Max bidi level according to Unicode spec
|
|
}
|
|
}
|
|
|
|
TEST(SheenBidiTest, ParagraphCopySemantics)
|
|
{
|
|
std::string_view text = "Test";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph para1(algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR));
|
|
EXPECT_TRUE(para1);
|
|
|
|
// Copy constructor
|
|
sb::Paragraph para2 = para1;
|
|
EXPECT_TRUE(para2);
|
|
EXPECT_EQ(para1.get(), para2.get());
|
|
}
|
|
|
|
TEST(SheenBidiTest, ParagraphMoveSemantics)
|
|
{
|
|
std::string_view text = "Test";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph para1(algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR));
|
|
EXPECT_TRUE(para1);
|
|
|
|
// Move constructor
|
|
sb::Paragraph para2 = std::move(para1);
|
|
EXPECT_TRUE(para2);
|
|
EXPECT_FALSE(para1);
|
|
EXPECT_EQ(para1.get(), nullptr);
|
|
}
|
|
|
|
TEST(SheenBidiTest, LineCopySemantics)
|
|
{
|
|
std::string_view text = "Test";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
sb::Line line1(SBParagraphCreateLine(paragraph.get(), 0, text.size()));
|
|
EXPECT_TRUE(line1);
|
|
|
|
// Copy constructor
|
|
sb::Line line2 = line1;
|
|
EXPECT_TRUE(line2);
|
|
EXPECT_EQ(line1.get(), line2.get());
|
|
}
|
|
|
|
TEST(SheenBidiTest, LineMoveSemantics)
|
|
{
|
|
std::string_view text = "Test";
|
|
sb::Algorithm algorithm = sb::Algorithm::create(text);
|
|
|
|
sb::Paragraph paragraph = algorithm.createParagraph(0, text.size(), SBLevelDefaultLTR);
|
|
sb::Line line1(SBParagraphCreateLine(paragraph.get(), 0, text.size()));
|
|
EXPECT_TRUE(line1);
|
|
|
|
// Move constructor
|
|
sb::Line line2 = std::move(line1);
|
|
EXPECT_TRUE(line2);
|
|
EXPECT_FALSE(line1);
|
|
EXPECT_EQ(line1.get(), nullptr);
|
|
}
|
|
|
|
TEST(SheenBidiTest, AlgorithmPointerOperations)
|
|
{
|
|
sb::Algorithm algorithm = sb::Algorithm::create("Hello");
|
|
EXPECT_TRUE(algorithm);
|
|
EXPECT_NE(algorithm.get(), nullptr);
|
|
|
|
// Test nullptr comparison
|
|
EXPECT_FALSE(algorithm == nullptr);
|
|
EXPECT_TRUE(algorithm != nullptr);
|
|
EXPECT_FALSE(nullptr == algorithm);
|
|
EXPECT_TRUE(nullptr != algorithm);
|
|
}
|
|
|
|
TEST(SheenBidiTest, ParagraphPointerNullptr)
|
|
{
|
|
sb::Paragraph paragraph;
|
|
EXPECT_FALSE(paragraph);
|
|
EXPECT_EQ(paragraph.get(), nullptr);
|
|
EXPECT_TRUE(paragraph == nullptr);
|
|
}
|
|
|
|
TEST(SheenBidiTest, LinePointerNullptr)
|
|
{
|
|
sb::Line line;
|
|
EXPECT_FALSE(line);
|
|
EXPECT_EQ(line.get(), nullptr);
|
|
EXPECT_TRUE(line == nullptr);
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace devilution
|