rant 0.4.8 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/NEWS +31 -0
  2. data/README +3 -1
  3. data/Rantfile +53 -2
  4. data/doc/advanced.rdoc +86 -1
  5. data/doc/c.rdoc +8 -0
  6. data/doc/homepage/index.html +2 -0
  7. data/doc/rant.1 +4 -0
  8. data/doc/rant.rdoc +38 -0
  9. data/doc/rant_vs_rake.rdoc +13 -0
  10. data/doc/rantfile.rdoc +93 -63
  11. data/doc/sys.rdoc +568 -0
  12. data/lib/rant/coregen.rb +43 -16
  13. data/lib/rant/import/command.rb +7 -4
  14. data/lib/rant/import/filelist/more.rb +57 -0
  15. data/lib/rant/import/metadata.rb +5 -1
  16. data/lib/rant/import/nodes/default.rb +3 -24
  17. data/lib/rant/import/signedfile.rb +1 -8
  18. data/lib/rant/import/sys/more.rb +2 -1
  19. data/lib/rant/import/var/booleans.rb +65 -0
  20. data/lib/rant/import/var/lists.rb +34 -0
  21. data/lib/rant/import/var/numbers.rb +116 -0
  22. data/lib/rant/import/var/strings.rb +43 -0
  23. data/lib/rant/import.rb +19 -3
  24. data/lib/rant/node.rb +39 -6
  25. data/lib/rant/rantlib.rb +44 -8
  26. data/lib/rant/rantsys.rb +22 -54
  27. data/lib/rant/rantvar.rb +89 -256
  28. data/misc/TODO +18 -0
  29. data/misc/devel-notes +26 -1
  30. data/test/action.rant +24 -0
  31. data/test/deprecated/test_0_5_4.rb +53 -0
  32. data/test/deprecated/test_0_6_0.rb +1 -1
  33. data/test/dryrun/Rantfile +10 -0
  34. data/test/dryrun/foo.c +8 -0
  35. data/test/dryrun/test_dryrun.rb +31 -0
  36. data/test/import/c/dependencies/Rantfile +1 -1
  37. data/test/import/command/Rantfile +1 -1
  38. data/test/import/sys/test_tgz.rb +22 -0
  39. data/test/subdirs2/root.rant +11 -1
  40. data/test/subdirs2/sub1/sub.rant +3 -0
  41. data/test/subdirs2/test_subdirs2.rb +19 -0
  42. data/test/test_action.rb +75 -0
  43. data/test/test_filelist.rb +13 -10
  44. data/test/test_rant_interface.rb +2 -2
  45. data/test/test_rule.rb +121 -3
  46. data/test/test_sys_methods.rb +558 -0
  47. data/test/test_var.rb +10 -0
  48. data/test/tutil.rb +81 -8
  49. metadata +19 -2
