// 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 'package:flutter/scheduler.dart';
// See //dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

// Once we provide an option for images to be resized to
// fit the container, we should see a significant drop in
// the amount of memory consumed by this benchmark.
Future<void> main() async {
  const int numItems = 10;

  runApp(Directionality(
    textDirection: TextDirection.ltr,
    child: ListView.builder(
      key: const Key('ImageList'),
      itemCount: numItems,
      itemBuilder: (BuildContext context, int position) {
        return SizedBox(
          width: 200,
          height: 200,
          child: Center(
            child: Image.asset(
              'monochrome/red-square-1024x1024.png',
              package: 'flutter_gallery_assets',
              width: 100,
              height: 100,
              fit: BoxFit.contain,
              key: Key('image_$position'),
            ),
          ),
        );
      },
    ),
  ));

  await SchedulerBinding.instance.endOfFrame;

  // We are waiting for the GPU to rasterize a frame here. This makes this
  // flaky, we can rely on a more deterministic source such as
  // PlatformDispatcher.onReportTimings once
  // https://github.com/flutter/flutter/issues/26154 is addressed.
  await Future<void>.delayed(const Duration(milliseconds: 50));
  debugPrint('==== MEMORY BENCHMARK ==== READY ====');

  final WidgetController controller =
      LiveWidgetController(WidgetsBinding.instance);

  debugPrint('Scrolling...');
  final Finder list = find.byKey(const Key('ImageList'));
  final Finder lastItem = find.byKey(const Key('image_${numItems - 1}'));
  do {
    await controller.drag(list, const Offset(0.0, -30.0));
    await Future<void>.delayed(const Duration(milliseconds: 20));
  } while (!lastItem.precache());

  debugPrint('==== MEMORY BENCHMARK ==== DONE ====');
}
