Nikolay Sivov : dwrite/tests: Initial tests for SetLineBreakpoints().
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Aug 29 15:09:57 CDT 2014
Module: wine
Branch: master
Commit: 0dad47ea36eff40a5a35464315bbf2e317bbe22c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dad47ea36eff40a5a35464315bbf2e317bbe22c
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Aug 29 14:29:27 2014 +0400
dwrite/tests: Initial tests for SetLineBreakpoints().
---
dlls/dwrite/tests/analyzer.c | 108 +++++++++++++++++++++++++++++++++++++------
1 file changed, 95 insertions(+), 13 deletions(-)
diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c
index 3b8a074..d4a6a91 100644
--- a/dlls/dwrite/tests/analyzer.c
+++ b/dlls/dwrite/tests/analyzer.c
@@ -1,7 +1,7 @@
/*
* Text analyzing tests
*
- * Copyright 2012 Nikolay Sivov for CodeWeavers
+ * Copyright 2012-2014 Nikolay Sivov for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -167,16 +167,10 @@ static void ok_sequence_(struct call_sequence **seq, int sequence_index,
switch (actual->kind)
{
case ScriptAnalysis:
- {
- const struct script_analysis *sa_act = &actual->sa;
- const struct script_analysis *sa_exp = &expected->sa;
-
- test_uint(sa_act->pos, sa_exp->pos, "position", &ctxt);
- test_uint(sa_act->len, sa_exp->len, "length", &ctxt);
- test_uint(sa_act->shapes, sa_exp->shapes, "shapes", &ctxt);
-
+ test_uint(actual->sa.pos, expected->sa.pos, "position", &ctxt);
+ test_uint(actual->sa.len, expected->sa.len, "length", &ctxt);
+ test_uint(actual->sa.shapes, expected->sa.shapes, "shapes", &ctxt);
break;
- }
default:
ok(0, "%s: callback not handled, %s\n", context, get_analysis_kind_name(actual->kind));
}
@@ -271,13 +265,20 @@ static HRESULT WINAPI analysissink_SetScriptAnalysis(IDWriteTextAnalysisSink *if
return S_OK;
}
+#define BREAKPOINT_COUNT 20
+static DWRITE_LINE_BREAKPOINT g_actual_bp[BREAKPOINT_COUNT];
+
static HRESULT WINAPI analysissink_SetLineBreakpoints(IDWriteTextAnalysisSink *iface,
UINT32 position,
UINT32 length,
DWRITE_LINE_BREAKPOINT const* breakpoints)
{
- ok(0, "unexpected\n");
- return E_NOTIMPL;
+ if (position + length > BREAKPOINT_COUNT) {
+ ok(0, "SetLineBreakpoints: reported pos=%u, len=%u overflows expected length %d\n", position, length, BREAKPOINT_COUNT);
+ return E_FAIL;
+ }
+ memcpy(&g_actual_bp[position], breakpoints, length*sizeof(DWRITE_LINE_BREAKPOINT));
+ return S_OK;
}
static HRESULT WINAPI analysissink_SetBidiLevel(IDWriteTextAnalysisSink *iface,
@@ -794,7 +795,9 @@ static void init_expected_sa(struct call_sequence **seq, const struct sa_test *t
struct call_entry call;
call.kind = ScriptAnalysis;
- call.sa = test->sa[i];
+ call.sa.pos = test->sa[i].pos;
+ call.sa.len = test->sa[i].len;
+ call.sa.shapes = test->sa[i].shapes;
add_call(seq, 0, &call);
}
@@ -825,6 +828,84 @@ static void test_AnalyzeScript(void)
IDWriteTextAnalyzer_Release(analyzer);
}
+struct linebreaks_test {
+ const WCHAR text[BREAKPOINT_COUNT+1];
+ DWRITE_LINE_BREAKPOINT bp[BREAKPOINT_COUNT];
+};
+
+static struct linebreaks_test linebreaks_tests[] = {
+ { {'A','-','B',' ',0xad,'C',0x58a,'D',0x2010,'E',0x2012,'F',0x2013,'\t',0},
+ {
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, TRUE, FALSE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, FALSE, TRUE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_CAN_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, FALSE, FALSE },
+ { DWRITE_BREAK_CONDITION_MAY_NOT_BREAK, DWRITE_BREAK_CONDITION_CAN_BREAK, TRUE, FALSE }
+ }
+ },
+ { { 0 } }
+};
+
+static void compare_breakpoints(const struct linebreaks_test *test, DWRITE_LINE_BREAKPOINT *actual)
+{
+ const WCHAR *text = test->text;
+ int cmp = memcmp(test->bp, actual, sizeof(*actual)*BREAKPOINT_COUNT);
+ ok(!cmp, "%s: got wrong breakpoint data\n", wine_dbgstr_w(test->text));
+ if (cmp) {
+ int i = 0;
+ while (*text) {
+ ok(!memcmp(&test->bp[i], &actual[i], sizeof(*actual)),
+ "%s: got (%d, %d, %d, %d), expected (%d, %d, %d, %d)\n",
+ wine_dbgstr_wn(&test->text[i], 1),
+ g_actual_bp[i].breakConditionBefore,
+ g_actual_bp[i].breakConditionAfter,
+ g_actual_bp[i].isWhitespace,
+ g_actual_bp[i].isSoftHyphen,
+ test->bp[i].breakConditionBefore,
+ test->bp[i].breakConditionAfter,
+ test->bp[i].isWhitespace,
+ test->bp[i].isSoftHyphen);
+ text++;
+ i++;
+ }
+ }
+}
+
+static void test_SetLineBreakpoints(void)
+{
+ const struct linebreaks_test *ptr = linebreaks_tests;
+ IDWriteTextAnalyzer *analyzer;
+ HRESULT hr;
+
+ hr = IDWriteFactory_CreateTextAnalyzer(factory, &analyzer);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ while (*ptr->text)
+ {
+ g_source = ptr->text;
+
+ memset(g_actual_bp, 0, sizeof(g_actual_bp));
+ hr = IDWriteTextAnalyzer_AnalyzeLineBreakpoints(analyzer, &analysissource, 0, lstrlenW(g_source), &analysissink);
+ todo_wine
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ if (hr == S_OK)
+ compare_breakpoints(ptr, g_actual_bp);
+
+ ptr++;
+ }
+
+ IDWriteTextAnalyzer_Release(analyzer);
+}
+
START_TEST(analyzer)
{
HRESULT hr;
@@ -841,6 +922,7 @@ START_TEST(analyzer)
init_call_sequences(expected_seq, 1);
test_AnalyzeScript();
+ test_SetLineBreakpoints();
IDWriteFactory_Release(factory);
}
More information about the wine-cvs
mailing list