rant 0.5.4 → 0.5.6

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.
data/NEWS CHANGED
@@ -1,6 +1,30 @@
1
1
 
2
2
  = Rant NEWS
3
3
 
4
+ == Rant 0.5.6
5
+
6
+ Fixes and minor improvements:
7
+ * <tt>Package::Zip</tt>, <tt>Package::Tgz</tt>: Fix bug where a file
8
+ that starts with the package name wouldn't be included in the
9
+ package. (Reported and fixed by Kevin Burge.)
10
+ * Fixed: The C source file scanner used by the
11
+ <tt>C::Dependencies</tt> task was confused by C-style single-line
12
+ comments.
13
+ * Fix a typo in the <tt>C::Dependencies</tt> task which affected the
14
+ <tt>:search</tt> option. (Reported by Kevin Burge.)
15
+ * +RubyTest+ no longer uses +testrb+ as test runner per default. Thus
16
+ it works on systems without +testrb+ now (e.g. Debian based
17
+ systems). The old behaviour can be enabled by setting the +loader+
18
+ attribute to <tt>:testrb</tt>. A patch was provided by Max Nickel.
19
+
20
+ New features:
21
+ * The <tt>C::Dependencies</tt> task accepts the new option
22
+ <tt>:correct_case</tt>, which is useful on case-insenstive
23
+ file systems. (Patch provided by Peter Allin.)
24
+ Read doc/c.rdoc[link:files/doc/c_rdoc.html] for documentation.
25
+ * The method <tt>Rant::Sys.root_dir?</tt>.
26
+ Read doc/sys.rdoc[link:files/doc/sys_rdoc.html] for documentation.
27
+
4
28
  == Rant 0.5.4
5
29
 
6
30
  Incompatible changes:
data/README CHANGED
@@ -19,11 +19,7 @@ Rant currently features:
19
19
  * Optional recognition of file changes based on MD5 checksums instead
20
20
  of file modification times.
21
21
  * Tasks with command change recognition.
22
- * Primitive support for compiling C# sources portably with csc, cscc
23
- and mcs.
24
22
  * Dependency checking for C/C++ source files.
25
- * A _configure_ plugin for easy environment and build-parameter
26
- checking (but not like autoconf!) which saves data in a yaml file.
27
23
 
28
24
  As programmers usually want to see code, here is a short and very
29
25
  basic example of rant usage:
@@ -87,9 +83,9 @@ Buildfiles in subdirectories::
87
83
  Tasks with command change recognition::
88
84
  read doc/command.rdoc[link:files/doc/command_rdoc.html]
89
85
  Using the Configure plugin::
90
- read doc/configure.rdoc[link:files/doc/configure_rdoc.html]
86
+ read doc/configure.rdoc[link:files/doc/configure_rdoc.html] *deprecated*
91
87
  Compiling C#::
92
- read doc/csharp.rdoc[link:files/doc/csharp_rdoc.html]
88
+ read doc/csharp.rdoc[link:files/doc/csharp_rdoc.html] *deprecated*
93
89
  Common file system operations::
94
90
  read doc/sys.rdoc[link:files/doc/sys_rdoc.html]
95
91
  Upgrading::
data/Rantfile CHANGED
@@ -236,6 +236,7 @@ task "check-168" do
236
236
  puts "#{ok.size} of #{rbfiles.size} are OK"
237
237
  end
238
238
 
239
+ desc "Create local backup of svn repos on berlios."
239
240
  task "fetch-svn-dump" do
240
241
  require 'net/http'
241
242
  require 'uri'
@@ -249,6 +250,22 @@ task "fetch-svn-dump" do
249
250
  sys.write_to_file "../rant-repos_#{ds}.gz", res.body
250
251
  end
251
252
 
