| # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. |
| import os |
| import sys |
| from unittest import TestCase, main |
| |
| from mock import patch |
| |
| from ..ansitowin32 import StreamWrapper |
| from .. import initialise |
| from ..initialise import deinit, init |
| from .utils import osname, redirected_output, replace_by |
| |
| orig_stdout = sys.stdout |
| orig_stderr = sys.stderr |
| |
| |
| class InitTest(TestCase): |
| |
| def setUp(self): |
| # sanity check |
| self.assertNotWrapped() |
| |
| def tearDown(self): |
| sys.stdout = orig_stdout |
| sys.stderr = orig_stderr |
| initialise.orig_stdout = initialise.UNSET |
| initialise.orig_stderr = initialise.UNSET |
| |
| def assertWrapped(self): |
| self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') |
| self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') |
| self.assertTrue(isinstance(sys.stdout, StreamWrapper), |
| 'bad stdout wrapper') |
| self.assertTrue(isinstance(sys.stderr, StreamWrapper), |
| 'bad stderr wrapper') |
| |
| def assertNotWrapped(self): |
| self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') |
| self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') |
| |
| @patch('colorama.initialise.reset_all') |
| @patch('colorama.ansitowin32.winapi_test', lambda *_: True) |
| def testInitWrapsOnWindows(self, _): |
| with osname("nt"): |
| init() |
| self.assertWrapped() |
| |
| @patch('colorama.initialise.reset_all') |
| @patch('colorama.ansitowin32.winapi_test', lambda *_: False) |
| def testInitDoesntWrapOnEmulatedWindows(self, _): |
| with osname("nt"): |
| init() |
| self.assertNotWrapped() |
| |
| def testInitDoesntWrapOnNonWindows(self): |
| with osname("posix"): |
| init() |
| self.assertNotWrapped() |
| |
| def testInitDoesntWrapIfNone(self): |
| with replace_by(None): |
| init() |
| # We can't use assertNotWrapped here because replace_by(None) |
| # changes stdout/stderr already. |
| self.assertIsNone(sys.stdout) |
| self.assertIsNone(sys.stderr) |
| |
| def testInitAutoresetOnWrapsOnAllPlatforms(self): |
| with osname("posix"): |
| init(autoreset=True) |
| self.assertWrapped() |
| |
| def testInitWrapOffDoesntWrapOnWindows(self): |
| with osname("nt"): |
| init(wrap=False) |
| self.assertNotWrapped() |
| |
| def testInitWrapOffIncompatibleWithAutoresetOn(self): |
| self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) |
| |
| @patch('colorama.ansitowin32.winapi_test', lambda *_: True) |
| def testInitTwiceCanBeUndoneWithDeinitOnce(self): |
| with osname('nt'): |
| self.assertNotWrapped() |
| init() |
| self.assertWrapped() |
| init() |
| self.assertWrapped() |
| deinit() |
| self.assertNotWrapped() |
| |
| @patch('colorama.ansitowin32.winapi_test', lambda *_: True) |
| def testInitDeinitInitWorks(self): |
| with osname('nt'): |
| self.assertNotWrapped() |
| init() |
| self.assertWrapped() |
| deinit() |
| self.assertNotWrapped() |
| init() |
| self.assertWrapped() |
| deinit() |
| self.assertNotWrapped() |
| init() |
| self.assertWrapped() |
| |
| @patch('colorama.win32.SetConsoleTextAttribute') |
| @patch('colorama.initialise.AnsiToWin32') |
| def testAutoResetPassedOn(self, mockATW32, _): |
| with osname("nt"): |
| init(autoreset=True) |
| self.assertEqual(len(mockATW32.call_args_list), 2) |
| self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) |
| self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) |
| |
| @patch('colorama.initialise.AnsiToWin32') |
| def testAutoResetChangeable(self, mockATW32): |
| with osname("nt"): |
| init() |
| |
| init(autoreset=True) |
| self.assertEqual(len(mockATW32.call_args_list), 4) |
| self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) |
| self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) |
| |
| init() |
| self.assertEqual(len(mockATW32.call_args_list), 6) |
| self.assertEqual( |
| mockATW32.call_args_list[4][1]['autoreset'], False) |
| self.assertEqual( |
| mockATW32.call_args_list[5][1]['autoreset'], False) |
| |
| |
| @patch('colorama.initialise.atexit.register') |
| def testAtexitRegisteredOnlyOnce(self, mockRegister): |
| init() |
| self.assertTrue(mockRegister.called) |
| mockRegister.reset_mock() |
| init() |
| self.assertFalse(mockRegister.called) |
| |
| |
| if __name__ == '__main__': |
| main() |