mspec 1.5.17 → 1.5.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/.gitignore +27 -0
  2. data/Gemfile +4 -0
  3. data/README +39 -159
  4. data/Rakefile +4 -44
  5. data/bin/mkspec.bat +1 -0
  6. data/bin/mspec-ci.bat +1 -0
  7. data/bin/mspec-run.bat +1 -0
  8. data/bin/mspec-tag.bat +1 -0
  9. data/bin/mspec.bat +1 -0
  10. data/lib/mspec/commands/mkspec.rb +2 -2
  11. data/lib/mspec/commands/mspec-run.rb +4 -0
  12. data/lib/mspec/commands/mspec.rb +18 -3
  13. data/lib/mspec/guards.rb +1 -0
  14. data/lib/mspec/guards/block_device.rb +22 -0
  15. data/lib/mspec/guards/guard.rb +14 -2
  16. data/lib/mspec/helpers.rb +5 -5
  17. data/lib/mspec/helpers/const_lookup.rb +6 -1
  18. data/lib/mspec/helpers/datetime.rb +28 -0
  19. data/lib/mspec/helpers/ducktype.rb +4 -4
  20. data/lib/mspec/helpers/environment.rb +19 -2
  21. data/lib/mspec/helpers/fs.rb +5 -1
  22. data/lib/mspec/helpers/io.rb +39 -1
  23. data/lib/mspec/helpers/numeric.rb +89 -0
  24. data/lib/mspec/helpers/pack.rb +3 -0
  25. data/lib/mspec/helpers/ruby_exe.rb +53 -15
  26. data/lib/mspec/helpers/singleton_class.rb +7 -0
  27. data/lib/mspec/helpers/stasy.rb +33 -0
  28. data/lib/mspec/helpers/tmp.rb +16 -3
  29. data/lib/mspec/matchers.rb +8 -0
  30. data/lib/mspec/matchers/be_computed_by.rb +37 -0
  31. data/lib/mspec/matchers/be_computed_by_function.rb +35 -0
  32. data/lib/mspec/matchers/be_nan.rb +20 -0
  33. data/lib/mspec/matchers/be_valid_dns_name.rb +25 -0
  34. data/lib/mspec/matchers/have_data.rb +6 -5
  35. data/lib/mspec/matchers/have_private_method.rb +24 -0
  36. data/lib/mspec/matchers/have_singleton_method.rb +24 -0
  37. data/lib/mspec/matchers/infinity.rb +28 -0
  38. data/lib/mspec/matchers/match_yaml.rb +5 -5
  39. data/lib/mspec/matchers/raise_error.rb +5 -3
  40. data/lib/mspec/matchers/signed_zero.rb +28 -0
  41. data/lib/mspec/mocks/mock.rb +15 -9
  42. data/lib/mspec/mocks/object.rb +4 -0
  43. data/lib/mspec/mocks/proxy.rb +26 -1
  44. data/lib/mspec/runner/actions.rb +0 -1
  45. data/lib/mspec/runner/context.rb +18 -16
  46. data/lib/mspec/runner/formatters.rb +2 -0
  47. data/lib/mspec/runner/formatters/dotted.rb +13 -1
  48. data/lib/mspec/runner/formatters/junit.rb +96 -0
  49. data/lib/mspec/runner/formatters/profile.rb +70 -0
  50. data/lib/mspec/runner/mspec.rb +11 -0
  51. data/lib/mspec/runner/shared.rb +1 -1
  52. data/lib/mspec/utils/options.rb +33 -9
  53. data/lib/mspec/utils/ruby_name.rb +1 -1
  54. data/lib/mspec/utils/script.rb +2 -1
  55. data/lib/mspec/version.rb +1 -1
  56. data/mspec.gemspec +40 -0
  57. data/spec/commands/mkspec_spec.rb +4 -3
  58. data/spec/commands/mspec_ci_spec.rb +1 -6
  59. data/spec/commands/mspec_run_spec.rb +1 -6
  60. data/spec/commands/mspec_spec.rb +14 -6
  61. data/spec/commands/mspec_tag_spec.rb +28 -27
  62. data/spec/expectations/expectations_spec.rb +1 -1
  63. data/spec/expectations/should_spec.rb +4 -4
  64. data/spec/guards/background_spec.rb +2 -2
  65. data/spec/guards/block_device_spec.rb +46 -0
  66. data/spec/guards/bug_spec.rb +2 -3
  67. data/spec/guards/compliance_spec.rb +2 -2
  68. data/spec/guards/conflict_spec.rb +2 -2
  69. data/spec/guards/endian_spec.rb +2 -2
  70. data/spec/guards/extensions_spec.rb +2 -2
  71. data/spec/guards/feature_spec.rb +2 -2
  72. data/spec/guards/guard_spec.rb +80 -22
  73. data/spec/guards/noncompliance_spec.rb +2 -2
  74. data/spec/guards/platform_spec.rb +2 -2
  75. data/spec/guards/quarantine_spec.rb +2 -2
  76. data/spec/guards/runner_spec.rb +2 -2
  77. data/spec/guards/specified_spec.rb +2 -2
  78. data/spec/guards/superuser_spec.rb +2 -2
  79. data/spec/guards/support_spec.rb +2 -2
  80. data/spec/guards/tty_spec.rb +2 -2
  81. data/spec/guards/user_spec.rb +2 -2
  82. data/spec/guards/version_spec.rb +2 -2
  83. data/spec/helpers/argv_spec.rb +3 -2
  84. data/spec/helpers/const_lookup_spec.rb +3 -2
  85. data/spec/helpers/datetime_spec.rb +44 -0
  86. data/spec/helpers/ducktype_spec.rb +3 -2
  87. data/spec/helpers/encode_spec.rb +3 -2
  88. data/spec/helpers/enumerator_class_spec.rb +5 -5
  89. data/spec/helpers/environment_spec.rb +15 -3
  90. data/spec/helpers/fixture_spec.rb +3 -2
  91. data/spec/helpers/flunk_spec.rb +4 -3
  92. data/spec/helpers/fs_spec.rb +35 -18
  93. data/spec/helpers/hash_spec.rb +3 -2
  94. data/spec/helpers/io_spec.rb +75 -6
  95. data/spec/helpers/language_version_spec.rb +3 -2
  96. data/spec/helpers/mock_to_path_spec.rb +3 -2
  97. data/spec/helpers/numeric_spec.rb +25 -0
  98. data/spec/helpers/ruby_exe_spec.rb +115 -29
  99. data/spec/helpers/scratch_spec.rb +3 -1
  100. data/spec/helpers/stasy_spec.rb +59 -0
  101. data/spec/helpers/tmp_spec.rb +21 -4
  102. data/spec/matchers/base_spec.rb +2 -2
  103. data/spec/matchers/be_an_instance_of_spec.rb +2 -2
  104. data/spec/matchers/be_ancestor_of_spec.rb +2 -2
  105. data/spec/matchers/be_close_spec.rb +2 -2
  106. data/spec/matchers/be_computed_by_function_spec.rb +36 -0
  107. data/spec/matchers/be_computed_by_spec.rb +42 -0
  108. data/spec/matchers/be_empty_spec.rb +2 -2
  109. data/spec/matchers/be_false_spec.rb +3 -3
  110. data/spec/matchers/be_kind_of_spec.rb +2 -2
  111. data/spec/matchers/be_nan_spec.rb +28 -0
  112. data/spec/matchers/be_nil_spec.rb +3 -3
  113. data/spec/matchers/be_true_spec.rb +3 -3
  114. data/spec/matchers/be_valid_dns_name_spec.rb +50 -0
  115. data/spec/matchers/complain_spec.rb +2 -2
  116. data/spec/matchers/eql_spec.rb +2 -2
  117. data/spec/matchers/equal_element_spec.rb +2 -2
  118. data/spec/matchers/equal_spec.rb +2 -2
  119. data/spec/matchers/equal_utf16_spec.rb +2 -2
  120. data/spec/matchers/have_class_variable_spec.rb +3 -3
  121. data/spec/matchers/have_constant_spec.rb +2 -2
  122. data/spec/matchers/have_data_spec.rb +8 -5
  123. data/spec/matchers/have_instance_method_spec.rb +2 -2
  124. data/spec/matchers/have_instance_variable_spec.rb +3 -3
  125. data/spec/matchers/have_method_spec.rb +2 -2
  126. data/spec/matchers/have_private_instance_method_spec.rb +3 -3
  127. data/spec/matchers/have_private_method_spec.rb +44 -0
  128. data/spec/matchers/have_protected_instance_method_spec.rb +2 -2
  129. data/spec/matchers/have_public_instance_method_spec.rb +2 -2
  130. data/spec/matchers/have_singleton_method_spec.rb +45 -0
  131. data/spec/matchers/include_spec.rb +2 -2
  132. data/spec/matchers/infinity_spec.rb +34 -0
  133. data/spec/matchers/match_yaml_spec.rb +3 -3
  134. data/spec/matchers/output_spec.rb +2 -2
  135. data/spec/matchers/output_to_fd_spec.rb +2 -2
  136. data/spec/matchers/raise_error_spec.rb +24 -3
  137. data/spec/matchers/respond_to_spec.rb +2 -2
  138. data/spec/matchers/signed_zero_spec.rb +32 -0
  139. data/spec/matchers/stringsymboladapter_spec.rb +2 -2
  140. data/spec/mocks/mock_spec.rb +12 -12
  141. data/spec/mocks/proxy_spec.rb +1 -1
  142. data/spec/runner/actions/gdb_spec.rb +1 -1
  143. data/spec/runner/actions/tag_spec.rb +1 -1
  144. data/spec/runner/actions/taglist_spec.rb +1 -1
  145. data/spec/runner/context_spec.rb +27 -27
  146. data/spec/runner/example_spec.rb +1 -1
  147. data/spec/runner/exception_spec.rb +1 -1
  148. data/spec/runner/filters/tag_spec.rb +2 -2
  149. data/spec/runner/formatters/describe_spec.rb +1 -1
  150. data/spec/runner/formatters/dotted_spec.rb +2 -2
  151. data/spec/runner/formatters/html_spec.rb +2 -2
  152. data/spec/runner/formatters/junit_spec.rb +147 -0
  153. data/spec/runner/formatters/unit_spec.rb +2 -2
  154. data/spec/runner/formatters/yaml_spec.rb +3 -3
  155. data/spec/runner/mspec_spec.rb +22 -21
  156. data/spec/runner/shared_spec.rb +9 -1
  157. data/spec/runner/tag_spec.rb +1 -1
  158. data/spec/spec_helper.rb +1 -7
  159. data/spec/utils/name_map_spec.rb +1 -2
  160. data/spec/utils/options_spec.rb +58 -27
  161. data/spec/utils/script_spec.rb +5 -13
  162. data/spec/utils/version_spec.rb +1 -1
  163. metadata +254 -64
  164. data/lib/mspec/helpers/bignum.rb +0 -5
  165. data/lib/mspec/helpers/fmode.rb +0 -15
  166. data/lib/mspec/helpers/infinity.rb +0 -5
  167. data/lib/mspec/helpers/metaclass.rb +0 -7
  168. data/lib/mspec/helpers/nan.rb +0 -5
  169. data/lib/mspec/runner/actions/debug.rb +0 -17
  170. data/spec/helpers/bignum_spec.rb +0 -11
  171. data/spec/helpers/fmode_spec.rb +0 -14
  172. data/spec/helpers/infinity_spec.rb +0 -8
  173. data/spec/helpers/nan_spec.rb +0 -8
  174. data/spec/runner/actions/debug_spec.rb +0 -62
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/noncompliance'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#deviates_on" do
5
5
  before :all do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/platform'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#platform_is" do
