# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for TestRunResults."""


import unittest

from pylib.base.base_test_result import BaseTestResult
from pylib.base.base_test_result import TestRunResults
from pylib.base.base_test_result import ResultType


class TestTestRunResults(unittest.TestCase):
  def setUp(self):
    self.p1 = BaseTestResult('p1', ResultType.PASS, log='pass1')
    other_p1 = BaseTestResult('p1', ResultType.PASS)
    self.p2 = BaseTestResult('p2', ResultType.PASS)
    self.f1 = BaseTestResult('f1', ResultType.FAIL, log='failure1')
    self.c1 = BaseTestResult('c1', ResultType.CRASH, log='crash1')
    self.u1 = BaseTestResult('u1', ResultType.UNKNOWN)
    self.tr = TestRunResults()
    self.tr.AddResult(self.p1)
    self.tr.AddResult(other_p1)
    self.tr.AddResult(self.p2)
    self.tr.AddResults(set([self.f1, self.c1, self.u1]))

  def testGetAll(self):
    self.assertFalse(
        self.tr.GetAll().symmetric_difference(
            [self.p1, self.p2, self.f1, self.c1, self.u1]))

  def testGetPass(self):
    self.assertFalse(self.tr.GetPass().symmetric_difference(
        [self.p1, self.p2]))

  def testGetNotPass(self):
    self.assertFalse(self.tr.GetNotPass().symmetric_difference(
        [self.f1, self.c1, self.u1]))

  def testGetAddTestRunResults(self):
    tr2 = TestRunResults()
    other_p1 = BaseTestResult('p1', ResultType.PASS)
    f2 = BaseTestResult('f2', ResultType.FAIL)
    tr2.AddResult(other_p1)
    tr2.AddResult(f2)
    tr2.AddTestRunResults(self.tr)
    self.assertFalse(
        tr2.GetAll().symmetric_difference(
            [self.p1, self.p2, self.f1, self.c1, self.u1, f2]))

  def testGetLogs(self):
    log_print = ('[FAIL] f1:\n'
                 'failure1\n'
                 '[CRASH] c1:\n'
                 'crash1')
    self.assertEqual(self.tr.GetLogs(), log_print)

  def testGetShortForm(self):
    short_print = ('ALL: 5         PASS: 2        FAIL: 1        '
                   'CRASH: 1       TIMEOUT: 0     UNKNOWN: 1     ')
    self.assertEqual(self.tr.GetShortForm(), short_print)

  def testGetGtestForm(self):
    gtest_print = ('[==========] 5 tests ran.\n'
                   '[  PASSED  ] 2 tests.\n'
                   '[  FAILED  ] 3 tests, listed below:\n'
                   '[  FAILED  ] f1\n'
                   '[  FAILED  ] c1 (CRASHED)\n'
                   '[  FAILED  ] u1 (UNKNOWN)\n'
                   '\n'
                   '3 FAILED TESTS')
    self.assertEqual(gtest_print, self.tr.GetGtestForm())

  def testRunPassed(self):
    self.assertFalse(self.tr.DidRunPass())
    tr2 = TestRunResults()
    self.assertTrue(tr2.DidRunPass())


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