class TestBasicRetrieval(unittest.TestCase): def setUp(self): self.texpect = TExpect() self.texpect._buf = 'Welcome to Windows. Press Ctrl-Alt-Delete to begin' def test_sequential_read(self): self.accumulator = '' def __cb(res): self.accumulator += res return res d = self.texpect.read_until('Windows') d.addCallback(__cb) d.addCallback(lambda res: self.texpect.read_until('Delete')) d.addCallback(__cb) d.addCallback(lambda x: self.assertEqual(self.accumulator, 'Welcome to Windows. Press Ctrl-Alt-Delete')) return d def test_write(self): self.texpect.transport = StringTransport() d = self.texpect.read_until('Alt-') d.addCallback(self.texpect.write) d.addCallback(lambda x: self.assertEqual(self.texpect.transport.value(), 'Welcome to Windows. Press Ctrl-Alt-')) return d
class TestSequence(unittest.TestCase): def setUp(self): self.texpect = TExpect() self.texpect.transport = StringTransport() self.texpect._buf = 'Welcome to Windows. Press Ctrl-Alt-Delete to begin' def test_double_read_1(self): """ If the argument of the first request was in the buffer, the errback on the second one would've never been called (see L{test_wrong_sequence_no_failure}). As the documentation states, in such cases the behaviour is undefined """ d1 = self.texpect.read_until('toz') d2 = self.texpect.read_until('Press') return self.failUnlessFailure(d2, OutOfSequenceError) def test_double_read_2(self): d1 = self.texpect.read_until('foobar') d2 = self.texpect.expect(['to']) return self.failUnlessFailure(d2, OutOfSequenceError) def test_wrong_sequence_no_failure(self): d1 = self.texpect.read_until('to') d2 = self.texpect.read_until('Press') def test_wrong_sequence_delayed(self): """ Unlike L{test_wrong_sequence_no_failure}, this (rightfully) fails, because by the time data arrives, the erroneous second call to L{read_until} was already made """ self.texpect._buf = '' dc = reactor.callLater(1, self.texpect.applicationDataReceived, 'Welcome to Windows. Press Ctrl-Alt-Delete to begin') d1 = self.texpect.read_until('to') d2 = self.texpect.read_until('Press') self.addCleanup(dc.cancel) return self.failUnlessFailure(d2, OutOfSequenceError) def test_write_after_read(self): d1 = self.texpect.read_until('not-in-buffer') d2 = self.texpect.write('something') return self.failUnlessFailure(d2, OutOfSequenceError) def test_correct_sequence(self): d1 = self.texpect.read_until('to') d1.addCallback(lambda res: self.texpect.read_until('Press'))