5
5
  before :each do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/quarantine'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe QuarantineGuard, "#match?" do
5
5
  it "returns false" do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/runner'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe RunnerGuard, "#match?" do
5
5
  before :all do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/specified'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#unspecified" do
5
5
  before :each do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/superuser'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#as_superuser" do
5
5
  before :each do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/support'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#not_supported_on" do
5
5
  before :all do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/tty'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#with_tty" do
5
5
  before :each do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/user'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  describe Object, "#as_user" do
5
5
  before :each do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/version'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
3
 
4
4
  # The VersionGuard specifies a version of Ruby with a String of
5
5
  # the form: v = 'major.minor.tiny.patchlevel'.
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/argv'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe Object, "#argv" do
5
6
  before :each do
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/const_lookup'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  CONST = 2
5
6
 
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
4
+
5
+ describe Object, "#new_datetime" do
6
+ it "returns a default DateTime instance" do
7
+ new_datetime.should == DateTime.new
8
+ end
9
+
10
+ it "returns a DateTime instance with the specified year value" do
11
+ d = new_datetime :year => 1970
12
+ d.year.should == 1970
13
+ end
14
+
15
+ it "returns a DateTime instance with the specified month value" do
16
+ d = new_datetime :month => 11
17
+ d.mon.should == 11
18
+ end
19
+
20
+ it "returns a DateTime instance with the specified day value" do
21
+ d = new_datetime :day => 23
22
+ d.day.should == 23
23
+ end
24
+
25
+ it "returns a DateTime instance with the specified hour value" do
26
+ d = new_datetime :hour => 10
27
+ d.hour.should == 10
28
+ end
29
+
30
+ it "returns a DateTime instance with the specified minute value" do
31
+ d = new_datetime :minute => 10
32
+ d.min.should == 10
33
+ end
34
+
35
+ it "returns a DateTime instance with the specified second value" do
36
+ d = new_datetime :second => 2
37
+ d.sec.should == 2
38
+ end
39
+
40
+ it "returns a DateTime instance with the specified offset value" do
41
+ d = new_datetime :offset => Rational(3,24)
42
+ d.offset.should == Rational(3,24)
43
+ end
44
+ end
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/ducktype'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe Object, "#responds_to" do
5
6
  it "returns true for specified symbols" do
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/encode'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe Object, "#encode" do
5
6
  it "raises an ArgumentError if the str parameter is not a String" do
