181 lines
6.2 KiB
C++
181 lines
6.2 KiB
C++
// Copyright 2020 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef BASE_TEST_ASYNC_RESULTS_TEST_VALUES_WIN_H_
|
|
#define BASE_TEST_ASYNC_RESULTS_TEST_VALUES_WIN_H_
|
|
|
|
#include <windows.foundation.collections.h>
|
|
#include <wrl/client.h>
|
|
#include <wrl/implements.h>
|
|
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
// Declare the related template specializations for all the value types
|
|
// provided.
|
|
namespace ABI {
|
|
namespace Windows {
|
|
namespace Foundation {
|
|
|
|
template <>
|
|
struct __declspec(uuid("3895C200-8F26-4F5A-B29D-2B5D72E68F99"))
|
|
ABI::Windows::Foundation::IAsyncOperation<IUnknown*>
|
|
: ABI::Windows::Foundation::IAsyncOperation_impl<IUnknown*> {};
|
|
|
|
template <>
|
|
struct __declspec(uuid("CD99A253-6473-4810-AF0D-763DAB79AC42"))
|
|
ABI::Windows::Foundation::IAsyncOperationCompletedHandler<IUnknown*>
|
|
: ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<
|
|
IUnknown*> {};
|
|
|
|
template <>
|
|
struct __declspec(uuid("CB52D855-8121-4AC8-A164-084A27FB377E"))
|
|
ABI::Windows::Foundation::IAsyncOperation<int*>
|
|
: ABI::Windows::Foundation::IAsyncOperation_impl<int*> {};
|
|
|
|
template <>
|
|
struct __declspec(uuid("EA868415-A724-40BC-950A-C7DB6B1723C6"))
|
|
ABI::Windows::Foundation::IAsyncOperationCompletedHandler<int*>
|
|
: ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<int*> {};
|
|
|
|
// These specialization templates were included in windows.foundation.h, but
|
|
// removed in 10.0.19041.0 SDK, so are included here conditionally
|
|
#ifdef NTDDI_WIN10_VB // Windows 10.0.19041
|
|
template <>
|
|
struct __declspec(uuid("968b9665-06ed-5774-8f53-8edeabd5f7b5"))
|
|
ABI::Windows::Foundation::IAsyncOperation<int>
|
|
: ABI::Windows::Foundation::IAsyncOperation_impl<int> {};
|
|
|
|
template <>
|
|
struct __declspec(uuid("d60cae9d-88cb-59f1-8576-3fba44796be8"))
|
|
ABI::Windows::Foundation::IAsyncOperationCompletedHandler<int>
|
|
: ABI::Windows::Foundation::IAsyncOperationCompletedHandler_impl<int> {};
|
|
#endif
|
|
|
|
} // namespace Foundation
|
|
} // namespace Windows
|
|
} // namespace ABI
|
|
|
|
namespace base {
|
|
namespace test {
|
|
// Provides access to values of type |T| and variations of those values relevant
|
|
// to IAsyncOperations. Intended for use in TypedTestSuites concerning
|
|
// IAsyncOperations or related functionality. Example:
|
|
// template <typename T>
|
|
// class SuiteName : public ::testing::Test {};
|
|
//
|
|
// TYPED_TEST_SUITE_P(SuiteName);
|
|
//
|
|
// TYPED_TEST_P(SuiteName, TestName) {
|
|
// AsyncResultsTestValues<TypeParam> test_values;
|
|
// ... test_values.GetTestValue_T() ...
|
|
// }
|
|
//
|
|
// REGISTER_TYPED_TEST_SUITE_P(SuiteName, TestName);
|
|
// INSTANTIATE_TYPED_TEST_SUITE_P(Prefix,
|
|
// SuiteName,
|
|
// base::test::AsyncResultsTestValuesTypes);
|
|
template <typename T>
|
|
class AsyncResultsTestValues {
|
|
// This class body serves only to provide documentation for the functions.
|
|
// Actual use of this class is limited to the types for which it has been
|
|
// specialized.
|
|
private:
|
|
class AsyncResultsT;
|
|
|
|
public:
|
|
// Returns a value equal to a variable of type T constructed with an
|
|
// empty initializer.
|
|
//
|
|
// This value will be equal between all instances of the same type.
|
|
// AsyncResultsTestValues<T> instance1;
|
|
// AsyncResultsTestValues<T> instance2;
|
|
// instance1.GetDefaultValue_T() == instance2.GetDefaultValue_T();
|
|
T GetDefaultValue_T();
|
|
|
|
// Returns the same value as GetDefaultValue_T(), but in the format expected
|
|
// for the results of an IAsyncOperation<T>.
|
|
// AsyncResultsTestValues<T> instance;
|
|
// AsyncResultsT<T> converted_value = instance.GetDefaultValue_T();
|
|
// converted_value == instance.GetDefaultValue_AsyncResultsT();
|
|
AsyncResultsT GetDefaultValue_AsyncResultsT();
|
|
|
|
// Returns an arbitrary value NOT equal to GetDefaultValue_T().
|
|
//
|
|
// Multiple calls to this function on a single instance will return values
|
|
// equal to one another. Calls made on different instances may produce
|
|
// equal or non-equal values.
|
|
// AsyncResultsTestValues<T> instance1;
|
|
// AsyncResultsTestValues<T> instance2;
|
|
// instance1.GetTestValue_T() == instance1.GetTestValue_T();
|
|
// instance1.GetTestValue_T() == OR != instance2.GetTestValue_T();
|
|
T GetTestValue_T();
|
|
|
|
// Returns the same value as GetTestValue_T(), but in the format expected for
|
|
// the results of an IAsyncOperation<T>.
|
|
// AsyncResultsTestValues<T> instance;
|
|
// AsyncResultsT<T> converted_value = instance.GetTestValue_T();
|
|
// converted_value == instance.GetTestValue_AsyncResultsT();
|
|
AsyncResultsT GetTestValue_AsyncResultsT();
|
|
};
|
|
|
|
// The collection of value types supported by AsyncResultsTestValues.
|
|
using AsyncResultsTestValuesTypes = ::testing::Types<int, int*, IUnknown*>;
|
|
|
|
template <>
|
|
class AsyncResultsTestValues<int> {
|
|
public:
|
|
int GetDefaultValue_T() { return 0; }
|
|
int GetDefaultValue_AsyncResultsT() { return 0; }
|
|
|
|
int GetTestValue_T() { return 4; }
|
|
int GetTestValue_AsyncResultsT() { return 4; }
|
|
};
|
|
|
|
template <>
|
|
class AsyncResultsTestValues<int*> {
|
|
public:
|
|
int* GetDefaultValue_T() { return nullptr; }
|
|
int* GetDefaultValue_AsyncResultsT() { return nullptr; }
|
|
|
|
int* GetTestValue_T() { return &test_value_; }
|
|
int* GetTestValue_AsyncResultsT() { return &test_value_; }
|
|
|
|
private:
|
|
int test_value_ = 4;
|
|
};
|
|
|
|
template <>
|
|
class AsyncResultsTestValues<IUnknown*> {
|
|
public:
|
|
AsyncResultsTestValues() {
|
|
auto class_instance = Microsoft::WRL::Make<TestClassImplementingIUnknown>();
|
|
class_instance.As(&test_value_);
|
|
}
|
|
|
|
IUnknown* GetDefaultValue_T() { return nullptr; }
|
|
Microsoft::WRL::ComPtr<IUnknown> GetDefaultValue_AsyncResultsT() {
|
|
return Microsoft::WRL::ComPtr<IUnknown>();
|
|
}
|
|
|
|
IUnknown* GetTestValue_T() { return test_value_.Get(); }
|
|
Microsoft::WRL::ComPtr<IUnknown> GetTestValue_AsyncResultsT() {
|
|
return test_value_;
|
|
}
|
|
|
|
private:
|
|
class TestClassImplementingIUnknown
|
|
: public Microsoft::WRL::RuntimeClass<
|
|
Microsoft::WRL::RuntimeClassFlags<
|
|
Microsoft::WRL::WinRtClassicComMix |
|
|
Microsoft::WRL::InhibitRoOriginateError>,
|
|
IUnknown> {};
|
|
|
|
Microsoft::WRL::ComPtr<IUnknown> test_value_;
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace base
|
|
|
|
#endif // BASE_TEST_ASYNC_RESULTS_TEST_VALUES_WIN_H_
|