Index: third_party/pexpect/tests/test_unicode.py |
diff --git a/third_party/pexpect/tests/test_unicode.py b/third_party/pexpect/tests/test_unicode.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d2f933939de5bce9a3a0d3f69d068e1884eca11 |
--- /dev/null |
+++ b/third_party/pexpect/tests/test_unicode.py |
@@ -0,0 +1,187 @@ |
+# -*- coding: utf-8 -*- |
+from __future__ import unicode_literals |
+ |
+import platform |
+import tempfile |
+import sys |
+import time |
+ |
+import pexpect |
+import unittest |
+from . import PexpectTestCase |
+ |
+# the program cat(1) may display ^D\x08\x08 when \x04 (EOF, Ctrl-D) is sent |
+_CAT_EOF = '^D\x08\x08' |
+ |
+class UnicodeTests(PexpectTestCase.PexpectTestCase): |
+ def test_expect_basic (self): |
+ p = pexpect.spawnu('cat') |
+ p.sendline('Hello') |
+ p.sendline('there') |
+ p.sendline('Mr. þython') # þ is more like th than p, but never mind |
+ p.expect('Hello') |
+ p.expect('there') |
+ p.expect('Mr. þython') |
+ p.sendeof () |
+ p.expect (pexpect.EOF) |
+ |
+ def test_expect_exact_basic (self): |
+ p = pexpect.spawnu('cat') |
+ p.sendline('Hello') |
+ p.sendline('there') |
+ p.sendline('Mr. þython') |
+ p.expect_exact('Hello') |
+ p.expect_exact('there') |
+ p.expect_exact('Mr. þython') |
+ p.sendeof() |
+ p.expect_exact (pexpect.EOF) |
+ |
+ def test_expect_setecho_toggle(self): |
+ '''This tests that echo may be toggled off. |
+ ''' |
+ p = pexpect.spawnu('cat', timeout=5) |
+ try: |
+ self._expect_echo_toggle_off(p) |
+ except IOError: |
+ if sys.platform.lower().startswith('sunos'): |
+ if hasattr(unittest, 'SkipTest'): |
+ raise unittest.SkipTest("Not supported on this platform.") |
+ return 'skip' |
+ raise |
+ self._expect_echo_toggle_on(p) |
+ |
+ def test_expect_echo_exact (self): |
+ '''Like test_expect_echo(), but using expect_exact(). |
+ ''' |
+ p = pexpect.spawnu('cat', timeout=5) |
+ p.expect = p.expect_exact |
+ self._expect_echo(p) |
+ |
+ def test_expect_setecho_toggle_exact(self): |
+ p = pexpect.spawnu('cat', timeout=5) |
+ p.expect = p.expect_exact |
+ try: |
+ self._expect_echo_toggle_off(p) |
+ except IOError: |
+ if sys.platform.lower().startswith('sunos'): |
+ if hasattr(unittest, 'SkipTest'): |
+ raise unittest.SkipTest("Not supported on this platform.") |
+ return 'skip' |
+ raise |
+ self._expect_echo_toggle_on(p) |
+ |
+ def _expect_echo (self, p): |
+ p.sendline('1234') # Should see this twice (once from tty echo and again from cat). |
+ index = p.expect (['1234', 'abcdé', 'wxyz', pexpect.EOF, pexpect.TIMEOUT]) |
+ assert index == 0, (index, p.before) |
+ index = p.expect (['1234', 'abcdé', 'wxyz', pexpect.EOF]) |
+ assert index == 0, index |
+ |
+ def _expect_echo_toggle_off(self, p): |
+ p.setecho(0) # Turn off tty echo |
+ p.waitnoecho() |
+ p.sendline('abcdé') # Now, should only see this once. |
+ p.sendline('wxyz') # Should also be only once. |
+ index = p.expect ([pexpect.EOF,pexpect.TIMEOUT, 'abcdé', 'wxyz', '1234']) |
+ assert index == 2, index |
+ index = p.expect ([pexpect.EOF, 'abcdé', 'wxyz', '7890']) |
+ assert index == 2, index |
+ |
+ def _expect_echo_toggle_on(self, p): |
+ p.setecho(1) # Turn on tty echo |
+ time.sleep(0.2) # there is no waitecho() ! |
+ p.sendline('7890') # Should see this twice. |
+ index = p.expect ([pexpect.EOF, 'abcdé', 'wxyz', '7890']) |
+ assert index == 3, index |
+ index = p.expect ([pexpect.EOF, 'abcdé', 'wxyz', '7890']) |
+ assert index == 3, index |
+ p.sendeof() |
+ |
+ def test_log_unicode(self): |
+ msg = "abcΩ÷" |
+ filename_send = tempfile.mktemp() |
+ filename_read = tempfile.mktemp() |
+ p = pexpect.spawnu('cat') |
+ if platform.python_version_tuple() < ('3', '0', '0'): |
+ import codecs |
+ def open(fname, mode, **kwargs): |
+ if 'newline' in kwargs: |
+ del kwargs['newline'] |
+ return codecs.open(fname, mode, **kwargs) |
+ else: |
+ import io |
+ open = io.open |
+ |
+ p.logfile_send = open(filename_send, 'w', encoding='utf-8') |
+ p.logfile_read = open(filename_read, 'w', encoding='utf-8') |
+ p.sendline(msg) |
+ p.sendeof() |
+ p.expect(pexpect.EOF) |
+ p.close() |
+ p.logfile_send.close() |
+ p.logfile_read.close() |
+ |
+ # ensure the 'send' log is correct, |
+ with open(filename_send, 'r', encoding='utf-8') as f: |
+ self.assertEqual(f.read(), msg + '\n\x04') |
+ |
+ # ensure the 'read' log is correct, |
+ with open(filename_read, 'r', encoding='utf-8', newline='') as f: |
+ output = f.read().replace(_CAT_EOF, '') |
+ self.assertEqual(output, (msg + '\r\n')*2 ) |
+ |
+ |
+ def test_spawn_expect_ascii_unicode(self): |
+ # A bytes-based spawn should be able to handle ASCII-only unicode, for |
+ # backwards compatibility. |
+ p = pexpect.spawn('cat') |
+ p.sendline('Camelot') |
+ p.expect('Camelot') |
+ |
+ p.sendline('Aargh') |
+ p.sendline('Aårgh') |
+ p.expect_exact('Aargh') |
+ |
+ p.sendeof() |
+ p.expect(pexpect.EOF) |
+ |
+ def test_spawn_send_unicode(self): |
+ # A bytes-based spawn should be able to send arbitrary unicode |
+ p = pexpect.spawn('cat') |
+ p.sendline('3½') |
+ p.sendeof() |
+ p.expect(pexpect.EOF) |
+ |
+ def test_spawn_utf8_incomplete(self): |
+ # This test case ensures correct incremental decoding, which |
+ # otherwise fails when the stream inspected by os.read() |
+ # does not align exactly at a utf-8 multibyte boundry: |
+ # UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in |
+ # position 0: unexpected end of data |
+ p = pexpect.spawnu('cat', maxread=1) |
+ p.sendline('▁▂▃▄▅▆▇█') |
+ p.sendeof() |
+ p.expect('▁▂▃▄▅▆▇█') |
+ |
+ def test_readline_bin_echo(self): |
+ # Test using readline() with spawnu objects. pexpect 3.2 had threw |
+ # a TypeError when concatenating a bytestring to a unicode type. |
+ |
+ # given, |
+ child = pexpect.spawnu('echo', ['input', ]) |
+ |
+ # exercise, |
+ assert child.readline() == 'input' + child.crlf |
+ |
+ def test_unicode_argv(self): |
+ """ Ensure a program can be executed with unicode arguments. """ |
+ p = pexpect.spawn(u'echo ǝpoɔıun', timeout=5, encoding='utf8') |
+ p.expect(u'ǝpoɔıun') |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ assert p.exitstatus == 0 |
+ |
+if __name__ == '__main__': |
+ unittest.main() |
+ |
+suite = unittest.makeSuite(UnicodeTests, 'test') |