usp10: Add tests for ScriptStringCptoX and ScriptStringXtoCp for activation in later patches.

This commit is contained in:
Jeff Latimer 2006-10-24 19:04:10 +10:00 committed by Alexandre Julliard
parent 37e7de1208
commit a8e5b9ae70
1 changed files with 177 additions and 1 deletions

View File

@ -700,6 +700,181 @@ static void test_ScriptString(void)
}
}
void test_ScriptStringXtoCP_CPtoX(HDC hdc)
{
/*****************************************************************************************
*
* This test is for the ScriptStringXtoCP and ScriptStringXtoCP functions. Due to the
* nature of the fonts between Windows and Wine, the test is implemented by generating
* values using one one function then checking the output of the second. In this way
* the validity of the functions is established using Windows as a base and confirming
* similar behaviour in wine.
*/
HRESULT hr;
WCHAR teststr1[] = {'T', 'e', 's', 't', 'e', '1', '2', ' ', 'a', '\0'};
void *String = (WCHAR *) &teststr1; /* ScriptStringAnalysis needs void */
int String_len = (sizeof(teststr1)/sizeof(WCHAR))-1;
int Glyphs = String_len * 2 + 16; /* size of buffer as recommended */
int Charset = -1; /* unicode */
DWORD Flags = SSA_GLYPHS;
int ReqWidth = 100;
SCRIPT_CONTROL Control;
SCRIPT_STATE State;
SCRIPT_TABDEF Tabdef;
const BYTE InClass = 0;
SCRIPT_STRING_ANALYSIS ssa = NULL;
int Ch; /* Character position in string */
int iTrailing;
int Cp; /* Character position in string */
int X;
BOOL fTrailing;
LOGFONTA lf;
HFONT zfont;
lstrcpyA(lf.lfFaceName, "Symbol");
lf.lfHeight = 10;
lf.lfCharSet = 0;
lf.lfItalic = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfWeight = 400;
lf.lfWidth = 0;
lf.lfPitchAndFamily = 0;
zfont = (HFONT) SelectObject(hdc, CreateFontIndirectA(&lf));
/* Test with hdc, this should be a valid test
* Here we generrate an SCRIPT_STRING_ANALYSIS that will be used as input to the
* following character positions to X and X to character position functions.
*/
hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags,
ReqWidth, &Control, &State, NULL, &Tabdef,
&InClass, &ssa);
todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
todo_wine ok(ssa != NULL, "ScriptStringAnalyse ssa should not be NULL\n");
if (hr == 0)
{
/*
* Loop to generate character positions to provide starting positions for the
* ScriptStringCPtoX and ScriptStringXtoCP functions
*/
for (Cp = 0; Cp < String_len; Cp++)
{
/* The fTrailing flag is used to indicate whether the X being returned is at
* the beginning or the end of the character. What happens here is that if
* fTrailing indicates the end of the character, ie. FALSE, then ScriptStringXtoCP
* returns the beginning of the next character and iTrailing is FALSE. So for this
* loop iTrailing will be FALSE in both cases.
*/
fTrailing = FALSE;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
todo_wine ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
iTrailing, X);
fTrailing = TRUE;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
/*
* Check that character position returned by ScriptStringXtoCP in Ch matches the
* one input to ScriptStringCPtoX. This means that the Cp to X position and back
* again works
*/
todo_wine ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
iTrailing, X);
}
/*
* This test is to check that if the X position is just inside the trailing edge of the
* character then iTrailing will indicate the trailing edge, ie. TRUE
*/
fTrailing = TRUE;
Cp = 3;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
X--; /* put X just inside the trailing edge */
hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
todo_wine ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
iTrailing, X);
/*
* This test is to check that if the X position is just outside the trailing edge of the
* character then iTrailing will indicate the leading edge, ie. FALSE, and Ch will indicate
* the next character, ie. Cp + 1
*/
fTrailing = TRUE;
Cp = 3;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
X++; /* put X just outside the trailing edge */
hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
todo_wine ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
iTrailing, X);
/*
* This test is to check that if the X position is just outside the leading edge of the
* character then iTrailing will indicate the trailing edge, ie. TRUE, and Ch will indicate
* the next character down , ie. Cp - 1
*/
fTrailing = FALSE;
Cp = 3;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
X--; /* put X just outside the leading edge */
hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
todo_wine ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, X);
todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
iTrailing, X);
/*
* Cleanup the the SSA for the next round of tests
*/
hr = ScriptStringFree(&ssa);
todo_wine ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr);
/*
* Test to see that exceeding the number of chars returns E_INVALIDARG. First
* generate an SSA for the subsequent tests.
*/
hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags,
ReqWidth, &Control, &State, NULL, &Tabdef,
&InClass, &ssa);
todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
/*
* When ScriptStringCPtoX is called with a character position Cp that exceeds the
* string length, return E_INVALIDARG. This also invalidates the ssa so a
* ScriptStringFree should also fail.
*/
fTrailing = FALSE;
Cp = String_len + 1;
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
todo_wine ok(hr == E_INVALIDARG, "ScriptStringCPtoX should return E_INVALIDARG not %08x\n", hr);
hr = ScriptStringFree(&ssa);
/*
* ScriptStringCPtoX should free ssa, hence ScriptStringFree should fail
*/
todo_wine ok(hr == E_INVALIDARG, "ScriptStringFree should return E_INVALIDARG not %08x\n", hr);
}
}
void test_ScriptCacheGetHeight(HDC hdc)
{
HRESULT hr;
@ -1078,8 +1253,9 @@ START_TEST(usp10)
test_ScriptTextOut();
test_ScriptXtoX();
test_ScriptString();
test_ScriptLayout();
test_ScriptStringXtoCP_CPtoX(hdc);
test_ScriptLayout();
test_digit_substitution();
ReleaseDC(hwnd, hdc);