[1/9] webservices/tests: Add more tests for repeating element field mappings.
Hans Leidekker
hans at codeweavers.com
Wed Apr 13 06:49:38 CDT 2016
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/tests/reader.c | 105 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 100 insertions(+), 5 deletions(-)
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index 7384cba..02b1c27 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -80,6 +80,30 @@ static const char data12[] =
static const char data13[] =
"<services></services>";
+static const char data14[] =
+ "<services>"
+ "<wrapper>"
+ "<service><id>1</id></service>"
+ "<service><id>2</id></service>"
+ "</wrapper>"
+ "</services>";
+
+static const char data15[] =
+ "<services>"
+ "<wrapper>"
+ "<service>1</service>"
+ "<service>2</service>"
+ "</wrapper>"
+ "</services>";
+
+static const char data16[] =
+ "<services>"
+ "<wrapper>"
+ "<service name='1'>1</service>"
+ "<service name='2'>2</service>"
+ "</wrapper>"
+ "</services>";
+
static void test_WsCreateError(void)
{
HRESULT hr;
@@ -2653,25 +2677,37 @@ static void test_complex_struct_type(void)
static void test_repeating_element(void)
{
+ static const WCHAR oneW[] = {'1',0}, twoW[] = {'2',0};
+ WS_XML_STRING str_name = {4, (BYTE *)"name"};
WS_XML_STRING str_services = {8, (BYTE *)"services"};
WS_XML_STRING str_service = {7, (BYTE *)"service"};
+ WS_XML_STRING str_wrapper = {7, (BYTE *)"wrapper"};
WS_XML_STRING str_id = {2, (BYTE *)"id"};
WS_XML_STRING str_ns = {0, NULL};
HRESULT hr;
WS_XML_READER *reader;
WS_HEAP *heap;
WS_STRUCT_DESCRIPTION s, s2;
- WS_FIELD_DESCRIPTION f, f2, *fields[1], *fields2[1];
+ WS_FIELD_DESCRIPTION f, f2, f3, *fields[1], *fields2[2];
WS_ITEM_RANGE range;
- struct service
- {
- UINT32 id;
- };
+ struct service { UINT32 id; };
+ struct service2 { WCHAR *id; };
+ struct service3 { WCHAR *name; WCHAR *id; };
struct services
{
struct service *service;
ULONG service_count;
} *test;
+ struct services2
+ {
+ struct service2 *service;
+ ULONG service_count;
+ } *test2;
+ struct services3
+ {
+ struct service3 *service;
+ ULONG service_count;
+ } *test3;
hr = WsCreateHeap( 1 << 16, 0, NULL, 0, &heap, NULL );
ok( hr == S_OK, "got %08x\n", hr );
@@ -2721,6 +2757,7 @@ static void test_repeating_element(void)
ok( test->service[0].id == 1, "got %u\n", test->service[0].id );
ok( test->service[1].id == 2, "got %u\n", test->service[1].id );
+ /* item range */
prepare_struct_type_test( reader, data13 );
range.minItemCount = 0;
range.maxItemCount = 1;
@@ -2733,6 +2770,64 @@ static void test_repeating_element(void)
ok( test->service != NULL, "service not set\n" );
ok( !test->service_count, "got %u\n", test->service_count );
+ /* wrapper element */
+ prepare_struct_type_test( reader, data14 );
+ f.itemRange = NULL;
+ f.localName = &str_wrapper;
+ f.ns = &str_ns;
+ test = NULL;
+ hr = WsReadType( reader, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
+ WS_READ_REQUIRED_POINTER, heap, &test, sizeof(test), NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( test != NULL, "test not set\n" );
+ ok( test->service != NULL, "service not set\n" );
+ ok( test->service_count == 2, "got %u\n", test->service_count );
+ ok( test->service[0].id == 1, "got %u\n", test->service[0].id );
+ ok( test->service[1].id == 2, "got %u\n", test->service[1].id );
+
+ /* repeating text field mapping */
+ prepare_struct_type_test( reader, data15 );
+ f2.mapping = WS_TEXT_FIELD_MAPPING;
+ f2.localName = NULL;
+ f2.ns = NULL;
+ f2.type = WS_WSZ_TYPE;
+ s2.size = sizeof(struct service2);
+ s2.alignment = TYPE_ALIGNMENT(struct service2);
+ test2 = NULL;
+ hr = WsReadType( reader, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
+ WS_READ_REQUIRED_POINTER, heap, &test2, sizeof(test2), NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( test2 != NULL, "test2 not set\n" );
+ ok( test2->service != NULL, "service not set\n" );
+ ok( test2->service_count == 2, "got %u\n", test2->service_count );
+ ok( !lstrcmpW( test2->service[0].id, oneW ), "wrong data\n" );
+ ok( !lstrcmpW( test2->service[1].id, twoW ), "wrong data\n" );
+
+ /* repeating attribute field + text field mapping */
+ prepare_struct_type_test( reader, data16 );
+ f2.offset = FIELD_OFFSET(struct service3, id);
+ memset( &f3, 0, sizeof(f3) );
+ f3.mapping = WS_ATTRIBUTE_FIELD_MAPPING;
+ f3.localName = &str_name;
+ f3.ns = &str_ns;
+ f3.type = WS_WSZ_TYPE;
+ fields2[0] = &f3;
+ fields2[1] = &f2;
+ s2.size = sizeof(struct service3);
+ s2.alignment = TYPE_ALIGNMENT(struct service3);
+ s2.fieldCount = 2;
+ test3 = NULL;
+ hr = WsReadType( reader, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
+ WS_READ_REQUIRED_POINTER, heap, &test3, sizeof(test3), NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( test3 != NULL, "test3 not set\n" );
+ ok( test3->service != NULL, "service not set\n" );
+ ok( test3->service_count == 2, "got %u\n", test3->service_count );
+ ok( !lstrcmpW( test3->service[0].name, oneW ), "wrong data\n" );
+ ok( !lstrcmpW( test3->service[0].id, oneW ), "wrong data\n" );
+ ok( !lstrcmpW( test3->service[1].name, twoW ), "wrong data\n" );
+ ok( !lstrcmpW( test3->service[1].id, twoW ), "wrong data\n" );
+
WsFreeReader( reader );
WsFreeHeap( heap );
}
--
2.8.0.rc3
More information about the wine-patches
mailing list