#!/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")
      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()
