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

# Copyright (c) 2013 The ChromiumOS 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()
