Module: wine Branch: master Commit: 98a8989908bd9eca06fed22368e4e61049c65e27 URL: http://source.winehq.org/git/wine.git/?a=commit;h=98a8989908bd9eca06fed22368...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Apr 5 11:56:05 2017 +0300
dwrite/tests: Some bidi resolution tests.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/tests/analyzer.c | 141 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 135 insertions(+), 6 deletions(-)
diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c index 21809ee..7af19d7 100644 --- a/dlls/dwrite/tests/analyzer.c +++ b/dlls/dwrite/tests/analyzer.c @@ -34,6 +34,16 @@ static IDWriteFactory *factory; static const WCHAR test_fontfile[] = {'w','i','n','e','_','t','e','s','t','_','f','o','n','t','.','t','t','f',0};
+#define LRE 0x202a +#define RLE 0x202b +#define PDF 0x202c +#define LRO 0x202d +#define RLO 0x202e +#define LRI 0x2066 +#define RLI 0x2067 +#define FSI 0x2068 +#define PDI 0x2069 + enum analysis_kind { ScriptAnalysis, LastKind @@ -894,14 +904,14 @@ static struct sa_test sa_tests[] = { }, { /* LRE/PDF */ - {0x202a,0x202c,'a','b','c','\r',0}, 3, + {LRE,PDF,'a','b','c','\r',0}, 3, { { 0, 2, DWRITE_SCRIPT_SHAPES_NO_VISUAL }, { 2, 3, DWRITE_SCRIPT_SHAPES_DEFAULT }, { 5, 1, DWRITE_SCRIPT_SHAPES_NO_VISUAL } } }, { /* LRE/PDF and other visual and non-visual codes from Common script range */ - {0x202a,0x202c,'r','!',0x200b,'\r',0}, 3, + {LRE,PDF,'r','!',0x200b,'\r',0}, 3, { { 0, 2, DWRITE_SCRIPT_SHAPES_NO_VISUAL }, { 2, 2, DWRITE_SCRIPT_SHAPES_DEFAULT }, { 4, 2, DWRITE_SCRIPT_SHAPES_NO_VISUAL } } @@ -2227,6 +2237,7 @@ struct bidi_test DWRITE_READING_DIRECTION direction; UINT8 explicit[BIDI_LEVELS_COUNT]; UINT8 resolved[BIDI_LEVELS_COUNT]; + BOOL todo; };
static const struct bidi_test bidi_tests[] = { @@ -2267,14 +2278,132 @@ static const struct bidi_test bidi_tests[] = { { 0, 0, 0 } }, { + { LRE, PDF, 'a', 'b', 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 2, 2, 0, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { + { 'a', LRE, PDF, 'b', 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 0, 2, 2, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { + { RLE, PDF, 'a', 'b', 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 1, 1, 0, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { + { 'a', RLE, PDF, 'b', 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 0, 1, 1, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { + { 'a', RLE, PDF, 'b', 0 }, + DWRITE_READING_DIRECTION_RIGHT_TO_LEFT, + { 1, 3, 3, 1 }, + { 2, 2, 2, 2 }, + TRUE + }, + { + { LRE, PDF, 'a', 'b', 0 }, + DWRITE_READING_DIRECTION_RIGHT_TO_LEFT, + { 2, 2, 1, 1 }, + { 1, 1, 2, 2 }, + TRUE + }, + { + { PDF, 'a', 'b', 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } + }, + { + { LRE, 'a', 'b', PDF, 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 2, 2, 2, 2 }, + { 0, 2, 2, 2 }, + TRUE + }, + { + { LRI, 'a', 'b', PDI, 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { + { RLI, 'a', 'b', PDI, 0 }, + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + TRUE + }, + { { 0 } } };
-static void compare_bidi_levels(const struct bidi_test *test, UINT32 len, UINT8 *explicit, UINT8 *resolved) +static void compare_bidi_levels(unsigned int seq, const struct bidi_test *test, UINT32 len, UINT8 *explicit, UINT8 *resolved) { - ok(!memcmp(explicit, test->explicit, len), "wrong explicit levels\n"); - ok(!memcmp(resolved, test->resolved, len), "wrong resolved levels\n"); + unsigned int i, failcount = 0; + BOOL match; + + match = !memcmp(explicit, test->explicit, len); + if (!match) { + if (test->todo) { + failcount++; + todo_wine + ok(0, "test %u: %s wrong explicit levels:\n", seq, wine_dbgstr_w(test->text)); + } + else + ok(0, "test %u: %s wrong explicit levels:\n", seq, wine_dbgstr_w(test->text)); + + for (i = 0; i < len; i++) { + if (test->explicit[i] != explicit[i]) { + if (test->todo) { + failcount++; + todo_wine + ok(0, "\tat %u, explicit level %u, expected %u\n", i, explicit[i], test->explicit[i]); + } + else + ok(0, "\tat %u, explicit level %u, expected %u\n", i, explicit[i], test->explicit[i]); + } + } + } + + match = !memcmp(resolved, test->resolved, len); + if (!match) { + if (test->todo) { + failcount++; + todo_wine + ok(0, "test %u: %s wrong resolved levels:\n", seq, wine_dbgstr_w(test->text)); + } + else + ok(0, "test %u: %s wrong resolved levels:\n", seq, wine_dbgstr_w(test->text)); + + for (i = 0; i < len; i++) { + if (test->resolved[i] != resolved[i]) { + if (test->todo) { + failcount++; + todo_wine + ok(0, "\tat %u, resolved level %u, expected %u\n", i, resolved[i], test->resolved[i]); + } + else + ok(0, "\tat %u, resolved level %u, expected %u\n", i, resolved[i], test->resolved[i]); + } + } + } + + todo_wine_if(test->todo && failcount == 0) + ok(1, "test %u: marked as "todo_wine" but succeeds\n", seq); }
static void test_AnalyzeBidi(void) @@ -2307,7 +2436,7 @@ static void test_AnalyzeBidi(void) hr = IDWriteTextAnalyzer_AnalyzeBidi(analyzer, &analysissource.IDWriteTextAnalysisSource_iface, 0, len, &analysissink); ok(hr == S_OK, "%u: got 0x%08x\n", i, hr); - compare_bidi_levels(ptr, len, g_explicit_levels, g_resolved_levels); + compare_bidi_levels(i, ptr, len, g_explicit_levels, g_resolved_levels);
i++; ptr++;