253
+ task "stats" do
254
+ require 'scriptlines'
255
+ files = sys["lib/**/*.rb"]
256
+ puts ScriptLines.headline
257
+ sum = ScriptLines.new("TOTAL (#{files.size} scripts)")
258
+ files.each { |fn|
259
+ File.open(fn) do |file|
260
+ script_lines = ScriptLines.new(fn)
261
+ script_lines.read(file)
262
+ sum += script_lines
263
+ puts script_lines
264
+ end
265
+ }
266
+ puts sum
267
+ end
268
+
252
269
  task "rb-stats" do
253
270
  files = sys["lib/**/*.rb"]
254
271
  lines = 0
data/doc/c.rdoc CHANGED
@@ -62,6 +62,36 @@ For a little example project using the C::Dependency generator look
62
62
  into the doc/examples/c_dependencies[link:../examples/c_dependencies]
63
63
  directory of the Rant distribution.
64
64
 
65
+ === Issues on case-insensitive file systems
66
+
67
+ If you are building on a case insensitive file system, your Compiler
68
+ will usually ignore the case of filenames in <tt>#include</tt>
69
+ statements. Thus if you have a header file called <tt>myutils.h</tt>
70
+ and the following preprocessor statement <tt>main.c</tt>:
71
+
72
+ #include "MyUtils.h"
73
+
74
+ The preprocessor will include the contents of <tt>myutils.h</tt>.
75
+ The problem is that Rant's node names are case sensitive. In the above
76
+ example Rant wouldn't track changes in files included by
77
+ <tt>myutils.h</tt> when compiling <tt>main.c</tt>.
78
+
79
+ To overcome this problem, set the <tt>:correct_case</tt> option to
80
+ true, e.g.:
81
+
82
+ gen C::Dependencies, :correct_case => true
83
+
84
+ Note that this option makes only sense on case-insensitive file
85
+ systems. It can also significantly slow down dependency checking.
86
+
87
+ Currently, the implementation of this option has one limit. In the
88
+ following statement
89
+
90
+ #include "someDir/MyUtils.h"
91
+
92
+ the case of <tt>someDir</tt> must be identical to the actual directory
93
+ name on disk!
94
+
65
95
  == See also
66
96
 
67
97
  Rantfile basics::
data/doc/filelist.rdoc CHANGED
@@ -104,8 +104,8 @@ There a five ways to obtain a +FileList+ object:
104
104
  fl.entries # => [".svn", ".README.txt.swp"]
105
105
 
106
106
  # compare the last example with the result of using
107
- # Rant::FileList.new:
108
- fl = Rant::FileList.new(".*")
107
+ # Rant::FileList[]:
108
+ fl = Rant::FileList[".*"]
109
109
  fl.entries # => [".", "..", ".svn", ".README.txt.swp"]
110
110
 
111
111
  Implementation Note:: Before the given block is called, the filelist
data/doc/package.rdoc CHANGED
@@ -148,7 +148,7 @@ for tgz packages. Just <tt>import "package/zip"</tt> and use the
148
148
  This has the same effect as our first example, with the only
149
149
  difference that a <tt>foo.zip</tt> archive will be created. As already
150
150
  mentioned, you can give the same options and flags as to the
151
- <tt>Package::Tgz</tt> generator and or course you can use both in the
151
+ <tt>Package::Tgz</tt> generator and of course you can use both in the
152
152
  same Rantfile:
153
153
 
154
154
  import "package/zip", "package/tgz"
data/doc/sys.rdoc CHANGED
@@ -587,6 +587,26 @@ standard output:
587
587
  Like <tt>glob(pattern1, pattern2, ...)</tt>, but the created filelist
588
588
  doesn't ignore entries starting with a dot.
589
589
 
590
+ * <b>root_dir?(path)</b>
591
+
592
+ Returns true if the given path specifies the root directory on
593
+ Linux/Unix, a drive followed by a slash or backslash on Windows.
594
+
595
+ Examples:
596
+
597
+ # on Linux/Unix:
598
+ sys.root_dir?("/") # true
599
+ sys.root_dir?("/bin") # false
600
+ sys.root_dir?("bin") # false
601
+
602
+ # on Windows:
603
+ sys.root_dir?("C:\\") # true
604
+ # (a reminder: a double backslash in a literal string is treated
605
+ # as an escape sequence and converted to a single backslash by
606
+ # ruby)
607
+ sys.root_dir?("C:/") # true
608
+ sys.root_dir?("bin") # false
609
+
590
610
  == See also