@@ -1,17 +1,17 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/enumerator_class'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe "#enumerator_class" do
5
6
 
6
- ruby_version_is ''...'1.8.7' do
7
+ ruby_version_is ''...'1.9' do
7
8
  it "returns Enumerable::Enumerator in Ruby 1.8.6-" do
8
- lambda { enumerator_class }.should raise_error(NameError)
9
9
  require 'enumerator'
10
10
  enumerator_class.should == Enumerable::Enumerator
11
11
  end
12
12
  end
13
13
 
14
- ruby_version_is '1.8.7' do
14
+ ruby_version_is '1.9' do
15
15
  it "returns Enumerator in Ruby 1.8.7+" do
16
16
  enumerator_class.should == Enumerator
17
17
  end
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/guards/platform'
3
- require 'mspec/helpers/environment'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
4
4
 
5
5
  describe "#env" do
6
6
  it "returns a hash of variables" do
@@ -61,3 +61,15 @@ describe "#username" do
61
61
  username.should == "john"
62
62
  end
63
63
  end
64
+
65
+ describe "dev_null" do
66
+ it "returns 'NUL' on Windows" do
67
+ PlatformGuard.should_receive(:windows?).and_return(true)
68
+ dev_null().should == "NUL"
69
+ end
70
+
71
+ it "returns '/dev/null' on non-Windows" do
72
+ PlatformGuard.should_receive(:windows?).and_return(false)
73
+ dev_null().should == "/dev/null"
74
+ end
75
+ end
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/fixture'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe Object, "#fixture" do
5
6
  before :each do
