On 2020-02-05 00:22, Nikolay Sivov wrote:
On 2/4/20 8:17 PM, Derek Lesho wrote:
+static BOOL expect_event(IMFMediaEventGenerator *gen, struct expected_event *expected, PROPVARIANT *out) +{ + HRESULT hr; + IMFMediaEvent *event; + BOOL ret = TRUE;
+ hr = IMFMediaEventGenerator_GetEvent(gen, 0, &event); + ok(hr == S_OK, "Failed to get event from media source, hr %#x.\n", hr); + { + HRESULT status_code; + hr = IMFMediaEvent_GetStatus(event, &status_code); + ok (hr == S_OK, "Failed to get status code, hr %#x.\n", hr); + ok (status_code == expected->status_code, "Unexpected status code %#x, expected %#x.\n", + status_code, expected->status_code);
+ if (hr != S_OK || status_code != expected->status_code) + ret = FALSE; + } + { + MediaEventType event_type; + hr = IMFMediaEvent_GetType(event, &event_type); + ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr); + ok(event_type == expected->type, "Unexpected event type %u, expected %u.\n", + event_type, expected->type);
+ if (hr != S_OK || event_type != expected->type) + ret = FALSE; + } + if (expected->extended_type) + { + GUID extended_type; + BOOL is_equal; + hr = IMFMediaEvent_GetExtendedType(event, &extended_type); + ok(hr == S_OK, "Failed to get extended type, hr %#x.\n", hr); + is_equal = IsEqualGUID(&extended_type, expected->extended_type); + ok(is_equal, "Unexpected extended type %s, expected %s.\n", + debugstr_guid(&extended_type), debugstr_guid(expected->extended_type));
+ if (hr != S_OK || !is_equal) + ret = FALSE; + } + if (out) + { + hr = IMFMediaEvent_GetValue(event, out); + ok (hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
+ if (hr != S_OK) + ret = FALSE; + } + IMFMediaEvent_Release(event);
+ return ret; +}
I don't understand the purpose of such code arrangement. If you want to test for equality, get all relevant attributes and use them in a single test condition. Once you have event object it's safe to assume that getters won't fail. If extended type is not used you might as well drop it from expected data and compare to a constant.
The event type, extended type, status, and value are all not stored in the attributes, AFAIK. Right now, I haven't found a need to compare the attributes, so I'm not sure how that would help. I do understand wanting to remove the extended type check since we don't use it right now though.