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

// See //dev/devicelab/bin/tasks/flutter_gallery__image_cache_memory.dart

import 'package:flutter/widgets.dart';
import 'package:flutter/scheduler.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 Container(
          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 such as `Window.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 ====');
}
