blob: 066fd535dac3d71b0c2f8e6422179c3d6a1edf11 [file] [log] [blame]
// 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_