#!/usr/bin/env python2
#
# Copyright 2014 Google Inc.  All Rights Reserved
"""Unit tests for the Crosperf Benchmark class."""

from __future__ import print_function

import inspect
from benchmark import Benchmark

import unittest


class BenchmarkTestCase(unittest.TestCase):
  """Individual tests for the Benchmark class."""

  def test_benchmark(self):
    # Test creating a benchmark with all the fields filled out.
    b1 = Benchmark('b1_test',  # name
                   'octane',  # test_name
                   '',  # test_args
                   3,  # iterations
                   False,  # rm_chroot_tmp
                   'record -e cycles',  # perf_args
                   'telemetry_Crosperf',  # suite
                   True)  # show_all_results
    self.assertTrue(b1.suite, 'telemetry_Crosperf')

    # Test creating a benchmark field with default fields left out.
    b2 = Benchmark('b2_test',  # name
                   'octane',  # test_name
                   '',  # test_args
                   3,  # iterations
                   False,  # rm_chroot_tmp
                   'record -e cycles')  # perf_args
    self.assertEqual(b2.suite, '')
    self.assertFalse(b2.show_all_results)

    # Test explicitly creating 'suite=Telemetry' and 'show_all_results=False"
    # and see what happens.
    b3 = Benchmark('b3_test',  # name
                   'octane',  # test_name
                   '',  # test_args
                   3,  # iterations
                   False,  # rm_chroot_tmp
                   'record -e cycles',  # perf_args
                   'telemetry',  # suite
                   False)  # show_all_results
    self.assertTrue(b3.show_all_results)

    # Check to see if the args to Benchmark have changed since the last time
    # this test was updated.
    args_list = ['self', 'name', 'test_name', 'test_args', 'iterations',
                 'rm_chroot_tmp', 'perf_args', 'suite', 'show_all_results',
                 'retries', 'run_local']
    arg_spec = inspect.getargspec(Benchmark.__init__)
    self.assertEqual(len(arg_spec.args), len(args_list))
    for arg in args_list:
      self.assertIn(arg, arg_spec.args)


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