#!/usr/bin/env python3 # Copyright 2014 by Sam Mikes. All rights reserved. # This code is governed by the BSD license found in the LICENSE file. import unittest import sys import os import cStringIO from functools import wraps sys.path.append("src") import test262 class TestTest262(unittest.TestCase): def test_that_tests_run(self): self.assertEqual(1 + 2, 3) class MockTest(object): def __init__(self, name, negative): self.name = name self.negative = negative if negative else False self.strict_mode = False def GetName(self): return self.name def IsNegative(self): return self.negative def GetMode(self): if self.strict_mode: return "strict mode" return "non-strict mode" class MockResult(object): def __init__(self, case): self.case = case class TestTestSuite(unittest.TestCase): def test_that_tests_run(self): self.assertEqual(1 + 2, 3) def test_create_test_suite(self): test_suite = test262.TestSuite(".", False, False, False, None) self.assertNotEqual(test_suite, None) def test_summary(self): test_suite = test262.TestSuite(".", False, False, False, None) progress = test262.ProgressIndicator(100) progress.succeeded = 98 progress.failed = 2 result = mute(True)(test_suite.PrintSummary)(progress, None) self.assertEqual(""" === Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) """, result) def test_summary_logfile(self): test_suite = test262.TestSuite(".", False, False, False, None) progress = test262.ProgressIndicator(100) progress.succeeded = 98 progress.failed = 2 fake_log = cStringIO.StringIO() test_suite.logf = fake_log result = mute(True)(test_suite.PrintSummary)(progress, True) expected_out = """ === Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) """ expected_log = """=== Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) """ self.assertEqual(expected_out, result) self.assertEqual(expected_log, fake_log.getvalue()) def test_summary_withfails(self): test_suite = test262.TestSuite(".", False, False, False, None) progress = test262.ProgressIndicator(100) progress.succeeded = 98 progress.failed = 2 progress.failed_tests = [ MockResult(MockTest("foo", False)), MockResult(MockTest("bar", True)) ] result = mute(True)(test_suite.PrintSummary)(progress, None) self.assertEqual(""" === Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) Failed Tests foo in non-strict mode Expected to fail but passed --- bar in non-strict mode """, result) def test_summary_withfails_andlog(self): test_suite = test262.TestSuite(".", False, False, False, None) progress = test262.ProgressIndicator(100) progress.succeeded = 98 progress.failed = 2 progress.failed_tests = [ MockResult(MockTest("foo", False)), MockResult(MockTest("bar", True)) ] fake_log = cStringIO.StringIO() test_suite.logf = fake_log expected_out = """ === Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) Failed Tests foo in non-strict mode Expected to fail but passed --- bar in non-strict mode """ expected_log = """=== Summary === - Ran 100 tests - Passed 98 tests (98.0%) - Failed 2 tests (2.0%) Failed Tests foo in non-strict mode Expected to fail but passed --- bar in non-strict mode """ result = mute(True)(test_suite.PrintSummary)(progress, True) self.assertEqual(expected_out, result) self.assertEqual(expected_log, fake_log.getvalue()) def test_summary_success_logfile(self): test_suite = test262.TestSuite(".", False, False, False, None) progress = test262.ProgressIndicator(100) progress.succeeded = 100 progress.failed = 0 fake_log = cStringIO.StringIO() test_suite.logf = fake_log result = mute(True)(test_suite.PrintSummary)(progress, True) expected_out = """ === Summary === - Ran 100 tests - All tests succeeded """ expected_log = """=== Summary === - Ran 100 tests - All tests succeeded """ self.assertEqual(expected_out, result) self.assertEqual(expected_log, fake_log.getvalue()) def test_percent_format(self): self.assertEqual(test262.PercentFormat(1, 100), "1 test (1.0%)") self.assertEqual(test262.PercentFormat(0, 100), "0 tests (0.0%)") self.assertEqual(test262.PercentFormat(99, 100), "99 tests (99.0%)") # module level utility functions # copied from https://stackoverflow.com/questions/2828953/silence-the-stdout-of-a-function-in-python-without-trashing-sys-stdout-and-resto def mute(returns_output=False): """ Decorate a function that prints to stdout, intercepting the output. If "returns_output" is True, the function will return a generator yielding the printed lines instead of the return values. The decorator litterally hijack sys.stdout during each function execution for ALL THE THREADS, so be careful with what you apply it to and in which context. >>> def numbers(): print "42" print "1984" ... >>> numbers() 42 1984 >>> mute()(numbers)() >>> list(mute(True)(numbers)()) ['42', '1984'] """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): saved_stdout = sys.stdout sys.stdout = cStringIO.StringIO() try: out = func(*args, **kwargs) if returns_output: out = sys.stdout.getvalue() finally: sys.stdout = saved_stdout return out return wrapper return decorator if __name__ == '__main__': unittest.main()