#!/usr/bin/python

# Copyright (c) 2013 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.
"""Testing of ResultsOrganizer. We create some labels, benchmark_runs
   and then create a ResultsOrganizer, after that, we compare the result of
   ResultOrganizer"""

import unittest

from benchmark_run import BenchmarkRun
from results_cache import Result
from results_organizer import ResultOrganizer

import mock_instance

result = {'benchmark1': [[{'': 'PASS',
                           'bool': 'True',
                           'milliseconds_1': '1',
                           'milliseconds_2': '8',
                           'milliseconds_3': '9.2',
                           'ms_1': '2.1',
                           'total': '5'}, {'test': '2'}, {'test': '4'},
                          {'': 'PASS',
                           'bool': 'FALSE',
                           'milliseconds_1': '3',
                           'milliseconds_2': '5',
                           'ms_1': '2.2',
                           'total': '6'}, {'test': '3'}, {'test': '4'}],
                         [{'': 'PASS',
                           'bool': 'FALSE',
                           'milliseconds_4': '30',
                           'milliseconds_5': '50',
                           'ms_1': '2.23',
                           'total': '6'}, {'test': '5'}, {'test': '4'},
                          {'': 'PASS',
                           'bool': 'FALSE',
                           'milliseconds_1': '3',
                           'milliseconds_6': '7',
                           'ms_1': '2.3',
                           'total': '7'}, {'test': '2'}, {'test': '6'}]],
          'benchmark2': [[{'': 'PASS',
                           'bool': 'TRUE',
                           'milliseconds_1': '3',
                           'milliseconds_8': '6',
                           'ms_1': '2.3',
                           'total': '7'}, {'test': '2'}, {'test': '6'},
                          {'': 'PASS',
                           'bool': 'TRUE',
                           'milliseconds_1': '3',
                           'milliseconds_8': '6',
                           'ms_1': '2.2',
                           'total': '7'}, {'test': '2'}, {'test': '2'}],
                         [{'': 'PASS',
                           'bool': 'TRUE',
                           'milliseconds_1': '3',
                           'milliseconds_8': '6',
                           'ms_1': '2',
                           'total': '7'}, {'test': '2'}, {'test': '4'},
                          {'': 'PASS',
                           'bool': 'TRUE',
                           'milliseconds_1': '3',
                           'milliseconds_8': '6',
                           'ms_1': '1',
                           'total': '7'}, {'test': '1'}, {'test': '6'}]]}


class ResultOrganizerTest(unittest.TestCase):

  def testResultOrganizer(self):
    labels = [mock_instance.label1, mock_instance.label2]
    benchmarks = [mock_instance.benchmark1, mock_instance.benchmark2]
    benchmark_runs = [None] * 8
    benchmark_runs[0] = BenchmarkRun('b1', benchmarks[0], labels[0], 1, '', '',
                                     '', 'average', '')
    benchmark_runs[1] = BenchmarkRun('b2', benchmarks[0], labels[0], 2, '', '',
                                     '', 'average', '')
    benchmark_runs[2] = BenchmarkRun('b3', benchmarks[0], labels[1], 1, '', '',
                                     '', 'average', '')
    benchmark_runs[3] = BenchmarkRun('b4', benchmarks[0], labels[1], 2, '', '',
                                     '', 'average', '')
    benchmark_runs[4] = BenchmarkRun('b5', benchmarks[1], labels[0], 1, '', '',
                                     '', 'average', '')
    benchmark_runs[5] = BenchmarkRun('b6', benchmarks[1], labels[0], 2, '', '',
                                     '', 'average', '')
    benchmark_runs[6] = BenchmarkRun('b7', benchmarks[1], labels[1], 1, '', '',
                                     '', 'average', '')
    benchmark_runs[7] = BenchmarkRun('b8', benchmarks[1], labels[1], 2, '', '',
                                     '', 'average', '')

    i = 0
    for b in benchmark_runs:
      b.result = Result('', b.label, 'average', 'machine')
      b.result.keyvals = mock_instance.keyval[i]
      i += 1

    ro = ResultOrganizer(benchmark_runs, labels, benchmarks)
    self.assertEqual(ro.result, result)


if __name__ == '__main__':
  unittest.main()
