From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/windows.web/tests/web.c | 173 ++++++++++++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 2 deletions(-)
diff --git a/dlls/windows.web/tests/web.c b/dlls/windows.web/tests/web.c index a4072a92db3..63ceb48e373 100644 --- a/dlls/windows.web/tests/web.c +++ b/dlls/windows.web/tests/web.c @@ -51,7 +51,7 @@ static void test_JsonObjectStatics(void) IActivationFactory *factory = (void *)0xdeadbeef; IInspectable *inspectable = (void *)0xdeadbeef; IJsonObject *json_object = (void *)0xdeadbeef; - HSTRING str; + HSTRING str = NULL; HRESULT hr; LONG ref;
@@ -90,6 +90,122 @@ static void test_JsonObjectStatics(void) ok( ref == 1, "got ref %ld.\n", ref ); }
+#define check_json( json_value_statics, json, expected_json_value_type, valid ) check_json_( __LINE__, json_value_statics, json, expected_json_value_type, valid ) +static void check_json_( unsigned int line, IJsonValueStatics *json_value_statics, const WCHAR *json, JsonValueType expected_json_value_type, boolean valid ) +{ + IJsonObject *json_object = (void *)0xdeadbeef; + IJsonArray *json_array = (void *)0xdeadbeef; + IJsonValue *json_value = (void *)0xdeadbeef; + HSTRING str = NULL, parsed_str = NULL, empty_space = NULL; + boolean parsed_boolean, expected_boolean; + JsonValueType json_value_type; + DOUBLE parsed_num; + HRESULT hr; + LONG ref; + int res; + + hr = WindowsCreateString( json, wcslen( json ), &str ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IJsonValueStatics_Parse( json_value_statics, str, &json_value ); + if (!valid) + { + if (expected_json_value_type == JsonValueType_Number) + ok_(__FILE__, line)( hr == WEB_E_INVALID_JSON_NUMBER, "got hr %#lx.\n", hr ); + else + ok_(__FILE__, line)( hr == WEB_E_INVALID_JSON_STRING, "got hr %#lx.\n", hr ); + + WindowsDeleteString( str ); + return; + } + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IJsonValue_get_ValueType( json_value, &json_value_type ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + ok_(__FILE__, line)( json_value_type == expected_json_value_type, "got json_value_type %d.\n", json_value_type ); + + switch (expected_json_value_type) + { + case JsonValueType_Null: + hr = IJsonValue_GetString( json_value, NULL ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetString( json_value, &parsed_str ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + WindowsDeleteString( parsed_str ); + + hr = IJsonValue_GetNumber( json_value, NULL ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetNumber( json_value, &parsed_num ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + + hr = IJsonValue_GetBoolean( json_value, NULL ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetBoolean( json_value, &parsed_boolean ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + + hr = IJsonValue_GetArray( json_value, NULL ); + ok_(__FILE__, line)( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetArray( json_value, &json_array ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + if (hr == S_OK) IJsonArray_Release( json_array ); + + hr = IJsonValue_GetObject( json_value, NULL ); + ok_(__FILE__, line)( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetObject( json_value, &json_object ); + ok_(__FILE__, line)( hr == E_ILLEGAL_METHOD_CALL, "got hr %#lx.\n", hr ); + if (hr == S_OK) IJsonObject_Release( json_object ); + break; + case JsonValueType_Boolean: + hr = WindowsCreateString( L" ", wcslen( L" " ), &empty_space ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + hr = WindowsTrimStringStart( str, empty_space, &parsed_str ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + hr = WindowsTrimStringEnd( parsed_str, empty_space, &parsed_str ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + expected_boolean = !wcscmp( L"true", WindowsGetStringRawBuffer( parsed_str, NULL ) ); + + hr = IJsonValue_GetBoolean( json_value, NULL ); + ok_(__FILE__, line)( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetBoolean( json_value, &parsed_boolean ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + ok_(__FILE__, line)( parsed_boolean == expected_boolean, "boolean mismatch, got %d, expected %d.\n", parsed_boolean, expected_boolean ); + break; + case JsonValueType_Number: + parsed_num = 0xdeadbeef; + hr = IJsonValue_GetNumber( json_value, NULL ); + ok_(__FILE__, line)( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetNumber( json_value, &parsed_num ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + ok_(__FILE__, line)( parsed_num != 0xdeadbeef, "failed to get parsed_num\n" ); + break; + case JsonValueType_String: + hr = IJsonValue_GetString( json_value, NULL ); + ok_(__FILE__, line)( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValue_GetString( json_value, &parsed_str ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + hr = WindowsCompareStringOrdinal( str, parsed_str, &res ); + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + ok_(__FILE__, line)( res != 0, "got same HSTRINGS str = %s, parsed_str = %s.\n", wine_dbgstr_hstring( str ), wine_dbgstr_hstring( parsed_str ) ); + break; + case JsonValueType_Array: + hr = IJsonValue_GetArray( json_value, &json_array ); + todo_wine + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + if (hr == S_OK) IJsonArray_Release( json_array ); + break; + case JsonValueType_Object: + hr = IJsonValue_GetObject( json_value, &json_object ); + todo_wine + ok_(__FILE__, line)( hr == S_OK, "got hr %#lx.\n", hr ); + if (hr == S_OK) IJsonObject_Release( json_object ); + break; + } + + WindowsDeleteString( empty_space ); + WindowsDeleteString( parsed_str ); + WindowsDeleteString( str ); + ref = IJsonValue_Release( json_value ); + ok_(__FILE__, line)( ref == 0, "got ref %ld.\n", ref ); +} + static void test_JsonValueStatics(void) { static const WCHAR *json_value_statics_name = L"Windows.Data.Json.JsonValue"; @@ -97,7 +213,8 @@ static void test_JsonValueStatics(void) IActivationFactory *factory = (void *)0xdeadbeef; IJsonValue *json_value = (void *)0xdeadbeef; JsonValueType json_value_type; - HSTRING str; + HSTRING str = NULL; + const WCHAR *json; HRESULT hr; LONG ref;
@@ -142,6 +259,58 @@ static void test_JsonValueStatics(void) ref = IJsonValue_Release( json_value ); ok( ref == 0, "got ref %ld.\n", ref );
+ hr = IJsonValueStatics_Parse( json_value_statics, NULL, &json_value ); + ok( hr == WEB_E_INVALID_JSON_STRING, "got hr %#lx.\n", hr ); + hr = WindowsCreateString( L"Wine", wcslen( L"Wine" ), &str ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IJsonValueStatics_Parse( json_value_statics, str, NULL ); + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IJsonValueStatics_Parse( json_value_statics, str, &json_value ); + ok( hr == WEB_E_INVALID_JSON_STRING, "got hr %#lx.\n", hr ); + WindowsDeleteString( str ); + + /* Valid JSON */ + + json = L"null"; + check_json( json_value_statics, json, JsonValueType_Null, TRUE ); + json = L"false"; + check_json( json_value_statics, json, JsonValueType_Boolean, TRUE ); + json = L" true "; + check_json( json_value_statics, json, JsonValueType_Boolean, TRUE ); + json = L""true""; + check_json( json_value_statics, json, JsonValueType_String, TRUE ); + json = L" 9.22 "; + check_json( json_value_statics, json, JsonValueType_Number, TRUE ); + json = L" "Wine""; + check_json( json_value_statics, json, JsonValueType_String, TRUE ); + json = L"["Wine", "Linux"]"; + check_json( json_value_statics, json, JsonValueType_Array, TRUE ); + json = L"\ + {\ + "Wine": "The Wine Project",\ + "Linux": ["Arch", "BTW"]\ + }"; + check_json( json_value_statics, json, JsonValueType_Object, TRUE ); + + /* Invalid JSON */ + + json = L"True"; + check_json( json_value_statics, json, JsonValueType_Boolean, FALSE ); + json = L"1.7976931348623158e+3080"; + check_json( json_value_statics, json, JsonValueType_Number, FALSE ); + json = L"2.2250738585072014e-3080"; + check_json( json_value_statics, json, JsonValueType_Number, FALSE ); + json = L" "Wine":"; + check_json( json_value_statics, json, JsonValueType_String, FALSE ); + json = L"["Wine" "Linux"]"; + check_json( json_value_statics, json, JsonValueType_Array, FALSE ); + json = L"\ + {\ + "Wine": "The Wine Project",\ + "Linux": ["Arch", "BTW"]\ + "; + check_json( json_value_statics, json, JsonValueType_Object, FALSE ); + ref = IJsonValueStatics_Release( json_value_statics ); ok( ref == 2, "got ref %ld.\n", ref ); ref = IActivationFactory_Release( factory );