Index: third_party/pexpect/tests/test_screen.py |
diff --git a/third_party/pexpect/tests/test_screen.py b/third_party/pexpect/tests/test_screen.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2429e57a90a8984dd5bef6a3f4723942ab266d56 |
--- /dev/null |
+++ b/third_party/pexpect/tests/test_screen.py |
@@ -0,0 +1,287 @@ |
+#!/usr/bin/env python |
+''' |
+PEXPECT LICENSE |
+ |
+ This license is approved by the OSI and FSF as GPL-compatible. |
+ http://opensource.org/licenses/isc-license.txt |
+ |
+ Copyright (c) 2012, Noah Spurrier <noah@noah.org> |
+ PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY |
+ PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE |
+ COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES. |
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
+ |
+''' |
+ |
+import sys |
+ |
+from pexpect import screen |
+import unittest |
+from . import PexpectTestCase |
+ |
+PY3 = (sys.version_info[0] >= 3) |
+ |
+fill1_target='XXXXXXXXXX\n' + \ |
+'XOOOOOOOOX\n' + \ |
+'XO::::::OX\n' + \ |
+'XO:oooo:OX\n' + \ |
+'XO:o..o:OX\n' + \ |
+'XO:o..o:OX\n' + \ |
+'XO:oooo:OX\n' + \ |
+'XO::::::OX\n' + \ |
+'XOOOOOOOOX\n' + \ |
+'XXXXXXXXXX' |
+fill2_target = 'XXXXXXXXXXX\n' + \ |
+'XOOOOOOOOOX\n' + \ |
+'XO:::::::OX\n' + \ |
+'XO:ooooo:OX\n' + \ |
+'XO:o...o:OX\n' + \ |
+'XO:o.+.o:OX\n' + \ |
+'XO:o...o:OX\n' + \ |
+'XO:ooooo:OX\n' + \ |
+'XO:::::::OX\n' + \ |
+'XOOOOOOOOOX\n' + \ |
+'XXXXXXXXXXX' |
+put_target = '\\.3.5.7.9/\n' + \ |
+'.........2\n' + \ |
+'3.........\n' + \ |
+'.........4\n' + \ |
+'5...\\/....\n' + \ |
+'..../\\...6\n' + \ |
+'7.........\n' + \ |
+'.........8\n' + \ |
+'9.........\n' + \ |
+'/2.4.6.8.\\' |
+scroll_target = '\\.3.5.7.9/\n' + \ |
+'\\.3.5.7.9/\n' + \ |
+'\\.3.5.7.9/\n' + \ |
+'\\.3.5.7.9/\n' + \ |
+'5...\\/....\n' + \ |
+'..../\\...6\n' + \ |
+'/2.4.6.8.\\\n' + \ |
+'/2.4.6.8.\\\n' + \ |
+'/2.4.6.8.\\\n' + \ |
+'/2.4.6.8.\\' |
+insert_target = 'ZXZZZZZZXZ\n' +\ |
+'.........2\n' +\ |
+'3.........\n' +\ |
+'.........4\n' +\ |
+'Z5...\\/...\n' +\ |
+'..../Z\\...\n' +\ |
+'7.........\n' +\ |
+'.........8\n' +\ |
+'9.........\n' +\ |
+'ZZ/2.4.6ZZ' |
+get_region_target = ['......', '.\\/...', './\\...', '......'] |
+ |
+unicode_box_unicode_result = u'\u2554\u2557\n\u255A\u255D' |
+unicode_box_pretty_result = u'''\ |
++--+ |
+|\u2554\u2557| |
+|\u255A\u255D| |
++--+ |
+''' |
+unicode_box_ascii_bytes_result = b'??\n??' |
+unicode_box_cp437_bytes_result = b'\xc9\xbb\n\xc8\xbc' |
+unicode_box_utf8_bytes_result = b'\xe2\x95\x94\xe2\x95\x97\n\xe2\x95\x9a\xe2\x95\x9d' |
+ |
+class screenTestCase (PexpectTestCase.PexpectTestCase): |
+ def make_screen_with_put (self): |
+ s = screen.screen(10,10) |
+ s.fill ('.') |
+ for r in range (1,s.rows + 1): |
+ if r % 2: |
+ s.put_abs (r, 1, str(r)) |
+ else: |
+ s.put_abs (r, s.cols, str(r)) |
+ for c in range (1,s.cols + 1): |
+ if c % 2: |
+ s.put_abs (1, c, str(c)) |
+ else: |
+ s.put_abs (s.rows, c, str(c)) |
+ s.put_abs(1,1, '\\') |
+ s.put_abs(1,s.cols, '/') |
+ s.put_abs(s.rows,1,'/') |
+ s.put_abs(s.rows, s.cols, '\\') |
+ s.put_abs(5,5,'\\') |
+ s.put_abs(5,6,'/') |
+ s.put_abs(6,5,'/') |
+ s.put_abs(6,6,'\\') |
+ return s |
+ |
+ def test_fill (self): |
+ s = screen.screen (10,10) |
+ s.fill_region (10,1,1,10,'X') |
+ s.fill_region (2,2,9,9,'O') |
+ s.fill_region (8,8,3,3,':') |
+ s.fill_region (4,7,7,4,'o') |
+ s.fill_region (6,5,5,6,'.') |
+ assert str(s) == fill1_target |
+ |
+ s = screen.screen (11,11) |
+ s.fill_region (1,1,11,11,'X') |
+ s.fill_region (2,2,10,10,'O') |
+ s.fill_region (9,9,3,3,':') |
+ s.fill_region (4,8,8,4,'o') |
+ s.fill_region (7,5,5,7,'.') |
+ s.fill_region (6,6,6,6,'+') |
+ assert str(s) == fill2_target |
+ def test_put (self): |
+ s = self.make_screen_with_put() |
+ assert str(s) == put_target |
+ def test_get_region (self): |
+ s = self.make_screen_with_put() |
+ r = s.get_region (4,4,7,9) |
+ assert r == get_region_target |
+ |
+ def test_cursor_save (self): |
+ s = self.make_screen_with_put() |
+ s.cursor_home (5,5) |
+ c = s.get() |
+ s.cursor_save() |
+ s.cursor_home() |
+ s.cursor_forward() |
+ s.cursor_down() |
+ s.cursor_unsave() |
+ assert s.cur_r == 5 and s.cur_c == 5 |
+ assert c == s.get() |
+ def test_scroll (self): |
+ s = self.make_screen_with_put() |
+ s.scroll_screen_rows (1,4) |
+ s.scroll_down(); s.scroll_down(); s.scroll_down() |
+ s.scroll_down(); s.scroll_down(); s.scroll_down() |
+ s.scroll_screen_rows (7,10) |
+ s.scroll_up(); s.scroll_up(); s.scroll_up() |
+ s.scroll_up(); s.scroll_up(); s.scroll_up() |
+ assert str(s) == scroll_target |
+ def test_insert (self): |
+ s = self.make_screen_with_put() |
+ s.insert_abs (10,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (10,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (1,1,'Z') |
+ s.insert_abs (5,1,'Z') |
+ s.insert_abs (6,6,'Z') |
+ s.cursor_home (1,1) # Also test relative insert. |
+ s.insert ('Z') |
+ s.insert ('Z') |
+ s.insert ('Z') |
+ s.insert ('Z') |
+ s.insert_abs (1,8,'X') |
+ s.insert_abs (1,2,'X') |
+ s.insert_abs (10,9,'Z') |
+ s.insert_abs (10,9,'Z') |
+ assert str(s) == insert_target |
+ |
+ def make_screen_with_box_unicode(self, *args, **kwargs): |
+ '''Creates a screen containing a box drawn using double-line |
+ line drawing characters. The characters are fed in as |
+ unicode. ''' |
+ s = screen.screen (2,2,*args,**kwargs) |
+ s.put_abs (1,1,u'\u2554') |
+ s.put_abs (1,2,u'\u2557') |
+ s.put_abs (2,1,u'\u255A') |
+ s.put_abs (2,2,u'\u255D') |
+ return s |
+ |
+ def make_screen_with_box_cp437(self, *args, **kwargs): |
+ '''Creates a screen containing a box drawn using double-line |
+ line drawing characters. The characters are fed in as |
+ CP437. ''' |
+ s = screen.screen (2,2,*args,**kwargs) |
+ s.put_abs (1,1,b'\xc9') |
+ s.put_abs (1,2,b'\xbb') |
+ s.put_abs (2,1,b'\xc8') |
+ s.put_abs (2,2,b'\xbc') |
+ return s |
+ |
+ def make_screen_with_box_utf8(self, *args, **kwargs): |
+ '''Creates a screen containing a box drawn using double-line |
+ line drawing characters. The characters are fed in as |
+ UTF-8. ''' |
+ s = screen.screen (2,2,*args,**kwargs) |
+ s.put_abs (1,1,b'\xe2\x95\x94') |
+ s.put_abs (1,2,b'\xe2\x95\x97') |
+ s.put_abs (2,1,b'\xe2\x95\x9a') |
+ s.put_abs (2,2,b'\xe2\x95\x9d') |
+ return s |
+ |
+ def test_unicode_ascii (self): |
+ # With the default encoding set to ASCII, we should still be |
+ # able to feed in unicode strings and get them back out: |
+ s = self.make_screen_with_box_unicode('ascii') |
+ if PY3: |
+ assert str(s) == unicode_box_unicode_result |
+ else: |
+ assert unicode(s) == unicode_box_unicode_result |
+ # And we should still get something for Python 2 str(), though |
+ # it might not be very useful |
+ str(s) |
+ |
+ assert s.pretty() == unicode_box_pretty_result |
+ |
+ def test_decoding_errors(self): |
+ # With strict error handling, it should reject bytes it can't decode |
+ with self.assertRaises(UnicodeDecodeError): |
+ self.make_screen_with_box_cp437('ascii', 'strict') |
+ |
+ # replace should turn them into unicode replacement characters, U+FFFD |
+ s = self.make_screen_with_box_cp437('ascii', 'replace') |
+ expected = u'\ufffd\ufffd\n\ufffd\ufffd' |
+ if PY3: |
+ assert str(s) == expected |
+ else: |
+ assert unicode(s) == expected |
+ |
+ def test_unicode_cp437 (self): |
+ # Verify decoding from and re-encoding to CP437. |
+ s = self.make_screen_with_box_cp437('cp437','strict') |
+ if PY3: |
+ assert str(s) == unicode_box_unicode_result |
+ else: |
+ assert unicode(s) == unicode_box_unicode_result |
+ assert str(s) == unicode_box_cp437_bytes_result |
+ assert s.pretty() == unicode_box_pretty_result |
+ |
+ def test_unicode_utf8 (self): |
+ # Verify decoding from and re-encoding to UTF-8. |
+ s = self.make_screen_with_box_utf8('utf-8','strict') |
+ if PY3: |
+ assert str(s) == unicode_box_unicode_result |
+ else: |
+ assert unicode(s) == unicode_box_unicode_result |
+ assert str(s) == unicode_box_utf8_bytes_result |
+ assert s.pretty() == unicode_box_pretty_result |
+ |
+ def test_no_bytes(self): |
+ s = screen.screen(2, 2, encoding=None) |
+ s.put_abs(1, 1, u'A') |
+ s.put_abs(2, 2, u'D') |
+ |
+ with self.assertRaises(TypeError): |
+ s.put_abs(1, 2, b'B') |
+ |
+ if PY3: |
+ assert str(s) == u'A \n D' |
+ else: |
+ assert unicode(s) == u'A \n D' |
+ # This will still work if it's limited to ascii |
+ assert str(s) == b'A \n D' |
+ |
+if __name__ == '__main__': |
+ unittest.main() |
+ |
+suite = unittest.makeSuite(screenTestCase,'test') |
+ |
+ |