1 # Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
3 from unittest import TestCase, main, skipUnless
6 from unittest.mock import patch, Mock
8 from mock import patch, Mock
10 from ..ansitowin32 import StreamWrapper
11 from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests
12 from .utils import osname, replace_by
14 orig_stdout = sys.stdout
15 orig_stderr = sys.stderr
18 class InitTest(TestCase):
20 @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty")
23 self.assertNotWrapped()
26 _wipe_internal_state_for_tests()
27 sys.stdout = orig_stdout
28 sys.stderr = orig_stderr
30 def assertWrapped(self):
31 self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped')
32 self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped')
33 self.assertTrue(isinstance(sys.stdout, StreamWrapper),
35 self.assertTrue(isinstance(sys.stderr, StreamWrapper),
38 def assertNotWrapped(self):
39 self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped')
40 self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped')
42 @patch('colorama.initialise.reset_all')
43 @patch('colorama.ansitowin32.winapi_test', lambda *_: True)
44 @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False)
45 def testInitWrapsOnWindows(self, _):
50 @patch('colorama.initialise.reset_all')
51 @patch('colorama.ansitowin32.winapi_test', lambda *_: False)
52 def testInitDoesntWrapOnEmulatedWindows(self, _):
55 self.assertNotWrapped()
57 def testInitDoesntWrapOnNonWindows(self):
60 self.assertNotWrapped()
62 def testInitDoesntWrapIfNone(self):
63 with replace_by(None):
65 # We can't use assertNotWrapped here because replace_by(None)
66 # changes stdout/stderr already.
67 self.assertIsNone(sys.stdout)
68 self.assertIsNone(sys.stderr)
70 def testInitAutoresetOnWrapsOnAllPlatforms(self):
75 def testInitWrapOffDoesntWrapOnWindows(self):
78 self.assertNotWrapped()
80 def testInitWrapOffIncompatibleWithAutoresetOn(self):
81 self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False))
83 @patch('colorama.win32.SetConsoleTextAttribute')
84 @patch('colorama.initialise.AnsiToWin32')
85 def testAutoResetPassedOn(self, mockATW32, _):
88 self.assertEqual(len(mockATW32.call_args_list), 2)
89 self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True)
90 self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True)
92 @patch('colorama.initialise.AnsiToWin32')
93 def testAutoResetChangeable(self, mockATW32):
98 self.assertEqual(len(mockATW32.call_args_list), 4)
99 self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True)
100 self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True)
103 self.assertEqual(len(mockATW32.call_args_list), 6)
105 mockATW32.call_args_list[4][1]['autoreset'], False)
107 mockATW32.call_args_list[5][1]['autoreset'], False)
110 @patch('colorama.initialise.atexit.register')
111 def testAtexitRegisteredOnlyOnce(self, mockRegister):
113 self.assertTrue(mockRegister.called)
114 mockRegister.reset_mock()
116 self.assertFalse(mockRegister.called)
119 class JustFixWindowsConsoleTest(TestCase):
121 _wipe_internal_state_for_tests()
122 sys.stdout = orig_stdout
123 sys.stderr = orig_stderr
128 @patch("colorama.ansitowin32.winapi_test", lambda: True)
129 def testJustFixWindowsConsole(self):
130 if sys.platform != "win32":
131 # just_fix_windows_console should be a no-op
132 just_fix_windows_console()
133 self.assertIs(sys.stdout, orig_stdout)
134 self.assertIs(sys.stderr, orig_stderr)
137 # Emulate stdout=not a tty, stderr=tty
138 # to check that we handle both cases correctly
140 stdout.closed = False
141 stdout.isatty.return_value = False
142 stdout.fileno.return_value = 1
146 stderr.closed = False
147 stderr.isatty.return_value = True
148 stderr.fileno.return_value = 2
151 for native_ansi in [False, True]:
153 'colorama.ansitowin32.enable_vt_processing',
154 lambda *_: native_ansi
159 # Regular single-call test
160 prev_stdout = sys.stdout
161 prev_stderr = sys.stderr
162 just_fix_windows_console()
163 self.assertIs(sys.stdout, prev_stdout)
165 self.assertIs(sys.stderr, prev_stderr)
167 self.assertIsNot(sys.stderr, prev_stderr)
169 # second call without resetting is always a no-op
170 prev_stdout = sys.stdout
171 prev_stderr = sys.stderr
172 just_fix_windows_console()
173 self.assertIs(sys.stdout, prev_stdout)
174 self.assertIs(sys.stderr, prev_stderr)
179 # If init() runs first, just_fix_windows_console should be a no-op
181 prev_stdout = sys.stdout
182 prev_stderr = sys.stderr
183 just_fix_windows_console()
184 self.assertIs(prev_stdout, sys.stdout)
185 self.assertIs(prev_stderr, sys.stderr)
188 if __name__ == '__main__':