@@ -0,0 +1,558 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+ require 'rant/import/sys/more'
5
+
6
+ $testDir ||= File.expand_path(File.dirname(__FILE__))
7
+
8
+ class TestSysMethods < Test::Unit::TestCase
9
+ include Rant::TestUtil
10
+ def setup
11
+ # Ensure we run in test directory.
12
+ Dir.chdir($testDir)
13
+ @rant = Rant::RantApp.new
14
+ @cx = @rant.cx
15
+ @sys = @cx.sys
16
+ end
17
+ def teardown
18
+ Dir.chdir($testDir)
19
+ Rant::Sys.rm_rf "t"
20
+ Rant::Sys.rm_rf Rant::FileList["*.t"]
21
+ end
22
+ def test_pwd
23
+ assert_equal Dir.pwd, @sys.pwd
24
+ end
25
+ def test_cd__mkdir_single_str__pwd__rmdir_single_empty_dir
26
+ out, err = capture_std do
27
+ assert_nothing_raised do
28
+ @sys.mkdir "t"
29
+ assert(test(?d, "t"))
30
+ @sys.cd "t"
31
+ assert_equal(File.join($testDir, "t"), @sys.pwd)
32
+ @sys.cd ".."
33
+ assert_equal($testDir, @sys.pwd)
34
+ @sys.rmdir "t"
35
+ assert(!test(?e, "t"))
36
+ end
37
+ end
38
+ assert err.empty?
39
+ lines = out.split(/\n/)
40
+ assert_equal 4, lines.size
41
+ assert_match(/mkdir\s+t/, lines[0])
42
+ assert_match(/cd\s+t/, lines[1])
43
+ assert_match(/cd\s+/, lines[2])
44
+ assert_match(/rmdir\s+t/, lines[3])
45
+ end
46
+ def test_cd_absolute_path_with_block
47
+ out, err = capture_std do
48
+ assert_raise(RuntimeError) do
49
+ @sys.mkdir "t"
50
+ @sys.cd(File.join($testDir, "t")) do
51
+ assert_equal(File.join($testDir, "t"), @sys.pwd)
52
+ raise
53
+ end
54
+ end
55
+ assert_equal $testDir, @sys.pwd
56
+ end
57
+ assert err.empty?
58
+ lines = out.split(/\n/)
59
+ assert_match(/mkdir\s+t/, lines[0])
60
+ assert_match(/cd\s.*t/, lines[1])
61
+ end
62
+ def test_mkdir_array__rmdir_array
63
+ out, err = capture_std do
64
+ assert_nothing_raised do
65
+ @sys.mkdir ["foo.t", File.join($testDir, "bar.t")]
66
+ assert test(?d, "foo.t")
67
+ assert test(?d, "bar.t")
68
+ assert_raise_kind_of(SystemCallError) do
69
+ @sys.mkdir "foo.t"
70
+ end
71
+ assert test(?d, "foo.t")
72
+ @sys.rmdir [File.join($testDir, "foo.t")]
73
+ assert !test(?e, "foo.t")
74
+ @sys.rmdir @sys["*.t"]
75
+ assert !test(?e, "bar.t")
76
+ end
77
+ end
78
+ assert err.empty?
79
+ lines = out.split(/\n/)
80
+ assert_equal 4, lines.size
81
+ assert_match(/mkdir.*foo\.t.*bar\.t/, lines[0])
82
+ assert_match(/mkdir.*foo\.t/, lines[1])
83
+ assert_match(/rmdir.*foo\.t/, lines[2])
84
+ assert_match(/rmdir.*bar\.t/, lines[3])
85
+ end
86
+ def test_plain_cp
87
+ open "a.t", "wb" do |f|
88
+ f << "a\nb\rc\n\rd\r\n"
89
+ end
90
+ out, err = capture_std do
91
+ assert_nothing_raised do
92
+ @sys.cp "a.t", "b.t"
93
+ end
94
+ end
95
+ assert test(?f, "b.t")
96
+ ca = File.open("a.t", "rb") { |f| f.read }
97
+ cb = File.open("b.t", "rb") { |f| f.read }
98
+ assert_equal ca, "a\nb\rc\n\rd\r\n"
99
+ assert_equal ca, cb
100
+ assert err.empty?
101
+ lines = out.split(/\n/)
102
+ assert_equal 1, lines.size
103
+ assert_match(/cp\s+a\.t\s+b\.t/, lines[0])
104
+ end
105
+ def test_cp_filelist_to_dir
106
+ open "a.t", "wb" do |f|
107
+ f << "a\nb\rc\n\rd\r\n"
108
+ end
109
+ out, err = capture_std do
110
+ assert_nothing_raised do
111
+ @sys.cp "a.t", "b.t"
112
+ @sys.mkdir "t"
113
+ @sys.cp @sys["*.t"], "t"
114
+ end
115
+ end
116
+ assert test(?f, "b.t")
117
+ assert test(?f, "t/a.t")
118
+ assert test(?f, "t/b.t")
119
+ ca = File.open("t/a.t", "rb") { |f| f.read }
120
+ cb = File.open("t/b.t", "rb") { |f| f.read }
121
+ assert_equal ca, "a\nb\rc\n\rd\r\n"
122
+ assert_equal ca, cb
123
+ assert err.empty?
124
+ lines = out.split(/\n/)
125
+ assert_equal 3, lines.size
126
+ assert_match(/cp\s+a\.t\s+b\.t/, lines[0])
127
+ assert_match(/mkdir\s+t/, lines[1])
128
+ assert_match(/cp\s+a\.t\s+b\.t\s+t/, lines[2])
129
+ end
130
+ def test_cp_dir_fail
131
+ out, err = capture_std do
132
+ @sys.mkdir "t"
133
+ assert test(?d, "t")
134
+ assert_raise_kind_of(SystemCallError) do
135
+ @sys.cp "t", "a.t"
136
+ end
137
+ end
138
+ #assert !test(?e, "a.t") # TODO
139
+ assert err.empty?
140
+ lines = out.split(/\n/)
141
+ assert_equal(2, lines.size)
142
+ end
143
+ def test_cp_r_like_cp
144
+ open "a.t", "wb" do |f|
145
+ f << "a\nb\rc\n\rd\r\n"
146
+ end
147
+ out, err = capture_std do
148
+ assert_nothing_raised do
149
+ @sys.cp_r "a.t", "b.t"
150
+ end
151
+ end
152
+ assert test(?f, "b.t")
153
+ ca = File.open("a.t", "rb") { |f| f.read }
154
+ cb = File.open("b.t", "rb") { |f| f.read }
155
+ assert_equal ca, "a\nb\rc\n\rd\r\n"
156
+ assert_equal ca, cb
157
+ assert err.empty?
158
+ lines = out.split(/\n/)
159
+ assert_equal 1, lines.size
160
+ assert_match(/cp -r\s+a\.t\s+b\.t/, lines[0])
161
+ end
162
+ def test_cp_r
163
+ out, err = capture_std do
164
+ @sys.mkdir "a.t"
165
+ @sys.mkdir "t"
166
+ open "a.t/a", "wb" do |f|
167
+ f << "a\nb\rc\n\rd\r\n"
168
+ end
169
+ @sys.touch "b.t"
170
+ assert_nothing_raised do
171
+ @sys.cp_r @sys["*.t"], "t"
172
+ end
173
+ end
174
+ assert test(?d, "t/a.t")
175
+ ca = File.open("t/a.t/a", "rb") { |f| f.read }
176
+ assert_equal ca, "a\nb\rc\n\rd\r\n"
177
+ assert test(?f, "t/b.t")
178
+ assert test(?d, "a.t")
179
+ assert test(?f, "a.t/a")
180
+ assert test(?f, "b.t")
181
+ lines = out.split(/\n/)
182
+ assert_equal 4, lines.size
183
+ assert_match(/cp -r\s.*t/, lines[3])
184
+ end
185
+ def test_plain_mv
186
+ open "a.t", "wb" do |f|
187
+ f << "a\nb\rc\n\rd\r\n"
188
+ end
189
+ out, err = capture_std do
190
+ assert_nothing_raised do
191
+ @sys.mv "a.t", "b.t"
192
+ end
193
+ end
194
+ assert test(?f, "b.t")
195
+ assert !test(?e, "a.t")
196
+ cb = File.open("b.t", "rb") { |f| f.read }
197
+ assert_equal cb, "a\nb\rc\n\rd\r\n"
198
+ assert err.empty?
199
+ lines = out.split(/\n/)
200
+ assert_equal 1, lines.size
201
+ assert_match(/mv\s+a\.t\s+b\.t/, lines[0])
202
+ end
203
+ def test_mv_dirs_and_files
204
+ out, err = capture_std do
205
+ @sys.mkdir "a.t"
206
+ @sys.mkdir "t"
207
+ @sys.touch "a.t/a"
208
+ @sys.touch "b.t"
209
+ assert_nothing_raised do
210
+ @sys.mv @sys["*.t"], "t"
211
+ end
212
+ end
213
+ assert test(?d, "t/a.t")
214
+ assert test(?f, "t/a.t/a")
215
+ assert test(?f, "t/b.t")
216
+ assert !test(?e, "a.t")
217
+ assert !test(?e, "b.t")
218
+ lines = out.split(/\n/)
219
+ assert_equal 5, lines.size
220
+ end
221
+ def test_plain_rm
222
+ out, err = capture_std do
223
+ @sys.touch "a.t"
224
+ assert test(?f, "a.t")
225
+ @sys.rm "a.t"
226
+ assert !test(?e, "a.t")
227
+ assert_raise_kind_of(SystemCallError) do
228
+ @sys.rm "a.t"
229
+ end
230
+ end
231
+ assert err.empty?
232
+ lines = out.split(/\n/)
233
+ assert_equal 3, lines.size
234
+ assert_match(/rm\s+a\.t/, lines[1])
235
+ end
236
+ def test_rm_dir_fail
237
+ out, err = capture_std do
238
+ @sys.mkdir "a.t"
239
+ assert test(?d, "a.t")
240
+ assert_raise_kind_of(SystemCallError) do
241
+ @sys.rm "a.t"
242
+ end
243
+ assert test(?d, "a.t")
244
+ end
245
+ end
246
+ def test_rm_filelist__touch_array
247
+ out, err = capture_std do
248
+ @sys.touch ["a.t", "b.t"]
249
+ assert test(?f, "a.t")
250
+ assert test(?f, "b.t")
251
+ @sys.rm @sys["*.t"]
252
+ assert !test(?e, "a.t")
253
+ assert !test(?e, "b.t")
254
+ end
255
+ assert err.empty?
256
+ lines = out.split(/\n/)
257
+ assert_equal 2, lines.size
258
+ end
259
+ def test_rm_f
260
+ out, err = capture_std do
261
+ @sys.touch "a.t"
262
+ assert test(?f, "a.t")
263
+ @sys.rm_f "a.t"
264
+ assert !test(?e, "a.t")
265
+ assert_nothing_raised do
266
+ @sys.rm_f "a.t"
267
+ @sys.rm_f ["a.t", "b.t"]
268
+ end
269
+ end
270
+ assert err.empty?
271
+ lines = out.split(/\n/)
272
+ assert_equal 4, lines.size
273
+ assert_match(/rm -f\s+a\.t/, lines[1])
274
+ end
275
+ def test_rm_r_dir__rm_r_fail_not_exist
276
+ out, err = capture_std do
277
+ @sys.mkdir "t"
278
+ @sys.touch "t/a"
279
+ @sys.mkdir "t/sub"
280
+ assert_nothing_raised do
281
+ @sys.rm_r "t"
282
+ end
283
+ assert !test(?e, "t")
284
+ assert_raise_kind_of(SystemCallError) do
285
+ @sys.rm_r "t"
286
+ end
287
+ end
288
+ assert err.empty?
289
+ lines = out.split(/\n/)
290
+ assert_equal 5, lines.size
291
+ assert_match(/rm -r\s+t/, lines[3])
292
+ end
293
+ def test_rm_rf
294
+ out, err = capture_std do
295
+ @sys.mkdir "t"
296
+ @sys.touch "t/a"
297
+ @sys.mkdir "t/sub"
298
+ assert_nothing_raised do
299
+ @sys.rm_rf "t"
300
+ end
301
+ assert !test(?e, "t")
302
+ assert_nothing_raised do
303
+ @sys.rm_rf "t"
304
+ end
305
+ end
306
+ assert err.empty?
307
+ lines = out.split(/\n/)
308
+ assert_equal 5, lines.size
309
+ assert_match(/rm -rf\s+t/, lines[3])
310
+ end
311
+ =begin
312
+ # TODO, but tested indirectly in many other tests anyway
313
+ def test_touch
314
+ end
315
+ =end
316
+ def test_safe_ln
317
+ open "a.t", "wb" do |f|
318
+ f << "a\nb\rc\n\rd\r\n"
319
+ end
320
+ out, err = capture_std do
321
+ assert_nothing_raised do
322
+ @sys.safe_ln "a.t", "b.t"
323
+ end
324
+ end
325
+ assert test(?f, "b.t")
326
+ ca = File.open("a.t", "rb") { |f| f.read }
327
+ cb = File.open("b.t", "rb") { |f| f.read }
328
+ assert_equal ca, "a\nb\rc\n\rd\r\n"
329
+ assert_equal ca, cb
330
+ assert err.empty?
331
+ lines = out.split(/\n/)
332
+ assert lines.size == 1 || lines.size == 2
333
+ assert_match(/(ln|cp)\s+a\.t\s+b\.t/, lines[-1])
334
+ lines[-1] =~ /(ln|cp)\s+a\.t\s+b\.t/
335
+ puts "\n*** hardlinks #{$1 == "ln" ? "" : "not"} supported ***"
336
+ if $1 == "ln"
337
+ assert test_hardlink("a.t", "b.t", :allow_write => true)
338
+ end
339
+ end
340
+ def test_compare_file
341
+ open "a.t", "wb" do |f|
342
+ f << "a\nb\rc\n\rd\r\n"
343
+ end
344
+ open "b.t", "wb" do |f|
345
+ f << "a\nb\rc\n\rd\r\n"
346
+ end
347
+ assert @sys.compare_file("a.t", "b.t")
348
+ end
349
+ def test_compare_file_binary?
350
+ # probably not the right test...
351
+ open "a.t", "wb" do |f|
352
+ f << "a\nb\rc\n\rd\r\n"
353
+ end
354
+ open "b.t", "wb" do |f|
355
+ f << "a\nb\rc\n\rd\n"
356
+ end
357
+ assert !@sys.compare_file("a.t", "b.t")
358
+ end
359
+ def test_compare_empty_files
360
+ Rant::Sys.touch "a.t"
361
+ Rant::Sys.touch "b.t"
362
+ assert @sys.compare_file("a.t", "b.t")
363
+ end
364
+ def test_ln__ln_f
365
+ Rant::Sys.write_to_file "a.t", "abc\n"
366
+ e = nil
367
+ out, err = capture_std do
368
+ begin
369
+ @sys.ln "a.t", "b.t"
370
+ rescue Exception => e
371
+ puts "\n*** hard links not supported ***"
372
+ assert(e.kind_of?(SystemCallError) ||
373
+ e.kind_of?(NotImplementedError),
374
+ "exception Errno::EOPNOTSUPP " +
375
+ "expected but #{e.class} risen")
376
+ end
377
+ end
378
+ if e
379
+ assert !test(?e, "b.t")
380
+ else
381
+ #assert test(?-, "b.t", "a.t")
382
+ assert test_hardlink("a.t", "b.t")
383
+ assert !test(?l, "b.t") # shouldn't be necessary
384
+ assert_file_content "b.t", "abc\n"
385
+ assert err.empty?
386
+ lines = out.split(/\n/)
387
+ assert_equal 1, lines.size
388
+ assert_match(/ln\s+a\.t\s+b\.t/, lines[0])
389
+
390
+ # further tests
391
+
392
+ Rant::Sys.mkdir "t"
393
+ out, err = capture_std do
394
+ assert_nothing_raised do
395
+ @sys.ln "a.t", "t"
396
+ end
397
+ end
398
+ #assert test(?-, "t/a.t", "a.t")
399
+ assert test_hardlink("t/a.t", "a.t")
400
+ assert_file_content "t/a.t", "abc\n"
401
+
402
+ Rant::Sys.touch "c.t"
403
+ capture_std do
404
+ assert_raise_kind_of(SystemCallError) do
405
+ @sys.ln "a.t", "c.t"
406
+ end
407
+ end
408
+ #assert !test(?-, "c.t", "a.t")
409
+ assert !test_hardlink("c.t", "a.t")
410
+ assert_file_content "c.t", ""
411
+
412
+ capture_std do
413
+ assert_nothing_raised do
414
+ @sys.ln_f "a.t", "c.t"
415
+ end
416
+ end
417
+ #assert test(?-, "c.t", "a.t")
418
+ assert test_hardlink("c.t", "a.t")
419
+ assert_file_content "c.t", "abc\n"
420
+ end
421
+ end
422
+ def test_ln_s__ln_sf
423
+ Rant::Sys.write_to_file "a.t", "abc\n"
424
+ e = nil
425
+ out, err = capture_std do
426
+ begin
427
+ @sys.ln_s "a.t", "b.t"
428
+ rescue Exception => e
429
+ puts "\n*** symbolic links not supported ***"
430
+ # TODO: raises NotImplementedError on WinXP/NTFS/ruby-1.8.2
431
+ assert(e.kind_of?(SystemCallError) ||
432
+ e.kind_of?(NotImplementedError),
433
+ "exception Errno::EOPNOTSUPP " +
434
+ "expected but #{e.class} risen")
435
+ end
436
+ end
437
+ if e
438
+ assert !test(?e, "b.t")
439
+ else
440
+ assert test(?l, "b.t")
441
+ assert_file_content "b.t", "abc\n"
442
+ assert err.empty?
443
+ lines = out.split(/\n/)
444
+ assert_equal 1, lines.size
445
+ assert_match(/ln -s\s+a\.t\s+b\.t/, lines[0])
446
+
447
+ # further tests
448
+
449
+ Rant::Sys.mkdir "t"
450
+ out, err = capture_std do
451
+ assert_nothing_raised do
452
+ @sys.ln_s File.expand_path("a.t"), "t"
453
+ end
454
+ end
455
+ assert test(?l, "t/a.t")
456
+ assert_file_content "t/a.t", "abc\n"
457
+
458
+ Rant::Sys.touch "c.t"
459
+ capture_std do
460
+ assert_raise_kind_of(SystemCallError) do
461
+ @sys.ln_s "a.t", "c.t"
462
+ end
463
+ end
464
+ assert !test(?l, "c.t")
465
+ assert_file_content "c.t", ""
466
+
467
+ capture_std do
468
+ assert_nothing_raised do
469
+ @sys.ln_sf "a.t", "c.t"
470
+ end
471
+ end
472
+ assert test(?l, "c.t")
473
+ assert_file_content "c.t", "abc\n"
474
+ end
475
+ end
476
+ def test_uptodate?
477
+ assert !@sys.uptodate?("a.t", [])
478
+ Rant::Sys.touch "a.t"
479
+ assert @sys.uptodate?("a.t", [])
480
+ timeout
481
+ Rant::Sys.touch "b.t"
482
+ assert !@sys.uptodate?("a.t", @sys.glob("*.t").exclude("a.t"))
483
+ Rant::Sys.touch ["a.t", "b.t"]
484
+ assert !@sys.uptodate?("a.t", ["b.t"])
485
+ timeout
486
+ Rant::Sys.touch "a.t"
487
+ assert @sys.uptodate?("a.t", ["b.t"])
488
+ Rant::Sys.touch "c.t"
489
+ assert !@sys.uptodate?("a.t", ["c.t", "b.t"])
490
+ end
491
+ def test_install
492
+ # TODO: more tests, especially option testing
493
+ Rant::Sys.mkdir "t"
494
+ Rant::Sys.mkdir ["lib.t", "lib.t/a"]
495
+ Rant::Sys.touch ["lib.t/a.s", "lib.t/a/b.s"]
496
+ out, err = capture_std do
497
+ Rant::Sys.cd "lib.t" do
498
+ assert_nothing_raised do
499
+ @sys.install @sys.glob("**/*").no_dir, "#$testDir/t"
500
+ end
501
+ end
502
+ end
503
+ assert err.empty?
504
+ assert !out.empty? # TODO: more accurate
505
+ assert_file_content "t/a.s", ""
506
+ assert_file_content "t/b.s", ""
507
+ end
508
+ def test_mkdir_p
509
+ out, err = capture_std do
510
+ assert_nothing_raised do
511
+ @sys.mkdir_p "t"
512
+ assert test(?d, "t")
513
+ @sys.mkdir_p "t/t1/t2/t3"
514
+ assert test(?d, "t/t1/t2/t3")
515
+ @sys.mkdir_p ["#$testDir/tt/a", "ttt/a/b/c"]
516
+ assert test(?d, "tt/a")
517
+ assert test(?d, "ttt/a/b/c")
518
+ end
519
+ end
520
+ assert err.empty?
521
+ lines = out.split(/\n/)
522
+ assert_equal 3, lines.size
523
+ assert_match(/mkdir -p\s+t/, lines[0])
524
+ ensure
525
+ Rant::Sys.rm_rf ["tt", "ttt"]
526
+ end
527
+ def test_chmod
528
+ # TODO
529
+ Rant::Sys.touch "a.t"
530
+ out, err = capture_std do
531
+ assert_nothing_raised do
532
+ @sys.chmod 0755, "a.t"
533
+ end
534
+ end
535
+ assert err.empty?
536
+ lines = out.split(/\n/)
537
+ assert_equal 1, lines.size
538
+ assert_match(/chmod 0?755 a\.t/, lines[0])
539
+ s = File.stat("a.t")
540
+ unless (s.mode & 0777) == 0755
541
+ puts "\n***chmod 0755 not fully functional (actual: #{s.mode.to_s(8)}) ***"
542
+ end
543
+ end
544
+ def test_write_to_file
545
+ @cx.import "sys/more"
546
+ capture_std do
547
+ # TODO: specialize exception class
548
+ assert_raise_kind_of(StandardError) do
549
+ @sys.write_to_file "a.t", Object.new
550
+ end
551
+ end
552
+ assert !test(?e, "a.t")
553
+ out, err = capture_std do
554
+ @sys.write_to_file "a.t", "hello\n"
555
+ end
556
+ assert_file_content "a.t", "hello\n"
557
+ end
558
+ end
data/test/test_var.rb CHANGED
@@ -275,4 +275,14 @@ class TestVar < Test::Unit::TestCase
275
275
  ensure
