// 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.

import 'dart:async';

import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' as ui;

// The scene that will be rendered in the next call to `onDrawFrame`.
ui.Scene? _sceneToRender;

// Completer that will complete when the call to render completes.
Completer<void>? _sceneCompleter;

/// Sets up rendering so that `onDrawFrame` will render the last requested
/// scene.
void setUpRenderingForTests() {
  // Set `onDrawFrame` to call `renderer.renderScene`.
  EnginePlatformDispatcher.instance.onDrawFrame = () {
    if (_sceneToRender != null) {
      EnginePlatformDispatcher.instance.render(_sceneToRender!).then<void>((_) {
        _sceneCompleter?.complete();
      }).catchError((Object error) {
        _sceneCompleter?.completeError(error);
      });
      _sceneToRender = null;
    }
  };
}

/// Render the given [scene] in an `onDrawFrame` scope.
Future<void> renderScene(ui.Scene scene) {
  _sceneToRender = scene;
  _sceneCompleter = Completer<void>();
  EnginePlatformDispatcher.instance.invokeOnDrawFrame();
  return _sceneCompleter!.future;
}
