// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. 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:args/args.dart';
import 'package:test/test.dart';

void main() {
  group('ArgParser.parse() is fast', () {
    test('for short flags', () {
      _testParserPerformance(ArgParser()..addFlag('short', abbr: 's'), '-s');
    });

    test('for abbreviations', () {
      _testParserPerformance(
          ArgParser()
            ..addFlag('short', abbr: 's')
            ..addFlag('short2', abbr: 't')
            ..addFlag('short3', abbr: 'u')
            ..addFlag('short4', abbr: 'v'),
          '-stuv');
    });

    test('for long flags', () {
      _testParserPerformance(ArgParser()..addFlag('long-flag'), '--long-flag');
    });

    test('for long options with =', () {
      _testParserPerformance(ArgParser()..addOption('long-option-name'),
          '--long-option-name=long-option-value');
    });
  });
}

/// Tests how quickly [parser] parses [string].
///
/// Checks that a 10x increase in arg count does not lead to greater than 30x
/// increase in parse time.
void _testParserPerformance(ArgParser parser, String string) {
  var baseSize = 50000;
  var baseList = List<String>.generate(baseSize, (_) => string);

  var multiplier = 10;
  var largeList = List<String>.generate(baseSize * multiplier, (_) => string);

  var baseAction = () => parser.parse(baseList);
  var largeAction = () => parser.parse(largeList);

  // Warm up JIT.
  baseAction();
  largeAction();

  var baseTime = _time(baseAction);
  var largeTime = _time(largeAction);

  print('Parsed $baseSize elements in ${baseTime}ms, '
      '${baseSize * multiplier} elements in ${largeTime}ms.');

  expect(largeTime, lessThan(baseTime * multiplier * 3),
      reason:
          'Comparing large data set time ${largeTime}ms to small data set time '
          '${baseTime}ms. Data set increased ${multiplier}x, time is allowed to '
          'increase up to ${multiplier * 3}x, but it increased '
          '${largeTime ~/ baseTime}x.');
}

int _time(void Function() function) {
  var stopwatch = Stopwatch()..start();
  function();
  return stopwatch.elapsedMilliseconds;
}
