// 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/services.dart';
import 'package:flutter_test/flutter_test.dart';

import '../common.dart';

const List<String> assets = <String>[
  'packages/flutter_gallery_assets/people/ali_landscape.png',
  'packages/flutter_gallery_assets/monochrome/red-square-1024x1024.png',
  'packages/flutter_gallery_assets/logos/flutter_white/logo.png',
  'packages/flutter_gallery_assets/logos/fortnightly/fortnightly_logo.png',
  'packages/flutter_gallery_assets/videos/bee.mp4',
  'packages/flutter_gallery_assets/videos/butterfly.mp4',
  'packages/flutter_gallery_assets/animated_images/animated_flutter_lgtm.gif',
  'packages/flutter_gallery_assets/animated_images/animated_flutter_stickers.webp',
  'packages/flutter_gallery_assets/food/butternut_squash_soup.png',
  'packages/flutter_gallery_assets/food/cherry_pie.png',
  'packages/flutter_gallery_assets/food/chopped_beet_leaves.png',
  'packages/flutter_gallery_assets/food/fruits.png',
  'packages/flutter_gallery_assets/food/pesto_pasta.png',
  'packages/flutter_gallery_assets/food/roasted_chicken.png',
  'packages/flutter_gallery_assets/food/spanakopita.png',
  'packages/flutter_gallery_assets/food/spinach_onion_salad.png',
  'packages/flutter_gallery_assets/food/icons/fish.png',
  'packages/flutter_gallery_assets/food/icons/healthy.png',
  'packages/flutter_gallery_assets/food/icons/main.png',
  'packages/flutter_gallery_assets/food/icons/meat.png',
  'packages/flutter_gallery_assets/food/icons/quick.png',
  'packages/flutter_gallery_assets/food/icons/spicy.png',
  'packages/flutter_gallery_assets/food/icons/veggie.png',
  'packages/flutter_gallery_assets/logos/pesto/logo_small.png',
  'packages/flutter_gallery_assets/places/india_chennai_flower_market.png',
  'packages/flutter_gallery_assets/places/india_thanjavur_market.png',
  'packages/flutter_gallery_assets/places/india_tanjore_bronze_works.png',
  'packages/flutter_gallery_assets/places/india_tanjore_market_merchant.png',
  'packages/flutter_gallery_assets/places/india_tanjore_thanjavur_temple.png',
  'packages/flutter_gallery_assets/places/india_pondicherry_salt_farm.png',
  'packages/flutter_gallery_assets/places/india_chennai_highway.png',
  'packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png',
  'packages/flutter_gallery_assets/places/india_tanjore_thanjavur_temple_carvings.png',
  'packages/flutter_gallery_assets/places/india_chettinad_produce.png',
  'packages/flutter_gallery_assets/places/india_tanjore_market_technology.png',
  'packages/flutter_gallery_assets/places/india_pondicherry_beach.png',
  'packages/flutter_gallery_assets/places/india_pondicherry_fisherman.png',
  'packages/flutter_gallery_assets/products/backpack.png',
  'packages/flutter_gallery_assets/products/belt.png',
  'packages/flutter_gallery_assets/products/cup.png',
  'packages/flutter_gallery_assets/products/deskset.png',
  'packages/flutter_gallery_assets/products/dress.png',
  'packages/flutter_gallery_assets/products/earrings.png',
  'packages/flutter_gallery_assets/products/flatwear.png',
  'packages/flutter_gallery_assets/products/hat.png',
  'packages/flutter_gallery_assets/products/jacket.png',
  'packages/flutter_gallery_assets/products/jumper.png',
  'packages/flutter_gallery_assets/products/kitchen_quattro.png',
  'packages/flutter_gallery_assets/products/napkins.png',
  'packages/flutter_gallery_assets/products/planters.png',
  'packages/flutter_gallery_assets/products/platter.png',
  'packages/flutter_gallery_assets/products/scarf.png',
  'packages/flutter_gallery_assets/products/shirt.png',
  'packages/flutter_gallery_assets/products/sunnies.png',
  'packages/flutter_gallery_assets/products/sweater.png',
  'packages/flutter_gallery_assets/products/sweats.png',
  'packages/flutter_gallery_assets/products/table.png',
  'packages/flutter_gallery_assets/products/teaset.png',
  'packages/flutter_gallery_assets/products/top.png',
  'packages/flutter_gallery_assets/people/square/ali.png',
  'packages/flutter_gallery_assets/people/square/peter.png',
  'packages/flutter_gallery_assets/people/square/sandra.png',
  'packages/flutter_gallery_assets/people/square/stella.png',
  'packages/flutter_gallery_assets/people/square/trevor.png',
];

// Measures the time it takes to load a fixed number of assets into an
// immutable buffer to later be decoded by skia.
Future<void> main() async {
  assert(false, "Don't run benchmarks in debug mode! Use 'flutter run --release'.");

  final Stopwatch watch = Stopwatch();
  await benchmarkWidgets((WidgetTester tester) async {
    watch.start();
    for (int i = 0; i < 10; i += 1) {
      await Future.wait(<Future<ui.ImmutableBuffer>>[
        for (String asset in assets)
          rootBundle.loadBuffer(asset)
      ]);
    }
    watch.stop();
  });

  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
  printer.addResult(
    description: 'Image loading',
    value: watch.elapsedMilliseconds.toDouble(),
    unit: 'ms',
    name: 'image_load_ms',
  );
  printer.printToStdout();
}
