| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_H_ | |
| #define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_H_ | |
| #include <map> | |
| #include <memory> | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/shell/platform/embedder/tests/embedder_test_context.h" | |
| #include "flutter/testing/testing.h" | |
| #include "flutter/testing/thread_test.h" | |
| #include "gtest/gtest.h" | |
| namespace flutter::testing { | |
| class EmbedderTestContextGL; | |
| class EmbedderTestContextMetal; | |
| class EmbedderTestContextSoftware; | |
| class EmbedderTestContextVulkan; | |
| class EmbedderTest : public ThreadTest { | |
| public: | |
| EmbedderTest(); | |
| std::string GetFixturesDirectory() const; | |
| template <typename T> | |
| T& GetEmbedderContext() { | |
| static_assert(false, "Unsupported test context type"); | |
| } | |
| template <> | |
| EmbedderTestContextGL& GetEmbedderContext<EmbedderTestContextGL>() { | |
| return reinterpret_cast<EmbedderTestContextGL&>(GetGLContext()); | |
| } | |
| template <> | |
| EmbedderTestContextMetal& GetEmbedderContext<EmbedderTestContextMetal>() { | |
| return reinterpret_cast<EmbedderTestContextMetal&>(GetMetalContext()); | |
| } | |
| template <> | |
| EmbedderTestContextSoftware& | |
| GetEmbedderContext<EmbedderTestContextSoftware>() { | |
| return reinterpret_cast<EmbedderTestContextSoftware&>(GetSoftwareContext()); | |
| } | |
| template <> | |
| EmbedderTestContextVulkan& GetEmbedderContext<EmbedderTestContextVulkan>() { | |
| return reinterpret_cast<EmbedderTestContextVulkan&>(GetVulkanContext()); | |
| } | |
| protected: | |
| // We return the base class here and reinterpret_cast in the template | |
| // specializations because we're using forward declarations rather than | |
| // including the headers directly, and thus the relationship between the base | |
| // class and subclasses is unknown to the compiler here. We avoid including | |
| // the headers directly because the Metal headers include Objective-C types, | |
| // and thus cannot be included in pure C++ translation units. | |
| EmbedderTestContext& GetGLContext(); | |
| EmbedderTestContext& GetMetalContext(); | |
| EmbedderTestContext& GetSoftwareContext(); | |
| EmbedderTestContext& GetVulkanContext(); | |
| std::unique_ptr<EmbedderTestContext> gl_context_; | |
| std::unique_ptr<EmbedderTestContext> metal_context_; | |
| std::unique_ptr<EmbedderTestContext> software_context_; | |
| std::unique_ptr<EmbedderTestContext> vulkan_context_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTest); | |
| }; | |
| class EmbedderTestMultiBackend | |
| : public EmbedderTest, | |
| public ::testing::WithParamInterface<EmbedderTestContextType> { | |
| public: | |
| EmbedderTestContext& GetEmbedderContext(EmbedderTestContextType type); | |
| }; | |
| } // namespace flutter::testing | |
| #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_H_ |