~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/script.py

Implement a 'cat' command.

* bzrlib/tests/test_script.py:
(TestCat): Test the 'cat' command.

* bzrlib/tests/script.py:
(TestCaseWithScript): TestCase that can run shell-like
scripts. Implement 'cat' to fill files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
from cStringIO import StringIO
17
18
import shlex
18
19
 
 
20
from bzrlib import tests
 
21
 
19
22
 
20
23
def split(s):
21
24
    """Split a command line respecting quotes."""
97
100
    if cmd_cur is not None:
98
101
        commands.append((cmd_cur, input, output, error))
99
102
    return commands
 
103
 
 
104
 
 
105
class TestCaseWithScript(tests.TestCaseWithTransport):
 
106
 
 
107
    def setUp(self):
 
108
        super(TestCaseWithScript, self).setUp()
 
109
        self._vars = {}
 
110
 
 
111
    def run_script(self, text):
 
112
        for cmd, input, output, error in _script_to_commands(text):
 
113
            self.run_command(cmd, input, output, error)
 
114
 
 
115
    def run_command(self, cmd, input, output, error):
 
116
        mname = 'do_' + cmd[0]
 
117
        method = getattr(self, mname, None)
 
118
        if method is None:
 
119
            raise SyntaxError('Command not found "%s"' % (cmd[0],),
 
120
                              None, 1, ' '.join(cmd))
 
121
        if input is None:
 
122
            str_input = ''
 
123
        else:
 
124
            str_input = ''.join(input)
 
125
        actual_output, actual_error = method(str_input, cmd[1:])
 
126
        if output is None:
 
127
            output = ''
 
128
        self.assertEquals(''.join(output), actual_output)
 
129
        if error is None:
 
130
            error = ''
 
131
        self.assertEquals(''.join(error), actual_error)
 
132
        return actual_output, actual_error
 
133
 
 
134
    def do_cat(self, input, args):
 
135
        in_name = None
 
136
        out_name = None
 
137
        syntax_ok = False
 
138
        if not args:
 
139
            in_name = None
 
140
            out_name = None
 
141
            syntax_ok = True
 
142
        elif len(args) == 1:
 
143
            in_name = args[0]
 
144
            if in_name.startswith('>'):
 
145
                out_name = in_name[1:]
 
146
                in_name = None
 
147
            else:
 
148
                out_name = None
 
149
            syntax_ok = True
 
150
        elif len(args) == 2:
 
151
            in_name, out_name = args[0], args[1][1:]
 
152
            syntax_ok = args[1].startswith('>')
 
153
        if not syntax_ok:
 
154
            raise SyntaxError('Usage: cat [file1] [>file2]')
 
155
        if in_name is not None:
 
156
            infile = open(in_name, 'rb')
 
157
            try:
 
158
                input = infile.read()
 
159
            finally:
 
160
                infile.close()
 
161
        out = StringIO(input)
 
162
        output = out.getvalue()
 
163
        if out_name is not None:
 
164
            outfile = open(out_name, 'wb')
 
165
            try:
 
166
                outfile.write(output)
 
167
            finally:
 
168
                outfile.close()
 
169
            output = ''
 
170
        return output, ''
 
171
 
 
172