// Copyright 2014 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:ui' as ui;

import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';

final List<String> log = <String>[];

void main() {
  final PaintingMocksTestRenderingFlutterBinding binding = PaintingMocksTestRenderingFlutterBinding.ensureInitialized();

  test('createSceneBuilder et al', () async {
    final RenderView root = RenderView(
      view: binding.platformDispatcher.views.single,
      configuration: const ViewConfiguration(),
    );
    root.attach(PipelineOwner());
    root.prepareInitialFrame();
    expect(log, isEmpty);
    root.compositeFrame();
    expect(log, <String>['createSceneBuilder']);
    log.clear();
    final PaintingContext context = PaintingContext(ContainerLayer(), Rect.zero);
    expect(log, isEmpty);
    context.canvas;
    expect(log, <String>['createPictureRecorder', 'createCanvas']);
    log.clear();
    context.addLayer(ContainerLayer());
    expect(log, isEmpty);
    context.canvas;
    expect(log, <String>['createPictureRecorder', 'createCanvas']);
    log.clear();
  });
}


class PaintingMocksTestRenderingFlutterBinding extends BindingBase with SchedulerBinding, ServicesBinding, GestureBinding, PaintingBinding, SemanticsBinding, RendererBinding {
  @override
  void initInstances() {
    super.initInstances();
    _instance = this;
  }

  static PaintingMocksTestRenderingFlutterBinding get instance => BindingBase.checkInstance(_instance);
  static PaintingMocksTestRenderingFlutterBinding? _instance;

  static PaintingMocksTestRenderingFlutterBinding ensureInitialized() {
    if (PaintingMocksTestRenderingFlutterBinding._instance == null) {
      PaintingMocksTestRenderingFlutterBinding();
    }
    return PaintingMocksTestRenderingFlutterBinding.instance;
  }

  @override
  ui.SceneBuilder createSceneBuilder() {
    log.add('createSceneBuilder');
    return super.createSceneBuilder();
  }

  @override
  ui.PictureRecorder createPictureRecorder() {
    log.add('createPictureRecorder');
    return super.createPictureRecorder();
  }

  @override
  Canvas createCanvas(ui.PictureRecorder recorder) {
    log.add('createCanvas');
    return super.createCanvas(recorder);
  }
}