@@ -1,12 +1,13 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ require 'spec_helper'
2
2
  require 'mspec/expectations/expectations'
3
- require 'mspec/helpers/flunk'
4
3
  require 'mspec/runner/mspec'
4
+ require 'mspec/guards'
5
+ require 'mspec/helpers'
5
6
 
6
7
  describe Object, "#flunk" do
7
8
  before :each do
8
9
  MSpec.stub!(:actions)
9
- MSpec.stub!(:current).and_return(mock("spec state", :null_object => true))
10
+ MSpec.stub!(:current).and_return(mock("spec state").as_null_object)
10
11
  end
11
12
 
12
13
  it "raises an SpecExpectationNotMetError unconditionally" do
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/tmp'
3
- require 'mspec/helpers/fs'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
4
4
 
5
5
  describe Object, "#cp" do
6
6
  before :each do
@@ -59,13 +59,11 @@ end
59
59
 
60
60
  describe Object, "#touch" do
61
61
  before :all do
62
- @dir = tmp("subdir")
63
62
  @name = tmp("subdir/touched.txt")
64
63
  end
65
64
 
66
65
  after :each do
67
- File.delete @name if File.exists? @name
68
- Dir.rmdir @dir if File.directory? @dir
66
+ rm_r File.dirname(@name)
69
67
  end
