5 #define FML_USED_ON_EMBEDDER
9 #include "flutter/common/settings.h"
10 #include "flutter/common/task_runners.h"
11 #include "flutter/lib/gpu/context.h"
12 #include "flutter/lib/gpu/shader.h"
13 #include "flutter/lib/gpu/shader_library.h"
14 #include "flutter/runtime/dart_isolate.h"
15 #include "flutter/runtime/dart_vm_lifecycle.h"
16 #include "flutter/testing/dart_fixture.h"
17 #include "flutter/testing/dart_isolate_runner.h"
18 #include "flutter/testing/testing.h"
19 #include "fml/memory/ref_ptr.h"
26 #include "gtest/gtest.h"
27 #include "third_party/imgui/imgui.h"
34 flutter::testing::OpenFixtureAsMapping(
"playground.shaderbundle");
36 flutter::gpu::ShaderLibrary::MakeFromFlatbuffer(std::move(fixture));
37 flutter::gpu::ShaderLibrary::SetOverride(library);
41 public flutter::testing::DartFixture {
44 : settings_(CreateSettingsForFixture()),
45 vm_ref_(flutter::DartVMRef::Create(settings_)) {
46 fml::MessageLoop::EnsureInitializedForCurrentThread();
48 current_task_runner_ = fml::MessageLoop::GetCurrent().GetTaskRunner();
50 isolate_ = CreateDartIsolate();
52 assert(isolate_->get()->GetPhase() == flutter::DartIsolate::Phase::Running);
58 flutter::gpu::Context::SetOverrideContext(
GetContext());
62 return isolate_.get();
66 std::unique_ptr<flutter::testing::AutoIsolateShutdown> CreateDartIsolate() {
67 const auto settings = CreateSettingsForFixture();
68 flutter::TaskRunners task_runners(flutter::testing::GetCurrentTestName(),
74 return flutter::testing::RunDartCodeInIsolate(
75 vm_ref_, settings, task_runners,
"main", {},
76 flutter::testing::GetDefaultKernelFilePath());
79 const flutter::Settings settings_;
80 flutter::DartVMRef vm_ref_;
81 fml::RefPtr<fml::TaskRunner> current_task_runner_;
82 std::unique_ptr<flutter::testing::AutoIsolateShutdown> isolate_;
88 auto isolate = GetIsolate();
90 SinglePassCallback callback = [&](
RenderPass& pass) {
91 ImGui::Begin(
"Dart test",
nullptr);
93 "This test executes Dart code during the playground frame callback.");
96 return isolate->RunInIsolateScope([]() ->
bool {
97 if (tonic::CheckAndHandleError(::Dart_Invoke(
98 Dart_RootLibrary(), tonic::ToDart(
"sayHi"), 0,
nullptr))) {
104 OpenPlaygroundHere(callback);
108 auto isolate = GetIsolate();
109 bool result = isolate->RunInIsolateScope([]() ->
bool {
110 if (tonic::CheckAndHandleError(::Dart_Invoke(
111 Dart_RootLibrary(), tonic::ToDart(
"instantiateDefaultContext"), 0,
121 #define DART_TEST_CASE(name) \
122 TEST_P(RendererDartTest, name) { \
123 auto isolate = GetIsolate(); \
124 bool result = isolate->RunInIsolateScope([]() -> bool { \
125 if (tonic::CheckAndHandleError(::Dart_Invoke( \
126 Dart_RootLibrary(), tonic::ToDart(#name), 0, nullptr))) { \
131 ASSERT_TRUE(result); \
142 DART_TEST_CASE(deviceBufferOverwriteThrowsForNegativeDestinationOffset);