// 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/services.dart';

import '../common.dart';

const int _kNumIterations = 100000;

void main() {
  assert(false,
      "Don't run benchmarks in checked mode! Use 'flutter run --release'.");
  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();

  const StandardMethodCodec codec = StandardMethodCodec();
  final Stopwatch watch = Stopwatch();
  const String methodName = 'something';
  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    codec.encodeMethodCall(const MethodCall(methodName));
  }
  watch.stop();

  printer.addResult(
    description: 'StandardMethodCodec null',
    value: watch.elapsedMicroseconds.toDouble() / _kNumIterations,
    unit: 'us per iteration',
    name: 'StandardMethodCodec_null',
  );

  watch.reset();
  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    codec.encodeMethodCall(const MethodCall(methodName, 12345));
  }
  watch.stop();

  printer.addResult(
    description: 'StandardMethodCodec int',
    value: watch.elapsedMicroseconds.toDouble() / _kNumIterations,
    unit: 'us per iteration',
    name: 'StandardMethodCodec_int',
  );

  watch.reset();

  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    codec.encodeMethodCall(
        const MethodCall(methodName, 'This is a performance test.'));
  }
  watch.stop();

  printer.addResult(
    description: 'StandardMethodCodec string',
    value: watch.elapsedMicroseconds.toDouble() / _kNumIterations,
    unit: 'us per iteration',
    name: 'StandardMethodCodec_string',
  );

  watch.reset();
  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    codec.encodeMethodCall(const MethodCall(
        methodName, <Object>[1234, 'This is a performance test.', 1.25, true]));
  }
  watch.stop();

  printer.addResult(
    description: 'StandardMethodCodec heterogenous list',
    value: watch.elapsedMicroseconds.toDouble() / _kNumIterations,
    unit: 'us per iteration',
    name: 'StandardMethodCodec_heterogenous_list',
  );

  watch.reset();
  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    codec.encodeMethodCall(const MethodCall(methodName, <String, Object>{
      'integer': 1234,
      'string': 'This is a performance test.',
      'float': 1.25,
      'boolean': true
    }));
  }
  watch.stop();

  printer.addResult(
    description: 'StandardMethodCodec heterogenous map',
    value: watch.elapsedMicroseconds.toDouble() / _kNumIterations,
    unit: 'us per iteration',
    name: 'StandardMethodCodec_heterogenous_map',
  );

  watch.reset();

  printer.printToStdout();
}
