#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''Filter test data.

Test results without rms perf data are filtered out.
Test specific filter logic could also be added into filter_test.
'''

import argparse
import re
import sys
import utils


RE_FORMAT_CONVERSION_RMS = re.compile(r'rms_value_\d+_\d+')


def average(numbers):
  total = 0
  count = 0
  for v in numbers:
    total += v
    count += 1
  return total / count


def filter_test(test):
  if len(test.perf_dict) == 0:
    return None
  if test.test_name == 'audio_CRASFormatConversion':
    value = average(float(v) for k, v in test.perf_dict.iteritems()
                    if RE_FORMAT_CONVERSION_RMS.match(k))
    test.perf_dict = {'average_rms_value': value}
  return test


def parse_arguments():
  parser = argparse.ArgumentParser(description='Filter the test data.')
  parser.add_argument(
      'input', type=argparse.FileType('r'), nargs='?', default=sys.stdin,
      help='input file, a list of tests\' tags. (default stdin)')
  parser.add_argument(
      '--output', '-o', type=argparse.FileType('w'), nargs='?',
      default=sys.stdout, help='the output file. (default stdout)')
  return parser.parse_args()


def main():
  args = parse_arguments()
  for line in args.input:
    test = utils.TestObject.parse(line)
    if test is not None:
      test = filter_test(test)
    if test is not None:
      args.output.write('%s\n' % str(test))


if __name__ == '__main__':
  main()