276
276
  assert_equal(0, Rant::RantApp.new.run("-fvar.rf", "clean", "-q"))
277
277
  end
278
+ def test_rant_import
279
+ @rac.args.replace %w(-fvar.rf show_num)
280
+ run_import "-q", "ant.t"
281
+ assert_exit
282
+ out = run_ruby("ant.t", "-fvar.rf", "show_num")
283
+ assert_exit
284
+ assert_match(/num 1.1/, out)
285
+ ensure
286
+ Rant::Sys.rm_f "ant.t"
287
+ end
278
288
  end
data/test/tutil.rb CHANGED
@@ -1,6 +1,8 @@
1
1
 
2
2
  # This file contains methods that aid in testing Rant.
3
3
 
4
+ $-w = true
5
+
4
6
  require 'rant/rantlib'
5
7
  require 'rant/import/sys/tgz'
6
8
  require 'rant/import/sys/zip'
@@ -13,6 +15,8 @@ module Test
13
15
  res = 0
14
16
  capture = true
15
17
  newproc = false
18
+ tmax_1 = false
19
+ out, err = nil, nil
16
20
  args.flatten!
17
21
  args.reject! { |arg|
18
22
  if Symbol === arg
@@ -21,6 +25,7 @@ module Test
21
25
  when :v: capture = false
22
26
  when :verbose: capture = false
23
27
  when :x: newproc = true
28
+ when :tmax_1: tmax_1 = true
24
29
  else
25
30
  raise "No such option -- #{arg}"
26
31
  end
@@ -40,16 +45,30 @@ module Test
40
45
  end
41
46
  assert_equal(res, $?.exitstatus)
42
47
  end
43
- if capture
44
- capture_std do
45
- assert_equal(res, ::Rant::RantApp.new.run(*args))
46
- end
47
- else
48
- assert_equal(res, ::Rant::RantApp.new.run(*args))
49
- end
48
+ action = lambda {
49
+ if capture
50
+ out, err = capture_std do
51
+ assert_equal(res, ::Rant::RantApp.new.run(*args))
52
+ end
53
+ else
54
+ assert_equal(res, ::Rant::RantApp.new.run(*args))
55
+ end
56
+ }
57
+ if tmax_1
58
+ th = Thread.new(&action)
59
+ unless th.join(1)
60
+ th.kill
61
+ assert(false,
62
+ "execution aborted after 1 second")
63
+ end
64
+ else
65
+ action.call
66
+ end
67
+ return out, err
50
68
  end
51
69
  def assert_exit(status = 0)
52
- assert_equal(status, $?.exitstatus)
70
+ assert_equal(status, $?.exitstatus,
71
+ "exit status expected to be #{status} but is #{$?.exitstatus}")
53
72
  end
54
73
  def assert_file_content(fn, content, *opts)
55
74
  assert(test(?f, fn), "`#{fn}' doesn't exist")
@@ -64,6 +83,21 @@ module Test
64
83
  assert_raises(*args, &block)
65
84
  end
66
85
  end
86
+ def assert_raise_kind_of(klass)
87
+ e = nil
88
+ begin
89
+ yield
90
+ rescue Exception => e
91
+ end
92
+ if e.nil?
93
+ flunk("Exception `#{klass}' expected but non risen.")
94
+ else
95
+ unless e.kind_of? klass
96
+ flunk("Exception `#{klass}' expected " +
97
+ "but `#{e.class}' thrown")
98
+ end
99
+ end
100
+ end
67
101
  end # class TestCase
68
102
  end # module Unit
69
103
  end # module Test
@@ -221,6 +255,7 @@ def extract_requires(script, dynamic_requires = [])
221
255
  end
222
256
 
223
257
  module Rant::TestUtil
258
+ TEST_HARDLINK_BROKEN = Rant::Env.on_windows? && RUBY_VERSION < "1.8.4"
224
259
  def in_local_temp_dir(dirname = "t")
225
260
  dirname = dirname.dup
226
261
  base_dir = Dir.pwd
@@ -237,5 +272,43 @@ module Rant::TestUtil
237
272
  f.write content
238
273
  end
239
274
  end
275
+ # replacement for core <tt>test(?-, a, b)</tt> which is eventually
276
+ # corrupted
277
+ if TEST_HARDLINK_BROKEN
278
+ def test_hardlink(a, b, opts = {})
279
+ # test(?-, a, b) corrupt in ruby < 1.8.4 (final)
280
+ # on Windows
281
+
282
+ unless defined? @@corrupt_test_hardlink_msg
283
+ @@corrupt_test_hardlink_msg = true
284
+ puts "\n*** Ruby core test for hardlinks " +
285
+ "[test(?-, file1, file2)] considered broken. Using heuristics for unit tests. ***"
286
+ end
287
+
288
+ # Use some heuristic instead.
289
+ if test(?l, a)
290
+ return test(?l, b) &&
291
+ File.readlink(a) == File.readlink(b)
292
+ else
293
+ return false if test(?l, b)
294
+ end
295
+ content = File.read(a)
296
+ return false unless File.read(b) == content
297
+ if opts[:allow_write]
298
+ if content.size > 1
299
+ Rant::TestUtil.write_to_file(a, content[0])
300
+ else
301
+ Rant::TestUtil.write_to_file(a, "hardlink test\n")
302
+ end
303
+ File.read(a) == File.read(b)
304
+ else
305
+ true
306
+ end
307
+ end
308
+ else
309
+ def test_hardlink(a, b, opts = {})
310
+ test(?-, a, b)
311
+ end
312
+ end
240
313
  extend self
241
314
  end