#!/usr/bin/env python3
# -*- 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()
