usp10/tests: Refactor test_ScriptXtoX to make testing varying datasets easier.
This commit is contained in:
parent
176555354c
commit
126c779832
|
@ -1808,80 +1808,107 @@ static void test_ScriptTextOut3(HDC hdc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define test_item_ScriptXtoX(a,b,c,d,e,f) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_item_ScriptXtoX(a,b,c,d,e,f)
|
||||||
|
|
||||||
|
static void _test_item_ScriptXtoX(SCRIPT_ANALYSIS *psa, int cChars, int cGlyphs, const int* offsets, const WORD *pwLogClust, const int* piAdvance )
|
||||||
|
{
|
||||||
|
int iX, iCP;
|
||||||
|
int icChars, icGlyphs;
|
||||||
|
int piCP, piX;
|
||||||
|
HRESULT hr;
|
||||||
|
SCRIPT_VISATTR psva[10];
|
||||||
|
int piTrailing;
|
||||||
|
BOOL fTrailing;
|
||||||
|
int direction;
|
||||||
|
|
||||||
|
memset(psva,0,sizeof(psva));
|
||||||
|
direction = (psa->fRTL)?-1:+1;
|
||||||
|
|
||||||
|
for(iCP = 0; iCP < cChars; iCP++)
|
||||||
|
{
|
||||||
|
iX = offsets[iCP];
|
||||||
|
icChars = cChars;
|
||||||
|
icGlyphs = cGlyphs;
|
||||||
|
hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing);
|
||||||
|
winetest_ok(hr == S_OK, "ScriptXtoCP: should return S_OK not %08x\n", hr);
|
||||||
|
winetest_ok(piCP == iCP, "ScriptXtoCP: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
||||||
|
winetest_ok(piTrailing == 0, "ScriptXtoCP: iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(iCP = 0; iCP < cChars; iCP++)
|
||||||
|
{
|
||||||
|
iX = offsets[iCP]+direction;
|
||||||
|
icChars = cChars;
|
||||||
|
icGlyphs = cGlyphs;
|
||||||
|
hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing);
|
||||||
|
winetest_ok(hr == S_OK, "ScriptXtoCP leading: should return S_OK not %08x\n", hr);
|
||||||
|
winetest_ok(piCP == iCP, "ScriptXtoCP leading: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
||||||
|
winetest_ok(piTrailing == 0, "ScriptXtoCP leading: iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(iCP = 0; iCP < cChars; iCP++)
|
||||||
|
{
|
||||||
|
iX = offsets[iCP+1]-direction;
|
||||||
|
icChars = cChars;
|
||||||
|
icGlyphs = cGlyphs;
|
||||||
|
hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing);
|
||||||
|
winetest_ok(hr == S_OK, "ScriptXtoCP trailing: should return S_OK not %08x\n", hr);
|
||||||
|
winetest_ok(piCP == iCP, "ScriptXtoCP trailing: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
||||||
|
winetest_ok(piTrailing == 1, "ScriptXtoCP trailing: iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(iCP = 0; iCP <= cChars+1; iCP++)
|
||||||
|
{
|
||||||
|
fTrailing = FALSE;
|
||||||
|
icChars = cChars;
|
||||||
|
icGlyphs = cGlyphs;
|
||||||
|
hr = ScriptCPtoX(iCP, fTrailing, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piX);
|
||||||
|
winetest_ok(hr == S_OK, "ScriptCPtoX: should return S_OK not %08x\n", hr);
|
||||||
|
winetest_ok(piX == offsets[iCP],
|
||||||
|
"ScriptCPtoX: iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP], piX);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(iCP = 0; iCP <= cChars+1; iCP++)
|
||||||
|
{
|
||||||
|
fTrailing = TRUE;
|
||||||
|
icChars = cChars;
|
||||||
|
icGlyphs = cGlyphs;
|
||||||
|
hr = ScriptCPtoX(iCP, fTrailing, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piX);
|
||||||
|
winetest_ok(hr == S_OK, "ScriptCPtoX trailing: should return S_OK not %08x\n", hr);
|
||||||
|
winetest_ok(piX == offsets[iCP+1],
|
||||||
|
"ScriptCPtoX trailing: iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP+direction], piX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void test_ScriptXtoX(void)
|
static void test_ScriptXtoX(void)
|
||||||
/****************************************************************************************
|
/****************************************************************************************
|
||||||
* This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables *
|
* This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables *
|
||||||
****************************************************************************************/
|
****************************************************************************************/
|
||||||
{
|
{
|
||||||
static const WCHAR test[] = {'t', 'e', 's', 't',0};
|
|
||||||
SCRIPT_ITEM items[2];
|
|
||||||
int iX, iCP;
|
|
||||||
int cChars;
|
|
||||||
int cGlyphs;
|
|
||||||
WORD pwLogClust[10] = {0, 0, 0, 1, 1, 2, 2, 3, 3, 3};
|
WORD pwLogClust[10] = {0, 0, 0, 1, 1, 2, 2, 3, 3, 3};
|
||||||
WORD pwLogClust_RTL[10] = {3, 3, 3, 2, 2, 1, 1, 0, 0, 0};
|
WORD pwLogClust_RTL[10] = {3, 3, 3, 2, 2, 1, 1, 0, 0, 0};
|
||||||
|
int piAdvance[10] = {201, 190, 210, 180, 170, 204, 189, 195, 212, 203};
|
||||||
|
static const int offsets[13] = {0, 67, 134, 201, 296, 391, 496, 601, 1052, 1503, 1954, 1954, 1954};
|
||||||
|
static const int offsets_RTL[13] = {781, 721, 661, 601, 496, 391, 296, 201, 134, 67, 0, 0, 0};
|
||||||
SCRIPT_VISATTR psva[10];
|
SCRIPT_VISATTR psva[10];
|
||||||
int piAdvance[10] = {200, 190, 210, 180, 170, 204, 189, 195, 212, 203};
|
SCRIPT_ANALYSIS sa;
|
||||||
int piCP, piX;
|
int iX;
|
||||||
|
int piCP;
|
||||||
int piTrailing;
|
int piTrailing;
|
||||||
BOOL fTrailing;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
static const int offsets[13] = {0, 66, 133, 200, 295, 390, 495, 600, 1051, 1502, 1953, 1953, 1953};
|
|
||||||
static const int offsets_RTL[13] = {780, 720, 660, 600, 495, 390, 295, 200, 133, 66, 0, 0, 0};
|
|
||||||
|
|
||||||
hr = ScriptItemize(test, lstrlenW(test), sizeof(items)/sizeof(items[0]), NULL, NULL, items, NULL);
|
memset(&sa, 0 , sizeof(SCRIPT_ANALYSIS));
|
||||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
|
||||||
|
|
||||||
iX = -1;
|
sa.fRTL = FALSE;
|
||||||
cChars = 10;
|
hr = ScriptXtoCP(-1, 10, 10, pwLogClust, psva, piAdvance, &sa, &piCP, &piTrailing);
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
||||||
if (piTrailing)
|
if (piTrailing)
|
||||||
ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
|
ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
|
||||||
else /* win2k3 */
|
else /* win2k3 */
|
||||||
ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP);
|
ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP);
|
||||||
|
|
||||||
for(iCP = 0; iCP < 10; iCP++)
|
sa.fRTL = TRUE;
|
||||||
{
|
hr = ScriptXtoCP(-1, 10, 10, pwLogClust_RTL, psva, piAdvance, &sa, &piCP, &piTrailing);
|
||||||
iX = offsets[iCP]+1;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 0, "iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(iCP = 0; iCP < 10; iCP++)
|
|
||||||
{
|
|
||||||
iX = offsets[iCP+1]-1;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 0,1,2 are actually fractional offsets meaning that they will not be reporting the same iCP as comes in so don't test those */
|
|
||||||
for(iCP = 3; iCP < 10; iCP++)
|
|
||||||
{
|
|
||||||
iX = offsets[iCP];
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 0, "iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
items[0].a.fRTL = TRUE;
|
|
||||||
|
|
||||||
iX = -1;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
||||||
if (piTrailing)
|
if (piTrailing)
|
||||||
ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
|
ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
|
||||||
|
@ -1889,93 +1916,15 @@ static void test_ScriptXtoX(void)
|
||||||
ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP);
|
ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP);
|
||||||
|
|
||||||
iX = 1954;
|
iX = 1954;
|
||||||
cChars = 10;
|
hr = ScriptXtoCP(1954, 10, 10, pwLogClust_RTL, psva, piAdvance, &sa, &piCP, &piTrailing);
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
||||||
ok(piCP == -1, "iX=%d should return piCP=-1 not %d\n", iX, piCP);
|
ok(piCP == -1, "iX=%d should return piCP=-1 not %d\n", iX, piCP);
|
||||||
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
||||||
|
|
||||||
for(iCP = 0; iCP < 10; iCP++)
|
sa.fRTL = FALSE;
|
||||||
{
|
test_item_ScriptXtoX(&sa, 10, 10, offsets, pwLogClust, piAdvance);
|
||||||
iX = offsets_RTL[iCP]-1;
|
sa.fRTL = TRUE;
|
||||||
cChars = 10;
|
test_item_ScriptXtoX(&sa, 10, 10, offsets_RTL, pwLogClust_RTL, piAdvance);
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 0, "iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(iCP = 0; iCP < 10; iCP++)
|
|
||||||
{
|
|
||||||
iX = offsets_RTL[iCP+1]+1;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(iCP = 0; iCP < 10; iCP++)
|
|
||||||
{
|
|
||||||
iX = offsets_RTL[iCP];
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piCP, &piTrailing);
|
|
||||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr);
|
|
||||||
ok(piCP == iCP, "iX=%d should return piCP=%d not %d\n", iX, iCP, piCP);
|
|
||||||
ok(piTrailing == 0, "iX=%d should return piTrailing=0 not %d\n", iX, piTrailing);
|
|
||||||
}
|
|
||||||
|
|
||||||
items[0].a.fRTL = FALSE;
|
|
||||||
|
|
||||||
for(iCP = 0; iCP <= 11; iCP++)
|
|
||||||
{
|
|
||||||
fTrailing = FALSE;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX);
|
|
||||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr);
|
|
||||||
ok(piX == offsets[iCP],
|
|
||||||
"iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP], piX);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(iCP = 0; iCP <= 11; iCP++)
|
|
||||||
{
|
|
||||||
fTrailing = TRUE;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX);
|
|
||||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr);
|
|
||||||
ok(piX == offsets[iCP+1],
|
|
||||||
"iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP+1], piX);
|
|
||||||
}
|
|
||||||
|
|
||||||
items[0].a.fRTL = TRUE;
|
|
||||||
|
|
||||||
for(iCP = 0; iCP <= 11; iCP++)
|
|
||||||
{
|
|
||||||
fTrailing = FALSE;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piX);
|
|
||||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr);
|
|
||||||
ok(piX == offsets_RTL[iCP],
|
|
||||||
"iCP=%d should return piX=%d not %d\n", iCP, offsets_RTL[iCP], piX);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(iCP = 0; iCP <= 11; iCP++)
|
|
||||||
{
|
|
||||||
fTrailing = TRUE;
|
|
||||||
cChars = 10;
|
|
||||||
cGlyphs = 10;
|
|
||||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust_RTL, psva, piAdvance, &items[0].a, &piX);
|
|
||||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr);
|
|
||||||
ok(piX == offsets_RTL[iCP+1],
|
|
||||||
"iCP=%d should return piX=%d not %d\n", iCP, offsets_RTL[iCP+1], piX);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ScriptString(HDC hdc)
|
static void test_ScriptString(HDC hdc)
|
||||||
|
|
Loading…
Reference in New Issue