UniscribeHelperTest.cpp [plain text]
#include "config.h"
#include <gtest/gtest.h>
#include "PlatformString.h"
#include "UniscribeHelper.h"
using namespace WebCore;
namespace {
class UniscribeTest : public testing::Test {
public:
UniscribeTest()
{
}
HFONT MakeFont(const wchar_t* fontName, SCRIPT_CACHE** cache)
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = 20;
wcscpy_s(lf.lfFaceName, fontName);
HFONT hfont = CreateFontIndirect(&lf);
if (!hfont)
return 0;
*cache = new SCRIPT_CACHE;
**cache = 0;
createdFonts.append(std::make_pair(hfont, *cache));
return hfont;
}
protected:
SCRIPT_FONTPROPERTIES properties;
private:
virtual void SetUp()
{
memset(&properties, 0, sizeof(SCRIPT_FONTPROPERTIES));
properties.cBytes = sizeof(SCRIPT_FONTPROPERTIES);
properties.wgBlank = ' ';
properties.wgDefault = '?'; properties.wgInvalid = '#'; }
virtual void TearDown()
{
for (size_t i = 0; i < createdFonts.size(); i++) {
DeleteObject(createdFonts[i].first);
ScriptFreeCache(createdFonts[i].second);
delete createdFonts[i].second;
}
createdFonts.clear();
}
Vector< std::pair<HFONT, SCRIPT_CACHE*> > createdFonts;
};
}
TEST_F(UniscribeTest, TooBig)
{
String input(L"e");
for (int i = 0; i < 100000; i++)
input.append(static_cast<UChar>(0x301));
SCRIPT_CACHE* scriptCache;
HFONT hfont = MakeFont(L"Times New Roman", &scriptCache);
ASSERT_TRUE(hfont);
{
UniscribeHelper uniscribe(
input.characters(), static_cast<int>(input.length()),
false, hfont, scriptCache, &properties, 0);
uniscribe.initWithOptionalLengthProtection(false);
ASSERT_EQ(1, uniscribe.m_shapes.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_glyphs.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_logs.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_visualAttributes.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_advance.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_offsets.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_justify.size());
EXPECT_EQ(0, uniscribe.m_shapes[0].m_abc.abcA);
EXPECT_EQ(0, uniscribe.m_shapes[0].m_abc.abcB);
EXPECT_EQ(0, uniscribe.m_shapes[0].m_abc.abcC);
EXPECT_EQ(1, uniscribe.m_runs.size());
EXPECT_EQ(1, uniscribe.m_screenOrder.size());
EXPECT_EQ(0, uniscribe.width());
EXPECT_EQ(0, uniscribe.firstGlyphForCharacter(0));
EXPECT_EQ(0, uniscribe.firstGlyphForCharacter(1000));
EXPECT_EQ(0, uniscribe.xToCharacter(0));
EXPECT_EQ(0, uniscribe.xToCharacter(1000));
}
{
UniscribeHelper uniscribe(
input.characters(), static_cast<int>(input.length()),
false, hfont, scriptCache, &properties, 0);
uniscribe.initWithOptionalLengthProtection(true);
EXPECT_EQ(0, uniscribe.m_runs.size());
EXPECT_EQ(0, uniscribe.m_shapes.size());
EXPECT_EQ(0, uniscribe.m_screenOrder.size());
EXPECT_EQ(0, uniscribe.width());
EXPECT_EQ(0, uniscribe.firstGlyphForCharacter(0));
EXPECT_EQ(0, uniscribe.firstGlyphForCharacter(1000));
EXPECT_EQ(0, uniscribe.xToCharacter(0));
EXPECT_EQ(0, uniscribe.xToCharacter(1000));
}
}