70
68
 
71
69
  it "creates all the directories in the path to the file" do
@@ -115,7 +113,7 @@ describe Object, "#rm_r" do
115
113
  end
116
114
 
117
115
  after :each do
118
- File.delete @link if File.exists? @link
116
+ File.delete @link if File.exists? @link or File.symlink? @link
119
117
  File.delete @socket if File.exists? @socket
120
118
  File.delete @subfile if File.exists? @subfile
121
119
  File.delete @topfile if File.exists? @topfile
@@ -140,17 +138,36 @@ describe Object, "#rm_r" do
140
138
  File.exists?(@subfile).should be_false
141
139
  end
142
140
 
143
- it "removes a symlink" do
144
- File.symlink @topfile, @link
145
- rm_r @link
146
- File.exists?(@link).should be_false
147
- end
148
-
149
- it "removes a socket" do
150
- require 'socket'
151
- UNIXServer.new(@socket).close
152
- rm_r @socket
153
- File.exists?(@socket).should be_false
141
+ platform_is_not :windows do
142
+ it "removes a symlink to a file" do
143
+ File.symlink @topfile, @link
144
+ rm_r @link
145
+ File.exists?(@link).should be_false
146
+ end
147
+
148
+ it "removes a symlink to a directory" do
149
+ File.symlink @subdir1, @link
150
+ rm_r @link
151
+ lambda do
152
+ File.lstat(@link)
153
+ end.should raise_error(Errno::ENOENT)
154
+ File.exists?(@subdir1).should be_true
155
+ end
156
+
157
+ it "removes a dangling symlink" do
158
+ File.symlink "non_existent_file", @link
159
+ rm_r @link
160
+ lambda do
161
+ File.lstat(@link)
162
+ end.should raise_error(Errno::ENOENT)
163
+ end
164
+
165
+ it "removes a socket" do
166
+ require 'socket'
167
+ UNIXServer.new(@socket).close
168
+ rm_r @socket
169
+ File.exists?(@socket).should be_false
170
+ end
154
171
  end
155
172
 
156
173
  it "removes a single directory" do
@@ -1,5 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/hash'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
3
4
 
4
5
  describe Object, "#hash_class" do
5
6
  it "returns the Hash class" do
@@ -1,7 +1,6 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'mspec/helpers/io'
3
- require 'mspec/helpers/fs'
4
- require 'mspec/helpers/tmp'
1
+ require 'spec_helper'
2
+ require 'mspec/guards'
3
+ require 'mspec/helpers'
5
4
 
