Tim Hammerquist | 545ba4e | 2017-12-12 02:36:17 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python -tt |
| 2 | |
| 3 | """ |
| 4 | unittests.test_ansi |
| 5 | """ |
| 6 | |
| 7 | try: |
| 8 | import unittest2 as unittest |
| 9 | except ImportError: |
| 10 | import unittest |
| 11 | |
| 12 | import mock |
| 13 | import re |
| 14 | import StringIO |
| 15 | import sys |
| 16 | |
| 17 | import dbsign.ansi as A |
| 18 | |
| 19 | |
| 20 | class TestAnsi(unittest.TestCase): |
| 21 | def setUp(self): |
| 22 | self.test_text = "The quick brown fox, etc." |
| 23 | self.codes = A._ANSI_CODES |
| 24 | re_ansi = r"\033\[.*?m" |
| 25 | ansi_msg_pattern = r'(?P<begin>{0})(?P<middle>.*?)(?P<end>{0})' |
| 26 | self.re_ansi_msg = re.compile(ansi_msg_pattern.format(re_ansi)) |
| 27 | |
| 28 | @unittest.skipUnless(sys.stdout.isatty(), A.WARN("requires tty")) |
| 29 | def test_ansi_tty(self): |
| 30 | msg = self.test_text |
| 31 | |
| 32 | for color in self.codes: |
| 33 | with self.subTest(color): |
| 34 | ansi_msg = A.ANSI(color, msg) |
| 35 | self.assertTrue(ansi_msg.startswith(self.codes[color])) |
| 36 | self.assertTrue(ansi_msg.endswith(self.codes['clear'])) |
| 37 | |
| 38 | @unittest.skipUnless(sys.stdout.isatty(), A.WARN("requires tty")) |
| 39 | def test_ansi_convenience_tty(self): |
| 40 | msg = self.test_text |
| 41 | funcs = [A.OK, A.INFO, A.WARN, A.ERROR] |
| 42 | |
| 43 | for func in funcs: |
| 44 | with self.subTest(func=func.func_name): |
| 45 | ansi_msg = func(msg) |
| 46 | m = self.re_ansi_msg.match(ansi_msg) |
| 47 | self.assertTrue(m) |
| 48 | self.assertIn(m.group('begin'), self.codes.values()) |
| 49 | self.assertEqual(m.group('middle'), msg) |
| 50 | self.assertEqual(m.group('end'), self.codes['clear']) |
| 51 | |
| 52 | @mock.patch('sys.stdout', new_callable=StringIO.StringIO) |
| 53 | def test_ansi_notty(self, mock_stdout): |
| 54 | msg = self.test_text |
| 55 | |
| 56 | for color in self.codes: |
| 57 | with self.subTest(color): |
| 58 | ansi_msg = A.ANSI(color, msg) |
| 59 | self.assertEqual(msg, ansi_msg) |
| 60 | |
| 61 | @mock.patch('sys.stdout', new_callable=StringIO.StringIO) |
| 62 | def test_ansi_convenience_notty(self, mock_stdout): |
| 63 | msg = self.test_text |
| 64 | funcs = [A.OK, A.INFO, A.WARN, A.ERROR] |
| 65 | |
| 66 | for func in funcs: |
| 67 | with self.subTest(func=func.func_name): |
| 68 | self.assertEqual(msg, func(msg)) |