mspec 1.5.17 → 1.5.18

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 (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