25
28
class TestSyntax(tests.TestCase):
27
30
def test_comment_is_ignored(self):
28
self.assertEquals([], script._script_to_commands('#comment\n'))
30
def test_empty_line_is_ignored(self):
31
self.assertEquals([], script._script_to_commands('\n'))
31
self.assertEqual([], script._script_to_commands('#comment\n'))
33
def test_comment_multiple_lines(self):
35
(['bar'], None, None, None),
37
script._script_to_commands("""
38
# this comment is ignored
44
def test_trim_blank_lines(self):
45
"""Blank lines are respected, but trimmed at the start and end.
47
Python triple-quoted syntax is going to give stubby/empty blank lines
48
right at the start and the end. These are cut off so that callers don't
49
need special syntax to avoid them.
51
However we do want to be able to match commands that emit blank lines.
54
(['bar'], None, '\n', None),
56
script._script_to_commands("""
33
61
def test_simple_command(self):
34
self.assertEquals([(['cd', 'trunk'], None, None, None)],
62
self.assertEqual([(['cd', 'trunk'], None, None, None)],
35
63
script._script_to_commands('$ cd trunk'))
37
65
def test_command_with_single_quoted_param(self):
38
66
story = """$ bzr commit -m 'two words'"""
39
self.assertEquals([(['bzr', 'commit', '-m', "'two words'"],
67
self.assertEqual([(['bzr', 'commit', '-m', "'two words'"],
40
68
None, None, None)],
41
69
script._script_to_commands(story))
43
71
def test_command_with_double_quoted_param(self):
44
72
story = """$ bzr commit -m "two words" """
45
self.assertEquals([(['bzr', 'commit', '-m', '"two words"'],
73
self.assertEqual([(['bzr', 'commit', '-m', '"two words"'],
46
74
None, None, None)],
47
75
script._script_to_commands(story))
49
77
def test_command_with_input(self):
51
79
[(['cat', '>file'], 'content\n', None, None)],
52
80
script._script_to_commands('$ cat >file\n<content\n'))
79
107
2>bzr: ERROR: Not a branch: "foo"
81
self.assertEquals([(['bzr', 'branch', 'foo'],
109
self.assertEqual([(['bzr', 'branch', 'foo'],
82
110
None, None, 'bzr: ERROR: Not a branch: "foo"\n')],
83
111
script._script_to_commands(story))
133
161
class TestExecution(script.TestCaseWithTransportAndScript):
135
163
def test_unknown_command(self):
136
self.assertRaises(SyntaxError, self.run_script, 'foo')
164
"""A clear error is reported for commands that aren't recognised
166
Testing the attributes of the SyntaxError instance is equivalent to
167
using traceback.format_exception_only and comparing with:
168
File "<string>", line 1
171
SyntaxError: Command not found "foo"
173
e = self.assertRaises(SyntaxError, self.run_script, "$ foo --frob")
174
self.assertContainsRe(e.msg, "not found.*foo")
175
self.assertEqual(e.text, "foo --frob")
177
def test_blank_output_mismatches_output(self):
178
"""If you give output, the output must actually be blank.
180
See <https://bugs.launchpad.net/bzr/+bug/637830>: previously blank
181
output was a wildcard. Now you must say ... if you want that.
183
self.assertRaises(AssertionError,
189
def test_null_output_matches_option(self):
190
"""If you want null output to be a wild card, you can pass
191
null_output_matches_anything to run_script"""
195
""", null_output_matches_anything=True)
197
def test_ellipsis_everything(self):
198
"""A simple ellipsis matches everything."""
204
def test_ellipsis_matches_empty(self):
138
210
def test_stops_on_unexpected_output(self):
227
310
def test_cat_input_to_output(self):
228
311
retcode, out, err = self.run_command(['cat'],
229
312
'content\n', 'content\n', None)
230
self.assertEquals('content\n', out)
231
self.assertEquals(None, err)
313
self.assertEqual('content\n', out)
314
self.assertEqual(None, err)
233
316
def test_cat_file_to_output(self):
234
317
self.build_tree_contents([('file', 'content\n')])
235
318
retcode, out, err = self.run_command(['cat', 'file'],
236
319
None, 'content\n', None)
237
self.assertEquals('content\n', out)
238
self.assertEquals(None, err)
320
self.assertEqual('content\n', out)
321
self.assertEqual(None, err)
240
323
def test_cat_input_to_file(self):
241
324
retcode, out, err = self.run_command(['cat', '>file'],
242
325
'content\n', None, None)
243
326
self.assertFileEqual('content\n', 'file')
244
self.assertEquals(None, out)
245
self.assertEquals(None, err)
327
self.assertEqual(None, out)
328
self.assertEqual(None, err)
246
329
retcode, out, err = self.run_command(['cat', '>>file'],
247
330
'more\n', None, None)
248
331
self.assertFileEqual('content\nmore\n', 'file')
249
self.assertEquals(None, out)
250
self.assertEquals(None, err)
332
self.assertEqual(None, out)
333
self.assertEqual(None, err)
252
335
def test_cat_file_to_file(self):
253
336
self.build_tree_contents([('file', 'content\n')])
314
397
self.assertRaises(ValueError, self.run_script, '$ cd ..')
316
399
def test_cd_dir_and_back_home(self):
317
self.assertEquals(self.test_dir, osutils.getcwd())
400
self.assertEqual(self.test_dir, osutils.getcwd())
318
401
self.run_script("""
322
self.assertEquals(osutils.pathjoin(self.test_dir, 'dir'),
405
self.assertEqual(osutils.pathjoin(self.test_dir, 'dir'),
323
406
osutils.getcwd())
325
408
self.run_script('$ cd')
326
self.assertEquals(self.test_dir, osutils.getcwd())
409
self.assertEqual(self.test_dir, osutils.getcwd())
329
412
class TestBzr(script.TestCaseWithTransportAndScript):
331
414
def test_bzr_smoke(self):
332
self.run_script('$ bzr init branch')
333
self.failUnlessExists('branch')
417
Created a standalone tree (format: ...)
419
self.assertPathExists('branch')
336
422
class TestEcho(script.TestCaseWithMemoryTransportAndScript):
350
436
def test_echo_to_output(self):
351
437
retcode, out, err = self.run_command(['echo'], None, '\n', None)
352
self.assertEquals('\n', out)
353
self.assertEquals(None, err)
438
self.assertEqual('\n', out)
439
self.assertEqual(None, err)
355
441
def test_echo_some_to_output(self):
356
442
retcode, out, err = self.run_command(['echo', 'hello'],
357
443
None, 'hello\n', None)
358
self.assertEquals('hello\n', out)
359
self.assertEquals(None, err)
444
self.assertEqual('hello\n', out)
445
self.assertEqual(None, err)
361
447
def test_echo_more_output(self):
362
448
retcode, out, err = self.run_command(
363
449
['echo', 'hello', 'happy', 'world'],
364
450
None, 'hello happy world\n', None)
365
self.assertEquals('hello happy world\n', out)
366
self.assertEquals(None, err)
451
self.assertEqual('hello happy world\n', out)
452
self.assertEqual(None, err)
368
454
def test_echo_appended(self):
369
455
retcode, out, err = self.run_command(['echo', 'hello', '>file'],
370
456
None, None, None)
371
self.assertEquals(None, out)
372
self.assertEquals(None, err)
457
self.assertEqual(None, out)
458
self.assertEqual(None, err)
373
459
self.assertFileEqual('hello\n', 'file')
374
460
retcode, out, err = self.run_command(['echo', 'happy', '>>file'],
375
461
None, None, None)
376
self.assertEquals(None, out)
377
self.assertEquals(None, err)
462
self.assertEqual(None, out)
463
self.assertEqual(None, err)
378
464
self.assertFileEqual('hello\nhappy\n', 'file')
466
def test_empty_line_in_output_is_respected(self):
381
475
class TestRm(script.TestCaseWithTransportAndScript):
387
481
def test_rm_file(self):
388
482
self.run_script('$ echo content >file')
389
self.failUnlessExists('file')
483
self.assertPathExists('file')
390
484
self.run_script('$ rm file')
391
self.failIfExists('file')
485
self.assertPathDoesNotExist('file')
393
487
def test_rm_file_force(self):
394
self.failIfExists('file')
488
self.assertPathDoesNotExist('file')
395
489
self.run_script('$ rm -f file')
396
self.failIfExists('file')
490
self.assertPathDoesNotExist('file')
398
492
def test_rm_files(self):
399
493
self.run_script("""
400
494
$ echo content >file
401
495
$ echo content >file2
403
self.failUnlessExists('file2')
497
self.assertPathExists('file2')
404
498
self.run_script('$ rm file file2')
405
self.failIfExists('file2')
499
self.assertPathDoesNotExist('file2')
407
501
def test_rm_dir(self):
408
502
self.run_script('$ mkdir dir')
409
self.failUnlessExists('dir')
503
self.assertPathExists('dir')
410
504
self.run_script("""
412
506
2>rm: cannot remove 'dir': Is a directory
414
self.failUnlessExists('dir')
508
self.assertPathExists('dir')
416
510
def test_rm_dir_recursive(self):
417
511
self.run_script("""
421
self.failIfExists('dir')
515
self.assertPathDoesNotExist('dir')
424
518
class TestMv(script.TestCaseWithTransportAndScript):
431
525
def test_move_file(self):
432
526
self.run_script('$ echo content >file')
433
self.failUnlessExists('file')
527
self.assertPathExists('file')
434
528
self.run_script('$ mv file new_name')
435
self.failIfExists('file')
436
self.failUnlessExists('new_name')
529
self.assertPathDoesNotExist('file')
530
self.assertPathExists('new_name')
438
532
def test_move_unknown_file(self):
439
533
self.assertRaises(AssertionError,
455
549
$ echo content > file
457
551
self.run_script('$ mv file dir')
458
self.failUnlessExists('dir')
459
self.failIfExists('file')
460
self.failUnlessExists('dir/file')
552
self.assertPathExists('dir')
553
self.assertPathDoesNotExist('file')
554
self.assertPathExists('dir/file')
557
class cmd_test_confirm(commands.Command):
560
if ui.ui_factory.get_boolean(
562
# 'bzrlib.tests.test_script.confirm',
565
self.outf.write('Do it!\n')
570
class TestUserInteraction(script.TestCaseWithMemoryTransportAndScript):
572
def test_confirm_action(self):
573
"""You can write tests that demonstrate user confirmation.
575
Specifically, ScriptRunner does't care if the output line for the
576
prompt isn't terminated by a newline from the program; it's implicitly
577
terminated by the input.
579
commands.builtin_command_registry.register(cmd_test_confirm)
580
self.addCleanup(commands.builtin_command_registry.remove, 'test-confirm')
583
2>Really do it? ([y]es, [n]o): yes
587
2>Really do it? ([y]es, [n]o): no
592
class TestShelve(script.TestCaseWithTransportAndScript):
595
super(TestShelve, self).setUp()
598
Created a standalone tree (format: 2a)
603
$ bzr commit -m 'file added'
604
2>Committing to:...test/
606
2>Committed revision 1.
610
def test_shelve(self):
612
$ bzr shelve -m 'shelve bar'
613
2>Shelve? ([y]es, [N]o, [f]inish, [q]uit): yes
617
2>Shelve 1 change(s)? ([y]es, [N]o, [f]inish, [q]uit): yes
619
2>Changes shelved with id "1".
621
null_output_matches_anything=True)
627
def test_dont_shelve(self):
628
# We intentionally provide no input here to test EOF
630
$ bzr shelve -m 'shelve bar'
631
2>Shelve? ([y]es, [N]o, [f]inish, [q]uit):
632
2>No changes to shelve.
634
null_output_matches_anything=True)