591
611
 
592
612
  Rantfile basics::
@@ -24,6 +24,16 @@ module Rant::C
24
24
  prev_line = nil
25
25
  src.each { |line|
26
26
  line.chomp!
27
+ if block_start_i = line.index("/*")
28
+ c_start_i = line.index("//")
29
+ if !c_start_i || block_start_i < c_start_i
30
+ if block_end_i = line.index("*/")
31
+ if block_end_i > block_start_i
32
+ line[block_start_i..block_end_i+1] = ""
33
+ end
34
+ end
35
+ end
36
+ end
27
37
  if prev_line
28
38
  line = prev_line << line
29
39
  prev_line = nil
@@ -308,8 +308,8 @@ module Rant
308
308
 
309
309
  def mcs_cmd_args
310
310
  cc_args = ""
311
- cc_args << " -o #{Env.shell_path(out)}" if out
312
- cc_args << " -g -d:DEBUG" if debug
311
+ cc_args << " -out:#{Env.shell_path(out)}" if out
312
+ cc_args << " -debug -d:DEBUG" if debug
313
313
  defines.each { |p|
314
314
  cc_args << " -d:#{p}"
315
315
  }
@@ -170,7 +170,8 @@ module Rant::Generators::Archive
170
170
  #
171
171
  # Normally, the Rantfile writer should care himself,
172
172
  # but since I tapped into this trap frequently now...
173
- @res_files.exclude(/^#{Regexp.escape @dist_path}/)
173
+ @res_files.exclude(/^#{Regexp.escape @dist_path}(\/.*)?$/)
174
+ # exclude the final archive file as well?
174
175
  end
175
176
  @res_files.uniq!.sort!
176
177
  end
@@ -26,6 +26,7 @@ class Rant::Generators::C::Dependencies
26
26
  rac.abort_at(ch,
27
27
  "C::Dependencies takes one or two arguments.")
28
28
  end
29
+ correct_case = false
29
30
  if opts
30
31
  if opts.respond_to? :to_hash
31
32
  opts = opts.to_hash
@@ -44,6 +45,8 @@ class Rant::Generators::C::Dependencies
44
45
  else
45
46
  v
46
47
  end
48
+ when :correct_case
49
+ correct_case = !!v
47
50
  else
48
51
  rac.abort_at(ch,
49
52
  "C::Dependencies: no such option -- #{k}")
@@ -67,7 +70,7 @@ class Rant::Generators::C::Dependencies
67
70
  end
68
71
  unless ::Rant::FileList === include_pathes
69
72
  if include_pathes.respond_to? :to_ary
70
- include_patehs = include_pathes.to_ary
73
+ include_pathes = include_pathes.to_ary
71
74
  else
72
75
  rac.abort_at(ch,
73
76
  "search has to be a list of directories")
@@ -96,7 +99,8 @@ class Rant::Generators::C::Dependencies
96
99
  ::Rant::C::Include.parse_includes(File.read(cf))
97
100
  deps = []
98
101
  (std_includes + local_includes).each { |fn|
99
- path = existing_file(include_pathes, fn)
102
+ path = existing_file(
103
+ include_pathes, fn, correct_case)
100
104
  deps << path if path
101
105
  }
102
106
  end
@@ -113,10 +117,17 @@ class Rant::Generators::C::Dependencies
113
117
  }
114
118
  end
115
119
  end
116
- def self.existing_file(dirs, fn)
120
+ def self.existing_file(dirs, fn, correct_case)
117
121
  dirs.each { |dir|
118
122
  path = dir == "." ? fn : File.join(dir, fn)
119
- return path if test ?f, path
123
+ if test ?f, path
124
+ return path unless correct_case
125
+ found_file = File.basename(fn)
126
+ found_in_dir = File.dirname(File.join(dir, fn))
127
+ Dir.entries(found_in_dir).each { |dentry|
128
+ return File.join(found_in_dir, dentry) if dentry.downcase == found_file.downcase
129
+ }
130
+ end
120
131
  }
121
132
  nil
122
133
  end
@@ -24,6 +24,11 @@ module Rant
24
24
  attr_accessor :test_files
25
25
  # Directory where to run unit tests.
26
26
  attr_accessor :test_dir
27
+ # How to load tests. Possible values:
28
+ # [:rant] Use Rant's loading mechanism. This is default.
29
+ # [:testrb] Use the testrb script which comes with Ruby
30
+ # 1.8.1 and newer installations.
31
+ attr_accessor :loader
27
32
 
28
33
  def initialize(app, cinf, name = :test, prerequisites = [], &block)
29
34
  @rac = app
@@ -41,6 +46,8 @@ module Rant
41
46
  @pattern = nil
42
47
  @test_files = nil
43
48
  @test_dir = nil
49
+ #@loader = RUBY_VERSION < "1.8.4" ? :testrb : :rant
50
+ @loader = :rant
44
51
  yield self if block_given?
45
52
  @pattern = "test*.rb" if @pattern.nil? && @test_files.nil?
46
53
 
@@ -51,8 +58,21 @@ module Rant
51
58
  if @libs && !@libs.empty?
52
59
  args << "-I#{@libs.join File::PATH_SEPARATOR}"
53
60
  end
54
- # TODO: don't use testrb
55
- args << "-S" << "testrb"
61
+ case @loader
62
+ when :rant:
63
+ script = rb_testloader_path
64
+ if script
65
+ args << script
66
+ else
67
+ args << "-S" << "testrb"
68
+ app.warn_msg("Rant's test loader not found. " +
69
+ "Using `testrb'.")
70
+ end
71
+ when :testrb: args << "-S" << "testrb"
72
+ else
73
+ @rac.abort_at(cinf,
74
+ "RubyTest: No such test loader -- #@loader")
75
+ end
56
76
  args.concat optlist
57
77
  if @test_dir
58
78
  app.sys.cd(@test_dir) {
@@ -95,5 +115,12 @@ module Rant
95
115
  end
96
116
  filelist
97
117
  end
118
+ def rb_testloader_path
119
+ $LOAD_PATH.each { |libdir|
120
+ path = File.join(libdir, "rant/script/rb_testloader.rb")
121
+ return path if File.exist?(path)
122
+ }
123
+ nil
124
+ end
98
125
  end # class Generators::RubyTest
99
126
  end # module Rant
data/lib/rant/init.rb CHANGED
@@ -56,7 +56,7 @@ class String
56
56
  end
57
57
 
58
58
  module Rant
59
- VERSION = '0.5.4'
59
+ VERSION = '0.5.6'
60
60
 
61
61
  @__rant_no_value__ = Object.new.freeze
62
62
  def self.__rant_no_value__
@@ -1,4 +1,10 @@
1
1
 
2
+ WARNING::
3
+ The current plugin interface will vanish as soon as there are
4
+ replacements for the two existing plugins ("Csharp" and
5
+ "Configure") distributed with Rant. <b>Don't write new
6
+ plugins!</b>.
7
+
2
8
  = Rant plugins
3
9
 
4
10
  An Rant plugin provides additional functionality for the Rant program.
data/lib/rant/rantsys.rb CHANGED
@@ -250,6 +250,19 @@ module Rant
250
250
  str.split(Env.on_windows? ? ";" : ":")
251
251
  end
252
252
 
253
+ if Env.on_windows?
254
+ def root_dir?(path)
255
+ path == "/" || path == "\\" ||
256
+ path =~ %r{\A[a-zA-Z]+:(\\|/)\Z}
257
+ # how many drive letters are really allowed on
258
+ # windows?
259
+ end
260
+ else
261
+ def root_dir?(path)
262
+ path == "/"
263
+ end
264
+ end
265
+
253
266
  extend self
254
267
 
255
268
  if RUBY_VERSION >= "1.8.4" # needed by 1.9.0, too
@@ -0,0 +1,2 @@
1
+
2
+ ARGV.each { |fn| require fn }
data/test/c/source.c CHANGED
@@ -21,3 +21,6 @@
21
21
  "custom2.h"
22
22
 
23
23
  #include <std>
24
+
25
+ /* one line block comment */
26
+ #include "_foo.h"
@@ -14,7 +14,7 @@ class TestCParseIncludes < Test::Unit::TestCase
14
14
  sc, lc = C::Include.parse_includes(src)
15
15
  assert_equal(%w(stdio.h file.h std), sc)
16
16
  assert_equal(
17
- %w(util.h mylib.h custom custom2.h), lc)
17
+ %w(util.h mylib.h custom custom2.h _foo.h), lc)
18
18
  end
19
19
  def test_parse_empty
20
20
  sc, lc = C::Include.parse_includes("")
@@ -93,4 +93,67 @@ class TestImportCDependenciesOnTheFly < Test::Unit::TestCase
93
93
  ensure
94
94
  FileUtils.rm_f %w(include/a.tt a.tt rf.t a.out .rant.meta)
95
95
  end
96
+ @@case_insensitive_fs = nil
97
+ def case_insensitive_fs?
98
+ return @@case_insensitive_fs unless @@case_insensitive_fs.nil?
99
+ Rant::Sys.touch "Case.t"
100
+ if @@case_insensitive_fs = File.exist?("case.t")
101
+ puts "\n*** testing on a case-insensitive filesystem ***"
102
+ true
103
+ else
104
+ puts "\n*** testing on a case-sensitive filesystem ***"
105
+ false
106
+ end
107
+ ensure
108
+ Rant::Sys.rm_f %w(case.t)
109
+ end
110
+ def test_correct_case_md5
111
+ write "include/a.tt", <<-EOF
112
+ void abc(void);
113
+ EOF
114
+ write "a.tt", <<-EOF
115
+ #include "A.tt"
116
+ EOF
117
+ write "rf.t", <<-EOF
118
+ import "md5", "c/dependencies", "autoclean"
119
+ gen C::Dependencies,
120
+ :correct_case => true,
121
+ :search => ["include"],
122
+ :sources => ["a.tt", "include/a.tt"]
123
+ gen Action do source "c_dependencies" end
124
+ gen AutoClean
125
+ file "a.out" => "a.tt" do |t|
126
+ sys.cp t.source, t.name
127
+ end
128
+ EOF
129
+ out, err = assert_rant("-frf.t", "a.out")
130
+ assert(err.empty?)
131
+ assert(!out.empty?)
132
+ assert(test(?f, "c_dependencies"))
133
+ assert(test(?f, "a.out"))
134
+ assert_equal(File.read("a.tt"), File.read("a.out"))
135
+ out, err = assert_rant("-frf.t", "a.out")
136
+ assert(err.empty?)
137
+ assert(out.empty?)
138
+ write "include/a.tt", <<-EOF
139
+ int abc(void);
140
+ EOF
141
+ out, err = assert_rant("-frf.t", "a.out")
142
+ assert(err.empty?)
143
+ return unless case_insensitive_fs?
144
+ assert(!out.empty?)
145
+ assert(test(?f, "c_dependencies"))
146
+ assert(test(?f, "a.out"))
147
+ assert_equal(File.read("a.tt"), File.read("a.out"))
148
+ out, err = assert_rant("-frf.t", "a.out")
149
+ assert(err.empty?)
150
+ assert(out.empty?)
151
+ assert_rant("-frf.t", "autoclean")
152
+ assert(!test(?e, ".rant.meta"))
153
+ assert(!test(?e, "a.out"))
154
+ assert(test(?f, "include/a.tt"))
155
+ assert(test(?f, "a.tt"))
156
+ ensure
157
+ FileUtils.rm_f %w(include/a.tt a.tt rf.t a.out .rant.meta)
158
+ end
96
159
  end
@@ -14,6 +14,9 @@ gen Command, "f_a.t" do |t|
14
14
  sys "#@sh_echo #{sys.escape "I will fail."} > #{t.name}"
15
15
  end
16
16
 
17
+ gen Command, "a2.t", ["b.t", "c.t"],
18
+ "$[sh_puts] $(<) > $(>)"
19
+
17
20
  var :btxt => "b"
18
21
  var :be, :Bool
19
22
 
@@ -100,6 +100,14 @@ class TestImportCommand < Test::Unit::TestCase
100
100
  ensure
101
101
  Rant::Sys.rm_f "d .t"
102
102
  end
103
+ def test_prerequisites_array
104
+ out, err = assert_rant "a2.t"
105
+ assert err.empty?
106
+ assert_file_content "a2.t", "b.t\nc.t\n"
107
+ out, err = assert_rant "a2.t"
108
+ assert err.empty?
109
+ assert out.empty?
110
+ end
103
111
  def test_enhance
104
112
  Rant::Sys.write_to_file "d.t", "d\n"
105
113
  out, err = assert_rant "b.t", "be=on"
@@ -48,7 +48,7 @@ class TestImportPackage < Test::Unit::TestCase
48
48
  count = files.size + dirs.size
49
49
  # + 1 because of the archive file
50
50
  count += 1 unless @pkg_dir
51
- assert_equal(count, Dir["**/*"].size)
51
+ assert_equal(count, Rant::FileList.glob_all("**/*").size)
52
52
  if manifest_file
53
53
  check_manifest(manifest_file, files)
54
54
  end
@@ -569,7 +569,7 @@ class TestImportPackage < Test::Unit::TestCase
569
569
  in_local_temp_dir do
570
570
  write_to_file "root.rant", <<-EOF
571
571
  import "md5", "package/tgz", "autoclean"
572
- gen Package::Tgz, "a-b", :manifest, :files => sys["*"].exclude("u")
572
+ gen Package::Tgz, "a-b", :manifest, :files => sys["*"].exclude("u", "*.tgz")
573
573
  gen AutoClean
574
574
  EOF
575
575
  write_to_file "a", "a\n"
@@ -597,4 +597,32 @@ class TestImportPackage < Test::Unit::TestCase
597
597
  assert !test(?e, ".rant.meta")
598
598
  end
599
599
  end
600
+ def test_package_zip_exclude_package_dir
601
+ in_local_temp_dir do
602
+ write_to_file "root.rant", <<-EOF
603
+ import "md5", "package/zip", "autoclean"
604
+ gen Package::Zip, "pkg", :files => sys["**/*.t"]
605
+ gen AutoClean
606
+ EOF
607
+ write_to_file "a.t", "a\n"
608
+ Rant::Sys.mkdir "dir"
609
+ write_to_file "dir/a.t", "dir_a\n"
610
+ write_to_file "pkg.t", "pkg\n"
611
+ out, err = assert_rant "pkg.zip"
612
+ assert err.empty?
613
+ assert !out.empty?
614
+ mf = %w(a.t dir/a.t pkg.t)
615
+ dirs = %w(dir)
616
+ @pkg_dir = "pkg"
617
+ check_contents(:zip, "pkg.zip", mf, dirs)
618
+ out, err = assert_rant "pkg.zip"
619
+ check_contents(:zip, "pkg.zip", mf, dirs)
620
+ assert err.empty?
621
+ assert out.empty?
622
+
623
+ assert_rant "autoclean"
624
+ assert Rant::FileList["**/*.zip"].empty?
625
+ assert !test(?e, ".rant.meta")
626
+ end
627
+ end
600
628
  end
@@ -23,12 +23,22 @@ class TestPluginCsharp < Test::Unit::TestCase
23
23
  assert(Dir["*.{exe,dll,obj}"].empty?,
24
24
  "task :clean should remove exe, dll and obj files")
25
25
  end
26
- if $have_csc
26
+ if $have_csc && ($have_csc !~ /mcs(\.exe)?$/) # TODO
27
27
  # Try to compile the "hello world" program. Requires cscc, csc
28
28
  # or mcs to be on your PATH.
29
+
30
+ # TODO: In the following tests, when mcs is used as C#
31
+ # compiler, the tasks will use cscc options anyway and the tests
32
+ # fail.
33
+ # Q: Why then do not fix the code?
34
+ # A: The plugin code in general and especially the Csharp plugin
35
+ # code is *really* crappy. I don't want to mess with it
36
+ # anymore. I want to get rid of it. Consider it highly
37
+ # deprecated.
38
+
29
39
  def test_hello
30
40
  capture_std do
31
- assert_equal(Rant.run([]), 0,
41
+ assert_equal(0, Rant.run([]),
32
42
  "first target, `hello.exe', should be compiled")
33
43
  end
34
44
  assert(File.exist?("hello.exe"),
@@ -46,6 +56,17 @@ if $have_csc
46
56
  $stderr.puts "Can't run hello.exe for testing."
47
57
  end
48
58
  end
59
+ def test_mcs
60
+ old_csc = Assembly.csc
61
+ mcs = Env.find_bin("mcs")
62
+ unless mcs
63
+ $stderr.puts "mcs not on path, will not test mcs"
64
+ return
65
+ end
66
+ Assembly.csc = mcs
67
+ test_opts
68
+ Assembly.csc = old_csc
69
+ end
49
70
  def test_opts
50
71
  capture_std do
51
72
  assert_equal(Rant.run("AB.dll"), 0)
@@ -65,17 +86,6 @@ if $have_csc
65
86
  test_opts
66
87
  Assembly.csc = old_csc
67
88
  end
68
- def test_mcs
69
- old_csc = Assembly.csc
70
- mcs = Env.find_bin("mcs")
71
- unless mcs
72
- $stderr.puts "mcs not on path, will not test mcs"
73
- return
74
- end
75
- Assembly.csc = mcs
76
- test_opts
77
- Assembly.csc = old_csc
78
- end
79
89
  def test_csc
80
90
  old_csc = Assembly.csc
81
91
  csc = Env.find_bin("csc")
@@ -546,7 +546,7 @@ class TestSysMethods < Test::Unit::TestCase
546
546
  @cx.import "sys/more"
547
547
  capture_std do
548
548
  # TODO: specialize exception class
549
- assert_raise_kind_of(StandardError) do
549
+ assert_raise_kind_of(NoMethodError) do
550
550
  @sys.write_to_file "a.t", Object.new
551
551
  end
552
552
  end
@@ -560,7 +560,7 @@ class TestSysMethods < Test::Unit::TestCase
560
560
  @cx.import "sys/more"
561
561
  capture_std do
562
562
  # TODO: specialize exception class
563
- assert_raise_kind_of(StandardError) do
563
+ assert_raise_kind_of(NoMethodError) do
564
564
  @sys.write_to_binfile "a.t", Object.new
565
565
  end
566
566
  end
@@ -582,4 +582,16 @@ class TestSysMethods < Test::Unit::TestCase
582
582
  assert_equal "a/b", @sys.regular_filename("a//b")
583
583
  end
584
584
  end
585
+ def test_root_dir?
586
+ assert Rant::Sys.root_dir?("/")
587
+ assert !Rant::Sys.root_dir?("foo")
588
+ assert !Rant::Sys.root_dir?("/foo")
589
+ if Rant::Env.on_windows?
590
+ assert Rant::Sys.root_dir?("C:/")
591
+ assert Rant::Sys.root_dir?("C:\\")
592
+ assert Rant::Sys.root_dir?("XY:\\")
593
+ assert !Rant::Sys.root_dir?("C:\\foo")
594
+ assert !Rant::Sys.root_dir?("C:/foo/bar")
595
+ end
596
+ end
585
597
  end