webservices/tests: Add test for binary encoding nested structure handling.

Add a test for a nested structure with an optional ending element.

Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Connor McAdams 2022-04-18 13:13:08 -04:00 committed by Alexandre Julliard
parent 6d4ec1255a
commit 0913f72e63
1 changed files with 87 additions and 2 deletions

View File

@ -4874,6 +4874,8 @@ static const WS_XML_TEXT_NODE *read_text_node( WS_XML_READER *reader )
static void test_binary_encoding(void)
{
WS_XML_STRING str_s = {1, (BYTE *)"s"}, str_s_a = {3, (BYTE *)"s_a"}, str_s_b = {3, (BYTE *)"s_b"};
WS_XML_STRING str_a = {1, (BYTE *)"a"}, str_b = {1, (BYTE *)"b"};
static WS_XML_STRING localname = {1, (BYTE *)"t"}, ns = {0, NULL};
static const char test[] =
{0x40,0x01,'t',0x01};
@ -4949,6 +4951,9 @@ static void test_binary_encoding(void)
{0x40,0x01,'t',0x05,0x02,'p','2',0x01,'t',0x98,0x04,'t','e','s','t',0x09,0x02,'p','2',0x02,'n','s',0x01};
static const char test200[] =
{0x02,0x07,'c','o','m','m','e','n','t'};
static const char test_endelem[] =
{ 0x40, 0x01, 't', 0x40, 0x01, 'a', 0x83, 0x40, 0x01, 's', 0x40, 0x03, 's', '_', 'a', 0x82, 0x01, 0x01,
0x40, 0x01, 'b', 0x83, 0x01 };
const WS_XML_NODE *node;
const WS_XML_TEXT_NODE *text_node;
const WS_XML_ELEMENT_NODE *elem;
@ -4969,8 +4974,8 @@ static void test_binary_encoding(void)
WS_HEAP *heap;
BOOL found;
HRESULT hr;
WS_STRUCT_DESCRIPTION s;
WS_FIELD_DESCRIPTION f, *fields[1];
WS_STRUCT_DESCRIPTION s, s2;
WS_FIELD_DESCRIPTION f, f1[3], f2[2], *fields[3], *fields2[2];
struct typetest
{
WS_BYTES data;
@ -4983,6 +4988,17 @@ static void test_binary_encoding(void)
{
UINT64 val;
} *typetest3;
struct s
{
INT32 s_a;
INT32 s_b;
};
struct test
{
INT32 a;
struct s *s;
INT32 b;
} *test_struct;
hr = WsGetDictionary( WS_ENCODING_XML_BINARY_1, &dict, NULL );
ok( hr == S_OK, "got %#lx\n", hr );
@ -5689,6 +5705,75 @@ static void test_binary_encoding(void)
WS_READ_REQUIRED_POINTER, heap, &typetest3, sizeof(typetest3), NULL );
ok( hr == WS_E_NUMERIC_OVERFLOW, "got %#lx\n", hr );
/* Test optional ending field on a nested struct. */
hr = set_input_bin( reader, test_endelem, sizeof(test_endelem), NULL );
ok( hr == S_OK, "got %#lx\n", hr );
memset( &f1[0], 0, sizeof(f1[0]) );
f1[0].mapping = WS_ELEMENT_FIELD_MAPPING;
f1[0].localName = &str_a;
f1[0].ns = &ns;
f1[0].type = WS_INT32_TYPE;
fields[0] = &f1[0];
memset( &f1[1], 0, sizeof(f1[1]) );
f1[1].mapping = WS_ELEMENT_FIELD_MAPPING;
f1[1].localName = &str_s;
f1[1].ns = &ns;
f1[1].type = WS_STRUCT_TYPE;
f1[1].typeDescription = &s2;
f1[1].options = WS_FIELD_POINTER;
f1[1].offset = FIELD_OFFSET(struct test, s);
fields[1] = &f1[1];
memset( &f1[2], 0, sizeof(f1[2]) );
f1[2].mapping = WS_ELEMENT_FIELD_MAPPING;
f1[2].localName = &str_b;
f1[2].ns = &ns;
f1[2].type = WS_INT32_TYPE;
f1[2].offset = FIELD_OFFSET(struct test, b);
fields[2] = &f1[2];
memset( &f2[0], 0, sizeof(f2[0]) );
f2[0].mapping = WS_ELEMENT_FIELD_MAPPING;
f2[0].localName = &str_s_a;
f2[0].ns = &ns;
f2[0].type = WS_INT32_TYPE;
fields2[0] = &f2[0];
memset( &f2[1], 0, sizeof(f2[1]) );
f2[1].mapping = WS_ELEMENT_FIELD_MAPPING;
f2[1].localName = &str_s_b;
f2[1].ns = &ns;
f2[1].type = WS_INT32_TYPE;
f2[1].offset = FIELD_OFFSET(struct s, s_b);
f2[1].options = WS_FIELD_OPTIONAL;
fields2[1] = &f2[1];
memset( &s2, 0, sizeof(s2) );
s2.size = sizeof(struct s);
s2.alignment = TYPE_ALIGNMENT(struct s);
s2.fields = fields2;
s2.fieldCount = 2;
memset( &s, 0, sizeof(s) );
s.size = sizeof(struct test);
s.alignment = TYPE_ALIGNMENT(struct test);
s.fields = fields;
s.fieldCount = 3;
hr = WsReadType( reader, WS_ELEMENT_TYPE_MAPPING, WS_STRUCT_TYPE, &s,
WS_READ_REQUIRED_POINTER, heap, &test_struct, sizeof(test_struct), NULL );
todo_wine ok( hr == S_OK, "got %#lx\n", hr );
if (SUCCEEDED(hr))
{
ok( test_struct->a == 1, "got %d\n", test_struct->a );
ok( !!test_struct->s, "s is not set\n" );
ok( test_struct->s->s_a == 1, "got %d\n", test_struct->s->s_a );
ok( test_struct->s->s_b == 0, "got %d\n", test_struct->s->s_b );
ok( test_struct->b == 1, "got %d\n", test_struct->b );
}
WsFreeHeap( heap );
WsFreeReader( reader );
}