6
5
  describe IOStub do
7
6
  before :each do
@@ -51,7 +50,7 @@ describe Object, "#new_fd" do
51
50
  end
52
51
 
53
52
  after :each do
54
- @io.close unless @io.closed?
53
+ @io.close if @io and not @io.closed?
55
54
  rm_r @name
56
55
  end
57
56
 
@@ -59,12 +58,29 @@ describe Object, "#new_fd" do
59
58
  fd = new_fd @name
60
59
  fd.should be_an_instance_of(Fixnum)
61
60
 
62
- @io = IO.new fd
61
+ @io = IO.new fd, fmode('w:utf-8')
63
62
  @io.sync = true
64
63
  @io.print "io data"
65
64
 
66
65
  IO.read(@name).should == "io data"
67
66
  end
67
+
68
+ it "accepts an options Hash" do
69
+ FeatureGuard.stub!(:enabled?).and_return(true)
70
+ fd = new_fd @name, { :mode => 'w:utf-8' }
71
+ fd.should be_an_instance_of(Fixnum)
72
+
73
+ @io = IO.new fd, fmode('w:utf-8')
74
+ @io.sync = true
75
+ @io.print "io data"
76
+
77
+ IO.read(@name).should == "io data"
78
+ end
79
+
80
+ it "raises an ArgumentError if the options Hash does not include :mode" do
81
+ FeatureGuard.stub!(:enabled?).and_return(true)
82
+ lambda { new_fd @name, { :encoding => "utf-8" } }.should raise_error(ArgumentError)
83
+ end
68
84
  end
69
85
 
70
86
  describe Object, "#new_io" do
@@ -96,4 +112,57 @@ describe Object, "#new_io" do
96
112
  @io.print "io data"
97
113
  IO.read(@name).should == "io data"
98
114
  end
115
+
116
+ it "opens the IO for reading if passed { :mode => 'r' }" do
117
+ touch(@name) { |f| f.print "io data" }
118
+ @io = new_io @name, { :mode => "r" }
119
+ @io.read.should == "io data"
120
+ lambda { @io.puts "more data" }.should raise_error(IOError)
121
+ end
122
+
123
+ it "opens the IO for writing if passed { :mode => 'w' }" do
124
+ @io = new_io @name, { :mode => "w" }
125
+ @io.sync = true
126
+
127
+ @io.print "io data"
128
+ IO.read(@name).should == "io data"
129
+ end
130
+ end
131
+
132
+ describe Object, "#fmode" do
133
+ it "returns the argument unmodified if :encoding feature is enabled" do
134
+ FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
135
+ fmode("rb:binary:utf-8").should == "rb:binary:utf-8"
136
+ end
137
+
138
+ it "returns only the file access mode if :encoding feature is not enabled" do
139
+ FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(false)
140
+ fmode("rb:binary:utf-8").should == "rb"
141
+ end
142
+ end
143
+
144
+ describe Object, "#options_or_mode" do
145
+ describe "if passed a Hash" do
146
+ it "returns a mode string if :encoding feature is not enabled" do
147
+ FeatureGuard.should_receive(:enabled?).with(:encoding).twice.and_return(false)
148
+ options_or_mode(:mode => "rb:binary").should == "rb"
149
+ end
150
+
151
+ it "returns a Hash if :encoding feature is enabled" do
152
+ FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
153
+ options_or_mode(:mode => "rb:utf-8").should == { :mode => "rb:utf-8" }
154
+ end
155
+ end
156
+
157
+ describe "if passed a String" do
158
+ it "returns only the file access mode if :encoding feature is not enabled" do
159
+ FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(false)
160
+ options_or_mode("rb:binary:utf-8").should == "rb"
161
+ end
162
+
163
+ it "returns the argument unmodified if :encoding feature is enabled" do
164
+ FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
165
+ options_or_mode("rb:binary:utf-8").should == "rb:binary:utf-8"
166
+ end
167
+ end
99
168
  end