#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# 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.
"""

from __future__ import print_function

import unittest

from benchmark_run import BenchmarkRun
from results_cache import Result
from results_organizer import OrganizeResults

import mock_instance

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


class ResultOrganizerTest(unittest.TestCase):
  """Test result organizer."""

  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

    organized = OrganizeResults(benchmark_runs, labels, benchmarks)
    self.assertEqual(organized, result)


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