// Copyright (c) 2014, 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:expect/expect.dart';
import 'package:compiler/implementation/helpers/helpers.dart';

class CollectingOutput implements StatsOutput {
  final StringBuffer sb = new StringBuffer();

  void println(String text) {
    sb.write('$text\n');
  }

  String toString() => sb.toString();
}

void main() {
  testRecordElement();
  testRecordFrequency();
  testRecordCounter();
}

void testRecordElement() {
  test((Stats stats) {
    stats.recordElement('foo', 'a', data: 'first-a-data');
    stats.recordElement('foo', 'a', data: 'second-a-data');
    stats.recordElement('foo', 'b');
    stats.recordElement('bar', 'a', data: 'third-a-data');
    stats.recordElement('bar', 'c');
   }, r'''
foo: 2
 value=a data=second-a-data
 b
bar: 2
 value=a data=third-a-data
 c
''');
}

void testRecordFrequency() {
  test((Stats stats) {
    stats.recordFrequency('foo', 'a', 'first-a-data');
    stats.recordFrequency('foo', 'a', 'second-a-data');
    stats.recordFrequency('bar', 'b', 'first-b-data');
    stats.recordFrequency('foo', 'c');
    stats.recordFrequency('bar', 'b');
  }, r'''
foo:
 a: 2
  first-a-data
  second-a-data
 c: 1
bar:
 b: 2
  first-b-data
''');
}

void testRecordCounter() {
  test((Stats stats) {
    stats.recordCounter('foo', 'a');
    stats.recordCounter('foo', 'a');
    stats.recordCounter('foo', 'b');
    stats.recordCounter('bar', 'c', 'first-c-data');
    stats.recordCounter('bar', 'c', 'second-c-data');
    stats.recordCounter('bar', 'd');
    stats.recordCounter('bar', 'd');
    stats.recordCounter('baz');
    stats.recordCounter('baz');
    }, r'''
foo: 3
 count=2 example=a
 count=1 example=b
bar: 4
 count=2 examples=2
  c:
   first-c-data
   second-c-data
  d
baz: 2
''');
}

void test(f(Stats stats), expectedDump) {
  CollectingOutput output = new CollectingOutput();
  Stats stats = new ActiveStats(new ConsolePrinter(output: output));
  f(stats);
  stats.dumpStats();
  print(output.toString());
  Expect.equals(expectedDump, output.toString());
}
