diff options
Diffstat (limited to 'spec/ruby/library')
1810 files changed, 24099 insertions, 22831 deletions
diff --git a/spec/ruby/library/English/English_spec.rb b/spec/ruby/library/English/English_spec.rb index 32941924eb..bdc3774608 100644 --- a/spec/ruby/library/English/English_spec.rb +++ b/spec/ruby/library/English/English_spec.rb @@ -7,165 +7,155 @@ describe "English" do begin raise "error" rescue - $ERROR_INFO.should_not be_nil + $ERROR_INFO.should_not == nil $ERROR_INFO.should == $! end - $ERROR_INFO.should be_nil + $ERROR_INFO.should == nil end it "aliases $ERROR_POSITION to $@" do begin raise "error" rescue - $ERROR_POSITION.should_not be_nil + $ERROR_POSITION.should_not == nil $ERROR_POSITION.should == $@ end - $ERROR_POSITION.should be_nil + $ERROR_POSITION.should == nil end it "aliases $FS to $;" do original = $; - $; = "," - $FS.should_not be_nil + suppress_warning {$; = ","} + $FS.should_not == nil $FS.should == $; - $; = original + suppress_warning {$; = original} end it "aliases $FIELD_SEPARATOR to $;" do original = $; - $; = "," - $FIELD_SEPARATOR.should_not be_nil + suppress_warning {$; = ","} + $FIELD_SEPARATOR.should_not == nil $FIELD_SEPARATOR.should == $; - $; = original + suppress_warning {$; = original} end it "aliases $OFS to $," do original = $, - $, = "|" - $OFS.should_not be_nil + suppress_warning {$, = "|"} + $OFS.should_not == nil $OFS.should == $, - $, = original + suppress_warning {$, = original} end it "aliases $OUTPUT_FIELD_SEPARATOR to $," do original = $, - $, = "|" - $OUTPUT_FIELD_SEPARATOR.should_not be_nil + suppress_warning {$, = "|"} + $OUTPUT_FIELD_SEPARATOR.should_not == nil $OUTPUT_FIELD_SEPARATOR.should == $, - $, = original + suppress_warning {$, = original} end it "aliases $RS to $/" do - $RS.should_not be_nil + $RS.should_not == nil $RS.should == $/ end it "aliases $INPUT_RECORD_SEPARATOR to $/" do - $INPUT_RECORD_SEPARATOR.should_not be_nil + $INPUT_RECORD_SEPARATOR.should_not == nil $INPUT_RECORD_SEPARATOR.should == $/ end it "aliases $ORS to $\\" do original = $\ - $\ = "\t" - $ORS.should_not be_nil + suppress_warning {$\ = "\t"} + $ORS.should_not == nil $ORS.should == $\ - $\ = original + suppress_warning {$\ = original} end it "aliases $OUTPUT_RECORD_SEPARATOR to $\\" do original = $\ - $\ = "\t" - $OUTPUT_RECORD_SEPARATOR.should_not be_nil + suppress_warning {$\ = "\t"} + $OUTPUT_RECORD_SEPARATOR.should_not == nil $OUTPUT_RECORD_SEPARATOR.should == $\ - $\ = original + suppress_warning {$\ = original} end it "aliases $INPUT_LINE_NUMBER to $." do - $INPUT_LINE_NUMBER.should_not be_nil + $INPUT_LINE_NUMBER.should_not == nil $INPUT_LINE_NUMBER.should == $. end it "aliases $NR to $." do - $NR.should_not be_nil + $NR.should_not == nil $NR.should == $. end it "aliases $LAST_READ_LINE to $_ needs to be reviewed for spec completeness" it "aliases $DEFAULT_OUTPUT to $>" do - $DEFAULT_OUTPUT.should_not be_nil + $DEFAULT_OUTPUT.should_not == nil $DEFAULT_OUTPUT.should == $> end it "aliases $DEFAULT_INPUT to $<" do - $DEFAULT_INPUT.should_not be_nil + $DEFAULT_INPUT.should_not == nil $DEFAULT_INPUT.should == $< end it "aliases $PID to $$" do - $PID.should_not be_nil + $PID.should_not == nil $PID.should == $$ end it "aliases $PID to $$" do - $PID.should_not be_nil + $PID.should_not == nil $PID.should == $$ end it "aliases $PROCESS_ID to $$" do - $PROCESS_ID.should_not be_nil + $PROCESS_ID.should_not == nil $PROCESS_ID.should == $$ end it "aliases $CHILD_STATUS to $?" do ruby_exe('exit 0') - $CHILD_STATUS.should_not be_nil + $CHILD_STATUS.should_not == nil $CHILD_STATUS.should == $? end it "aliases $LAST_MATCH_INFO to $~" do /c(a)t/ =~ "cat" - $LAST_MATCH_INFO.should_not be_nil + $LAST_MATCH_INFO.should_not == nil $LAST_MATCH_INFO.should == $~ end - it "aliases $IGNORECASE to $=" do - $VERBOSE, verbose = nil, $VERBOSE - begin - $IGNORECASE.should_not be_nil - $IGNORECASE.should == $= - ensure - $VERBOSE = verbose - end - end - it "aliases $ARGV to $*" do - $ARGV.should_not be_nil + $ARGV.should_not == nil $ARGV.should == $* end it "aliases $MATCH to $&" do /c(a)t/ =~ "cat" - $MATCH.should_not be_nil + $MATCH.should_not == nil $MATCH.should == $& end it "aliases $PREMATCH to $`" do /c(a)t/ =~ "cat" - $PREMATCH.should_not be_nil + $PREMATCH.should_not == nil $PREMATCH.should == $` end it "aliases $POSTMATCH to $'" do /c(a)t/ =~ "cat" - $POSTMATCH.should_not be_nil + $POSTMATCH.should_not == nil $POSTMATCH.should == $' end it "aliases $LAST_PAREN_MATCH to $+" do /c(a)t/ =~ "cat" - $LAST_PAREN_MATCH.should_not be_nil + $LAST_PAREN_MATCH.should_not == nil $LAST_PAREN_MATCH.should == $+ end end diff --git a/spec/ruby/library/English/alias_spec.rb b/spec/ruby/library/English/alias_spec.rb new file mode 100644 index 0000000000..3ff92f964d --- /dev/null +++ b/spec/ruby/library/English/alias_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../spec_helper' +require 'English' + +describe "English" do + it "aliases $! to $ERROR_INFO and $ERROR_INFO still returns an Exception with a backtrace" do + exception = (1 / 0 rescue $ERROR_INFO) + exception.should.is_a?(Exception) + exception.backtrace.should.is_a?(Array) + end + + it "aliases $@ to $ERROR_POSITION and $ERROR_POSITION still returns a backtrace" do + (1 / 0 rescue $ERROR_POSITION).should.is_a?(Array) + end +end diff --git a/spec/ruby/library/abbrev/abbrev_spec.rb b/spec/ruby/library/abbrev/abbrev_spec.rb index 60d1a953b3..61b0926597 100644 --- a/spec/ruby/library/abbrev/abbrev_spec.rb +++ b/spec/ruby/library/abbrev/abbrev_spec.rb @@ -5,8 +5,8 @@ require 'abbrev' #the same manner, as they're more or less aliases #of one another -[["Abbrev.abbrev", lambda {|a| Abbrev.abbrev(a)}], - ["Array#abbrev", lambda {|a| a.abbrev}] +[["Abbrev.abbrev", -> a { Abbrev.abbrev(a)}], + ["Array#abbrev", -> a { a.abbrev}] ].each do |(name, func)| describe name do diff --git a/spec/ruby/library/base64/decode64_spec.rb b/spec/ruby/library/base64/decode64_spec.rb index 3b81203588..6dd33dddfe 100644 --- a/spec/ruby/library/base64/decode64_spec.rb +++ b/spec/ruby/library/base64/decode64_spec.rb @@ -6,4 +6,24 @@ describe "Base64#decode64" do it "returns the Base64-decoded version of the given string" do Base64.decode64("U2VuZCByZWluZm9yY2VtZW50cw==\n").should == "Send reinforcements" end + + it "returns the Base64-decoded version of the given shared string" do + Base64.decode64("base64: U2VuZCByZWluZm9yY2VtZW50cw==\n".split(" ").last).should == "Send reinforcements" + end + + it "returns the Base64-decoded version of the given string with wrong padding" do + Base64.decode64("XU2VuZCByZWluZm9yY2VtZW50cw===").should == "]M\x95\xB9\x90\x81\xC9\x95\xA5\xB9\x99\xBD\xC9\x8D\x95\xB5\x95\xB9\xD1\xCC".b + end + + it "returns the Base64-decoded version of the given string that contains an invalid character" do + Base64.decode64("%3D").should == "\xDC".b + end + + it "returns a binary encoded string" do + Base64.decode64("SEk=").encoding.should == Encoding::BINARY + end + + it "decodes without padding suffix ==" do + Base64.decode64("eyJrZXkiOnsibiI6InR0dCJ9fQ").should == "{\"key\":{\"n\":\"ttt\"}}" + end end diff --git a/spec/ruby/library/base64/encode64_spec.rb b/spec/ruby/library/base64/encode64_spec.rb index 91ac41bed0..64de6257bc 100644 --- a/spec/ruby/library/base64/encode64_spec.rb +++ b/spec/ruby/library/base64/encode64_spec.rb @@ -11,4 +11,13 @@ describe "Base64#encode64" do it "returns the Base64-encoded version of the given string" do Base64.encode64('Send reinforcements').should == "U2VuZCByZWluZm9yY2VtZW50cw==\n" end + + it "returns the Base64-encoded version of the given shared string" do + Base64.encode64("Now is the time for all good coders\nto learn Ruby".split("\n").last).should == + "dG8gbGVhcm4gUnVieQ==\n" + end + + it "returns a US_ASCII encoded string" do + Base64.encode64("HI").encoding.should == Encoding::US_ASCII + end end diff --git a/spec/ruby/library/base64/strict_decode64_spec.rb b/spec/ruby/library/base64/strict_decode64_spec.rb new file mode 100644 index 0000000000..7b52f0c922 --- /dev/null +++ b/spec/ruby/library/base64/strict_decode64_spec.rb @@ -0,0 +1,41 @@ +require_relative '../../spec_helper' + +require 'base64' + +describe "Base64#strict_decode64" do + it "returns the Base64-decoded version of the given string" do + Base64.strict_decode64("U2VuZCByZWluZm9yY2VtZW50cw==").should == "Send reinforcements" + end + + it "returns the Base64-decoded version of the given shared string" do + Base64.strict_decode64("base64: U2VuZCByZWluZm9yY2VtZW50cw==".split(" ").last).should == "Send reinforcements" + end + + it "raises ArgumentError when the given string contains CR" do + -> do + Base64.strict_decode64("U2VuZCByZWluZm9yY2VtZW50cw==\r") + end.should.raise(ArgumentError) + end + + it "raises ArgumentError when the given string contains LF" do + -> do + Base64.strict_decode64("U2VuZCByZWluZm9yY2VtZW50cw==\n") + end.should.raise(ArgumentError) + end + + it "raises ArgumentError when the given string has wrong padding" do + -> do + Base64.strict_decode64("=U2VuZCByZWluZm9yY2VtZW50cw==") + end.should.raise(ArgumentError) + end + + it "raises ArgumentError when the given string contains an invalid character" do + -> do + Base64.strict_decode64("%3D") + end.should.raise(ArgumentError) + end + + it "returns a binary encoded string" do + Base64.strict_decode64("SEk=").encoding.should == Encoding::BINARY + end +end diff --git a/spec/ruby/library/base64/strict_encode64_spec.rb b/spec/ruby/library/base64/strict_encode64_spec.rb new file mode 100644 index 0000000000..7cabcf190c --- /dev/null +++ b/spec/ruby/library/base64/strict_encode64_spec.rb @@ -0,0 +1,19 @@ +require_relative '../../spec_helper' + +require 'base64' + +describe "Base64#strict_encode64" do + it "returns the Base64-encoded version of the given string" do + Base64.strict_encode64("Now is the time for all good coders\nto learn Ruby").should == + "Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4gUnVieQ==" + end + + it "returns the Base64-encoded version of the given shared string" do + Base64.strict_encode64("Now is the time for all good coders\nto learn Ruby".split("\n").last).should == + "dG8gbGVhcm4gUnVieQ==" + end + + it "returns a US_ASCII encoded string" do + Base64.strict_encode64("HI").encoding.should == Encoding::US_ASCII + end +end diff --git a/spec/ruby/library/bigdecimal/BigDecimal_spec.rb b/spec/ruby/library/bigdecimal/BigDecimal_spec.rb index d278512737..6adebabe84 100644 --- a/spec/ruby/library/bigdecimal/BigDecimal_spec.rb +++ b/spec/ruby/library/bigdecimal/BigDecimal_spec.rb @@ -1,10 +1,16 @@ require_relative '../../spec_helper' require 'bigdecimal' +describe "BigDecimal" do + it "is not defined unless it is required" do + ruby_exe('puts Object.const_defined?(:BigDecimal)').should == "false\n" + end +end + describe "Kernel#BigDecimal" do it "creates a new object of class BigDecimal" do - BigDecimal("3.14159").should be_kind_of(BigDecimal) + BigDecimal("3.14159").should.is_a?(BigDecimal) (0..9).each {|i| BigDecimal("1#{i}").should == 10 + i BigDecimal("-1#{i}").should == -10 - i @@ -18,68 +24,112 @@ describe "Kernel#BigDecimal" do } end + it "BigDecimal(Rational) with bigger-than-double numerator" do + rational = 99999999999999999999/100r + rational.numerator.should > 2**64 + BigDecimal(rational, 100).to_s.should == "0.99999999999999999999e18" + end + it "accepts significant digits >= given precision" do - BigDecimal("3.1415923", 10).precs[1].should >= 10 + BigDecimal("3.1415923", 10).should == BigDecimal("3.1415923") end it "determines precision from initial value" do pi_string = "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593014782083152134043" - BigDecimal(pi_string).precs[1].should >= pi_string.size-1 + BigDecimal(pi_string).precision.should == pi_string.size-1 end - it "ignores leading whitespace" do - BigDecimal(" \t\n \r1234").should == BigDecimal("1234") - BigDecimal(" \t\n \rNaN \n").nan?.should == true + it "ignores leading and trailing whitespace" do + BigDecimal(" \t\n \r1234\t\r\n ").should == BigDecimal("1234") + BigDecimal(" \t\n \rNaN \n").should.nan? BigDecimal(" \t\n \rInfinity \n").infinite?.should == 1 BigDecimal(" \t\n \r-Infinity \n").infinite?.should == -1 end - it "ignores trailing garbage" do - BigDecimal("123E45ruby").should == BigDecimal("123E45") - BigDecimal("123x45").should == BigDecimal("123") - BigDecimal("123.4%E5").should == BigDecimal("123.4") - BigDecimal("1E2E3E4E5E").should == BigDecimal("100") + it "coerces the value argument with #to_str" do + initial = mock("value") + initial.should_receive(:to_str).and_return("123") + BigDecimal(initial).should == BigDecimal("123") end - ruby_version_is ""..."2.4" do - it "treats invalid strings as 0.0" do - BigDecimal("ruby").should == BigDecimal("0.0") - BigDecimal(" \t\n \r-\t\t\tInfinity \n").should == BigDecimal("0.0") - end + it "does not ignores trailing garbage" do + -> { BigDecimal("123E45ruby") }.should.raise(ArgumentError) + -> { BigDecimal("123x45") }.should.raise(ArgumentError) + -> { BigDecimal("123.4%E5") }.should.raise(ArgumentError) + -> { BigDecimal("1E2E3E4E5E") }.should.raise(ArgumentError) end - ruby_version_is "2.4" do - it "raises ArgumentError for invalid strings" do - lambda { BigDecimal("ruby") }.should raise_error(ArgumentError) - lambda { BigDecimal(" \t\n \r-\t\t\tInfinity \n") }.should raise_error(ArgumentError) - end + it "raises ArgumentError for invalid strings" do + -> { BigDecimal("ruby") }.should.raise(ArgumentError) + -> { BigDecimal(" \t\n \r-\t\t\tInfinity \n") }.should.raise(ArgumentError) end it "allows omitting the integer part" do BigDecimal(".123").should == BigDecimal("0.123") end - it "allows for underscores in all parts" do + it "process underscores as Float()" do reference = BigDecimal("12345.67E89") BigDecimal("12_345.67E89").should == reference - BigDecimal("1_2_3_4_5_._6____7_E89").should == reference - BigDecimal("12345_.67E_8__9_").should == reference + -> { BigDecimal("1_2_3_4_5_._6____7_E89") }.should.raise(ArgumentError) + -> { BigDecimal("12345_.67E_8__9_") }.should.raise(ArgumentError) end it "accepts NaN and [+-]Infinity" do - BigDecimal("NaN").nan?.should == true + BigDecimal("NaN").should.nan? pos_inf = BigDecimal("Infinity") - pos_inf.finite?.should == false + pos_inf.should_not.finite? pos_inf.should > 0 pos_inf.should == BigDecimal("+Infinity") neg_inf = BigDecimal("-Infinity") - neg_inf.finite?.should == false + neg_inf.should_not.finite? neg_inf.should < 0 end + describe "with exception: false" do + it "returns nil for invalid strings" do + BigDecimal("invalid", exception: false).should == nil + BigDecimal("0invalid", exception: false).should == nil + BigDecimal("invalid0", exception: false).should == nil + if BigDecimal::VERSION >= "3.1.9" + BigDecimal("0.", exception: false).to_i.should == 0 + else + BigDecimal("0.", exception: false).should == nil + end + end + end + + describe "accepts NaN and [+-]Infinity as Float values" do + it "works without an explicit precision" do + BigDecimal(Float::NAN).should.nan? + + pos_inf = BigDecimal(Float::INFINITY) + pos_inf.should_not.finite? + pos_inf.should > 0 + pos_inf.should == BigDecimal("+Infinity") + + neg_inf = BigDecimal(-Float::INFINITY) + neg_inf.should_not.finite? + neg_inf.should < 0 + end + + it "works with an explicit precision" do + BigDecimal(Float::NAN, Float::DIG).should.nan? + + pos_inf = BigDecimal(Float::INFINITY, Float::DIG) + pos_inf.should_not.finite? + pos_inf.should > 0 + pos_inf.should == BigDecimal("+Infinity") + + neg_inf = BigDecimal(-Float::INFINITY, Float::DIG) + neg_inf.should_not.finite? + neg_inf.should < 0 + end + end + it "allows for [eEdD] as exponent separator" do reference = BigDecimal("12345.67E89") @@ -102,8 +152,88 @@ describe "Kernel#BigDecimal" do BigDecimal("-12345.6E-1").should == -reference end - it 'raises ArgumentError when Float is used without precision' do - lambda { BigDecimal(1.0) }.should raise_error(ArgumentError) + version_is BigDecimal::VERSION, "3.3.0" do + it "allows Float without precision" do + BigDecimal(1.2).should == BigDecimal("1.2") + end + end + + it "returns appropriate BigDecimal zero for signed zero" do + BigDecimal(-0.0, Float::DIG).sign.should == -1 + BigDecimal(0.0, Float::DIG).sign.should == 1 + end + + it "pre-coerces long integers" do + BigDecimal(3).add(1 << 50, 3).should == BigDecimal('0.113e16') end + it "does not call to_s when calling inspect" do + value = BigDecimal('44.44') + value.to_s.should == '0.4444e2' + value.inspect.should == '0.4444e2' + + ruby_exe( <<-'EOF').should == "cheese 0.4444e2" + require 'bigdecimal' + module BigDecimalOverride + def to_s; "cheese"; end + end + BigDecimal.prepend BigDecimalOverride + value = BigDecimal('44.44') + print "#{value.to_s} #{value.inspect}" + EOF + end + + describe "when interacting with Rational" do + before :each do + @a = BigDecimal('166.666666666') + @b = Rational(500, 3) + @c = @a - @b + end + + # Check the input is as we understand it + + it "has the LHS print as expected" do + @a.to_s.should == "0.166666666666e3" + @a.to_f.to_s.should == "166.666666666" + Float(@a).to_s.should == "166.666666666" + end + + it "has the RHS print as expected" do + @b.to_s.should == "500/3" + @b.to_f.to_s.should == "166.66666666666666" + Float(@b).to_s.should == "166.66666666666666" + end + + it "produces the expected result when done via Float" do + (Float(@a) - Float(@b)).to_s.should == "-6.666596163995564e-10" + end + + it "produces the expected result when done via to_f" do + (@a.to_f - @b.to_f).to_s.should == "-6.666596163995564e-10" + end + + # Check underlying methods work as we understand + + it "BigDecimal(Rational, 18) produces the result we expect" do + BigDecimal(@b, 18).to_s.should == "0.166666666666666667e3" + end + + # Check the top-level expression works as we expect + + it "produces a BigDecimal" do + @c.class.should == BigDecimal + end + + it "produces the expected result" do + @c.round(15).should == BigDecimal("-0.666667e-9") + @c.round(15).to_s.should == "-0.666667e-9" + end + + it "produces the correct class for other arithmetic operators" do + (@a + @b).class.should == BigDecimal + (@a * @b).class.should == BigDecimal + (@a / @b).class.should == BigDecimal + (@a % @b).class.should == BigDecimal + end + end end diff --git a/spec/ruby/library/bigdecimal/abs_spec.rb b/spec/ruby/library/bigdecimal/abs_spec.rb index ddd2bae9a9..95dc45a905 100644 --- a/spec/ruby/library/bigdecimal/abs_spec.rb +++ b/spec/ruby/library/bigdecimal/abs_spec.rb @@ -38,7 +38,7 @@ describe "BigDecimal#abs" do it "properly handles special values" do @infinity.abs.should == @infinity @infinity_minus.abs.should == @infinity - @nan.abs.nan?.should == true # have to do it this way, since == doesn't work on NaN + @nan.abs.should.nan? # have to do it this way, since == doesn't work on NaN @zero.abs.should == 0 @zero.abs.sign.should == BigDecimal::SIGN_POSITIVE_ZERO @zero_pos.abs.should == 0 diff --git a/spec/ruby/library/bigdecimal/add_spec.rb b/spec/ruby/library/bigdecimal/add_spec.rb index 024dd576cc..a4237298f4 100644 --- a/spec/ruby/library/bigdecimal/add_spec.rb +++ b/spec/ruby/library/bigdecimal/add_spec.rb @@ -24,7 +24,7 @@ describe "BigDecimal#add" do end it "returns a + b with given precision" do - # documentation states, that precision ist optional, but it ain't, + # documentation states that precision is optional, but it ain't, @two.add(@one, 1).should == @three @one .add(@two, 1).should == @three @one.add(@one_minus, 1).should == @zero @@ -60,7 +60,7 @@ describe "BigDecimal#add" do end # TODO: -# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17374 +# https://blade.ruby-lang.org/ruby-core/17374 # # This doesn't work on MRI and looks like a bug to me: # one can use BigDecimal + Float, but not Bigdecimal.add(Float) @@ -73,6 +73,12 @@ describe "BigDecimal#add" do # BigDecimal("0.88").add(0.0, 1).should == BigDecimal("0.9") # end + describe "with Rational" do + it "produces a BigDecimal" do + (@three + Rational(500, 2)).should == BigDecimal("0.253e3") + end + end + it "favors the precision specified in the second argument over the global limit" do BigDecimalSpecs.with_limit(1) do BigDecimal('0.888').add(@zero, 3).should == BigDecimal('0.888') @@ -122,8 +128,8 @@ describe "BigDecimal#add" do end it "returns NaN if NaN is involved" do - @one.add(@nan, 10000).nan?.should == true - @nan.add(@one, 1).nan?.should == true + @one.add(@nan, 10000).should.nan? + @nan.add(@one, 1).should.nan? end it "returns Infinity or -Infinity if these are involved" do @@ -152,28 +158,28 @@ describe "BigDecimal#add" do end it "returns NaN if Infinity + (- Infinity)" do - @infinity.add(@infinity_minus, 10000).nan?.should == true - @infinity_minus.add(@infinity, 10000).nan?.should == true + @infinity.add(@infinity_minus, 10000).should.nan? + @infinity_minus.add(@infinity, 10000).should.nan? end it "raises TypeError when adds nil" do - lambda { + -> { @one.add(nil, 10) - }.should raise_error(TypeError) - lambda { + }.should.raise(TypeError) + -> { @one.add(nil, 0) - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises TypeError when precision parameter is nil" do - lambda { + -> { @one.add(@one, nil) - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises ArgumentError when precision parameter is negative" do - lambda { + -> { @one.add(@one, -10) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/ceil_spec.rb b/spec/ruby/library/bigdecimal/ceil_spec.rb index 879c4fcf36..3d94b8e578 100644 --- a/spec/ruby/library/bigdecimal/ceil_spec.rb +++ b/spec/ruby/library/bigdecimal/ceil_spec.rb @@ -48,9 +48,9 @@ describe "BigDecimal#ceil" do end it "raise exception, if self is special value" do - lambda { @infinity.ceil }.should raise_error(FloatDomainError) - lambda { @infinity_neg.ceil }.should raise_error(FloatDomainError) - lambda { @nan.ceil }.should raise_error(FloatDomainError) + -> { @infinity.ceil }.should.raise(FloatDomainError) + -> { @infinity_neg.ceil }.should.raise(FloatDomainError) + -> { @nan.ceil }.should.raise(FloatDomainError) end it "returns n digits right of the decimal point if given n > 0" do diff --git a/spec/ruby/library/bigdecimal/clone_spec.rb b/spec/ruby/library/bigdecimal/clone_spec.rb new file mode 100644 index 0000000000..b3a1c61d6a --- /dev/null +++ b/spec/ruby/library/bigdecimal/clone_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/clone' + +describe "BigDecimal#dup" do + it_behaves_like :bigdecimal_clone, :clone +end diff --git a/spec/ruby/library/bigdecimal/comparison_spec.rb b/spec/ruby/library/bigdecimal/comparison_spec.rb index a1e09b601f..c53187b727 100644 --- a/spec/ruby/library/bigdecimal/comparison_spec.rb +++ b/spec/ruby/library/bigdecimal/comparison_spec.rb @@ -18,7 +18,7 @@ describe "BigDecimal#<=>" do def coerce(other) return [other, BigDecimal('123')] end - def >= (other) + def >=(other) BigDecimal('123') >= other end end diff --git a/spec/ruby/library/bigdecimal/constants_spec.rb b/spec/ruby/library/bigdecimal/constants_spec.rb new file mode 100644 index 0000000000..f2cc42dfc9 --- /dev/null +++ b/spec/ruby/library/bigdecimal/constants_spec.rb @@ -0,0 +1,70 @@ +require_relative '../../spec_helper' +require 'bigdecimal' + +describe "BigDecimal constants" do + it "defines a VERSION value" do + BigDecimal.const_defined?(:VERSION).should == true + end + + it "has a BASE value" do + # The actual one is decided based on HAVE_INT64_T in MRI, + # which is hard to check here. + [10000, 1000000000].should.include?(BigDecimal::BASE) + end + + it "has a NaN value" do + BigDecimal::NAN.nan?.should == true + end + + it "has an INFINITY value" do + BigDecimal::INFINITY.infinite?.should == 1 + end + + describe "exception-related constants" do + [ + [:EXCEPTION_ALL, 0xff], + [:EXCEPTION_INFINITY, 0x01], + [:EXCEPTION_NaN, 0x02], + [:EXCEPTION_UNDERFLOW, 0x04], + [:EXCEPTION_OVERFLOW, 0x01], + [:EXCEPTION_ZERODIVIDE, 0x10] + ].each do |const, value| + it "has a #{const} value" do + BigDecimal.const_get(const).should == value + end + end + end + + describe "rounding-related constants" do + [ + [:ROUND_MODE, 0x100], + [:ROUND_UP, 1], + [:ROUND_DOWN, 2], + [:ROUND_HALF_UP, 3], + [:ROUND_HALF_DOWN, 4], + [:ROUND_CEILING, 5], + [:ROUND_FLOOR, 6], + [:ROUND_HALF_EVEN, 7] + ].each do |const, value| + it "has a #{const} value" do + BigDecimal.const_get(const).should == value + end + end + end + + describe "sign-related constants" do + [ + [:SIGN_NaN, 0], + [:SIGN_POSITIVE_ZERO, 1], + [:SIGN_NEGATIVE_ZERO, -1], + [:SIGN_POSITIVE_FINITE, 2], + [:SIGN_NEGATIVE_FINITE, -2], + [:SIGN_POSITIVE_INFINITE, 3], + [:SIGN_NEGATIVE_INFINITE, -3] + ].each do |const, value| + it "has a #{const} value" do + BigDecimal.const_get(const).should == value + end + end + end +end diff --git a/spec/ruby/library/bigdecimal/core_spec.rb b/spec/ruby/library/bigdecimal/core_spec.rb new file mode 100644 index 0000000000..8f64fdf388 --- /dev/null +++ b/spec/ruby/library/bigdecimal/core_spec.rb @@ -0,0 +1,62 @@ +require_relative '../../spec_helper' +require 'bigdecimal' + +describe "Core extension by bigdecimal" do + context "Integer#coerce" do + it "produces Floats" do + x, y = 3.coerce(BigDecimal("3.4")) + x.class.should == Float + x.should == 3.4 + y.class.should == Float + y.should == 3.0 + end + end + + describe "Time.at passed BigDecimal" do + it "doesn't round input value" do + Time.at(BigDecimal('1.1')).to_f.should == 1.1 + end + end + + describe "BigDecimal#log" do + it "handles high-precision Rational arguments" do + # log(BigDecimal(r, 50), 50) + result1 = BigDecimal('0.22314354220170971436137296411949880462556361100856e0') + # log(BigDecimal(r, 1000), 50) + result2 = BigDecimal('0.22314354220170971436137296411949880462556361100853e0') + r = Rational(1_234_567_890, 987_654_321) + [result1, result2].should.include?(BigMath.log(r, 50).mult(1, 50)) + end + end + + describe "Rational#coerce" do + it "returns the passed argument, self as Float, when given a Float" do + result = Rational(3, 4).coerce(1.0) + result.should == [1.0, 0.75] + result.first.is_a?(Float).should == true + result.last.is_a?(Float).should == true + end + + it "returns the passed argument, self as Rational, when given an Integer" do + result = Rational(3, 4).coerce(10) + result.should == [Rational(10, 1), Rational(3, 4)] + result.first.is_a?(Rational).should == true + result.last.is_a?(Rational).should == true + end + + it "coerces to Rational, when given a Complex" do + Rational(3, 4).coerce(Complex(5)).should == [Rational(5, 1), Rational(3, 4)] + Rational(12, 4).coerce(Complex(5, 1)).should == [Complex(5, 1), Complex(3)] + end + + it "returns [argument, self] when given a Rational" do + Rational(3, 7).coerce(Rational(9, 2)).should == [Rational(9, 2), Rational(3, 7)] + end + + it "raises an error when passed a BigDecimal" do + -> { + Rational(500, 3).coerce(BigDecimal('166.666666666')) + }.should.raise(TypeError, /BigDecimal can't be coerced into Rational/) + end + end +end diff --git a/spec/ruby/library/bigdecimal/div_spec.rb b/spec/ruby/library/bigdecimal/div_spec.rb index a774376f55..967d8b5221 100644 --- a/spec/ruby/library/bigdecimal/div_spec.rb +++ b/spec/ruby/library/bigdecimal/div_spec.rb @@ -42,10 +42,18 @@ describe "BigDecimal#div" do } end + describe "with Object" do + it "tries to coerce the other operand to self" do + object = mock("Object") + object.should_receive(:coerce).with(@one).and_return([@one, @two]) + @one.div(object).should == @zero + end + end + it "raises FloatDomainError if NaN is involved" do - lambda { @one.div(@nan) }.should raise_error(FloatDomainError) - lambda { @nan.div(@one) }.should raise_error(FloatDomainError) - lambda { @nan.div(@nan) }.should raise_error(FloatDomainError) + -> { @one.div(@nan) }.should.raise(FloatDomainError) + -> { @nan.div(@one) }.should.raise(FloatDomainError) + -> { @nan.div(@nan) }.should.raise(FloatDomainError) end it "returns 0 if divided by Infinity and no precision given" do @@ -61,30 +69,30 @@ describe "BigDecimal#div" do end it "raises ZeroDivisionError if divided by zero and no precision given" do - lambda { @one.div(@zero) }.should raise_error(ZeroDivisionError) - lambda { @one.div(@zero_plus) }.should raise_error(ZeroDivisionError) - lambda { @one.div(@zero_minus) }.should raise_error(ZeroDivisionError) - - lambda { @zero.div(@zero) }.should raise_error(ZeroDivisionError) - lambda { @zero_minus.div(@zero_plus) }.should raise_error(ZeroDivisionError) - lambda { @zero_minus.div(@zero_minus) }.should raise_error(ZeroDivisionError) - lambda { @zero_plus.div(@zero_minus) }.should raise_error(ZeroDivisionError) + -> { @one.div(@zero) }.should.raise(ZeroDivisionError) + -> { @one.div(@zero_plus) }.should.raise(ZeroDivisionError) + -> { @one.div(@zero_minus) }.should.raise(ZeroDivisionError) + + -> { @zero.div(@zero) }.should.raise(ZeroDivisionError) + -> { @zero_minus.div(@zero_plus) }.should.raise(ZeroDivisionError) + -> { @zero_minus.div(@zero_minus) }.should.raise(ZeroDivisionError) + -> { @zero_plus.div(@zero_minus) }.should.raise(ZeroDivisionError) end it "returns NaN if zero is divided by zero" do - @zero.div(@zero, 0).nan?.should == true - @zero_minus.div(@zero_plus, 0).nan?.should == true - @zero_plus.div(@zero_minus, 0).nan?.should == true + @zero.div(@zero, 0).should.nan? + @zero_minus.div(@zero_plus, 0).should.nan? + @zero_plus.div(@zero_minus, 0).should.nan? - @zero.div(@zero, 10).nan?.should == true - @zero_minus.div(@zero_plus, 10).nan?.should == true - @zero_plus.div(@zero_minus, 10).nan?.should == true + @zero.div(@zero, 10).should.nan? + @zero_minus.div(@zero_plus, 10).should.nan? + @zero_plus.div(@zero_minus, 10).should.nan? end it "raises FloatDomainError if (+|-) Infinity divided by 1 and no precision given" do - lambda { @infinity_minus.div(@one) }.should raise_error(FloatDomainError) - lambda { @infinity.div(@one) }.should raise_error(FloatDomainError) - lambda { @infinity_minus.div(@one_minus) }.should raise_error(FloatDomainError) + -> { @infinity_minus.div(@one) }.should.raise(FloatDomainError) + -> { @infinity.div(@one) }.should.raise(FloatDomainError) + -> { @infinity_minus.div(@one_minus) }.should.raise(FloatDomainError) end it "returns (+|-)Infinity if (+|-)Infinity by 1 and precision given" do @@ -94,8 +102,8 @@ describe "BigDecimal#div" do end it "returns NaN if Infinity / ((+|-) Infinity)" do - @infinity.div(@infinity_minus, 100000).nan?.should == true - @infinity_minus.div(@infinity, 1).nan?.should == true + @infinity.div(@infinity_minus, 100000).should.nan? + @infinity_minus.div(@infinity, 1).should.nan? end diff --git a/spec/ruby/library/bigdecimal/divide_spec.rb b/spec/ruby/library/bigdecimal/divide_spec.rb index 2aac99799f..c62b23557d 100644 --- a/spec/ruby/library/bigdecimal/divide_spec.rb +++ b/spec/ruby/library/bigdecimal/divide_spec.rb @@ -4,4 +4,14 @@ require 'bigdecimal' describe "BigDecimal#/" do it_behaves_like :bigdecimal_quo, :/, [] + + before :each do + @three = BigDecimal("3") + end + + describe "with Rational" do + it "produces a BigDecimal" do + (@three / Rational(500, 2)).should == BigDecimal("0.12e-1") + end + end end diff --git a/spec/ruby/library/bigdecimal/divmod_spec.rb b/spec/ruby/library/bigdecimal/divmod_spec.rb index 3a18b150dd..d170c6f845 100644 --- a/spec/ruby/library/bigdecimal/divmod_spec.rb +++ b/spec/ruby/library/bigdecimal/divmod_spec.rb @@ -5,8 +5,8 @@ require 'bigdecimal' module DivmodSpecs def self.check_both_nan(array) array.length.should == 2 - array[0].nan?.should == true - array[1].nan?.should == true + array[0].should.nan? + array[1].should.nan? end def self.check_both_bigdecimal(array) array.length.should == 2 @@ -33,14 +33,16 @@ describe "BigDecimal#mod_part_of_divmod" do end end - it_behaves_like :bigdecimal_modulo, :mod_part_of_divmod + version_is BigDecimal::VERSION, ""..."4.0.0" do + it_behaves_like :bigdecimal_modulo, :mod_part_of_divmod + end it "raises ZeroDivisionError if other is zero" do bd5667 = BigDecimal("5667.19") - - lambda { bd5667.mod_part_of_divmod(0) }.should raise_error(ZeroDivisionError) - lambda { bd5667.mod_part_of_divmod(BigDecimal("0")) }.should raise_error(ZeroDivisionError) - lambda { @zero.mod_part_of_divmod(@zero) }.should raise_error(ZeroDivisionError) + zero = BigDecimal("0") + -> { bd5667.mod_part_of_divmod(0) }.should.raise(ZeroDivisionError) + -> { bd5667.mod_part_of_divmod(BigDecimal("0")) }.should.raise(ZeroDivisionError) + -> { zero.mod_part_of_divmod(zero) }.should.raise(ZeroDivisionError) end end @@ -73,14 +75,25 @@ describe "BigDecimal#divmod" do @zeroes = [@zero, @zero_pos, @zero_neg] end - it "divides value, returns an array" do - res = @a.divmod(5) - res.kind_of?(Array).should == true + version_is BigDecimal::VERSION, ""..."4.0.0" do + it "divides value, returns [BigDecimal, BigDecimal]" do + res = @a.divmod(5) + res.kind_of?(Array).should == true + DivmodSpecs.check_both_bigdecimal(res) + end + end + + version_is BigDecimal::VERSION, "4.0.0" do + it "divides value, returns [Integer, BigDecimal]" do + res = @a.divmod(5) + res.kind_of?(Array).should == true + res[0].kind_of?(Integer).should == true + res[1].kind_of?(BigDecimal).should == true + end end it "array contains quotient and modulus as BigDecimal" do res = @a.divmod(5) - DivmodSpecs.check_both_bigdecimal(res) res[0].should == BigDecimal('0.8E1') res[1].should == BigDecimal('2.00000000000000000001') @@ -123,47 +136,66 @@ describe "BigDecimal#divmod" do values_and_zeroes.each do |val1| values.each do |val2| res = val1.divmod(val2) - DivmodSpecs.check_both_bigdecimal(res) res[0].should == ((val1/val2).floor) res[1].should == (val1 - res[0] * val2) end end end - it "returns an array of two NaNs if NaN is involved" do - (@special_vals + @regular_vals + @zeroes).each do |val| - DivmodSpecs.check_both_nan(val.divmod(@nan)) - DivmodSpecs.check_both_nan(@nan.divmod(val)) + version_is BigDecimal::VERSION, "4.0.0" do + it "raise FloatDomainError error if NaN is involved" do + (@special_vals + @regular_vals + @zeroes).each do |val| + -> { val.divmod(@nan) }.should.raise(FloatDomainError) + -> { @nan.divmod(val) }.should.raise(FloatDomainError) + end + end + end + + version_is BigDecimal::VERSION, ""..."4.0.0" do + it "returns an array of two NaNs if NaN is involved" do + (@special_vals + @regular_vals + @zeroes).each do |val| + DivmodSpecs.check_both_nan(val.divmod(@nan)) + DivmodSpecs.check_both_nan(@nan.divmod(val)) + end end end it "raises ZeroDivisionError if the divisor is zero" do (@special_vals + @regular_vals + @zeroes - [@nan]).each do |val| @zeroes.each do |zero| - lambda { val.divmod(zero) }.should raise_error(ZeroDivisionError) + -> { val.divmod(zero) }.should.raise(ZeroDivisionError) end end end - it "returns an array of Infinity and NaN if the dividend is Infinity" do - @regular_vals.each do |val| - array = @infinity.divmod(val) - array.length.should == 2 - array[0].infinite?.should == (val > 0 ? 1 : -1) - array[1].nan?.should == true + version_is BigDecimal::VERSION, ""..."4.0.0" do + it "returns an array of Infinity and NaN if the dividend is Infinity" do + @regular_vals.each do |val| + array = @infinity.divmod(val) + array.length.should == 2 + array[0].infinite?.should == (val > 0 ? 1 : -1) + array[1].should.nan? + end end end - it "returns an array of zero and the dividend if the divisor is Infinity" do - @regular_vals.each do |val| - array = val.divmod(@infinity) - array.length.should == 2 - array[0].should == @zero - array[1].should == val + version_is BigDecimal::VERSION, "3.3.0" do + it "returns an array of zero and the dividend or minus one and Infinity if the divisor is Infinity" do + @regular_vals.each do |val| + array = val.divmod(@infinity) + array.length.should == 2 + if val >= 0 + array[0].should == @zero + array[1].should == val + else + array[0].should == @one_minus + array[1].should == @infinity + end + end end end - it "returns an array of two zero if the diviend is zero" do + it "returns an array of two zero if the dividend is zero" do @zeroes.each do |zero| @regular_vals.each do |val| zero.divmod(val).should == [@zero, @zero] @@ -172,9 +204,9 @@ describe "BigDecimal#divmod" do end it "raises TypeError if the argument cannot be coerced to BigDecimal" do - lambda { + -> { @one.divmod('1') - }.should raise_error(TypeError) + }.should.raise(TypeError) end end diff --git a/spec/ruby/library/bigdecimal/dup_spec.rb b/spec/ruby/library/bigdecimal/dup_spec.rb new file mode 100644 index 0000000000..bfabaf6e8b --- /dev/null +++ b/spec/ruby/library/bigdecimal/dup_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/clone' + +describe "BigDecimal#dup" do + it_behaves_like :bigdecimal_clone, :dup +end diff --git a/spec/ruby/library/bigdecimal/exponent_spec.rb b/spec/ruby/library/bigdecimal/exponent_spec.rb index a349ac093f..8877147955 100644 --- a/spec/ruby/library/bigdecimal/exponent_spec.rb +++ b/spec/ruby/library/bigdecimal/exponent_spec.rb @@ -18,17 +18,6 @@ describe "BigDecimal#exponent" do BigDecimal("1234567E10").exponent.should == 17 end -# commenting this spec out after discussion with Defiler, since it seems to be an MRI bug, not a real feature -=begin - platform_is wordsize: 32 do - # TODO: write specs for both 32 and 64 bit - it "returns 0 if exponent can't be represented as Fixnum" do - BigDecimal("2E1000000000000000").exponent.should == 0 - BigDecimal("-5E-999999999999999").exponent.should == 0 - end - end -=end - it "returns 0 if self is 0" do BigDecimal("0").exponent.should == 0 BigDecimal("+0").exponent.should == 0 diff --git a/spec/ruby/library/bigdecimal/finite_spec.rb b/spec/ruby/library/bigdecimal/finite_spec.rb index 6685d589b6..8fc06029bb 100644 --- a/spec/ruby/library/bigdecimal/finite_spec.rb +++ b/spec/ruby/library/bigdecimal/finite_spec.rb @@ -21,14 +21,14 @@ describe "BigDecimal#finite?" do end it "is false if Infinity or NaN" do - @infinity.finite?.should == false - @infinity_minus.finite?.should == false - @nan.finite?.should == false + @infinity.should_not.finite? + @infinity_minus.should_not.finite? + @nan.should_not.finite? end it "returns true for finite values" do @finite_vals.each do |val| - val.finite?.should == true + val.should.finite? end end end diff --git a/spec/ruby/library/bigdecimal/fix_spec.rb b/spec/ruby/library/bigdecimal/fix_spec.rb index af852d6471..dceb2ce867 100644 --- a/spec/ruby/library/bigdecimal/fix_spec.rb +++ b/spec/ruby/library/bigdecimal/fix_spec.rb @@ -2,20 +2,20 @@ require_relative '../../spec_helper' require 'bigdecimal' describe "BigDecimal#fix" do - before :each do - @zero = BigDecimal("0") - @mixed = BigDecimal("1.23456789") - @pos_int = BigDecimal("2E5555") - @neg_int = BigDecimal("-2E5555") - @pos_frac = BigDecimal("2E-9999") - @neg_frac = BigDecimal("-2E-9999") - - @infinity = BigDecimal("Infinity") - @infinity_neg = BigDecimal("-Infinity") - @nan = BigDecimal("NaN") - @zero_pos = BigDecimal("+0") - @zero_neg = BigDecimal("-0") - end + before :each do + @zero = BigDecimal("0") + @mixed = BigDecimal("1.23456789") + @pos_int = BigDecimal("2E5555") + @neg_int = BigDecimal("-2E5555") + @pos_frac = BigDecimal("2E-9999") + @neg_frac = BigDecimal("-2E-9999") + + @infinity = BigDecimal("Infinity") + @infinity_neg = BigDecimal("-Infinity") + @nan = BigDecimal("NaN") + @zero_pos = BigDecimal("+0") + @zero_neg = BigDecimal("-0") + end it "returns a BigDecimal" do BigDecimal("2E100000000").fix.kind_of?(BigDecimal).should == true @@ -34,7 +34,7 @@ describe "BigDecimal#fix" do it "correctly handles special values" do @infinity.fix.should == @infinity @infinity_neg.fix.should == @infinity_neg - @nan.fix.nan?.should == true + @nan.fix.should.nan? end it "returns 0 if the absolute value is < 1" do @@ -49,9 +49,9 @@ describe "BigDecimal#fix" do end it "does not allow any arguments" do - lambda { + -> { @mixed.fix(10) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/floor_spec.rb b/spec/ruby/library/bigdecimal/floor_spec.rb index 509cb00e10..c0666c668c 100644 --- a/spec/ruby/library/bigdecimal/floor_spec.rb +++ b/spec/ruby/library/bigdecimal/floor_spec.rb @@ -41,9 +41,9 @@ describe "BigDecimal#floor" do end it "raise exception, if self is special value" do - lambda { @infinity.floor }.should raise_error(FloatDomainError) - lambda { @infinity_neg.floor }.should raise_error(FloatDomainError) - lambda { @nan.floor }.should raise_error(FloatDomainError) + -> { @infinity.floor }.should.raise(FloatDomainError) + -> { @infinity_neg.floor }.should.raise(FloatDomainError) + -> { @nan.floor }.should.raise(FloatDomainError) end it "returns n digits right of the decimal point if given n > 0" do diff --git a/spec/ruby/library/bigdecimal/frac_spec.rb b/spec/ruby/library/bigdecimal/frac_spec.rb index 4a023b4ff6..11ccf03c2f 100644 --- a/spec/ruby/library/bigdecimal/frac_spec.rb +++ b/spec/ruby/library/bigdecimal/frac_spec.rb @@ -42,7 +42,7 @@ describe "BigDecimal#frac" do it "correctly handles special values" do @infinity.frac.should == @infinity @infinity_neg.frac.should == @infinity_neg - @nan.frac.nan?.should == true + @nan.frac.should.nan? end end diff --git a/spec/ruby/library/bigdecimal/gt_spec.rb b/spec/ruby/library/bigdecimal/gt_spec.rb index c815aa0353..e9c9a60e75 100644 --- a/spec/ruby/library/bigdecimal/gt_spec.rb +++ b/spec/ruby/library/bigdecimal/gt_spec.rb @@ -17,7 +17,7 @@ describe "BigDecimal#>" do def coerce(other) return [other, BigDecimal('123')] end - def > (other) + def >(other) BigDecimal('123') > other end end @@ -68,15 +68,13 @@ describe "BigDecimal#>" do (@infinity_neg > @infinity).should == false end - ruby_bug "#13674", ""..."2.4" do - it "properly handles Float infinity values" do - @values.each { |val| - (val > @float_infinity).should == false - (@float_infinity > val).should == true - (val > @float_infinity_neg).should == true - (@float_infinity_neg > val).should == false - } - end + it "properly handles Float infinity values" do + @values.each { |val| + (val > @float_infinity).should == false + (@float_infinity > val).should == true + (val > @float_infinity_neg).should == true + (@float_infinity_neg > val).should == false + } end it "properly handles NaN values" do @@ -88,11 +86,11 @@ describe "BigDecimal#>" do end it "raises an ArgumentError if the argument can't be coerced into a BigDecimal" do - lambda {@zero > nil }.should raise_error(ArgumentError) - lambda {@infinity > nil }.should raise_error(ArgumentError) - lambda {@infinity_neg > nil }.should raise_error(ArgumentError) - lambda {@mixed > nil }.should raise_error(ArgumentError) - lambda {@pos_int > nil }.should raise_error(ArgumentError) - lambda {@neg_frac > nil }.should raise_error(ArgumentError) + -> {@zero > nil }.should.raise(ArgumentError) + -> {@infinity > nil }.should.raise(ArgumentError) + -> {@infinity_neg > nil }.should.raise(ArgumentError) + -> {@mixed > nil }.should.raise(ArgumentError) + -> {@pos_int > nil }.should.raise(ArgumentError) + -> {@neg_frac > nil }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/gte_spec.rb b/spec/ruby/library/bigdecimal/gte_spec.rb index 14534eec80..548f3efe4c 100644 --- a/spec/ruby/library/bigdecimal/gte_spec.rb +++ b/spec/ruby/library/bigdecimal/gte_spec.rb @@ -17,7 +17,7 @@ describe "BigDecimal#>=" do def coerce(other) return [other, BigDecimal('123')] end - def >= (other) + def >=(other) BigDecimal('123') >= other end end @@ -72,15 +72,13 @@ describe "BigDecimal#>=" do (@infinity_neg >= @infinity).should == false end - ruby_bug "#13674", ""..."2.4" do - it "properly handles Float infinity values" do - @values.each { |val| - (val >= @float_infinity).should == false - (@float_infinity >= val).should == true - (val >= @float_infinity_neg).should == true - (@float_infinity_neg >= val).should == false - } - end + it "properly handles Float infinity values" do + @values.each { |val| + (val >= @float_infinity).should == false + (@float_infinity >= val).should == true + (val >= @float_infinity_neg).should == true + (@float_infinity_neg >= val).should == false + } end it "properly handles NaN values" do @@ -92,11 +90,11 @@ describe "BigDecimal#>=" do end it "returns nil if the argument is nil" do - lambda {@zero >= nil }.should raise_error(ArgumentError) - lambda {@infinity >= nil }.should raise_error(ArgumentError) - lambda {@infinity_neg >= nil }.should raise_error(ArgumentError) - lambda {@mixed >= nil }.should raise_error(ArgumentError) - lambda {@pos_int >= nil }.should raise_error(ArgumentError) - lambda {@neg_frac >= nil }.should raise_error(ArgumentError) + -> {@zero >= nil }.should.raise(ArgumentError) + -> {@infinity >= nil }.should.raise(ArgumentError) + -> {@infinity_neg >= nil }.should.raise(ArgumentError) + -> {@mixed >= nil }.should.raise(ArgumentError) + -> {@pos_int >= nil }.should.raise(ArgumentError) + -> {@neg_frac >= nil }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/hash_spec.rb b/spec/ruby/library/bigdecimal/hash_spec.rb new file mode 100644 index 0000000000..7581c90f68 --- /dev/null +++ b/spec/ruby/library/bigdecimal/hash_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../spec_helper' +require 'bigdecimal' + +describe "BidDecimal#hash" do + describe "two BigDecimal objects with the same value" do + it "should have the same hash for ordinary values" do + BigDecimal('1.2920').hash.should == BigDecimal('1.2920').hash + end + + it "should have the same hash for infinite values" do + BigDecimal("+Infinity").hash.should == BigDecimal("+Infinity").hash + BigDecimal("-Infinity").hash.should == BigDecimal("-Infinity").hash + end + + it "should have the same hash for NaNs" do + BigDecimal("NaN").hash.should == BigDecimal("NaN").hash + end + + it "should have the same hash for zero values" do + BigDecimal("+0").hash.should == BigDecimal("+0").hash + BigDecimal("-0").hash.should == BigDecimal("-0").hash + end + end + + describe "two BigDecimal objects with numerically equal values" do + it "should have the same hash value" do + BigDecimal("1.2920").hash.should == BigDecimal("1.2920000").hash + end + end +end diff --git a/spec/ruby/library/bigdecimal/inspect_spec.rb b/spec/ruby/library/bigdecimal/inspect_spec.rb index 7e1a8297e2..7ce47142b2 100644 --- a/spec/ruby/library/bigdecimal/inspect_spec.rb +++ b/spec/ruby/library/bigdecimal/inspect_spec.rb @@ -11,37 +11,20 @@ describe "BigDecimal#inspect" do @bigdec.inspect.kind_of?(String).should == true end - ruby_version_is ""..."2.4" do - it "returns String starting with #" do - @bigdec.inspect[0].should == ?# - end - - it "encloses information in angle brackets" do - @bigdec.inspect.should =~ /^.<.*>$/ - end - - it "is comma separated list of three items" do - @bigdec.inspect.should =~ /...*,.*,.*/ - end - - it "value after first comma is value as string" do - @bigdec.inspect.split(",")[1].should == "\'0.12345678E4\'" - end - - it "last part is number of significant digits" do - signific_string = "#{@bigdec.precs[0]}(#{@bigdec.precs[1]})" - @bigdec.inspect.split(",")[2].should == signific_string + ">" - end + it "looks like this" do + @bigdec.inspect.should == "0.12345678e4" + end - it "looks like this" do - regex = /^\#\<BigDecimal\:.*,'0\.12345678E4',[0-9]+\([0-9]+\)>$/ - @bigdec.inspect.should =~ regex - end + it "does not add an exponent for zero values" do + BigDecimal("0").inspect.should == "0.0" + BigDecimal("+0").inspect.should == "0.0" + BigDecimal("-0").inspect.should == "-0.0" end - ruby_version_is "2.4" do - it "looks like this" do - @bigdec.inspect.should == "0.12345678e4" - end + it "properly cases non-finite values" do + BigDecimal("NaN").inspect.should == "NaN" + BigDecimal("Infinity").inspect.should == "Infinity" + BigDecimal("+Infinity").inspect.should == "Infinity" + BigDecimal("-Infinity").inspect.should == "-Infinity" end end diff --git a/spec/ruby/library/bigdecimal/lt_spec.rb b/spec/ruby/library/bigdecimal/lt_spec.rb index 8cf92fedd2..c3f3573247 100644 --- a/spec/ruby/library/bigdecimal/lt_spec.rb +++ b/spec/ruby/library/bigdecimal/lt_spec.rb @@ -17,7 +17,7 @@ describe "BigDecimal#<" do def coerce(other) return [other, BigDecimal('123')] end - def < (other) + def <(other) BigDecimal('123') < other end end @@ -66,15 +66,13 @@ describe "BigDecimal#<" do (@infinity_neg < @infinity).should == true end - ruby_bug "#13674", ""..."2.4" do - it "properly handles Float infinity values" do - @values.each { |val| - (val < @float_infinity).should == true - (@float_infinity < val).should == false - (val < @float_infinity_neg).should == false - (@float_infinity_neg < val).should == true - } - end + it "properly handles Float infinity values" do + @values.each { |val| + (val < @float_infinity).should == true + (@float_infinity < val).should == false + (val < @float_infinity_neg).should == false + (@float_infinity_neg < val).should == true + } end it "properly handles NaN values" do @@ -86,11 +84,11 @@ describe "BigDecimal#<" do end it "raises an ArgumentError if the argument can't be coerced into a BigDecimal" do - lambda {@zero < nil }.should raise_error(ArgumentError) - lambda {@infinity < nil }.should raise_error(ArgumentError) - lambda {@infinity_neg < nil }.should raise_error(ArgumentError) - lambda {@mixed < nil }.should raise_error(ArgumentError) - lambda {@pos_int < nil }.should raise_error(ArgumentError) - lambda {@neg_frac < nil }.should raise_error(ArgumentError) + -> {@zero < nil }.should.raise(ArgumentError) + -> {@infinity < nil }.should.raise(ArgumentError) + -> {@infinity_neg < nil }.should.raise(ArgumentError) + -> {@mixed < nil }.should.raise(ArgumentError) + -> {@pos_int < nil }.should.raise(ArgumentError) + -> {@neg_frac < nil }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/lte_spec.rb b/spec/ruby/library/bigdecimal/lte_spec.rb index eff6547369..7918bde88b 100644 --- a/spec/ruby/library/bigdecimal/lte_spec.rb +++ b/spec/ruby/library/bigdecimal/lte_spec.rb @@ -17,7 +17,7 @@ describe "BigDecimal#<=" do def coerce(other) return [other, BigDecimal('123')] end - def <= (other) + def <=(other) BigDecimal('123') <= other end end @@ -72,15 +72,13 @@ describe "BigDecimal#<=" do (@infinity_neg <= @infinity).should == true end - ruby_bug "#13674", ""..."2.4" do - it "properly handles Float infinity values" do - @values.each { |val| - (val <= @float_infinity).should == true - (@float_infinity <= val).should == false - (val <= @float_infinity_neg).should == false - (@float_infinity_neg <= val).should == true - } - end + it "properly handles Float infinity values" do + @values.each { |val| + (val <= @float_infinity).should == true + (@float_infinity <= val).should == false + (val <= @float_infinity_neg).should == false + (@float_infinity_neg <= val).should == true + } end it "properly handles NaN values" do @@ -92,11 +90,11 @@ describe "BigDecimal#<=" do end it "raises an ArgumentError if the argument can't be coerced into a BigDecimal" do - lambda {@zero <= nil }.should raise_error(ArgumentError) - lambda {@infinity <= nil }.should raise_error(ArgumentError) - lambda {@infinity_neg <= nil }.should raise_error(ArgumentError) - lambda {@mixed <= nil }.should raise_error(ArgumentError) - lambda {@pos_int <= nil }.should raise_error(ArgumentError) - lambda {@neg_frac <= nil }.should raise_error(ArgumentError) + -> {@zero <= nil }.should.raise(ArgumentError) + -> {@infinity <= nil }.should.raise(ArgumentError) + -> {@infinity_neg <= nil }.should.raise(ArgumentError) + -> {@mixed <= nil }.should.raise(ArgumentError) + -> {@pos_int <= nil }.should.raise(ArgumentError) + -> {@neg_frac <= nil }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/bigdecimal/minus_spec.rb b/spec/ruby/library/bigdecimal/minus_spec.rb index 02f7f02296..bd3c19584b 100644 --- a/spec/ruby/library/bigdecimal/minus_spec.rb +++ b/spec/ruby/library/bigdecimal/minus_spec.rb @@ -26,18 +26,18 @@ describe "BigDecimal#-" do end it "returns NaN if NaN is involved" do - (@one - @nan).nan?.should == true - (@nan - @one).nan?.should == true - (@nan - @nan).nan?.should == true - (@nan - @infinity).nan?.should == true - (@nan - @infinity_minus).nan?.should == true - (@infinity - @nan).nan?.should == true - (@infinity_minus - @nan).nan?.should == true + (@one - @nan).should.nan? + (@nan - @one).should.nan? + (@nan - @nan).should.nan? + (@nan - @infinity).should.nan? + (@nan - @infinity_minus).should.nan? + (@infinity - @nan).should.nan? + (@infinity_minus - @nan).should.nan? end it "returns NaN both operands are infinite with the same sign" do - (@infinity - @infinity).nan?.should == true - (@infinity_minus - @infinity_minus).nan?.should == true + (@infinity - @infinity).should.nan? + (@infinity_minus - @infinity_minus).should.nan? end it "returns Infinity or -Infinity if these are involved" do @@ -55,4 +55,12 @@ describe "BigDecimal#-" do (@one_minus - @infinity).should == @infinity_minus end + describe "with Object" do + it "tries to coerce the other operand to self" do + object = mock("Object") + object.should_receive(:coerce).with(@one).and_return([@one, BigDecimal("42")]) + (@one - object).should == BigDecimal("-41") + end + end + end diff --git a/spec/ruby/library/bigdecimal/mode_spec.rb b/spec/ruby/library/bigdecimal/mode_spec.rb index 1de19c9971..26e6d0ea75 100644 --- a/spec/ruby/library/bigdecimal/mode_spec.rb +++ b/spec/ruby/library/bigdecimal/mode_spec.rb @@ -12,7 +12,7 @@ describe "BigDecimal.mode" do end it "returns the appropriate value and continue the computation if the flag is false" do - BigDecimal("NaN").add(BigDecimal("1"),0).nan?.should == true + BigDecimal("NaN").add(BigDecimal("1"),0).should.nan? BigDecimal("0").add(BigDecimal("Infinity"),0).should == BigDecimal("Infinity") BigDecimal("1").quo(BigDecimal("0")).should == BigDecimal("Infinity") end @@ -24,13 +24,13 @@ describe "BigDecimal.mode" do it "raise an exception if the flag is true" do BigDecimal.mode(BigDecimal::EXCEPTION_NaN, true) - lambda { BigDecimal("NaN").add(BigDecimal("1"),0) }.should raise_error(FloatDomainError) + -> { BigDecimal("NaN").add(BigDecimal("1"),0) }.should.raise(FloatDomainError) BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, true) - lambda { BigDecimal("0").add(BigDecimal("Infinity"),0) }.should raise_error(FloatDomainError) + -> { BigDecimal("0").add(BigDecimal("Infinity"),0) }.should.raise(FloatDomainError) BigDecimal.mode(BigDecimal::EXCEPTION_ZERODIVIDE, true) - lambda { BigDecimal("1").quo(BigDecimal("0")) }.should raise_error(FloatDomainError) + -> { BigDecimal("1").quo(BigDecimal("0")) }.should.raise(FloatDomainError) BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, true) - lambda { BigDecimal("1E11111111111111111111") }.should raise_error(FloatDomainError) - lambda { (BigDecimal("1E1000000000000000000")**10) }.should raise_error(FloatDomainError) + -> { BigDecimal("1E11111111111111111111") }.should.raise(FloatDomainError) + -> { (BigDecimal("1E1000000000000000000")**10) }.should.raise(FloatDomainError) end end diff --git a/spec/ruby/library/bigdecimal/mult_spec.rb b/spec/ruby/library/bigdecimal/mult_spec.rb index a4c1602182..2353df9cb8 100644 --- a/spec/ruby/library/bigdecimal/mult_spec.rb +++ b/spec/ruby/library/bigdecimal/mult_spec.rb @@ -9,7 +9,8 @@ end describe "BigDecimal#mult" do before :each do @one = BigDecimal "1" - @e3_minus = BigDecimal "3E-20001" + @e3_minus = BigDecimal("3E-20001") + @e3_plus = BigDecimal("3E20001") @e = BigDecimal "1.00000000000000000000123456789" @tolerance = @e.sub @one, 1000 @tolerance2 = BigDecimal "30001E-20005" @@ -20,5 +21,4 @@ describe "BigDecimal#mult" do @e.mult(@one, 1).should be_close(@one, @tolerance) @e3_minus.mult(@one, 1).should be_close(0, @tolerance2) end - end diff --git a/spec/ruby/library/bigdecimal/multiply_spec.rb b/spec/ruby/library/bigdecimal/multiply_spec.rb index 2741d3623e..a8ce1da32e 100644 --- a/spec/ruby/library/bigdecimal/multiply_spec.rb +++ b/spec/ruby/library/bigdecimal/multiply_spec.rb @@ -8,6 +8,7 @@ end describe "BigDecimal#*" do before :each do + @three = BigDecimal("3") @e3_minus = BigDecimal("3E-20001") @e3_plus = BigDecimal("3E20001") @e = BigDecimal("1.00000000000000000000123456789") @@ -23,4 +24,18 @@ describe "BigDecimal#*" do (@e3_minus * @e3_minus).should == BigDecimal("9E-40002") (@e * @one).should == @e end + + describe "with Object" do + it "tries to coerce the other operand to self" do + object = mock("Object") + object.should_receive(:coerce).with(@e3_minus).and_return([@e3_minus, @e3_plus]) + (@e3_minus * object).should == BigDecimal("9") + end + end + + describe "with Rational" do + it "produces a BigDecimal" do + (@three * Rational(500, 2)).should == BigDecimal("0.75e3") + end + end end diff --git a/spec/ruby/library/bigdecimal/nan_spec.rb b/spec/ruby/library/bigdecimal/nan_spec.rb index 705492614b..9eaf69b610 100644 --- a/spec/ruby/library/bigdecimal/nan_spec.rb +++ b/spec/ruby/library/bigdecimal/nan_spec.rb @@ -4,20 +4,20 @@ require 'bigdecimal' describe "BigDecimal#nan?" do it "returns true if self is not a number" do - BigDecimal("NaN").nan?.should == true + BigDecimal("NaN").should.nan? end it "returns false if self is not a NaN" do - BigDecimal("Infinity").nan?.should == false - BigDecimal("-Infinity").nan?.should == false - BigDecimal("0").nan?.should == false - BigDecimal("+0").nan?.should == false - BigDecimal("-0").nan?.should == false - BigDecimal("2E40001").nan?.should == false - BigDecimal("3E-20001").nan?.should == false - BigDecimal("0E-200000000").nan?.should == false - BigDecimal("0E200000000000").nan?.should == false - BigDecimal("0.000000000000000000000000").nan?.should == false + BigDecimal("Infinity").should_not.nan? + BigDecimal("-Infinity").should_not.nan? + BigDecimal("0").should_not.nan? + BigDecimal("+0").should_not.nan? + BigDecimal("-0").should_not.nan? + BigDecimal("2E40001").should_not.nan? + BigDecimal("3E-20001").should_not.nan? + BigDecimal("0E-200000000").should_not.nan? + BigDecimal("0E200000000000").should_not.nan? + BigDecimal("0.000000000000000000000000").should_not.nan? end end diff --git a/spec/ruby/library/bigdecimal/nonzero_spec.rb b/spec/ruby/library/bigdecimal/nonzero_spec.rb index f43c4393cd..31421ebdf4 100644 --- a/spec/ruby/library/bigdecimal/nonzero_spec.rb +++ b/spec/ruby/library/bigdecimal/nonzero_spec.rb @@ -10,11 +10,11 @@ describe "BigDecimal#nonzero?" do infinity = BigDecimal("Infinity") infinity_minus = BigDecimal("-Infinity") nan = BigDecimal("NaN") - infinity.nonzero?.should equal(infinity) - infinity_minus.nonzero?.should equal(infinity_minus) - nan.nonzero?.should equal(nan) - e3_minus.nonzero?.should equal(e3_minus) - e2_plus.nonzero?.should equal(e2_plus) + infinity.nonzero?.should.equal?(infinity) + infinity_minus.nonzero?.should.equal?(infinity_minus) + nan.nonzero?.should.equal?(nan) + e3_minus.nonzero?.should.equal?(e3_minus) + e2_plus.nonzero?.should.equal?(e2_plus) end it "returns nil otherwise" do diff --git a/spec/ruby/library/bigdecimal/plus_spec.rb b/spec/ruby/library/bigdecimal/plus_spec.rb index 9247ff6146..d1934841c8 100644 --- a/spec/ruby/library/bigdecimal/plus_spec.rb +++ b/spec/ruby/library/bigdecimal/plus_spec.rb @@ -30,8 +30,8 @@ describe "BigDecimal#+" do end it "returns NaN if NaN is involved" do - (@one + @nan).nan?.should == true - (@nan + @one).nan?.should == true + (@one + @nan).should.nan? + (@nan + @one).should.nan? end it "returns Infinity or -Infinity if these are involved" do @@ -41,7 +41,14 @@ describe "BigDecimal#+" do end it "returns NaN if Infinity + (- Infinity)" do - (@infinity + @infinity_minus).nan?.should == true + (@infinity + @infinity_minus).should.nan? end + describe "with Object" do + it "tries to coerce the other operand to self" do + object = mock("Object") + object.should_receive(:coerce).with(@one).and_return([@one, BigDecimal("42")]) + (@one + object).should == BigDecimal("43") + end + end end diff --git a/spec/ruby/library/bigdecimal/precs_spec.rb b/spec/ruby/library/bigdecimal/precs_spec.rb deleted file mode 100644 index f9320f2b9e..0000000000 --- a/spec/ruby/library/bigdecimal/precs_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../spec_helper' -require 'bigdecimal' - -describe "BigDecimal#precs" do - - before :each do - @infinity = BigDecimal("Infinity") - @infinity_neg = BigDecimal("-Infinity") - @nan = BigDecimal("NaN") - @zero = BigDecimal("0") - @zero_neg = BigDecimal("-0") - - @arr = [BigDecimal("2E40001"), BigDecimal("3E-20001"),\ - @infinity, @infinity_neg, @nan, @zero, @zero_neg] - @precision = BigDecimal::BASE.to_s.length - 1 - end - - it "returns array of two values" do - @arr.each do |x| - x.precs.kind_of?(Array).should == true - x.precs.size.should == 2 - end - end - - it "returns Integers as array values" do - @arr.each do |x| - x.precs[0].kind_of?(Integer).should == true - x.precs[1].kind_of?(Integer).should == true - end - end - - it "returns the current value of significant digits as the first value" do - BigDecimal("3.14159").precs[0].should >= 6 - BigDecimal('1').precs[0].should == BigDecimal('1' + '0' * 100).precs[0] - [@infinity, @infinity_neg, @nan, @zero, @zero_neg].each do |value| - value.precs[0].should <= @precision - end - end - - it "returns the maximum number of significant digits as the second value" do - BigDecimal("3.14159").precs[1].should >= 6 - BigDecimal('1').precs[1].should >= 1 - BigDecimal('1' + '0' * 100).precs[1] >= 101 - [@infinity, @infinity_neg, @nan, @zero, @zero_neg].each do |value| - value.precs[1].should >= 1 - end - end -end diff --git a/spec/ruby/library/bigdecimal/quo_spec.rb b/spec/ruby/library/bigdecimal/quo_spec.rb index a5c5651778..65a4330303 100644 --- a/spec/ruby/library/bigdecimal/quo_spec.rb +++ b/spec/ruby/library/bigdecimal/quo_spec.rb @@ -6,7 +6,7 @@ describe "BigDecimal#quo" do it_behaves_like :bigdecimal_quo, :quo, [] it "returns NaN if NaN is involved" do - BigDecimal("1").quo(BigDecimal("NaN")).nan?.should == true - BigDecimal("NaN").quo(BigDecimal("1")).nan?.should == true + BigDecimal("1").quo(BigDecimal("NaN")).should.nan? + BigDecimal("NaN").quo(BigDecimal("1")).should.nan? end end diff --git a/spec/ruby/library/bigdecimal/remainder_spec.rb b/spec/ruby/library/bigdecimal/remainder_spec.rb index 28b25f8566..27a2986570 100644 --- a/spec/ruby/library/bigdecimal/remainder_spec.rb +++ b/spec/ruby/library/bigdecimal/remainder_spec.rb @@ -5,7 +5,8 @@ describe "BigDecimal#remainder" do before :each do @zero = BigDecimal("0") - @one = BigDecimal("0") + @one = BigDecimal("1") + @three = BigDecimal("3") @mixed = BigDecimal("1.23456789") @pos_int = BigDecimal("2E5555") @neg_int = BigDecimal("-2E5555") @@ -36,9 +37,11 @@ describe "BigDecimal#remainder" do @neg_int.remainder(@pos_frac).should == @neg_int - @pos_frac * (@neg_int / @pos_frac).truncate end - it "returns NaN used with zero" do - @mixed.remainder(@zero).nan?.should == true - @zero.remainder(@zero).nan?.should == true + version_is BigDecimal::VERSION, "3.3.0" do + it "raises ZeroDivisionError used with zero" do + -> { @mixed.remainder(@zero) }.should.raise(ZeroDivisionError) + -> { @zero.remainder(@zero) }.should.raise(ZeroDivisionError) + end end it "returns zero if used on zero" do @@ -46,39 +49,29 @@ describe "BigDecimal#remainder" do end it "returns NaN if NaN is involved" do - @nan.remainder(@nan).nan?.should == true - @nan.remainder(@one).nan?.should == true - @one.remainder(@nan).nan?.should == true - @infinity.remainder(@nan).nan?.should == true - @nan.remainder(@infinity).nan?.should == true - end - - it "returns NaN if Infinity is involved" do - @infinity.remainder(@infinity).nan?.should == true - @infinity.remainder(@one).nan?.should == true - @infinity.remainder(@mixed).nan?.should == true - @infinity.remainder(@one_minus).nan?.should == true - @infinity.remainder(@frac_1).nan?.should == true - @one.remainder(@infinity).nan?.should == true - - @infinity_minus.remainder(@infinity_minus).nan?.should == true - @infinity_minus.remainder(@one).nan?.should == true - @one.remainder(@infinity_minus).nan?.should == true - @frac_2.remainder(@infinity_minus).nan?.should == true - - @infinity.remainder(@infinity_minus).nan?.should == true - @infinity_minus.remainder(@infinity).nan?.should == true + @nan.remainder(@nan).should.nan? + @nan.remainder(@one).should.nan? + @one.remainder(@nan).should.nan? + @infinity.remainder(@nan).should.nan? + @nan.remainder(@infinity).should.nan? end it "coerces arguments to BigDecimal if possible" do - @one.remainder(2).should == @one + @three.remainder(2).should == @one end + describe "with Object" do + it "tries to coerce the other operand to self" do + object = mock("Object") + object.should_receive(:coerce).with(@three).and_return([@three, 2]) + @three.remainder(object).should == @one + end + end it "raises TypeError if the argument cannot be coerced to BigDecimal" do - lambda { + -> { @one.remainder('2') - }.should raise_error(TypeError) + }.should.raise(TypeError) end end diff --git a/spec/ruby/library/bigdecimal/round_spec.rb b/spec/ruby/library/bigdecimal/round_spec.rb index 07b96acb2b..622e129d93 100644 --- a/spec/ruby/library/bigdecimal/round_spec.rb +++ b/spec/ruby/library/bigdecimal/round_spec.rb @@ -62,141 +62,173 @@ describe "BigDecimal#round" do @n2_49.round(0).should == @neg_two end - describe "BigDecimal::ROUND_UP" do - it "rounds values away from zero" do - @p1_50.round(0, BigDecimal::ROUND_UP).should == @two - @p1_51.round(0, BigDecimal::ROUND_UP).should == @two - @p1_49.round(0, BigDecimal::ROUND_UP).should == @two - @n1_50.round(0, BigDecimal::ROUND_UP).should == @neg_two - @n1_51.round(0, BigDecimal::ROUND_UP).should == @neg_two - @n1_49.round(0, BigDecimal::ROUND_UP).should == @neg_two - - @p2_50.round(0, BigDecimal::ROUND_UP).should == @three - @p2_51.round(0, BigDecimal::ROUND_UP).should == @three - @p2_49.round(0, BigDecimal::ROUND_UP).should == @three - @n2_50.round(0, BigDecimal::ROUND_UP).should == @neg_three - @n2_51.round(0, BigDecimal::ROUND_UP).should == @neg_three - @n2_49.round(0, BigDecimal::ROUND_UP).should == @neg_three + ["BigDecimal::ROUND_UP", ":up"].each do |way| + describe way do + it "rounds values away from zero" do + mode = eval(way) + + @p1_50.round(0, mode).should == @two + @p1_51.round(0, mode).should == @two + @p1_49.round(0, mode).should == @two + @n1_50.round(0, mode).should == @neg_two + @n1_51.round(0, mode).should == @neg_two + @n1_49.round(0, mode).should == @neg_two + + @p2_50.round(0, mode).should == @three + @p2_51.round(0, mode).should == @three + @p2_49.round(0, mode).should == @three + @n2_50.round(0, mode).should == @neg_three + @n2_51.round(0, mode).should == @neg_three + @n2_49.round(0, mode).should == @neg_three + end end end - describe "BigDecimal::ROUND_DOWN" do - it "rounds values towards zero" do - @p1_50.round(0, BigDecimal::ROUND_DOWN).should == @one - @p1_51.round(0, BigDecimal::ROUND_DOWN).should == @one - @p1_49.round(0, BigDecimal::ROUND_DOWN).should == @one - @n1_50.round(0, BigDecimal::ROUND_DOWN).should == @neg_one - @n1_51.round(0, BigDecimal::ROUND_DOWN).should == @neg_one - @n1_49.round(0, BigDecimal::ROUND_DOWN).should == @neg_one - - @p2_50.round(0, BigDecimal::ROUND_DOWN).should == @two - @p2_51.round(0, BigDecimal::ROUND_DOWN).should == @two - @p2_49.round(0, BigDecimal::ROUND_DOWN).should == @two - @n2_50.round(0, BigDecimal::ROUND_DOWN).should == @neg_two - @n2_51.round(0, BigDecimal::ROUND_DOWN).should == @neg_two - @n2_49.round(0, BigDecimal::ROUND_DOWN).should == @neg_two + ["BigDecimal::ROUND_DOWN", ":down", ":truncate"].each do |way| + describe way do + it "rounds values towards zero" do + mode = eval(way) + + @p1_50.round(0, mode).should == @one + @p1_51.round(0, mode).should == @one + @p1_49.round(0, mode).should == @one + @n1_50.round(0, mode).should == @neg_one + @n1_51.round(0, mode).should == @neg_one + @n1_49.round(0, mode).should == @neg_one + + @p2_50.round(0, mode).should == @two + @p2_51.round(0, mode).should == @two + @p2_49.round(0, mode).should == @two + @n2_50.round(0, mode).should == @neg_two + @n2_51.round(0, mode).should == @neg_two + @n2_49.round(0, mode).should == @neg_two + end end end - describe "BigDecimal::ROUND_HALF_UP" do - it "rounds values >= 5 up, otherwise down" do - @p1_50.round(0, BigDecimal::ROUND_HALF_UP).should == @two - @p1_51.round(0, BigDecimal::ROUND_HALF_UP).should == @two - @p1_49.round(0, BigDecimal::ROUND_HALF_UP).should == @one - @n1_50.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_two - @n1_51.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_two - @n1_49.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_one - - @p2_50.round(0, BigDecimal::ROUND_HALF_UP).should == @three - @p2_51.round(0, BigDecimal::ROUND_HALF_UP).should == @three - @p2_49.round(0, BigDecimal::ROUND_HALF_UP).should == @two - @n2_50.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_three - @n2_51.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_three - @n2_49.round(0, BigDecimal::ROUND_HALF_UP).should == @neg_two + ["BigDecimal::ROUND_HALF_UP", ":half_up", ":default"].each do |way| + describe way do + it "rounds values >= 5 up, otherwise down" do + mode = eval(way) + + @p1_50.round(0, mode).should == @two + @p1_51.round(0, mode).should == @two + @p1_49.round(0, mode).should == @one + @n1_50.round(0, mode).should == @neg_two + @n1_51.round(0, mode).should == @neg_two + @n1_49.round(0, mode).should == @neg_one + + @p2_50.round(0, mode).should == @three + @p2_51.round(0, mode).should == @three + @p2_49.round(0, mode).should == @two + @n2_50.round(0, mode).should == @neg_three + @n2_51.round(0, mode).should == @neg_three + @n2_49.round(0, mode).should == @neg_two + end end end - describe "BigDecimal::ROUND_HALF_DOWN" do - it "rounds values > 5 up, otherwise down" do - @p1_50.round(0, BigDecimal::ROUND_HALF_DOWN).should == @one - @p1_51.round(0, BigDecimal::ROUND_HALF_DOWN).should == @two - @p1_49.round(0, BigDecimal::ROUND_HALF_DOWN).should == @one - @n1_50.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_one - @n1_51.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_two - @n1_49.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_one - - @p2_50.round(0, BigDecimal::ROUND_HALF_DOWN).should == @two - @p2_51.round(0, BigDecimal::ROUND_HALF_DOWN).should == @three - @p2_49.round(0, BigDecimal::ROUND_HALF_DOWN).should == @two - @n2_50.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_two - @n2_51.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_three - @n2_49.round(0, BigDecimal::ROUND_HALF_DOWN).should == @neg_two + ["BigDecimal::ROUND_HALF_DOWN", ":half_down"].each do |way| + describe way do + it "rounds values > 5 up, otherwise down" do + mode = eval(way) + + @p1_50.round(0, mode).should == @one + @p1_51.round(0, mode).should == @two + @p1_49.round(0, mode).should == @one + @n1_50.round(0, mode).should == @neg_one + @n1_51.round(0, mode).should == @neg_two + @n1_49.round(0, mode).should == @neg_one + + @p2_50.round(0, mode).should == @two + @p2_51.round(0, mode).should == @three + @p2_49.round(0, mode).should == @two + @n2_50.round(0, mode).should == @neg_two + @n2_51.round(0, mode).should == @neg_three + @n2_49.round(0, mode).should == @neg_two + end end end - describe "BigDecimal::ROUND_CEILING" do - it "rounds values towards +infinity" do - @p1_50.round(0, BigDecimal::ROUND_CEILING).should == @two - @p1_51.round(0, BigDecimal::ROUND_CEILING).should == @two - @p1_49.round(0, BigDecimal::ROUND_CEILING).should == @two - @n1_50.round(0, BigDecimal::ROUND_CEILING).should == @neg_one - @n1_51.round(0, BigDecimal::ROUND_CEILING).should == @neg_one - @n1_49.round(0, BigDecimal::ROUND_CEILING).should == @neg_one - - @p2_50.round(0, BigDecimal::ROUND_CEILING).should == @three - @p2_51.round(0, BigDecimal::ROUND_CEILING).should == @three - @p2_49.round(0, BigDecimal::ROUND_CEILING).should == @three - @n2_50.round(0, BigDecimal::ROUND_CEILING).should == @neg_two - @n2_51.round(0, BigDecimal::ROUND_CEILING).should == @neg_two - @n2_49.round(0, BigDecimal::ROUND_CEILING).should == @neg_two + ["BigDecimal::ROUND_CEILING", ":ceiling", ":ceil"].each do |way| + describe way do + it "rounds values towards +infinity" do + mode = eval(way) + + @p1_50.round(0, mode).should == @two + @p1_51.round(0, mode).should == @two + @p1_49.round(0, mode).should == @two + @n1_50.round(0, mode).should == @neg_one + @n1_51.round(0, mode).should == @neg_one + @n1_49.round(0, mode).should == @neg_one + + @p2_50.round(0, mode).should == @three + @p2_51.round(0, mode).should == @three + @p2_49.round(0, mode).should == @three + @n2_50.round(0, mode).should == @neg_two + @n2_51.round(0, mode).should == @neg_two + @n2_49.round(0, mode).should == @neg_two + end end end - describe "BigDecimal::ROUND_FLOOR" do - it "rounds values towards -infinity" do - @p1_50.round(0, BigDecimal::ROUND_FLOOR).should == @one - @p1_51.round(0, BigDecimal::ROUND_FLOOR).should == @one - @p1_49.round(0, BigDecimal::ROUND_FLOOR).should == @one - @n1_50.round(0, BigDecimal::ROUND_FLOOR).should == @neg_two - @n1_51.round(0, BigDecimal::ROUND_FLOOR).should == @neg_two - @n1_49.round(0, BigDecimal::ROUND_FLOOR).should == @neg_two - - @p2_50.round(0, BigDecimal::ROUND_FLOOR).should == @two - @p2_51.round(0, BigDecimal::ROUND_FLOOR).should == @two - @p2_49.round(0, BigDecimal::ROUND_FLOOR).should == @two - @n2_50.round(0, BigDecimal::ROUND_FLOOR).should == @neg_three - @n2_51.round(0, BigDecimal::ROUND_FLOOR).should == @neg_three - @n2_49.round(0, BigDecimal::ROUND_FLOOR).should == @neg_three + ["BigDecimal::ROUND_FLOOR", ":floor"].each do |way| + describe way do + it "rounds values towards -infinity" do + mode = eval(way) + + @p1_50.round(0, mode).should == @one + @p1_51.round(0, mode).should == @one + @p1_49.round(0, mode).should == @one + @n1_50.round(0, mode).should == @neg_two + @n1_51.round(0, mode).should == @neg_two + @n1_49.round(0, mode).should == @neg_two + + @p2_50.round(0, mode).should == @two + @p2_51.round(0, mode).should == @two + @p2_49.round(0, mode).should == @two + @n2_50.round(0, mode).should == @neg_three + @n2_51.round(0, mode).should == @neg_three + @n2_49.round(0, mode).should == @neg_three + end end end - describe "BigDecimal::ROUND_HALF_EVEN" do - it "rounds values > 5 up, < 5 down and == 5 towards even neighbor" do - @p1_50.round(0, BigDecimal::ROUND_HALF_EVEN).should == @two - @p1_51.round(0, BigDecimal::ROUND_HALF_EVEN).should == @two - @p1_49.round(0, BigDecimal::ROUND_HALF_EVEN).should == @one - @n1_50.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_two - @n1_51.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_two - @n1_49.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_one - - @p2_50.round(0, BigDecimal::ROUND_HALF_EVEN).should == @two - @p2_51.round(0, BigDecimal::ROUND_HALF_EVEN).should == @three - @p2_49.round(0, BigDecimal::ROUND_HALF_EVEN).should == @two - @n2_50.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_two - @n2_51.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_three - @n2_49.round(0, BigDecimal::ROUND_HALF_EVEN).should == @neg_two + ["BigDecimal::ROUND_HALF_EVEN", ":half_even", ":banker"].each do |way| + describe way do + it "rounds values > 5 up, < 5 down and == 5 towards even neighbor" do + mode = eval(way) + + @p1_50.round(0, mode).should == @two + @p1_51.round(0, mode).should == @two + @p1_49.round(0, mode).should == @one + @n1_50.round(0, mode).should == @neg_two + @n1_51.round(0, mode).should == @neg_two + @n1_49.round(0, mode).should == @neg_one + + @p2_50.round(0, mode).should == @two + @p2_51.round(0, mode).should == @three + @p2_49.round(0, mode).should == @two + @n2_50.round(0, mode).should == @neg_two + @n2_51.round(0, mode).should == @neg_three + @n2_49.round(0, mode).should == @neg_two + end end end it 'raise exception, if self is special value' do - lambda { BigDecimal('NaN').round }.should raise_error(FloatDomainError) - lambda { BigDecimal('Infinity').round }.should raise_error(FloatDomainError) - lambda { BigDecimal('-Infinity').round }.should raise_error(FloatDomainError) + -> { BigDecimal('NaN').round }.should.raise(FloatDomainError) + -> { BigDecimal('Infinity').round }.should.raise(FloatDomainError) + -> { BigDecimal('-Infinity').round }.should.raise(FloatDomainError) end it 'do not raise exception, if self is special value and precision is given' do - lambda { BigDecimal('NaN').round(2) }.should_not raise_error(FloatDomainError) - lambda { BigDecimal('Infinity').round(2) }.should_not raise_error(FloatDomainError) - lambda { BigDecimal('-Infinity').round(2) }.should_not raise_error(FloatDomainError) + -> { BigDecimal('NaN').round(2) }.should_not.raise(FloatDomainError) + -> { BigDecimal('Infinity').round(2) }.should_not.raise(FloatDomainError) + -> { BigDecimal('-Infinity').round(2) }.should_not.raise(FloatDomainError) + end + + it 'raise for a non-existent round mode' do + -> { @p1_50.round(0, :nonsense) }.should.raise(ArgumentError, "invalid rounding mode (nonsense)") end end diff --git a/spec/ruby/library/bigdecimal/shared/clone.rb b/spec/ruby/library/bigdecimal/shared/clone.rb new file mode 100644 index 0000000000..03de6d0fc3 --- /dev/null +++ b/spec/ruby/library/bigdecimal/shared/clone.rb @@ -0,0 +1,13 @@ +require 'bigdecimal' + +describe :bigdecimal_clone, shared: true do + before :each do + @obj = BigDecimal("1.2345") + end + + it "returns self" do + copy = @obj.public_send(@method) + + copy.should.equal?(@obj) + end +end diff --git a/spec/ruby/library/bigdecimal/shared/modulo.rb b/spec/ruby/library/bigdecimal/shared/modulo.rb index c9691cbf37..63470d0977 100644 --- a/spec/ruby/library/bigdecimal/shared/modulo.rb +++ b/spec/ruby/library/bigdecimal/shared/modulo.rb @@ -70,38 +70,53 @@ describe :bigdecimal_modulo, shared: true do res.kind_of?(BigDecimal).should == true end + describe "with Object" do + it "tries to coerce the other operand to self" do + bd6543 = BigDecimal("6543.21") + object = mock("Object") + object.should_receive(:coerce).with(bd6543).and_return([bd6543, 137]) + bd6543.send(@method, object, *@object).should == BigDecimal("104.21") + end + end + it "returns NaN if NaN is involved" do - @nan.send(@method, @nan).nan?.should == true - @nan.send(@method, @one).nan?.should == true - @one.send(@method, @nan).nan?.should == true - @infinity.send(@method, @nan).nan?.should == true - @nan.send(@method, @infinity).nan?.should == true + @nan.send(@method, @nan).should.nan? + @nan.send(@method, @one).should.nan? + @one.send(@method, @nan).should.nan? + @infinity.send(@method, @nan).should.nan? + @nan.send(@method, @infinity).should.nan? end it "returns NaN if the dividend is Infinity" do - @infinity.send(@method, @infinity).nan?.should == true - @infinity.send(@method, @one).nan?.should == true - @infinity.send(@method, @mixed).nan?.should == true - @infinity.send(@method, @one_minus).nan?.should == true - @infinity.send(@method, @frac_1).nan?.should == true + @infinity.send(@method, @infinity).should.nan? + @infinity.send(@method, @one).should.nan? + @infinity.send(@method, @mixed).should.nan? + @infinity.send(@method, @one_minus).should.nan? + @infinity.send(@method, @frac_1).should.nan? - @infinity_minus.send(@method, @infinity_minus).nan?.should == true - @infinity_minus.send(@method, @one).nan?.should == true + @infinity_minus.send(@method, @infinity_minus).should.nan? + @infinity_minus.send(@method, @one).should.nan? - @infinity.send(@method, @infinity_minus).nan?.should == true - @infinity_minus.send(@method, @infinity).nan?.should == true + @infinity.send(@method, @infinity_minus).should.nan? + @infinity_minus.send(@method, @infinity).should.nan? end - it "returns the dividend if the divisor is Infinity" do - @one.send(@method, @infinity).should == @one - @one.send(@method, @infinity_minus).should == @one - @frac_2.send(@method, @infinity_minus).should == @frac_2 + version_is BigDecimal::VERSION, "3.3.0" do + it "returns the dividend if the divisor is Infinity and signs are same" do + @one.send(@method, @infinity).should == @one + (-@frac_2).send(@method, @infinity_minus).should == -@frac_2 + end + + it "returns the divisor if the divisor is Infinity and signs are different" do + (-@one).send(@method, @infinity).should == @infinity + @frac_2.send(@method, @infinity_minus).should == @infinity_minus + end end it "raises TypeError if the argument cannot be coerced to BigDecimal" do - lambda { + -> { @one.send(@method, '2') - }.should raise_error(TypeError) + }.should.raise(TypeError) end end @@ -109,8 +124,8 @@ describe :bigdecimal_modulo_zerodivisionerror, shared: true do it "raises ZeroDivisionError if other is zero" do bd5667 = BigDecimal("5667.19") - lambda { bd5667.send(@method, 0) }.should raise_error(ZeroDivisionError) - lambda { bd5667.send(@method, BigDecimal("0")) }.should raise_error(ZeroDivisionError) - lambda { @zero.send(@method, @zero) }.should raise_error(ZeroDivisionError) + -> { bd5667.send(@method, 0) }.should.raise(ZeroDivisionError) + -> { bd5667.send(@method, BigDecimal("0")) }.should.raise(ZeroDivisionError) + -> { @zero.send(@method, @zero) }.should.raise(ZeroDivisionError) end end diff --git a/spec/ruby/library/bigdecimal/shared/mult.rb b/spec/ruby/library/bigdecimal/shared/mult.rb index b94c9385de..c613df04c4 100644 --- a/spec/ruby/library/bigdecimal/shared/mult.rb +++ b/spec/ruby/library/bigdecimal/shared/mult.rb @@ -51,8 +51,8 @@ describe :bigdecimal_mult, shared: true do values = @regular_vals + @zeroes values.each do |val| - @nan.send(@method, val, *@object).nan?.should == true - val.send(@method, @nan, *@object).nan?.should == true + @nan.send(@method, val, *@object).should.nan? + val.send(@method, @nan, *@object).should.nan? end end @@ -62,9 +62,9 @@ describe :bigdecimal_mult, shared: true do values.each do |val| @zeroes.each do |zero| zero.send(@method, val, *@object).should == 0 - zero.send(@method, val, *@object).zero?.should == true + zero.send(@method, val, *@object).should.zero? val.send(@method, zero, *@object).should == 0 - val.send(@method, zero, *@object).zero?.should == true + val.send(@method, zero, *@object).should.zero? end end end @@ -75,8 +75,8 @@ describe :bigdecimal_mult, shared: true do values.each do |val| infs.each do |inf| - inf.send(@method, val, *@object).finite?.should == false - val.send(@method, inf, *@object).finite?.should == false + inf.send(@method, val, *@object).should_not.finite? + val.send(@method, inf, *@object).should_not.finite? end end @@ -89,9 +89,9 @@ describe :bigdecimal_mult, shared: true do end it "returns NaN if the result is undefined" do - @zero.send(@method, @infinity, *@object).nan?.should == true - @zero.send(@method, @infinity_minus, *@object).nan?.should == true - @infinity.send(@method, @zero, *@object).nan?.should == true - @infinity_minus.send(@method, @zero, *@object).nan?.should == true + @zero.send(@method, @infinity, *@object).should.nan? + @zero.send(@method, @infinity_minus, *@object).should.nan? + @infinity.send(@method, @zero, *@object).should.nan? + @infinity_minus.send(@method, @zero, *@object).should.nan? end end diff --git a/spec/ruby/library/bigdecimal/shared/power.rb b/spec/ruby/library/bigdecimal/shared/power.rb index a4848fb2e2..6dafb638e2 100644 --- a/spec/ruby/library/bigdecimal/shared/power.rb +++ b/spec/ruby/library/bigdecimal/shared/power.rb @@ -10,8 +10,8 @@ describe :bigdecimal_power, shared: true do e = BigDecimal("1.00000000000000000000123456789") one = BigDecimal("1") ten = BigDecimal("10") - # The tolerance is dependent upon the size of BASE_FIG - tolerance = BigDecimal("1E-70") + # Accuracy is at least ndigits(== 30) + DOUBLE_FIG(== 16) + tolerance = BigDecimal("1E-46") ten_powers = BigDecimal("1E10000") pi = BigDecimal("3.14159265358979") e3_minus.send(@method, 2).should == e3_minus_power_2 @@ -53,8 +53,8 @@ describe :bigdecimal_power, shared: true do end it "returns NaN if self is NaN" do - BigDecimal("NaN").send(@method, -5).nan?.should == true - BigDecimal("NaN").send(@method, 5).nan?.should == true + BigDecimal("NaN").send(@method, -5).should.nan? + BigDecimal("NaN").send(@method, 5).should.nan? end it "returns 0.0 if self is infinite and argument is negative" do diff --git a/spec/ruby/library/bigdecimal/shared/quo.rb b/spec/ruby/library/bigdecimal/shared/quo.rb index cb51c10d71..18ff2fe9a5 100644 --- a/spec/ruby/library/bigdecimal/shared/quo.rb +++ b/spec/ruby/library/bigdecimal/shared/quo.rb @@ -29,6 +29,15 @@ describe :bigdecimal_quo, shared: true do @one.send(@method, BigDecimal('2E-5555'), *@object).should == BigDecimal('0.5E5555') end + describe "with Object" do + it "tries to coerce the other operand to self" do + skip if @method == :div + object = mock("Object") + object.should_receive(:coerce).with(@one).and_return([@one, @two]) + @one.send(@method, object, *@object).should == BigDecimal("0.5") + end + end + it "returns 0 if divided by Infinity" do @zero.send(@method, @infinity, *@object).should == 0 @frac_2.send(@method, @infinity, *@object).should == 0 @@ -41,8 +50,8 @@ describe :bigdecimal_quo, shared: true do end it "returns NaN if Infinity / ((+|-) Infinity)" do - @infinity.send(@method, @infinity_minus, *@object).nan?.should == true - @infinity_minus.send(@method, @infinity, *@object).nan?.should == true + @infinity.send(@method, @infinity_minus, *@object).should.nan? + @infinity_minus.send(@method, @infinity, *@object).should.nan? end it "returns (+|-) Infinity if divided by zero" do @@ -52,8 +61,8 @@ describe :bigdecimal_quo, shared: true do end it "returns NaN if zero is divided by zero" do - @zero.send(@method, @zero, *@object).nan?.should == true - @zero_minus.send(@method, @zero_plus, *@object).nan?.should == true - @zero_plus.send(@method, @zero_minus, *@object).nan?.should == true + @zero.send(@method, @zero, *@object).should.nan? + @zero_minus.send(@method, @zero_plus, *@object).should.nan? + @zero_plus.send(@method, @zero_minus, *@object).should.nan? end end diff --git a/spec/ruby/library/bigdecimal/shared/to_int.rb b/spec/ruby/library/bigdecimal/shared/to_int.rb index 729a25f511..3c9f3b4f97 100644 --- a/spec/ruby/library/bigdecimal/shared/to_int.rb +++ b/spec/ruby/library/bigdecimal/shared/to_int.rb @@ -1,12 +1,12 @@ require 'bigdecimal' -describe :bigdecimal_to_int , shared: true do +describe :bigdecimal_to_int, shared: true do it "raises FloatDomainError if BigDecimal is infinity or NaN" do - lambda { BigDecimal("Infinity").send(@method) }.should raise_error(FloatDomainError) - lambda { BigDecimal("NaN").send(@method) }.should raise_error(FloatDomainError) + -> { BigDecimal("Infinity").send(@method) }.should.raise(FloatDomainError) + -> { BigDecimal("NaN").send(@method) }.should.raise(FloatDomainError) end - it "returns Integer or Bignum otherwise" do + it "returns Integer otherwise" do BigDecimal("3E-20001").send(@method).should == 0 BigDecimal("2E4000").send(@method).should == 2 * 10 ** 4000 BigDecimal("2").send(@method).should == 2 diff --git a/spec/ruby/library/bigdecimal/split_spec.rb b/spec/ruby/library/bigdecimal/split_spec.rb index f9b4bab5f7..53b1f649d9 100644 --- a/spec/ruby/library/bigdecimal/split_spec.rb +++ b/spec/ruby/library/bigdecimal/split_spec.rb @@ -58,16 +58,16 @@ describe "BigDecimal#split" do end it "third value: the base (currently always ten)" do - @arr[2].should == 10 - @arr_neg[2].should == 10 - @arr_big[2].should == 10 - @arr_big_neg[2].should == 10 - @huge[2].should == 10 - @infinity.split[2].should == 10 - @nan.split[2].should == 10 - @infinity_neg.split[2].should == 10 - @zero.split[2].should == 10 - @zero_neg.split[2].should == 10 + @arr[2].should == 10 + @arr_neg[2].should == 10 + @arr_big[2].should == 10 + @arr_big_neg[2].should == 10 + @huge[2].should == 10 + @infinity.split[2].should == 10 + @nan.split[2].should == 10 + @infinity_neg.split[2].should == 10 + @zero.split[2].should == 10 + @zero_neg.split[2].should == 10 end it "fourth value: the exponent" do diff --git a/spec/ruby/library/bigdecimal/sqrt_spec.rb b/spec/ruby/library/bigdecimal/sqrt_spec.rb index 06a8348203..1f3ef9a8c3 100644 --- a/spec/ruby/library/bigdecimal/sqrt_spec.rb +++ b/spec/ruby/library/bigdecimal/sqrt_spec.rb @@ -36,44 +36,46 @@ describe "BigDecimal#sqrt" do BigDecimal('121').sqrt(5).should be_close(11, 0.00001) end - it "returns square root of 0.9E-99999 with desired precision" do - @frac_2.sqrt(1).to_s.should =~ /\A0\.3E-49999\z/i + platform_is_not c_long_size: 32 do # fails on i686 + it "returns square root of 0.9E-99999 with desired precision" do + @frac_2.sqrt(1).to_s.should =~ /\A0\.3E-49999\z/i + end end it "raises ArgumentError when no argument is given" do - lambda { + -> { @one.sqrt - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "raises ArgumentError if a negative number is given" do - lambda { + -> { @one.sqrt(-1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "raises ArgumentError if 2 arguments are given" do - lambda { + -> { @one.sqrt(1, 1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "raises TypeError if nil is given" do - lambda { + -> { @one.sqrt(nil) - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises TypeError if a string is given" do - lambda { + -> { @one.sqrt("stuff") - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises TypeError if a plain Object is given" do - lambda { + -> { @one.sqrt(Object.new) - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "returns 1 if precision is 0 or 1" do @@ -82,25 +84,25 @@ describe "BigDecimal#sqrt" do end it "raises FloatDomainError on negative values" do - lambda { + -> { BigDecimal('-1').sqrt(10) - }.should raise_error(FloatDomainError) + }.should.raise(FloatDomainError) end - it "returns positive infitinity for infinity" do + it "returns positive infinity for infinity" do @infinity.sqrt(1).should == @infinity end it "raises FloatDomainError for negative infinity" do - lambda { + -> { @infinity_minus.sqrt(1) - }.should raise_error(FloatDomainError) + }.should.raise(FloatDomainError) end it "raises FloatDomainError for NaN" do - lambda { + -> { @nan.sqrt(1) - }.should raise_error(FloatDomainError) + }.should.raise(FloatDomainError) end it "returns 0 for 0, +0.0 and -0.0" do diff --git a/spec/ruby/library/bigdecimal/sub_spec.rb b/spec/ruby/library/bigdecimal/sub_spec.rb index 7f0305a1c6..3b62a0c794 100644 --- a/spec/ruby/library/bigdecimal/sub_spec.rb +++ b/spec/ruby/library/bigdecimal/sub_spec.rb @@ -7,12 +7,15 @@ describe "BigDecimal#sub" do @one = BigDecimal("1") @zero = BigDecimal("0") @two = BigDecimal("2") + @three = BigDecimal("3") @nan = BigDecimal("NaN") @infinity = BigDecimal("Infinity") @infinity_minus = BigDecimal("-Infinity") @one_minus = BigDecimal("-1") @frac_1 = BigDecimal("1E-99999") @frac_2 = BigDecimal("0.9E-99999") + @frac_3 = BigDecimal("12345E10") + @frac_4 = BigDecimal("98765E10") end it "returns a - b with given precision" do @@ -32,14 +35,20 @@ describe "BigDecimal#sub" do @frac_1.sub(@frac_1, 1000000).should == @zero end + describe "with Rational" do + it "produces a BigDecimal" do + (@three - Rational(500, 2)).should == BigDecimal('-0.247e3') + end + end + it "returns NaN if NaN is involved" do - @one.sub(@nan, 1).nan?.should == true - @nan.sub(@one, 1).nan?.should == true + @one.sub(@nan, 1).should.nan? + @nan.sub(@one, 1).should.nan? end it "returns NaN if both values are infinite with the same signs" do - @infinity.sub(@infinity, 1).nan?.should == true - @infinity_minus.sub(@infinity_minus, 1).nan?.should == true + @infinity.sub(@infinity, 1).should.nan? + @infinity_minus.sub(@infinity_minus, 1).should.nan? end it "returns Infinity or -Infinity if these are involved" do diff --git a/spec/ruby/library/bigdecimal/to_d_spec.rb b/spec/ruby/library/bigdecimal/to_d_spec.rb new file mode 100644 index 0000000000..50aea99bf7 --- /dev/null +++ b/spec/ruby/library/bigdecimal/to_d_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../spec_helper' +require 'bigdecimal' +require 'bigdecimal/util' + +describe "Float#to_d" do + it "returns appropriate BigDecimal zero for signed zero" do + -0.0.to_d.sign.should == -1 + 0.0.to_d.sign.should == 1 + end +end diff --git a/spec/ruby/library/bigdecimal/to_f_spec.rb b/spec/ruby/library/bigdecimal/to_f_spec.rb index 1cc25d5c40..f5220d995a 100644 --- a/spec/ruby/library/bigdecimal/to_f_spec.rb +++ b/spec/ruby/library/bigdecimal/to_f_spec.rb @@ -20,9 +20,9 @@ describe "BigDecimal#to_f" do end it "returns number of type float" do - BigDecimal("3.14159").to_f.should be_kind_of(Float) - @vals.each { |val| val.to_f.should be_kind_of(Float) } - @spec_vals.each { |val| val.to_f.should be_kind_of(Float) } + BigDecimal("3.14159").to_f.should.is_a?(Float) + @vals.each { |val| val.to_f.should.is_a?(Float) } + @spec_vals.each { |val| val.to_f.should.is_a?(Float) } end it "rounds correctly to Float precision" do @@ -41,7 +41,7 @@ describe "BigDecimal#to_f" do @zero.to_f.should == 0 @zero.to_f.to_s.should == "0.0" - @nan.to_f.nan?.should == true + @nan.to_f.should.nan? @infinity.to_f.infinite?.should == 1 @infinity_minus.to_f.infinite?.should == -1 diff --git a/spec/ruby/library/bigdecimal/to_i_spec.rb b/spec/ruby/library/bigdecimal/to_i_spec.rb index 09481fce15..e5e65c562e 100644 --- a/spec/ruby/library/bigdecimal/to_i_spec.rb +++ b/spec/ruby/library/bigdecimal/to_i_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/to_int' require 'bigdecimal' describe "BigDecimal#to_i" do - it_behaves_like :bigdecimal_to_int, :to_i + it_behaves_like :bigdecimal_to_int, :to_i end diff --git a/spec/ruby/library/bigdecimal/to_r_spec.rb b/spec/ruby/library/bigdecimal/to_r_spec.rb index 91d2b33993..a112c002ef 100644 --- a/spec/ruby/library/bigdecimal/to_r_spec.rb +++ b/spec/ruby/library/bigdecimal/to_r_spec.rb @@ -4,13 +4,25 @@ require 'bigdecimal' describe "BigDecimal#to_r" do it "returns a Rational" do - BigDecimal("3.14159").to_r.should be_kind_of(Rational) + BigDecimal("3.14159").to_r.should.is_a?(Rational) end it "returns a Rational with bignum values" do r = BigDecimal("3.141592653589793238462643").to_r - r.numerator.should eql(3141592653589793238462643) - r.denominator.should eql(1000000000000000000000000) + r.numerator.should.eql?(3141592653589793238462643) + r.denominator.should.eql?(1000000000000000000000000) + end + + it "returns a Rational from a BigDecimal with an exponent" do + r = BigDecimal("1E2").to_r + r.numerator.should.eql?(100) + r.denominator.should.eql?(1) + end + + it "returns a Rational from a negative BigDecimal with an exponent" do + r = BigDecimal("-1E2").to_r + r.numerator.should.eql?(-100) + r.denominator.should.eql?(1) end end diff --git a/spec/ruby/library/bigdecimal/to_s_spec.rb b/spec/ruby/library/bigdecimal/to_s_spec.rb index 75741c5050..5ec54765b5 100644 --- a/spec/ruby/library/bigdecimal/to_s_spec.rb +++ b/spec/ruby/library/bigdecimal/to_s_spec.rb @@ -8,6 +8,11 @@ describe "BigDecimal#to_s" do @bigneg_str = "-3.1415926535897932384626433832795028841971693993" @bigdec = BigDecimal(@bigdec_str) @bigneg = BigDecimal(@bigneg_str) + @internal = Encoding.default_internal + end + + after :each do + Encoding.default_internal = @internal end it "return type is of class String" do @@ -15,20 +20,18 @@ describe "BigDecimal#to_s" do @bigneg.to_s.kind_of?(String).should == true end - ruby_version_is ''...'2.4' do - it "the default format looks like 0.xxxxEnn" do - @bigdec.to_s.should =~ /^0\.[0-9]*E[0-9]*$/ - end + it "the default format looks like 0.xxxxenn" do + @bigdec.to_s.should =~ /^0\.[0-9]*e[0-9]*$/ end - ruby_version_is '2.4' do - it "the default format looks like 0.xxxxenn" do - @bigdec.to_s.should =~ /^0\.[0-9]*e[0-9]*$/ - end + it "does not add an exponent for zero values" do + BigDecimal("0").to_s.should == "0.0" + BigDecimal("+0").to_s.should == "0.0" + BigDecimal("-0").to_s.should == "-0.0" end it "takes an optional argument" do - lambda {@bigdec.to_s("F")}.should_not raise_error() + -> {@bigdec.to_s("F")}.should_not.raise() end it "starts with + if + is supplied and value is positive" do @@ -36,9 +39,9 @@ describe "BigDecimal#to_s" do @bigneg.to_s("+").should_not =~ /^\+.*/ end - it "inserts a space every n chars, if integer n is supplied" do + it "inserts a space every n chars to fraction part, if integer n is supplied" do re =\ - /\A0\.314 159 265 358 979 323 846 264 338 327 950 288 419 716 939 937E1\z/i + /\A0\.314 159 265 358 979 323 846 264 338 327 950 288 419 716 939 937E1\z/i @bigdec.to_s(3).should =~ re str1 = '-123.45678 90123 45678 9' @@ -49,6 +52,10 @@ describe "BigDecimal#to_s" do BigDecimal("1.2345").to_s('0F').should == "1.2345" end + it "inserts a space every n chars to integer part, if integer n is supplied" do + BigDecimal('1000010').to_s('5F').should == "10 00010.0" + end + it "can return a leading space for values > 0" do @bigdec.to_s(" F").should =~ /\ .*/ @bigneg.to_s(" F").should_not =~ /\ .*/ @@ -79,4 +86,13 @@ describe "BigDecimal#to_s" do end end + it "returns a String in US-ASCII encoding when Encoding.default_internal is nil" do + Encoding.default_internal = nil + BigDecimal('1.23').to_s.encoding.should.equal?(Encoding::US_ASCII) + end + + it "returns a String in US-ASCII encoding when Encoding.default_internal is not nil" do + Encoding.default_internal = Encoding::IBM437 + BigDecimal('1.23').to_s.encoding.should.equal?(Encoding::US_ASCII) + end end diff --git a/spec/ruby/library/bigdecimal/truncate_spec.rb b/spec/ruby/library/bigdecimal/truncate_spec.rb index 7edee771c9..cedc662aeb 100644 --- a/spec/ruby/library/bigdecimal/truncate_spec.rb +++ b/spec/ruby/library/bigdecimal/truncate_spec.rb @@ -4,11 +4,11 @@ require 'bigdecimal' describe "BigDecimal#truncate" do before :each do - @arr = ['3.14159', '8.7', "0.314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593014782083152134043E1"] - @big = BigDecimal("123456.789") - @nan = BigDecimal('NaN') - @infinity = BigDecimal('Infinity') - @infinity_negative = BigDecimal('-Infinity') + @arr = ['3.14159', '8.7', "0.314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593014782083152134043E1"] + @big = BigDecimal("123456.789") + @nan = BigDecimal('NaN') + @infinity = BigDecimal('Infinity') + @infinity_negative = BigDecimal('-Infinity') end it "returns value of type Integer." do @@ -58,9 +58,9 @@ describe "BigDecimal#truncate" do end it "returns NaN if self is NaN" do - @nan.truncate(-1).nan?.should == true - @nan.truncate(+1).nan?.should == true - @nan.truncate(0).nan?.should == true + @nan.truncate(-1).should.nan? + @nan.truncate(+1).should.nan? + @nan.truncate(0).should.nan? end it "returns Infinity if self is infinite" do @@ -74,8 +74,8 @@ describe "BigDecimal#truncate" do end it "returns the same value if self is special value" do - lambda { @nan.truncate }.should raise_error(FloatDomainError) - lambda { @infinity.truncate }.should raise_error(FloatDomainError) - lambda { @infinity_negative.truncate }.should raise_error(FloatDomainError) + -> { @nan.truncate }.should.raise(FloatDomainError) + -> { @infinity.truncate }.should.raise(FloatDomainError) + -> { @infinity_negative.truncate }.should.raise(FloatDomainError) end end diff --git a/spec/ruby/library/bigdecimal/uminus_spec.rb b/spec/ruby/library/bigdecimal/uminus_spec.rb index 5e2a786c4c..c780cdfac5 100644 --- a/spec/ruby/library/bigdecimal/uminus_spec.rb +++ b/spec/ruby/library/bigdecimal/uminus_spec.rb @@ -53,6 +53,6 @@ describe "BigDecimal#-@" do @zero_neg.send(:-@).should == @zero @zero_neg.send(:-@).sign.should == 1 - @nan.send(:-@).nan?.should == true + @nan.send(:-@).should.nan? end end diff --git a/spec/ruby/library/bigdecimal/util_spec.rb b/spec/ruby/library/bigdecimal/util_spec.rb new file mode 100644 index 0000000000..69663d4bd2 --- /dev/null +++ b/spec/ruby/library/bigdecimal/util_spec.rb @@ -0,0 +1,40 @@ +require_relative '../../spec_helper' +require 'bigdecimal' +require 'bigdecimal/util' + +describe "BigDecimal's util method definitions" do + describe "#to_d" do + it "should define #to_d on Integer" do + 42.to_d.should == BigDecimal(42) + end + + it "should define #to_d on Float" do + 0.5.to_d.should == BigDecimal(0.5, Float::DIG) + 1.234.to_d(2).should == BigDecimal(1.234, 2) + end + + it "should define #to_d on String" do + "0.5".to_d.should == BigDecimal(0.5, Float::DIG) + "45.67 degrees".to_d.should == BigDecimal(45.67, Float::DIG) + end + + it "should define #to_d on BigDecimal" do + bd = BigDecimal("3.14") + bd.to_d.should.equal?(bd) + end + + it "should define #to_d on Rational" do + Rational(22, 7).to_d(3).should == BigDecimal(3.14, 3) + end + + it "should define #to_d on nil" do + nil.to_d.should == BigDecimal(0) + end + end + + describe "#to_digits" do + it "should define #to_digits on BigDecimal" do + BigDecimal("3.14").to_digits.should == "3.14" + end + end +end diff --git a/spec/ruby/library/bigdecimal/ver_spec.rb b/spec/ruby/library/bigdecimal/ver_spec.rb deleted file mode 100644 index 15c7099306..0000000000 --- a/spec/ruby/library/bigdecimal/ver_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require 'bigdecimal' - -describe "BigDecimal.ver" do - - it "returns the Version number" do - lambda {BigDecimal.ver }.should_not raise_error() - BigDecimal.ver.should_not == nil - end - -end diff --git a/spec/ruby/library/bigdecimal/zero_spec.rb b/spec/ruby/library/bigdecimal/zero_spec.rb index c5d3acb8c3..2563210939 100644 --- a/spec/ruby/library/bigdecimal/zero_spec.rb +++ b/spec/ruby/library/bigdecimal/zero_spec.rb @@ -6,22 +6,22 @@ describe "BigDecimal#zero?" do it "returns true if self does equal zero" do really_small_zero = BigDecimal("0E-200000000") really_big_zero = BigDecimal("0E200000000000") - really_small_zero.zero?.should == true - really_big_zero.zero?.should == true - BigDecimal("0.000000000000000000000000").zero?.should == true - BigDecimal("0").zero?.should == true - BigDecimal("0E0").zero?.should == true - BigDecimal("+0").zero?.should == true - BigDecimal("-0").zero?.should == true + really_small_zero.should.zero? + really_big_zero.should.zero? + BigDecimal("0.000000000000000000000000").should.zero? + BigDecimal("0").should.zero? + BigDecimal("0E0").should.zero? + BigDecimal("+0").should.zero? + BigDecimal("-0").should.zero? end it "returns false otherwise" do - BigDecimal("0000000001").zero?.should == false - BigDecimal("2E40001").zero?.should == false - BigDecimal("3E-20001").zero?.should == false - BigDecimal("Infinity").zero?.should == false - BigDecimal("-Infinity").zero?.should == false - BigDecimal("NaN").zero?.should == false + BigDecimal("0000000001").should_not.zero? + BigDecimal("2E40001").should_not.zero? + BigDecimal("3E-20001").should_not.zero? + BigDecimal("Infinity").should_not.zero? + BigDecimal("-Infinity").should_not.zero? + BigDecimal("NaN").should_not.zero? end end diff --git a/spec/ruby/library/bigmath/log_spec.rb b/spec/ruby/library/bigmath/log_spec.rb deleted file mode 100644 index 2ffbf8b6b9..0000000000 --- a/spec/ruby/library/bigmath/log_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../spec_helper' -require 'bigdecimal' - -describe "BigDecimal#log" do - it "handles high-precision Rational arguments" do - result = BigDecimal('0.22314354220170971436137296411949880462556361100856391620766259404746040597133837784E0') - r = Rational(1_234_567_890, 987_654_321) - BigMath.log(r, 50).should == result - end -end diff --git a/spec/ruby/library/cgi/cookie/domain_spec.rb b/spec/ruby/library/cgi/cookie/domain_spec.rb index 962609ebaf..c118ef6383 100644 --- a/spec/ruby/library/cgi/cookie/domain_spec.rb +++ b/spec/ruby/library/cgi/cookie/domain_spec.rb @@ -1,23 +1,26 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#domain" do - it "returns self's domain" do - cookie = CGI::Cookie.new("test-cookie") - cookie.domain.should be_nil +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("name" => "test-cookie", "domain" => "example.com") - cookie.domain.should == "example.com" + describe "CGI::Cookie#domain" do + it "returns self's domain" do + cookie = CGI::Cookie.new("test-cookie") + cookie.domain.should == nil + + cookie = CGI::Cookie.new("name" => "test-cookie", "domain" => "example.com") + cookie.domain.should == "example.com" + end end -end -describe "CGI::Cookie#domain=" do - it "sets self's domain" do - cookie = CGI::Cookie.new("test-cookie") - cookie.domain = "test.com" - cookie.domain.should == "test.com" + describe "CGI::Cookie#domain=" do + it "sets self's domain" do + cookie = CGI::Cookie.new("test-cookie") + cookie.domain = "test.com" + cookie.domain.should == "test.com" - cookie.domain = "example.com" - cookie.domain.should == "example.com" + cookie.domain = "example.com" + cookie.domain.should == "example.com" + end end end diff --git a/spec/ruby/library/cgi/cookie/expires_spec.rb b/spec/ruby/library/cgi/cookie/expires_spec.rb index c8f26d01cd..b9cc7d5b65 100644 --- a/spec/ruby/library/cgi/cookie/expires_spec.rb +++ b/spec/ruby/library/cgi/cookie/expires_spec.rb @@ -1,23 +1,26 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#expires" do - it "returns self's expiration date" do - cookie = CGI::Cookie.new("test-cookie") - cookie.expires.should be_nil +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("name" => "test-cookie", "expires" => Time.at(1196524602)) - cookie.expires.should == Time.at(1196524602) + describe "CGI::Cookie#expires" do + it "returns self's expiration date" do + cookie = CGI::Cookie.new("test-cookie") + cookie.expires.should == nil + + cookie = CGI::Cookie.new("name" => "test-cookie", "expires" => Time.at(1196524602)) + cookie.expires.should == Time.at(1196524602) + end end -end -describe "CGI::Cookie#expires=" do - it "sets self's expiration date" do - cookie = CGI::Cookie.new("test-cookie") - cookie.expires = Time.at(1196524602) - cookie.expires.should == Time.at(1196524602) + describe "CGI::Cookie#expires=" do + it "sets self's expiration date" do + cookie = CGI::Cookie.new("test-cookie") + cookie.expires = Time.at(1196524602) + cookie.expires.should == Time.at(1196524602) - cookie.expires = Time.at(1196525000) - cookie.expires.should == Time.at(1196525000) + cookie.expires = Time.at(1196525000) + cookie.expires.should == Time.at(1196525000) + end end end diff --git a/spec/ruby/library/cgi/cookie/initialize_spec.rb b/spec/ruby/library/cgi/cookie/initialize_spec.rb index f41129a9cf..80bc2c2196 100644 --- a/spec/ruby/library/cgi/cookie/initialize_spec.rb +++ b/spec/ruby/library/cgi/cookie/initialize_spec.rb @@ -1,147 +1,150 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#initialize when passed String" do - before :each do - @cookie = CGI::Cookie.allocate - end - - it "sets the self's name to the passed String" do - @cookie.send(:initialize, "test-cookie") - @cookie.name.should == "test-cookie" - end +ruby_version_is ""..."4.0" do + require 'cgi' - it "sets the self's value to an empty Array" do - @cookie.send(:initialize, "test-cookie") - @cookie.value.should == [] - end - - it "sets self to a non-secure cookie" do - @cookie.send(:initialize, "test") - @cookie.secure.should be_false - end - - it "does set self's path to an empty String when ENV[\"SCRIPT_NAME\"] is not set" do - @cookie.send(:initialize, "test-cookie") - @cookie.path.should == "" - end - - it "does set self's path based on ENV[\"SCRIPT_NAME\"] when ENV[\"SCRIPT_NAME\"] is set" do - old_script_name = ENV["SCRIPT_NAME"] + describe "CGI::Cookie#initialize when passed String" do + before :each do + @cookie = CGI::Cookie.allocate + end - begin - ENV["SCRIPT_NAME"] = "some/path/script.rb" + it "sets the self's name to the passed String" do @cookie.send(:initialize, "test-cookie") - @cookie.path.should == "some/path/" + @cookie.name.should == "test-cookie" + end - ENV["SCRIPT_NAME"] = "script.rb" + it "sets the self's value to an empty Array" do @cookie.send(:initialize, "test-cookie") - @cookie.path.should == "" + @cookie.value.should == [] + end - ENV["SCRIPT_NAME"] = nil + it "sets self to a non-secure cookie" do + @cookie.send(:initialize, "test") + @cookie.secure.should == false + end + + it "does set self's path to an empty String when ENV[\"SCRIPT_NAME\"] is not set" do @cookie.send(:initialize, "test-cookie") @cookie.path.should == "" - ensure - ENV["SCRIPT_NAME"] = old_script_name end - end - it "does not set self's expiration date" do - @cookie.expires.should be_nil - end + it "does set self's path based on ENV[\"SCRIPT_NAME\"] when ENV[\"SCRIPT_NAME\"] is set" do + old_script_name = ENV["SCRIPT_NAME"] - it "does not set self's domain" do - @cookie.domain.should be_nil - end -end + begin + ENV["SCRIPT_NAME"] = "some/path/script.rb" + @cookie.send(:initialize, "test-cookie") + @cookie.path.should == "some/path/" -describe "CGI::Cookie#initialize when passed Hash" do - before :each do - @cookie = CGI::Cookie.allocate - end + ENV["SCRIPT_NAME"] = "script.rb" + @cookie.send(:initialize, "test-cookie") + @cookie.path.should == "" + + ENV["SCRIPT_NAME"] = nil + @cookie.send(:initialize, "test-cookie") + @cookie.path.should == "" + ensure + ENV["SCRIPT_NAME"] = old_script_name + end + end + + it "does not set self's expiration date" do + @cookie.expires.should == nil + end - it "sets self's contents based on the passed Hash" do - @cookie.send(:initialize, - 'name' => 'test-cookie', - 'value' => ["one", "two", "three"], - 'path' => 'some/path/', - 'domain' => 'example.com', - 'expires' => Time.at(1196524602), - 'secure' => true) - - @cookie.name.should == "test-cookie" - @cookie.value.should == ["one", "two", "three"] - @cookie.path.should == "some/path/" - @cookie.domain.should == "example.com" - @cookie.expires.should == Time.at(1196524602) - @cookie.secure.should be_true + it "does not set self's domain" do + @cookie.domain.should == nil + end end - it "does set self's path based on ENV[\"SCRIPT_NAME\"] when the Hash has no 'path' entry" do - old_script_name = ENV["SCRIPT_NAME"] + describe "CGI::Cookie#initialize when passed Hash" do + before :each do + @cookie = CGI::Cookie.allocate + end - begin - ENV["SCRIPT_NAME"] = "some/path/script.rb" - @cookie.send(:initialize, 'name' => 'test-cookie') + it "sets self's contents based on the passed Hash" do + @cookie.send(:initialize, + 'name' => 'test-cookie', + 'value' => ["one", "two", "three"], + 'path' => 'some/path/', + 'domain' => 'example.com', + 'expires' => Time.at(1196524602), + 'secure' => true) + + @cookie.name.should == "test-cookie" + @cookie.value.should == ["one", "two", "three"] @cookie.path.should == "some/path/" + @cookie.domain.should == "example.com" + @cookie.expires.should == Time.at(1196524602) + @cookie.secure.should == true + end - ENV["SCRIPT_NAME"] = "script.rb" - @cookie.send(:initialize, 'name' => 'test-cookie') - @cookie.path.should == "" + it "does set self's path based on ENV[\"SCRIPT_NAME\"] when the Hash has no 'path' entry" do + old_script_name = ENV["SCRIPT_NAME"] - ENV["SCRIPT_NAME"] = nil - @cookie.send(:initialize, 'name' => 'test-cookie') - @cookie.path.should == "" - ensure - ENV["SCRIPT_NAME"] = old_script_name + begin + ENV["SCRIPT_NAME"] = "some/path/script.rb" + @cookie.send(:initialize, 'name' => 'test-cookie') + @cookie.path.should == "some/path/" + + ENV["SCRIPT_NAME"] = "script.rb" + @cookie.send(:initialize, 'name' => 'test-cookie') + @cookie.path.should == "" + + ENV["SCRIPT_NAME"] = nil + @cookie.send(:initialize, 'name' => 'test-cookie') + @cookie.path.should == "" + ensure + ENV["SCRIPT_NAME"] = old_script_name + end end - end - it "tries to convert the Hash's 'value' to an Array using #Array" do - obj = mock("Converted To Array") - obj.should_receive(:to_ary).and_return(["1", "2", "3"]) - @cookie.send(:initialize, - 'name' => 'test-cookie', - 'value' => obj) - @cookie.value.should == [ "1", "2", "3" ] - - obj = mock("Converted To Array") - obj.should_receive(:to_a).and_return(["one", "two", "three"]) - @cookie.send(:initialize, - 'name' => 'test-cookie', - 'value' => obj) - @cookie.value.should == [ "one", "two", "three" ] - - obj = mock("Put into an Array") - @cookie.send(:initialize, - 'name' => 'test-cookie', - 'value' => obj) - @cookie.value.should == [ obj ] - end + it "tries to convert the Hash's 'value' to an Array using #Array" do + obj = mock("Converted To Array") + obj.should_receive(:to_ary).and_return(["1", "2", "3"]) + @cookie.send(:initialize, + 'name' => 'test-cookie', + 'value' => obj) + @cookie.value.should == [ "1", "2", "3" ] + + obj = mock("Converted To Array") + obj.should_receive(:to_a).and_return(["one", "two", "three"]) + @cookie.send(:initialize, + 'name' => 'test-cookie', + 'value' => obj) + @cookie.value.should == [ "one", "two", "three" ] + + obj = mock("Put into an Array") + @cookie.send(:initialize, + 'name' => 'test-cookie', + 'value' => obj) + @cookie.value.should == [ obj ] + end - it "raises a ArgumentError when the passed Hash has no 'name' entry" do - lambda { @cookie.send(:initialize, {}) }.should raise_error(ArgumentError) - lambda { @cookie.send(:initialize, "value" => "test") }.should raise_error(ArgumentError) + it "raises a ArgumentError when the passed Hash has no 'name' entry" do + -> { @cookie.send(:initialize, {}) }.should.raise(ArgumentError) + -> { @cookie.send(:initialize, "value" => "test") }.should.raise(ArgumentError) + end end -end -describe "CGI::Cookie#initialize when passed String, values ..." do - before :each do - @cookie = CGI::Cookie.allocate - end + describe "CGI::Cookie#initialize when passed String, values ..." do + before :each do + @cookie = CGI::Cookie.allocate + end - it "sets the self's name to the passed String" do - @cookie.send(:initialize, "test-cookie", "one", "two", "three") - @cookie.name.should == "test-cookie" - end + it "sets the self's name to the passed String" do + @cookie.send(:initialize, "test-cookie", "one", "two", "three") + @cookie.name.should == "test-cookie" + end - it "sets the self's value to an Array containing all passed values" do - @cookie.send(:initialize, "test-cookie", "one", "two", "three") - @cookie.value.should == ["one", "two", "three"] - end + it "sets the self's value to an Array containing all passed values" do + @cookie.send(:initialize, "test-cookie", "one", "two", "three") + @cookie.value.should == ["one", "two", "three"] + end - it "sets self to a non-secure cookie" do - @cookie.send(:initialize, "test", "one", "two", "three") - @cookie.secure.should be_false + it "sets self to a non-secure cookie" do + @cookie.send(:initialize, "test", "one", "two", "three") + @cookie.secure.should == false + end end end diff --git a/spec/ruby/library/cgi/cookie/name_spec.rb b/spec/ruby/library/cgi/cookie/name_spec.rb index 14226824c8..4908204e8a 100644 --- a/spec/ruby/library/cgi/cookie/name_spec.rb +++ b/spec/ruby/library/cgi/cookie/name_spec.rb @@ -1,23 +1,26 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#name" do - it "returns self's name" do - cookie = CGI::Cookie.new("test-cookie") - cookie.name.should == "test-cookie" +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("name" => "another cookie") - cookie.name.should == "another cookie" + describe "CGI::Cookie#name" do + it "returns self's name" do + cookie = CGI::Cookie.new("test-cookie") + cookie.name.should == "test-cookie" + + cookie = CGI::Cookie.new("name" => "another-cookie") + cookie.name.should == "another-cookie" + end end -end -describe "CGI::Cookie#name=" do - it "sets self's expiration date" do - cookie = CGI::Cookie.new("test-cookie") - cookie.name = "another name" - cookie.name.should == "another name" + describe "CGI::Cookie#name=" do + it "sets self's expiration date" do + cookie = CGI::Cookie.new("test-cookie") + cookie.name = "another-name" + cookie.name.should == "another-name" - cookie.name = "and one more" - cookie.name.should == "and one more" + cookie.name = "and-one-more" + cookie.name.should == "and-one-more" + end end end diff --git a/spec/ruby/library/cgi/cookie/parse_spec.rb b/spec/ruby/library/cgi/cookie/parse_spec.rb index c714aab300..bc505c37ba 100644 --- a/spec/ruby/library/cgi/cookie/parse_spec.rb +++ b/spec/ruby/library/cgi/cookie/parse_spec.rb @@ -1,39 +1,29 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie.parse" do - it "parses a raw cookie string into a hash of Cookies" do - expected = { "test-cookie" => ["one", "two", "three"] } - CGI::Cookie.parse("test-cookie=one&two&three").should == expected +ruby_version_is ""..."4.0" do + require 'cgi' - expected = { "second cookie" => ["three", "four"], "first cookie" => ["one", "two"] } - CGI::Cookie.parse("first cookie=one&two;second cookie=three&four").should == expected - end + describe "CGI::Cookie.parse" do + it "parses a raw cookie string into a hash of Cookies" do + expected = { "test-cookie" => ["one", "two", "three"] } + CGI::Cookie.parse("test-cookie=one&two&three").should == expected - ruby_version_is ""..."2.4" do - it "uses , for cookie separators" do - expected = { - "first cookie" => ["one", "two"], - "second cookie" => ["three", "four"], - "third_cookie" => ["five", "six"] - } - CGI::Cookie.parse("first cookie=one&two;second cookie=three&four,third_cookie=five&six").should == expected + expected = { "second-cookie" => ["three", "four"], "first-cookie" => ["one", "two"] } + CGI::Cookie.parse("first-cookie=one&two;second-cookie=three&four").should == expected end - end - ruby_version_is "2.4" do it "does not use , for cookie separators" do expected = { - "first cookie" => ["one", "two"], - "second cookie" => ["three", "four,third_cookie=five", "six"] + "first-cookie" => ["one", "two"], + "second-cookie" => ["three", "four,third_cookie=five", "six"] } - CGI::Cookie.parse("first cookie=one&two;second cookie=three&four,third_cookie=five&six").should == expected + CGI::Cookie.parse("first-cookie=one&two;second-cookie=three&four,third_cookie=five&six").should == expected end - end - it "unescapes the Cookie values" do - cookie = "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" - expected = { "test-cookie" => [ " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" ] } - CGI::Cookie.parse(cookie).should == expected + it "unescapes the Cookie values" do + cookie = "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" + expected = { "test-cookie" => [ " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" ] } + CGI::Cookie.parse(cookie).should == expected + end end end diff --git a/spec/ruby/library/cgi/cookie/path_spec.rb b/spec/ruby/library/cgi/cookie/path_spec.rb index 8a2f05aa50..13ee5d726b 100644 --- a/spec/ruby/library/cgi/cookie/path_spec.rb +++ b/spec/ruby/library/cgi/cookie/path_spec.rb @@ -1,23 +1,26 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#path" do - it "returns self's path" do - cookie = CGI::Cookie.new("test-cookie") - cookie.path.should == "" +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("name" => "test-cookie", "path" => "/some/path/") - cookie.path.should == "/some/path/" + describe "CGI::Cookie#path" do + it "returns self's path" do + cookie = CGI::Cookie.new("test-cookie") + cookie.path.should == "" + + cookie = CGI::Cookie.new("name" => "test-cookie", "path" => "/some/path/") + cookie.path.should == "/some/path/" + end end -end -describe "CGI::Cookie#path=" do - it "sets self's path" do - cookie = CGI::Cookie.new("test-cookie") - cookie.path = "/some/path/" - cookie.path.should == "/some/path/" + describe "CGI::Cookie#path=" do + it "sets self's path" do + cookie = CGI::Cookie.new("test-cookie") + cookie.path = "/some/path/" + cookie.path.should == "/some/path/" - cookie.path = "/another/path/" - cookie.path.should == "/another/path/" + cookie.path = "/another/path/" + cookie.path.should == "/another/path/" + end end end diff --git a/spec/ruby/library/cgi/cookie/secure_spec.rb b/spec/ruby/library/cgi/cookie/secure_spec.rb index 694bc2eeed..233881b173 100644 --- a/spec/ruby/library/cgi/cookie/secure_spec.rb +++ b/spec/ruby/library/cgi/cookie/secure_spec.rb @@ -1,70 +1,73 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#secure" do - before :each do - @cookie = CGI::Cookie.new("test-cookie") - end +ruby_version_is ""..."4.0" do + require 'cgi' - it "returns whether self is a secure cookie or not" do - @cookie.secure = true - @cookie.secure.should be_true + describe "CGI::Cookie#secure" do + before :each do + @cookie = CGI::Cookie.new("test-cookie") + end - @cookie.secure = false - @cookie.secure.should be_false - end -end + it "returns whether self is a secure cookie or not" do + @cookie.secure = true + @cookie.secure.should == true -describe "CGI::Cookie#secure= when passed true" do - before :each do - @cookie = CGI::Cookie.new("test-cookie") + @cookie.secure = false + @cookie.secure.should == false + end end - it "returns true" do - (@cookie.secure = true).should be_true - end + describe "CGI::Cookie#secure= when passed true" do + before :each do + @cookie = CGI::Cookie.new("test-cookie") + end - it "sets self to a secure cookie" do - @cookie.secure = true - @cookie.secure.should be_true - end -end + it "returns true" do + (@cookie.secure = true).should == true + end -describe "CGI::Cookie#secure= when passed false" do - before :each do - @cookie = CGI::Cookie.new("test-cookie") + it "sets self to a secure cookie" do + @cookie.secure = true + @cookie.secure.should == true + end end - it "returns false" do - (@cookie.secure = false).should be_false - end + describe "CGI::Cookie#secure= when passed false" do + before :each do + @cookie = CGI::Cookie.new("test-cookie") + end - it "sets self to a non-secure cookie" do - @cookie.secure = false - @cookie.secure.should be_false - end -end + it "returns false" do + (@cookie.secure = false).should == false + end -describe "CGI::Cookie#secure= when passed Object" do - before :each do - @cookie = CGI::Cookie.new("test-cookie") + it "sets self to a non-secure cookie" do + @cookie.secure = false + @cookie.secure.should == false + end end - it "does not change self's secure value" do - @cookie.secure = false + describe "CGI::Cookie#secure= when passed Object" do + before :each do + @cookie = CGI::Cookie.new("test-cookie") + end + + it "does not change self's secure value" do + @cookie.secure = false - @cookie.secure = Object.new - @cookie.secure.should be_false + @cookie.secure = Object.new + @cookie.secure.should == false - @cookie.secure = "Test" - @cookie.secure.should be_false + @cookie.secure = "Test" + @cookie.secure.should == false - @cookie.secure = true + @cookie.secure = true - @cookie.secure = Object.new - @cookie.secure.should be_true + @cookie.secure = Object.new + @cookie.secure.should == true - @cookie.secure = "Test" - @cookie.secure.should be_true + @cookie.secure = "Test" + @cookie.secure.should == true + end end end diff --git a/spec/ruby/library/cgi/cookie/to_s_spec.rb b/spec/ruby/library/cgi/cookie/to_s_spec.rb index 978c2d33eb..20d2579f8d 100644 --- a/spec/ruby/library/cgi/cookie/to_s_spec.rb +++ b/spec/ruby/library/cgi/cookie/to_s_spec.rb @@ -1,42 +1,36 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#to_s" do - it "returns a String representation of self" do - cookie = CGI::Cookie.new("test-cookie") - cookie.to_s.should == "test-cookie=; path=" +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("test-cookie", "value") - cookie.to_s.should == "test-cookie=value; path=" + describe "CGI::Cookie#to_s" do + it "returns a String representation of self" do + cookie = CGI::Cookie.new("test-cookie") + cookie.to_s.should == "test-cookie=; path=" - cookie = CGI::Cookie.new("test-cookie", "one", "two", "three") - cookie.to_s.should == "test-cookie=one&two&three; path=" + cookie = CGI::Cookie.new("test-cookie", "value") + cookie.to_s.should == "test-cookie=value; path=" - cookie = CGI::Cookie.new( - 'name' => 'test-cookie', - 'value' => ["one", "two", "three"], - 'path' => 'some/path/', - 'domain' => 'example.com', - 'expires' => Time.at(1196524602), - 'secure' => true) - cookie.to_s.should == "test-cookie=one&two&three; domain=example.com; path=some/path/; expires=Sat, 01 Dec 2007 15:56:42 GMT; secure" - end + cookie = CGI::Cookie.new("test-cookie", "one", "two", "three") + cookie.to_s.should == "test-cookie=one&two&three; path=" - it "escapes the self's values" do - cookie = CGI::Cookie.new("test-cookie", " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}") - cookie.to_s.should == "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D; path=" - end + cookie = CGI::Cookie.new( + 'name' => 'test-cookie', + 'value' => ["one", "two", "three"], + 'path' => 'some/path/', + 'domain' => 'example.com', + 'expires' => Time.at(1196524602), + 'secure' => true) + cookie.to_s.should == "test-cookie=one&two&three; domain=example.com; path=some/path/; expires=Sat, 01 Dec 2007 15:56:42 GMT; secure" + end - ruby_version_is ""..."2.5" do - it "escapes tilde" do - cookie = CGI::Cookie.new("test-cookie", "~").to_s.should == "test-cookie=%7E; path=" + it "escapes the self's values" do + cookie = CGI::Cookie.new("test-cookie", " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}") + cookie.to_s.should == "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D; path=" end - end - ruby_version_is "2.5" do it "does not escape tilde" do cookie = CGI::Cookie.new("test-cookie", "~").to_s.should == "test-cookie=~; path=" end end - end diff --git a/spec/ruby/library/cgi/cookie/value_spec.rb b/spec/ruby/library/cgi/cookie/value_spec.rb index 1d5da3a3ac..45032edcbf 100644 --- a/spec/ruby/library/cgi/cookie/value_spec.rb +++ b/spec/ruby/library/cgi/cookie/value_spec.rb @@ -1,76 +1,79 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::Cookie#value" do - it "returns self's value" do - cookie = CGI::Cookie.new("test-cookie") - cookie.value.should == [] +ruby_version_is ""..."4.0" do + require 'cgi' - cookie = CGI::Cookie.new("test-cookie", "one") - cookie.value.should == ["one"] + describe "CGI::Cookie#value" do + it "returns self's value" do + cookie = CGI::Cookie.new("test-cookie") + cookie.value.should == [] - cookie = CGI::Cookie.new("test-cookie", "one", "two", "three") - cookie.value.should == ["one", "two", "three"] + cookie = CGI::Cookie.new("test-cookie", "one") + cookie.value.should == ["one"] - cookie = CGI::Cookie.new("name" => "test-cookie", "value" => ["one", "two", "three"]) - cookie.value.should == ["one", "two", "three"] - end + cookie = CGI::Cookie.new("test-cookie", "one", "two", "three") + cookie.value.should == ["one", "two", "three"] - it "is in synch with self" do - fail = [] - [ - :pop, - :shift, - [:<<, "Hello"], - [:push, "Hello"], - [:unshift, "World"], - [:replace, ["A", "B"]], - [:[]=, 1, "Set"], - [:delete, "first"], - [:delete_at, 0], - ].each do |method, *args| - cookie1 = CGI::Cookie.new("test-cookie", "first", "second") - cookie2 = CGI::Cookie.new("test-cookie", "first", "second") - cookie1.send(method, *args) - cookie2.value.send(method, *args) - fail << method unless cookie1.value == cookie2.value + cookie = CGI::Cookie.new("name" => "test-cookie", "value" => ["one", "two", "three"]) + cookie.value.should == ["one", "two", "three"] end - fail.should be_empty - end -end -describe "CGI::Cookie#value=" do - before :each do - @cookie = CGI::Cookie.new("test-cookie") + it "is in synch with self" do + fail = [] + [ + :pop, + :shift, + [:<<, "Hello"], + [:push, "Hello"], + [:unshift, "World"], + [:replace, ["A", "B"]], + [:[]=, 1, "Set"], + [:delete, "first"], + [:delete_at, 0], + ].each do |method, *args| + cookie1 = CGI::Cookie.new("test-cookie", "first", "second") + cookie2 = CGI::Cookie.new("test-cookie", "first", "second") + cookie1.send(method, *args) + cookie2.value.send(method, *args) + fail << method unless cookie1.value == cookie2.value + end + fail.should.empty? + end end - it "sets self's value" do - @cookie.value = ["one"] - @cookie.value.should == ["one"] + describe "CGI::Cookie#value=" do + before :each do + @cookie = CGI::Cookie.new("test-cookie") + end - @cookie.value = ["one", "two", "three"] - @cookie.value.should == ["one", "two", "three"] - end + it "sets self's value" do + @cookie.value = ["one"] + @cookie.value.should == ["one"] - it "automatically converts the passed Object to an Array using #Array" do - @cookie.value = "test" - @cookie.value.should == ["test"] + @cookie.value = ["one", "two", "three"] + @cookie.value.should == ["one", "two", "three"] + end - obj = mock("to_a") - obj.should_receive(:to_a).and_return(["1", "2"]) - @cookie.value = obj - @cookie.value.should == ["1", "2"] + it "automatically converts the passed Object to an Array using #Array" do + @cookie.value = "test" + @cookie.value.should == ["test"] - obj = mock("to_ary") - obj.should_receive(:to_ary).and_return(["1", "2"]) - @cookie.value = obj - @cookie.value.should == ["1", "2"] - end + obj = mock("to_a") + obj.should_receive(:to_a).and_return(["1", "2"]) + @cookie.value = obj + @cookie.value.should == ["1", "2"] - it "does keep self and the values in sync" do - @cookie.value = ["one", "two", "three"] - @cookie[0].should == "one" - @cookie[1].should == "two" - @cookie[2].should == "three" + obj = mock("to_ary") + obj.should_receive(:to_ary).and_return(["1", "2"]) + @cookie.value = obj + @cookie.value.should == ["1", "2"] + end + + it "does keep self and the values in sync" do + @cookie.value = ["one", "two", "three"] + @cookie[0].should == "one" + @cookie[1].should == "two" + @cookie[2].should == "three" + end end end diff --git a/spec/ruby/library/cgi/escapeElement_spec.rb b/spec/ruby/library/cgi/escapeElement_spec.rb index 148926c453..72c38d6028 100644 --- a/spec/ruby/library/cgi/escapeElement_spec.rb +++ b/spec/ruby/library/cgi/escapeElement_spec.rb @@ -1,5 +1,11 @@ require_relative '../../spec_helper' -require 'cgi' + +ruby_version_is ""..."4.0" do + require 'cgi' +end +ruby_version_is "4.0" do + require 'cgi/escape' +end describe "CGI.escapeElement when passed String, elements, ..." do it "escapes only the tags of the passed elements in the passed String" do diff --git a/spec/ruby/library/cgi/escapeHTML_spec.rb b/spec/ruby/library/cgi/escapeHTML_spec.rb index dcbfebe720..6e70e87ed7 100644 --- a/spec/ruby/library/cgi/escapeHTML_spec.rb +++ b/spec/ruby/library/cgi/escapeHTML_spec.rb @@ -1,11 +1,19 @@ require_relative '../../spec_helper' -require 'cgi' +begin + require 'cgi/escape' +rescue LoadError + require 'cgi' +end describe "CGI.escapeHTML" do it "escapes special HTML characters (&\"<>') in the passed argument" do CGI.escapeHTML(%[& < > " ']).should == '& < > " '' end + it "escapes invalid encoding" do + CGI.escapeHTML(%[<\xA4??>]).should == "<\xA4??>" + end + it "does not escape any other characters" do chars = " !\#$%()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" CGI.escapeHTML(chars).should == chars diff --git a/spec/ruby/library/cgi/escapeURIComponent_spec.rb b/spec/ruby/library/cgi/escapeURIComponent_spec.rb new file mode 100644 index 0000000000..98efa2e67e --- /dev/null +++ b/spec/ruby/library/cgi/escapeURIComponent_spec.rb @@ -0,0 +1,78 @@ +require_relative '../../spec_helper' +begin + require 'cgi/escape' +rescue LoadError + require 'cgi' +end + +describe "CGI.escapeURIComponent" do + it "percent-encodes characters reserved according to RFC 3986" do + # https://www.rfc-editor.org/rfc/rfc3986#section-2.2 + string = ":/?#[]@!$&'()*+,;=" + CGI.escapeURIComponent(string).should == "%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D" + end + + it "does not percent-encode unreserved characters according to RFC 3986" do + string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" + CGI.escapeURIComponent(string).should == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" + end + + it "encodes % character as %25" do + CGI.escapeURIComponent("%").should == "%25" + end + + # Compare to .escape which uses "+". + it "percent-encodes single whitespace" do + CGI.escapeURIComponent(" ").should == "%20" + end + + it "percent-encodes all non-reserved and non-unreserved ASCII characters" do + special_set = ":/?#[]@!$&'()*+,;=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" + all_other = (0x00..0x7F).filter_map { |i| i.chr unless special_set.include?(i.chr) }.join + encoded = CGI.escapeURIComponent(all_other) + encoded.should.match?(/\A(?:%[0-9A-F]{2}){#{all_other.length}}\z/) + end + + it "percent-encodes non-ASCII bytes" do + bytes = (0x80..0xFF).map(&:chr).join + encoded = CGI.escapeURIComponent(bytes) + encoded.should.match?(/\A(?:%[0-9A-F]{2}){#{bytes.length}}\z/) + end + + it "processes multi-byte characters as separate bytes, percent-encoding each one" do + CGI.escapeURIComponent("β").should == "%CE%B2" # "β" bytes representation is CE B2 + end + + it "produces a copy of an empty string" do + string = "".encode(Encoding::BINARY) + encoded = CGI.escapeURIComponent(string) + encoded.should == "" + encoded.encoding.should == Encoding::BINARY + string.should_not.equal?(encoded) + end + + it "preserves string's encoding" do + string = "whatever".encode("ASCII-8BIT") + CGI.escapeURIComponent(string).encoding.should == Encoding::ASCII_8BIT + end + + it "processes even strings with invalid encoding, percent-encoding octets as-is" do + string = "\xC0<<".dup.force_encoding("UTF-8") + CGI.escapeURIComponent(string).should == "%C0%3C%3C" + end + + it "raises a TypeError with nil" do + -> { + CGI.escapeURIComponent(nil) + }.should.raise(TypeError, "no implicit conversion of nil into String") + end + + it "uses implicit type conversion to String" do + object = Object.new + def object.to_str + "a b" + end + + CGI.escapeURIComponent(object).should == "a%20b" + end +end diff --git a/spec/ruby/library/cgi/escape_spec.rb b/spec/ruby/library/cgi/escape_spec.rb index 351bfe1070..55eb0b66c2 100644 --- a/spec/ruby/library/cgi/escape_spec.rb +++ b/spec/ruby/library/cgi/escape_spec.rb @@ -1,5 +1,9 @@ require_relative '../../spec_helper' -require 'cgi' +begin + require 'cgi/escape' +rescue LoadError + require 'cgi' +end describe "CGI.escape" do it "url-encodes the passed argument" do @@ -7,20 +11,12 @@ describe "CGI.escape" do expected = "+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D" CGI.escape(input).should == expected - input = "http://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" - expected = 'http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' + input = "https://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" + expected = 'https%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' CGI.escape(input).should == expected end - ruby_version_is ""..."2.5" do - it "escapes tilde" do - CGI.escape("~").should == "%7E" - end - end - - ruby_version_is "2.5" do - it "does not escape tilde" do - CGI.escape("~").should == "~" - end + it "does not escape tilde" do + CGI.escape("~").should == "~" end end diff --git a/spec/ruby/library/cgi/htmlextension/a_spec.rb b/spec/ruby/library/cgi/htmlextension/a_spec.rb index 05b4c2d14c..78d3dec8fa 100644 --- a/spec/ruby/library/cgi/htmlextension/a_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/a_spec.rb @@ -1,49 +1,52 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#a" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed a String" do - it "returns an 'a'-element, using the passed String as the 'href'-attribute" do - output = @html.a("http://www.example.com") - output.should equal_element("A", "HREF" => "http://www.example.com") + describe "CGI::HtmlExtension#a" do + before :each do + @html = CGISpecs.cgi_new end - it "includes the passed block's return value when passed a block" do - output = @html.a("http://www.example.com") { "Example" } - output.should equal_element("A", { "HREF" => "http://www.example.com" }, "Example") - end - end + describe "when passed a String" do + it "returns an 'a'-element, using the passed String as the 'href'-attribute" do + output = @html.a("http://www.example.com") + output.should equal_element("A", "HREF" => "http://www.example.com") + end - describe "when passed a Hash" do - it "returns an 'a'-element, using the passed Hash for attributes" do - attributes = {"HREF" => "http://www.example.com", "TARGET" => "_top"} - @html.a(attributes).should equal_element("A", attributes) + it "includes the passed block's return value when passed a block" do + output = @html.a("http://www.example.com") { "Example" } + output.should equal_element("A", { "HREF" => "http://www.example.com" }, "Example") + end end - it "includes the passed block's return value when passed a block" do - attributes = {"HREF" => "http://www.example.com", "TARGET" => "_top"} - @html.a(attributes) { "Example" }.should equal_element("A", attributes, "Example") - end - end + describe "when passed a Hash" do + it "returns an 'a'-element, using the passed Hash for attributes" do + attributes = {"HREF" => "http://www.example.com", "TARGET" => "_top"} + @html.a(attributes).should equal_element("A", attributes) + end - describe "when each HTML generation" do - it "returns the doctype declaration for HTML3" do - CGISpecs.cgi_new("html3").a.should == %(<A HREF=""></A>) - CGISpecs.cgi_new("html3").a { "link text" }.should == %(<A HREF="">link text</A>) + it "includes the passed block's return value when passed a block" do + attributes = {"HREF" => "http://www.example.com", "TARGET" => "_top"} + @html.a(attributes) { "Example" }.should equal_element("A", attributes, "Example") + end end - it "returns the doctype declaration for HTML4" do - CGISpecs.cgi_new("html4").a.should == %(<A HREF=""></A>) - CGISpecs.cgi_new("html4").a { "link text" }.should == %(<A HREF="">link text</A>) - end - it "returns the doctype declaration for the Transitional version of HTML4" do - CGISpecs.cgi_new("html4Tr").a.should == %(<A HREF=""></A>) - CGISpecs.cgi_new("html4Tr").a { "link text" }.should == %(<A HREF="">link text</A>) + describe "when each HTML generation" do + it "returns the doctype declaration for HTML3" do + CGISpecs.cgi_new("html3").a.should == %(<A HREF=""></A>) + CGISpecs.cgi_new("html3").a { "link text" }.should == %(<A HREF="">link text</A>) + end + + it "returns the doctype declaration for HTML4" do + CGISpecs.cgi_new("html4").a.should == %(<A HREF=""></A>) + CGISpecs.cgi_new("html4").a { "link text" }.should == %(<A HREF="">link text</A>) + end + it "returns the doctype declaration for the Transitional version of HTML4" do + CGISpecs.cgi_new("html4Tr").a.should == %(<A HREF=""></A>) + CGISpecs.cgi_new("html4Tr").a { "link text" }.should == %(<A HREF="">link text</A>) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/base_spec.rb b/spec/ruby/library/cgi/htmlextension/base_spec.rb index 877ac321cd..1eedfdea54 100644 --- a/spec/ruby/library/cgi/htmlextension/base_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/base_spec.rb @@ -1,33 +1,36 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#base" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when bassed a String" do - it "returns a 'base'-element, using the passed String as the 'href'-attribute" do - output = @html.base("http://www.example.com") - output.should equal_element("BASE", {"HREF" => "http://www.example.com"}, nil, not_closed: true) + describe "CGI::HtmlExtension#base" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.base("http://www.example.com") { "Example" } - output.should equal_element("BASE", {"HREF" => "http://www.example.com"}, nil, not_closed: true) - end - end + describe "when bassed a String" do + it "returns a 'base'-element, using the passed String as the 'href'-attribute" do + output = @html.base("http://www.example.com") + output.should equal_element("BASE", {"HREF" => "http://www.example.com"}, nil, not_closed: true) + end - describe "when passed a Hash" do - it "returns a 'base'-element, using the passed Hash for attributes" do - output = @html.base("HREF" => "http://www.example.com", "ID" => "test") - output.should equal_element("BASE", {"HREF" => "http://www.example.com", "ID" => "test"}, nil, not_closed: true) + it "ignores a passed block" do + output = @html.base("http://www.example.com") { "Example" } + output.should equal_element("BASE", {"HREF" => "http://www.example.com"}, nil, not_closed: true) + end end - it "ignores a passed block" do - output = @html.base("HREF" => "http://www.example.com", "ID" => "test") { "Example" } - output.should equal_element("BASE", {"HREF" => "http://www.example.com", "ID" => "test"}, nil, not_closed: true) + describe "when passed a Hash" do + it "returns a 'base'-element, using the passed Hash for attributes" do + output = @html.base("HREF" => "http://www.example.com", "ID" => "test") + output.should equal_element("BASE", {"HREF" => "http://www.example.com", "ID" => "test"}, nil, not_closed: true) + end + + it "ignores a passed block" do + output = @html.base("HREF" => "http://www.example.com", "ID" => "test") { "Example" } + output.should equal_element("BASE", {"HREF" => "http://www.example.com", "ID" => "test"}, nil, not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/blockquote_spec.rb b/spec/ruby/library/cgi/htmlextension/blockquote_spec.rb index a7b833b1c5..883e36f78b 100644 --- a/spec/ruby/library/cgi/htmlextension/blockquote_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/blockquote_spec.rb @@ -1,33 +1,36 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#blockquote" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed a String" do - it "returns a 'blockquote'-element, using the passed String for the 'cite'-attribute" do - output = @html.blockquote("http://www.example.com/quotes/foo.html") - output.should equal_element("BLOCKQUOTE", "CITE" => "http://www.example.com/quotes/foo.html") + describe "CGI::HtmlExtension#blockquote" do + before :each do + @html = CGISpecs.cgi_new end - it "includes the passed block's return value when passed a block" do - output = @html.blockquote("http://www.example.com/quotes/foo.html") { "Foo!" } - output.should equal_element("BLOCKQUOTE", { "CITE" => "http://www.example.com/quotes/foo.html" }, "Foo!") - end - end + describe "when passed a String" do + it "returns a 'blockquote'-element, using the passed String for the 'cite'-attribute" do + output = @html.blockquote("http://www.example.com/quotes/foo.html") + output.should equal_element("BLOCKQUOTE", "CITE" => "http://www.example.com/quotes/foo.html") + end - describe "when passed a Hash" do - it "returns a 'blockquote'-element, using the passed Hash for attributes" do - output = @html.blockquote("CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") - output.should equal_element("BLOCKQUOTE", "CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") + it "includes the passed block's return value when passed a block" do + output = @html.blockquote("http://www.example.com/quotes/foo.html") { "Foo!" } + output.should equal_element("BLOCKQUOTE", { "CITE" => "http://www.example.com/quotes/foo.html" }, "Foo!") + end end - it "includes the passed block's return value when passed a block" do - output = @html.blockquote("CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") { "Foo!" } - output.should equal_element("BLOCKQUOTE", {"CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test"}, "Foo!") + describe "when passed a Hash" do + it "returns a 'blockquote'-element, using the passed Hash for attributes" do + output = @html.blockquote("CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") + output.should equal_element("BLOCKQUOTE", "CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") + end + + it "includes the passed block's return value when passed a block" do + output = @html.blockquote("CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test") { "Foo!" } + output.should equal_element("BLOCKQUOTE", {"CITE" => "http://www.example.com/quotes/foo.html", "ID" => "test"}, "Foo!") + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/br_spec.rb b/spec/ruby/library/cgi/htmlextension/br_spec.rb index dfca121884..23c2cb4a48 100644 --- a/spec/ruby/library/cgi/htmlextension/br_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/br_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#br" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when each HTML generation" do - it "returns the doctype declaration for HTML3" do - CGISpecs.cgi_new("html3").br.should == "<BR>" + describe "CGI::HtmlExtension#br" do + before :each do + @html = CGISpecs.cgi_new end - it "returns the doctype declaration for HTML4" do - CGISpecs.cgi_new("html4").br.should == "<BR>" - end - it "returns the doctype declaration for the Transitional version of HTML4" do - CGISpecs.cgi_new("html4Tr").br.should == "<BR>" + describe "when each HTML generation" do + it "returns the doctype declaration for HTML3" do + CGISpecs.cgi_new("html3").br.should == "<BR>" + end + + it "returns the doctype declaration for HTML4" do + CGISpecs.cgi_new("html4").br.should == "<BR>" + end + it "returns the doctype declaration for the Transitional version of HTML4" do + CGISpecs.cgi_new("html4Tr").br.should == "<BR>" + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/caption_spec.rb b/spec/ruby/library/cgi/htmlextension/caption_spec.rb index 16615028b8..3d3e21ecaa 100644 --- a/spec/ruby/library/cgi/htmlextension/caption_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/caption_spec.rb @@ -1,33 +1,36 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#caption" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed a String" do - it "returns a 'caption'-element, using the passed String for the 'align'-attribute" do - output = @html.caption("left") - output.should equal_element("CAPTION", "ALIGN" => "left") + describe "CGI::HtmlExtension#caption" do + before :each do + @html = CGISpecs.cgi_new end - it "includes the passed block's return value when passed a block" do - output = @html.caption("left") { "Capital Cities" } - output.should equal_element("CAPTION", {"ALIGN" => "left"}, "Capital Cities") - end - end + describe "when passed a String" do + it "returns a 'caption'-element, using the passed String for the 'align'-attribute" do + output = @html.caption("left") + output.should equal_element("CAPTION", "ALIGN" => "left") + end - describe "when passed a Hash" do - it "returns a 'caption'-element, using the passed Hash for attributes" do - output = @html.caption("ALIGN" => "left", "ID" => "test") - output.should equal_element("CAPTION", "ALIGN" => "left", "ID" => "test") + it "includes the passed block's return value when passed a block" do + output = @html.caption("left") { "Capital Cities" } + output.should equal_element("CAPTION", {"ALIGN" => "left"}, "Capital Cities") + end end - it "includes the passed block's return value when passed a block" do - output = @html.caption("ALIGN" => "left", "ID" => "test") { "Capital Cities" } - output.should equal_element("CAPTION", {"ALIGN" => "left", "ID" => "test"}, "Capital Cities") + describe "when passed a Hash" do + it "returns a 'caption'-element, using the passed Hash for attributes" do + output = @html.caption("ALIGN" => "left", "ID" => "test") + output.should equal_element("CAPTION", "ALIGN" => "left", "ID" => "test") + end + + it "includes the passed block's return value when passed a block" do + output = @html.caption("ALIGN" => "left", "ID" => "test") { "Capital Cities" } + output.should equal_element("CAPTION", {"ALIGN" => "left", "ID" => "test"}, "Capital Cities") + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/checkbox_group_spec.rb b/spec/ruby/library/cgi/htmlextension/checkbox_group_spec.rb index 64f852cc52..07163c010e 100644 --- a/spec/ruby/library/cgi/htmlextension/checkbox_group_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/checkbox_group_spec.rb @@ -1,76 +1,79 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#checkbox_group" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed name, values ..." do - it "returns a sequence of 'checkbox'-elements with the passed name and the passed values" do - output = CGISpecs.split(@html.checkbox_group("test", "foo", "bar", "baz")) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + describe "CGI::HtmlExtension#checkbox_group" do + before :each do + @html = CGISpecs.cgi_new end - it "allows passing a value inside an Array" do - output = CGISpecs.split(@html.checkbox_group("test", ["foo"], "bar", ["baz"])) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) - end + describe "when passed name, values ..." do + it "returns a sequence of 'checkbox'-elements with the passed name and the passed values" do + output = CGISpecs.split(@html.checkbox_group("test", "foo", "bar", "baz")) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + end - it "allows passing a value as an Array containing the value and the checked state or a label" do - output = CGISpecs.split(@html.checkbox_group("test", ["foo"], ["bar", true], ["baz", "label for baz"])) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "label for baz", not_closed: true) - end + it "allows passing a value inside an Array" do + output = CGISpecs.split(@html.checkbox_group("test", ["foo"], "bar", ["baz"])) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + end - it "allows passing a value as an Array containing the value, a label and the checked state" do - output = CGISpecs.split(@html.checkbox_group("test", ["foo", "label for foo", true], ["bar", "label for bar", false], ["baz", "label for baz", true])) - output[0].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "label for foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "label for bar", not_closed: true) - output[2].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "label for baz", not_closed: true) - end + it "allows passing a value as an Array containing the value and the checked state or a label" do + output = CGISpecs.split(@html.checkbox_group("test", ["foo"], ["bar", true], ["baz", "label for baz"])) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "label for baz", not_closed: true) + end - it "returns an empty String when passed no values" do - @html.checkbox_group("test").should == "" - end + it "allows passing a value as an Array containing the value, a label and the checked state" do + output = CGISpecs.split(@html.checkbox_group("test", ["foo", "label for foo", true], ["bar", "label for bar", false], ["baz", "label for baz", true])) + output[0].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "label for foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "label for bar", not_closed: true) + output[2].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "label for baz", not_closed: true) + end + + it "returns an empty String when passed no values" do + @html.checkbox_group("test").should == "" + end - it "ignores a passed block" do - output = CGISpecs.split(@html.checkbox_group("test", "foo", "bar", "baz") { "test" }) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + it "ignores a passed block" do + output = CGISpecs.split(@html.checkbox_group("test", "foo", "bar", "baz") { "test" }) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + end end - end - describe "when passed Hash" do - it "uses the passed Hash to generate the checkbox sequence" do - output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + describe "when passed Hash" do + it "uses the passed Hash to generate the checkbox sequence" do + output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) - output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) - output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "1"}, "Foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "checkbox", "VALUE" => "2"}, "Bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "Baz"}, "Baz", not_closed: true) - end + output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "1"}, "Foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "checkbox", "VALUE" => "2"}, "Bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "Baz"}, "Baz", not_closed: true) + end - it "ignores a passed block" do - output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) { "test" }) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + it "ignores a passed block" do + output = CGISpecs.split(@html.checkbox_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) { "test" }) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "checkbox", "VALUE" => "baz"}, "baz", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/checkbox_spec.rb b/spec/ruby/library/cgi/htmlextension/checkbox_spec.rb index af76fa1da9..ad87b78061 100644 --- a/spec/ruby/library/cgi/htmlextension/checkbox_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/checkbox_spec.rb @@ -1,77 +1,80 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#checkbox" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a checkbox-'input'-element without a name" do - output = @html.checkbox - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "checkbox"}, "", not_closed: true) + describe "CGI::HtmlExtension#checkbox" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.checkbox { "test" } - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "checkbox"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns a checkbox-'input'-element without a name" do + output = @html.checkbox + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "checkbox"}, "", not_closed: true) + end - describe "when passed name" do - it "returns a checkbox-'input'-element with the passed name" do - output = @html.checkbox("test") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.checkbox { "test" } + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "checkbox"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.checkbox("test") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns a checkbox-'input'-element with the passed name" do + output = @html.checkbox("test") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox"}, "", not_closed: true) + end - describe "CGI::HtmlExtension#checkbox when passed name, value" do - it "returns a checkbox-'input'-element with the passed name and value" do - output = @html.checkbox("test", "test-value") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.checkbox("test") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.checkbox("test", "test-value") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + describe "CGI::HtmlExtension#checkbox when passed name, value" do + it "returns a checkbox-'input'-element with the passed name and value" do + output = @html.checkbox("test", "test-value") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.checkbox("test", "test-value") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + end end - end - describe "when passed name, value, checked" do - it "returns a checked checkbox-'input'-element with the passed name and value when checked is true" do - output = @html.checkbox("test", "test-value", true) - output.should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + describe "when passed name, value, checked" do + it "returns a checked checkbox-'input'-element with the passed name and value when checked is true" do + output = @html.checkbox("test", "test-value", true) + output.should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) - output = @html.checkbox("test", "test-value", false) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + output = @html.checkbox("test", "test-value", false) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) - output = @html.checkbox("test", "test-value", nil) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) - end + output = @html.checkbox("test", "test-value", nil) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + end - it "ignores a passed block" do - output = @html.checkbox("test", "test-value", nil) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.checkbox("test", "test-value", nil) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "checkbox", "VALUE" => "test-value"}, "", not_closed: true) + end end - end - describe "when passed Hash" do - it "returns a checkbox-'input'-element using the passed Hash for attributes" do - attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} - output = @html.checkbox(attributes) - output.should equal_element("INPUT", attributes, "", not_closed: true) - end + describe "when passed Hash" do + it "returns a checkbox-'input'-element using the passed Hash for attributes" do + attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} + output = @html.checkbox(attributes) + output.should equal_element("INPUT", attributes, "", not_closed: true) + end - it "ignores a passed block" do - attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} - output = @html.checkbox(attributes) { "test" } - output.should equal_element("INPUT", attributes, "", not_closed: true) + it "ignores a passed block" do + attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} + output = @html.checkbox(attributes) { "test" } + output.should equal_element("INPUT", attributes, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/doctype_spec.rb b/spec/ruby/library/cgi/htmlextension/doctype_spec.rb index 9a28a8883b..02af831855 100644 --- a/spec/ruby/library/cgi/htmlextension/doctype_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/doctype_spec.rb @@ -1,27 +1,30 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#doctype" do - describe "when each HTML generation" do - it "returns the doctype declaration for HTML3" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' - CGISpecs.cgi_new("html3").doctype.should == expect - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - it "returns the doctype declaration for HTML4" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' - CGISpecs.cgi_new("html4").doctype.should == expect - end + describe "CGI::HtmlExtension#doctype" do + describe "when each HTML generation" do + it "returns the doctype declaration for HTML3" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' + CGISpecs.cgi_new("html3").doctype.should == expect + end - it "returns the doctype declaration for the Frameset version of HTML4" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">' - CGISpecs.cgi_new("html4Fr").doctype.should == expect - end + it "returns the doctype declaration for HTML4" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' + CGISpecs.cgi_new("html4").doctype.should == expect + end + + it "returns the doctype declaration for the Frameset version of HTML4" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">' + CGISpecs.cgi_new("html4Fr").doctype.should == expect + end - it "returns the doctype declaration for the Transitional version of HTML4" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' - CGISpecs.cgi_new("html4Tr").doctype.should == expect + it "returns the doctype declaration for the Transitional version of HTML4" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' + CGISpecs.cgi_new("html4Tr").doctype.should == expect + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/file_field_spec.rb b/spec/ruby/library/cgi/htmlextension/file_field_spec.rb index 2a0632fd58..eff077b9a2 100644 --- a/spec/ruby/library/cgi/htmlextension/file_field_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/file_field_spec.rb @@ -1,72 +1,75 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#file_field" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a file-'input'-element without a name and a size of 20" do - output = @html.file_field - output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "", "TYPE" => "file"}, "", not_closed: true) + describe "CGI::HtmlExtension#file_field" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.file_field { "test" } - output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "", "TYPE" => "file"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns a file-'input'-element without a name and a size of 20" do + output = @html.file_field + output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "", "TYPE" => "file"}, "", not_closed: true) + end - describe "when passed name" do - it "returns a checkbox-'input'-element with the passed name" do - output = @html.file_field("Example") - output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.file_field { "test" } + output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "", "TYPE" => "file"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.file_field("Example") { "test" } - output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns a checkbox-'input'-element with the passed name" do + output = @html.file_field("Example") + output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + end - describe "when passed name, size" do - it "returns a checkbox-'input'-element with the passed name and size" do - output = @html.file_field("Example", 40) - output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.file_field("Example") { "test" } + output.should equal_element("INPUT", {"SIZE" => 20, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.file_field("Example", 40) { "test" } - output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) - end - end + describe "when passed name, size" do + it "returns a checkbox-'input'-element with the passed name and size" do + output = @html.file_field("Example", 40) + output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + end - describe "when passed name, size, maxlength" do - it "returns a checkbox-'input'-element with the passed name, size and maxlength" do - output = @html.file_field("Example", 40, 100) - output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file", "MAXLENGTH" => 100}, "", not_closed: true) + it "ignores a passed block" do + output = @html.file_field("Example", 40) { "test" } + output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.file_field("Example", 40, 100) { "test" } - output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file", "MAXLENGTH" => 100}, "", not_closed: true) + describe "when passed name, size, maxlength" do + it "returns a checkbox-'input'-element with the passed name, size and maxlength" do + output = @html.file_field("Example", 40, 100) + output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file", "MAXLENGTH" => 100}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.file_field("Example", 40, 100) { "test" } + output.should equal_element("INPUT", {"SIZE" => 40, "NAME" => "Example", "TYPE" => "file", "MAXLENGTH" => 100}, "", not_closed: true) + end end - end - describe "when passed a Hash" do - it "returns a file-'input'-element using the passed Hash for attributes" do - output = @html.file_field("NAME" => "test", "SIZE" => 40) - output.should equal_element("INPUT", {"NAME" => "test", "SIZE" => 40}, "", not_closed: true) + describe "when passed a Hash" do + it "returns a file-'input'-element using the passed Hash for attributes" do + output = @html.file_field("NAME" => "test", "SIZE" => 40) + output.should equal_element("INPUT", {"NAME" => "test", "SIZE" => 40}, "", not_closed: true) - output = @html.file_field("NAME" => "test", "MAXLENGTH" => 100) - output.should equal_element("INPUT", {"NAME" => "test", "MAXLENGTH" => 100}, "", not_closed: true) - end + output = @html.file_field("NAME" => "test", "MAXLENGTH" => 100) + output.should equal_element("INPUT", {"NAME" => "test", "MAXLENGTH" => 100}, "", not_closed: true) + end - it "ignores a passed block" do - output = @html.file_field("NAME" => "test", "SIZE" => 40) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "SIZE" => 40}, "", not_closed: true) + it "ignores a passed block" do + output = @html.file_field("NAME" => "test", "SIZE" => 40) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "SIZE" => 40}, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/form_spec.rb b/spec/ruby/library/cgi/htmlextension/form_spec.rb index 8c0ac97735..55ac63152b 100644 --- a/spec/ruby/library/cgi/htmlextension/form_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/form_spec.rb @@ -1,58 +1,61 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#form" do - before :each do - @html = CGISpecs.cgi_new - @html.stub!(:script_name).and_return("/path/to/some/script") - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a 'form'-element" do - output = @html.form - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/path/to/some/script"}, "") + describe "CGI::HtmlExtension#form" do + before :each do + @html = CGISpecs.cgi_new + @html.stub!(:script_name).and_return("/path/to/some/script") end - it "includes the return value of the passed block when passed a block" do - output = @html.form { "test" } - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/path/to/some/script"}, "test") - end - end + describe "when passed no arguments" do + it "returns a 'form'-element" do + output = @html.form + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/path/to/some/script"}, "") + end - describe "when passed method" do - it "returns a 'form'-element with the passed method" do - output = @html.form("get") - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/path/to/some/script"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.form { "test" } + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/path/to/some/script"}, "test") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.form("get") { "test" } - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/path/to/some/script"}, "test") - end - end + describe "when passed method" do + it "returns a 'form'-element with the passed method" do + output = @html.form("get") + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/path/to/some/script"}, "") + end - describe "when passed method, action" do - it "returns a 'form'-element with the passed method and the passed action" do - output = @html.form("get", "/some/other/script") - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/some/other/script"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.form("get") { "test" } + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/path/to/some/script"}, "test") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.form("get", "/some/other/script") { "test" } - output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/some/other/script"}, "test") - end - end + describe "when passed method, action" do + it "returns a 'form'-element with the passed method and the passed action" do + output = @html.form("get", "/some/other/script") + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/some/other/script"}, "") + end - describe "when passed method, action, enctype" do - it "returns a 'form'-element with the passed method, action and enctype" do - output = @html.form("get", "/some/other/script", "multipart/form-data") - output.should equal_element("FORM", {"ENCTYPE" => "multipart/form-data", "METHOD" => "get", "ACTION" => "/some/other/script"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.form("get", "/some/other/script") { "test" } + output.should equal_element("FORM", {"ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ACTION" => "/some/other/script"}, "test") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.form("get", "/some/other/script", "multipart/form-data") { "test" } - output.should equal_element("FORM", {"ENCTYPE" => "multipart/form-data", "METHOD" => "get", "ACTION" => "/some/other/script"}, "test") + describe "when passed method, action, enctype" do + it "returns a 'form'-element with the passed method, action and enctype" do + output = @html.form("get", "/some/other/script", "multipart/form-data") + output.should equal_element("FORM", {"ENCTYPE" => "multipart/form-data", "METHOD" => "get", "ACTION" => "/some/other/script"}, "") + end + + it "includes the return value of the passed block when passed a block" do + output = @html.form("get", "/some/other/script", "multipart/form-data") { "test" } + output.should equal_element("FORM", {"ENCTYPE" => "multipart/form-data", "METHOD" => "get", "ACTION" => "/some/other/script"}, "test") + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/frame_spec.rb b/spec/ruby/library/cgi/htmlextension/frame_spec.rb index 2ddd4e1ef0..fef40849eb 100644 --- a/spec/ruby/library/cgi/htmlextension/frame_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/frame_spec.rb @@ -1,14 +1,17 @@ require_relative '../../../spec_helper' -require_relative 'fixtures/common' -require 'cgi' -describe "CGI::HtmlExtension#frame" do - before :each do - @html = CGISpecs.cgi_new("html4Fr") - end +ruby_version_is ""..."4.0" do + require_relative 'fixtures/common' + require 'cgi' + + describe "CGI::HtmlExtension#frame" do + before :each do + @html = CGISpecs.cgi_new("html4Fr") + end - it "initializes the HTML Generation methods for the Frameset version of HTML4" do - @html.frameset.should == "<FRAMESET></FRAMESET>" - @html.frameset { "link text" }.should == "<FRAMESET>link text</FRAMESET>" + it "initializes the HTML Generation methods for the Frameset version of HTML4" do + @html.frameset.should == "<FRAMESET></FRAMESET>" + @html.frameset { "link text" }.should == "<FRAMESET>link text</FRAMESET>" + end end end diff --git a/spec/ruby/library/cgi/htmlextension/frameset_spec.rb b/spec/ruby/library/cgi/htmlextension/frameset_spec.rb index baeb446593..3ad0a9c4d2 100644 --- a/spec/ruby/library/cgi/htmlextension/frameset_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/frameset_spec.rb @@ -1,14 +1,17 @@ require_relative '../../../spec_helper' -require_relative 'fixtures/common' -require 'cgi' -describe "CGI::HtmlExtension#frameset" do - before :each do - @html = CGISpecs.cgi_new("html4Fr") - end +ruby_version_is ""..."4.0" do + require_relative 'fixtures/common' + require 'cgi' + + describe "CGI::HtmlExtension#frameset" do + before :each do + @html = CGISpecs.cgi_new("html4Fr") + end - it "initializes the HTML Generation methods for the Frameset version of HTML4" do - @html.frameset.should == "<FRAMESET></FRAMESET>" - @html.frameset { "link text" }.should == "<FRAMESET>link text</FRAMESET>" + it "initializes the HTML Generation methods for the Frameset version of HTML4" do + @html.frameset.should == "<FRAMESET></FRAMESET>" + @html.frameset { "link text" }.should == "<FRAMESET>link text</FRAMESET>" + end end end diff --git a/spec/ruby/library/cgi/htmlextension/hidden_spec.rb b/spec/ruby/library/cgi/htmlextension/hidden_spec.rb index 52ebd8c261..b2323775f6 100644 --- a/spec/ruby/library/cgi/htmlextension/hidden_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/hidden_spec.rb @@ -1,59 +1,62 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#hidden" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an hidden-'input'-element without a name" do - output = @html.hidden - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "hidden"}, "", not_closed: true) + describe "CGI::HtmlExtension#hidden" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.hidden { "test" } - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "hidden"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns an hidden-'input'-element without a name" do + output = @html.hidden + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "hidden"}, "", not_closed: true) + end - describe "when passed name" do - it "returns an hidden-'input'-element with the passed name" do - output = @html.hidden("test") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.hidden { "test" } + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "hidden"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.hidden("test") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns an hidden-'input'-element with the passed name" do + output = @html.hidden("test") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden"}, "", not_closed: true) + end - describe "when passed name, value" do - it "returns an hidden-'input'-element with the passed name and value" do - output = @html.hidden("test", "some value") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden", "VALUE" => "some value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.hidden("test") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.hidden("test", "some value") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden", "VALUE" => "some value"}, "", not_closed: true) - end - end + describe "when passed name, value" do + it "returns an hidden-'input'-element with the passed name and value" do + output = @html.hidden("test", "some value") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden", "VALUE" => "some value"}, "", not_closed: true) + end - describe "when passed Hash" do - it "returns a checkbox-'input'-element using the passed Hash for attributes" do - attributes = { "NAME" => "test", "VALUE" => "some value" } - output = @html.hidden("test", "some value") - output.should equal_element("INPUT", attributes, "", not_closed: true) + it "ignores a passed block" do + output = @html.hidden("test", "some value") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "hidden", "VALUE" => "some value"}, "", not_closed: true) + end end - it "ignores a passed block" do - attributes = { "NAME" => "test", "VALUE" => "some value" } - output = @html.hidden("test", "some value") { "test" } - output.should equal_element("INPUT", attributes, "", not_closed: true) + describe "when passed Hash" do + it "returns a checkbox-'input'-element using the passed Hash for attributes" do + attributes = { "NAME" => "test", "VALUE" => "some value" } + output = @html.hidden("test", "some value") + output.should equal_element("INPUT", attributes, "", not_closed: true) + end + + it "ignores a passed block" do + attributes = { "NAME" => "test", "VALUE" => "some value" } + output = @html.hidden("test", "some value") { "test" } + output.should equal_element("INPUT", attributes, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/html_spec.rb b/spec/ruby/library/cgi/htmlextension/html_spec.rb index 5d89c82086..60a10fb6b4 100644 --- a/spec/ruby/library/cgi/htmlextension/html_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/html_spec.rb @@ -1,66 +1,69 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#html" do - before :each do - @html = CGISpecs.cgi_new - @html.stub!(:doctype).and_return("<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>") - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a self's doctype and an 'html'-element" do - expected = '<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE><HTML>' - @html.html.should == expected + describe "CGI::HtmlExtension#html" do + before :each do + @html = CGISpecs.cgi_new + @html.stub!(:doctype).and_return("<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>") end - it "includes the passed block when passed a block" do - expected = '<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE><HTML>test</HTML>' - @html.html { "test" }.should == expected - end - end + describe "when passed no arguments" do + it "returns a self's doctype and an 'html'-element" do + expected = '<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE><HTML>' + @html.html.should == expected + end - describe "when passed 'PRETTY'" do - it "returns pretty output when the passed String is 'PRETTY" do - expected = "<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>\n<HTML>\n" - @html.html("PRETTY").should == expected + it "includes the passed block when passed a block" do + expected = '<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE><HTML>test</HTML>' + @html.html { "test" }.should == expected + end end - it "includes the passed block when passed a block" do - expected = "<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>\n<HTML>\n test\n</HTML>\n" - @html.html("PRETTY") { "test" }.should == expected - end - end + describe "when passed 'PRETTY'" do + it "returns pretty output when the passed String is 'PRETTY" do + expected = "<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>\n<HTML>\n" + @html.html("PRETTY").should == expected + end - describe "when passed a Hash" do - it "returns an 'html'-element using the passed Hash for attributes" do - expected = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML BLA="TEST">' - @html.html("DOCTYPE" => '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">', "BLA" => "TEST").should == expected + it "includes the passed block when passed a block" do + expected = "<!DOCTYPE SUPA-FUNKAY-RUBYSPEC-DOCTYPE>\n<HTML>\n test\n</HTML>\n" + @html.html("PRETTY") { "test" }.should == expected + end end - it "omits the doctype when the Hash contains a 'DOCTYPE' entry that's false or nil" do - @html.html("DOCTYPE" => false).should == "<HTML>" - @html.html("DOCTYPE" => nil).should == "<HTML>" - end - end + describe "when passed a Hash" do + it "returns an 'html'-element using the passed Hash for attributes" do + expected = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML BLA="TEST">' + @html.html("DOCTYPE" => '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">', "BLA" => "TEST").should == expected + end - describe "when each HTML generation" do - it "returns the doctype declaration for HTML3" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' - CGISpecs.cgi_new("html3").html.should == expect + "<HTML>" - CGISpecs.cgi_new("html3").html { "html body" }.should == expect + "<HTML>html body</HTML>" + it "omits the doctype when the Hash contains a 'DOCTYPE' entry that's false or nil" do + @html.html("DOCTYPE" => false).should == "<HTML>" + @html.html("DOCTYPE" => nil).should == "<HTML>" + end end - it "returns the doctype declaration for HTML4" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' - CGISpecs.cgi_new("html4").html.should == expect + "<HTML>" - CGISpecs.cgi_new("html4").html { "html body" }.should == expect + "<HTML>html body</HTML>" - end + describe "when each HTML generation" do + it "returns the doctype declaration for HTML3" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">' + CGISpecs.cgi_new("html3").html.should == expect + "<HTML>" + CGISpecs.cgi_new("html3").html { "html body" }.should == expect + "<HTML>html body</HTML>" + end + + it "returns the doctype declaration for HTML4" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' + CGISpecs.cgi_new("html4").html.should == expect + "<HTML>" + CGISpecs.cgi_new("html4").html { "html body" }.should == expect + "<HTML>html body</HTML>" + end - it "returns the doctype declaration for the Transitional version of HTML4" do - expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' - CGISpecs.cgi_new("html4Tr").html.should == expect + "<HTML>" - CGISpecs.cgi_new("html4Tr").html { "html body" }.should == expect + "<HTML>html body</HTML>" + it "returns the doctype declaration for the Transitional version of HTML4" do + expect = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' + CGISpecs.cgi_new("html4Tr").html.should == expect + "<HTML>" + CGISpecs.cgi_new("html4Tr").html { "html body" }.should == expect + "<HTML>html body</HTML>" + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/image_button_spec.rb b/spec/ruby/library/cgi/htmlextension/image_button_spec.rb index d14bec9ca3..f8770119d4 100644 --- a/spec/ruby/library/cgi/htmlextension/image_button_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/image_button_spec.rb @@ -1,69 +1,72 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#image_button" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an image-'input'-element without a source image" do - output = @html.image_button - output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image"}, "", not_closed: true) + describe "CGI::HtmlExtension#image_button" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.image_button { "test" } - output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns an image-'input'-element without a source image" do + output = @html.image_button + output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image"}, "", not_closed: true) + end - describe "when passed src" do - it "returns an image-'input'-element with the passed src" do - output = @html.image_button("/path/to/image.png") - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.image_button { "test" } + output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.image_button("/path/to/image.png") { "test" } - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image"}, "", not_closed: true) - end - end + describe "when passed src" do + it "returns an image-'input'-element with the passed src" do + output = @html.image_button("/path/to/image.png") + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image"}, "", not_closed: true) + end - describe "when passed src, name" do - it "returns an image-'input'-element with the passed src and name" do - output = @html.image_button("/path/to/image.png", "test") - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.image_button("/path/to/image.png") { "test" } + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.image_button("/path/to/image.png", "test") { "test" } - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test"}, "", not_closed: true) - end - end + describe "when passed src, name" do + it "returns an image-'input'-element with the passed src and name" do + output = @html.image_button("/path/to/image.png", "test") + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test"}, "", not_closed: true) + end - describe "when passed src, name, alt" do - it "returns an image-'input'-element with the passed src, name and alt" do - output = @html.image_button("/path/to/image.png", "test", "alternative") - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test", "ALT" => "alternative"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.image_button("/path/to/image.png", "test") { "test" } + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.image_button("/path/to/image.png", "test", "alternative") { "test" } - output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test", "ALT" => "alternative"}, "", not_closed: true) - end - end + describe "when passed src, name, alt" do + it "returns an image-'input'-element with the passed src, name and alt" do + output = @html.image_button("/path/to/image.png", "test", "alternative") + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test", "ALT" => "alternative"}, "", not_closed: true) + end - describe "when passed Hash" do - it "returns a image-'input'-element using the passed Hash for attributes" do - output = @html.image_button("NAME" => "test", "VALUE" => "test-value") - output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image", "NAME" => "test", "VALUE" => "test-value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.image_button("/path/to/image.png", "test", "alternative") { "test" } + output.should equal_element("INPUT", {"SRC" => "/path/to/image.png", "TYPE" => "image", "NAME" => "test", "ALT" => "alternative"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.image_button("NAME" => "test", "VALUE" => "test-value") { "test" } - output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image", "NAME" => "test", "VALUE" => "test-value"}, "", not_closed: true) + describe "when passed Hash" do + it "returns a image-'input'-element using the passed Hash for attributes" do + output = @html.image_button("NAME" => "test", "VALUE" => "test-value") + output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image", "NAME" => "test", "VALUE" => "test-value"}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.image_button("NAME" => "test", "VALUE" => "test-value") { "test" } + output.should equal_element("INPUT", {"SRC" => "", "TYPE" => "image", "NAME" => "test", "VALUE" => "test-value"}, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/img_spec.rb b/spec/ruby/library/cgi/htmlextension/img_spec.rb index 994ae7fedf..a05cfdea48 100644 --- a/spec/ruby/library/cgi/htmlextension/img_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/img_spec.rb @@ -1,83 +1,86 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#img" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an 'img'-element without an src-url or alt-text" do - output = @html.img - output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) + describe "CGI::HtmlExtension#img" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.img { "test" } - output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns an 'img'-element without an src-url or alt-text" do + output = @html.img + output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) + end - describe "when passed src" do - it "returns an 'img'-element with the passed src-url" do - output = @html.img("/path/to/some/image.png") - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.img { "test" } + output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.img("/path/to/some/image.png") - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "" }, "", not_closed: true) - end - end + describe "when passed src" do + it "returns an 'img'-element with the passed src-url" do + output = @html.img("/path/to/some/image.png") + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "" }, "", not_closed: true) + end - describe "when passed src, alt" do - it "returns an 'img'-element with the passed src-url and the passed alt-text" do - output = @html.img("/path/to/some/image.png", "Alternative") - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.img("/path/to/some/image.png") + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "" }, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.img("/path/to/some/image.png", "Alternative") { "test" } - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative" }, "", not_closed: true) - end - end + describe "when passed src, alt" do + it "returns an 'img'-element with the passed src-url and the passed alt-text" do + output = @html.img("/path/to/some/image.png", "Alternative") + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative" }, "", not_closed: true) + end - describe "when passed src, alt, width" do - it "returns an 'img'-element with the passed src-url, the passed alt-text and the passed width" do - output = @html.img("/path/to/some/image.png", "Alternative", 40) - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.img("/path/to/some/image.png", "Alternative") { "test" } + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative" }, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.img("/path/to/some/image.png", "Alternative", 40) { "test" } - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40" }, "", not_closed: true) - end - end + describe "when passed src, alt, width" do + it "returns an 'img'-element with the passed src-url, the passed alt-text and the passed width" do + output = @html.img("/path/to/some/image.png", "Alternative", 40) + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40" }, "", not_closed: true) + end - describe "when passed src, alt, width, height" do - it "returns an 'img'-element with the passed src-url, the passed alt-text, the passed width and the passed height" do - output = @html.img("/path/to/some/image.png", "Alternative", 40, 60) - output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40", "HEIGHT" => "60" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.img("/path/to/some/image.png", "Alternative", 40) { "test" } + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40" }, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.img { "test" } - output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) - end - end + describe "when passed src, alt, width, height" do + it "returns an 'img'-element with the passed src-url, the passed alt-text, the passed width and the passed height" do + output = @html.img("/path/to/some/image.png", "Alternative", 40, 60) + output.should equal_element("IMG", { "SRC" => "/path/to/some/image.png", "ALT" => "Alternative", "WIDTH" => "40", "HEIGHT" => "60" }, "", not_closed: true) + end - describe "when passed Hash" do - it "returns an 'img'-element with the passed Hash as attributes" do - attributes = { "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 } - output = @html.img(attributes) - output.should equal_element("IMG", attributes, "", not_closed: true) + it "ignores a passed block" do + output = @html.img { "test" } + output.should equal_element("IMG", { "SRC" => "", "ALT" => "" }, "", not_closed: true) + end end - it "ignores a passed block" do - attributes = { "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 } - output = @html.img(attributes) { "test" } - output.should equal_element("IMG", attributes, "", not_closed: true) + describe "when passed Hash" do + it "returns an 'img'-element with the passed Hash as attributes" do + attributes = { "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 } + output = @html.img(attributes) + output.should equal_element("IMG", attributes, "", not_closed: true) + end + + it "ignores a passed block" do + attributes = { "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 } + output = @html.img(attributes) { "test" } + output.should equal_element("IMG", attributes, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/multipart_form_spec.rb b/spec/ruby/library/cgi/htmlextension/multipart_form_spec.rb index 0bf2042a33..4b56a7abfe 100644 --- a/spec/ruby/library/cgi/htmlextension/multipart_form_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/multipart_form_spec.rb @@ -1,64 +1,67 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#multipart_form" do - before :each do - @html = CGISpecs.cgi_new - @html.stub!(:script_name).and_return("/path/to/some/script.rb") - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a 'form'-element with it's enctype set to multipart" do - output = @html.multipart_form - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post" }, "") + describe "CGI::HtmlExtension#multipart_form" do + before :each do + @html = CGISpecs.cgi_new + @html.stub!(:script_name).and_return("/path/to/some/script.rb") end - it "includes the return value of the passed block when passed a block" do - output = @html.multipart_form { "test" } - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post" }, "test") - end - end + describe "when passed no arguments" do + it "returns a 'form'-element with its enctype set to multipart" do + output = @html.multipart_form + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post" }, "") + end - describe "when passed action" do - it "returns a 'form'-element with the passed action" do - output = @html.multipart_form("/some/other/script.rb") - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "") + it "includes the return value of the passed block when passed a block" do + output = @html.multipart_form { "test" } + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post" }, "test") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.multipart_form("/some/other/script.rb") { "test" } - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "test") - end - end + describe "when passed action" do + it "returns a 'form'-element with the passed action" do + output = @html.multipart_form("/some/other/script.rb") + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "") + end - describe "when passed action, enctype" do - it "returns a 'form'-element with the passed action and enctype" do - output = @html.multipart_form("/some/other/script.rb", "application/x-www-form-urlencoded") - output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "") + it "includes the return value of the passed block when passed a block" do + output = @html.multipart_form("/some/other/script.rb") { "test" } + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "test") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.multipart_form("/some/other/script.rb", "application/x-www-form-urlencoded") { "test" } - output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "test") + describe "when passed action, enctype" do + it "returns a 'form'-element with the passed action and enctype" do + output = @html.multipart_form("/some/other/script.rb", "application/x-www-form-urlencoded") + output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "") + end + + it "includes the return value of the passed block when passed a block" do + output = @html.multipart_form("/some/other/script.rb", "application/x-www-form-urlencoded") { "test" } + output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "post", "ACTION" => "/some/other/script.rb" }, "test") + end end - end - describe "when passed Hash" do - it "returns a 'form'-element with the passed Hash as attributes" do - output = @html.multipart_form("ID" => "test") - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ID" => "test" }, "") + describe "when passed Hash" do + it "returns a 'form'-element with the passed Hash as attributes" do + output = @html.multipart_form("ID" => "test") + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ID" => "test" }, "") - output = @html.multipart_form("ID" => "test", "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get") - output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ID" => "test" }, "") - end + output = @html.multipart_form("ID" => "test", "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get") + output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ID" => "test" }, "") + end - it "includes the return value of the passed block when passed a block" do - output = @html.multipart_form("ID" => "test") { "test" } - output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ID" => "test" }, "test") + it "includes the return value of the passed block when passed a block" do + output = @html.multipart_form("ID" => "test") { "test" } + output.should equal_element("FORM", { "ENCTYPE" => "multipart/form-data", "METHOD" => "post", "ID" => "test" }, "test") - output = @html.multipart_form("ID" => "test", "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get") { "test" } - output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ID" => "test" }, "test") + output = @html.multipart_form("ID" => "test", "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get") { "test" } + output.should equal_element("FORM", { "ENCTYPE" => "application/x-www-form-urlencoded", "METHOD" => "get", "ID" => "test" }, "test") + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/password_field_spec.rb b/spec/ruby/library/cgi/htmlextension/password_field_spec.rb index 683bc428ba..0fefdd5c45 100644 --- a/spec/ruby/library/cgi/htmlextension/password_field_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/password_field_spec.rb @@ -1,84 +1,87 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#password_field" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an password-'input'-element without a name" do - output = @html.password_field - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + describe "CGI::HtmlExtension#password_field" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.password_field { "test" } - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns an password-'input'-element without a name" do + output = @html.password_field + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name" do - it "returns an password-'input'-element with the passed name" do - output = @html.password_field("test") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.password_field { "test" } + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.password_field("test") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns an password-'input'-element with the passed name" do + output = @html.password_field("test") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name, value" do - it "returns an password-'input'-element with the passed name and value" do - output = @html.password_field("test", "some value") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.password_field("test") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.password_field("test", "some value") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed name, value" do + it "returns an password-'input'-element with the passed name and value" do + output = @html.password_field("test", "some value") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name, value, size" do - it "returns an password-'input'-element with the passed name, value and size" do - output = @html.password_field("test", "some value", 60) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.password_field("test", "some value") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.password_field("test", "some value", 60) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) - end - end + describe "when passed name, value, size" do + it "returns an password-'input'-element with the passed name, value and size" do + output = @html.password_field("test", "some value", 60) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + end - describe "when passed name, value, size, maxlength" do - it "returns an password-'input'-element with the passed name, value, size and maxlength" do - output = @html.password_field("test", "some value", 60, 12) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + it "ignores a passed block" do + output = @html.password_field("test", "some value", 60) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.password_field("test", "some value", 60, 12) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + describe "when passed name, value, size, maxlength" do + it "returns an password-'input'-element with the passed name, value, size and maxlength" do + output = @html.password_field("test", "some value", 60, 12) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.password_field("test", "some value", 60, 12) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "password", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + end end - end - describe "when passed Hash" do - it "returns a checkbox-'input'-element using the passed Hash for attributes" do - output = @html.password_field("NAME" => "test", "VALUE" => "some value") - output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "password" }, "", not_closed: true) + describe "when passed Hash" do + it "returns a checkbox-'input'-element using the passed Hash for attributes" do + output = @html.password_field("NAME" => "test", "VALUE" => "some value") + output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "password" }, "", not_closed: true) - output = @html.password_field("TYPE" => "hidden") - output.should equal_element("INPUT", {"TYPE" => "password"}, "", not_closed: true) - end + output = @html.password_field("TYPE" => "hidden") + output.should equal_element("INPUT", {"TYPE" => "password"}, "", not_closed: true) + end - it "ignores a passed block" do - output = @html.password_field("NAME" => "test", "VALUE" => "some value") { "test" } - output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "password" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.password_field("NAME" => "test", "VALUE" => "some value") { "test" } + output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "password" }, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/popup_menu_spec.rb b/spec/ruby/library/cgi/htmlextension/popup_menu_spec.rb index 3462be09b0..7452d15317 100644 --- a/spec/ruby/library/cgi/htmlextension/popup_menu_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/popup_menu_spec.rb @@ -1,8 +1,11 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -require_relative 'shared/popup_menu' -describe "CGI::HtmlExtension#popup_menu" do - it_behaves_like :cgi_htmlextension_popup_menu, :popup_menu +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' + require_relative 'shared/popup_menu' + + describe "CGI::HtmlExtension#popup_menu" do + it_behaves_like :cgi_htmlextension_popup_menu, :popup_menu + end end diff --git a/spec/ruby/library/cgi/htmlextension/radio_button_spec.rb b/spec/ruby/library/cgi/htmlextension/radio_button_spec.rb index 3dc3c879b5..8458685cdc 100644 --- a/spec/ruby/library/cgi/htmlextension/radio_button_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/radio_button_spec.rb @@ -1,77 +1,80 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#radio_button" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a radio-'input'-element without a name" do - output = @html.radio_button - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "radio"}, "", not_closed: true) + describe "CGI::HtmlExtension#radio_button" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.radio_button { "test" } - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "radio"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns a radio-'input'-element without a name" do + output = @html.radio_button + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "radio"}, "", not_closed: true) + end - describe "when passed name" do - it "returns a radio-'input'-element with the passed name" do - output = @html.radio_button("test") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.radio_button { "test" } + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "radio"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.radio_button("test") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns a radio-'input'-element with the passed name" do + output = @html.radio_button("test") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio"}, "", not_closed: true) + end - describe "CGI::HtmlExtension#checkbox when passed name, value" do - it "returns a radio-'input'-element with the passed name and value" do - output = @html.radio_button("test", "test-value") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.radio_button("test") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.radio_button("test", "test-value") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + describe "CGI::HtmlExtension#checkbox when passed name, value" do + it "returns a radio-'input'-element with the passed name and value" do + output = @html.radio_button("test", "test-value") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.radio_button("test", "test-value") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + end end - end - describe "when passed name, value, checked" do - it "returns a checked radio-'input'-element with the passed name and value when checked is true" do - output = @html.radio_button("test", "test-value", true) - output.should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + describe "when passed name, value, checked" do + it "returns a checked radio-'input'-element with the passed name and value when checked is true" do + output = @html.radio_button("test", "test-value", true) + output.should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) - output = @html.radio_button("test", "test-value", false) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + output = @html.radio_button("test", "test-value", false) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) - output = @html.radio_button("test", "test-value", nil) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) - end + output = @html.radio_button("test", "test-value", nil) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + end - it "ignores a passed block" do - output = @html.radio_button("test", "test-value", nil) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.radio_button("test", "test-value", nil) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "test-value"}, "", not_closed: true) + end end - end - describe "when passed Hash" do - it "returns a radio-'input'-element using the passed Hash for attributes" do - attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} - output = @html.radio_button(attributes) - output.should equal_element("INPUT", attributes, "", not_closed: true) - end + describe "when passed Hash" do + it "returns a radio-'input'-element using the passed Hash for attributes" do + attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} + output = @html.radio_button(attributes) + output.should equal_element("INPUT", attributes, "", not_closed: true) + end - it "ignores a passed block" do - attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} - output = @html.radio_button(attributes) { "test" } - output.should equal_element("INPUT", attributes, "", not_closed: true) + it "ignores a passed block" do + attributes = {"NAME" => "test", "VALUE" => "test-value", "CHECKED" => true} + output = @html.radio_button(attributes) { "test" } + output.should equal_element("INPUT", attributes, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/radio_group_spec.rb b/spec/ruby/library/cgi/htmlextension/radio_group_spec.rb index 1bfd43449d..fd925a5165 100644 --- a/spec/ruby/library/cgi/htmlextension/radio_group_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/radio_group_spec.rb @@ -1,77 +1,80 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#radio_group" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed name, values ..." do - it "returns a sequence of 'radio'-elements with the passed name and the passed values" do - output = CGISpecs.split(@html.radio_group("test", "foo", "bar", "baz")) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + describe "CGI::HtmlExtension#radio_group" do + before :each do + @html = CGISpecs.cgi_new end - it "allows passing a value inside an Array" do - output = CGISpecs.split(@html.radio_group("test", ["foo"], "bar", ["baz"])) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) - end + describe "when passed name, values ..." do + it "returns a sequence of 'radio'-elements with the passed name and the passed values" do + output = CGISpecs.split(@html.radio_group("test", "foo", "bar", "baz")) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + end - it "allows passing a value as an Array containing the value and the checked state or a label" do - output = CGISpecs.split(@html.radio_group("test", ["foo"], ["bar", true], ["baz", "label for baz"])) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "label for baz", not_closed: true) - end + it "allows passing a value inside an Array" do + output = CGISpecs.split(@html.radio_group("test", ["foo"], "bar", ["baz"])) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + end - # TODO: CGI does not like passing false instead of true. - it "allows passing a value as an Array containing the value, a label and the checked state" do - output = CGISpecs.split(@html.radio_group("test", ["foo", "label for foo", true], ["bar", "label for bar", false], ["baz", "label for baz", true])) - output[0].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "label for foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "label for bar", not_closed: true) - output[2].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "label for baz", not_closed: true) - end + it "allows passing a value as an Array containing the value and the checked state or a label" do + output = CGISpecs.split(@html.radio_group("test", ["foo"], ["bar", true], ["baz", "label for baz"])) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "label for baz", not_closed: true) + end - it "returns an empty String when passed no values" do - @html.radio_group("test").should == "" - end + # TODO: CGI does not like passing false instead of true. + it "allows passing a value as an Array containing the value, a label and the checked state" do + output = CGISpecs.split(@html.radio_group("test", ["foo", "label for foo", true], ["bar", "label for bar", false], ["baz", "label for baz", true])) + output[0].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "label for foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "label for bar", not_closed: true) + output[2].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "label for baz", not_closed: true) + end + + it "returns an empty String when passed no values" do + @html.radio_group("test").should == "" + end - it "ignores a passed block" do - output = CGISpecs.split(@html.radio_group("test", "foo", "bar", "baz") { "test" }) - output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + it "ignores a passed block" do + output = CGISpecs.split(@html.radio_group("test", "foo", "bar", "baz") { "test" }) + output[0].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "test", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + end end - end - describe "when passed Hash" do - it "uses the passed Hash to generate the radio sequence" do - output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + describe "when passed Hash" do + it "uses the passed Hash to generate the radio sequence" do + output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) - output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) - output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "1"}, "Foo", not_closed: true) - output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "radio", "VALUE" => "2"}, "Bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "Baz"}, "Baz", not_closed: true) - end + output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "1"}, "Foo", not_closed: true) + output[1].should equal_element("INPUT", {"CHECKED" => true, "NAME" => "name", "TYPE" => "radio", "VALUE" => "2"}, "Bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "Baz"}, "Baz", not_closed: true) + end - it "ignores a passed block" do - output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) { "test" }) - output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) - output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) - output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + it "ignores a passed block" do + output = CGISpecs.split(@html.radio_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) { "test" }) + output[0].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "foo"}, "foo", not_closed: true) + output[1].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "bar"}, "bar", not_closed: true) + output[2].should equal_element("INPUT", {"NAME" => "name", "TYPE" => "radio", "VALUE" => "baz"}, "baz", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/reset_spec.rb b/spec/ruby/library/cgi/htmlextension/reset_spec.rb index 86fa25fc8a..80e4441b16 100644 --- a/spec/ruby/library/cgi/htmlextension/reset_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/reset_spec.rb @@ -1,57 +1,60 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#reset" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a reset-'input'-element" do - output = @html.reset - output.should equal_element("INPUT", {"TYPE" => "reset"}, "", not_closed: true) + describe "CGI::HtmlExtension#reset" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.reset { "test" } - output.should equal_element("INPUT", {"TYPE" => "reset"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns a reset-'input'-element" do + output = @html.reset + output.should equal_element("INPUT", {"TYPE" => "reset"}, "", not_closed: true) + end - describe "when passed value" do - it "returns a reset-'input'-element with the passed value" do - output = @html.reset("Example") - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.reset { "test" } + output.should equal_element("INPUT", {"TYPE" => "reset"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.reset("Example") { "test" } - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) - end - end + describe "when passed value" do + it "returns a reset-'input'-element with the passed value" do + output = @html.reset("Example") + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + end - describe "when passed value, name" do - it "returns a reset-'input'-element with the passed value and the passed name" do - output = @html.reset("Example", "test-name") - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.reset("Example") { "test" } + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.reset("Example", "test-name") { "test" } - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) - end - end + describe "when passed value, name" do + it "returns a reset-'input'-element with the passed value and the passed name" do + output = @html.reset("Example", "test-name") + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + end - describe "when passed Hash" do - it "returns a reset-'input'-element with the passed value" do - output = @html.reset("Example") - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.reset("Example", "test-name") { "test" } + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.reset("Example") { "test" } - output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + describe "when passed Hash" do + it "returns a reset-'input'-element with the passed value" do + output = @html.reset("Example") + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.reset("Example") { "test" } + output.should equal_element("INPUT", {"TYPE" => "reset", "VALUE" => "Example"}, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/scrolling_list_spec.rb b/spec/ruby/library/cgi/htmlextension/scrolling_list_spec.rb index 4eb0c86c1a..b565444679 100644 --- a/spec/ruby/library/cgi/htmlextension/scrolling_list_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/scrolling_list_spec.rb @@ -1,8 +1,11 @@ require_relative '../../../spec_helper' -require_relative 'fixtures/common' -require 'cgi' -require_relative 'shared/popup_menu' -describe "CGI::HtmlExtension#scrolling_list" do - it_behaves_like :cgi_htmlextension_popup_menu, :scrolling_list +ruby_version_is ""..."4.0" do + require_relative 'fixtures/common' + require 'cgi' + require_relative 'shared/popup_menu' + + describe "CGI::HtmlExtension#scrolling_list" do + it_behaves_like :cgi_htmlextension_popup_menu, :scrolling_list + end end diff --git a/spec/ruby/library/cgi/htmlextension/submit_spec.rb b/spec/ruby/library/cgi/htmlextension/submit_spec.rb index 063891b959..bb6e079c4e 100644 --- a/spec/ruby/library/cgi/htmlextension/submit_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/submit_spec.rb @@ -1,57 +1,60 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#submit" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns a submit-'input'-element" do - output = @html.submit - output.should equal_element("INPUT", {"TYPE" => "submit"}, "", not_closed: true) + describe "CGI::HtmlExtension#submit" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.submit { "test" } - output.should equal_element("INPUT", {"TYPE" => "submit"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns a submit-'input'-element" do + output = @html.submit + output.should equal_element("INPUT", {"TYPE" => "submit"}, "", not_closed: true) + end - describe "when passed value" do - it "returns a submit-'input'-element with the passed value" do - output = @html.submit("Example") - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.submit { "test" } + output.should equal_element("INPUT", {"TYPE" => "submit"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.submit("Example") { "test" } - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) - end - end + describe "when passed value" do + it "returns a submit-'input'-element with the passed value" do + output = @html.submit("Example") + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + end - describe "when passed value, name" do - it "returns a submit-'input'-element with the passed value and the passed name" do - output = @html.submit("Example", "test-name") - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.submit("Example") { "test" } + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.submit("Example", "test-name") { "test" } - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) - end - end + describe "when passed value, name" do + it "returns a submit-'input'-element with the passed value and the passed name" do + output = @html.submit("Example", "test-name") + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + end - describe "when passed Hash" do - it "returns a submit-'input'-element with the passed value" do - output = @html.submit("Example") - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.submit("Example", "test-name") { "test" } + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example", "NAME" => "test-name"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.submit("Example") { "test" } - output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + describe "when passed Hash" do + it "returns a submit-'input'-element with the passed value" do + output = @html.submit("Example") + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.submit("Example") { "test" } + output.should equal_element("INPUT", {"TYPE" => "submit", "VALUE" => "Example"}, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/text_field_spec.rb b/spec/ruby/library/cgi/htmlextension/text_field_spec.rb index 44b5a5e69f..37e13e3746 100644 --- a/spec/ruby/library/cgi/htmlextension/text_field_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/text_field_spec.rb @@ -1,84 +1,87 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#text_field" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an text-'input'-element without a name" do - output = @html.text_field - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + describe "CGI::HtmlExtension#text_field" do + before :each do + @html = CGISpecs.cgi_new end - it "ignores a passed block" do - output = @html.text_field { "test" } - output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed no arguments" do + it "returns an text-'input'-element without a name" do + output = @html.text_field + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name" do - it "returns an text-'input'-element with the passed name" do - output = @html.text_field("test") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.text_field { "test" } + output.should equal_element("INPUT", {"NAME" => "", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.text_field("test") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed name" do + it "returns an text-'input'-element with the passed name" do + output = @html.text_field("test") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name, value" do - it "returns an text-'input'-element with the passed name and value" do - output = @html.text_field("test", "some value") - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.text_field("test") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.text_field("test", "some value") { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) - end - end + describe "when passed name, value" do + it "returns an text-'input'-element with the passed name and value" do + output = @html.text_field("test", "some value") + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + end - describe "when passed name, value, size" do - it "returns an text-'input'-element with the passed name, value and size" do - output = @html.text_field("test", "some value", 60) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + it "ignores a passed block" do + output = @html.text_field("test", "some value") { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "40"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.text_field("test", "some value", 60) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) - end - end + describe "when passed name, value, size" do + it "returns an text-'input'-element with the passed name, value and size" do + output = @html.text_field("test", "some value", 60) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + end - describe "when passed name, value, size, maxlength" do - it "returns an text-'input'-element with the passed name, value, size and maxlength" do - output = @html.text_field("test", "some value", 60, 12) - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + it "ignores a passed block" do + output = @html.text_field("test", "some value", 60) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60"}, "", not_closed: true) + end end - it "ignores a passed block" do - output = @html.text_field("test", "some value", 60, 12) { "test" } - output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + describe "when passed name, value, size, maxlength" do + it "returns an text-'input'-element with the passed name, value, size and maxlength" do + output = @html.text_field("test", "some value", 60, 12) + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + end + + it "ignores a passed block" do + output = @html.text_field("test", "some value", 60, 12) { "test" } + output.should equal_element("INPUT", {"NAME" => "test", "TYPE" => "text", "VALUE" => "some value", "SIZE" => "60", "MAXLENGTH" => 12}, "", not_closed: true) + end end - end - describe "when passed Hash" do - it "returns a checkbox-'input'-element using the passed Hash for attributes" do - output = @html.text_field("NAME" => "test", "VALUE" => "some value") - output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "text" }, "", not_closed: true) + describe "when passed Hash" do + it "returns a checkbox-'input'-element using the passed Hash for attributes" do + output = @html.text_field("NAME" => "test", "VALUE" => "some value") + output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "text" }, "", not_closed: true) - output = @html.text_field("TYPE" => "hidden") - output.should equal_element("INPUT", {"TYPE" => "text"}, "", not_closed: true) - end + output = @html.text_field("TYPE" => "hidden") + output.should equal_element("INPUT", {"TYPE" => "text"}, "", not_closed: true) + end - it "ignores a passed block" do - output = @html.text_field("NAME" => "test", "VALUE" => "some value") { "test" } - output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "text" }, "", not_closed: true) + it "ignores a passed block" do + output = @html.text_field("NAME" => "test", "VALUE" => "some value") { "test" } + output.should equal_element("INPUT", { "NAME" => "test", "VALUE" => "some value", "TYPE" => "text" }, "", not_closed: true) + end end end end diff --git a/spec/ruby/library/cgi/htmlextension/textarea_spec.rb b/spec/ruby/library/cgi/htmlextension/textarea_spec.rb index db84a973d2..99c6d3dd2d 100644 --- a/spec/ruby/library/cgi/htmlextension/textarea_spec.rb +++ b/spec/ruby/library/cgi/htmlextension/textarea_spec.rb @@ -1,73 +1,76 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'fixtures/common' -describe "CGI::HtmlExtension#textarea" do - before :each do - @html = CGISpecs.cgi_new - end +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'fixtures/common' - describe "when passed no arguments" do - it "returns an 'textarea'-element without a name" do - output = @html.textarea - output.should equal_element("TEXTAREA", {"NAME" => "", "COLS" => "70", "ROWS" => "10"}, "") + describe "CGI::HtmlExtension#textarea" do + before :each do + @html = CGISpecs.cgi_new end - it "includes the return value of the passed block when passed a block" do - output = @html.textarea { "Example" } - output.should equal_element("TEXTAREA", {"NAME" => "", "COLS" => "70", "ROWS" => "10"}, "Example") - end - end + describe "when passed no arguments" do + it "returns an 'textarea'-element without a name" do + output = @html.textarea + output.should equal_element("TEXTAREA", {"NAME" => "", "COLS" => "70", "ROWS" => "10"}, "") + end - describe "when passed name" do - it "returns an 'textarea'-element with the passed name" do - output = @html.textarea("test") - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "70", "ROWS" => "10"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.textarea { "Example" } + output.should equal_element("TEXTAREA", {"NAME" => "", "COLS" => "70", "ROWS" => "10"}, "Example") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.textarea("test") { "Example" } - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "70", "ROWS" => "10"}, "Example") - end - end + describe "when passed name" do + it "returns an 'textarea'-element with the passed name" do + output = @html.textarea("test") + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "70", "ROWS" => "10"}, "") + end - describe "when passed name, cols" do - it "returns an 'textarea'-element with the passed name and the passed amount of columns" do - output = @html.textarea("test", 40) - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "10"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.textarea("test") { "Example" } + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "70", "ROWS" => "10"}, "Example") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.textarea("test", 40) { "Example" } - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "10"}, "Example") - end - end + describe "when passed name, cols" do + it "returns an 'textarea'-element with the passed name and the passed amount of columns" do + output = @html.textarea("test", 40) + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "10"}, "") + end - describe "when passed name, cols, rows" do - it "returns an 'textarea'-element with the passed name, the passed amount of columns and the passed number of rows" do - output = @html.textarea("test", 40, 5) - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "5"}, "") + it "includes the return value of the passed block when passed a block" do + output = @html.textarea("test", 40) { "Example" } + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "10"}, "Example") + end end - it "includes the return value of the passed block when passed a block" do - output = @html.textarea("test", 40, 5) { "Example" } - output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "5"}, "Example") + describe "when passed name, cols, rows" do + it "returns an 'textarea'-element with the passed name, the passed amount of columns and the passed number of rows" do + output = @html.textarea("test", 40, 5) + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "5"}, "") + end + + it "includes the return value of the passed block when passed a block" do + output = @html.textarea("test", 40, 5) { "Example" } + output.should equal_element("TEXTAREA", {"NAME" => "test", "COLS" => "40", "ROWS" => "5"}, "Example") + end end - end - describe "when passed Hash" do - it "uses the passed Hash as attributes" do - @html.textarea("ID" => "test").should == '<TEXTAREA ID="test"></TEXTAREA>' + describe "when passed Hash" do + it "uses the passed Hash as attributes" do + @html.textarea("ID" => "test").should == '<TEXTAREA ID="test"></TEXTAREA>' - attributes = {"ID" => "test-id", "NAME" => "test-name"} - output = @html.textarea(attributes) - output.should equal_element("TEXTAREA", attributes, "") - end + attributes = {"ID" => "test-id", "NAME" => "test-name"} + output = @html.textarea(attributes) + output.should equal_element("TEXTAREA", attributes, "") + end - it "includes the return value of the passed block when passed a block" do - attributes = {"ID" => "test-id", "NAME" => "test-name"} - output = @html.textarea(attributes) { "test" } - output.should equal_element("TEXTAREA", attributes, "test") + it "includes the return value of the passed block when passed a block" do + attributes = {"ID" => "test-id", "NAME" => "test-name"} + output = @html.textarea(attributes) { "test" } + output.should equal_element("TEXTAREA", attributes, "test") + end end end end diff --git a/spec/ruby/library/cgi/http_header_spec.rb b/spec/ruby/library/cgi/http_header_spec.rb index 4094bebed3..8d9f3fe9b8 100644 --- a/spec/ruby/library/cgi/http_header_spec.rb +++ b/spec/ruby/library/cgi/http_header_spec.rb @@ -1,8 +1,11 @@ require_relative '../../spec_helper' -require 'cgi' -require_relative 'shared/http_header' +ruby_version_is ""..."4.0" do + require 'cgi' -describe "CGI#http_header" do - it_behaves_like :cgi_http_header, :http_header + require_relative 'shared/http_header' + + describe "CGI#http_header" do + it_behaves_like :cgi_http_header, :http_header + end end diff --git a/spec/ruby/library/cgi/initialize_spec.rb b/spec/ruby/library/cgi/initialize_spec.rb index f794f157f0..6135522c54 100644 --- a/spec/ruby/library/cgi/initialize_spec.rb +++ b/spec/ruby/library/cgi/initialize_spec.rb @@ -1,133 +1,136 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI#initialize" do - it "is private" do - CGI.should have_private_instance_method(:initialize) - end -end +ruby_version_is ""..."4.0" do + require 'cgi' -describe "CGI#initialize when passed no arguments" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.allocate - end - - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end - - it "extends self with CGI::QueryExtension" do - @cgi.send(:initialize) - @cgi.should be_kind_of(CGI::QueryExtension) + describe "CGI#initialize" do + it "is private" do + CGI.private_instance_methods(false).should.include?(:initialize) + end end - it "does not extend self with CGI::HtmlExtension" do - @cgi.send(:initialize) - @cgi.should_not be_kind_of(CGI::HtmlExtension) - end + describe "CGI#initialize when passed no arguments" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.allocate + end - it "does not extend self with any of the other HTML modules" do - @cgi.send(:initialize) - @cgi.should_not be_kind_of(CGI::Html3) - @cgi.should_not be_kind_of(CGI::HtmlExtension) - @cgi.should_not be_kind_of(CGI::Html4) - @cgi.should_not be_kind_of(CGI::Html4Tr) - @cgi.should_not be_kind_of(CGI::Html4Fr) - end + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "sets #cookies based on ENV['HTTP_COOKIE']" do - begin - old_env, ENV["HTTP_COOKIE"] = ENV["HTTP_COOKIE"], "test=test yay" + it "extends self with CGI::QueryExtension" do @cgi.send(:initialize) - @cgi.cookies.should == { "test"=>[ "test yay" ] } - ensure - ENV["HTTP_COOKIE"] = old_env + @cgi.should.is_a?(CGI::QueryExtension) end - end - it "sets #params based on ENV['QUERY_STRING'] when ENV['REQUEST_METHOD'] is GET" do - begin - old_env_query, ENV["QUERY_STRING"] = ENV["QUERY_STRING"], "?test=a&test2=b" - old_env_method, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], "GET" + it "does not extend self with CGI::HtmlExtension" do @cgi.send(:initialize) - @cgi.params.should == { "test2" => ["b"], "?test" => ["a"] } - ensure - ENV["QUERY_STRING"] = old_env_query - ENV["REQUEST_METHOD"] = old_env_method + @cgi.should_not.is_a?(CGI::HtmlExtension) end - end - it "sets #params based on ENV['QUERY_STRING'] when ENV['REQUEST_METHOD'] is HEAD" do - begin - old_env_query, ENV["QUERY_STRING"] = ENV["QUERY_STRING"], "?test=a&test2=b" - old_env_method, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], "HEAD" + it "does not extend self with any of the other HTML modules" do @cgi.send(:initialize) - @cgi.params.should == { "test2" => ["b"], "?test" => ["a"] } - ensure - ENV["QUERY_STRING"] = old_env_query - ENV["REQUEST_METHOD"] = old_env_method + @cgi.should_not.is_a?(CGI::HtmlExtension) + @cgi.should_not.is_a?(CGI::Html3) + @cgi.should_not.is_a?(CGI::Html4) + @cgi.should_not.is_a?(CGI::Html4Tr) + @cgi.should_not.is_a?(CGI::Html4Fr) end - end -end -describe "CGI#initialize when passed type" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.allocate - end + it "sets #cookies based on ENV['HTTP_COOKIE']" do + begin + old_env, ENV["HTTP_COOKIE"] = ENV["HTTP_COOKIE"], "test=test yay" + @cgi.send(:initialize) + @cgi.cookies.should == { "test"=>[ "test yay" ] } + ensure + ENV["HTTP_COOKIE"] = old_env + end + end - after :each do - ENV['REQUEST_METHOD'] = @old_request_method + it "sets #params based on ENV['QUERY_STRING'] when ENV['REQUEST_METHOD'] is GET" do + begin + old_env_query, ENV["QUERY_STRING"] = ENV["QUERY_STRING"], "?test=a&test2=b" + old_env_method, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], "GET" + @cgi.send(:initialize) + @cgi.params.should == { "test2" => ["b"], "?test" => ["a"] } + ensure + ENV["QUERY_STRING"] = old_env_query + ENV["REQUEST_METHOD"] = old_env_method + end + end + + it "sets #params based on ENV['QUERY_STRING'] when ENV['REQUEST_METHOD'] is HEAD" do + begin + old_env_query, ENV["QUERY_STRING"] = ENV["QUERY_STRING"], "?test=a&test2=b" + old_env_method, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], "HEAD" + @cgi.send(:initialize) + @cgi.params.should == { "test2" => ["b"], "?test" => ["a"] } + ensure + ENV["QUERY_STRING"] = old_env_query + ENV["REQUEST_METHOD"] = old_env_method + end + end end + describe "CGI#initialize when passed type" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.allocate + end - it "extends self with CGI::QueryExtension" do - @cgi.send(:initialize, "test") - @cgi.should be_kind_of(CGI::QueryExtension) - end + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "extends self with CGI::QueryExtension, CGI::Html3 and CGI::HtmlExtension when the passed type is 'html3'" do - @cgi.send(:initialize, "html3") - @cgi.should be_kind_of(CGI::Html3) - @cgi.should be_kind_of(CGI::HtmlExtension) - @cgi.should be_kind_of(CGI::QueryExtension) - @cgi.should_not be_kind_of(CGI::Html4) - @cgi.should_not be_kind_of(CGI::Html4Tr) - @cgi.should_not be_kind_of(CGI::Html4Fr) - end + it "extends self with CGI::QueryExtension" do + @cgi.send(:initialize, "test") + @cgi.should.is_a?(CGI::QueryExtension) + end - it "extends self with CGI::QueryExtension, CGI::Html4 and CGI::HtmlExtension when the passed type is 'html4'" do - @cgi.send(:initialize, "html4") - @cgi.should be_kind_of(CGI::Html4) - @cgi.should be_kind_of(CGI::HtmlExtension) - @cgi.should be_kind_of(CGI::QueryExtension) + it "extends self with CGI::QueryExtension, CGI::Html3 and CGI::HtmlExtension when the passed type is 'html3'" do + @cgi.send(:initialize, "html3") + @cgi.should.is_a?(CGI::Html3) + @cgi.should.is_a?(CGI::HtmlExtension) + @cgi.should.is_a?(CGI::QueryExtension) - @cgi.should_not be_kind_of(CGI::Html3) - @cgi.should_not be_kind_of(CGI::Html4Tr) - @cgi.should_not be_kind_of(CGI::Html4Fr) - end + @cgi.should_not.is_a?(CGI::Html4) + @cgi.should_not.is_a?(CGI::Html4Tr) + @cgi.should_not.is_a?(CGI::Html4Fr) + end - it "extends self with CGI::QueryExtension, CGI::Html4Tr and CGI::HtmlExtension when the passed type is 'html4Tr'" do - @cgi.send(:initialize, "html4Tr") - @cgi.should be_kind_of(CGI::Html4Tr) - @cgi.should be_kind_of(CGI::HtmlExtension) - @cgi.should be_kind_of(CGI::QueryExtension) + it "extends self with CGI::QueryExtension, CGI::Html4 and CGI::HtmlExtension when the passed type is 'html4'" do + @cgi.send(:initialize, "html4") + @cgi.should.is_a?(CGI::Html4) + @cgi.should.is_a?(CGI::HtmlExtension) + @cgi.should.is_a?(CGI::QueryExtension) - @cgi.should_not be_kind_of(CGI::Html3) - @cgi.should_not be_kind_of(CGI::Html4) - @cgi.should_not be_kind_of(CGI::Html4Fr) - end + @cgi.should_not.is_a?(CGI::Html3) + @cgi.should_not.is_a?(CGI::Html4Tr) + @cgi.should_not.is_a?(CGI::Html4Fr) + end - it "extends self with CGI::QueryExtension, CGI::Html4Tr, CGI::Html4Fr and CGI::HtmlExtension when the passed type is 'html4Fr'" do - @cgi.send(:initialize, "html4Fr") - @cgi.should be_kind_of(CGI::Html4Tr) - @cgi.should be_kind_of(CGI::Html4Fr) - @cgi.should be_kind_of(CGI::HtmlExtension) - @cgi.should be_kind_of(CGI::QueryExtension) + it "extends self with CGI::QueryExtension, CGI::Html4Tr and CGI::HtmlExtension when the passed type is 'html4Tr'" do + @cgi.send(:initialize, "html4Tr") + @cgi.should.is_a?(CGI::Html4Tr) + @cgi.should.is_a?(CGI::HtmlExtension) + @cgi.should.is_a?(CGI::QueryExtension) - @cgi.should_not be_kind_of(CGI::Html3) - @cgi.should_not be_kind_of(CGI::Html4) + @cgi.should_not.is_a?(CGI::Html3) + @cgi.should_not.is_a?(CGI::Html4) + @cgi.should_not.is_a?(CGI::Html4Fr) + end + + it "extends self with CGI::QueryExtension, CGI::Html4Tr, CGI::Html4Fr and CGI::HtmlExtension when the passed type is 'html4Fr'" do + @cgi.send(:initialize, "html4Fr") + @cgi.should.is_a?(CGI::Html4Tr) + @cgi.should.is_a?(CGI::Html4Fr) + @cgi.should.is_a?(CGI::HtmlExtension) + @cgi.should.is_a?(CGI::QueryExtension) + + @cgi.should_not.is_a?(CGI::Html3) + @cgi.should_not.is_a?(CGI::Html4) + end end end diff --git a/spec/ruby/library/cgi/out_spec.rb b/spec/ruby/library/cgi/out_spec.rb index 84068cdd4f..e9eaf5e151 100644 --- a/spec/ruby/library/cgi/out_spec.rb +++ b/spec/ruby/library/cgi/out_spec.rb @@ -1,51 +1,54 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI#out" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - $stdout, @old_stdout = IOStub.new, $stdout - end - - after :each do - $stdout = @old_stdout - ENV['REQUEST_METHOD'] = @old_request_method - end - - it "it writes a HTMl header based on the passed argument to $stdout" do - @cgi.out { "" } - $stdout.should == "Content-Type: text/html\r\nContent-Length: 0\r\n\r\n" - end - - it "appends the block's return value to the HTML header" do - @cgi.out { "test!" } - $stdout.should == "Content-Type: text/html\r\nContent-Length: 5\r\n\r\ntest!" - end - - it "automatically sets the Content-Length Header based on the block's return value" do - @cgi.out { "0123456789" } - $stdout.should == "Content-Type: text/html\r\nContent-Length: 10\r\n\r\n0123456789" - end - - it "includes Cookies in the @output_cookies field" do - @cgi.instance_variable_set(:@output_cookies, ["multiple", "cookies"]) - @cgi.out { "" } - $stdout.should == "Content-Type: text/html\r\nContent-Length: 0\r\nSet-Cookie: multiple\r\nSet-Cookie: cookies\r\n\r\n" - end -end - -describe "CGI#out when passed no block" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end - - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end - - it "raises a LocalJumpError" do - lambda { @cgi.out }.should raise_error(LocalJumpError) +ruby_version_is ""..."4.0" do + require 'cgi' + + describe "CGI#out" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + $stdout, @old_stdout = IOStub.new, $stdout + end + + after :each do + $stdout = @old_stdout + ENV['REQUEST_METHOD'] = @old_request_method + end + + it "it writes a HTMl header based on the passed argument to $stdout" do + @cgi.out { "" } + $stdout.should == "Content-Type: text/html\r\nContent-Length: 0\r\n\r\n" + end + + it "appends the block's return value to the HTML header" do + @cgi.out { "test!" } + $stdout.should == "Content-Type: text/html\r\nContent-Length: 5\r\n\r\ntest!" + end + + it "automatically sets the Content-Length Header based on the block's return value" do + @cgi.out { "0123456789" } + $stdout.should == "Content-Type: text/html\r\nContent-Length: 10\r\n\r\n0123456789" + end + + it "includes Cookies in the @output_cookies field" do + @cgi.instance_variable_set(:@output_cookies, ["multiple", "cookies"]) + @cgi.out { "" } + $stdout.should == "Content-Type: text/html\r\nContent-Length: 0\r\nSet-Cookie: multiple\r\nSet-Cookie: cookies\r\n\r\n" + end + end + + describe "CGI#out when passed no block" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end + + it "raises a LocalJumpError" do + -> { @cgi.out }.should.raise(LocalJumpError) + end end end diff --git a/spec/ruby/library/cgi/parse_spec.rb b/spec/ruby/library/cgi/parse_spec.rb index 04539b1226..f09270c195 100644 --- a/spec/ruby/library/cgi/parse_spec.rb +++ b/spec/ruby/library/cgi/parse_spec.rb @@ -1,24 +1,27 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI.parse when passed String" do - it "parses a HTTP Query String into a Hash" do - CGI.parse("test=test&a=b").should == { "a" => ["b"], "test" => ["test"] } - CGI.parse("test=1,2,3").should == { "test" => ["1,2,3"] } - CGI.parse("test=a&a=&b=").should == { "test" => ["a"], "a" => [""], "b" => [""] } - end +ruby_version_is ""..."4.0" do + require 'cgi' - it "parses query strings with semicolons in place of ampersands" do - CGI.parse("test=test;a=b").should == { "a" => ["b"], "test" => ["test"] } - CGI.parse("test=a;a=;b=").should == { "test" => ["a"], "a" => [""], "b" => [""] } - end + describe "CGI.parse when passed String" do + it "parses a HTTP Query String into a Hash" do + CGI.parse("test=test&a=b").should == { "a" => ["b"], "test" => ["test"] } + CGI.parse("test=1,2,3").should == { "test" => ["1,2,3"] } + CGI.parse("test=a&a=&b=").should == { "test" => ["a"], "a" => [""], "b" => [""] } + end - it "allows passing multiple values for one key" do - CGI.parse("test=1&test=2&test=3").should == { "test" => ["1", "2", "3"] } - CGI.parse("test[]=1&test[]=2&test[]=3").should == { "test[]" => [ "1", "2", "3" ] } - end + it "parses query strings with semicolons in place of ampersands" do + CGI.parse("test=test;a=b").should == { "a" => ["b"], "test" => ["test"] } + CGI.parse("test=a;a=;b=").should == { "test" => ["a"], "a" => [""], "b" => [""] } + end + + it "allows passing multiple values for one key" do + CGI.parse("test=1&test=2&test=3").should == { "test" => ["1", "2", "3"] } + CGI.parse("test[]=1&test[]=2&test[]=3").should == { "test[]" => [ "1", "2", "3" ] } + end - it "unescapes keys and values" do - CGI.parse("hello%3F=hello%21").should == { "hello?" => ["hello!"] } + it "unescapes keys and values" do + CGI.parse("hello%3F=hello%21").should == { "hello?" => ["hello!"] } + end end end diff --git a/spec/ruby/library/cgi/pretty_spec.rb b/spec/ruby/library/cgi/pretty_spec.rb index a7b7505c15..9df1611037 100644 --- a/spec/ruby/library/cgi/pretty_spec.rb +++ b/spec/ruby/library/cgi/pretty_spec.rb @@ -1,24 +1,27 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI.pretty when passed html" do - it "indents the passed html String with two spaces" do - CGI.pretty("<HTML><BODY></BODY></HTML>").should == <<-EOS +ruby_version_is ""..."4.0" do + require 'cgi' + + describe "CGI.pretty when passed html" do + it "indents the passed html String with two spaces" do + CGI.pretty("<HTML><BODY></BODY></HTML>").should == <<-EOS <HTML> <BODY> </BODY> </HTML> EOS + end end -end -describe "CGI.pretty when passed html, indentation_unit" do - it "indents the passed html String with the passed indentation_unit" do - CGI.pretty("<HTML><BODY></BODY></HTML>", "\t").should == <<-EOS + describe "CGI.pretty when passed html, indentation_unit" do + it "indents the passed html String with the passed indentation_unit" do + CGI.pretty("<HTML><BODY></BODY></HTML>", "\t").should == <<-EOS <HTML> \t<BODY> \t</BODY> </HTML> EOS + end end end diff --git a/spec/ruby/library/cgi/print_spec.rb b/spec/ruby/library/cgi/print_spec.rb index 18ab8d673b..f4f461c5c0 100644 --- a/spec/ruby/library/cgi/print_spec.rb +++ b/spec/ruby/library/cgi/print_spec.rb @@ -1,26 +1,29 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI#print" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI#print" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end - it "passes all arguments to $stdout.print" do - $stdout.should_receive(:print).with("test") - @cgi.print("test") + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - $stdout.should_receive(:print).with("one", "two", "three", ["four", "five"]) - @cgi.print("one", "two", "three", ["four", "five"]) - end + it "passes all arguments to $stdout.print" do + $stdout.should_receive(:print).with("test") + @cgi.print("test") + + $stdout.should_receive(:print).with("one", "two", "three", ["four", "five"]) + @cgi.print("one", "two", "three", ["four", "five"]) + end - it "returns the result of calling $stdout.print" do - $stdout.should_receive(:print).with("test").and_return(:expected) - @cgi.print("test").should == :expected + it "returns the result of calling $stdout.print" do + $stdout.should_receive(:print).with("test").and_return(:expected) + @cgi.print("test").should == :expected + end end end diff --git a/spec/ruby/library/cgi/queryextension/accept_charset_spec.rb b/spec/ruby/library/cgi/queryextension/accept_charset_spec.rb index 0487569b9c..be05f0c175 100644 --- a/spec/ruby/library/cgi/queryextension/accept_charset_spec.rb +++ b/spec/ruby/library/cgi/queryextension/accept_charset_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#accept_charset" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#accept_charset" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_ACCEPT_CHARSET']" do - old_value, ENV['HTTP_ACCEPT_CHARSET'] = ENV['HTTP_ACCEPT_CHARSET'], "ISO-8859-1,utf-8;q=0.7,*;q=0.7" - begin - @cgi.accept_charset.should == "ISO-8859-1,utf-8;q=0.7,*;q=0.7" - ensure - ENV['HTTP_ACCEPT_CHARSET'] = old_value + it "returns ENV['HTTP_ACCEPT_CHARSET']" do + old_value, ENV['HTTP_ACCEPT_CHARSET'] = ENV['HTTP_ACCEPT_CHARSET'], "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + begin + @cgi.accept_charset.should == "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + ensure + ENV['HTTP_ACCEPT_CHARSET'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/accept_encoding_spec.rb b/spec/ruby/library/cgi/queryextension/accept_encoding_spec.rb index 35ff3c2b30..42eb4a49b5 100644 --- a/spec/ruby/library/cgi/queryextension/accept_encoding_spec.rb +++ b/spec/ruby/library/cgi/queryextension/accept_encoding_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#accept_encoding" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#accept_encoding" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_ACCEPT_ENCODING']" do - old_value, ENV['HTTP_ACCEPT_ENCODING'] = ENV['HTTP_ACCEPT_ENCODING'], "gzip,deflate" - begin - @cgi.accept_encoding.should == "gzip,deflate" - ensure - ENV['HTTP_ACCEPT_ENCODING'] = old_value + it "returns ENV['HTTP_ACCEPT_ENCODING']" do + old_value, ENV['HTTP_ACCEPT_ENCODING'] = ENV['HTTP_ACCEPT_ENCODING'], "gzip,deflate" + begin + @cgi.accept_encoding.should == "gzip,deflate" + ensure + ENV['HTTP_ACCEPT_ENCODING'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/accept_language_spec.rb b/spec/ruby/library/cgi/queryextension/accept_language_spec.rb index 4a15d58914..19f29c6345 100644 --- a/spec/ruby/library/cgi/queryextension/accept_language_spec.rb +++ b/spec/ruby/library/cgi/queryextension/accept_language_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#accept_language" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#accept_language" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_ACCEPT_LANGUAGE']" do - old_value, ENV['HTTP_ACCEPT_LANGUAGE'] = ENV['HTTP_ACCEPT_LANGUAGE'], "en-us,en;q=0.5" - begin - @cgi.accept_language.should == "en-us,en;q=0.5" - ensure - ENV['HTTP_ACCEPT_LANGUAGE'] = old_value + it "returns ENV['HTTP_ACCEPT_LANGUAGE']" do + old_value, ENV['HTTP_ACCEPT_LANGUAGE'] = ENV['HTTP_ACCEPT_LANGUAGE'], "en-us,en;q=0.5" + begin + @cgi.accept_language.should == "en-us,en;q=0.5" + ensure + ENV['HTTP_ACCEPT_LANGUAGE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/accept_spec.rb b/spec/ruby/library/cgi/queryextension/accept_spec.rb index af5209ffbe..dcae39a736 100644 --- a/spec/ruby/library/cgi/queryextension/accept_spec.rb +++ b/spec/ruby/library/cgi/queryextension/accept_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#accept" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#accept" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_ACCEPT']" do - old_value, ENV['HTTP_ACCEPT'] = ENV['HTTP_ACCEPT'], "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" - begin - @cgi.accept.should == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" - ensure - ENV['HTTP_ACCEPT'] = old_value + it "returns ENV['HTTP_ACCEPT']" do + old_value, ENV['HTTP_ACCEPT'] = ENV['HTTP_ACCEPT'], "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + begin + @cgi.accept.should == "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + ensure + ENV['HTTP_ACCEPT'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/auth_type_spec.rb b/spec/ruby/library/cgi/queryextension/auth_type_spec.rb index 25318269b1..75e9cdb27a 100644 --- a/spec/ruby/library/cgi/queryextension/auth_type_spec.rb +++ b/spec/ruby/library/cgi/queryextension/auth_type_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#auth_type" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#auth_type" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['AUTH_TYPE']" do - old_value, ENV['AUTH_TYPE'] = ENV['AUTH_TYPE'], "Basic" - begin - @cgi.auth_type.should == "Basic" - ensure - ENV['AUTH_TYPE'] = old_value + it "returns ENV['AUTH_TYPE']" do + old_value, ENV['AUTH_TYPE'] = ENV['AUTH_TYPE'], "Basic" + begin + @cgi.auth_type.should == "Basic" + ensure + ENV['AUTH_TYPE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/cache_control_spec.rb b/spec/ruby/library/cgi/queryextension/cache_control_spec.rb index 0471307c22..c4b727e671 100644 --- a/spec/ruby/library/cgi/queryextension/cache_control_spec.rb +++ b/spec/ruby/library/cgi/queryextension/cache_control_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#cache_control" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#cache_control" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_CACHE_CONTROL']" do - old_value, ENV['HTTP_CACHE_CONTROL'] = ENV['HTTP_CACHE_CONTROL'], "no-cache" - begin - @cgi.cache_control.should == "no-cache" - ensure - ENV['HTTP_CACHE_CONTROL'] = old_value + it "returns ENV['HTTP_CACHE_CONTROL']" do + old_value, ENV['HTTP_CACHE_CONTROL'] = ENV['HTTP_CACHE_CONTROL'], "no-cache" + begin + @cgi.cache_control.should == "no-cache" + ensure + ENV['HTTP_CACHE_CONTROL'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/content_length_spec.rb b/spec/ruby/library/cgi/queryextension/content_length_spec.rb index de823f7119..bd02f3d8da 100644 --- a/spec/ruby/library/cgi/queryextension/content_length_spec.rb +++ b/spec/ruby/library/cgi/queryextension/content_length_spec.rb @@ -1,26 +1,29 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#content_length" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#content_length" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['CONTENT_LENGTH'] as Integer" do - old_value = ENV['CONTENT_LENGTH'] - begin - ENV['CONTENT_LENGTH'] = nil - @cgi.content_length.should be_nil + it "returns ENV['CONTENT_LENGTH'] as Integer" do + old_value = ENV['CONTENT_LENGTH'] + begin + ENV['CONTENT_LENGTH'] = nil + @cgi.content_length.should == nil - ENV['CONTENT_LENGTH'] = "100" - @cgi.content_length.should eql(100) - ensure - ENV['CONTENT_LENGTH'] = old_value + ENV['CONTENT_LENGTH'] = "100" + @cgi.content_length.should.eql?(100) + ensure + ENV['CONTENT_LENGTH'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/content_type_spec.rb b/spec/ruby/library/cgi/queryextension/content_type_spec.rb index 49b8389c87..d3cbdf0b14 100644 --- a/spec/ruby/library/cgi/queryextension/content_type_spec.rb +++ b/spec/ruby/library/cgi/queryextension/content_type_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#content_type" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#content_type" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['CONTENT_TYPE']" do - old_value, ENV['CONTENT_TYPE'] = ENV['CONTENT_TYPE'], "text/html" - begin - @cgi.content_type.should == "text/html" - ensure - ENV['CONTENT_TYPE'] = old_value + it "returns ENV['CONTENT_TYPE']" do + old_value, ENV['CONTENT_TYPE'] = ENV['CONTENT_TYPE'], "text/html" + begin + @cgi.content_type.should == "text/html" + ensure + ENV['CONTENT_TYPE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/cookies_spec.rb b/spec/ruby/library/cgi/queryextension/cookies_spec.rb index 4befd61ab7..266fe0c721 100644 --- a/spec/ruby/library/cgi/queryextension/cookies_spec.rb +++ b/spec/ruby/library/cgi/queryextension/cookies_spec.rb @@ -1,10 +1,13 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#cookies" do - it "needs to be reviewed for spec completeness" -end +ruby_version_is ""..."4.0" do + require 'cgi' + + describe "CGI::QueryExtension#cookies" do + it "needs to be reviewed for spec completeness" + end -describe "CGI::QueryExtension#cookies=" do - it "needs to be reviewed for spec completeness" + describe "CGI::QueryExtension#cookies=" do + it "needs to be reviewed for spec completeness" + end end diff --git a/spec/ruby/library/cgi/queryextension/element_reference_spec.rb b/spec/ruby/library/cgi/queryextension/element_reference_spec.rb index 6ac5b46407..c835f385f0 100644 --- a/spec/ruby/library/cgi/queryextension/element_reference_spec.rb +++ b/spec/ruby/library/cgi/queryextension/element_reference_spec.rb @@ -1,27 +1,30 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#[]" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - ENV['QUERY_STRING'], @old_query_string = "one=a&two=b&two=c", ENV['QUERY_STRING'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - ENV['QUERY_STRING'] = @old_query_string - end + describe "CGI::QueryExtension#[]" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + ENV['QUERY_STRING'], @old_query_string = "one=a&two=b&two=c", ENV['QUERY_STRING'] + @cgi = CGI.new + end - it "it returns the value for the parameter with the given key" do - @cgi["one"].should == "a" - end + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + ENV['QUERY_STRING'] = @old_query_string + end - it "only returns the first value for parameters with multiple values" do - @cgi["two"].should == "b" - end + it "it returns the value for the parameter with the given key" do + @cgi["one"].should == "a" + end + + it "only returns the first value for parameters with multiple values" do + @cgi["two"].should == "b" + end - it "returns a String" do - @cgi["one"].should be_kind_of(String) + it "returns a String" do + @cgi["one"].should.is_a?(String) + end end end diff --git a/spec/ruby/library/cgi/queryextension/from_spec.rb b/spec/ruby/library/cgi/queryextension/from_spec.rb index 04a992cfc7..b341e0be10 100644 --- a/spec/ruby/library/cgi/queryextension/from_spec.rb +++ b/spec/ruby/library/cgi/queryextension/from_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#from" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#from" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_FROM']" do - old_value, ENV['HTTP_FROM'] = ENV['HTTP_FROM'], "googlebot(at)googlebot.com" - begin - @cgi.from.should == "googlebot(at)googlebot.com" - ensure - ENV['HTTP_FROM'] = old_value + it "returns ENV['HTTP_FROM']" do + old_value, ENV['HTTP_FROM'] = ENV['HTTP_FROM'], "googlebot(at)googlebot.com" + begin + @cgi.from.should == "googlebot(at)googlebot.com" + ensure + ENV['HTTP_FROM'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/gateway_interface_spec.rb b/spec/ruby/library/cgi/queryextension/gateway_interface_spec.rb index 3ead5bd8bf..c82522326b 100644 --- a/spec/ruby/library/cgi/queryextension/gateway_interface_spec.rb +++ b/spec/ruby/library/cgi/queryextension/gateway_interface_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#gateway_interface" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#gateway_interface" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['GATEWAY_INTERFACE']" do - old_value, ENV['GATEWAY_INTERFACE'] = ENV['GATEWAY_INTERFACE'], "CGI/1.1" - begin - @cgi.gateway_interface.should == "CGI/1.1" - ensure - ENV['GATEWAY_INTERFACE'] = old_value + it "returns ENV['GATEWAY_INTERFACE']" do + old_value, ENV['GATEWAY_INTERFACE'] = ENV['GATEWAY_INTERFACE'], "CGI/1.1" + begin + @cgi.gateway_interface.should == "CGI/1.1" + ensure + ENV['GATEWAY_INTERFACE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/has_key_spec.rb b/spec/ruby/library/cgi/queryextension/has_key_spec.rb index 525b45b507..43f7aae1b2 100644 --- a/spec/ruby/library/cgi/queryextension/has_key_spec.rb +++ b/spec/ruby/library/cgi/queryextension/has_key_spec.rb @@ -1,7 +1,10 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'shared/has_key' -describe "CGI::QueryExtension#has_key?" do - it_behaves_like :cgi_query_extension_has_key_p, :has_key? +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'shared/has_key' + + describe "CGI::QueryExtension#has_key?" do + it_behaves_like :cgi_query_extension_has_key_p, :has_key? + end end diff --git a/spec/ruby/library/cgi/queryextension/host_spec.rb b/spec/ruby/library/cgi/queryextension/host_spec.rb index e820e0afc3..e1047c942b 100644 --- a/spec/ruby/library/cgi/queryextension/host_spec.rb +++ b/spec/ruby/library/cgi/queryextension/host_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#host" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#host" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_HOST']" do - old_value, ENV['HTTP_HOST'] = ENV['HTTP_HOST'], "localhost" - begin - @cgi.host.should == "localhost" - ensure - ENV['HTTP_HOST'] = old_value + it "returns ENV['HTTP_HOST']" do + old_value, ENV['HTTP_HOST'] = ENV['HTTP_HOST'], "localhost" + begin + @cgi.host.should == "localhost" + ensure + ENV['HTTP_HOST'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/include_spec.rb b/spec/ruby/library/cgi/queryextension/include_spec.rb index 12365ea284..7275c309f9 100644 --- a/spec/ruby/library/cgi/queryextension/include_spec.rb +++ b/spec/ruby/library/cgi/queryextension/include_spec.rb @@ -1,7 +1,10 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'shared/has_key' -describe "CGI::QueryExtension#include?" do - it_behaves_like :cgi_query_extension_has_key_p, :include? +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'shared/has_key' + + describe "CGI::QueryExtension#include?" do + it_behaves_like :cgi_query_extension_has_key_p, :include? + end end diff --git a/spec/ruby/library/cgi/queryextension/key_spec.rb b/spec/ruby/library/cgi/queryextension/key_spec.rb index d0f1e4cee2..dc2f52fbe0 100644 --- a/spec/ruby/library/cgi/queryextension/key_spec.rb +++ b/spec/ruby/library/cgi/queryextension/key_spec.rb @@ -1,7 +1,10 @@ require_relative '../../../spec_helper' -require 'cgi' -require_relative 'shared/has_key' -describe "CGI::QueryExtension#key?" do - it_behaves_like :cgi_query_extension_has_key_p, :key? +ruby_version_is ""..."4.0" do + require 'cgi' + require_relative 'shared/has_key' + + describe "CGI::QueryExtension#key?" do + it_behaves_like :cgi_query_extension_has_key_p, :key? + end end diff --git a/spec/ruby/library/cgi/queryextension/keys_spec.rb b/spec/ruby/library/cgi/queryextension/keys_spec.rb index 14d77180fa..bb16914065 100644 --- a/spec/ruby/library/cgi/queryextension/keys_spec.rb +++ b/spec/ruby/library/cgi/queryextension/keys_spec.rb @@ -1,20 +1,23 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#keys" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - ENV['QUERY_STRING'], @old_query_string = "one=a&two=b", ENV['QUERY_STRING'] +ruby_version_is ""..."4.0" do + require 'cgi' - @cgi = CGI.new - end + describe "CGI::QueryExtension#keys" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + ENV['QUERY_STRING'], @old_query_string = "one=a&two=b", ENV['QUERY_STRING'] - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - ENV['QUERY_STRING'] = @old_query_string - end + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + ENV['QUERY_STRING'] = @old_query_string + end - it "returns all parameter keys as an Array" do - @cgi.keys.sort.should == ["one", "two"] + it "returns all parameter keys as an Array" do + @cgi.keys.sort.should == ["one", "two"] + end end end diff --git a/spec/ruby/library/cgi/queryextension/multipart_spec.rb b/spec/ruby/library/cgi/queryextension/multipart_spec.rb index ced4cb05a1..1fa771ca1c 100644 --- a/spec/ruby/library/cgi/queryextension/multipart_spec.rb +++ b/spec/ruby/library/cgi/queryextension/multipart_spec.rb @@ -1,20 +1,22 @@ require_relative '../../../spec_helper' -require 'cgi' -require "stringio" -describe "CGI::QueryExtension#multipart?" do - before :each do - @old_stdin = $stdin +ruby_version_is ""..."4.0" do + require 'cgi' + require "stringio" - @old_request_method = ENV['REQUEST_METHOD'] - @old_content_type = ENV['CONTENT_TYPE'] - @old_content_length = ENV['CONTENT_LENGTH'] + describe "CGI::QueryExtension#multipart?" do + before :each do + @old_stdin = $stdin - ENV['REQUEST_METHOD'] = "POST" - ENV["CONTENT_TYPE"] = "multipart/form-data; boundary=---------------------------1137522503144128232716531729" - ENV["CONTENT_LENGTH"] = "222" + @old_request_method = ENV['REQUEST_METHOD'] + @old_content_type = ENV['CONTENT_TYPE'] + @old_content_length = ENV['CONTENT_LENGTH'] - $stdin = StringIO.new <<-EOS + ENV['REQUEST_METHOD'] = "POST" + ENV["CONTENT_TYPE"] = "multipart/form-data; boundary=---------------------------1137522503144128232716531729" + ENV["CONTENT_LENGTH"] = "222" + + $stdin = StringIO.new <<-EOS -----------------------------1137522503144128232716531729\r Content-Disposition: form-data; name="file"; filename=""\r Content-Type: application/octet-stream\r @@ -23,18 +25,19 @@ Content-Type: application/octet-stream\r -----------------------------1137522503144128232716531729--\r EOS - @cgi = CGI.new - end + @cgi = CGI.new + end - after :each do - $stdin = @old_stdin + after :each do + $stdin = @old_stdin - ENV['REQUEST_METHOD'] = @old_request_method - ENV['CONTENT_TYPE'] = @old_content_type - ENV['CONTENT_LENGTH'] = @old_content_length - end + ENV['REQUEST_METHOD'] = @old_request_method + ENV['CONTENT_TYPE'] = @old_content_type + ENV['CONTENT_LENGTH'] = @old_content_length + end - it "returns true if the current Request is a multipart request" do - @cgi.multipart?.should be_true + it "returns true if the current Request is a multipart request" do + @cgi.multipart?.should == true + end end end diff --git a/spec/ruby/library/cgi/queryextension/negotiate_spec.rb b/spec/ruby/library/cgi/queryextension/negotiate_spec.rb index b6fe036042..4083e6a8cd 100644 --- a/spec/ruby/library/cgi/queryextension/negotiate_spec.rb +++ b/spec/ruby/library/cgi/queryextension/negotiate_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#negotiate" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#negotiate" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_NEGOTIATE']" do - old_value, ENV['HTTP_NEGOTIATE'] = ENV['HTTP_NEGOTIATE'], "trans" - begin - @cgi.negotiate.should == "trans" - ensure - ENV['HTTP_NEGOTIATE'] = old_value + it "returns ENV['HTTP_NEGOTIATE']" do + old_value, ENV['HTTP_NEGOTIATE'] = ENV['HTTP_NEGOTIATE'], "trans" + begin + @cgi.negotiate.should == "trans" + ensure + ENV['HTTP_NEGOTIATE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/params_spec.rb b/spec/ruby/library/cgi/queryextension/params_spec.rb index f4449e3c8a..938028ea14 100644 --- a/spec/ruby/library/cgi/queryextension/params_spec.rb +++ b/spec/ruby/library/cgi/queryextension/params_spec.rb @@ -1,37 +1,40 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#params" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - ENV['QUERY_STRING'], @old_query_string = "one=a&two=b&two=c&three", ENV['QUERY_STRING'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['QUERY_STRING'] = @old_query_string - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#params" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + ENV['QUERY_STRING'], @old_query_string = "one=a&two=b&two=c&three", ENV['QUERY_STRING'] + @cgi = CGI.new + end - it "returns the parsed HTTP Query Params" do - @cgi.params.should == {"three"=>[], "two"=>["b", "c"], "one"=>["a"]} - end -end + after :each do + ENV['QUERY_STRING'] = @old_query_string + ENV['REQUEST_METHOD'] = @old_request_method + end -describe "CGI::QueryExtension#params=" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new + it "returns the parsed HTTP Query Params" do + @cgi.params.should == {"three"=>[], "two"=>["b", "c"], "one"=>["a"]} + end end - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#params=" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "sets the HTTP Query Params to the passed argument" do - @cgi.params.should == {} + it "sets the HTTP Query Params to the passed argument" do + @cgi.params.should == {} - @cgi.params = {"one"=>["a"], "two"=>["b", "c"]} - @cgi.params.should == {"one"=>["a"], "two"=>["b", "c"]} + @cgi.params = {"one"=>["a"], "two"=>["b", "c"]} + @cgi.params.should == {"one"=>["a"], "two"=>["b", "c"]} + end end end diff --git a/spec/ruby/library/cgi/queryextension/path_info_spec.rb b/spec/ruby/library/cgi/queryextension/path_info_spec.rb index 9785df85f1..9b7834c514 100644 --- a/spec/ruby/library/cgi/queryextension/path_info_spec.rb +++ b/spec/ruby/library/cgi/queryextension/path_info_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#path_info" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#path_info" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['PATH_INFO']" do - old_value, ENV['PATH_INFO'] = ENV['PATH_INFO'], "/test/path" - begin - @cgi.path_info.should == "/test/path" - ensure - ENV['PATH_INFO'] = old_value + it "returns ENV['PATH_INFO']" do + old_value, ENV['PATH_INFO'] = ENV['PATH_INFO'], "/test/path" + begin + @cgi.path_info.should == "/test/path" + ensure + ENV['PATH_INFO'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/path_translated_spec.rb b/spec/ruby/library/cgi/queryextension/path_translated_spec.rb index 417a749341..a773aaafdb 100644 --- a/spec/ruby/library/cgi/queryextension/path_translated_spec.rb +++ b/spec/ruby/library/cgi/queryextension/path_translated_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#path_translated" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#path_translated" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['PATH_TRANSLATED']" do - old_value, ENV['PATH_TRANSLATED'] = ENV['PATH_TRANSLATED'], "/full/path/to/dir" - begin - @cgi.path_translated.should == "/full/path/to/dir" - ensure - ENV['PATH_TRANSLATED'] = old_value + it "returns ENV['PATH_TRANSLATED']" do + old_value, ENV['PATH_TRANSLATED'] = ENV['PATH_TRANSLATED'], "/full/path/to/dir" + begin + @cgi.path_translated.should == "/full/path/to/dir" + ensure + ENV['PATH_TRANSLATED'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/pragma_spec.rb b/spec/ruby/library/cgi/queryextension/pragma_spec.rb index 02d5c91221..be384182a5 100644 --- a/spec/ruby/library/cgi/queryextension/pragma_spec.rb +++ b/spec/ruby/library/cgi/queryextension/pragma_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#pragma" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#pragma" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_PRAGMA']" do - old_value, ENV['HTTP_PRAGMA'] = ENV['HTTP_PRAGMA'], "no-cache" - begin - @cgi.pragma.should == "no-cache" - ensure - ENV['HTTP_PRAGMA'] = old_value + it "returns ENV['HTTP_PRAGMA']" do + old_value, ENV['HTTP_PRAGMA'] = ENV['HTTP_PRAGMA'], "no-cache" + begin + @cgi.pragma.should == "no-cache" + ensure + ENV['HTTP_PRAGMA'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/query_string_spec.rb b/spec/ruby/library/cgi/queryextension/query_string_spec.rb index a6b454a7eb..64fbeaea10 100644 --- a/spec/ruby/library/cgi/queryextension/query_string_spec.rb +++ b/spec/ruby/library/cgi/queryextension/query_string_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#query_string" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#query_string" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['QUERY_STRING']" do - old_value, ENV['QUERY_STRING'] = ENV['QUERY_STRING'], "one=a&two=b" - begin - @cgi.query_string.should == "one=a&two=b" - ensure - ENV['QUERY_STRING'] = old_value + it "returns ENV['QUERY_STRING']" do + old_value, ENV['QUERY_STRING'] = ENV['QUERY_STRING'], "one=a&two=b" + begin + @cgi.query_string.should == "one=a&two=b" + ensure + ENV['QUERY_STRING'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/raw_cookie2_spec.rb b/spec/ruby/library/cgi/queryextension/raw_cookie2_spec.rb index 3d7072e346..30d314aca1 100644 --- a/spec/ruby/library/cgi/queryextension/raw_cookie2_spec.rb +++ b/spec/ruby/library/cgi/queryextension/raw_cookie2_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#raw_cookie2" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#raw_cookie2" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_COOKIE2']" do - old_value, ENV['HTTP_COOKIE2'] = ENV['HTTP_COOKIE2'], "some_cookie=data" - begin - @cgi.raw_cookie2.should == "some_cookie=data" - ensure - ENV['HTTP_COOKIE2'] = old_value + it "returns ENV['HTTP_COOKIE2']" do + old_value, ENV['HTTP_COOKIE2'] = ENV['HTTP_COOKIE2'], "some_cookie=data" + begin + @cgi.raw_cookie2.should == "some_cookie=data" + ensure + ENV['HTTP_COOKIE2'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/raw_cookie_spec.rb b/spec/ruby/library/cgi/queryextension/raw_cookie_spec.rb index ede7b9ff87..affa504b39 100644 --- a/spec/ruby/library/cgi/queryextension/raw_cookie_spec.rb +++ b/spec/ruby/library/cgi/queryextension/raw_cookie_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#raw_cookie" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#raw_cookie" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_COOKIE']" do - old_value, ENV['HTTP_COOKIE'] = ENV['HTTP_COOKIE'], "some_cookie=data" - begin - @cgi.raw_cookie.should == "some_cookie=data" - ensure - ENV['HTTP_COOKIE'] = old_value + it "returns ENV['HTTP_COOKIE']" do + old_value, ENV['HTTP_COOKIE'] = ENV['HTTP_COOKIE'], "some_cookie=data" + begin + @cgi.raw_cookie.should == "some_cookie=data" + ensure + ENV['HTTP_COOKIE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/referer_spec.rb b/spec/ruby/library/cgi/queryextension/referer_spec.rb index 6cd5dc96f8..53fc19ddd0 100644 --- a/spec/ruby/library/cgi/queryextension/referer_spec.rb +++ b/spec/ruby/library/cgi/queryextension/referer_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#referer" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#referer" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_REFERER']" do - old_value, ENV['HTTP_REFERER'] = ENV['HTTP_REFERER'], "example.com" - begin - @cgi.referer.should == "example.com" - ensure - ENV['HTTP_REFERER'] = old_value + it "returns ENV['HTTP_REFERER']" do + old_value, ENV['HTTP_REFERER'] = ENV['HTTP_REFERER'], "example.com" + begin + @cgi.referer.should == "example.com" + ensure + ENV['HTTP_REFERER'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/remote_addr_spec.rb b/spec/ruby/library/cgi/queryextension/remote_addr_spec.rb index 0259402b23..7b5addc2d5 100644 --- a/spec/ruby/library/cgi/queryextension/remote_addr_spec.rb +++ b/spec/ruby/library/cgi/queryextension/remote_addr_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#remote_addr" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#remote_addr" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['REMOTE_ADDR']" do - old_value, ENV['REMOTE_ADDR'] = ENV['REMOTE_ADDR'], "127.0.0.1" - begin - @cgi.remote_addr.should == "127.0.0.1" - ensure - ENV['REMOTE_ADDR'] = old_value + it "returns ENV['REMOTE_ADDR']" do + old_value, ENV['REMOTE_ADDR'] = ENV['REMOTE_ADDR'], "127.0.0.1" + begin + @cgi.remote_addr.should == "127.0.0.1" + ensure + ENV['REMOTE_ADDR'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/remote_host_spec.rb b/spec/ruby/library/cgi/queryextension/remote_host_spec.rb index cf77e0031b..2dfe59ca38 100644 --- a/spec/ruby/library/cgi/queryextension/remote_host_spec.rb +++ b/spec/ruby/library/cgi/queryextension/remote_host_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#remote_host" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#remote_host" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['REMOTE_HOST']" do - old_value, ENV['REMOTE_HOST'] = ENV['REMOTE_HOST'], "test.host" - begin - @cgi.remote_host.should == "test.host" - ensure - ENV['REMOTE_HOST'] = old_value + it "returns ENV['REMOTE_HOST']" do + old_value, ENV['REMOTE_HOST'] = ENV['REMOTE_HOST'], "test.host" + begin + @cgi.remote_host.should == "test.host" + ensure + ENV['REMOTE_HOST'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/remote_ident_spec.rb b/spec/ruby/library/cgi/queryextension/remote_ident_spec.rb index 5b51d6b8ee..bb05fc7942 100644 --- a/spec/ruby/library/cgi/queryextension/remote_ident_spec.rb +++ b/spec/ruby/library/cgi/queryextension/remote_ident_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#remote_ident" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#remote_ident" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['REMOTE_IDENT']" do - old_value, ENV['REMOTE_IDENT'] = ENV['REMOTE_IDENT'], "no-idea-what-this-is-for" - begin - @cgi.remote_ident.should == "no-idea-what-this-is-for" - ensure - ENV['REMOTE_IDENT'] = old_value + it "returns ENV['REMOTE_IDENT']" do + old_value, ENV['REMOTE_IDENT'] = ENV['REMOTE_IDENT'], "no-idea-what-this-is-for" + begin + @cgi.remote_ident.should == "no-idea-what-this-is-for" + ensure + ENV['REMOTE_IDENT'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/remote_user_spec.rb b/spec/ruby/library/cgi/queryextension/remote_user_spec.rb index 1a93bb6561..29856302ab 100644 --- a/spec/ruby/library/cgi/queryextension/remote_user_spec.rb +++ b/spec/ruby/library/cgi/queryextension/remote_user_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#remote_user" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#remote_user" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['REMOTE_USER']" do - old_value, ENV['REMOTE_USER'] = ENV['REMOTE_USER'], "username" - begin - @cgi.remote_user.should == "username" - ensure - ENV['REMOTE_USER'] = old_value + it "returns ENV['REMOTE_USER']" do + old_value, ENV['REMOTE_USER'] = ENV['REMOTE_USER'], "username" + begin + @cgi.remote_user.should == "username" + ensure + ENV['REMOTE_USER'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/request_method_spec.rb b/spec/ruby/library/cgi/queryextension/request_method_spec.rb index eabdd6998b..7331b134d2 100644 --- a/spec/ruby/library/cgi/queryextension/request_method_spec.rb +++ b/spec/ruby/library/cgi/queryextension/request_method_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#request_method" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#request_method" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['REQUEST_METHOD']" do - old_value, ENV['REQUEST_METHOD'] = ENV['REQUEST_METHOD'], "GET" - begin - @cgi.request_method.should == "GET" - ensure - ENV['REQUEST_METHOD'] = old_value + it "returns ENV['REQUEST_METHOD']" do + old_value, ENV['REQUEST_METHOD'] = ENV['REQUEST_METHOD'], "GET" + begin + @cgi.request_method.should == "GET" + ensure + ENV['REQUEST_METHOD'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/script_name_spec.rb b/spec/ruby/library/cgi/queryextension/script_name_spec.rb index 341b7b6fea..4b359a545f 100644 --- a/spec/ruby/library/cgi/queryextension/script_name_spec.rb +++ b/spec/ruby/library/cgi/queryextension/script_name_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#script_name" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#script_name" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['SCRIPT_NAME']" do - old_value, ENV['SCRIPT_NAME'] = ENV['SCRIPT_NAME'], "/path/to/script.rb" - begin - @cgi.script_name.should == "/path/to/script.rb" - ensure - ENV['SCRIPT_NAME'] = old_value + it "returns ENV['SCRIPT_NAME']" do + old_value, ENV['SCRIPT_NAME'] = ENV['SCRIPT_NAME'], "/path/to/script.rb" + begin + @cgi.script_name.should == "/path/to/script.rb" + ensure + ENV['SCRIPT_NAME'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/server_name_spec.rb b/spec/ruby/library/cgi/queryextension/server_name_spec.rb index b12aaf8c5c..c1f7fb4c54 100644 --- a/spec/ruby/library/cgi/queryextension/server_name_spec.rb +++ b/spec/ruby/library/cgi/queryextension/server_name_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#server_name" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#server_name" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['SERVER_NAME']" do - old_value, ENV['SERVER_NAME'] = ENV['SERVER_NAME'], "localhost" - begin - @cgi.server_name.should == "localhost" - ensure - ENV['SERVER_NAME'] = old_value + it "returns ENV['SERVER_NAME']" do + old_value, ENV['SERVER_NAME'] = ENV['SERVER_NAME'], "localhost" + begin + @cgi.server_name.should == "localhost" + ensure + ENV['SERVER_NAME'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/server_port_spec.rb b/spec/ruby/library/cgi/queryextension/server_port_spec.rb index 0e688a99bf..1c88d3225d 100644 --- a/spec/ruby/library/cgi/queryextension/server_port_spec.rb +++ b/spec/ruby/library/cgi/queryextension/server_port_spec.rb @@ -1,26 +1,29 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#server_port" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#server_port" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['SERVER_PORT'] as Integer" do - old_value = ENV['SERVER_PORT'] - begin - ENV['SERVER_PORT'] = nil - @cgi.server_port.should be_nil + it "returns ENV['SERVER_PORT'] as Integer" do + old_value = ENV['SERVER_PORT'] + begin + ENV['SERVER_PORT'] = nil + @cgi.server_port.should == nil - ENV['SERVER_PORT'] = "3000" - @cgi.server_port.should eql(3000) - ensure - ENV['SERVER_PORT'] = old_value + ENV['SERVER_PORT'] = "3000" + @cgi.server_port.should.eql?(3000) + ensure + ENV['SERVER_PORT'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/server_protocol_spec.rb b/spec/ruby/library/cgi/queryextension/server_protocol_spec.rb index f9dcf3c5b8..fdbcc2108f 100644 --- a/spec/ruby/library/cgi/queryextension/server_protocol_spec.rb +++ b/spec/ruby/library/cgi/queryextension/server_protocol_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#server_protocol" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#server_protocol" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['SERVER_PROTOCOL']" do - old_value, ENV['SERVER_PROTOCOL'] = ENV['SERVER_PROTOCOL'], "HTTP/1.1" - begin - @cgi.server_protocol.should == "HTTP/1.1" - ensure - ENV['SERVER_PROTOCOL'] = old_value + it "returns ENV['SERVER_PROTOCOL']" do + old_value, ENV['SERVER_PROTOCOL'] = ENV['SERVER_PROTOCOL'], "HTTP/1.1" + begin + @cgi.server_protocol.should == "HTTP/1.1" + ensure + ENV['SERVER_PROTOCOL'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/server_software_spec.rb b/spec/ruby/library/cgi/queryextension/server_software_spec.rb index df349cdf2e..c5811a2268 100644 --- a/spec/ruby/library/cgi/queryextension/server_software_spec.rb +++ b/spec/ruby/library/cgi/queryextension/server_software_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#server_software" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#server_software" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['SERVER_SOFTWARE']" do - old_value, ENV['SERVER_SOFTWARE'] = ENV['SERVER_SOFTWARE'], "Server/1.0.0" - begin - @cgi.server_software.should == "Server/1.0.0" - ensure - ENV['SERVER_SOFTWARE'] = old_value + it "returns ENV['SERVER_SOFTWARE']" do + old_value, ENV['SERVER_SOFTWARE'] = ENV['SERVER_SOFTWARE'], "Server/1.0.0" + begin + @cgi.server_software.should == "Server/1.0.0" + ensure + ENV['SERVER_SOFTWARE'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/queryextension/shared/has_key.rb b/spec/ruby/library/cgi/queryextension/shared/has_key.rb index cfac5865fa..6231cb548e 100644 --- a/spec/ruby/library/cgi/queryextension/shared/has_key.rb +++ b/spec/ruby/library/cgi/queryextension/shared/has_key.rb @@ -12,8 +12,8 @@ describe :cgi_query_extension_has_key_p, shared: true do end it "returns true when the passed key exists in the HTTP Query" do - @cgi.send(@method, "one").should be_true - @cgi.send(@method, "two").should be_true - @cgi.send(@method, "three").should be_false + @cgi.send(@method, "one").should == true + @cgi.send(@method, "two").should == true + @cgi.send(@method, "three").should == false end end diff --git a/spec/ruby/library/cgi/queryextension/user_agent_spec.rb b/spec/ruby/library/cgi/queryextension/user_agent_spec.rb index ec5ef187dd..3240352ef6 100644 --- a/spec/ruby/library/cgi/queryextension/user_agent_spec.rb +++ b/spec/ruby/library/cgi/queryextension/user_agent_spec.rb @@ -1,22 +1,25 @@ require_relative '../../../spec_helper' -require 'cgi' -describe "CGI::QueryExtension#user_agent" do - before :each do - ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] - @cgi = CGI.new - end +ruby_version_is ""..."4.0" do + require 'cgi' - after :each do - ENV['REQUEST_METHOD'] = @old_request_method - end + describe "CGI::QueryExtension#user_agent" do + before :each do + ENV['REQUEST_METHOD'], @old_request_method = "GET", ENV['REQUEST_METHOD'] + @cgi = CGI.new + end + + after :each do + ENV['REQUEST_METHOD'] = @old_request_method + end - it "returns ENV['HTTP_USER_AGENT']" do - old_value, ENV['HTTP_USER_AGENT'] = ENV['HTTP_USER_AGENT'], "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; de-de) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1 Safari/525.13" - begin - @cgi.user_agent.should == "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; de-de) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1 Safari/525.13" - ensure - ENV['HTTP_USER_AGENT'] = old_value + it "returns ENV['HTTP_USER_AGENT']" do + old_value, ENV['HTTP_USER_AGENT'] = ENV['HTTP_USER_AGENT'], "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; de-de) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1 Safari/525.13" + begin + @cgi.user_agent.should == "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; de-de) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1 Safari/525.13" + ensure + ENV['HTTP_USER_AGENT'] = old_value + end end end end diff --git a/spec/ruby/library/cgi/rfc1123_date_spec.rb b/spec/ruby/library/cgi/rfc1123_date_spec.rb index d94c026d9f..636185f22c 100644 --- a/spec/ruby/library/cgi/rfc1123_date_spec.rb +++ b/spec/ruby/library/cgi/rfc1123_date_spec.rb @@ -1,10 +1,13 @@ require_relative '../../spec_helper' -require 'cgi' -describe "CGI.rfc1123_date when passsed Time" do - it "returns the passed Time formatted in RFC1123 ('Sat, 01 Dec 2007 15:56:42 GMT')" do - input = Time.at(1196524602) - expected = 'Sat, 01 Dec 2007 15:56:42 GMT' - CGI.rfc1123_date(input).should == expected +ruby_version_is ""..."4.0" do + require 'cgi' + + describe "CGI.rfc1123_date when passed Time" do + it "returns the passed Time formatted in RFC1123 ('Sat, 01 Dec 2007 15:56:42 GMT')" do + input = Time.at(1196524602) + expected = 'Sat, 01 Dec 2007 15:56:42 GMT' + CGI.rfc1123_date(input).should == expected + end end end diff --git a/spec/ruby/library/cgi/shared/http_header.rb b/spec/ruby/library/cgi/shared/http_header.rb index b225b5925e..e739fed538 100644 --- a/spec/ruby/library/cgi/shared/http_header.rb +++ b/spec/ruby/library/cgi/shared/http_header.rb @@ -63,11 +63,11 @@ describe :cgi_http_header, shared: true do header.should == "Content-Type: text/plain; charset=UTF-8\r\n\r\n" header = @cgi.send(@method, "nph" => true) - header.should include("HTTP/1.0 200 OK\r\n") - header.should include("Date: ") - header.should include("Server: ") - header.should include("Connection: close\r\n") - header.should include("Content-Type: text/html\r\n") + header.should.include?("HTTP/1.0 200 OK\r\n") + header.should.include?("Date: ") + header.should.include?("Server: ") + header.should.include?("Connection: close\r\n") + header.should.include?("Content-Type: text/html\r\n") header = @cgi.send(@method, "status" => "OK") header.should == "Status: 200 OK\r\nContent-Type: text/html\r\n\r\n" diff --git a/spec/ruby/library/cgi/unescapeElement_spec.rb b/spec/ruby/library/cgi/unescapeElement_spec.rb index ae4d50b076..db83f0d2fb 100644 --- a/spec/ruby/library/cgi/unescapeElement_spec.rb +++ b/spec/ruby/library/cgi/unescapeElement_spec.rb @@ -1,5 +1,11 @@ require_relative '../../spec_helper' -require 'cgi' + +ruby_version_is ""..."4.0" do + require 'cgi' +end +ruby_version_is "4.0" do + require 'cgi/escape' +end describe "CGI.unescapeElement when passed String, elements, ..." do it "unescapes only the tags of the passed elements in the passed String" do diff --git a/spec/ruby/library/cgi/unescapeHTML_spec.rb b/spec/ruby/library/cgi/unescapeHTML_spec.rb index 46387d4f01..e43dcc83e5 100644 --- a/spec/ruby/library/cgi/unescapeHTML_spec.rb +++ b/spec/ruby/library/cgi/unescapeHTML_spec.rb @@ -1,5 +1,9 @@ require_relative '../../spec_helper' -require 'cgi' +begin + require 'cgi/escape' +rescue LoadError + require 'cgi' +end describe "CGI.unescapeHTML" do it "unescapes '& < > "' to '& < > \"'" do @@ -36,4 +40,9 @@ describe "CGI.unescapeHTML" do input = "fooooooo&#" CGI.unescapeHTML(input).should == input end + + it "unescapes invalid encoding" do + input = "\xFF&" + CGI.unescapeHTML(input).should == input + end end diff --git a/spec/ruby/library/cgi/unescapeURIComponent_spec.rb b/spec/ruby/library/cgi/unescapeURIComponent_spec.rb new file mode 100644 index 0000000000..e0bf4b70e0 --- /dev/null +++ b/spec/ruby/library/cgi/unescapeURIComponent_spec.rb @@ -0,0 +1,128 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.0" do + require 'cgi' +end +ruby_version_is "4.0" do + require 'cgi/escape' +end + +describe "CGI.unescapeURIComponent" do + it "decodes any percent-encoded octets to their corresponding bytes according to RFC 3986" do + string = (0x00..0xff).map { |i| "%%%02x" % i }.join + expected = (0x00..0xff).map { |i| i.chr }.join.force_encoding(Encoding::UTF_8) + CGI.unescapeURIComponent(string).should == expected + end + + it "disregards case of characters in a percent-encoding triplet" do + CGI.unescapeURIComponent("%CE%B2abc").should == "βabc" + CGI.unescapeURIComponent("%ce%b2ABC").should == "βABC" + end + + it "leaves any non-percent-encoded characters as-is" do + string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ:/?#[]@!$&'()*+,;=\t\x0D\xFFβᛉ▒90%" + decoded = CGI.unescapeURIComponent(string) + decoded.should == string + string.should_not.equal?(decoded) + end + + it "leaves sequences which can't be a percent-encoded octet as-is" do + string = "%AZ%B" + decoded = CGI.unescapeURIComponent(string) + decoded.should == string + string.should_not.equal?(decoded) + end + + it "creates a String with the specified target Encoding" do + string = CGI.unescapeURIComponent("%D2%3C%3CABC", Encoding::ISO_8859_1) + string.encoding.should == Encoding::ISO_8859_1 + string.should == "Ò<<ABC".encode("ISO-8859-1") + end + + it "accepts a string name of an Encoding" do + CGI.unescapeURIComponent("%D2%3C%3CABC", "ISO-8859-1").should == "Ò<<ABC".encode("ISO-8859-1") + end + + it "raises ArgumentError if specified encoding is unknown" do + -> { CGI.unescapeURIComponent("ABC", "ISO-JOKE-1") }.should.raise(ArgumentError, "unknown encoding name - ISO-JOKE-1") + end + + ruby_version_is ""..."4.0" do + it "uses CGI.accept_charset as the default target encoding" do + original_charset = CGI.accept_charset + CGI.accept_charset = "ISO-8859-1" + decoded = CGI.unescapeURIComponent("%D2%3C%3CABC") + decoded.should == "Ò<<ABC".encode("ISO-8859-1") + decoded.encoding.should == Encoding::ISO_8859_1 + ensure + CGI.accept_charset = original_charset + end + + it "has CGI.accept_charset as UTF-8 by default" do + decoded = CGI.unescapeURIComponent("%CE%B2ABC") + decoded.should == "βABC" + decoded.encoding.should == Encoding::UTF_8 + end + end + + ruby_version_is "4.0" do + # "cgi/escape" does not have methods to access @@accept_charset. + # Full "cgi" gem provides them, allowing to possibly change it. + it "uses CGI's @@accept_charset as the default target encoding" do + original_charset = CGI.class_variable_get(:@@accept_charset) + CGI.class_variable_set(:@@accept_charset, "ISO-8859-1") + decoded = CGI.unescapeURIComponent("%D2%3C%3CABC") + decoded.should == "Ò<<ABC".encode("ISO-8859-1") + decoded.encoding.should == Encoding::ISO_8859_1 + ensure + CGI.class_variable_set(:@@accept_charset, original_charset) + end + + it "has CGI's @@accept_charset as UTF-8 by default" do + decoded = CGI.unescapeURIComponent("%CE%B2ABC") + decoded.should == "βABC" + decoded.encoding.should == Encoding::UTF_8 + end + end + + context "when source string specifies octets invalid in target encoding" do + it "uses source string's encoding" do + string = "%A2%A6%A3".encode(Encoding::SHIFT_JIS) + decoded = CGI.unescapeURIComponent(string, Encoding::US_ASCII) + decoded.encoding.should == Encoding::SHIFT_JIS + decoded.should == "「ヲ」".encode(Encoding::SHIFT_JIS) + decoded.valid_encoding?.should == true + end + + it "uses source string's encoding even if it's also invalid" do + string = "%FF".encode(Encoding::US_ASCII) + decoded = CGI.unescapeURIComponent(string, Encoding::SHIFT_JIS) + decoded.encoding.should == Encoding::US_ASCII + decoded.should == "\xFF".dup.force_encoding(Encoding::US_ASCII) + decoded.valid_encoding?.should == false + end + end + + it "decodes an empty string as an empty string with target encoding" do + string = "".encode(Encoding::BINARY) + decoded = CGI.unescapeURIComponent(string, "UTF-8") + decoded.should == "" + decoded.encoding.should == Encoding::UTF_8 + string.should_not.equal?(decoded) + end + + it "raises a TypeError with nil" do + -> { + CGI.unescapeURIComponent(nil) + }.should.raise(TypeError, "no implicit conversion of nil into String") + end + + it "uses implicit type conversion to String" do + object = Object.new + def object.to_str + "a%20b" + end + + CGI.unescapeURIComponent(object).should == "a b" + end +end diff --git a/spec/ruby/library/cgi/unescape_spec.rb b/spec/ruby/library/cgi/unescape_spec.rb index db4834e7e8..aa731b9367 100644 --- a/spec/ruby/library/cgi/unescape_spec.rb +++ b/spec/ruby/library/cgi/unescape_spec.rb @@ -1,6 +1,12 @@ # -*- encoding: utf-8 -*- require_relative '../../spec_helper' -require 'cgi' + +ruby_version_is ""..."4.0" do + require 'cgi' +end +ruby_version_is "4.0" do + require 'cgi/escape' +end describe "CGI.unescape" do it "url-decodes the passed argument" do @@ -8,8 +14,8 @@ describe "CGI.unescape" do expected = " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" CGI.unescape(input).should == expected - input = 'http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' - expected = "http://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" + input = 'https%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' + expected = "https://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" CGI.unescape(input).should == expected end end diff --git a/spec/ruby/library/complex/math/acos_spec.rb b/spec/ruby/library/complex/math/acos_spec.rb deleted file mode 100644 index c7b2362a2c..0000000000 --- a/spec/ruby/library/complex/math/acos_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/acos' - -describe "Math#acos" do - it_behaves_like :complex_math_acos, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:acos) - end -end - -describe "Math.acos" do - it_behaves_like :complex_math_acos, :_, CMath -end diff --git a/spec/ruby/library/complex/math/acosh_spec.rb b/spec/ruby/library/complex/math/acosh_spec.rb deleted file mode 100644 index 33adb73b64..0000000000 --- a/spec/ruby/library/complex/math/acosh_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/acosh' - -describe "Math#acosh" do - it_behaves_like :complex_math_acosh, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:acosh) - end -end - -describe "Math.acosh" do - it_behaves_like :complex_math_acosh, :_, CMath -end diff --git a/spec/ruby/library/complex/math/asin_spec.rb b/spec/ruby/library/complex/math/asin_spec.rb deleted file mode 100644 index f0647bbc14..0000000000 --- a/spec/ruby/library/complex/math/asin_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/asin' - -describe "Math#asin" do - it_behaves_like :complex_math_asin, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:asin) - end -end - -describe "Math.asin" do - it_behaves_like :complex_math_asin, :_, CMath -end diff --git a/spec/ruby/library/complex/math/asinh_spec.rb b/spec/ruby/library/complex/math/asinh_spec.rb deleted file mode 100644 index ef93a9dc22..0000000000 --- a/spec/ruby/library/complex/math/asinh_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/asinh' - -describe "Math#asinh" do - it_behaves_like :complex_math_asinh, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:asinh) - end -end - -describe "Math.asinh" do - it_behaves_like :complex_math_asinh, :_, CMath -end diff --git a/spec/ruby/library/complex/math/atan2_spec.rb b/spec/ruby/library/complex/math/atan2_spec.rb deleted file mode 100644 index 46874f89e4..0000000000 --- a/spec/ruby/library/complex/math/atan2_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/atan2' - -describe "Math#atan2" do - it_behaves_like :complex_math_atan2, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:atan2) - end -end - -describe "Math.atan2" do - it_behaves_like :complex_math_atan2, :_, CMath -end diff --git a/spec/ruby/library/complex/math/atan_spec.rb b/spec/ruby/library/complex/math/atan_spec.rb deleted file mode 100644 index e60c088b5e..0000000000 --- a/spec/ruby/library/complex/math/atan_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/atan' - -describe "Math#atan" do - it_behaves_like :complex_math_atan, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:atan) - end -end - -describe "Math.atan" do - it_behaves_like :complex_math_atan, :_, CMath -end diff --git a/spec/ruby/library/complex/math/atanh_spec.rb b/spec/ruby/library/complex/math/atanh_spec.rb deleted file mode 100644 index b8eaec3a09..0000000000 --- a/spec/ruby/library/complex/math/atanh_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'complex' -require_relative '../../../spec_helper' -require_relative '../../../fixtures/math/common' -require_relative '../../../shared/math/atanh' -require_relative 'shared/atanh' - -describe "Math#atanh" do - it_behaves_like :math_atanh_base, :atanh, IncludesMath.new - it_behaves_like :complex_math_atanh_complex, :atanh, IncludesMath.new - - it_behaves_like :math_atanh_private, :atanh, IncludesMath.new -end - -describe "Math.atanh" do - it_behaves_like :math_atanh_base, :atanh, CMath - it_behaves_like :complex_math_atanh_complex, :atanh, CMath -end diff --git a/spec/ruby/library/complex/math/cos_spec.rb b/spec/ruby/library/complex/math/cos_spec.rb deleted file mode 100644 index 847acb7fa2..0000000000 --- a/spec/ruby/library/complex/math/cos_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/cos' - -describe "Math#cos" do - it_behaves_like :complex_math_cos, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:cos) - end -end - -describe "Math.cos" do - it_behaves_like :complex_math_cos, :_, CMath -end diff --git a/spec/ruby/library/complex/math/cosh_spec.rb b/spec/ruby/library/complex/math/cosh_spec.rb deleted file mode 100644 index c0a87d4865..0000000000 --- a/spec/ruby/library/complex/math/cosh_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/cosh' - -describe "Math#cosh" do - it_behaves_like :complex_math_cosh, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:cosh) - end -end - -describe "Math.cosh" do - it_behaves_like :complex_math_cosh, :_, CMath -end diff --git a/spec/ruby/library/complex/math/exp_spec.rb b/spec/ruby/library/complex/math/exp_spec.rb deleted file mode 100644 index e1e51f7948..0000000000 --- a/spec/ruby/library/complex/math/exp_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/exp' - -describe "Math#exp" do - it_behaves_like :complex_math_exp, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:exp) - end -end - -describe "Math.exp" do - it_behaves_like :complex_math_exp, :_, CMath -end diff --git a/spec/ruby/library/complex/math/fixtures/classes.rb b/spec/ruby/library/complex/math/fixtures/classes.rb deleted file mode 100644 index 443c1a9ace..0000000000 --- a/spec/ruby/library/complex/math/fixtures/classes.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'cmath' -class IncludesMath - include CMath -end diff --git a/spec/ruby/library/complex/math/log10_spec.rb b/spec/ruby/library/complex/math/log10_spec.rb deleted file mode 100644 index 295189ae53..0000000000 --- a/spec/ruby/library/complex/math/log10_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/log10' - -describe "Math#log10" do - it_behaves_like :complex_math_log10, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:log10) - end -end - -describe "Math.log10" do - it_behaves_like :complex_math_log10, :_, CMath -end diff --git a/spec/ruby/library/complex/math/log_spec.rb b/spec/ruby/library/complex/math/log_spec.rb deleted file mode 100644 index 6d80d045c9..0000000000 --- a/spec/ruby/library/complex/math/log_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/log' - -describe "Math#log" do - it_behaves_like :complex_math_log, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:log) - end -end - -describe "Math.log" do - it_behaves_like :complex_math_log, :_, CMath -end diff --git a/spec/ruby/library/complex/math/shared/acos.rb b/spec/ruby/library/complex/math/shared/acos.rb deleted file mode 100644 index 61be31571f..0000000000 --- a/spec/ruby/library/complex/math/shared/acos.rb +++ /dev/null @@ -1,41 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_acos, shared: true do - it "returns the arccosine of the passed argument" do - @object.send(:acos, 1).should be_close(0.0, TOLERANCE) - @object.send(:acos, 0).should be_close(1.5707963267949, TOLERANCE) - @object.send(:acos, -1).should be_close(Math::PI,TOLERANCE) - end - - it "returns the arccosine for Complex numbers" do - @object.send(:acos, Complex(3, 4)).should be_close(Complex(0.93681246115572, -2.30550903124348), TOLERANCE) - end - - it "returns the arccosine for numbers greater than 1.0 as a Complex number" do - @object.send(:acos, 1.0001).should be_close(Complex(0.0, 0.0141420177752494), TOLERANCE) - end - - it "returns the arccosine for numbers less than -1.0 as a Complex number" do - @object.send(:acos, -1.0001).should be_close(Complex(3.14159265358979, -0.0141420177752495), TOLERANCE) - end -end - -describe :complex_math_acos_bang, shared: true do - it "returns the arccosine of the argument" do - @object.send(:acos!, 1).should be_close(0.0, TOLERANCE) - @object.send(:acos!, 0).should be_close(1.5707963267949, TOLERANCE) - @object.send(:acos!, -1).should be_close(Math::PI,TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:acos!, Complex(4, 5)) }.should raise_error(TypeError) - end - - it "raises an Errno::EDOM for numbers greater than 1.0" do - lambda { @object.send(:acos!, 1.0001) }.should raise_error(Errno::EDOM) - end - - it "raises an Errno::EDOM for numbers less than -1.0" do - lambda { @object.send(:acos!, -1.0001) }.should raise_error(Errno::EDOM) - end -end diff --git a/spec/ruby/library/complex/math/shared/acosh.rb b/spec/ruby/library/complex/math/shared/acosh.rb deleted file mode 100644 index a2cd887f95..0000000000 --- a/spec/ruby/library/complex/math/shared/acosh.rb +++ /dev/null @@ -1,37 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_acosh, shared: true do - it "returns the principle value of the inverse hyperbolic cosine of the argument" do - @object.send(:acosh, 14.2).should be_close(3.345146999647, TOLERANCE) - @object.send(:acosh, 1.0).should be_close(0.0, TOLERANCE) - end - - it "returns the principle value of the inverse hyperbolic cosine for numbers less than 1.0 as a Complex number" do - @object.send(:acosh, 1.0 - TOLERANCE).should be_close(Complex(0.0, 0.00774598605746135), TOLERANCE) - @object.send(:acosh, 0).should be_close(Complex(0.0, 1.5707963267949), TOLERANCE) - @object.send(:acosh, -1.0).should be_close(Complex(0.0, 3.14159265358979), TOLERANCE) - end - - it "returns the principle value of the inverse hyperbolic cosine for Complex numbers" do - @object.send(:acosh, Complex(3, 4)) - @object.send(:acosh, Complex(3, 4)).imaginary.should be_close(0.93681246115572, TOLERANCE) - @object.send(:acosh, Complex(3, 4)).real.should be_close(2.305509031243477, TOLERANCE) - end -end - -describe :complex_math_acosh_bang, shared: true do - it "returns the principle value of the inverse hyperbolic cosine of the argument" do - @object.send(:acosh!, 14.2).should be_close(3.345146999647, TOLERANCE) - @object.send(:acosh!, 1.0).should be_close(0.0, TOLERANCE) - end - - it "raises Errno::EDOM for numbers less than 1.0" do - lambda { @object.send(:acosh!, 1.0 - TOLERANCE) }.should raise_error(Errno::EDOM) - lambda { @object.send(:acosh!, 0) }.should raise_error(Errno::EDOM) - lambda { @object.send(:acosh!, -1.0) }.should raise_error(Errno::EDOM) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:acosh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/asin.rb b/spec/ruby/library/complex/math/shared/asin.rb deleted file mode 100644 index 1705745210..0000000000 --- a/spec/ruby/library/complex/math/shared/asin.rb +++ /dev/null @@ -1,47 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_asin, shared: true do - it "returns the arcsine of the argument" do - @object.send(:asin, 1).should be_close(Math::PI/2, TOLERANCE) - @object.send(:asin, 0).should be_close(0.0, TOLERANCE) - @object.send(:asin, -1).should be_close(-Math::PI/2, TOLERANCE) - @object.send(:asin, 0.25).should be_close(0.252680255142079, TOLERANCE) - @object.send(:asin, 0.50).should be_close(0.523598775598299, TOLERANCE) - @object.send(:asin, 0.75).should be_close(0.8480620789814816,TOLERANCE) - end - - it "returns the arcsine for Complex numbers" do - @object.send(:asin, Complex(3, 4)).should be_close(Complex(0.633983865639174, 2.30550903124347), TOLERANCE) - end - - it "returns a Complex number when the argument is greater than 1.0" do - @object.send(:asin, 1.0001).should be_close(Complex(1.5707963267949, -0.0141420177752494), TOLERANCE) - end - - it "returns a Complex number when the argument is less than -1.0" do - @object.send(:asin, -1.0001).should be_close(Complex(-1.5707963267949, 0.0141420177752494), TOLERANCE) - end -end - -describe :complex_math_asin_bang, shared: true do - it "returns the arcsine of the argument" do - @object.send(:asin!, 1).should be_close(Math::PI/2, TOLERANCE) - @object.send(:asin!, 0).should be_close(0.0, TOLERANCE) - @object.send(:asin!, -1).should be_close(-Math::PI/2, TOLERANCE) - @object.send(:asin!, 0.25).should be_close(0.252680255142079, TOLERANCE) - @object.send(:asin!, 0.50).should be_close(0.523598775598299, TOLERANCE) - @object.send(:asin!, 0.75).should be_close(0.8480620789814816,TOLERANCE) - end - - it "raises an Errno::EDOM if the argument is greater than 1.0" do - lambda { @object.send(:asin!, 1.0001) }.should raise_error( Errno::EDOM) - end - - it "raises an Errno::EDOM if the argument is less than -1.0" do - lambda { @object.send(:asin!, -1.0001) }.should raise_error( Errno::EDOM) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:asin!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/asinh.rb b/spec/ruby/library/complex/math/shared/asinh.rb deleted file mode 100644 index b4256e7475..0000000000 --- a/spec/ruby/library/complex/math/shared/asinh.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_asinh, shared: true do - it "returns the inverse hyperbolic sin of the argument" do - @object.send(:asinh, 1.5).should be_close(1.19476321728711, TOLERANCE) - @object.send(:asinh, -2.97).should be_close(-1.8089166921397, TOLERANCE) - @object.send(:asinh, 0.0).should == 0.0 - @object.send(:asinh, -0.0).should == -0.0 - @object.send(:asinh, 1.05367e-08).should be_close(1.05367e-08, TOLERANCE) - @object.send(:asinh, -1.05367e-08).should be_close(-1.05367e-08, TOLERANCE) - end - - it "returns the inverse hyperbolic sin for Complex numbers" do - @object.send(:asinh, Complex(3, 4)).should be_close(Complex(2.29991404087927, 0.917616853351479), TOLERANCE) - @object.send(:asinh, Complex(3.5, -4)).should be_close(Complex(2.36263337274419, -0.843166327537659), TOLERANCE) - end -end - -describe :complex_math_asinh_bang, shared: true do - it "returns the inverse hyperbolic sin of the argument" do - @object.send(:asinh!, 1.5).should be_close(1.19476321728711, TOLERANCE) - @object.send(:asinh!, -2.97).should be_close(-1.8089166921397, TOLERANCE) - @object.send(:asinh!, 0.0).should == 0.0 - @object.send(:asinh!, -0.0).should == -0.0 - @object.send(:asinh!, 1.05367e-08).should be_close(1.05367e-08, TOLERANCE) - @object.send(:asinh!, -1.05367e-08).should be_close(-1.05367e-08, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:asinh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/atan.rb b/spec/ruby/library/complex/math/shared/atan.rb deleted file mode 100644 index 46c1897407..0000000000 --- a/spec/ruby/library/complex/math/shared/atan.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_atan, shared: true do - it "returns the arctangent of the argument" do - @object.send(:atan, 1).should be_close(Math::PI/4, TOLERANCE) - @object.send(:atan, 0).should be_close(0.0, TOLERANCE) - @object.send(:atan, -1).should be_close(-Math::PI/4, TOLERANCE) - @object.send(:atan, 0.25).should be_close(0.244978663126864, TOLERANCE) - @object.send(:atan, 0.50).should be_close(0.463647609000806, TOLERANCE) - @object.send(:atan, 0.75).should be_close(0.643501108793284, TOLERANCE) - end - - it "returns the arctangent for Complex numbers" do - @object.send(:atan, Complex(3, 4)).should be_close(Complex(1.44830699523146, 0.158997191679999), TOLERANCE) - @object.send(:atan, Complex(3.5, -4)).should be_close(Complex(1.44507428165589, -0.140323762363786), TOLERANCE) - end -end - -describe :complex_math_atan_bang, shared: true do - it "returns the arctangent of the argument" do - @object.send(:atan!, 1).should be_close(Math::PI/4, TOLERANCE) - @object.send(:atan!, 0).should be_close(0.0, TOLERANCE) - @object.send(:atan!, -1).should be_close(-Math::PI/4, TOLERANCE) - @object.send(:atan!, 0.25).should be_close(0.244978663126864, TOLERANCE) - @object.send(:atan!, 0.50).should be_close(0.463647609000806, TOLERANCE) - @object.send(:atan!, 0.75).should be_close(0.643501108793284, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:atan!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/atan2.rb b/spec/ruby/library/complex/math/shared/atan2.rb deleted file mode 100644 index 3305d695c5..0000000000 --- a/spec/ruby/library/complex/math/shared/atan2.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_atan2, shared: true do - it "returns the arc tangent of the passed arguments" do - @object.send(:atan2, 4.2, 0.3).should be_close(1.49948886200961, TOLERANCE) - @object.send(:atan2, 0.0, 1.0).should be_close(0.0, TOLERANCE) - @object.send(:atan2, -9.1, 3.2).should be_close(-1.23265379809025, TOLERANCE) - @object.send(:atan2, 7.22, -3.3).should be_close(1.99950888779256, TOLERANCE) - end - - it "returns the arc tangent for two Complex numbers" do - CMath.atan2(Complex(3, 4), Complex(3.5, -4)).should be_close(Complex(-0.641757436698881, 1.10829873031207), TOLERANCE) - end - - it "returns the arc tangent for Complex and real numbers" do - CMath.atan2(Complex(3, 4), -7).should be_close(Complex(2.61576754731561, -0.494290673139855), TOLERANCE) - CMath.atan2(5, Complex(3.5, -4)).should be_close(Complex(0.739102348493673, 0.487821626522923), TOLERANCE) - end -end - -describe :complex_math_atan2_bang, shared: true do - it "returns the arc tangent of the passed arguments" do - @object.send(:atan2!, 4.2, 0.3).should be_close(1.49948886200961, TOLERANCE) - @object.send(:atan2!, 0.0, 1.0).should be_close(0.0, TOLERANCE) - @object.send(:atan2!, -9.1, 3.2).should be_close(-1.23265379809025, TOLERANCE) - @object.send(:atan2!, 7.22, -3.3).should be_close(1.99950888779256, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:atan2!, Complex(4, 5), Complex(4, 5)) }.should raise_error(TypeError) - lambda { @object.send(:atan2!, 4, Complex(4, 5)) }.should raise_error(TypeError) - lambda { @object.send(:atan2!, Complex(4, 5), 5) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/atanh.rb b/spec/ruby/library/complex/math/shared/atanh.rb deleted file mode 100644 index ebd4d7c223..0000000000 --- a/spec/ruby/library/complex/math/shared/atanh.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_atanh_complex, shared: true do - it "returns the inverse hyperbolic tangent as a Complex number for arguments greater than 1.0" do - value = Complex(18.36840028483855, 1.5707963267948966) - @object.send(@method, 1.0 + Float::EPSILON).should be_close(value, TOLERANCE) - - value = Complex(0.100335347731076, 1.5707963267949) - @object.send(@method, 10).should be_close(value, TOLERANCE) - end - - it "returns the inverse hyperbolic tangent as a Complex number for arguments greater than 1.0" do - value = Complex(-18.36840028483855, 1.5707963267948966) - @object.send(@method, -1.0 - Float::EPSILON).should be_close(value, TOLERANCE) - - value = Complex(0.100335347731076, 1.5707963267949) - @object.send(@method, 10).should be_close(value, TOLERANCE) - end - - it "returns the inverse hyperbolic tangent for Complex numbers" do - value = Complex(0.117500907311434, 1.40992104959658) - @object.send(@method, Complex(3, 4)).should be_close(value, TOLERANCE) - end -end - -describe :complex_math_atanh_no_complex, shared: true do - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:atanh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/cos.rb b/spec/ruby/library/complex/math/shared/cos.rb deleted file mode 100644 index ddd8512231..0000000000 --- a/spec/ruby/library/complex/math/shared/cos.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_cos, shared: true do - it "returns the cosine of the argument expressed in radians" do - @object.send(:cos, CMath::PI).should be_close(-1.0, TOLERANCE) - @object.send(:cos, 0).should be_close(1.0, TOLERANCE) - @object.send(:cos, CMath::PI/2).should be_close(0.0, TOLERANCE) - @object.send(:cos, 3*Math::PI/2).should be_close(0.0, TOLERANCE) - @object.send(:cos, 2*Math::PI).should be_close(1.0, TOLERANCE) - end - - it "returns the cosine for Complex numbers" do - @object.send(:cos, Complex(0, CMath::PI)).should be_close(Complex(11.5919532755215, 0.0), TOLERANCE) - @object.send(:cos, Complex(3, 4)).should be_close(Complex(-27.0349456030742, -3.85115333481178), TOLERANCE) - end -end - -describe :complex_math_cos_bang, shared: true do - it "returns the cosine of the argument expressed in radians" do - @object.send(:cos!, CMath::PI).should be_close(-1.0, TOLERANCE) - @object.send(:cos!, 0).should be_close(1.0, TOLERANCE) - @object.send(:cos!, CMath::PI/2).should be_close(0.0, TOLERANCE) - @object.send(:cos!, 3*Math::PI/2).should be_close(0.0, TOLERANCE) - @object.send(:cos!, 2*Math::PI).should be_close(1.0, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:cos!, Complex(3, 4)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/cosh.rb b/spec/ruby/library/complex/math/shared/cosh.rb deleted file mode 100644 index a56a655cd5..0000000000 --- a/spec/ruby/library/complex/math/shared/cosh.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_cosh, shared: true do - it "returns the hyperbolic cosine of the passed argument" do - @object.send(:cosh, 0.0).should == 1.0 - @object.send(:cosh, -0.0).should == 1.0 - @object.send(:cosh, 1.5).should be_close(2.35240961524325, TOLERANCE) - @object.send(:cosh, -2.99).should be_close(9.96798496414416, TOLERANCE) - end - - it "returns the hyperbolic cosine for Complex numbers" do - @object.send(:cosh, Complex(0, CMath::PI)).should be_close(Complex(-1.0, 0.0), TOLERANCE) - @object.send(:cosh, Complex(3, 4)).should be_close(Complex(-6.58066304055116, -7.58155274274654), TOLERANCE) - end -end - -describe :complex_math_cosh_bang, shared: true do - it "returns the hyperbolic cosine of the passed argument" do - @object.send(:cosh!, 0.0).should == 1.0 - @object.send(:cosh!, -0.0).should == 1.0 - @object.send(:cosh!, 1.5).should be_close(2.35240961524325, TOLERANCE) - @object.send(:cosh!, -2.99).should be_close(9.96798496414416, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:cosh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/exp.rb b/spec/ruby/library/complex/math/shared/exp.rb deleted file mode 100644 index 91ab5739be..0000000000 --- a/spec/ruby/library/complex/math/shared/exp.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_exp, shared: true do - it "returns the base-e exponential of the passed argument" do - @object.send(:exp, 0.0).should == 1.0 - @object.send(:exp, -0.0).should == 1.0 - @object.send(:exp, -1.8).should be_close(0.165298888221587, TOLERANCE) - @object.send(:exp, 1.25).should be_close(3.49034295746184, TOLERANCE) - end - - it "returns the base-e exponential for Complex numbers" do - @object.send(:exp, Complex(0, 0)).should == Complex(1.0, 0.0) - @object.send(:exp, Complex(1, 3)).should be_close(Complex(-2.69107861381979, 0.383603953541131), TOLERANCE) - end -end - -describe :complex_math_exp_bang, shared: true do - it "returns the base-e exponential of the passed argument" do - @object.send(:exp!, 0.0).should == 1.0 - @object.send(:exp!, -0.0).should == 1.0 - @object.send(:exp!, -1.8).should be_close(0.165298888221587, TOLERANCE) - @object.send(:exp!, 1.25).should be_close(3.49034295746184, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:exp!, Complex(1, 3)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/log.rb b/spec/ruby/library/complex/math/shared/log.rb deleted file mode 100644 index f3aad0d66a..0000000000 --- a/spec/ruby/library/complex/math/shared/log.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_log, shared: true do - it "returns the natural logarithm of the passed argument" do - @object.send(:log, 0.0001).should be_close(-9.21034037197618, TOLERANCE) - @object.send(:log, 0.000000000001e-15).should be_close(-62.1697975108392, TOLERANCE) - @object.send(:log, 1).should be_close(0.0, TOLERANCE) - @object.send(:log, 10).should be_close( 2.30258509299405, TOLERANCE) - @object.send(:log, 10e15).should be_close(36.8413614879047, TOLERANCE) - end - - it "returns the natural logarithm for Complex numbers" do - @object.send(:log, Complex(3, 4)).should be_close(Complex(1.6094379124341, 0.927295218001612), TOLERANCE) - @object.send(:log, Complex(-3, 4)).should be_close(Complex(1.6094379124341, 2.21429743558818), TOLERANCE) - end - - it "returns the natural logarithm for negative numbers as a Complex number" do - @object.send(:log, -10).should be_close(Complex(2.30258509299405, 3.14159265358979), TOLERANCE) - @object.send(:log, -20).should be_close(Complex(2.99573227355399, 3.14159265358979), TOLERANCE) - end -end - -describe :complex_math_log_bang, shared: true do - it "returns the natural logarithm of the argument" do - @object.send(:log!, 0.0001).should be_close(-9.21034037197618, TOLERANCE) - @object.send(:log!, 0.000000000001e-15).should be_close(-62.1697975108392, TOLERANCE) - @object.send(:log!, 1).should be_close(0.0, TOLERANCE) - @object.send(:log!, 10).should be_close( 2.30258509299405, TOLERANCE) - @object.send(:log!, 10e15).should be_close(36.8413614879047, TOLERANCE) - end - - it "raises an Errno::EDOM if the argument is less than 0" do - lambda { @object.send(:log!, -10) }.should raise_error(Errno::EDOM) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:log!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/log10.rb b/spec/ruby/library/complex/math/shared/log10.rb deleted file mode 100644 index a2cf5344bf..0000000000 --- a/spec/ruby/library/complex/math/shared/log10.rb +++ /dev/null @@ -1,41 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_log10, shared: true do - it "returns the base-10 logarithm of the passed argument" do - @object.send(:log10, 0.0001).should be_close(-4.0, TOLERANCE) - @object.send(:log10, 0.000000000001e-15).should be_close(-27.0, TOLERANCE) - @object.send(:log10, 1).should be_close(0.0, TOLERANCE) - @object.send(:log10, 10).should be_close(1.0, TOLERANCE) - @object.send(:log10, 10e15).should be_close(16.0, TOLERANCE) - end - - it "returns the base-10 logarithm for Complex numbers" do - @object.send(:log10, Complex(3, 4)).should be_close(Complex(0.698970004336019, 0.402719196273373), TOLERANCE) - @object.send(:log10, Complex(-3, 4)).should be_close(Complex(0.698970004336019, 0.961657157568468), TOLERANCE) - end - - # BUG: does not work correctly, because Math#log10 - # does not check for negative values - #it "returns the base-10 logarithm for negative numbers as a Complex number" do - # @object.send(:log10, -10).should be_close(Complex(2.30258509299405, 3.14159265358979), TOLERANCE) - # @object.send(:log10, -20).should be_close(Complex(2.99573227355399, 3.14159265358979), TOLERANCE) - #end -end - -describe :complex_math_log10_bang, shared: true do - it "returns the base-10 logarithm of the argument" do - @object.send(:log10!, 0.0001).should be_close(-4.0, TOLERANCE) - @object.send(:log10!, 0.000000000001e-15).should be_close(-27.0, TOLERANCE) - @object.send(:log10!, 1).should be_close(0.0, TOLERANCE) - @object.send(:log10!, 10).should be_close(1.0, TOLERANCE) - @object.send(:log10!, 10e15).should be_close(16.0, TOLERANCE) - end - - it "raises an Errno::EDOM when the passed argument is negative" do - lambda { @object.send(:log10!, -10) }.should raise_error(Errno::EDOM) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:log10!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/sin.rb b/spec/ruby/library/complex/math/shared/sin.rb deleted file mode 100644 index 418ba5d810..0000000000 --- a/spec/ruby/library/complex/math/shared/sin.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_sin, shared: true do - it "returns the sine of the passed argument expressed in radians" do - @object.send(:sin, CMath::PI).should be_close(0.0, TOLERANCE) - @object.send(:sin, 0).should be_close(0.0, TOLERANCE) - @object.send(:sin, CMath::PI/2).should be_close(1.0, TOLERANCE) - @object.send(:sin, 3*Math::PI/2).should be_close(-1.0, TOLERANCE) - @object.send(:sin, 2*Math::PI).should be_close(0.0, TOLERANCE) - end - - it "returns the sine for Complex numbers" do - @object.send(:sin, Complex(0, CMath::PI)).should be_close(Complex(0.0, 11.5487393572577), TOLERANCE) - @object.send(:sin, Complex(3, 4)).should be_close(Complex(3.85373803791938, -27.0168132580039), TOLERANCE) - end -end - -describe :complex_math_sin_bang, shared: true do - it "returns the sine of the passed argument expressed in radians" do - @object.send(:sin!, CMath::PI).should be_close(0.0, TOLERANCE) - @object.send(:sin!, 0).should be_close(0.0, TOLERANCE) - @object.send(:sin!, CMath::PI/2).should be_close(1.0, TOLERANCE) - @object.send(:sin!, 3*Math::PI/2).should be_close(-1.0, TOLERANCE) - @object.send(:sin!, 2*Math::PI).should be_close(0.0, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:sin!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/sinh.rb b/spec/ruby/library/complex/math/shared/sinh.rb deleted file mode 100644 index bd85bd0799..0000000000 --- a/spec/ruby/library/complex/math/shared/sinh.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_sinh, shared: true do - it "returns the hyperbolic sin of the argument" do - @object.send(:sinh, 0.0).should == 0.0 - @object.send(:sinh, -0.0).should == 0.0 - @object.send(:sinh, 1.5).should be_close(2.12927945509482, TOLERANCE) - @object.send(:sinh, -2.8).should be_close(-8.19191835423591, TOLERANCE) - end - - it "returns the hyperbolic sin for Complex numbers" do - @object.send(:sinh, Complex(0, CMath::PI)).should be_close(Complex(-0.0, 1.22464679914735e-16), TOLERANCE) - @object.send(:sinh, Complex(3, 4)).should be_close(Complex(-6.548120040911, -7.61923172032141), TOLERANCE) - end -end - -describe :complex_math_sinh_bang, shared: true do - it "returns the hyperbolic sin of the argument" do - @object.send(:sinh!, 0.0).should == 0.0 - @object.send(:sinh!, -0.0).should == 0.0 - @object.send(:sinh!, 1.5).should be_close(2.12927945509482, TOLERANCE) - @object.send(:sinh!, -2.8).should be_close(-8.19191835423591, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:sinh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/sqrt.rb b/spec/ruby/library/complex/math/shared/sqrt.rb deleted file mode 100644 index b6a289c3f9..0000000000 --- a/spec/ruby/library/complex/math/shared/sqrt.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_sqrt, shared: true do - it "returns the square root for positive numbers" do - @object.send(:sqrt, 4).should == 2 - @object.send(:sqrt, 19.36).should == 4.4 - end - - it "returns the square root for negative numbers" do - @object.send(:sqrt, -4).should == Complex(0, 2.0) - @object.send(:sqrt, -19.36).should == Complex(0, 4.4) - end - - it "returns the square root for Complex numbers" do - @object.send(:sqrt, Complex(4, 5)).should be_close(Complex(2.2806933416653, 1.09615788950152), TOLERANCE) - @object.send(:sqrt, Complex(4, -5)).should be_close(Complex(2.2806933416653, -1.09615788950152), TOLERANCE) - end -end - -describe :complex_math_sqrt_bang, shared: true do - it "returns the square root for positive numbers" do - @object.send(:sqrt!, 4).should == 2 - @object.send(:sqrt!, 19.36).should == 4.4 - end - - it "raises Errno::EDOM when the passed argument is negative" do - lambda { @object.send(:sqrt!, -4) }.should raise_error(Errno::EDOM) - lambda { @object.send(:sqrt!, -19.36) }.should raise_error(Errno::EDOM) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:sqrt!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/tan.rb b/spec/ruby/library/complex/math/shared/tan.rb deleted file mode 100644 index df7a6ff19b..0000000000 --- a/spec/ruby/library/complex/math/shared/tan.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_tan, shared: true do - it "returns the tangent of the argument" do - @object.send(:tan, 0.0).should == 0.0 - @object.send(:tan, -0.0).should == -0.0 - @object.send(:tan, 4.22).should be_close(1.86406937682395, TOLERANCE) - @object.send(:tan, -9.65).should be_close(-0.229109052606441, TOLERANCE) - end - - it "returns the tangent for Complex numbers" do - @object.send(:tan, Complex(0, CMath::PI)).should be_close(Complex(0.0, 0.99627207622075), TOLERANCE) - @object.send(:tan, Complex(3, 4)).should be_close(Complex(-0.000187346204629452, 0.999355987381473), TOLERANCE) - end -end - -describe :complex_math_tan_bang, shared: true do - it "returns the tangent of the argument" do - @object.send(:tan!, 0.0).should == 0.0 - @object.send(:tan!, -0.0).should == -0.0 - @object.send(:tan!, 4.22).should be_close(1.86406937682395, TOLERANCE) - @object.send(:tan!, -9.65).should be_close(-0.229109052606441, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:tan!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/shared/tanh.rb b/spec/ruby/library/complex/math/shared/tanh.rb deleted file mode 100644 index 7bf07f9a3f..0000000000 --- a/spec/ruby/library/complex/math/shared/tanh.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../fixtures/classes' - -describe :complex_math_tanh, shared: true do - it "returns the hyperbolic tangent of the argument" do - @object.send(:tanh, 0.0).should == 0.0 - @object.send(:tanh, -0.0).should == -0.0 - @object.send(:tanh, infinity_value).should == 1.0 - @object.send(:tanh, -infinity_value).should == -1.0 - @object.send(:tanh, 2.5).should be_close(0.98661429815143, TOLERANCE) - @object.send(:tanh, -4.892).should be_close(-0.999887314427707, TOLERANCE) - end - - it "returns the hyperbolic tangent for Complex numbers" do - @object.send(:tanh, Complex(0, CMath::PI)).should be_close(Complex(0.0, -1.22464679914735e-16), TOLERANCE) - @object.send(:tanh, Complex(3, 4)).should be_close(Complex(1.00070953606723, 0.00490825806749599), TOLERANCE) - end -end - -describe :complex_math_tanh_bang, shared: true do - it "returns the hyperbolic tangent of the argument" do - @object.send(:tanh!, 0.0).should == 0.0 - @object.send(:tanh!, -0.0).should == -0.0 - @object.send(:tanh!, infinity_value).should == 1.0 - @object.send(:tanh!, -infinity_value).should == -1.0 - @object.send(:tanh!, 2.5).should be_close(0.98661429815143, TOLERANCE) - @object.send(:tanh!, -4.892).should be_close(-0.999887314427707, TOLERANCE) - end - - it "raises a TypeError when passed a Complex number" do - lambda { @object.send(:tanh!, Complex(4, 5)) }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/complex/math/sin_spec.rb b/spec/ruby/library/complex/math/sin_spec.rb deleted file mode 100644 index 6046cd29c3..0000000000 --- a/spec/ruby/library/complex/math/sin_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/sin' - -describe "Math#sin" do - it_behaves_like :complex_math_sin, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:sin) - end -end - -describe "Math.sin" do - it_behaves_like :complex_math_sin, :_, CMath -end diff --git a/spec/ruby/library/complex/math/sinh_spec.rb b/spec/ruby/library/complex/math/sinh_spec.rb deleted file mode 100644 index f5f98778b2..0000000000 --- a/spec/ruby/library/complex/math/sinh_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/sinh' - -describe "Math#sinh" do - it_behaves_like :complex_math_sinh, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:sinh) - end -end - -describe "Math.sinh" do - it_behaves_like :complex_math_sinh, :_, CMath -end diff --git a/spec/ruby/library/complex/math/sqrt_spec.rb b/spec/ruby/library/complex/math/sqrt_spec.rb deleted file mode 100644 index 8b7050c108..0000000000 --- a/spec/ruby/library/complex/math/sqrt_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/sqrt' - -describe "Math#sqrt" do - it_behaves_like :complex_math_sqrt, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:sqrt) - end -end - -describe "Math.sqrt" do - it_behaves_like :complex_math_sqrt, :_, CMath -end diff --git a/spec/ruby/library/complex/math/tan_spec.rb b/spec/ruby/library/complex/math/tan_spec.rb deleted file mode 100644 index b0f18bb515..0000000000 --- a/spec/ruby/library/complex/math/tan_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/tan' - -describe "Math#tan" do - it_behaves_like :complex_math_tan, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:tan) - end -end - -describe "Math.tan" do - it_behaves_like :complex_math_tan, :_, CMath -end diff --git a/spec/ruby/library/complex/math/tanh_spec.rb b/spec/ruby/library/complex/math/tanh_spec.rb deleted file mode 100644 index 469bba7554..0000000000 --- a/spec/ruby/library/complex/math/tanh_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'complex' -require_relative 'shared/tanh' - -describe "Math#tanh" do - it_behaves_like :complex_math_tanh, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:tanh) - end -end - -describe "Math.tanh" do - it_behaves_like :complex_math_tanh, :_, CMath -end diff --git a/spec/ruby/library/complex/numeric/im_spec.rb b/spec/ruby/library/complex/numeric/im_spec.rb deleted file mode 100644 index 17f4a0476b..0000000000 --- a/spec/ruby/library/complex/numeric/im_spec.rb +++ /dev/null @@ -1,3 +0,0 @@ -require_relative '../../../spec_helper' - -require 'complex' diff --git a/spec/ruby/library/conditionvariable/broadcast_spec.rb b/spec/ruby/library/conditionvariable/broadcast_spec.rb deleted file mode 100644 index a31a0443bd..0000000000 --- a/spec/ruby/library/conditionvariable/broadcast_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -require_relative '../../spec_helper' -require 'thread' - -describe "ConditionVariable#broadcast" do - it "returns self if nothing to broadcast to" do - cv = ConditionVariable.new - cv.broadcast.should == cv - end - - it "returns self if something is waiting for a broadcast" do - m = Mutex.new - cv = ConditionVariable.new - in_synchronize = false - - th = Thread.new do - m.synchronize do - in_synchronize = true - cv.wait(m) - end - end - - # wait for m to acquire the mutex - Thread.pass until in_synchronize - # wait until th is sleeping (ie waiting) - Thread.pass while th.status and th.status != "sleep" - - m.synchronize { cv.broadcast }.should == cv - - th.join - end - - it "releases all threads waiting in line for this resource" do - m = Mutex.new - cv = ConditionVariable.new - threads = [] - r1 = [] - r2 = [] - - # large number to attempt to cause race conditions - 100.times do |i| - threads << Thread.new(i) do |tid| - m.synchronize do - r1 << tid - cv.wait(m) - r2 << tid - end - end - end - - # wait for all threads to acquire the mutex the first time - Thread.pass until m.synchronize { r1.size == threads.size } - # wait until all threads are sleeping (ie waiting) - Thread.pass until threads.all? {|th| th.status == "sleep" } - - r2.should be_empty - m.synchronize do - cv.broadcast - end - - threads.each {|t| t.join } - - # ensure that all threads that enter cv.wait are released - r2.sort.should == r1.sort - # note that order is not specified as broadcast results in a race - # condition on regaining the lock m - end -end diff --git a/spec/ruby/library/conditionvariable/marshal_dump_spec.rb b/spec/ruby/library/conditionvariable/marshal_dump_spec.rb deleted file mode 100644 index f951a13e28..0000000000 --- a/spec/ruby/library/conditionvariable/marshal_dump_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../spec_helper' -require 'thread' - -describe "ConditionVariable#marshal_dump" do - it "raises a TypeError" do - cv = ConditionVariable.new - -> { cv.marshal_dump }.should raise_error(TypeError, /can't dump/) - end -end diff --git a/spec/ruby/library/conditionvariable/signal_spec.rb b/spec/ruby/library/conditionvariable/signal_spec.rb deleted file mode 100644 index 0dafe8527f..0000000000 --- a/spec/ruby/library/conditionvariable/signal_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require_relative '../../spec_helper' -require 'thread' - -describe "ConditionVariable#signal" do - it "returns self if nothing to signal" do - cv = ConditionVariable.new - cv.signal.should == cv - end - - it "returns self if something is waiting for a signal" do - m = Mutex.new - cv = ConditionVariable.new - in_synchronize = false - - th = Thread.new do - m.synchronize do - in_synchronize = true - cv.wait(m) - end - end - - # wait for m to acquire the mutex - Thread.pass until in_synchronize - # wait until th is sleeping (ie waiting) - Thread.pass while th.status and th.status != "sleep" - - m.synchronize { cv.signal }.should == cv - - th.join - end - - it "releases the first thread waiting in line for this resource" do - m = Mutex.new - cv = ConditionVariable.new - threads = [] - r1 = [] - r2 = [] - - # large number to attempt to cause race conditions - 100.times do |i| - threads << Thread.new(i) do |tid| - m.synchronize do - r1 << tid - cv.wait(m) - r2 << tid - end - end - end - - # wait for all threads to acquire the mutex the first time - Thread.pass until m.synchronize { r1.size == threads.size } - # wait until all threads are sleeping (ie waiting) - Thread.pass until threads.all? {|th| th.status == "sleep" } - - r2.should be_empty - 100.times do |i| - m.synchronize do - cv.signal - end - Thread.pass until r2.size == i+1 - end - - threads.each {|t| t.join } - - # ensure that all the threads that went into the cv.wait are - # released in the same order - r2.should == r1 - end -end diff --git a/spec/ruby/library/conditionvariable/wait_spec.rb b/spec/ruby/library/conditionvariable/wait_spec.rb deleted file mode 100644 index 8bdb7829d3..0000000000 --- a/spec/ruby/library/conditionvariable/wait_spec.rb +++ /dev/null @@ -1,123 +0,0 @@ -require_relative '../../spec_helper' -require 'thread' - -describe "ConditionVariable#wait" do - it "returns self" do - m = Mutex.new - cv = ConditionVariable.new - in_synchronize = false - - th = Thread.new do - m.synchronize do - in_synchronize = true - cv.wait(m).should == cv - end - end - - # wait for m to acquire the mutex - Thread.pass until in_synchronize - # wait until th is sleeping (ie waiting) - Thread.pass while th.status and th.status != "sleep" - - m.synchronize { cv.signal } - th.join - end - - it "reacquires the lock even if the thread is killed" do - m = Mutex.new - cv = ConditionVariable.new - in_synchronize = false - owned = nil - - th = Thread.new do - m.synchronize do - in_synchronize = true - begin - cv.wait(m) - ensure - owned = m.owned? - $stderr.puts "\nThe Thread doesn't own the Mutex!" unless owned - end - end - end - - # wait for m to acquire the mutex - Thread.pass until in_synchronize - # wait until th is sleeping (ie waiting) - Thread.pass while th.status and th.status != "sleep" - - th.kill - th.join - - owned.should == true - end - - ruby_bug '#14999', ''...'2.5' do - it "reacquires the lock even if the thread is killed after being signaled" do - m = Mutex.new - cv = ConditionVariable.new - in_synchronize = false - owned = nil - - th = Thread.new do - m.synchronize do - in_synchronize = true - begin - cv.wait(m) - ensure - owned = m.owned? - $stderr.puts "\nThe Thread doesn't own the Mutex!" unless owned - end - end - end - - # wait for m to acquire the mutex - Thread.pass until in_synchronize - # wait until th is sleeping (ie waiting) - Thread.pass while th.status and th.status != "sleep" - - m.synchronize { - cv.signal - # Wait that the thread is blocked on acquiring the Mutex - sleep 0.001 - # Kill the thread, yet the thread should first acquire the Mutex before going on - th.kill - } - - th.join - owned.should == true - end - end - - it "supports multiple Threads waiting on the same ConditionVariable and Mutex" do - m = Mutex.new - cv = ConditionVariable.new - n_threads = 4 - events = [] - - threads = n_threads.times.map { - Thread.new { - m.synchronize { - events << :t_in_synchronize - cv.wait(m) - } - } - } - - Thread.pass until m.synchronize { events.size } == n_threads - Thread.pass while threads.any? { |th| th.status and th.status != "sleep" } - m.synchronize do - threads.each { |t| - # Cause interactions with the waiting threads. - # On TruffleRuby, this causes a safepoint which has interesting - # interactions with the ConditionVariable. - bt = t.backtrace - bt.should be_kind_of(Array) - bt.size.should >= 2 - } - end - - cv.broadcast - threads.each(&:join) - end -end diff --git a/spec/ruby/library/coverage/fixtures/code_with_begin.rb b/spec/ruby/library/coverage/fixtures/code_with_begin.rb new file mode 100644 index 0000000000..9a6384e337 --- /dev/null +++ b/spec/ruby/library/coverage/fixtures/code_with_begin.rb @@ -0,0 +1,3 @@ +begin + 'coverage with begin' +end diff --git a/spec/ruby/library/coverage/fixtures/eval_code.rb b/spec/ruby/library/coverage/fixtures/eval_code.rb new file mode 100644 index 0000000000..8ab82218f3 --- /dev/null +++ b/spec/ruby/library/coverage/fixtures/eval_code.rb @@ -0,0 +1,11 @@ +5 + 5 + +module CoverageSpecs + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + attr_reader :ok + RUBY + +end + +4 + 4 diff --git a/spec/ruby/library/coverage/fixtures/spec_helper.rb b/spec/ruby/library/coverage/fixtures/spec_helper.rb deleted file mode 100644 index 19094e5c36..0000000000 --- a/spec/ruby/library/coverage/fixtures/spec_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -module CoverageSpecs - # Clear old results from the result hash - # https://bugs.ruby-lang.org/issues/12220 - def self.filtered_result - result = Coverage.result - ruby_version_is ""..."2.4" do - result = result.reject { |_k, v| v.empty? } - end - result - end -end diff --git a/spec/ruby/library/coverage/peek_result_spec.rb b/spec/ruby/library/coverage/peek_result_spec.rb index 897fc4d978..9d7c890faa 100644 --- a/spec/ruby/library/coverage/peek_result_spec.rb +++ b/spec/ruby/library/coverage/peek_result_spec.rb @@ -1,5 +1,4 @@ require_relative '../../spec_helper' -require fixture __FILE__, 'spec_helper' require 'coverage' describe 'Coverage.peek_result' do diff --git a/spec/ruby/library/coverage/result_spec.rb b/spec/ruby/library/coverage/result_spec.rb index f964c9457a..2e7d598bb8 100644 --- a/spec/ruby/library/coverage/result_spec.rb +++ b/spec/ruby/library/coverage/result_spec.rb @@ -1,22 +1,31 @@ require_relative '../../spec_helper' -require fixture __FILE__, 'spec_helper' require 'coverage' describe 'Coverage.result' do before :all do @class_file = fixture __FILE__, 'some_class.rb' @config_file = fixture __FILE__, 'start_coverage.rb' + @eval_code_file = fixture __FILE__, 'eval_code.rb' + @with_begin_file = fixture __FILE__, 'code_with_begin.rb' + end + + before :each do + Coverage.running?.should == false end after :each do $LOADED_FEATURES.delete(@class_file) $LOADED_FEATURES.delete(@config_file) + $LOADED_FEATURES.delete(@eval_code_file) + $LOADED_FEATURES.delete(@with_begin_file) + + Coverage.result if Coverage.running? end it 'gives the covered files as a hash with arrays of count or nil' do Coverage.start require @class_file.chomp('.rb') - result = CoverageSpecs.filtered_result + result = Coverage.result result.should == { @class_file => [ @@ -25,9 +34,42 @@ describe 'Coverage.result' do } end + it 'returns results for each mode separately when enabled :all modes' do + Coverage.start(:all) + require @class_file.chomp('.rb') + result = Coverage.result + + result.should == { + @class_file => { + lines: [ + nil, nil, 1, nil, nil, 1, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ], + branches: {}, + methods: { + [SomeClass, :some_method, 6, 2, 11, 5] => 0 + } + } + } + end + + it 'returns results for each mode separately when enabled any mode explicitly' do + Coverage.start(lines: true) + require @class_file.chomp('.rb') + result = Coverage.result + + result.should == { + @class_file => + { + lines: [ + nil, nil, 1, nil, nil, 1, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + } + end + it 'no requires/loads should give empty hash' do Coverage.start - result = CoverageSpecs.filtered_result + result = Coverage.result result.should == {} end @@ -36,18 +78,19 @@ describe 'Coverage.result' do Coverage.start require @class_file.chomp('.rb') Coverage.result - -> { Coverage.result } - .should raise_error(RuntimeError, 'coverage measurement is not enabled') + -> { + Coverage.result + }.should.raise(RuntimeError, 'coverage measurement is not enabled') end it 'second run should give same result' do Coverage.start load @class_file - result1 = CoverageSpecs.filtered_result + result1 = Coverage.result Coverage.start load @class_file - result2 = CoverageSpecs.filtered_result + result2 = Coverage.result result2.should == result1 end @@ -58,21 +101,243 @@ describe 'Coverage.result' do Coverage.result Coverage.start - result = CoverageSpecs.filtered_result + result = Coverage.result result.should == {} end - it 'second Coverage.start does nothing' do - Coverage.start + it 'does not include the file starting coverage since it is not tracked' do require @config_file.chomp('.rb') - result = CoverageSpecs.filtered_result + Coverage.result.should_not.include?(@config_file) + end + + it 'returns the correct results when eval coverage is enabled' do + Coverage.supported?(:eval).should == true - result.should == { @config_file => [1, 1, 1] } + Coverage.start(lines: true, eval: true) + require @eval_code_file.chomp('.rb') + result = Coverage.result + + result.should == { + @eval_code_file => { + lines: [1, nil, 1, nil, 1, 1, nil, nil, nil, nil, 1] + } + } end - it 'does not include the file starting coverage since it is not tracked' do - require @config_file.chomp('.rb') - CoverageSpecs.filtered_result.should_not include(@config_file) + it 'returns the correct results when eval coverage is disabled' do + Coverage.supported?(:eval).should == true + + Coverage.start(lines: true, eval: false) + require @eval_code_file.chomp('.rb') + result = Coverage.result + + result.should == { + @eval_code_file => { + lines: [1, nil, 1, nil, 1, nil, nil, nil, nil, nil, 1] + } + } + end + + it "disables coverage measurement when stop option is not specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result + Coverage.running?.should == false + end + + it "disables coverage measurement when stop: true option is specified" do + Coverage.start + require @class_file.chomp('.rb') + + -> { + Coverage.result(stop: true) + }.should complain(/warning: stop implies clear/) + + Coverage.running?.should == false + end + + it "does not disable coverage measurement when stop: false option is specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: false) + Coverage.running?.should == true + end + + it "does not disable coverage measurement when stop option is not specified but clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(clear: true) + Coverage.running?.should == true + end + + it "does not disable coverage measurement when stop option is not specified but clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(clear: false) + Coverage.running?.should == true + end + + it "disables coverage measurement when stop: true and clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: true, clear: true) + Coverage.running?.should == false + end + + it "disables coverage measurement when stop: true and clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + -> { + Coverage.result(stop: true, clear: false) + }.should complain(/warning: stop implies clear/) + + Coverage.running?.should == false + end + + it "does not disable coverage measurement when stop: false and clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: false, clear: true) + Coverage.running?.should == true + end + + it "does not disable coverage measurement when stop: false and clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: false, clear: false) + Coverage.running?.should == true + end + + it "resets counters (remove them) when stop: true specified but clear option is not specified" do + Coverage.start + require @class_file.chomp('.rb') + + -> { + Coverage.result(stop: true) # clears counters + }.should complain(/warning: stop implies clear/) + + Coverage.start + Coverage.peek_result.should == {} + end + + it "resets counters (remove them) when stop: true and clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: true, clear: true) # clears counters + + Coverage.start + Coverage.peek_result.should == {} + end + + it "resets counters (remove them) when stop: true and clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + -> { + Coverage.result(stop: true, clear: false) # clears counters + }.should complain(/warning: stop implies clear/) + + Coverage.start + Coverage.peek_result.should == {} + end + + it "resets counters (remove them) when both stop and clear options are not specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result # clears counters + + Coverage.start + Coverage.peek_result.should == {} + end + + it "clears counters (sets 0 values) when stop is not specified but clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(clear: true) # clears counters + + Coverage.peek_result.should == { + @class_file => [ + nil, nil, 0, nil, nil, 0, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + end + + it "does not clear counters when stop is not specified but clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + result = Coverage.result(clear: false) # doesn't clear counters + result.should == { + @class_file => [ + nil, nil, 1, nil, nil, 1, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + + Coverage.peek_result.should == result + end + + it "does not clear counters when stop: false and clear is not specified" do + Coverage.start + require @class_file.chomp('.rb') + + result = Coverage.result(stop: false) # doesn't clear counters + result.should == { + @class_file => [ + nil, nil, 1, nil, nil, 1, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + + Coverage.peek_result.should == result + end + + it "clears counters (sets 0 values) when stop: false and clear: true specified" do + Coverage.start + require @class_file.chomp('.rb') + + Coverage.result(stop: false, clear: true) # clears counters + + Coverage.peek_result.should == { + @class_file => [ + nil, nil, 0, nil, nil, 0, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + end + + it "does not clear counters when stop: false and clear: false specified" do + Coverage.start + require @class_file.chomp('.rb') + + result = Coverage.result(stop: false, clear: false) # doesn't clear counters + result.should == { + @class_file => [ + nil, nil, 1, nil, nil, 1, nil, nil, 0, nil, nil, nil, nil, nil, nil, nil + ] + } + + Coverage.peek_result.should == result + end + + it 'covers 100% lines with begin' do + Coverage.start + require @with_begin_file.chomp('.rb') + result = Coverage.result + + result.should == { + @with_begin_file => [ + nil, 1, nil + ] + } end end diff --git a/spec/ruby/library/coverage/running_spec.rb b/spec/ruby/library/coverage/running_spec.rb new file mode 100644 index 0000000000..e9cc7ada5a --- /dev/null +++ b/spec/ruby/library/coverage/running_spec.rb @@ -0,0 +1,20 @@ +require_relative '../../spec_helper' +require 'coverage' + +describe 'Coverage.running?' do + it "returns false if coverage is not started" do + Coverage.running?.should == false + end + + it "returns true if coverage is started" do + Coverage.start + Coverage.running?.should == true + Coverage.result + end + + it "returns false if coverage was started and stopped" do + Coverage.start + Coverage.result + Coverage.running?.should == false + end +end diff --git a/spec/ruby/library/coverage/start_spec.rb b/spec/ruby/library/coverage/start_spec.rb index ddfad8b47c..11777347a2 100644 --- a/spec/ruby/library/coverage/start_spec.rb +++ b/spec/ruby/library/coverage/start_spec.rb @@ -2,5 +2,86 @@ require_relative '../../spec_helper' require 'coverage' describe 'Coverage.start' do - it 'needs to be reviewed for spec completeness' + before :each do + Coverage.should_not.running? + end + + after :each do + Coverage.result(stop: true, clear: true) if Coverage.running? + end + + it "enables the coverage measurement" do + Coverage.start + Coverage.should.running? + end + + it "returns nil" do + Coverage.start.should == nil + end + + it 'raises error when repeated Coverage.start call happens' do + Coverage.start + + -> { + Coverage.start + }.should.raise(RuntimeError, 'coverage measurement is already setup') + end + + it "accepts :all optional argument" do + Coverage.start(:all) + Coverage.should.running? + end + + it "accepts lines: optional keyword argument" do + Coverage.start(lines: true) + Coverage.should.running? + end + + it "accepts branches: optional keyword argument" do + Coverage.start(branches: true) + Coverage.should.running? + end + + it "accepts methods: optional keyword argument" do + Coverage.start(methods: true) + Coverage.should.running? + end + + it "accepts eval: optional keyword argument" do + Coverage.start(eval: true) + Coverage.should.running? + end + + it "accepts oneshot_lines: optional keyword argument" do + Coverage.start(oneshot_lines: true) + Coverage.should.running? + end + + it "ignores unknown keyword arguments" do + Coverage.start(foo: true) + Coverage.should.running? + end + + it "expects a Hash if not passed :all" do + -> { + Coverage.start(42) + }.should.raise(TypeError, "no implicit conversion of Integer into Hash") + end + + it "does not accept both lines: and oneshot_lines: keyword arguments" do + -> { + Coverage.start(lines: true, oneshot_lines: true) + }.should.raise(RuntimeError, "cannot enable lines and oneshot_lines simultaneously") + end + + it "enables the coverage measurement if passed options with `false` value" do + Coverage.start(lines: false, branches: false, methods: false, eval: false, oneshot_lines: false) + Coverage.should.running? + end + + it "measures coverage within eval" do + Coverage.start(lines: true, eval: true) + eval("Object.new\n"*3, binding, "test.rb", 1) + Coverage.result["test.rb"].should == {lines: [1, 1, 1]} + end end diff --git a/spec/ruby/library/coverage/supported_spec.rb b/spec/ruby/library/coverage/supported_spec.rb new file mode 100644 index 0000000000..fcf8a76d79 --- /dev/null +++ b/spec/ruby/library/coverage/supported_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../spec_helper' +require 'coverage' + +describe "Coverage.supported?" do + it "returns true or false if coverage measurement is supported for the given mode" do + [true, false].should.include?(Coverage.supported?(:lines)) + [true, false].should.include?(Coverage.supported?(:branches)) + [true, false].should.include?(Coverage.supported?(:methods)) + [true, false].should.include?(Coverage.supported?(:eval)) + end + + it "returns false for not existing modes" do + Coverage.supported?(:foo).should == false + Coverage.supported?(:bar).should == false + end + + it "raise TypeError if argument is not Symbol" do + -> { + Coverage.supported?("lines") + }.should.raise(TypeError, "wrong argument type String (expected Symbol)") + + -> { + Coverage.supported?([]) + }.should.raise(TypeError, "wrong argument type Array (expected Symbol)") + + -> { + Coverage.supported?(1) + }.should.raise(TypeError, "wrong argument type Integer (expected Symbol)") + end +end diff --git a/spec/ruby/library/csv/generate_spec.rb b/spec/ruby/library/csv/generate_spec.rb index 0a1e3d9604..62e19aa6e4 100644 --- a/spec/ruby/library/csv/generate_spec.rb +++ b/spec/ruby/library/csv/generate_spec.rb @@ -21,12 +21,12 @@ describe "CSV.generate" do end it "appends and returns the argument itself" do - str = "" + str = +"" csv_str = CSV.generate(str) do |csv| csv.add_row [1, 2, 3] csv << [4, 5, 6] end - csv_str.should equal str + csv_str.should.equal? str str.should == "1,2,3\n4,5,6\n" end end diff --git a/spec/ruby/library/csv/liberal_parsing_spec.rb b/spec/ruby/library/csv/liberal_parsing_spec.rb index a2dda36c99..9878658027 100644 --- a/spec/ruby/library/csv/liberal_parsing_spec.rb +++ b/spec/ruby/library/csv/liberal_parsing_spec.rb @@ -1,21 +1,19 @@ require_relative '../../spec_helper' require 'csv' -ruby_version_is '2.4' do - describe "CSV#liberal_parsing?" do - it "returns true if illegal input is handled" do - csv = CSV.new("", liberal_parsing: true) - csv.liberal_parsing?.should == true - end +describe "CSV#liberal_parsing?" do + it "returns true if illegal input is handled" do + csv = CSV.new("", liberal_parsing: true) + csv.should.liberal_parsing? + end - it "returns false if illegal input is not handled" do - csv = CSV.new("", liberal_parsing: false) - csv.liberal_parsing?.should == false - end + it "returns false if illegal input is not handled" do + csv = CSV.new("", liberal_parsing: false) + csv.should_not.liberal_parsing? + end - it "returns false by default" do - csv = CSV.new("") - csv.liberal_parsing?.should == false - end + it "returns false by default" do + csv = CSV.new("") + csv.should_not.liberal_parsing? end end diff --git a/spec/ruby/library/csv/parse_spec.rb b/spec/ruby/library/csv/parse_spec.rb index fc3f04378b..7000f03cda 100644 --- a/spec/ruby/library/csv/parse_spec.rb +++ b/spec/ruby/library/csv/parse_spec.rb @@ -5,7 +5,7 @@ describe "CSV.parse" do it "parses '' into []" do result = CSV.parse '' - result.should be_kind_of(Array) + result.should.is_a?(Array) result.should == [] end @@ -82,14 +82,12 @@ describe "CSV.parse" do it "raises CSV::MalformedCSVError exception if input is illegal" do -> { CSV.parse('"quoted" field') - }.should raise_error(CSV::MalformedCSVError) + }.should.raise(CSV::MalformedCSVError) end - ruby_version_is '2.4' do - it "handles illegal input with the liberal_parsing option" do - illegal_input = '"Johnson, Dwayne",Dwayne "The Rock" Johnson' - result = CSV.parse(illegal_input, liberal_parsing: true) - result.should == [["Johnson, Dwayne", 'Dwayne "The Rock" Johnson']] - end + it "handles illegal input with the liberal_parsing option" do + illegal_input = '"Johnson, Dwayne",Dwayne "The Rock" Johnson' + result = CSV.parse(illegal_input, liberal_parsing: true) + result.should == [["Johnson, Dwayne", 'Dwayne "The Rock" Johnson']] end end diff --git a/spec/ruby/library/csv/readlines_spec.rb b/spec/ruby/library/csv/readlines_spec.rb index 882266657e..624f906489 100644 --- a/spec/ruby/library/csv/readlines_spec.rb +++ b/spec/ruby/library/csv/readlines_spec.rb @@ -23,15 +23,13 @@ describe "CSV#readlines" do it "raises CSV::MalformedCSVError exception if input is illegal" do csv = CSV.new('"quoted" field') - -> { csv.readlines }.should raise_error(CSV::MalformedCSVError) + -> { csv.readlines }.should.raise(CSV::MalformedCSVError) end - ruby_version_is '2.4' do - it "handles illegal input with the liberal_parsing option" do - illegal_input = '"Johnson, Dwayne",Dwayne "The Rock" Johnson' - csv = CSV.new(illegal_input, liberal_parsing: true) - result = csv.readlines - result.should == [["Johnson, Dwayne", 'Dwayne "The Rock" Johnson']] - end + it "handles illegal input with the liberal_parsing option" do + illegal_input = '"Johnson, Dwayne",Dwayne "The Rock" Johnson' + csv = CSV.new(illegal_input, liberal_parsing: true) + result = csv.readlines + result.should == [["Johnson, Dwayne", 'Dwayne "The Rock" Johnson']] end end diff --git a/spec/ruby/library/date/accessor_spec.rb b/spec/ruby/library/date/accessor_spec.rb index 68a2d9f3de..74ed0e9c21 100644 --- a/spec/ruby/library/date/accessor_spec.rb +++ b/spec/ruby/library/date/accessor_spec.rb @@ -38,7 +38,7 @@ describe "Date#year" do end describe "Date#yday" do - it "determines the year" do + it "determines the day of the year" do Date.civil(2007, 1, 17).yday.should == 17 Date.civil(2008, 10, 28).yday.should == 302 end diff --git a/spec/ruby/library/date/add_month_spec.rb b/spec/ruby/library/date/add_month_spec.rb index 32e9de4d70..ab802ea97a 100644 --- a/spec/ruby/library/date/add_month_spec.rb +++ b/spec/ruby/library/date/add_month_spec.rb @@ -21,18 +21,18 @@ describe "Date#>>" do end it "raise a TypeError when passed a Symbol" do - lambda { Date.civil(2007,2,27) >> :hello }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) >> :hello }.should.raise(TypeError) end it "raise a TypeError when passed a String" do - lambda { Date.civil(2007,2,27) >> "hello" }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) >> "hello" }.should.raise(TypeError) end it "raise a TypeError when passed a Date" do - lambda { Date.civil(2007,2,27) >> Date.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) >> Date.new }.should.raise(TypeError) end it "raise a TypeError when passed an Object" do - lambda { Date.civil(2007,2,27) >> Object.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) >> Object.new }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/add_spec.rb b/spec/ruby/library/date/add_spec.rb index edcff4c55b..5e368decdc 100644 --- a/spec/ruby/library/date/add_spec.rb +++ b/spec/ruby/library/date/add_spec.rb @@ -13,18 +13,18 @@ describe "Date#+" do end it "raises a TypeError when passed a Symbol" do - lambda { Date.civil(2007,2,27) + :hello }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) + :hello }.should.raise(TypeError) end it "raises a TypeError when passed a String" do - lambda { Date.civil(2007,2,27) + "hello" }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) + "hello" }.should.raise(TypeError) end it "raises a TypeError when passed a Date" do - lambda { Date.civil(2007,2,27) + Date.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) + Date.new }.should.raise(TypeError) end it "raises a TypeError when passed an Object" do - lambda { Date.civil(2007,2,27) + Object.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) + Object.new }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/civil_spec.rb b/spec/ruby/library/date/civil_spec.rb index f3537c2f84..1c780fce56 100644 --- a/spec/ruby/library/date/civil_spec.rb +++ b/spec/ruby/library/date/civil_spec.rb @@ -2,11 +2,6 @@ require_relative '../../spec_helper' require_relative 'shared/civil' require 'date' -describe "Date#civil" do - it_behaves_like :date_civil, :civil -end - - describe "Date.civil" do - it "needs to be reviewed for spec completeness" + it_behaves_like :date_civil, :civil end diff --git a/spec/ruby/library/date/constants_spec.rb b/spec/ruby/library/date/constants_spec.rb index dd7803052f..3494b0c296 100644 --- a/spec/ruby/library/date/constants_spec.rb +++ b/spec/ruby/library/date/constants_spec.rb @@ -34,13 +34,13 @@ describe "Date constants" do it "freezes MONTHNAMES, DAYNAMES, ABBR_MONTHNAMES, ABBR_DAYSNAMES" do [Date::MONTHNAMES, Date::DAYNAMES, Date::ABBR_MONTHNAMES, Date::ABBR_DAYNAMES].each do |ary| - lambda { + -> { ary << "Unknown" - }.should raise_error(frozen_error_class, /frozen/) + }.should.raise(FrozenError, /frozen/) ary.compact.each do |name| - lambda { + -> { name << "modified" - }.should raise_error(frozen_error_class, /frozen/) + }.should.raise(FrozenError, /frozen/) end end end diff --git a/spec/ruby/library/date/deconstruct_keys_spec.rb b/spec/ruby/library/date/deconstruct_keys_spec.rb new file mode 100644 index 0000000000..1fa1e70250 --- /dev/null +++ b/spec/ruby/library/date/deconstruct_keys_spec.rb @@ -0,0 +1,42 @@ +require_relative '../../spec_helper' +require 'date' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' + +describe "Date#deconstruct_keys" do + it "returns whole hash for nil as an argument" do + d = Date.new(2022, 10, 5) + d.deconstruct_keys(nil).should == { year: 2022, month: 10, day: 5, yday: 278, wday: 3 } + end + + it "returns only specified keys" do + d = Date.new(2022, 10, 5) + d.deconstruct_keys([:year, :month]).should == { year: 2022, month: 10 } + end + + it "requires one argument" do + -> { + Date.new(2022, 10, 5).deconstruct_keys + }.should.raise(ArgumentError) + end + + it "it raises error when argument is neither nil nor array" do + d = Date.new(2022, 10, 5) + + -> { d.deconstruct_keys(1) }.should.raise(TypeError, "wrong argument type Integer (expected Array or nil)") + -> { d.deconstruct_keys("asd") }.should.raise(TypeError, "wrong argument type String (expected Array or nil)") + -> { d.deconstruct_keys(:x) }.should.raise(TypeError, "wrong argument type Symbol (expected Array or nil)") + -> { d.deconstruct_keys({}) }.should.raise(TypeError, "wrong argument type Hash (expected Array or nil)") + end + + it "returns {} when passed []" do + Date.new(2022, 10, 5).deconstruct_keys([]).should == {} + end + + it "ignores non-Symbol keys" do + Date.new(2022, 10, 5).deconstruct_keys(['year', []]).should == {} + end + + it "ignores not existing Symbol keys" do + Date.new(2022, 10, 5).deconstruct_keys([:year, :a]).should == { year: 2022 } + end +end diff --git a/spec/ruby/library/date/eql_spec.rb b/spec/ruby/library/date/eql_spec.rb index a1819cae3a..79fabc47f4 100644 --- a/spec/ruby/library/date/eql_spec.rb +++ b/spec/ruby/library/date/eql_spec.rb @@ -3,10 +3,10 @@ require 'date' describe "Date#eql?" do it "returns true if self is equal to another date" do - Date.civil(2007, 10, 11).eql?(Date.civil(2007, 10, 11)).should be_true + Date.civil(2007, 10, 11).eql?(Date.civil(2007, 10, 11)).should == true end it "returns false if self is not equal to another date" do - Date.civil(2007, 10, 11).eql?(Date.civil(2007, 10, 12)).should be_false + Date.civil(2007, 10, 11).eql?(Date.civil(2007, 10, 12)).should == false end end diff --git a/spec/ruby/library/date/friday_spec.rb b/spec/ruby/library/date/friday_spec.rb index 3dc040fabe..62f050346e 100644 --- a/spec/ruby/library/date/friday_spec.rb +++ b/spec/ruby/library/date/friday_spec.rb @@ -3,10 +3,10 @@ require 'date' describe "Date#friday?" do it "should be friday" do - Date.new(2000, 1, 7).friday?.should be_true + Date.new(2000, 1, 7).friday?.should == true end it "should not be friday" do - Date.new(2000, 1, 8).friday?.should be_false + Date.new(2000, 1, 8).friday?.should == false end end diff --git a/spec/ruby/library/date/gregorian_leap_spec.rb b/spec/ruby/library/date/gregorian_leap_spec.rb index c3d25cf90f..c27890faf4 100644 --- a/spec/ruby/library/date/gregorian_leap_spec.rb +++ b/spec/ruby/library/date/gregorian_leap_spec.rb @@ -3,13 +3,13 @@ require 'date' describe "Date#gregorian_leap?" do it "returns true if a year is a leap year in the Gregorian calendar" do - Date.gregorian_leap?(2000).should be_true - Date.gregorian_leap?(2004).should be_true + Date.gregorian_leap?(2000).should == true + Date.gregorian_leap?(2004).should == true end it "returns false if a year is not a leap year in the Gregorian calendar" do - Date.gregorian_leap?(1900).should be_false - Date.gregorian_leap?(1999).should be_false - Date.gregorian_leap?(2002).should be_false + Date.gregorian_leap?(1900).should == false + Date.gregorian_leap?(1999).should == false + Date.gregorian_leap?(2002).should == false end end diff --git a/spec/ruby/library/date/gregorian_spec.rb b/spec/ruby/library/date/gregorian_spec.rb index 8b7033fe75..bbda13af08 100644 --- a/spec/ruby/library/date/gregorian_spec.rb +++ b/spec/ruby/library/date/gregorian_spec.rb @@ -4,13 +4,13 @@ require 'date' describe "Date#gregorian?" do it "marks a day before the calendar reform as Julian" do - Date.civil(1007, 2, 27).gregorian?.should be_false - Date.civil(1907, 2, 27, Date.civil(1930, 1, 1).jd).gregorian?.should be_false + Date.civil(1007, 2, 27).gregorian?.should == false + Date.civil(1907, 2, 27, Date.civil(1930, 1, 1).jd).gregorian?.should == false end it "marks a day after the calendar reform as Julian" do - Date.civil(2007, 2, 27).gregorian?.should == true - Date.civil(1607, 2, 27, Date.civil(1582, 1, 1).jd).gregorian?.should be_true + Date.civil(2007, 2, 27).should.gregorian? + Date.civil(1607, 2, 27, Date.civil(1582, 1, 1).jd).gregorian?.should == true end end diff --git a/spec/ruby/library/date/infinity_spec.rb b/spec/ruby/library/date/infinity_spec.rb index 81d67ae249..721fd76066 100644 --- a/spec/ruby/library/date/infinity_spec.rb +++ b/spec/ruby/library/date/infinity_spec.rb @@ -5,16 +5,16 @@ describe "Date::Infinity" do it "should be able to check whether Infinity is zero" do i = Date::Infinity.new - i.zero?.should == false + i.should_not.zero? end it "should be able to check whether Infinity is finite" do i1 = Date::Infinity.new - i1.finite?.should == false + i1.should_not.finite? i2 = Date::Infinity.new(-1) - i2.finite?.should == false + i2.should_not.finite? i3 = Date::Infinity.new(0) - i3.finite?.should == false + i3.should_not.finite? end it "should be able to check whether Infinity is infinite" do @@ -28,11 +28,11 @@ describe "Date::Infinity" do it "should be able to check whether Infinity is not a number" do i1 = Date::Infinity.new - i1.nan?.should == false + i1.should_not.nan? i2 = Date::Infinity.new(-1) - i2.nan?.should == false + i2.should_not.nan? i3 = Date::Infinity.new(0) - i3.nan?.should == true + i3.should.nan? end it "should be able to compare Infinity objects" do diff --git a/spec/ruby/library/date/iso8601_spec.rb b/spec/ruby/library/date/iso8601_spec.rb index 41f055e648..26815bd76c 100644 --- a/spec/ruby/library/date/iso8601_spec.rb +++ b/spec/ruby/library/date/iso8601_spec.rb @@ -17,21 +17,40 @@ describe "Date.iso8601" do d.should == Date.civil(-4712, 1, 1) end - it "parses a Symbol into a Date object" do - d = Date.iso8601(:'2015-10-15') - d.should == Date.civil(2015, 10, 15) - end - it "parses a StringSubclass into a Date object" do d = Date.iso8601(Class.new(String).new("-4712-01-01")) d.should == Date.civil(-4712, 1, 1) end - it "raises an ArgumentError when passed a Symbol without a valid Date" do - lambda { Date.iso8601(:test) }.should raise_error(ArgumentError) + it "raises a Date::Error if the argument is a invalid Date" do + -> { + Date.iso8601('invalid') + }.should.raise(Date::Error, "invalid date") + end + + it "raises a Date::Error when passed a nil" do + -> { + Date.iso8601(nil) + }.should.raise(Date::Error, "invalid date") + end + + it "raises a TypeError when passed an Object" do + -> { Date.iso8601(Object.new) }.should.raise(TypeError) + end +end + +describe "Date._iso8601" do + it "returns an empty hash if the argument is a invalid Date" do + h = Date._iso8601('invalid') + h.should == {} + end + + it "returns an empty hash if the argument is nil" do + h = Date._iso8601(nil) + h.should == {} end it "raises a TypeError when passed an Object" do - lambda { Date.iso8601(Object.new) }.should raise_error(TypeError) + -> { Date._iso8601(Object.new) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/julian_leap_spec.rb b/spec/ruby/library/date/julian_leap_spec.rb index 2ef2d65d81..42231e012f 100644 --- a/spec/ruby/library/date/julian_leap_spec.rb +++ b/spec/ruby/library/date/julian_leap_spec.rb @@ -3,13 +3,13 @@ require 'date' describe "Date.julian_leap?" do it "determines whether a year is a leap year in the Julian calendar" do - Date.julian_leap?(1900).should be_true - Date.julian_leap?(2000).should be_true - Date.julian_leap?(2004).should be_true + Date.julian_leap?(1900).should == true + Date.julian_leap?(2000).should == true + Date.julian_leap?(2004).should == true end it "determines whether a year is not a leap year in the Julian calendar" do - Date.julian_leap?(1999).should be_false - Date.julian_leap?(2002).should be_false + Date.julian_leap?(1999).should == false + Date.julian_leap?(2002).should == false end end diff --git a/spec/ruby/library/date/julian_spec.rb b/spec/ruby/library/date/julian_spec.rb index 637a4739e5..9f8a670899 100644 --- a/spec/ruby/library/date/julian_spec.rb +++ b/spec/ruby/library/date/julian_spec.rb @@ -4,13 +4,13 @@ require_relative '../../spec_helper' describe "Date#julian?" do it "marks a day before the calendar reform as Julian" do - Date.civil(1007, 2, 27).julian?.should == true - Date.civil(1907, 2, 27, Date.civil(1930, 1, 1).jd).julian?.should be_true + Date.civil(1007, 2, 27).should.julian? + Date.civil(1907, 2, 27, Date.civil(1930, 1, 1).jd).julian?.should == true end it "marks a day after the calendar reform as Julian" do - Date.civil(2007, 2, 27).julian?.should == false - Date.civil(1607, 2, 27, Date.civil(1582, 1, 1).jd).julian?.should be_false + Date.civil(2007, 2, 27).should_not.julian? + Date.civil(1607, 2, 27, Date.civil(1582, 1, 1).jd).julian?.should == false end end diff --git a/spec/ruby/library/date/minus_month_spec.rb b/spec/ruby/library/date/minus_month_spec.rb index 563da073f0..d56e19dc31 100644 --- a/spec/ruby/library/date/minus_month_spec.rb +++ b/spec/ruby/library/date/minus_month_spec.rb @@ -14,10 +14,10 @@ describe "Date#<<" do end it "raises an error on non numeric parameters" do - lambda { Date.civil(2007,2,27) << :hello }.should raise_error(TypeError) - lambda { Date.civil(2007,2,27) << "hello" }.should raise_error(TypeError) - lambda { Date.civil(2007,2,27) << Date.new }.should raise_error(TypeError) - lambda { Date.civil(2007,2,27) << Object.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) << :hello }.should.raise(TypeError) + -> { Date.civil(2007,2,27) << "hello" }.should.raise(TypeError) + -> { Date.civil(2007,2,27) << Date.new }.should.raise(TypeError) + -> { Date.civil(2007,2,27) << Object.new }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/minus_spec.rb b/spec/ruby/library/date/minus_spec.rb index 4cf6129f02..c2a08fa5b0 100644 --- a/spec/ruby/library/date/minus_spec.rb +++ b/spec/ruby/library/date/minus_spec.rb @@ -22,9 +22,9 @@ describe "Date#-" do end it "raises an error for non Numeric arguments" do - lambda { Date.civil(2007,2,27) - :hello }.should raise_error(TypeError) - lambda { Date.civil(2007,2,27) - "hello" }.should raise_error(TypeError) - lambda { Date.civil(2007,2,27) - Object.new }.should raise_error(TypeError) + -> { Date.civil(2007,2,27) - :hello }.should.raise(TypeError) + -> { Date.civil(2007,2,27) - "hello" }.should.raise(TypeError) + -> { Date.civil(2007,2,27) - Object.new }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/mon_spec.rb b/spec/ruby/library/date/mon_spec.rb index 724e7d6564..616d72cf88 100644 --- a/spec/ruby/library/date/mon_spec.rb +++ b/spec/ruby/library/date/mon_spec.rb @@ -1,6 +1,7 @@ require_relative '../../spec_helper' +require_relative 'shared/month' require 'date' describe "Date#mon" do - it "needs to be reviewed for spec completeness" + it_behaves_like :date_month, :mon end diff --git a/spec/ruby/library/date/monday_spec.rb b/spec/ruby/library/date/monday_spec.rb index 14a117b73c..61d728f3c5 100644 --- a/spec/ruby/library/date/monday_spec.rb +++ b/spec/ruby/library/date/monday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#monday?" do it "should be monday" do - Date.new(2000, 1, 3).monday?.should be_true + Date.new(2000, 1, 3).monday?.should == true end end diff --git a/spec/ruby/library/date/month_spec.rb b/spec/ruby/library/date/month_spec.rb index e040f9a94c..f493ec8119 100644 --- a/spec/ruby/library/date/month_spec.rb +++ b/spec/ruby/library/date/month_spec.rb @@ -1,9 +1,7 @@ require_relative '../../spec_helper' +require_relative 'shared/month' require 'date' describe "Date#month" do - it "returns the month" do - m = Date.new(2000, 7, 1).month - m.should == 7 - end + it_behaves_like :date_month, :month end diff --git a/spec/ruby/library/date/new_spec.rb b/spec/ruby/library/date/new_spec.rb index 18120118c0..cb64cabce6 100644 --- a/spec/ruby/library/date/new_spec.rb +++ b/spec/ruby/library/date/new_spec.rb @@ -1,7 +1,6 @@ require 'date' require_relative '../../spec_helper' require_relative 'shared/civil' -require_relative 'shared/new_bang' describe "Date.new" do it_behaves_like :date_civil, :new diff --git a/spec/ruby/library/date/parse_spec.rb b/spec/ruby/library/date/parse_spec.rb index 09e072ba3e..4d655f516e 100644 --- a/spec/ruby/library/date/parse_spec.rb +++ b/spec/ruby/library/date/parse_spec.rb @@ -23,7 +23,7 @@ describe "Date#parse" do # Specs using numbers it "throws an argument error for a single digit" do - lambda{ Date.parse("1") }.should raise_error(ArgumentError) + ->{ Date.parse("1") }.should.raise(ArgumentError) end it "parses DD as month day number" do @@ -66,8 +66,25 @@ describe "Date#parse" do end it "raises a TypeError trying to parse non-String-like object" do - lambda { Date.parse(1) }.should raise_error(TypeError) - lambda { Date.parse(:invalid) }.should raise_error(TypeError) + -> { Date.parse(1) }.should.raise(TypeError) + -> { Date.parse([]) }.should.raise(TypeError) + end + + it "coerces using to_str" do + c = Class.new do + attr_accessor :string + def to_str + @string + end + end + o = c.new + o.string = "19101101" + + d = Date.parse(o) + d.should == Date.civil(1910, 11, 1) + + # parse should not modify string value + o.to_str.should == "19101101" end end @@ -76,7 +93,7 @@ describe "Date#parse with '.' separator" do @sep = '.' end - it_should_behave_like "date_parse" + it_should_behave_like :date_parse end describe "Date#parse with '/' separator" do @@ -84,7 +101,7 @@ describe "Date#parse with '/' separator" do @sep = '/' end - it_should_behave_like "date_parse" + it_should_behave_like :date_parse end describe "Date#parse with ' ' separator" do @@ -92,7 +109,7 @@ describe "Date#parse with ' ' separator" do @sep = ' ' end - it_should_behave_like "date_parse" + it_should_behave_like :date_parse end describe "Date#parse with '/' separator US-style" do @@ -100,7 +117,7 @@ describe "Date#parse with '/' separator US-style" do @sep = '/' end - it_should_behave_like "date_parse_us" + it_should_behave_like :date_parse_us end describe "Date#parse with '-' separator EU-style" do @@ -108,7 +125,7 @@ describe "Date#parse with '-' separator EU-style" do @sep = '-' end - it_should_behave_like "date_parse_eu" + it_should_behave_like :date_parse_eu end describe "Date#parse(.)" do diff --git a/spec/ruby/library/date/plus_spec.rb b/spec/ruby/library/date/plus_spec.rb index ce5e074ed7..6179370fca 100644 --- a/spec/ruby/library/date/plus_spec.rb +++ b/spec/ruby/library/date/plus_spec.rb @@ -15,6 +15,6 @@ describe "Date#+" do end it "raises TypeError if argument is not Numeric" do - lambda { Date.today + Date.today }.should raise_error(TypeError) + -> { Date.today + Date.today }.should.raise(TypeError) end end diff --git a/spec/ruby/library/date/rfc3339_spec.rb b/spec/ruby/library/date/rfc3339_spec.rb new file mode 100644 index 0000000000..a8711d47b2 --- /dev/null +++ b/spec/ruby/library/date/rfc3339_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../spec_helper' +require 'date' + +describe "Date.rfc3339" do + it "needs to be reviewed for spec completeness" +end + +describe "Date._rfc3339" do + it "returns an empty hash if the argument is a invalid Date" do + h = Date._rfc3339('invalid') + h.should == {} + end +end diff --git a/spec/ruby/library/date/saturday_spec.rb b/spec/ruby/library/date/saturday_spec.rb index 1527b71d00..29f8267a2b 100644 --- a/spec/ruby/library/date/saturday_spec.rb +++ b/spec/ruby/library/date/saturday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#saturday?" do it "should be saturday" do - Date.new(2000, 1, 1).saturday?.should be_true + Date.new(2000, 1, 1).saturday?.should == true end end diff --git a/spec/ruby/library/date/shared/civil.rb b/spec/ruby/library/date/shared/civil.rb index 47dbed49fc..4499cdf8e9 100644 --- a/spec/ruby/library/date/shared/civil.rb +++ b/spec/ruby/library/date/shared/civil.rb @@ -5,7 +5,7 @@ describe :date_civil, shared: true do d.year.should == -4712 d.month.should == 1 d.day.should == 1 - d.julian?.should == true + d.should.julian? d.jd.should == 0 end @@ -14,7 +14,7 @@ describe :date_civil, shared: true do d.year.should == 2000 d.month.should == 3 d.day.should == 5 - d.julian?.should == false + d.should_not.julian? d.jd.should == 2451609 # Should also work with years far in the past and future @@ -23,27 +23,27 @@ describe :date_civil, shared: true do d.year.should == -9000 d.month.should == 7 d.day.should == 5 - d.julian?.should == true + d.should.julian? d.jd.should == -1566006 d = Date.send(@method, 9000, 10, 14) d.year.should == 9000 d.month.should == 10 d.day.should == 14 - d.julian?.should == false + d.should_not.julian? d.jd.should == 5008529 end it "doesn't create dates for invalid arguments" do - lambda { Date.send(@method, 2000, 13, 31) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2000, 12, 32) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2000, 2, 30) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 1900, 2, 29) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2000, 2, 29) }.should_not raise_error(ArgumentError) - - lambda { Date.send(@method, 1582, 10, 14) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 1582, 10, 15) }.should_not raise_error(ArgumentError) + -> { Date.send(@method, 2000, 13, 31) }.should.raise(ArgumentError) + -> { Date.send(@method, 2000, 12, 32) }.should.raise(ArgumentError) + -> { Date.send(@method, 2000, 2, 30) }.should.raise(ArgumentError) + -> { Date.send(@method, 1900, 2, 29) }.should.raise(ArgumentError) + -> { Date.send(@method, 2000, 2, 29) }.should_not.raise(ArgumentError) + + -> { Date.send(@method, 1582, 10, 14) }.should.raise(ArgumentError) + -> { Date.send(@method, 1582, 10, 15) }.should_not.raise(ArgumentError) end diff --git a/spec/ruby/library/date/shared/commercial.rb b/spec/ruby/library/date/shared/commercial.rb index 354a5d5cd0..f53d83235a 100644 --- a/spec/ruby/library/date/shared/commercial.rb +++ b/spec/ruby/library/date/shared/commercial.rb @@ -25,15 +25,15 @@ describe :date_commercial, shared: true do end it "creates only Date objects for valid weeks" do - lambda { Date.send(@method, 2004, 53, 1) }.should_not raise_error(ArgumentError) - lambda { Date.send(@method, 2004, 53, 0) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2004, 53, 8) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2004, 54, 1) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2004, 0, 1) }.should raise_error(ArgumentError) + -> { Date.send(@method, 2004, 53, 1) }.should_not.raise(ArgumentError) + -> { Date.send(@method, 2004, 53, 0) }.should.raise(ArgumentError) + -> { Date.send(@method, 2004, 53, 8) }.should.raise(ArgumentError) + -> { Date.send(@method, 2004, 54, 1) }.should.raise(ArgumentError) + -> { Date.send(@method, 2004, 0, 1) }.should.raise(ArgumentError) - lambda { Date.send(@method, 2003, 52, 1) }.should_not raise_error(ArgumentError) - lambda { Date.send(@method, 2003, 53, 1) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2003, 52, 0) }.should raise_error(ArgumentError) - lambda { Date.send(@method, 2003, 52, 8) }.should raise_error(ArgumentError) + -> { Date.send(@method, 2003, 52, 1) }.should_not.raise(ArgumentError) + -> { Date.send(@method, 2003, 53, 1) }.should.raise(ArgumentError) + -> { Date.send(@method, 2003, 52, 0) }.should.raise(ArgumentError) + -> { Date.send(@method, 2003, 52, 8) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/date/shared/month.rb b/spec/ruby/library/date/shared/month.rb new file mode 100644 index 0000000000..5fcb2cbeb0 --- /dev/null +++ b/spec/ruby/library/date/shared/month.rb @@ -0,0 +1,6 @@ +describe :date_month, shared: true do + it "returns the month" do + m = Date.new(2000, 7, 1).send(@method) + m.should == 7 + end +end diff --git a/spec/ruby/library/date/shared/new_bang.rb b/spec/ruby/library/date/shared/new_bang.rb deleted file mode 100644 index 90f1b432f0..0000000000 --- a/spec/ruby/library/date/shared/new_bang.rb +++ /dev/null @@ -1,14 +0,0 @@ -describe :date_new_bang, shared: true do - - it "returns a new Date object set to Astronomical Julian Day 0 if no arguments passed" do - d = Date.send(@method) - d.ajd.should == 0 - end - - it "accepts astronomical julian day number, offset as a fraction of a day and returns a new Date object" do - d = Date.send(@method, 10, 0.5) - d.ajd.should == 10 - d.jd.should == 11 - end - -end diff --git a/spec/ruby/library/date/shared/parse.rb b/spec/ruby/library/date/shared/parse.rb index 1015285e04..40af908386 100644 --- a/spec/ruby/library/date/shared/parse.rb +++ b/spec/ruby/library/date/shared/parse.rb @@ -13,7 +13,7 @@ describe :date_parse, shared: true do d.day.should == 23 end - it "can parse a 'mmm DD YYYY' string into a Date object" do + it "can parse a 'DD mmm YYYY' string into a Date object" do d = Date.parse("23#{@sep}feb#{@sep}2008") d.year.should == 2008 d.month.should == 2 @@ -42,7 +42,7 @@ describe :date_parse, shared: true do d.should == Date.civil(2005, 11, 5) end - it "can parse a year, day and month name into a Date object" do + it "can parse a day, month name and year into a Date object" do d = Date.parse("5th#{@sep}november#{@sep}2005") d.should == Date.civil(2005, 11, 5) end diff --git a/spec/ruby/library/date/shared/parse_eu.rb b/spec/ruby/library/date/shared/parse_eu.rb index ecb15e3c0e..3819524a57 100644 --- a/spec/ruby/library/date/shared/parse_eu.rb +++ b/spec/ruby/library/date/shared/parse_eu.rb @@ -7,28 +7,28 @@ describe :date_parse_eu, shared: true do d.day.should == 1 end - it "can parse a MM-DD-YYYY string into a Date object" do + it "can parse a DD-MM-YYYY string into a Date object" do d = Date.parse("10#{@sep}01#{@sep}2007") d.year.should == 2007 d.month.should == 1 d.day.should == 10 end - it "can parse a MM-DD-YY string into a Date object" do + it "can parse a YY-MM-DD string into a Date object" do d = Date.parse("10#{@sep}01#{@sep}07") d.year.should == 2010 d.month.should == 1 d.day.should == 7 end - it "can parse a MM-DD-YY string into a Date object NOT using the year digits as 20XX" do + it "can parse a YY-MM-DD string into a Date object NOT using the year digits as 20XX" do d = Date.parse("10#{@sep}01#{@sep}07", false) d.year.should == 10 d.month.should == 1 d.day.should == 7 end - it "can parse a MM-DD-YY string into a Date object using the year digits as 20XX" do + it "can parse a YY-MM-DD string into a Date object using the year digits as 20XX" do d = Date.parse("10#{@sep}01#{@sep}07", true) d.year.should == 2010 d.month.should == 1 diff --git a/spec/ruby/library/date/shared/parse_us.rb b/spec/ruby/library/date/shared/parse_us.rb index 7be62b1af1..17e2fc96c1 100644 --- a/spec/ruby/library/date/shared/parse_us.rb +++ b/spec/ruby/library/date/shared/parse_us.rb @@ -6,28 +6,28 @@ describe :date_parse_us, shared: true do d.day.should == 1 end - it "parses a MM#{@sep}DD#{@sep}YYYY string into a Date object" do + it "parses a DD#{@sep}MM#{@sep}YYYY string into a Date object" do d = Date.parse("10#{@sep}01#{@sep}2007") d.year.should == 2007 d.month.should == 1 d.day.should == 10 end - it "parses a MM#{@sep}DD#{@sep}YY string into a Date object" do + it "parses a YY#{@sep}MM#{@sep}DD string into a Date object" do d = Date.parse("10#{@sep}01#{@sep}07") d.year.should == 2010 d.month.should == 1 d.day.should == 7 end - it "parses a MM#{@sep}DD#{@sep}YY string into a Date object NOT using the year digits as 20XX" do + it "parses a YY#{@sep}MM#{@sep}DD string into a Date object NOT using the year digits as 20XX" do d = Date.parse("10#{@sep}01#{@sep}07", false) d.year.should == 10 d.month.should == 1 d.day.should == 7 end - it "parses a MM#{@sep}DD#{@sep}YY string into a Date object using the year digits as 20XX" do + it "parses a YY#{@sep}MM#{@sep}DD string into a Date object using the year digits as 20XX" do d = Date.parse("10#{@sep}01#{@sep}07", true) d.year.should == 2010 d.month.should == 1 diff --git a/spec/ruby/library/date/shared/valid_civil.rb b/spec/ruby/library/date/shared/valid_civil.rb index 545c207bbe..425fee4d2d 100644 --- a/spec/ruby/library/date/shared/valid_civil.rb +++ b/spec/ruby/library/date/shared/valid_civil.rb @@ -9,8 +9,8 @@ describe :date_valid_civil?, shared: true do # 31 it "returns true if it is a valid civil date" do - Date.send(@method, 1582, 10, 15).should be_true - Date.send(@method, 1582, 10, 14, Date::ENGLAND).should be_true + Date.send(@method, 1582, 10, 15).should == true + Date.send(@method, 1582, 10, 14, Date::ENGLAND).should == true end it "returns false if it is not a valid civil date" do @@ -24,13 +24,13 @@ describe :date_valid_civil?, shared: true do # -15 -14 -13 -12 -11 -10 -9 # -8 -7 -6 -5 -4 -3 -2 # -1 - Date.send(@method, 1582, -3, -22).should be_false - Date.send(@method, 1582, -3, -21).should be_true - Date.send(@method, 1582, -3, -18).should be_true - Date.send(@method, 1582, -3, -17).should be_true + Date.send(@method, 1582, -3, -22).should == false + Date.send(@method, 1582, -3, -21).should == true + Date.send(@method, 1582, -3, -18).should == true + Date.send(@method, 1582, -3, -17).should == true - Date.send(@method, 2007, -11, -10).should be_true - Date.send(@method, 2008, -11, -10).should be_true + Date.send(@method, 2007, -11, -10).should == true + Date.send(@method, 2008, -11, -10).should == true end end diff --git a/spec/ruby/library/date/shared/valid_commercial.rb b/spec/ruby/library/date/shared/valid_commercial.rb index 117dfe1d3d..573b851fdd 100644 --- a/spec/ruby/library/date/shared/valid_commercial.rb +++ b/spec/ruby/library/date/shared/valid_commercial.rb @@ -6,16 +6,16 @@ describe :date_valid_commercial?, shared: true do # 39: 1 2 3 4 5 6 7 # 40: 1 2 3 4 5 6 7 # 41: 1 2 3 4 5 6 7 - Date.send(@method, 1582, 39, 4).should be_true - Date.send(@method, 1582, 39, 5).should be_true - Date.send(@method, 1582, 41, 4).should be_true - Date.send(@method, 1582, 41, 5).should be_true - Date.send(@method, 1582, 41, 4, Date::ENGLAND).should be_true - Date.send(@method, 1752, 37, 4, Date::ENGLAND).should be_true + Date.send(@method, 1582, 39, 4).should == true + Date.send(@method, 1582, 39, 5).should == true + Date.send(@method, 1582, 41, 4).should == true + Date.send(@method, 1582, 41, 5).should == true + Date.send(@method, 1582, 41, 4, Date::ENGLAND).should == true + Date.send(@method, 1752, 37, 4, Date::ENGLAND).should == true end it "returns false it is not a valid commercial date" do - Date.send(@method, 1999, 53, 1).should be_false + Date.send(@method, 1999, 53, 1).should == false end it "handles negative week and day numbers" do @@ -24,11 +24,11 @@ describe :date_valid_commercial?, shared: true do # -12: -7 -6 -5 -4 -3 -2 -1 # -11: -7 -6 -5 -4 -3 -2 -1 # -10: -7 -6 -5 -4 -3 -2 -1 - Date.send(@method, 1582, -12, -4).should be_true - Date.send(@method, 1582, -12, -3).should be_true - Date.send(@method, 2007, -44, -2).should be_true - Date.send(@method, 2008, -44, -2).should be_true - Date.send(@method, 1999, -53, -1).should be_false + Date.send(@method, 1582, -12, -4).should == true + Date.send(@method, 1582, -12, -3).should == true + Date.send(@method, 2007, -44, -2).should == true + Date.send(@method, 2008, -44, -2).should == true + Date.send(@method, 1999, -53, -1).should == false end end diff --git a/spec/ruby/library/date/shared/valid_jd.rb b/spec/ruby/library/date/shared/valid_jd.rb index bd71f5abba..0c01710208 100644 --- a/spec/ruby/library/date/shared/valid_jd.rb +++ b/spec/ruby/library/date/shared/valid_jd.rb @@ -1,15 +1,20 @@ describe :date_valid_jd?, shared: true do - it "returns true if passed any value other than nil" do - Date.send(@method, -100).should be_true - Date.send(@method, :number).should be_true - Date.send(@method, Rational(1,2)).should be_true + it "returns true if passed a number value" do + Date.send(@method, -100).should == true + Date.send(@method, 100.0).should == true + Date.send(@method, 2**100).should == true + Date.send(@method, Rational(1,2)).should == true end it "returns false if passed nil" do - Date.send(@method, nil).should be_false + Date.send(@method, nil).should == false end - it "returns true if passed false" do - Date.send(@method, false).should be_true + it "returns false if passed symbol" do + Date.send(@method, :number).should == false + end + + it "returns false if passed false" do + Date.send(@method, false).should == false end end diff --git a/spec/ruby/library/date/strftime_spec.rb b/spec/ruby/library/date/strftime_spec.rb index 973d4668f8..1b93a8d1b2 100644 --- a/spec/ruby/library/date/strftime_spec.rb +++ b/spec/ruby/library/date/strftime_spec.rb @@ -1,9 +1,11 @@ +require_relative "../../spec_helper" require 'date' require_relative '../../shared/time/strftime_for_date' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' describe "Date#strftime" do before :all do - @new_date = lambda { |y,m,d| Date.civil(y,m,d) } + @new_date = -> y, m, d { Date.civil(y,m,d) } @date = Date.civil(2000, 4, 9) end @@ -21,10 +23,9 @@ describe "Date#strftime" do @date.strftime("%Z").should == "+00:00" end - # %v is %e-%b-%Y for Date/DateTime it "should be able to show the commercial week" do - @date.strftime("%v").should == " 9-Apr-2000" - @date.strftime("%v").should == @date.strftime('%e-%b-%Y') + @date.strftime("%v").should == " 9-APR-2000" + @date.strftime("%v").should != @date.strftime('%e-%b-%Y') end # additional conversion specifiers only in Date/DateTime diff --git a/spec/ruby/library/date/sunday_spec.rb b/spec/ruby/library/date/sunday_spec.rb index c3a817fa86..548f36a4f0 100644 --- a/spec/ruby/library/date/sunday_spec.rb +++ b/spec/ruby/library/date/sunday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#sunday?" do it "should be sunday" do - Date.new(2000, 1, 2).sunday?.should be_true + Date.new(2000, 1, 2).sunday?.should == true end end diff --git a/spec/ruby/library/date/thursday_spec.rb b/spec/ruby/library/date/thursday_spec.rb index 74b5f40365..4df3b9103a 100644 --- a/spec/ruby/library/date/thursday_spec.rb +++ b/spec/ruby/library/date/thursday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#thursday?" do it "should be thursday" do - Date.new(2000, 1, 6).thursday?.should be_true + Date.new(2000, 1, 6).thursday?.should == true end end diff --git a/spec/ruby/library/date/time/to_date_spec.rb b/spec/ruby/library/date/time/to_date_spec.rb new file mode 100644 index 0000000000..f9132da289 --- /dev/null +++ b/spec/ruby/library/date/time/to_date_spec.rb @@ -0,0 +1,42 @@ + +require_relative '../../../spec_helper' +require 'time' + +describe "Time#to_date" do + it "yields accurate julian date for ambiguous pre-Gregorian reform value" do + Time.utc(1582, 10, 4).to_date.jd.should == Date::ITALY - 11 # 2299150j + end + + it "yields accurate julian date for Julian-Gregorian gap value" do + Time.utc(1582, 10, 14).to_date.jd.should == Date::ITALY - 1 # 2299160j + end + + it "yields accurate julian date for post-Gregorian reform value" do + Time.utc(1582, 10, 15).to_date.jd.should == Date::ITALY # 2299161j + end + + it "yields same julian day regardless of UTC time value" do + Time.utc(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY + Time.utc(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY + end + + it "yields same julian day regardless of local time or zone" do + + with_timezone("Pacific/Pago_Pago", -11) do + Time.local(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY + Time.local(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY + end + + with_timezone("Asia/Kamchatka", +12) do + Time.local(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY + Time.local(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY + end + + end + + it "yields date with default Calendar reform day" do + Time.utc(1582, 10, 4).to_date.start.should == Date::ITALY + Time.utc(1582, 10, 14).to_date.start.should == Date::ITALY + Time.utc(1582, 10, 15).to_date.start.should == Date::ITALY + end +end diff --git a/spec/ruby/library/date/today_spec.rb b/spec/ruby/library/date/today_spec.rb index 7c6ebc9cb4..4be8d8e931 100644 --- a/spec/ruby/library/date/today_spec.rb +++ b/spec/ruby/library/date/today_spec.rb @@ -3,7 +3,7 @@ require 'date' describe "Date.today" do it "returns a Date object" do - Date.today.should be_kind_of Date + Date.today.should.is_a? Date end it "sets Date object to the current date" do diff --git a/spec/ruby/library/date/tuesday_spec.rb b/spec/ruby/library/date/tuesday_spec.rb index 052837b54e..db31387aed 100644 --- a/spec/ruby/library/date/tuesday_spec.rb +++ b/spec/ruby/library/date/tuesday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#tuesday?" do it "should be tuesday" do - Date.new(2000, 1, 4).tuesday?.should be_true + Date.new(2000, 1, 4).tuesday?.should == true end end diff --git a/spec/ruby/library/date/wednesday_spec.rb b/spec/ruby/library/date/wednesday_spec.rb index e80ec23dd2..4bbeead5b8 100644 --- a/spec/ruby/library/date/wednesday_spec.rb +++ b/spec/ruby/library/date/wednesday_spec.rb @@ -3,6 +3,6 @@ require 'date' describe "Date#wednesday?" do it "should be wednesday" do - Date.new(2000, 1, 5).wednesday?.should be_true + Date.new(2000, 1, 5).wednesday?.should == true end end diff --git a/spec/ruby/library/date/yday_spec.rb b/spec/ruby/library/date/yday_spec.rb index cfb174a4c2..7dd42e52a5 100644 --- a/spec/ruby/library/date/yday_spec.rb +++ b/spec/ruby/library/date/yday_spec.rb @@ -1,6 +1,7 @@ require_relative '../../spec_helper' +require_relative '../../shared/time/yday' require 'date' describe "Date#yday" do - it "needs to be reviewed for spec completeness" + it_behaves_like :time_yday, -> year, month, day { Date.new(year, month, day).yday } end diff --git a/spec/ruby/library/datetime/add_spec.rb b/spec/ruby/library/datetime/add_spec.rb index a6d98914bd..20288e2105 100644 --- a/spec/ruby/library/datetime/add_spec.rb +++ b/spec/ruby/library/datetime/add_spec.rb @@ -4,6 +4,6 @@ require 'date' describe "DateTime#+" do it "is able to add sub-millisecond precision values" do datetime = DateTime.new(2017) - (datetime + 0.00001).to_time.usec.should == 864000 + (datetime + 0.00001001).to_time.usec.should == 864864 end end diff --git a/spec/ruby/library/datetime/deconstruct_keys_spec.rb b/spec/ruby/library/datetime/deconstruct_keys_spec.rb new file mode 100644 index 0000000000..07a7bda881 --- /dev/null +++ b/spec/ruby/library/datetime/deconstruct_keys_spec.rb @@ -0,0 +1,44 @@ +require_relative '../../spec_helper' +require 'date' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' + +describe "DateTime#deconstruct_keys" do + it "returns whole hash for nil as an argument" do + d = DateTime.new(2022, 10, 5, 13, 30) + res = { year: 2022, month: 10, day: 5, yday: 278, wday: 3, hour: 13, + min: 30, sec: 0, sec_fraction: (0/1), zone: "+00:00" } + d.deconstruct_keys(nil).should == res + end + + it "returns only specified keys" do + d = DateTime.new(2022, 10, 5, 13, 39) + d.deconstruct_keys([:zone, :hour]).should == { zone: "+00:00", hour: 13 } + end + + it "requires one argument" do + -> { + DateTime.new(2022, 10, 5, 13, 30).deconstruct_keys + }.should.raise(ArgumentError) + end + + it "it raises error when argument is neither nil nor array" do + d = DateTime.new(2022, 10, 5, 13, 30) + + -> { d.deconstruct_keys(1) }.should.raise(TypeError, "wrong argument type Integer (expected Array or nil)") + -> { d.deconstruct_keys("asd") }.should.raise(TypeError, "wrong argument type String (expected Array or nil)") + -> { d.deconstruct_keys(:x) }.should.raise(TypeError, "wrong argument type Symbol (expected Array or nil)") + -> { d.deconstruct_keys({}) }.should.raise(TypeError, "wrong argument type Hash (expected Array or nil)") + end + + it "returns {} when passed []" do + DateTime.new(2022, 10, 5, 13, 30).deconstruct_keys([]).should == {} + end + + it "ignores non-Symbol keys" do + DateTime.new(2022, 10, 5, 13, 30).deconstruct_keys(['year', []]).should == {} + end + + it "ignores not existing Symbol keys" do + DateTime.new(2022, 10, 5, 13, 30).deconstruct_keys([:year, :a]).should == { year: 2022 } + end +end diff --git a/spec/ruby/library/datetime/hour_spec.rb b/spec/ruby/library/datetime/hour_spec.rb index f019b60c74..383a85fe60 100644 --- a/spec/ruby/library/datetime/hour_spec.rb +++ b/spec/ruby/library/datetime/hour_spec.rb @@ -15,27 +15,27 @@ describe "DateTime#hour" do end it "raises an error for Rational" do - lambda { new_datetime(hour: 1 + Rational(1,2)) }.should raise_error(ArgumentError) + -> { new_datetime(hour: 1 + Rational(1,2)) }.should.raise(ArgumentError) end it "raises an error for Float" do - lambda { new_datetime(hour: 1.5).hour }.should raise_error(ArgumentError) + -> { new_datetime(hour: 1.5).hour }.should.raise(ArgumentError) end it "raises an error for Rational" do - lambda { new_datetime(day: 1 + Rational(1,2)) }.should raise_error(ArgumentError) + -> { new_datetime(day: 1 + Rational(1,2)) }.should.raise(ArgumentError) end it "raises an error, when the hour is smaller than -24" do - lambda { new_datetime(hour: -25) }.should raise_error(ArgumentError) + -> { new_datetime(hour: -25) }.should.raise(ArgumentError) end it "raises an error, when the hour is larger than 24" do - lambda { new_datetime(hour: 25) }.should raise_error(ArgumentError) + -> { new_datetime(hour: 25) }.should.raise(ArgumentError) end it "raises an error for hour fractions smaller than -24" do - lambda { new_datetime(hour: -24 - Rational(1,2)) }.should( + -> { new_datetime(hour: -24 - Rational(1,2)) }.should( raise_error(ArgumentError)) end diff --git a/spec/ruby/library/datetime/new_spec.rb b/spec/ruby/library/datetime/new_spec.rb index 85fbe7578b..2b3c3f156c 100644 --- a/spec/ruby/library/datetime/new_spec.rb +++ b/spec/ruby/library/datetime/new_spec.rb @@ -47,6 +47,6 @@ describe "DateTime.new" do end it "raises an error on invalid arguments" do - lambda { new_datetime(minute: 999) }.should raise_error(ArgumentError) + -> { new_datetime(minute: 999) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/datetime/now_spec.rb b/spec/ruby/library/datetime/now_spec.rb index 9cdce80ef3..5c0411c2be 100644 --- a/spec/ruby/library/datetime/now_spec.rb +++ b/spec/ruby/library/datetime/now_spec.rb @@ -3,17 +3,17 @@ require 'date' describe "DateTime.now" do it "creates an instance of DateTime" do - DateTime.now.should be_an_instance_of(DateTime) + DateTime.now.should.instance_of?(DateTime) end it "sets the current date" do - (DateTime.now - Date.today).to_f.should be_close(0.0, 2.0) + (DateTime.now - Date.today).to_f.should be_close(0.0, TIME_TOLERANCE) end it "sets the current time" do dt = DateTime.now now = Time.now - (dt.to_time - now).should be_close(0.0, 10.0) + (dt.to_time - now).should be_close(0.0, TIME_TOLERANCE) end it "grabs the local timezone" do diff --git a/spec/ruby/library/datetime/parse_spec.rb b/spec/ruby/library/datetime/parse_spec.rb index e5441bd9dc..0a965273a0 100644 --- a/spec/ruby/library/datetime/parse_spec.rb +++ b/spec/ruby/library/datetime/parse_spec.rb @@ -20,7 +20,7 @@ describe "DateTime.parse" do # Specs using numbers it "throws an argument error for a single digit" do - lambda{ DateTime.parse("1") }.should raise_error(ArgumentError) + ->{ DateTime.parse("1") }.should.raise(ArgumentError) end it "parses DD as month day number" do @@ -54,23 +54,23 @@ describe "DateTime.parse" do end it "throws an argument error for invalid month values" do - lambda{DateTime.parse("2012-13-08T15:43:59")}.should raise_error(ArgumentError) + ->{DateTime.parse("2012-13-08T15:43:59")}.should.raise(ArgumentError) end it "throws an argument error for invalid day values" do - lambda{DateTime.parse("2012-12-32T15:43:59")}.should raise_error(ArgumentError) + ->{DateTime.parse("2012-12-32T15:43:59")}.should.raise(ArgumentError) end it "throws an argument error for invalid hour values" do - lambda{DateTime.parse("2012-12-31T25:43:59")}.should raise_error(ArgumentError) + ->{DateTime.parse("2012-12-31T25:43:59")}.should.raise(ArgumentError) end it "throws an argument error for invalid minute values" do - lambda{DateTime.parse("2012-12-31T25:43:59")}.should raise_error(ArgumentError) + ->{DateTime.parse("2012-12-31T25:43:59")}.should.raise(ArgumentError) end it "throws an argument error for invalid second values" do - lambda{DateTime.parse("2012-11-08T15:43:61")}.should raise_error(ArgumentError) + ->{DateTime.parse("2012-11-08T15:43:61")}.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/datetime/rfc2822_spec.rb b/spec/ruby/library/datetime/rfc2822_spec.rb index 70bfca60b4..11b79a1e84 100644 --- a/spec/ruby/library/datetime/rfc2822_spec.rb +++ b/spec/ruby/library/datetime/rfc2822_spec.rb @@ -3,4 +3,8 @@ require 'date' describe "DateTime.rfc2822" do it "needs to be reviewed for spec completeness" + + it "raises DateError if passed nil" do + -> { DateTime.rfc2822(nil) }.should.raise(Date::Error, "invalid date") + end end diff --git a/spec/ruby/library/datetime/shared/min.rb b/spec/ruby/library/datetime/shared/min.rb index e69d86ab02..04e5f3457a 100644 --- a/spec/ruby/library/datetime/shared/min.rb +++ b/spec/ruby/library/datetime/shared/min.rb @@ -14,27 +14,27 @@ describe :datetime_min, shared: true do end it "raises an error for Rational" do - lambda { new_datetime minute: 5 + Rational(1,2) }.should raise_error(ArgumentError) + -> { new_datetime minute: 5 + Rational(1,2) }.should.raise(ArgumentError) end it "raises an error for Float" do - lambda { new_datetime minute: 5.5 }.should raise_error(ArgumentError) + -> { new_datetime minute: 5.5 }.should.raise(ArgumentError) end it "raises an error for Rational" do - lambda { new_datetime(hour: 2 + Rational(1,2)) }.should raise_error(ArgumentError) + -> { new_datetime(hour: 2 + Rational(1,2)) }.should.raise(ArgumentError) end it "raises an error, when the minute is smaller than -60" do - lambda { new_datetime(minute: -61) }.should raise_error(ArgumentError) + -> { new_datetime(minute: -61) }.should.raise(ArgumentError) end it "raises an error, when the minute is greater or equal than 60" do - lambda { new_datetime(minute: 60) }.should raise_error(ArgumentError) + -> { new_datetime(minute: 60) }.should.raise(ArgumentError) end it "raises an error for minute fractions smaller than -60" do - lambda { new_datetime(minute: -60 - Rational(1,2))}.should( + -> { new_datetime(minute: -60 - Rational(1,2))}.should( raise_error(ArgumentError)) end end diff --git a/spec/ruby/library/datetime/shared/sec.rb b/spec/ruby/library/datetime/shared/sec.rb index 68e8af8e40..5af5db4fb2 100644 --- a/spec/ruby/library/datetime/shared/sec.rb +++ b/spec/ruby/library/datetime/shared/sec.rb @@ -23,19 +23,19 @@ describe :datetime_sec, shared: true do end it "raises an error when minute is given as a rational" do - lambda { new_datetime(minute: 5 + Rational(1,2)) }.should raise_error(ArgumentError) + -> { new_datetime(minute: 5 + Rational(1,2)) }.should.raise(ArgumentError) end it "raises an error, when the second is smaller than -60" do - lambda { new_datetime(second: -61) }.should raise_error(ArgumentError) + -> { new_datetime(second: -61) }.should.raise(ArgumentError) end it "raises an error, when the second is greater or equal than 60" do - lambda { new_datetime(second: 60) }.should raise_error(ArgumentError) + -> { new_datetime(second: 60) }.should.raise(ArgumentError) end it "raises an error for second fractions smaller than -60" do - lambda { new_datetime(second: -60 - Rational(1,2))}.should( + -> { new_datetime(second: -60 - Rational(1,2))}.should( raise_error(ArgumentError)) end diff --git a/spec/ruby/library/datetime/strftime_spec.rb b/spec/ruby/library/datetime/strftime_spec.rb index f95b52fffb..a07cc9c1aa 100644 --- a/spec/ruby/library/datetime/strftime_spec.rb +++ b/spec/ruby/library/datetime/strftime_spec.rb @@ -1,16 +1,18 @@ +require_relative '../../spec_helper' require 'date' require_relative '../../shared/time/strftime_for_date' require_relative '../../shared/time/strftime_for_time' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' describe "DateTime#strftime" do before :all do - @new_date = lambda { |y,m,d| DateTime.civil(y,m,d) } - @new_time = lambda { |*args| DateTime.civil(*args) } - @new_time_in_zone = lambda { |zone,offset,*args| + @new_date = -> y, m, d { DateTime.civil(y,m,d) } + @new_time = -> *args { DateTime.civil(*args) } + @new_time_in_zone = -> zone, offset, *args { y, m, d, h, min, s = args DateTime.new(y, m||1, d||1, h||0, min||0, s||0, Rational(offset, 24)) } - @new_time_with_offset = lambda { |y,m,d,h,min,s,offset| + @new_time_with_offset = -> y, m, d, h, min, s, offset { DateTime.new(y,m,d,h,min,s, Rational(offset, 86_400)) } @@ -31,10 +33,9 @@ describe "DateTime#strftime" do @time.strftime("%Z").should == "+00:00" end - # %v is %e-%b-%Y for Date/DateTime it "should be able to show the commercial week" do - @time.strftime("%v").should == " 3-Feb-2001" - @time.strftime("%v").should == @time.strftime('%e-%b-%Y') + @time.strftime("%v").should == " 3-FEB-2001" + @time.strftime("%v").should != @time.strftime('%e-%b-%Y') end # additional conversion specifiers only in Date/DateTime diff --git a/spec/ruby/library/datetime/subtract_spec.rb b/spec/ruby/library/datetime/subtract_spec.rb index ed88533246..ba01f4eff6 100644 --- a/spec/ruby/library/datetime/subtract_spec.rb +++ b/spec/ruby/library/datetime/subtract_spec.rb @@ -4,6 +4,16 @@ require 'date' describe "DateTime#-" do it "is able to subtract sub-millisecond precision values" do date = DateTime.new(2017) - ((date + 0.00001) - date).should == Rational(1, 100000) + diff = Rational(123456789, 24*60*60*1000*1000) + ((date + diff) - date).should == diff + (date - (date + diff)).should == -diff + (date - (date - diff)).should == diff + ((date - diff) - date).should == -diff + end + + it "correctly calculates sub-millisecond time differences" do #5493 + dt1 = DateTime.new(2018, 1, 1, 0, 0, 30) + dt2 = DateTime.new(2018, 1, 1, 0, 1, 29.000001) + ((dt2 - dt1) * 24 * 60 * 60).should == 59.000001 end end diff --git a/spec/ruby/library/datetime/time/to_datetime_spec.rb b/spec/ruby/library/datetime/time/to_datetime_spec.rb new file mode 100644 index 0000000000..5589725238 --- /dev/null +++ b/spec/ruby/library/datetime/time/to_datetime_spec.rb @@ -0,0 +1,40 @@ +require_relative '../../../spec_helper' +require 'time' +require 'date' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' + +describe "Time#to_datetime" do + it "returns a DateTime representing the same instant" do + time = Time.utc(2012, 12, 31, 23, 58, 59) + datetime = time.to_datetime + datetime.year.should == 2012 + datetime.month.should == 12 + datetime.day.should == 31 + datetime.hour.should == 23 + datetime.min.should == 58 + datetime.sec.should == 59 + end + + it "returns a DateTime representing the same instant before Gregorian" do + time = Time.utc(1582, 10, 14, 23, 58, 59) + datetime = time.to_datetime + datetime.year.should == 1582 + datetime.month.should == 10 + datetime.day.should == 4 + datetime.hour.should == 23 + datetime.min.should == 58 + datetime.sec.should == 59 + end + + it "roundtrips" do + time = Time.utc(3, 12, 31, 23, 58, 59) + datetime = time.to_datetime + datetime.to_time.utc.should == time + end + + it "yields a DateTime with the default Calendar reform day" do + Time.utc(1582, 10, 4, 1, 2, 3).to_datetime.start.should == Date::ITALY + Time.utc(1582, 10, 14, 1, 2, 3).to_datetime.start.should == Date::ITALY + Time.utc(1582, 10, 15, 1, 2, 3).to_datetime.start.should == Date::ITALY + end +end diff --git a/spec/ruby/library/datetime/to_date_spec.rb b/spec/ruby/library/datetime/to_date_spec.rb index a1b93305b8..31ccf5ae98 100644 --- a/spec/ruby/library/datetime/to_date_spec.rb +++ b/spec/ruby/library/datetime/to_date_spec.rb @@ -4,7 +4,7 @@ require 'date' describe "DateTime#to_date" do it "returns an instance of Date" do dt = DateTime.new(2012, 12, 24, 12, 23, 00, '+05:00') - dt.to_date.should be_kind_of(Date) + dt.to_date.should.is_a?(Date) end it "maintains the same year" do @@ -30,7 +30,7 @@ describe "DateTime#to_date" do it "maintains the same julian day regardless of local time or zone" do dt = DateTime.new(2012, 12, 24, 12, 23, 00, '+05:00') - with_timezone("Pactific/Pago_Pago", -11) do + with_timezone("Pacific/Pago_Pago", -11) do dt.to_date.jd.should == dt.jd end end diff --git a/spec/ruby/library/datetime/to_s_spec.rb b/spec/ruby/library/datetime/to_s_spec.rb index c6b5bd90be..ed0746f42b 100644 --- a/spec/ruby/library/datetime/to_s_spec.rb +++ b/spec/ruby/library/datetime/to_s_spec.rb @@ -4,13 +4,13 @@ require 'date' describe "DateTime#to_s" do it "returns a new String object" do dt = DateTime.new(2012, 12, 24, 1, 2, 3, "+03:00") - dt.to_s.should be_kind_of(String) + dt.to_s.should.is_a?(String) end it "maintains timezone regardless of local time" do dt = DateTime.new(2012, 12, 24, 1, 2, 3, "+03:00") - with_timezone("Pactific/Pago_Pago", -11) do + with_timezone("Pacific/Pago_Pago", -11) do dt.to_s.should == "2012-12-24T01:02:03+03:00" end end diff --git a/spec/ruby/library/datetime/to_time_spec.rb b/spec/ruby/library/datetime/to_time_spec.rb index 1844cbd7eb..a3ffc019fb 100644 --- a/spec/ruby/library/datetime/to_time_spec.rb +++ b/spec/ruby/library/datetime/to_time_spec.rb @@ -1,16 +1,17 @@ require_relative '../../spec_helper' require 'date' +date_version = defined?(Date::VERSION) ? Date::VERSION : '3.1.0' describe "DateTime#to_time" do it "yields a new Time object" do - DateTime.now.to_time.should be_kind_of(Time) + DateTime.now.to_time.should.is_a?(Time) end it "returns a Time representing the same instant" do - datetime = DateTime.civil(3, 12, 31, 23, 58, 59) + datetime = DateTime.civil(2012, 12, 31, 23, 58, 59) time = datetime.to_time.utc - time.year.should == 3 + time.year.should == 2012 time.month.should == 12 time.day.should == 31 time.hour.should == 23 @@ -18,21 +19,30 @@ describe "DateTime#to_time" do time.sec.should == 59 end - ruby_version_is "2.4" do - it "preserves the same time regardless of local time or zone" do - date = DateTime.new(2012, 12, 24, 12, 23, 00, '+03:00') + it "returns a Time representing the same instant before Gregorian" do + datetime = DateTime.civil(1582, 10, 4, 23, 58, 59) + time = datetime.to_time.utc + time.year.should == 1582 + time.month.should == 10 + time.day.should == 14 + time.hour.should == 23 + time.min.should == 58 + time.sec.should == 59 + end + + it "preserves the same time regardless of local time or zone" do + date = DateTime.new(2012, 12, 24, 12, 23, 00, '+03:00') - with_timezone("Pactific/Pago_Pago", -11) do - time = date.to_time + with_timezone("Pacific/Pago_Pago", -11) do + time = date.to_time - time.utc_offset.should == 3 * 3600 - time.year.should == date.year - time.mon.should == date.mon - time.day.should == date.day - time.hour.should == date.hour - time.min.should == date.min - time.sec.should == date.sec - end + time.utc_offset.should == 3 * 3600 + time.year.should == date.year + time.mon.should == date.mon + time.day.should == date.day + time.hour.should == date.hour + time.min.should == date.min + time.sec.should == date.sec end end end diff --git a/spec/ruby/library/datetime/yday_spec.rb b/spec/ruby/library/datetime/yday_spec.rb new file mode 100644 index 0000000000..08a72c6480 --- /dev/null +++ b/spec/ruby/library/datetime/yday_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../spec_helper' +require_relative '../../shared/time/yday' +require 'date' + +describe "DateTime#yday" do + it_behaves_like :time_yday, -> year, month, day { DateTime.new(year, month, day).yday } +end diff --git a/spec/ruby/library/delegate/delegate_class/instance_method_spec.rb b/spec/ruby/library/delegate/delegate_class/instance_method_spec.rb index 7e50dd81d8..19ffc4cf85 100644 --- a/spec/ruby/library/delegate/delegate_class/instance_method_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/instance_method_spec.rb @@ -9,44 +9,44 @@ describe "DelegateClass.instance_method" do it "returns a method object for public instance methods of the delegated class" do m = @klass.instance_method(:pub) - m.should be_an_instance_of(UnboundMethod) + m.should.instance_of?(UnboundMethod) m.bind(@obj).call.should == :foo end it "returns a method object for protected instance methods of the delegated class" do m = @klass.instance_method(:prot) - m.should be_an_instance_of(UnboundMethod) + m.should.instance_of?(UnboundMethod) m.bind(@obj).call.should == :protected end it "raises a NameError for a private instance methods of the delegated class" do - lambda { + -> { @klass.instance_method(:priv) - }.should raise_error(NameError) + }.should.raise(NameError) end it "returns a method object for public instance methods of the DelegateClass class" do m = @klass.instance_method(:extra) - m.should be_an_instance_of(UnboundMethod) + m.should.instance_of?(UnboundMethod) m.bind(@obj).call.should == :cheese end it "returns a method object for protected instance methods of the DelegateClass class" do m = @klass.instance_method(:extra_protected) - m.should be_an_instance_of(UnboundMethod) + m.should.instance_of?(UnboundMethod) m.bind(@obj).call.should == :baz end it "returns a method object for private instance methods of the DelegateClass class" do m = @klass.instance_method(:extra_private) - m.should be_an_instance_of(UnboundMethod) + m.should.instance_of?(UnboundMethod) m.bind(@obj).call.should == :bar end it "raises a NameError for an invalid method name" do - lambda { + -> { @klass.instance_method(:invalid_and_silly_method_name) - }.should raise_error(NameError) + }.should.raise(NameError) end end diff --git a/spec/ruby/library/delegate/delegate_class/instance_methods_spec.rb b/spec/ruby/library/delegate/delegate_class/instance_methods_spec.rb index 6012ff72de..586be56cae 100644 --- a/spec/ruby/library/delegate/delegate_class/instance_methods_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/instance_methods_spec.rb @@ -7,20 +7,20 @@ describe "DelegateClass.instance_methods" do end it "includes all public methods of the delegated class" do - @methods.should include :pub + @methods.should.include? :pub end it "includes all protected methods of the delegated class" do - @methods.should include :prot + @methods.should.include? :prot end it "includes instance methods of the DelegateClass class" do - @methods.should include :extra - @methods.should include :extra_protected + @methods.should.include? :extra + @methods.should.include? :extra_protected end it "does not include private methods" do - @methods.should_not include :priv - @methods.should_not include :extra_private + @methods.should_not.include? :priv + @methods.should_not.include? :extra_private end end diff --git a/spec/ruby/library/delegate/delegate_class/private_instance_methods_spec.rb b/spec/ruby/library/delegate/delegate_class/private_instance_methods_spec.rb index 06b2115cc5..18ca2a4c88 100644 --- a/spec/ruby/library/delegate/delegate_class/private_instance_methods_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/private_instance_methods_spec.rb @@ -7,17 +7,17 @@ describe "DelegateClass.private_instance_methods" do end it "does not include any instance methods of the delegated class" do - @methods.should_not include :pub - @methods.should_not include :prot - @methods.should_not include :priv # since these are not forwarded... + @methods.should_not.include? :pub + @methods.should_not.include? :prot + @methods.should_not.include? :priv # since these are not forwarded... end it "includes private instance methods of the DelegateClass class" do - @methods.should include :extra_private + @methods.should.include? :extra_private end it "does not include public or protected instance methods of the DelegateClass class" do - @methods.should_not include :extra - @methods.should_not include :extra_protected + @methods.should_not.include? :extra + @methods.should_not.include? :extra_protected end end diff --git a/spec/ruby/library/delegate/delegate_class/protected_instance_methods_spec.rb b/spec/ruby/library/delegate/delegate_class/protected_instance_methods_spec.rb index ac6659ec1e..d540b45065 100644 --- a/spec/ruby/library/delegate/delegate_class/protected_instance_methods_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/protected_instance_methods_spec.rb @@ -7,23 +7,23 @@ describe "DelegateClass.protected_instance_methods" do end it "does not include public methods of the delegated class" do - @methods.should_not include :pub + @methods.should_not.include? :pub end it "includes the protected methods of the delegated class" do - @methods.should include :prot + @methods.should.include? :prot end it "includes protected instance methods of the DelegateClass class" do - @methods.should include :extra_protected + @methods.should.include? :extra_protected end it "does not include public instance methods of the DelegateClass class" do - @methods.should_not include :extra + @methods.should_not.include? :extra end it "does not include private methods" do - @methods.should_not include :priv - @methods.should_not include :extra_private + @methods.should_not.include? :priv + @methods.should_not.include? :extra_private end end diff --git a/spec/ruby/library/delegate/delegate_class/public_instance_methods_spec.rb b/spec/ruby/library/delegate/delegate_class/public_instance_methods_spec.rb index 6c0d9bcab1..124b92de82 100644 --- a/spec/ruby/library/delegate/delegate_class/public_instance_methods_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/public_instance_methods_spec.rb @@ -7,19 +7,19 @@ describe "DelegateClass.public_instance_methods" do end it "includes all public methods of the delegated class" do - @methods.should include :pub + @methods.should.include? :pub end it "does not include the protected methods of the delegated class" do - @methods.should_not include :prot + @methods.should_not.include? :prot end it "includes public instance methods of the DelegateClass class" do - @methods.should include :extra + @methods.should.include? :extra end it "does not include private methods" do - @methods.should_not include :priv - @methods.should_not include :extra_private + @methods.should_not.include? :priv + @methods.should_not.include? :extra_private end end diff --git a/spec/ruby/library/delegate/delegate_class/respond_to_missing_spec.rb b/spec/ruby/library/delegate/delegate_class/respond_to_missing_spec.rb index 729cfc96c6..3975e5208b 100644 --- a/spec/ruby/library/delegate/delegate_class/respond_to_missing_spec.rb +++ b/spec/ruby/library/delegate/delegate_class/respond_to_missing_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" require 'delegate' describe "DelegateClass#respond_to_missing?" do diff --git a/spec/ruby/library/delegate/delegator/eql_spec.rb b/spec/ruby/library/delegate/delegator/eql_spec.rb index 3170d5727a..b302bb7016 100644 --- a/spec/ruby/library/delegate/delegator/eql_spec.rb +++ b/spec/ruby/library/delegate/delegator/eql_spec.rb @@ -2,45 +2,34 @@ require_relative '../../../spec_helper' require_relative '../fixtures/classes' describe "Delegator#eql?" do - ruby_version_is ""..."2.5" do - it "is delegated" do - base = mock('base') - delegator = DelegateSpecs::Delegator.new(base) - base.should_receive(:eql?).with(42).and_return(:foo) - delegator.eql?(42).should == :foo - end - end - - ruby_version_is "2.5" do - it "returns true when compared with same delegator" do - base = mock('base') - delegator = DelegateSpecs::Delegator.new(base) + it "returns true when compared with same delegator" do + base = mock('base') + delegator = DelegateSpecs::Delegator.new(base) - delegator.eql?(delegator).should be_true - end + delegator.eql?(delegator).should == true + end - it "returns true when compared with the inner object" do - base = mock('base') - delegator = DelegateSpecs::Delegator.new(base) + it "returns true when compared with the inner object" do + base = mock('base') + delegator = DelegateSpecs::Delegator.new(base) - delegator.eql?(base).should be_true - end + delegator.eql?(base).should == true + end - it "returns false when compared with the delegator with other object" do - base = mock('base') - other = mock('other') - delegator0 = DelegateSpecs::Delegator.new(base) - delegator1 = DelegateSpecs::Delegator.new(other) + it "returns false when compared with the delegator with other object" do + base = mock('base') + other = mock('other') + delegator0 = DelegateSpecs::Delegator.new(base) + delegator1 = DelegateSpecs::Delegator.new(other) - delegator0.eql?(delegator1).should be_false - end + delegator0.eql?(delegator1).should == false + end - it "returns false when compared with the other object" do - base = mock('base') - other = mock('other') - delegator = DelegateSpecs::Delegator.new(base) + it "returns false when compared with the other object" do + base = mock('base') + other = mock('other') + delegator = DelegateSpecs::Delegator.new(base) - delegator.eql?(other).should be_false - end + delegator.eql?(other).should == false end end diff --git a/spec/ruby/library/delegate/delegator/equal_spec.rb b/spec/ruby/library/delegate/delegator/equal_spec.rb index c8711c74b5..97aabebabe 100644 --- a/spec/ruby/library/delegate/delegator/equal_spec.rb +++ b/spec/ruby/library/delegate/delegator/equal_spec.rb @@ -6,8 +6,8 @@ describe "Delegator#equal?" do obj = mock('base') delegator = DelegateSpecs::Delegator.new(obj) obj.should_not_receive(:equal?) - delegator.equal?(obj).should be_false - delegator.equal?(nil).should be_false - delegator.equal?(delegator).should be_true + delegator.equal?(obj).should == false + delegator.equal?(nil).should == false + delegator.equal?(delegator).should == true end end diff --git a/spec/ruby/library/delegate/delegator/equal_value_spec.rb b/spec/ruby/library/delegate/delegator/equal_value_spec.rb index 0c967d5f94..d70aad1e03 100644 --- a/spec/ruby/library/delegate/delegator/equal_value_spec.rb +++ b/spec/ruby/library/delegate/delegator/equal_value_spec.rb @@ -9,16 +9,16 @@ describe "Delegator#==" do it "is not delegated when passed self" do @base.should_not_receive(:==) - (@delegator == @delegator).should be_true + (@delegator == @delegator).should == true end it "is delegated when passed the delegated object" do @base.should_receive(:==).and_return(false) - (@delegator == @base).should be_false + (@delegator == @base).should == false end it "is delegated in general" do @base.should_receive(:==).and_return(true) - (@delegator == 42).should be_true + (@delegator == 42).should == true end end diff --git a/spec/ruby/library/delegate/delegator/frozen_spec.rb b/spec/ruby/library/delegate/delegator/frozen_spec.rb index ca83c5f77c..ad87dc8bdf 100644 --- a/spec/ruby/library/delegate/delegator/frozen_spec.rb +++ b/spec/ruby/library/delegate/delegator/frozen_spec.rb @@ -10,30 +10,30 @@ describe "Delegator when frozen" do it "is still readable" do @delegate.should == [42, :hello] - @delegate.include?("bar").should be_false + @delegate.include?("bar").should == false end it "is frozen" do - @delegate.frozen?.should be_true + @delegate.frozen?.should == true end - it "is not writeable" do - lambda{ @delegate[0] += 2 }.should raise_error( RuntimeError ) + it "is not writable" do + ->{ @delegate[0] += 2 }.should.raise( RuntimeError ) end it "creates a frozen clone" do - @delegate.clone.frozen?.should be_true + @delegate.clone.frozen?.should == true end it "creates an unfrozen dup" do - @delegate.dup.frozen?.should be_false + @delegate.dup.frozen?.should == false end it "causes mutative calls to raise RuntimeError" do - lambda{ @delegate.__setobj__("hola!") }.should raise_error( RuntimeError ) + ->{ @delegate.__setobj__("hola!") }.should.raise( RuntimeError ) end it "returns false if only the delegated object is frozen" do - DelegateSpecs::Delegator.new([1,2,3].freeze).frozen?.should be_false + DelegateSpecs::Delegator.new([1,2,3].freeze).frozen?.should == false end end diff --git a/spec/ruby/library/delegate/delegator/marshal_spec.rb b/spec/ruby/library/delegate/delegator/marshal_spec.rb index 6c75c8f573..2817ac7e0b 100644 --- a/spec/ruby/library/delegate/delegator/marshal_spec.rb +++ b/spec/ruby/library/delegate/delegator/marshal_spec.rb @@ -10,7 +10,7 @@ describe "SimpleDelegator" do it "can be marshalled" do m = Marshal.load(Marshal.dump(@delegate)) m.class.should == SimpleDelegator - (m == @obj).should be_true + (m == @obj).should == true end it "can be marshalled with its instance variables intact" do diff --git a/spec/ruby/library/delegate/delegator/method_spec.rb b/spec/ruby/library/delegate/delegator/method_spec.rb index 7b66c28125..e41d3b4a53 100644 --- a/spec/ruby/library/delegate/delegator/method_spec.rb +++ b/spec/ruby/library/delegate/delegator/method_spec.rb @@ -9,61 +9,61 @@ describe "Delegator#method" do it "returns a method object for public methods of the delegate object" do m = @delegate.method(:pub) - m.should be_an_instance_of(Method) + m.should.instance_of?(Method) m.call.should == :foo end it "raises a NameError for protected methods of the delegate object" do - lambda { + -> { -> { @delegate.method(:prot) }.should complain(/delegator does not forward private method #prot/) - }.should raise_error(NameError) + }.should.raise(NameError) end it "raises a NameError for a private methods of the delegate object" do - lambda { + -> { -> { @delegate.method(:priv) }.should complain(/delegator does not forward private method #priv/) - }.should raise_error(NameError) + }.should.raise(NameError) end it "returns a method object for public methods of the Delegator class" do m = @delegate.method(:extra) - m.should be_an_instance_of(Method) + m.should.instance_of?(Method) m.call.should == :cheese end it "returns a method object for protected methods of the Delegator class" do m = @delegate.method(:extra_protected) - m.should be_an_instance_of(Method) + m.should.instance_of?(Method) m.call.should == :baz end it "returns a method object for private methods of the Delegator class" do m = @delegate.method(:extra_private) - m.should be_an_instance_of(Method) + m.should.instance_of?(Method) m.call.should == :bar end it "raises a NameError for an invalid method name" do - lambda { + -> { @delegate.method(:invalid_and_silly_method_name) - }.should raise_error(NameError) + }.should.raise(NameError) end it "returns a method that respond_to_missing?" do m = @delegate.method(:pub_too) - m.should be_an_instance_of(Method) + m.should.instance_of?(Method) m.call.should == :pub_too end it "raises a NameError if method is no longer valid because object has changed" do m = @delegate.method(:pub) @delegate.__setobj__([1,2,3]) - lambda { + -> { m.call - }.should raise_error(NameError) + }.should.raise(NameError) end end diff --git a/spec/ruby/library/delegate/delegator/methods_spec.rb b/spec/ruby/library/delegate/delegator/methods_spec.rb index b9942bd230..928f63f21d 100644 --- a/spec/ruby/library/delegate/delegator/methods_spec.rb +++ b/spec/ruby/library/delegate/delegator/methods_spec.rb @@ -14,24 +14,24 @@ describe "Delegator#methods" do end it "returns singleton methods when passed false" do - @delegate.methods(false).should include(:singleton_method) + @delegate.methods(false).should.include?(:singleton_method) end it "includes all public methods of the delegate object" do - @methods.should include :pub + @methods.should.include? :pub end it "includes all protected methods of the delegate object" do - @methods.should include :prot + @methods.should.include? :prot end it "includes instance methods of the Delegator class" do - @methods.should include :extra - @methods.should include :extra_protected + @methods.should.include? :extra + @methods.should.include? :extra_protected end it "does not include private methods" do - @methods.should_not include :priv - @methods.should_not include :extra_private + @methods.should_not.include? :priv + @methods.should_not.include? :extra_private end end diff --git a/spec/ruby/library/delegate/delegator/not_equal_spec.rb b/spec/ruby/library/delegate/delegator/not_equal_spec.rb index 6f2df21715..7fd234a671 100644 --- a/spec/ruby/library/delegate/delegator/not_equal_spec.rb +++ b/spec/ruby/library/delegate/delegator/not_equal_spec.rb @@ -9,16 +9,16 @@ describe "Delegator#!=" do it "is not delegated when passed self" do @base.should_not_receive(:"!=") - (@delegator != @delegator).should be_false + (@delegator != @delegator).should == false end it "is delegated when passed the delegated object" do @base.should_receive(:"!=").and_return(true) - (@delegator != @base).should be_true + (@delegator != @base).should == true end it "is delegated in general" do @base.should_receive(:"!=").and_return(false) - (@delegator != 42).should be_false + (@delegator != 42).should == false end end diff --git a/spec/ruby/library/delegate/delegator/private_methods_spec.rb b/spec/ruby/library/delegate/delegator/private_methods_spec.rb index 7724b8d413..5615ed0668 100644 --- a/spec/ruby/library/delegate/delegator/private_methods_spec.rb +++ b/spec/ruby/library/delegate/delegator/private_methods_spec.rb @@ -9,12 +9,12 @@ describe "Delegator#private_methods" do end it "does not include any method of the delegate object" do # since delegates does not forward private calls - @methods.should_not include :priv - @methods.should_not include :prot - @methods.should_not include :pub + @methods.should_not.include? :priv + @methods.should_not.include? :prot + @methods.should_not.include? :pub end it "includes all private instance methods of the Delegate class" do - @methods.should include :extra_private + @methods.should.include? :extra_private end end diff --git a/spec/ruby/library/delegate/delegator/protected_methods_spec.rb b/spec/ruby/library/delegate/delegator/protected_methods_spec.rb index fd7874fb21..3ee999fdac 100644 --- a/spec/ruby/library/delegate/delegator/protected_methods_spec.rb +++ b/spec/ruby/library/delegate/delegator/protected_methods_spec.rb @@ -9,10 +9,10 @@ describe "Delegator#protected_methods" do end it "includes protected methods of the delegate object" do - @methods.should include :prot + @methods.should.include? :prot end it "includes protected instance methods of the Delegator class" do - @methods.should include :extra_protected + @methods.should.include? :extra_protected end end diff --git a/spec/ruby/library/delegate/delegator/public_methods_spec.rb b/spec/ruby/library/delegate/delegator/public_methods_spec.rb index 18da16a613..8cf6621e2d 100644 --- a/spec/ruby/library/delegate/delegator/public_methods_spec.rb +++ b/spec/ruby/library/delegate/delegator/public_methods_spec.rb @@ -9,10 +9,10 @@ describe "Delegator#public_methods" do end it "includes public methods of the delegate object" do - @methods.should include :pub + @methods.should.include? :pub end it "includes public instance methods of the Delegator class" do - @methods.should include :extra + @methods.should.include? :extra end end diff --git a/spec/ruby/library/delegate/delegator/send_spec.rb b/spec/ruby/library/delegate/delegator/send_spec.rb index b14e6996d1..cc18a2794b 100644 --- a/spec/ruby/library/delegate/delegator/send_spec.rb +++ b/spec/ruby/library/delegate/delegator/send_spec.rb @@ -12,15 +12,15 @@ describe "SimpleDelegator.new" do end it "forwards protected method calls" do - lambda{ @delegate.prot }.should raise_error( NoMethodError ) + ->{ @delegate.prot }.should.raise( NoMethodError ) end it "doesn't forward private method calls" do - lambda{ @delegate.priv }.should raise_error( NoMethodError ) + ->{ @delegate.priv }.should.raise( NoMethodError ) end it "doesn't forward private method calls even via send or __send__" do - lambda{ @delegate.send(:priv, 42) }.should raise_error( NoMethodError ) - lambda{ @delegate.__send__(:priv, 42) }.should raise_error( NoMethodError ) + ->{ @delegate.send(:priv, 42) }.should.raise( NoMethodError ) + ->{ @delegate.__send__(:priv, 42) }.should.raise( NoMethodError ) end end diff --git a/spec/ruby/library/delegate/delegator/taint_spec.rb b/spec/ruby/library/delegate/delegator/taint_spec.rb index 2dd0493b53..6bf13bb73d 100644 --- a/spec/ruby/library/delegate/delegator/taint_spec.rb +++ b/spec/ruby/library/delegate/delegator/taint_spec.rb @@ -5,19 +5,4 @@ describe "Delegator#taint" do before :each do @delegate = DelegateSpecs::Delegator.new("") end - - it "returns self" do - @delegate.taint.equal?(@delegate).should be_true - end - - it "taints the delegator" do - @delegate.__setobj__(nil) - @delegate.taint - @delegate.tainted?.should be_true - end - - it "taints the delegated object" do - @delegate.taint - @delegate.__getobj__.tainted?.should be_true - end end diff --git a/spec/ruby/library/delegate/delegator/tap_spec.rb b/spec/ruby/library/delegate/delegator/tap_spec.rb index 34a88fa1d5..916e4a37fe 100644 --- a/spec/ruby/library/delegate/delegator/tap_spec.rb +++ b/spec/ruby/library/delegate/delegator/tap_spec.rb @@ -11,6 +11,6 @@ describe "Delegator#tap" do yielded << x end yielded.size.should == 1 - yielded[0].equal?(delegator).should be_true + yielded[0].equal?(delegator).should == true end end diff --git a/spec/ruby/library/delegate/delegator/trust_spec.rb b/spec/ruby/library/delegate/delegator/trust_spec.rb index ba57b3ea18..f1b81814c5 100644 --- a/spec/ruby/library/delegate/delegator/trust_spec.rb +++ b/spec/ruby/library/delegate/delegator/trust_spec.rb @@ -5,18 +5,4 @@ describe "Delegator#trust" do before :each do @delegate = DelegateSpecs::Delegator.new([]) end - - it "returns self" do - @delegate.trust.equal?(@delegate).should be_true - end - - it "trusts the delegator" do - @delegate.trust - @delegate.untrusted?.should be_false - end - - it "trusts the delegated object" do - @delegate.trust - @delegate.__getobj__.untrusted?.should be_false - end end diff --git a/spec/ruby/library/delegate/delegator/untaint_spec.rb b/spec/ruby/library/delegate/delegator/untaint_spec.rb index 4fa4509b53..4051fd2629 100644 --- a/spec/ruby/library/delegate/delegator/untaint_spec.rb +++ b/spec/ruby/library/delegate/delegator/untaint_spec.rb @@ -3,22 +3,6 @@ require_relative '../fixtures/classes' describe "Delegator#untaint" do before :each do - @delegate = lambda { DelegateSpecs::Delegator.new("") }.call - end - - it "returns self" do - @delegate.untaint.equal?(@delegate).should be_true - end - - it "untaints the delegator" do - @delegate.untaint - @delegate.tainted?.should be_false - # No additional meaningful test; that it does or not taint - # "for real" the delegator has no consequence - end - - it "untaints the delegated object" do - @delegate.untaint - @delegate.__getobj__.tainted?.should be_false + @delegate = -> { DelegateSpecs::Delegator.new("") }.call end end diff --git a/spec/ruby/library/delegate/delegator/untrust_spec.rb b/spec/ruby/library/delegate/delegator/untrust_spec.rb index b7f4bc823e..4f7fa1e582 100644 --- a/spec/ruby/library/delegate/delegator/untrust_spec.rb +++ b/spec/ruby/library/delegate/delegator/untrust_spec.rb @@ -5,19 +5,4 @@ describe "Delegator#untrust" do before :each do @delegate = DelegateSpecs::Delegator.new("") end - - it "returns self" do - @delegate.untrust.equal?(@delegate).should be_true - end - - it "untrusts the delegator" do - @delegate.__setobj__(nil) - @delegate.untrust - @delegate.untrusted?.should be_true - end - - it "untrusts the delegated object" do - @delegate.untrust - @delegate.__getobj__.untrusted?.should be_true - end end diff --git a/spec/ruby/library/digest/bubblebabble_spec.rb b/spec/ruby/library/digest/bubblebabble_spec.rb index 7e06a974a3..44a9bf0e26 100644 --- a/spec/ruby/library/digest/bubblebabble_spec.rb +++ b/spec/ruby/library/digest/bubblebabble_spec.rb @@ -3,10 +3,10 @@ require 'digest/bubblebabble' describe "Digest.bubblebabble" do it "returns a String" do - Digest.bubblebabble('').should be_an_instance_of(String) + Digest.bubblebabble('').should.instance_of?(String) end - it "returns a String in the The Bubble Babble Binary Data Encoding format" do + it "returns a String in the Bubble Babble Binary Data Encoding format" do Digest.bubblebabble('').should == 'xexax' Digest.bubblebabble('foo').should == 'xinik-zorox' Digest.bubblebabble('bar').should == 'ximik-cosex' @@ -20,10 +20,10 @@ describe "Digest.bubblebabble" do end it "raises a TypeError when passed nil" do - lambda { Digest.bubblebabble(nil) }.should raise_error(TypeError) + -> { Digest.bubblebabble(nil) }.should.raise(TypeError) end - it "raises a TypeError when passed a Fixnum" do - lambda { Digest.bubblebabble(9001) }.should raise_error(TypeError) + it "raises a TypeError when passed an Integer" do + -> { Digest.bubblebabble(9001) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/hexencode_spec.rb b/spec/ruby/library/digest/hexencode_spec.rb index 717590dd14..3359303d15 100644 --- a/spec/ruby/library/digest/hexencode_spec.rb +++ b/spec/ruby/library/digest/hexencode_spec.rb @@ -22,10 +22,10 @@ describe "Digest.hexencode" do end it "raises a TypeError when passed nil" do - lambda { Digest.hexencode(nil) }.should raise_error(TypeError) + -> { Digest.hexencode(nil) }.should.raise(TypeError) end - it "raises a TypeError when passed a Fixnum" do - lambda { Digest.hexencode(9001) }.should raise_error(TypeError) + it "raises a TypeError when passed an Integer" do + -> { Digest.hexencode(9001) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/instance/append_spec.rb b/spec/ruby/library/digest/instance/append_spec.rb new file mode 100644 index 0000000000..2499579298 --- /dev/null +++ b/spec/ruby/library/digest/instance/append_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'digest' +require_relative 'shared/update' + +describe "Digest::Instance#<<" do + it_behaves_like :digest_instance_update, :<< +end diff --git a/spec/ruby/library/digest/instance/new_spec.rb b/spec/ruby/library/digest/instance/new_spec.rb new file mode 100644 index 0000000000..3f7939844b --- /dev/null +++ b/spec/ruby/library/digest/instance/new_spec.rb @@ -0,0 +1,19 @@ +require_relative '../../../spec_helper' +require 'digest' +require_relative '../md5/shared/constants' + +describe "Digest::Instance#new" do + it "returns a copy of the digest instance" do + digest = Digest::MD5.new + copy = digest.new + copy.should_not.equal?(digest) + end + + it "calls reset" do + digest = Digest::MD5.new + digest << "test" + digest.hexdigest.should != MD5Constants::BlankHexdigest + copy = digest.new + copy.hexdigest.should == MD5Constants::BlankHexdigest + end +end diff --git a/spec/ruby/library/digest/instance/shared/update.rb b/spec/ruby/library/digest/instance/shared/update.rb new file mode 100644 index 0000000000..e064a90087 --- /dev/null +++ b/spec/ruby/library/digest/instance/shared/update.rb @@ -0,0 +1,8 @@ +describe :digest_instance_update, shared: true do + it "raises a RuntimeError if called" do + c = Class.new do + include Digest::Instance + end + -> { c.new.send(@method, "test") }.should.raise(RuntimeError) + end +end diff --git a/spec/ruby/library/digest/instance/update_spec.rb b/spec/ruby/library/digest/instance/update_spec.rb new file mode 100644 index 0000000000..3bb4dd7f1b --- /dev/null +++ b/spec/ruby/library/digest/instance/update_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'digest' +require_relative 'shared/update' + +describe "Digest::Instance#update" do + it_behaves_like :digest_instance_update, :update +end diff --git a/spec/ruby/library/digest/md5/append_spec.rb b/spec/ruby/library/digest/md5/append_spec.rb index a7f841c883..0abdc074a1 100644 --- a/spec/ruby/library/digest/md5/append_spec.rb +++ b/spec/ruby/library/digest/md5/append_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/constants' require_relative 'shared/update' describe "Digest::MD5#<<" do - it_behaves_like :md5_update, :<< + it_behaves_like :md5_update, :<< end diff --git a/spec/ruby/library/digest/md5/file_spec.rb b/spec/ruby/library/digest/md5/file_spec.rb index 2684f50373..9a78a8c055 100644 --- a/spec/ruby/library/digest/md5/file_spec.rb +++ b/spec/ruby/library/digest/md5/file_spec.rb @@ -15,7 +15,7 @@ describe "Digest::MD5.file" do end it "returns a Digest::MD5 object" do - Digest::MD5.file(@file).should be_kind_of(Digest::MD5) + Digest::MD5.file(@file).should.is_a?(Digest::MD5) end it "returns a Digest::MD5 object with the correct digest" do @@ -26,7 +26,7 @@ describe "Digest::MD5.file" do obj = mock("to_str") obj.should_receive(:to_str).and_return(@file) result = Digest::MD5.file(obj) - result.should be_kind_of(Digest::MD5) + result.should.is_a?(Digest::MD5) result.digest.should == MD5Constants::Digest end end @@ -34,10 +34,10 @@ describe "Digest::MD5.file" do it_behaves_like :file_read_directory, :file, Digest::MD5 it "raises a Errno::ENOENT when passed a path that does not exist" do - lambda { Digest::MD5.file("") }.should raise_error(Errno::ENOENT) + -> { Digest::MD5.file("") }.should.raise(Errno::ENOENT) end it "raises a TypeError when passed nil" do - lambda { Digest::MD5.file(nil) }.should raise_error(TypeError) + -> { Digest::MD5.file(nil) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/md5/shared/constants.rb b/spec/ruby/library/digest/md5/shared/constants.rb index fdfae56d63..664dd18e9c 100644 --- a/spec/ruby/library/digest/md5/shared/constants.rb +++ b/spec/ruby/library/digest/md5/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require 'digest/md5' module MD5Constants @@ -12,5 +12,6 @@ module MD5Constants Digest = "\2473\267qw\276\364\343\345\320\304\350\313\314\217n" BlankHexdigest = "d41d8cd98f00b204e9800998ecf8427e" Hexdigest = "a733b77177bef4e3e5d0c4e8cbcc8f6e" + Base64digest = "pzO3cXe+9OPl0MToy8yPbg==" end diff --git a/spec/ruby/library/digest/md5/shared/sample.rb b/spec/ruby/library/digest/md5/shared/sample.rb deleted file mode 100644 index 2bb4f658b1..0000000000 --- a/spec/ruby/library/digest/md5/shared/sample.rb +++ /dev/null @@ -1,17 +0,0 @@ -# -*- encoding: binary -*- - -require 'digest/md5' - -module MD5Constants - - Contents = "Ipsum is simply dummy text of the printing and typesetting industry. \nLorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. \nIt has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. \nIt was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." - - Klass = ::Digest::MD5 - BlockLength = 64 - DigestLength = 16 - BlankDigest = "\324\035\214\331\217\000\262\004\351\200\t\230\354\370B~" - Digest = "\2473\267qw\276\364\343\345\320\304\350\313\314\217n" - BlankHexdigest = "d41d8cd98f00b204e9800998ecf8427e" - Hexdigest = "a733b77177bef4e3e5d0c4e8cbcc8f6e" - -end diff --git a/spec/ruby/library/digest/sha1/file_spec.rb b/spec/ruby/library/digest/sha1/file_spec.rb index 1ac4e1f756..d36e560e21 100644 --- a/spec/ruby/library/digest/sha1/file_spec.rb +++ b/spec/ruby/library/digest/sha1/file_spec.rb @@ -15,7 +15,7 @@ describe "Digest::SHA1.file" do end it "returns a Digest::SHA1 object" do - Digest::SHA1.file(@file).should be_kind_of(Digest::SHA1) + Digest::SHA1.file(@file).should.is_a?(Digest::SHA1) end it "returns a Digest::SHA1 object with the correct digest" do @@ -26,7 +26,7 @@ describe "Digest::SHA1.file" do obj = mock("to_str") obj.should_receive(:to_str).and_return(@file) result = Digest::SHA1.file(obj) - result.should be_kind_of(Digest::SHA1) + result.should.is_a?(Digest::SHA1) result.digest.should == SHA1Constants::Digest end end @@ -34,10 +34,10 @@ describe "Digest::SHA1.file" do it_behaves_like :file_read_directory, :file, Digest::SHA1 it "raises a Errno::ENOENT when passed a path that does not exist" do - lambda { Digest::SHA1.file("") }.should raise_error(Errno::ENOENT) + -> { Digest::SHA1.file("") }.should.raise(Errno::ENOENT) end it "raises a TypeError when passed nil" do - lambda { Digest::SHA1.file(nil) }.should raise_error(TypeError) + -> { Digest::SHA1.file(nil) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/sha1/shared/constants.rb b/spec/ruby/library/digest/sha1/shared/constants.rb index add86b1dd3..d77c05a968 100644 --- a/spec/ruby/library/digest/sha1/shared/constants.rb +++ b/spec/ruby/library/digest/sha1/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require 'digest/sha1' @@ -12,6 +12,7 @@ module SHA1Constants BlankDigest = "\3329\243\356^kK\r2U\277\357\225`\030\220\257\330\a\t" Digest = "X!\255b\323\035\352\314a|q\344+\376\317\361V9\324\343" BlankHexdigest = "da39a3ee5e6b4b0d3255bfef95601890afd80709" - Hexdigest = "e907d2ba21c6c74bc0efd76e44d11fb9bbb7a75e" + Hexdigest = "5821ad62d31deacc617c71e42bfecff15639d4e3" + Base64digest = "WCGtYtMd6sxhfHHkK/7P8VY51OM=" end diff --git a/spec/ruby/library/digest/sha2/hexdigest_spec.rb b/spec/ruby/library/digest/sha2/hexdigest_spec.rb new file mode 100644 index 0000000000..79beca5788 --- /dev/null +++ b/spec/ruby/library/digest/sha2/hexdigest_spec.rb @@ -0,0 +1,32 @@ +require_relative '../../../spec_helper' +require_relative '../sha256/shared/constants' + +describe "Digest::SHA2#hexdigest" do + + it "returns a SHA256 hexdigest by default" do + cur_digest = Digest::SHA2.new + cur_digest.hexdigest.should == SHA256Constants::BlankHexdigest + + # add something to check that the state is reset later + cur_digest << "test" + + cur_digest.hexdigest(SHA256Constants::Contents).should == SHA256Constants::Hexdigest + # second invocation is intentional, to make sure there are no side-effects + cur_digest.hexdigest(SHA256Constants::Contents).should == SHA256Constants::Hexdigest + + # after all is done, verify that the digest is in the original, blank state + cur_digest.hexdigest.should == SHA256Constants::BlankHexdigest + end + +end + +describe "Digest::SHA2.hexdigest" do + + it "returns a SHA256 hexdigest by default" do + Digest::SHA2.hexdigest(SHA256Constants::Contents).should == SHA256Constants::Hexdigest + # second invocation is intentional, to make sure there are no side-effects + Digest::SHA2.hexdigest(SHA256Constants::Contents).should == SHA256Constants::Hexdigest + Digest::SHA2.hexdigest("").should == SHA256Constants::BlankHexdigest + end + +end diff --git a/spec/ruby/library/digest/sha256/append_spec.rb b/spec/ruby/library/digest/sha256/append_spec.rb index 9ca3496afc..ab594c105f 100644 --- a/spec/ruby/library/digest/sha256/append_spec.rb +++ b/spec/ruby/library/digest/sha256/append_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/constants' require_relative 'shared/update' describe "Digest::SHA256#<<" do - it_behaves_like :sha256_update, :<< + it_behaves_like :sha256_update, :<< end diff --git a/spec/ruby/library/digest/sha256/file_spec.rb b/spec/ruby/library/digest/sha256/file_spec.rb index 3cccbb518f..d67a9ebcd6 100644 --- a/spec/ruby/library/digest/sha256/file_spec.rb +++ b/spec/ruby/library/digest/sha256/file_spec.rb @@ -15,18 +15,22 @@ describe "Digest::SHA256.file" do end it "returns a Digest::SHA256 object" do - Digest::SHA256.file(@file).should be_kind_of(Digest::SHA256) + Digest::SHA256.file(@file).should.is_a?(Digest::SHA256) end it "returns a Digest::SHA256 object with the correct digest" do Digest::SHA256.file(@file).digest.should == SHA256Constants::Digest end + it "can be used with frozen-string-literal" do + ruby_exe("require 'digest'; puts Digest::SHA256.file(#{@file.inspect}).digest.inspect", options: "--enable=frozen-string-literal").chomp.should == SHA256Constants::Digest.inspect + end + it "calls #to_str on an object and returns the Digest::SHA256 with the result" do obj = mock("to_str") obj.should_receive(:to_str).and_return(@file) result = Digest::SHA256.file(obj) - result.should be_kind_of(Digest::SHA256) + result.should.is_a?(Digest::SHA256) result.digest.should == SHA256Constants::Digest end end @@ -34,10 +38,10 @@ describe "Digest::SHA256.file" do it_behaves_like :file_read_directory, :file, Digest::SHA256 it "raises a Errno::ENOENT when passed a path that does not exist" do - lambda { Digest::SHA256.file("") }.should raise_error(Errno::ENOENT) + -> { Digest::SHA256.file("") }.should.raise(Errno::ENOENT) end it "raises a TypeError when passed nil" do - lambda { Digest::SHA256.file(nil) }.should raise_error(TypeError) + -> { Digest::SHA256.file(nil) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/sha256/shared/constants.rb b/spec/ruby/library/digest/sha256/shared/constants.rb index dd5b48dca9..afe8f11426 100644 --- a/spec/ruby/library/digest/sha256/shared/constants.rb +++ b/spec/ruby/library/digest/sha256/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require 'digest/sha2' @@ -13,5 +13,6 @@ module SHA256Constants Digest = "\230b\265\344_\337\357\337\242\004\314\311A\211jb\350\373\254\370\365M\230B\002\372\020j\as\270\376" BlankHexdigest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" Hexdigest = "9862b5e45fdfefdfa204ccc941896a62e8fbacf8f54d984202fa106a0773b8fe" + Base64digest = "mGK15F/f79+iBMzJQYlqYuj7rPj1TZhCAvoQagdzuP4=" end diff --git a/spec/ruby/library/digest/sha384/append_spec.rb b/spec/ruby/library/digest/sha384/append_spec.rb index 2bc0c5b90b..94c036cc3f 100644 --- a/spec/ruby/library/digest/sha384/append_spec.rb +++ b/spec/ruby/library/digest/sha384/append_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/constants' require_relative 'shared/update' describe "Digest::SHA384#<<" do - it_behaves_like :sha384_update, :<< + it_behaves_like :sha384_update, :<< end diff --git a/spec/ruby/library/digest/sha384/file_spec.rb b/spec/ruby/library/digest/sha384/file_spec.rb index 376d819040..3726ad4423 100644 --- a/spec/ruby/library/digest/sha384/file_spec.rb +++ b/spec/ruby/library/digest/sha384/file_spec.rb @@ -15,7 +15,7 @@ describe "Digest::SHA384.file" do end it "returns a Digest::SHA384 object" do - Digest::SHA384.file(@file).should be_kind_of(Digest::SHA384) + Digest::SHA384.file(@file).should.is_a?(Digest::SHA384) end it "returns a Digest::SHA384 object with the correct digest" do @@ -26,7 +26,7 @@ describe "Digest::SHA384.file" do obj = mock("to_str") obj.should_receive(:to_str).and_return(@file) result = Digest::SHA384.file(obj) - result.should be_kind_of(Digest::SHA384) + result.should.is_a?(Digest::SHA384) result.digest.should == SHA384Constants::Digest end end @@ -34,10 +34,10 @@ describe "Digest::SHA384.file" do it_behaves_like :file_read_directory, :file, Digest::SHA384 it "raises a Errno::ENOENT when passed a path that does not exist" do - lambda { Digest::SHA384.file("") }.should raise_error(Errno::ENOENT) + -> { Digest::SHA384.file("") }.should.raise(Errno::ENOENT) end it "raises a TypeError when passed nil" do - lambda { Digest::SHA384.file(nil) }.should raise_error(TypeError) + -> { Digest::SHA384.file(nil) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/sha384/shared/constants.rb b/spec/ruby/library/digest/sha384/shared/constants.rb index 3697384fc3..a78d571d26 100644 --- a/spec/ruby/library/digest/sha384/shared/constants.rb +++ b/spec/ruby/library/digest/sha384/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require 'digest/sha2' @@ -14,5 +14,6 @@ module SHA384Constants Digest = "B&\266:\314\216z\361!TD\001{`\355\323\320MW%\270\272\0034n\034\026g\a\217\"\333s\202\275\002Y*\217]\207u\f\034\244\231\266f" BlankHexdigest = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b" Hexdigest = "4226b63acc8e7af1215444017b60edd3d04d5725b8ba03346e1c1667078f22db7382bd02592a8f5d87750c1ca499b666" + Base64digest = "Qia2OsyOevEhVEQBe2Dt09BNVyW4ugM0bhwWZwePIttzgr0CWSqPXYd1DBykmbZm" end diff --git a/spec/ruby/library/digest/sha512/append_spec.rb b/spec/ruby/library/digest/sha512/append_spec.rb index e5f84b56f4..9106e9685d 100644 --- a/spec/ruby/library/digest/sha512/append_spec.rb +++ b/spec/ruby/library/digest/sha512/append_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/constants' require_relative 'shared/update' describe "Digest::SHA512#<<" do - it_behaves_like :sha512_update, :<< + it_behaves_like :sha512_update, :<< end diff --git a/spec/ruby/library/digest/sha512/file_spec.rb b/spec/ruby/library/digest/sha512/file_spec.rb index 0043146efa..78d6d3d4f3 100644 --- a/spec/ruby/library/digest/sha512/file_spec.rb +++ b/spec/ruby/library/digest/sha512/file_spec.rb @@ -15,7 +15,7 @@ describe "Digest::SHA512.file" do end it "returns a Digest::SHA512 object" do - Digest::SHA512.file(@file).should be_kind_of(Digest::SHA512) + Digest::SHA512.file(@file).should.is_a?(Digest::SHA512) end it "returns a Digest::SHA512 object with the correct digest" do @@ -26,7 +26,7 @@ describe "Digest::SHA512.file" do obj = mock("to_str") obj.should_receive(:to_str).and_return(@file) result = Digest::SHA512.file(obj) - result.should be_kind_of(Digest::SHA512) + result.should.is_a?(Digest::SHA512) result.digest.should == SHA512Constants::Digest end end @@ -34,10 +34,10 @@ describe "Digest::SHA512.file" do it_behaves_like :file_read_directory, :file, Digest::SHA512 it "raises a Errno::ENOENT when passed a path that does not exist" do - lambda { Digest::SHA512.file("") }.should raise_error(Errno::ENOENT) + -> { Digest::SHA512.file("") }.should.raise(Errno::ENOENT) end it "raises a TypeError when passed nil" do - lambda { Digest::SHA512.file(nil) }.should raise_error(TypeError) + -> { Digest::SHA512.file(nil) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/digest/sha512/shared/constants.rb b/spec/ruby/library/digest/sha512/shared/constants.rb index 80f5b7bc1d..91787381ee 100644 --- a/spec/ruby/library/digest/sha512/shared/constants.rb +++ b/spec/ruby/library/digest/sha512/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require 'digest/sha2' @@ -13,5 +13,6 @@ module SHA512Constants Digest = "\241\231\232\365\002z\241\331\242\310=\367F\272\004\326\331g\315n\251Q\222\250\374E\257\254=\325\225\003SM\350\244\234\220\233=\031\230A;\000\203\233\340\323t\333\271\222w\266\307\2678\344\255j\003\216\300" BlankHexdigest = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" Hexdigest = "a1999af5027aa1d9a2c83df746ba04d6d967cd6ea95192a8fc45afac3dd59503534de8a49c909b3d1998413b00839be0d374dbb99277b6c7b738e4ad6a038ec0" + Base64digest = "oZma9QJ6odmiyD33RroE1tlnzW6pUZKo/EWvrD3VlQNTTeiknJCbPRmYQTsAg5vg03TbuZJ3tse3OOStagOOwA==" end diff --git a/spec/ruby/library/drb/start_service_spec.rb b/spec/ruby/library/drb/start_service_spec.rb index 016c8b2cff..57a8cf6e15 100644 --- a/spec/ruby/library/drb/start_service_spec.rb +++ b/spec/ruby/library/drb/start_service_spec.rb @@ -1,28 +1,33 @@ require_relative '../../spec_helper' -require_relative 'fixtures/test_server' -require 'drb' -describe "DRb.start_service" do - before :each do - @server = DRb.start_service("druby://localhost:0", TestServer.new) - end +# This does not work yet when run in CRuby via make test-spec: +# Gem::MissingSpecError: Could not find 'ruby2_keywords' (>= 0) among 28 total gem(s) +guard_not -> { MSpecScript.instance_variable_defined?(:@testing_ruby) } do + require_relative 'fixtures/test_server' + require 'drb' - after :each do - DRb.stop_service if @server - end + describe "DRb.start_service" do + before :each do + @server = DRb.start_service("druby://localhost:0", TestServer.new) + end - it "runs a basic remote call" do - DRb.current_server.should == @server - obj = DRbObject.new(nil, @server.uri) - obj.add(1,2,3).should == 6 - end + after :each do + DRb.stop_service if @server + end + + it "runs a basic remote call" do + DRb.current_server.should == @server + obj = DRbObject.new(nil, @server.uri) + obj.add(1,2,3).should == 6 + end - it "runs a basic remote call passing a block" do - DRb.current_server.should == @server - obj = DRbObject.new(nil, @server.uri) - obj.add_yield(2) do |i| - i.should == 2 - i+1 - end.should == 4 + it "runs a basic remote call passing a block" do + DRb.current_server.should == @server + obj = DRbObject.new(nil, @server.uri) + obj.add_yield(2) do |i| + i.should == 2 + i+1 + end.should == 4 + end end end diff --git a/spec/ruby/library/erb/def_class_spec.rb b/spec/ruby/library/erb/def_class_spec.rb index 88bd385f4c..fb687531e0 100644 --- a/spec/ruby/library/erb/def_class_spec.rb +++ b/spec/ruby/library/erb/def_class_spec.rb @@ -24,6 +24,8 @@ END MyClass1ForErb = erb.def_class(MyClass1ForErb_, 'render()') MyClass1ForErb.method_defined?(:render).should == true MyClass1ForErb.new('foo', 123).render().should == expected + ensure + Object.send(:remove_const, :MyClass1ForErb) end end diff --git a/spec/ruby/library/erb/def_module_spec.rb b/spec/ruby/library/erb/def_module_spec.rb index 806e564ef0..5f67aeb2b9 100644 --- a/spec/ruby/library/erb/def_module_spec.rb +++ b/spec/ruby/library/erb/def_module_spec.rb @@ -22,6 +22,9 @@ END include MyModule2ForErb end MyClass2ForErb.new.render('foo', 123).should == expected + ensure + Object.send(:remove_const, :MyClass2ForErb) + Object.send(:remove_const, :MyModule2ForErb) end end diff --git a/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb b/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb index dc1e044d9c..1cd7582936 100644 --- a/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb +++ b/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb @@ -58,6 +58,8 @@ END end end MyClass4ForErb.new([10,20,30]).render().should == expected + ensure + Object.send(:remove_const, :MY_INPUT4_FOR_ERB) end diff --git a/spec/ruby/library/erb/filename_spec.rb b/spec/ruby/library/erb/filename_spec.rb index 26fed2897b..bbd2233bb3 100644 --- a/spec/ruby/library/erb/filename_spec.rb +++ b/spec/ruby/library/erb/filename_spec.rb @@ -6,14 +6,14 @@ describe "ERB#filename" do filename = 'foobar.rhtml' erb = ERB.new('<% if true %>') # will raise SyntaxError erb.filename = filename - lambda { + -> { begin erb.result(binding) rescue Exception => e @ex = e raise e end - }.should raise_error(SyntaxError) + }.should.raise(SyntaxError) expected = filename @ex.message =~ /^(.*?):(\d+): / @@ -23,14 +23,14 @@ describe "ERB#filename" do it "uses '(erb)' as filename when filename is not set" do erb = ERB.new('<% if true %>') # will raise SyntaxError - lambda { + -> { begin erb.result(binding) rescue Exception => e @ex = e raise e end - }.should raise_error(SyntaxError) + }.should.raise(SyntaxError) expected = '(erb)' @ex.message =~ /^(.*?):(\d+): / diff --git a/spec/ruby/library/erb/fixtures/classes.rb b/spec/ruby/library/erb/fixtures/classes.rb index 03da889941..e07a6ed68d 100644 --- a/spec/ruby/library/erb/fixtures/classes.rb +++ b/spec/ruby/library/erb/fixtures/classes.rb @@ -1,9 +1,5 @@ module ERBSpecs def self.new_erb(input, trim_mode: nil) - if ruby_version_is "2.6" - ERB.new(input, trim_mode: trim_mode) - else - ERB.new(input, nil, trim_mode) - end + ERB.new(input, trim_mode: trim_mode) end end diff --git a/spec/ruby/library/erb/new_spec.rb b/spec/ruby/library/erb/new_spec.rb index 3f6ae93f9f..35ac0dfdfe 100644 --- a/spec/ruby/library/erb/new_spec.rb +++ b/spec/ruby/library/erb/new_spec.rb @@ -36,17 +36,10 @@ END end end - ruby_version_is "2.6" do - it "warns invalid trim_mode" do - begin - $VERBOSE, verbose = false, $VERBOSE # Some other specs make $VERBOSE `nil`. - lambda do - ERBSpecs.new_erb(@eruby_str, trim_mode: '') - end.should output(nil, /Invalid ERB trim mode/) - ensure - $VERBOSE = verbose - end - end + it "warns invalid trim_mode" do + -> do + ERBSpecs.new_erb(@eruby_str, trim_mode: '') + end.should complain(/Invalid ERB trim mode/) end it "removes '\n' when trim_mode is 1 or '>'" do @@ -88,9 +81,9 @@ END </p> END - lambda { + -> { ERBSpecs.new_erb(input, trim_mode: '-').result - }.should raise_error(SyntaxError) + }.should.raise(SyntaxError) end it "regards lines starting with '%' as '<% ... %>' when trim_mode is '%'" do @@ -125,13 +118,8 @@ END it "changes '_erbout' variable name in the produced source" do input = @eruby_str - if RUBY_VERSION >= '2.6' - match_erbout = ERB.new(input, trim_mode: nil).src - match_buf = ERB.new(input, trim_mode: nil, eoutvar: 'buf').src - else - match_erbout = ERB.new(input, nil, nil).src - match_buf = ERB.new(input, nil, nil, 'buf').src - end + match_erbout = ERB.new(input, trim_mode: nil).src + match_buf = ERB.new(input, trim_mode: nil, eoutvar: 'buf').src match_erbout.gsub("_erbout", "buf").should == match_buf end @@ -142,12 +130,28 @@ END <b><%#= item %></b> <%# end %> END - ERBSpecs.new_erb(input).result.should == "\n<b></b>\n\n" + ERBSpecs.new_erb(input).result.should == "\n<b></b>\n\n" ERBSpecs.new_erb(input, trim_mode: '<>').result.should == "<b></b>\n" end it "forget local variables defined previous one" do ERB.new(@eruby_str).result - lambda{ ERB.new("<%= list %>").result }.should raise_error(NameError) + ->{ ERB.new("<%= list %>").result }.should.raise(NameError) + end + + version_is ERB.const_get(:VERSION, false), ""..."6.0.0" do + describe "warning about arguments" do + it "warns when passed safe_level and later arguments" do + -> { + ERB.new(@eruby_str, nil, '%') + }.should complain(/warning: Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments./) + end + + it "does not warn when passed arguments as keyword argument" do + -> { + ERB.new(@eruby_str, trim_mode: '%') + }.should_not complain(/warning: Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments./) + end + end end end diff --git a/spec/ruby/library/erb/result_spec.rb b/spec/ruby/library/erb/result_spec.rb index eb9d0c5356..84333031ec 100644 --- a/spec/ruby/library/erb/result_spec.rb +++ b/spec/ruby/library/erb/result_spec.rb @@ -41,9 +41,9 @@ END it "is not able to h() or u() unless including ERB::Util" do input = "<%=h '<>' %>" - lambda { + -> { ERB.new(input).result() - }.should raise_error(NameError) + }.should.raise(NameError) end @@ -79,8 +79,8 @@ END expected = '123' myerb2.new.main1().should == expected - lambda { + -> { myerb2.new.main2() - }.should raise_error(NameError) + }.should.raise(NameError) end end diff --git a/spec/ruby/library/erb/run_spec.rb b/spec/ruby/library/erb/run_spec.rb index c4b82b155e..d81d534087 100644 --- a/spec/ruby/library/erb/run_spec.rb +++ b/spec/ruby/library/erb/run_spec.rb @@ -6,7 +6,7 @@ describe "ERB#run" do # lambda { ... }.should output def _steal_stdout orig = $stdout - s = '' + s = +'' def s.write(arg); self << arg.to_s; end $stdout = s begin @@ -52,9 +52,9 @@ END it "is not able to h() or u() unless including ERB::Util" do input = "<%=h '<>' %>" - lambda { + -> { _steal_stdout { ERB.new(input).run() } - }.should raise_error(NameError) + }.should.raise(NameError) end it "is able to h() or u() if ERB::Util is included" do @@ -89,8 +89,8 @@ END actual = _steal_stdout { myerb2.new.main1() } actual.should == expected - lambda { + -> { _steal_stdout { myerb2.new.main2() } - }.should raise_error(NameError) + }.should.raise(NameError) end end diff --git a/spec/ruby/library/erb/util/shared/url_encode.rb b/spec/ruby/library/erb/util/shared/url_encode.rb index 5ac6215523..34009c4903 100644 --- a/spec/ruby/library/erb/util/shared/url_encode.rb +++ b/spec/ruby/library/erb/util/shared/url_encode.rb @@ -6,21 +6,13 @@ describe :erb_util_url_encode, shared: true do ERB::Util.__send__(@method, input).should == expected end - ruby_version_is ""..."2.5" do - it "escapes tilde" do - ERB::Util.__send__(@method, "~").should == "%7E" - end - end - - ruby_version_is "2.5" do - it "does not escape tilde" do - ERB::Util.__send__(@method, "~").should == "~" - end + it "does not escape tilde" do + ERB::Util.__send__(@method, "~").should == "~" end it "encode unicode string" do - input = "http://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" - expected = 'http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' + input = "https://ja.wikipedia.org/wiki/\343\203\255\343\203\240\343\202\271\343\202\253\343\203\273\343\203\221\343\203\255\343\203\273\343\202\246\343\203\253\343\203\273\343\203\251\343\203\224\343\203\245\343\202\277" + expected = 'https%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%83%AD%E3%83%A0%E3%82%B9%E3%82%AB%E3%83%BB%E3%83%91%E3%83%AD%E3%83%BB%E3%82%A6%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%94%E3%83%A5%E3%82%BF' ERB::Util.__send__(@method, input).should == expected end diff --git a/spec/ruby/library/etc/confstr_spec.rb b/spec/ruby/library/etc/confstr_spec.rb index 0c922a3a77..786cb16407 100644 --- a/spec/ruby/library/etc/confstr_spec.rb +++ b/spec/ruby/library/etc/confstr_spec.rb @@ -1,14 +1,14 @@ -require File.expand_path('../../../spec_helper', __FILE__) +require_relative '../../spec_helper' require 'etc' -platform_is_not :windows do +platform_is_not :windows, :android do describe "Etc.confstr" do it "returns a String for Etc::CS_PATH" do - Etc.confstr(Etc::CS_PATH).should be_an_instance_of(String) + Etc.confstr(Etc::CS_PATH).should.instance_of?(String) end it "raises Errno::EINVAL for unknown configuration variables" do - -> { Etc.confstr(-1) }.should raise_error(Errno::EINVAL) + -> { Etc.confstr(-1) }.should.raise(Errno::EINVAL) end end end diff --git a/spec/ruby/library/etc/getgrgid_spec.rb b/spec/ruby/library/etc/getgrgid_spec.rb index 04758912b3..472d4c82c8 100644 --- a/spec/ruby/library/etc/getgrgid_spec.rb +++ b/spec/ruby/library/etc/getgrgid_spec.rb @@ -34,7 +34,7 @@ platform_is_not :windows do it "returns the Etc::Group for a given gid if it exists" do grp = Etc.getgrgid(@gid) - grp.should be_kind_of(Etc::Group) + grp.should.is_a?(Etc::Group) grp.gid.should == @gid grp.name.should == @name end @@ -46,20 +46,13 @@ platform_is_not :windows do gr.name.should == @name end - it "returns the Group for a given gid if it exists" do - grp = Etc.getgrgid(@gid) - grp.should be_kind_of(Struct::Group) - grp.gid.should == @gid - grp.name.should == @name - end - it "raises if the group does not exist" do - lambda { Etc.getgrgid(9876)}.should raise_error(ArgumentError) + -> { Etc.getgrgid(9876)}.should.raise(ArgumentError) end it "raises a TypeError if not passed an Integer" do - lambda { Etc.getgrgid("foo") }.should raise_error(TypeError) - lambda { Etc.getgrgid(nil) }.should raise_error(TypeError) + -> { Etc.getgrgid("foo") }.should.raise(TypeError) + -> { Etc.getgrgid(nil) }.should.raise(TypeError) end it "can be called safely by multiple threads" do diff --git a/spec/ruby/library/etc/getgrnam_spec.rb b/spec/ruby/library/etc/getgrnam_spec.rb index 3fe94ed5f5..325ea7b297 100644 --- a/spec/ruby/library/etc/getgrnam_spec.rb +++ b/spec/ruby/library/etc/getgrnam_spec.rb @@ -11,7 +11,7 @@ platform_is :windows do end end -platform_is_not :windows do +platform_is_not :windows, :android do describe "Etc.getgrnam" do it "returns a Etc::Group struct instance for the given group" do gr_name = Etc.getgrent.name @@ -21,10 +21,10 @@ platform_is_not :windows do end it "only accepts strings as argument" do - lambda { + -> { Etc.getgrnam(123) Etc.getgrnam(nil) - }.should raise_error(TypeError) + }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/etc/getlogin_spec.rb b/spec/ruby/library/etc/getlogin_spec.rb index 7a4fd79ae2..2bc598c0af 100644 --- a/spec/ruby/library/etc/getlogin_spec.rb +++ b/spec/ruby/library/etc/getlogin_spec.rb @@ -14,7 +14,7 @@ describe "Etc.getlogin" do if ENV['TRAVIS'] and platform_is(:darwin) # See https://travis-ci.org/ruby/spec/jobs/285967744 # and https://travis-ci.org/ruby/spec/jobs/285999602 - Etc.getlogin.should be_an_instance_of(String) + Etc.getlogin.should.instance_of?(String) else # Etc.getlogin returns the same result of logname(2) # if it returns non NULL @@ -28,7 +28,7 @@ describe "Etc.getlogin" do else # Etc.getlogin may return nil if the login name is not set # because of chroot or sudo or something. - Etc.getlogin.should be_nil + Etc.getlogin.should == nil getlogin_null = true end ensure diff --git a/spec/ruby/library/etc/getpwnam_spec.rb b/spec/ruby/library/etc/getpwnam_spec.rb index 2062ee51aa..a0b3c9e1fe 100644 --- a/spec/ruby/library/etc/getpwnam_spec.rb +++ b/spec/ruby/library/etc/getpwnam_spec.rb @@ -19,10 +19,10 @@ platform_is_not :windows do end it "only accepts strings as argument" do - lambda { + -> { Etc.getpwnam(123) Etc.getpwnam(nil) - }.should raise_error(TypeError) + }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/etc/getpwuid_spec.rb b/spec/ruby/library/etc/getpwuid_spec.rb index 3f6866ddc6..3e35dfe6d5 100644 --- a/spec/ruby/library/etc/getpwuid_spec.rb +++ b/spec/ruby/library/etc/getpwuid_spec.rb @@ -27,10 +27,10 @@ platform_is_not :windows do end it "only accepts integers as argument" do - lambda { + -> { Etc.getpwuid("foo") Etc.getpwuid(nil) - }.should raise_error(TypeError) + }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/etc/group_spec.rb b/spec/ruby/library/etc/group_spec.rb index fdd39bda16..d7addbbec1 100644 --- a/spec/ruby/library/etc/group_spec.rb +++ b/spec/ruby/library/etc/group_spec.rb @@ -5,11 +5,11 @@ require 'etc' describe "Etc.group" do it_behaves_like :etc_on_windows, :group - platform_is_not :windows do + platform_is_not :windows, :android do it "returns a Etc::Group struct" do group = Etc.group begin - group.should be_an_instance_of(Etc::Group) + group.should.instance_of?(Etc::Group) ensure Etc.endgrent end @@ -21,7 +21,7 @@ describe "Etc.group" do Etc.group do | group2 | end end - }.should raise_error(RuntimeError) + }.should.raise(RuntimeError) end end end diff --git a/spec/ruby/library/etc/nprocessors_spec.rb b/spec/ruby/library/etc/nprocessors_spec.rb index ec7ffc81da..482719dde0 100644 --- a/spec/ruby/library/etc/nprocessors_spec.rb +++ b/spec/ruby/library/etc/nprocessors_spec.rb @@ -3,7 +3,7 @@ require 'etc' describe "Etc.nprocessors" do it "returns the number of online processors" do - Etc.nprocessors.should be_kind_of(Integer) + Etc.nprocessors.should.is_a?(Integer) Etc.nprocessors.should >= 1 end end diff --git a/spec/ruby/library/etc/passwd_spec.rb b/spec/ruby/library/etc/passwd_spec.rb index d61dada451..0602b7e10b 100644 --- a/spec/ruby/library/etc/passwd_spec.rb +++ b/spec/ruby/library/etc/passwd_spec.rb @@ -1,4 +1,4 @@ -require File.expand_path('../../../spec_helper', __FILE__) +require_relative '../../spec_helper' require 'etc' platform_is_not :windows do @@ -6,7 +6,7 @@ platform_is_not :windows do it "returns a Etc::Passwd struct" do passwd = Etc.passwd begin - passwd.should be_an_instance_of(Etc::Passwd) + passwd.should.instance_of?(Etc::Passwd) ensure Etc.endpwent end diff --git a/spec/ruby/library/etc/struct_group_spec.rb b/spec/ruby/library/etc/struct_group_spec.rb index 0b50ff578f..b2147e306d 100644 --- a/spec/ruby/library/etc/struct_group_spec.rb +++ b/spec/ruby/library/etc/struct_group_spec.rb @@ -1,7 +1,7 @@ require_relative '../../spec_helper' require 'etc' -describe "Struct::Group" do +describe "Etc::Group" do platform_is_not :windows do grpname = IO.popen(%w'id -gn', err: IO::NULL, &:read) next unless $?.success? diff --git a/spec/ruby/library/etc/struct_passwd_spec.rb b/spec/ruby/library/etc/struct_passwd_spec.rb index 93ad9dfa2a..dc37c17e7d 100644 --- a/spec/ruby/library/etc/struct_passwd_spec.rb +++ b/spec/ruby/library/etc/struct_passwd_spec.rb @@ -1,7 +1,7 @@ require_relative '../../spec_helper' require 'etc' -describe "Struct::Passwd" do +describe "Etc::Passwd" do platform_is_not :windows do before :all do @pw = Etc.getpwuid(`id -u`.strip.to_i) diff --git a/spec/ruby/library/etc/sysconf_spec.rb b/spec/ruby/library/etc/sysconf_spec.rb index e7d59d1b22..81ce1ca258 100644 --- a/spec/ruby/library/etc/sysconf_spec.rb +++ b/spec/ruby/library/etc/sysconf_spec.rb @@ -1,4 +1,4 @@ -require File.expand_path('../../../spec_helper', __FILE__) +require_relative '../../spec_helper' require 'etc' platform_is_not :windows do @@ -14,7 +14,7 @@ platform_is_not :windows do if value.nil? value.should == nil else - value.should be_kind_of(Integer) + value.should.is_a?(Integer) end end end diff --git a/spec/ruby/library/etc/sysconfdir_spec.rb b/spec/ruby/library/etc/sysconfdir_spec.rb index d54299c513..eb2d6b649a 100644 --- a/spec/ruby/library/etc/sysconfdir_spec.rb +++ b/spec/ruby/library/etc/sysconfdir_spec.rb @@ -1,8 +1,8 @@ -require File.expand_path('../../../spec_helper', __FILE__) +require_relative '../../spec_helper' require 'etc' describe "Etc.sysconfdir" do it "returns a String" do - Etc.sysconfdir.should be_an_instance_of(String) + Etc.sysconfdir.should.instance_of?(String) end end diff --git a/spec/ruby/library/etc/systmpdir_spec.rb b/spec/ruby/library/etc/systmpdir_spec.rb index 99c82903f8..ed34cb43fc 100644 --- a/spec/ruby/library/etc/systmpdir_spec.rb +++ b/spec/ruby/library/etc/systmpdir_spec.rb @@ -1,8 +1,8 @@ -require File.expand_path('../../../spec_helper', __FILE__) +require_relative '../../spec_helper' require 'etc' describe "Etc.systmpdir" do it "returns a String" do - Etc.systmpdir.should be_an_instance_of(String) + Etc.systmpdir.should.instance_of?(String) end end diff --git a/spec/ruby/library/etc/uname_spec.rb b/spec/ruby/library/etc/uname_spec.rb new file mode 100644 index 0000000000..1c5fe2a741 --- /dev/null +++ b/spec/ruby/library/etc/uname_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../spec_helper' +require 'etc' + +describe "Etc.uname" do + it "returns a Hash with the documented keys" do + uname = Etc.uname + uname.should.is_a?(Hash) + uname.should.key?(:sysname) + uname.should.key?(:nodename) + uname.should.key?(:release) + uname.should.key?(:version) + uname.should.key?(:machine) + end +end diff --git a/spec/ruby/library/expect/expect_spec.rb b/spec/ruby/library/expect/expect_spec.rb index 454023979f..ba705c5535 100644 --- a/spec/ruby/library/expect/expect_spec.rb +++ b/spec/ruby/library/expect/expect_spec.rb @@ -1,5 +1,6 @@ +require_relative '../../spec_helper' + platform_is_not :windows do - require_relative '../../spec_helper' require 'expect' describe "IO#expect" do @@ -37,16 +38,16 @@ platform_is_not :windows do @write << "prompt> hello" @read.close - lambda { + -> { @read.expect("hello") - }.should raise_error(IOError) + }.should.raise(IOError) end it "returns nil if eof is hit" do @write << "pro" @write.close - @read.expect("prompt").should be_nil + @read.expect("prompt").should == nil end it "yields the result if a block is given" do diff --git a/spec/ruby/library/fiber/alive_spec.rb b/spec/ruby/library/fiber/alive_spec.rb deleted file mode 100644 index 72663dd173..0000000000 --- a/spec/ruby/library/fiber/alive_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../spec_helper' - -with_feature :fiber_library do - require 'fiber' - - describe "Fiber#alive?" do - it "returns true for a Fiber that hasn't had #resume called" do - fiber = Fiber.new { true } - fiber.alive?.should be_true - end - - # FIXME: Better description? - it "returns true for a Fiber that's yielded to the caller" do - fiber = Fiber.new { Fiber.yield } - fiber.resume - fiber.alive?.should be_true - end - - it "returns true when called from its Fiber" do - fiber = Fiber.new { fiber.alive?.should be_true } - fiber.resume - end - - it "doesn't invoke the block associated with the Fiber" do - offthehook = mock('do not call') - offthehook.should_not_receive(:ring) - fiber = Fiber.new { offthehook.ring } - fiber.alive? - end - - it "returns false for a Fiber that's dead" do - fiber = Fiber.new { true } - fiber.resume - lambda { fiber.resume }.should raise_error(FiberError) - fiber.alive?.should be_false - end - - it "always returns false for a dead Fiber" do - fiber = Fiber.new { true } - fiber.resume - lambda { fiber.resume }.should raise_error(FiberError) - fiber.alive?.should be_false - lambda { fiber.resume }.should raise_error(FiberError) - fiber.alive?.should be_false - fiber.alive?.should be_false - end - end -end diff --git a/spec/ruby/library/fiber/current_spec.rb b/spec/ruby/library/fiber/current_spec.rb deleted file mode 100644 index 8b7fa7c4ca..0000000000 --- a/spec/ruby/library/fiber/current_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require_relative '../../spec_helper' - -with_feature :fiber_library do - require 'fiber' - - describe "Fiber.current" do - it "returns the root Fiber when called outside of a Fiber" do - root = Fiber.current - root.should be_an_instance_of(Fiber) - # We can always transfer to the root Fiber; it will never die - 5.times do - root.transfer.should be_nil - root.alive?.should be_true - end - end - - it "returns the current Fiber when called from a Fiber" do - fiber = Fiber.new do - this = Fiber.current - this.should be_an_instance_of(Fiber) - this.should == fiber - this.alive?.should be_true - end - fiber.resume - end - - it "returns the current Fiber when called from a Fiber that transferred to another" do - states = [] - fiber = Fiber.new do - states << :fiber - this = Fiber.current - this.should be_an_instance_of(Fiber) - this.should == fiber - this.alive?.should be_true - end - - fiber2 = Fiber.new do - states << :fiber2 - fiber.transfer - flunk - end - - fiber3 = Fiber.new do - states << :fiber3 - fiber2.transfer - flunk - end - - fiber3.resume - states.should == [:fiber3, :fiber2, :fiber] - end - end -end diff --git a/spec/ruby/library/fiber/resume_spec.rb b/spec/ruby/library/fiber/resume_spec.rb deleted file mode 100644 index 9789cf5b7c..0000000000 --- a/spec/ruby/library/fiber/resume_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../spec_helper' - -with_feature :fiber_library do - require 'fiber' - - describe "Fiber#resume" do - it "raises a FiberError if the Fiber has transferred control to another Fiber" do - fiber1 = Fiber.new { true } - fiber2 = Fiber.new { fiber1.transfer; Fiber.yield } - fiber2.resume - lambda { fiber2.resume }.should raise_error(FiberError) - end - end -end diff --git a/spec/ruby/library/fiber/transfer_spec.rb b/spec/ruby/library/fiber/transfer_spec.rb deleted file mode 100644 index 22bb568840..0000000000 --- a/spec/ruby/library/fiber/transfer_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -require_relative '../../spec_helper' -require_relative '../../shared/fiber/resume' - -with_feature :fiber_library do - require 'fiber' - - describe "Fiber#transfer" do - it_behaves_like :fiber_resume, :transfer - end - - describe "Fiber#transfer" do - it "transfers control from one Fiber to another when called from a Fiber" do - fiber1 = Fiber.new { :fiber1 } - fiber2 = Fiber.new { fiber1.transfer; :fiber2 } - fiber2.resume.should == :fiber1 - end - - it "returns to the root Fiber when finished" do - f1 = Fiber.new { :fiber_1 } - f2 = Fiber.new { f1.transfer; :fiber_2 } - - f2.transfer.should == :fiber_1 - f2.transfer.should == :fiber_2 - end - - it "can be invoked from the same Fiber it transfers control to" do - states = [] - fiber = Fiber.new { states << :start; fiber.transfer; states << :end } - fiber.transfer - states.should == [:start, :end] - - states = [] - fiber = Fiber.new { states << :start; fiber.transfer; states << :end } - fiber.resume - states.should == [:start, :end] - end - - it "can transfer control to a Fiber that has transferred to another Fiber" do - states = [] - fiber1 = Fiber.new { states << :fiber1 } - fiber2 = Fiber.new { states << :fiber2_start; fiber1.transfer; states << :fiber2_end} - fiber2.resume.should == [:fiber2_start, :fiber1] - fiber2.transfer.should == [:fiber2_start, :fiber1, :fiber2_end] - end - - it "raises a FiberError when transferring to a Fiber which resumes itself" do - fiber = Fiber.new { fiber.resume } - lambda { fiber.transfer }.should raise_error(FiberError) - end - - it "works if Fibers in different Threads each transfer to a Fiber in the same Thread" do - # This catches a bug where Fibers are running on a thread-pool - # and Fibers from a different Ruby Thread reuse the same native thread. - # Caching the Ruby Thread based on the native thread is not correct in that case, - # and the check for "fiber called across threads" in Fiber#transfer - # might be incorrect based on that. - 2.times do - Thread.new do - io_fiber = Fiber.new do |calling_fiber| - calling_fiber.transfer - end - io_fiber.transfer(Fiber.current) - value = Object.new - io_fiber.transfer(value).should equal value - end.join - end - end - - it "transfers control between a non-main thread's root fiber to a child fiber and back again" do - states = [] - thread = Thread.new do - f1 = Fiber.new do |f0| - states << 0 - value2 = f0.transfer(1) - states << value2 - 3 - end - - value1 = f1.transfer(Fiber.current) - states << value1 - value3 = f1.transfer(2) - states << value3 - end - thread.join - states.should == [0, 1, 2, 3] - end - end -end diff --git a/spec/ruby/library/fiddle/handle/initialize_spec.rb b/spec/ruby/library/fiddle/handle/initialize_spec.rb new file mode 100644 index 0000000000..84c809a727 --- /dev/null +++ b/spec/ruby/library/fiddle/handle/initialize_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../../spec_helper' +require 'fiddle' + +describe "Fiddle::Handle#initialize" do + it "raises Fiddle::DLError if the library cannot be found" do + -> { + Fiddle::Handle.new("doesnotexist.doesnotexist") + }.should.raise(Fiddle::DLError) + end +end diff --git a/spec/ruby/library/find/find_spec.rb b/spec/ruby/library/find/find_spec.rb index 7cd76fa01b..c4ccfa76fd 100644 --- a/spec/ruby/library/find/find_spec.rb +++ b/spec/ruby/library/find/find_spec.rb @@ -13,7 +13,7 @@ describe "Find.find" do describe "when called without a block" do it "returns an Enumerator" do - Find.find(FindDirSpecs.mock_dir).should be_an_instance_of(Enumerator) + Find.find(FindDirSpecs.mock_dir).should.instance_of?(Enumerator) Find.find(FindDirSpecs.mock_dir).to_a.sort.should == FindDirSpecs.expected_paths end end diff --git a/spec/ruby/library/find/fixtures/common.rb b/spec/ruby/library/find/fixtures/common.rb index 14a7edb09a..99f3bbb45a 100644 --- a/spec/ruby/library/find/fixtures/common.rb +++ b/spec/ruby/library/find/fixtures/common.rb @@ -71,13 +71,17 @@ module FindDirSpecs end def self.create_mock_dirs + tmp('') # make sure there is an tmpdir umask = File.umask 0 - mock_dir_files.each do |name| - file = File.join mock_dir, name - mkdir_p File.dirname(file) - touch file + begin + mock_dir_files.each do |name| + file = File.join mock_dir, name + mkdir_p File.dirname(file) + touch file + end + ensure + File.umask umask end - File.umask umask end def self.delete_mock_dirs diff --git a/spec/ruby/library/getoptlong/error_message_spec.rb b/spec/ruby/library/getoptlong/error_message_spec.rb index 1ed9419f6c..10435b1350 100644 --- a/spec/ruby/library/getoptlong/error_message_spec.rb +++ b/spec/ruby/library/getoptlong/error_message_spec.rb @@ -14,7 +14,7 @@ describe "GetoptLong#error_message" do opts.get -> { opts.ordering = GetoptLong::PERMUTE - }.should raise_error(ArgumentError) { |e| + }.should.raise(ArgumentError) { |e| e.message.should == "argument error" opts.error_message.should == "argument error" } diff --git a/spec/ruby/library/getoptlong/ordering_spec.rb b/spec/ruby/library/getoptlong/ordering_spec.rb index e6b645018d..60ce73afaa 100644 --- a/spec/ruby/library/getoptlong/ordering_spec.rb +++ b/spec/ruby/library/getoptlong/ordering_spec.rb @@ -9,18 +9,18 @@ describe "GetoptLong#ordering=" do opts.quiet = true opts.get - lambda { + -> { opts.ordering = GetoptLong::PERMUTE - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end it "raises an ArgumentError if given an invalid value" do opts = GetoptLong.new - lambda { + -> { opts.ordering = 12345 - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "does not allow changing ordering to PERMUTE if ENV['POSIXLY_CORRECT'] is set" do diff --git a/spec/ruby/library/getoptlong/set_options_spec.rb b/spec/ruby/library/getoptlong/set_options_spec.rb index f2acccea28..f60dcc87a3 100644 --- a/spec/ruby/library/getoptlong/set_options_spec.rb +++ b/spec/ruby/library/getoptlong/set_options_spec.rb @@ -39,60 +39,60 @@ describe "GetoptLong#set_options" do it "raises an ArgumentError if too many argument flags where given" do argv [] do - lambda { + -> { @opts.set_options(["--size", GetoptLong::NO_ARGUMENT, GetoptLong::REQUIRED_ARGUMENT]) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end it "raises a RuntimeError if processing has already started" do argv [] do @opts.get - lambda { + -> { @opts.set_options() - }.should raise_error(RuntimeError) + }.should.raise(RuntimeError) end end it "raises an ArgumentError if no argument flag was given" do argv [] do - lambda { + -> { @opts.set_options(["--size"]) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end it "raises an ArgumentError if one of the given arguments is not an Array" do argv [] do - lambda { + -> { @opts.set_options( ["--size", GetoptLong::REQUIRED_ARGUMENT], "test") - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end it "raises an ArgumentError if the same option is given twice" do argv [] do - lambda { + -> { @opts.set_options( ["--size", GetoptLong::NO_ARGUMENT], ["--size", GetoptLong::OPTIONAL_ARGUMENT]) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) - lambda { + -> { @opts.set_options( ["--size", GetoptLong::NO_ARGUMENT], ["-s", "--size", GetoptLong::OPTIONAL_ARGUMENT]) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end it "raises an ArgumentError if the given option is invalid" do argv [] do - lambda { + -> { @opts.set_options(["-size", GetoptLong::NO_ARGUMENT]) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/getoptlong/shared/get.rb b/spec/ruby/library/getoptlong/shared/get.rb index 91a0fbaacc..8d24c4c255 100644 --- a/spec/ruby/library/getoptlong/shared/get.rb +++ b/spec/ruby/library/getoptlong/shared/get.rb @@ -49,16 +49,14 @@ describe :getoptlong_get, shared: true do it "raises a if an argument was required, but none given" do argv [ "--size" ] do - lambda { @opts.send(@method) }.should raise_error(GetoptLong::MissingArgument) + -> { @opts.send(@method) }.should.raise(GetoptLong::MissingArgument) end end - ruby_version_is "2.5" do - # https://bugs.ruby-lang.org/issues/13858 - it "returns multiline argument" do - argv [ "--size=\n10k\n" ] do - @opts.send(@method).should == [ "--size", "\n10k\n" ] - end + # https://bugs.ruby-lang.org/issues/13858 + it "returns multiline argument" do + argv [ "--size=\n10k\n" ] do + @opts.send(@method).should == [ "--size", "\n10k\n" ] end end end diff --git a/spec/ruby/library/getoptlong/terminate_spec.rb b/spec/ruby/library/getoptlong/terminate_spec.rb index 287945fe9b..a12d1df2ef 100644 --- a/spec/ruby/library/getoptlong/terminate_spec.rb +++ b/spec/ruby/library/getoptlong/terminate_spec.rb @@ -19,7 +19,7 @@ describe "GetoptLong#terminate" do end end - it "returns self when option processsing is terminated" do + it "returns self when option processing is terminated" do @opts.terminate.should == @opts end diff --git a/spec/ruby/library/getoptlong/terminated_spec.rb b/spec/ruby/library/getoptlong/terminated_spec.rb index 01a8feddea..6108a7f6e9 100644 --- a/spec/ruby/library/getoptlong/terminated_spec.rb +++ b/spec/ruby/library/getoptlong/terminated_spec.rb @@ -5,13 +5,13 @@ describe "GetoptLong#terminated?" do it "returns true if option processing has terminated" do argv [ "--size", "10k" ] do opts = GetoptLong.new(["--size", GetoptLong::REQUIRED_ARGUMENT]) - opts.terminated?.should == false + opts.should_not.terminated? opts.get.should == ["--size", "10k"] - opts.terminated?.should == false + opts.should_not.terminated? opts.get.should == nil - opts.terminated?.should == true + opts.should.terminated? end end end diff --git a/spec/ruby/library/io-wait/wait_readable_spec.rb b/spec/ruby/library/io-wait/wait_readable_spec.rb new file mode 100644 index 0000000000..d7473f029f --- /dev/null +++ b/spec/ruby/library/io-wait/wait_readable_spec.rb @@ -0,0 +1,42 @@ +require_relative '../../spec_helper' + +describe "IO#wait_readable" do + before :each do + @io = File.new(__FILE__ ) + end + + after :each do + @io.close + end + + it "waits for the IO to become readable with no timeout" do + @io.wait_readable.should == @io + end + + it "waits for the IO to become readable with the given timeout" do + @io.wait_readable(1).should == @io + end + + it "waits for the IO to become readable with the given large timeout" do + @io.wait_readable(365 * 24 * 60 * 60).should == @io + end + + it "can be interrupted" do + rd, wr = IO.pipe + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + t = Thread.new do + rd.wait_readable(10) + end + + Thread.pass until t.stop? + t.kill + t.join + + finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) + (finish - start).should < 9 + ensure + rd.close + wr.close + end +end diff --git a/spec/ruby/library/io-wait/wait_spec.rb b/spec/ruby/library/io-wait/wait_spec.rb new file mode 100644 index 0000000000..1d784e7aa4 --- /dev/null +++ b/spec/ruby/library/io-wait/wait_spec.rb @@ -0,0 +1,162 @@ +require_relative '../../spec_helper' +require_relative '../../fixtures/io' + +describe "IO#wait" do + before :each do + @io = File.new(__FILE__ ) + + if /mswin|mingw/ =~ RUBY_PLATFORM + require 'socket' + @r, @w = Socket.pair(Socket::AF_INET, Socket::SOCK_STREAM, 0) + else + @r, @w = IO.pipe + end + end + + after :each do + @io.close unless @io.closed? + + @r.close unless @r.closed? + @w.close unless @w.closed? + end + + context "[events, timeout] passed" do + it "returns events mask when the READABLE event is ready during the timeout" do + @w.write('data to read') + @r.wait(IO::READABLE, 2).should == IO::READABLE + end + + it "returns events mask when the WRITABLE event is ready during the timeout" do + @w.wait(IO::WRITABLE, 0).should == IO::WRITABLE + end + + it "waits for the READABLE event to be ready" do + @r.wait(IO::READABLE, 0).should == nil + + @w.write('data to read') + @r.wait(IO::READABLE, 0).should_not == nil + end + + it "waits for the WRITABLE event to be ready" do + written_bytes = IOSpec.exhaust_write_buffer(@w) + @w.wait(IO::WRITABLE, 0).should == nil + + @r.read(written_bytes) + @w.wait(IO::WRITABLE, 0).should_not == nil + end + + it "returns nil when the READABLE event is not ready during the timeout" do + @w.wait(IO::READABLE, 0).should == nil + end + + it "returns nil when the WRITABLE event is not ready during the timeout" do + IOSpec.exhaust_write_buffer(@w) + @w.wait(IO::WRITABLE, 0).should == nil + end + + it "raises IOError when io is closed (closed stream (IOError))" do + @io.close + -> { @io.wait(IO::READABLE, 0) }.should.raise(IOError, "closed stream") + end + + it "raises ArgumentError when events is not positive" do + -> { @w.wait(0, 0) }.should.raise(ArgumentError, "Events must be positive integer!") + -> { @w.wait(-1, 0) }.should.raise(ArgumentError, "Events must be positive integer!") + end + + it "changes thread status to 'sleep' when waits for READABLE event" do + t = Thread.new { @r.wait(IO::READABLE, 10) } + sleep 1 + t.status.should == 'sleep' + t.kill + t.join # Thread#kill doesn't wait for the thread to end + end + + # https://github.com/ruby/ruby/actions/runs/11948300522/job/33305664284?pr=12139 + platform_is_not :windows do + it "changes thread status to 'sleep' when waits for WRITABLE event" do + IOSpec.exhaust_write_buffer(@w) + + t = Thread.new { @w.wait(IO::WRITABLE, 10) } + sleep 1 + t.status.should == 'sleep' + t.kill + t.join # Thread#kill doesn't wait for the thread to end + end + end + + it "can be interrupted when waiting for READABLE event" do + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + t = Thread.new do + @r.wait(IO::READABLE, 10) + end + + Thread.pass until t.stop? + t.kill + t.join # Thread#kill doesn't wait for the thread to end + + finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) + (finish - start).should < 9 + end + + it "can be interrupted when waiting for WRITABLE event" do + IOSpec.exhaust_write_buffer(@w) + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + t = Thread.new do + @w.wait(IO::WRITABLE, 10) + end + + Thread.pass until t.stop? + t.kill + t.join # Thread#kill doesn't wait for the thread to end + + finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) + (finish - start).should < 9 + end + end + + context "[timeout, mode] passed" do + it "accepts :r, :read, :readable mode to check READABLE event" do + @io.wait(0, :r).should == @io + @io.wait(0, :read).should == @io + @io.wait(0, :readable).should == @io + end + + it "accepts :w, :write, :writable mode to check WRITABLE event" do + @io.wait(0, :w).should == @io + @io.wait(0, :write).should == @io + @io.wait(0, :writable).should == @io + end + + it "accepts :rw, :read_write, :readable_writable mode to check READABLE and WRITABLE events" do + @io.wait(0, :rw).should == @io + @io.wait(0, :read_write).should == @io + @io.wait(0, :readable_writable).should == @io + end + + it "accepts a list of modes" do + @io.wait(0, :r, :w, :rw).should == @io + end + + it "accepts timeout and mode in any order" do + @io.wait(0, :r).should == @io + @io.wait(:r, 0).should == @io + @io.wait(:r, 0, :w).should == @io + end + + it "raises ArgumentError when passed wrong Symbol value as mode argument" do + -> { @io.wait(0, :wrong) }.should.raise(ArgumentError, "unsupported mode: wrong") + end + + it "raises ArgumentError when several Integer arguments passed" do + -> { @w.wait(0, 10, :r) }.should.raise(ArgumentError, "timeout given more than once") + end + + it "raises IOError when io is closed (closed stream (IOError))" do + @io.close + -> { @io.wait(0, :r) }.should.raise(IOError, "closed stream") + end + end +end diff --git a/spec/ruby/library/io-wait/wait_writable_spec.rb b/spec/ruby/library/io-wait/wait_writable_spec.rb new file mode 100644 index 0000000000..2017817caa --- /dev/null +++ b/spec/ruby/library/io-wait/wait_writable_spec.rb @@ -0,0 +1,37 @@ +require_relative '../../spec_helper' +require_relative '../../fixtures/io' + +describe "IO#wait_writable" do + it "waits for the IO to become writable with no timeout" do + STDOUT.wait_writable.should == STDOUT + end + + it "waits for the IO to become writable with the given timeout" do + STDOUT.wait_writable(1).should == STDOUT + end + + it "waits for the IO to become writable with the given large timeout" do + # Represents one year and is larger than a 32-bit int + STDOUT.wait_writable(365 * 24 * 60 * 60).should == STDOUT + end + + it "can be interrupted" do + rd, wr = IO.pipe + IOSpec.exhaust_write_buffer(wr) + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + t = Thread.new do + wr.wait_writable(10) + end + + Thread.pass until t.stop? + t.kill + t.join + + finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) + (finish - start).should < 9 + ensure + rd.close unless rd.closed? + wr.close unless wr.closed? + end +end diff --git a/spec/ruby/library/ipaddr/ipv4_conversion_spec.rb b/spec/ruby/library/ipaddr/ipv4_conversion_spec.rb index 9d45055d76..1128c16dd2 100644 --- a/spec/ruby/library/ipaddr/ipv4_conversion_spec.rb +++ b/spec/ruby/library/ipaddr/ipv4_conversion_spec.rb @@ -8,11 +8,11 @@ describe "IPAddr#ipv4_compat" do a.to_s.should == "::192.168.1.2" a.to_string.should == "0000:0000:0000:0000:0000:0000:c0a8:0102" a.family.should == Socket::AF_INET6 - a.ipv4_compat?.should == true + a.should.ipv4_compat? b = a.native b.to_s.should == "192.168.1.2" b.family.should == Socket::AF_INET - b.ipv4_compat?.should == false + b.should_not.ipv4_compat? a = IPAddr.new("192.168.1.2") b = a.ipv4_compat @@ -29,11 +29,11 @@ describe "IPAddr#ipv4_mapped" do a.to_s.should == "::ffff:192.168.1.2" a.to_string.should == "0000:0000:0000:0000:0000:ffff:c0a8:0102" a.family.should == Socket::AF_INET6 - a.ipv4_mapped?.should == true + a.should.ipv4_mapped? b = a.native b.to_s.should == "192.168.1.2" b.family.should == Socket::AF_INET - b.ipv4_mapped?.should == false + b.should_not.ipv4_mapped? a = IPAddr.new("192.168.1.2") b = a.ipv4_mapped diff --git a/spec/ruby/library/ipaddr/new_spec.rb b/spec/ruby/library/ipaddr/new_spec.rb index 77165d2857..7fba2b372e 100644 --- a/spec/ruby/library/ipaddr/new_spec.rb +++ b/spec/ruby/library/ipaddr/new_spec.rb @@ -3,9 +3,9 @@ require 'ipaddr' describe "IPAddr#new" do it "initializes IPAddr" do - lambda{ IPAddr.new("3FFE:505:ffff::/48") }.should_not raise_error - lambda{ IPAddr.new("0:0:0:1::") }.should_not raise_error - lambda{ IPAddr.new("2001:200:300::/48") }.should_not raise_error + ->{ IPAddr.new("3FFE:505:ffff::/48") }.should_not.raise + ->{ IPAddr.new("0:0:0:1::") }.should_not.raise + ->{ IPAddr.new("2001:200:300::/48") }.should_not.raise end it "initializes IPAddr ipv6 address with short notation" do @@ -27,8 +27,8 @@ describe "IPAddr#new" do a.to_s.should == "3ffe:505:2::" a.to_string.should == "3ffe:0505:0002:0000:0000:0000:0000:0000" a.family.should == Socket::AF_INET6 - a.ipv4?.should == false - a.ipv6?.should == true + a.should_not.ipv4? + a.should.ipv6? a.inspect.should == "#<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000>" end @@ -51,8 +51,8 @@ describe "IPAddr#new" do a.to_s.should == "192.168.1.2" a.to_string.should == "192.168.1.2" a.family.should == Socket::AF_INET - a.ipv4?.should == true - a.ipv6?.should == false + a.should.ipv4? + a.should_not.ipv6? end it "initializes IPAddr ipv4 address with / subnet notation" do @@ -79,15 +79,14 @@ describe "IPAddr#new" do it "raises on incorrect IPAddr strings" do [ - ["fe80::1%fxp0"], ["::1/255.255.255.0"], [IPAddr.new("::1").to_i], ["::ffff:192.168.1.2/120", Socket::AF_INET], ["[192.168.1.2]/120"], ].each { |args| - lambda{ + ->{ IPAddr.new(*args) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) } end end diff --git a/spec/ruby/library/ipaddr/operator_spec.rb b/spec/ruby/library/ipaddr/operator_spec.rb index fe94a39ae1..3337d22300 100644 --- a/spec/ruby/library/ipaddr/operator_spec.rb +++ b/spec/ruby/library/ipaddr/operator_spec.rb @@ -2,14 +2,11 @@ require_relative '../../spec_helper' require 'ipaddr' describe "IPAddr Operator" do - IN6MASK32 = "ffff:ffff::" - IN6MASK128 = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" - before do @in6_addr_any = IPAddr.new() @a = IPAddr.new("3ffe:505:2::/48") @b = IPAddr.new("0:0:0:1::") - @c = IPAddr.new(IN6MASK32) + @c = IPAddr.new("ffff:ffff::") end it "bitwises or" do @@ -48,7 +45,7 @@ describe "IPAddr Operator" do it "inverts" do a = ~@in6_addr_any - a.to_s.should == IN6MASK128 + a.to_s.should == "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" @in6_addr_any.to_s.should == "::" end @@ -57,11 +54,9 @@ describe "IPAddr Operator" do @a.should_not == IPAddr.new("3ffe:505:3::") end - ruby_version_is '2.4' do - # https://bugs.ruby-lang.org/issues/12799 - it "tests for equality correctly if object cannot be converted to IPAddr" do - IPAddr.new("1.1.1.1").should_not == "sometext" - end + # https://bugs.ruby-lang.org/issues/12799 + it "tests for equality correctly if object cannot be converted to IPAddr" do + IPAddr.new("1.1.1.1").should_not == "sometext" end it "sets a mask" do @@ -71,17 +66,17 @@ describe "IPAddr Operator" do end it "checks whether an address is included in a range" do - @a.should include(IPAddr.new("3ffe:505:2::")) - @a.should include(IPAddr.new("3ffe:505:2::1")) - @a.should_not include(IPAddr.new("3ffe:505:3::")) + @a.should.include?(IPAddr.new("3ffe:505:2::")) + @a.should.include?(IPAddr.new("3ffe:505:2::1")) + @a.should_not.include?(IPAddr.new("3ffe:505:3::")) net1 = IPAddr.new("192.168.2.0/24") - net1.should include(IPAddr.new("192.168.2.0")) - net1.should include(IPAddr.new("192.168.2.255")) - net1.should_not include(IPAddr.new("192.168.3.0")) + net1.should.include?(IPAddr.new("192.168.2.0")) + net1.should.include?(IPAddr.new("192.168.2.255")) + net1.should_not.include?(IPAddr.new("192.168.3.0")) # test with integer parameter int = (192 << 24) + (168 << 16) + (2 << 8) + 13 - net1.should include(int) - net1.should_not include(int+255) + net1.should.include?(int) + net1.should_not.include?(int+255) end end diff --git a/spec/ruby/library/ipaddr/reverse_spec.rb b/spec/ruby/library/ipaddr/reverse_spec.rb index db39b6c7a0..9bda60ca70 100644 --- a/spec/ruby/library/ipaddr/reverse_spec.rb +++ b/spec/ruby/library/ipaddr/reverse_spec.rb @@ -11,17 +11,17 @@ end describe "IPAddr#ip6_arpa" do it "converts an IPv6 address into the reverse DNS lookup representation according to RFC3172" do IPAddr.new("3ffe:505:2::f").ip6_arpa.should == "f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa" - lambda{ + ->{ IPAddr.new("192.168.2.1").ip6_arpa - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end describe "IPAddr#ip6_int" do it "converts an IPv6 address into the reverse DNS lookup representation according to RFC1886" do IPAddr.new("3ffe:505:2::f").ip6_int.should == "f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.int" - lambda{ + ->{ IPAddr.new("192.168.2.1").ip6_int - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/irb/fixtures/irb.rb b/spec/ruby/library/irb/fixtures/irb.rb new file mode 100644 index 0000000000..8d386dfda1 --- /dev/null +++ b/spec/ruby/library/irb/fixtures/irb.rb @@ -0,0 +1,3 @@ +a = 10 + +binding.irb # rubocop:disable Lint/Debugger diff --git a/spec/ruby/library/irb/irb_spec.rb b/spec/ruby/library/irb/irb_spec.rb new file mode 100644 index 0000000000..2607c7ef33 --- /dev/null +++ b/spec/ruby/library/irb/irb_spec.rb @@ -0,0 +1,19 @@ +require_relative '../../spec_helper' +require 'tmpdir' + +describe "Binding#irb" do + it "creates an IRB session with the binding in scope" do + irb_fixture = fixture __FILE__, "irb.rb" + envs = %w[IRBRC HOME XDG_CONFIG_HOME].to_h {|e| [e, nil]} + + out = Dir.mktmpdir do |dir| + IO.popen([envs, *ruby_exe, irb_fixture, chdir: dir], "r+") do |pipe| + pipe.puts "a ** 2" + pipe.puts "exit" + pipe.readlines.map(&:chomp).reject(&:empty?) + end + end + + out.last(3).should == ["a ** 2", "100", "exit"] + end +end diff --git a/spec/ruby/library/logger/device/close_spec.rb b/spec/ruby/library/logger/device/close_spec.rb index 3d7ab134e0..1db5d582a7 100644 --- a/spec/ruby/library/logger/device/close_spec.rb +++ b/spec/ruby/library/logger/device/close_spec.rb @@ -17,6 +17,6 @@ describe "Logger::LogDevice#close" do it "closes the LogDevice's stream" do @device.close - lambda { @device.write("Test") }.should complain(/\Alog writing failed\./) + -> { @device.write("Test") }.should complain(/\Alog shifting failed\./) end end diff --git a/spec/ruby/library/logger/device/new_spec.rb b/spec/ruby/library/logger/device/new_spec.rb index a66c364392..c943e7fbe2 100644 --- a/spec/ruby/library/logger/device/new_spec.rb +++ b/spec/ruby/library/logger/device/new_spec.rb @@ -14,11 +14,11 @@ describe "Logger::LogDevice#new" do it "creates a new log device" do l = Logger::LogDevice.new(@log_file) - l.dev.should be_kind_of(File) + l.dev.should.is_a?(File) end it "receives an IO object to log there as first argument" do - @log_file.should be_kind_of(IO) + @log_file.should.is_a?(IO) l = Logger::LogDevice.new(@log_file) l.write("foo") @log_file.rewind @@ -31,17 +31,17 @@ describe "Logger::LogDevice#new" do l.write("Test message") l.close - File.exist?(path).should be_true + File.should.exist?(path) File.open(path) do |f| - f.readlines.should_not be_empty + f.readlines.should_not.empty? end rm_r path end it "receives options via a hash as second argument" do - lambda { Logger::LogDevice.new(STDERR, - { shift_age: 8, shift_size: 10 - })}.should_not raise_error + -> { + Logger::LogDevice.new(STDERR, shift_age: 8, shift_size: 10) + }.should_not.raise end end diff --git a/spec/ruby/library/logger/device/write_spec.rb b/spec/ruby/library/logger/device/write_spec.rb index 6305a623e3..87ecf2ad6a 100644 --- a/spec/ruby/library/logger/device/write_spec.rb +++ b/spec/ruby/library/logger/device/write_spec.rb @@ -37,6 +37,6 @@ describe "Logger::LogDevice#write" do it "fails if the device is already closed" do @device.close - lambda { @device.write "foo" }.should complain(/\Alog writing failed\./) + -> { @device.write "foo" }.should complain(/\Alog shifting failed\./) end end diff --git a/spec/ruby/library/logger/logger/add_spec.rb b/spec/ruby/library/logger/logger/add_spec.rb index 85a3b5ae3c..98ac88f64f 100644 --- a/spec/ruby/library/logger/logger/add_spec.rb +++ b/spec/ruby/library/logger/logger/add_spec.rb @@ -52,30 +52,30 @@ describe "Logger#add" do end it "receives a block" do - lambda { + -> { @logger.log(nil, "test", "TestApp") do 1+1 end - }.should_not raise_error + }.should_not.raise end it "calls the block if message is nil" do temp = 0 - lambda { + -> { @logger.log(nil, nil, "TestApp") do temp = 1+1 end - }.should_not raise_error + }.should_not.raise temp.should == 2 end it "ignores the block if the message is not nil" do temp = 0 - lambda { + -> { @logger.log(nil, "not nil", "TestApp") do temp = 1+1 end - }.should_not raise_error + }.should_not.raise temp.should == 0 end end diff --git a/spec/ruby/library/logger/logger/close_spec.rb b/spec/ruby/library/logger/logger/close_spec.rb index 45da2fa770..81aac2a6cd 100644 --- a/spec/ruby/library/logger/logger/close_spec.rb +++ b/spec/ruby/library/logger/logger/close_spec.rb @@ -15,6 +15,6 @@ describe "Logger#close" do it "closes the logging device" do @logger.close - lambda { @logger.add(nil, "Foo") }.should complain(/\Alog writing failed\./) + -> { @logger.add(nil, "Foo") }.should complain(/\Alog writing failed\./) end end diff --git a/spec/ruby/library/logger/logger/datetime_format_spec.rb b/spec/ruby/library/logger/logger/datetime_format_spec.rb index 39fd29bd3f..75a7f6cc03 100644 --- a/spec/ruby/library/logger/logger/datetime_format_spec.rb +++ b/spec/ruby/library/logger/logger/datetime_format_spec.rb @@ -49,7 +49,7 @@ describe "Logger#datetime_format=" do end it "follows the Time#strftime format" do - lambda { @logger.datetime_format = "%Y-%m" }.should_not raise_error + -> { @logger.datetime_format = "%Y-%m" }.should_not.raise regex = /\d{4}-\d{2}-\d{2}oo-\w+ar/ @logger.datetime_format = "%Foo-%Bar" diff --git a/spec/ruby/library/logger/logger/debug_spec.rb b/spec/ruby/library/logger/logger/debug_spec.rb index d92c339232..9375ab0cc6 100644 --- a/spec/ruby/library/logger/logger/debug_spec.rb +++ b/spec/ruby/library/logger/logger/debug_spec.rb @@ -16,12 +16,12 @@ describe "Logger#debug?" do it "returns true if severity level allows debug messages" do @logger.level = Logger::DEBUG - @logger.debug?.should == true + @logger.should.debug? end it "returns false if severity level does not allow debug messages" do @logger.level = Logger::WARN - @logger.debug?.should == false + @logger.should_not.debug? end end diff --git a/spec/ruby/library/logger/logger/error_spec.rb b/spec/ruby/library/logger/logger/error_spec.rb index d5d0bd2d2f..42f1dbd883 100644 --- a/spec/ruby/library/logger/logger/error_spec.rb +++ b/spec/ruby/library/logger/logger/error_spec.rb @@ -16,12 +16,12 @@ describe "Logger#error?" do it "returns true if severity level allows printing errors" do @logger.level = Logger::INFO - @logger.error?.should == true + @logger.should.error? end it "returns false if severity level does not allow errors" do @logger.level = Logger::FATAL - @logger.error?.should == false + @logger.should_not.error? end end diff --git a/spec/ruby/library/logger/logger/fatal_spec.rb b/spec/ruby/library/logger/logger/fatal_spec.rb index 42d4341319..f12fa3a89f 100644 --- a/spec/ruby/library/logger/logger/fatal_spec.rb +++ b/spec/ruby/library/logger/logger/fatal_spec.rb @@ -16,12 +16,12 @@ describe "Logger#fatal?" do it "returns true if severity level allows fatal messages" do @logger.level = Logger::FATAL - @logger.fatal?.should == true + @logger.should.fatal? end it "returns false if severity level does not allow fatal messages" do @logger.level = Logger::UNKNOWN - @logger.fatal?.should == false + @logger.should_not.fatal? end end diff --git a/spec/ruby/library/logger/logger/info_spec.rb b/spec/ruby/library/logger/logger/info_spec.rb index 21eacbbb31..eb5dca48dd 100644 --- a/spec/ruby/library/logger/logger/info_spec.rb +++ b/spec/ruby/library/logger/logger/info_spec.rb @@ -16,12 +16,12 @@ describe "Logger#info?" do it "returns true if severity level allows info messages" do @logger.level = Logger::INFO - @logger.info?.should == true + @logger.should.info? end it "returns false if severity level does not allow info messages" do @logger.level = Logger::FATAL - @logger.info?.should == false + @logger.should_not.info? end end diff --git a/spec/ruby/library/logger/logger/new_spec.rb b/spec/ruby/library/logger/logger/new_spec.rb index cf965ac03b..b311c96132 100644 --- a/spec/ruby/library/logger/logger/new_spec.rb +++ b/spec/ruby/library/logger/logger/new_spec.rb @@ -13,31 +13,31 @@ describe "Logger#new" do rm_r @file_path end - it "creates a new logger object" do - l = Logger.new(STDERR) - lambda { l.add(Logger::WARN, "Foo") }.should output_to_fd(/Foo/, STDERR) - end + it "creates a new logger object" do + l = Logger.new(STDERR) + -> { l.add(Logger::WARN, "Foo") }.should output_to_fd(/Foo/, STDERR) + end - it "receives a logging device as first argument" do - l = Logger.new(@log_file) - l.add(Logger::WARN, "Test message") + it "receives a logging device as first argument" do + l = Logger.new(@log_file) + l.add(Logger::WARN, "Test message") - @log_file.rewind - LoggerSpecs.strip_date(@log_file.readline).should == "WARN -- : Test message\n" - l.close - end + @log_file.rewind + LoggerSpecs.strip_date(@log_file.readline).should == "WARN -- : Test message\n" + l.close + end it "receives a frequency rotation as second argument" do - lambda { Logger.new(@log_file, "daily") }.should_not raise_error - lambda { Logger.new(@log_file, "weekly") }.should_not raise_error - lambda { Logger.new(@log_file, "monthly") }.should_not raise_error + -> { Logger.new(@log_file, "daily") }.should_not.raise + -> { Logger.new(@log_file, "weekly") }.should_not.raise + -> { Logger.new(@log_file, "monthly") }.should_not.raise end it "also receives a number of log files to keep as second argument" do - lambda { Logger.new(@log_file, 1).close }.should_not raise_error + -> { Logger.new(@log_file, 1).close }.should_not.raise end - it "receivs a maximum logfile size as third argument" do + it "receives a maximum logfile size as third argument" do # This should create 2 small log files, logfile_test and logfile_test.0 # in /tmp, each one with a different message. path = tmp("logfile_test.log") @@ -46,8 +46,8 @@ describe "Logger#new" do l.add Logger::WARN, "foo" l.add Logger::WARN, "bar" - File.exist?(path).should be_true - File.exist?(path + ".0").should be_true + File.should.exist?(path) + File.should.exist?(path + ".0") # first line will be a comment so we'll have to skip it. f = File.open(path) @@ -61,60 +61,58 @@ describe "Logger#new" do rm_r path, "#{path}.0" end - ruby_version_is "2.4" do - it "receives level symbol as keyword argument" do - logger = Logger.new(STDERR, level: :info) - logger.level.should == Logger::INFO - end + it "receives level symbol as keyword argument" do + logger = Logger.new(STDERR, level: :info) + logger.level.should == Logger::INFO + end - it "receives level as keyword argument" do - logger = Logger.new(STDERR, level: Logger::INFO) - logger.level.should == Logger::INFO - end + it "receives level as keyword argument" do + logger = Logger.new(STDERR, level: Logger::INFO) + logger.level.should == Logger::INFO + end - it "receives progname as keyword argument" do - progname = "progname" + it "receives progname as keyword argument" do + progname = "progname" - logger = Logger.new(STDERR, progname: progname) - logger.progname.should == progname - end + logger = Logger.new(STDERR, progname: progname) + logger.progname.should == progname + end - it "receives datetime_format as keyword argument" do - datetime_format = "%H:%M:%S" + it "receives datetime_format as keyword argument" do + datetime_format = "%H:%M:%S" - logger = Logger.new(STDERR, datetime_format: datetime_format) - logger.datetime_format.should == datetime_format - end + logger = Logger.new(STDERR, datetime_format: datetime_format) + logger.datetime_format.should == datetime_format + end - it "receives formatter as keyword argument" do - formatter = Class.new do - def call(_severity, _time, _progname, _msg); end - end.new + it "receives formatter as keyword argument" do + formatter = Class.new do + def call(_severity, _time, _progname, _msg); end + end.new - logger = Logger.new(STDERR, formatter: formatter) - logger.formatter.should == formatter - end + logger = Logger.new(STDERR, formatter: formatter) + logger.formatter.should == formatter + end - it "receives shift_period_suffix " do - shift_period_suffix = "%Y-%m-%d" - path = tmp("shift_period_suffix_test.log") - now = Time.now - tomorrow = Time.at(now.to_i + 60 * 60 * 24) - logger = Logger.new(path, 'daily', shift_period_suffix: shift_period_suffix) + it "receives shift_period_suffix" do + shift_period_suffix = "%Y-%m-%d" + path = tmp("shift_period_suffix_test.log") + now = Time.now + tomorrow = Time.at(now.to_i + 60 * 60 * 24) + logger = Logger.new(path, 'daily', shift_period_suffix: shift_period_suffix) - logger.add Logger::INFO, 'message' + logger.add Logger::INFO, 'message' - Time.stub!(:now).and_return(tomorrow) - logger.add Logger::INFO, 'second message' + Time.stub!(:now).and_return(tomorrow) + logger.add Logger::INFO, 'second message' - shifted_path = "#{path}.#{now.strftime(shift_period_suffix)}" + shifted_path = "#{path}.#{now.strftime(shift_period_suffix)}" - File.exist?(shifted_path).should == true + File.should.exist?(shifted_path) - logger.close + logger.close - rm_r path, shifted_path - end + rm_r path, shifted_path end end diff --git a/spec/ruby/library/logger/logger/unknown_spec.rb b/spec/ruby/library/logger/logger/unknown_spec.rb index 4a042f9215..4d37c9797e 100644 --- a/spec/ruby/library/logger/logger/unknown_spec.rb +++ b/spec/ruby/library/logger/logger/unknown_spec.rb @@ -29,7 +29,7 @@ describe "Logger#unknown" do end it "receives empty messages" do - lambda { @logger.unknown("") }.should_not raise_error + -> { @logger.unknown("") }.should_not.raise @log_file.rewind LoggerSpecs.strip_date(@log_file.readlines.first).should == "ANY -- : \n" end diff --git a/spec/ruby/library/logger/logger/warn_spec.rb b/spec/ruby/library/logger/logger/warn_spec.rb index 6617b2b41a..0bca34824a 100644 --- a/spec/ruby/library/logger/logger/warn_spec.rb +++ b/spec/ruby/library/logger/logger/warn_spec.rb @@ -16,12 +16,12 @@ describe "Logger#warn?" do it "returns true if severity level allows printing warn messages" do @logger.level = Logger::WARN - @logger.warn?.should == true + @logger.should.warn? end it "returns false if severity level does not allow printing warn messages" do @logger.level = Logger::FATAL - @logger.warn?.should == false + @logger.should_not.warn? end end diff --git a/spec/ruby/library/mathn/bignum/exponent_spec.rb b/spec/ruby/library/mathn/bignum/exponent_spec.rb deleted file mode 100644 index ddd19ffdb4..0000000000 --- a/spec/ruby/library/mathn/bignum/exponent_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Bignum#**" do - before :each do - @bignum = bignum_value(47) - end - - it "returns self raised to other (positive) power" do - (@bignum ** 4).should == 7237005577332262361485077344629993318496048279512298547155833600056910050625 - (@bignum ** 1.2).should be_close(57262152889751597425762.57804, TOLERANCE) - end - - it "returns a complex number when negative and raised to a fractional power" do - ((-@bignum) ** (1/3)).should be_close(Complex(1048576,1816186.907597341), TOLERANCE) - ((-@bignum) ** (1.0/3)).should be_close(Complex(1048576,1816186.907597341), TOLERANCE) - end - end -end diff --git a/spec/ruby/library/mathn/complex/Complex_spec.rb b/spec/ruby/library/mathn/complex/Complex_spec.rb deleted file mode 100644 index 105902ed5d..0000000000 --- a/spec/ruby/library/mathn/complex/Complex_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Kernel#Complex" do - it "returns an Integer if imaginary part is 0" do - Complex(42,0).should == 42 - Complex(42,0).should be_kind_of(Fixnum) - Complex(bignum_value,0).should == bignum_value - Complex(bignum_value,0).should be_kind_of(Bignum) - end - end -end diff --git a/spec/ruby/library/mathn/fixnum/exponent_spec.rb b/spec/ruby/library/mathn/fixnum/exponent_spec.rb deleted file mode 100644 index 160bf7f115..0000000000 --- a/spec/ruby/library/mathn/fixnum/exponent_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Fixnum#**" do - it "returns self raised to other (positive) power" do - (2 ** 4).should == 16 - (2 ** 1.2).should be_close(2.2973967, TOLERANCE) - end - - it "returns a complex number when negative and raised to a fractional power" do - ((-8) ** (1/3)).should be_close(Complex(1, 1.73205), TOLERANCE) - ((-8) ** (1.0/3)).should be_close(Complex(1, 1.73205), TOLERANCE) - end - end -end diff --git a/spec/ruby/library/mathn/float/exponent_spec.rb b/spec/ruby/library/mathn/float/exponent_spec.rb deleted file mode 100644 index 312119db00..0000000000 --- a/spec/ruby/library/mathn/float/exponent_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Float#**" do - it "returns self raised to other (positive) power" do - (2.0 ** 4).should == 16.0 - (2.0 ** 1.2).should be_close(2.2973967, TOLERANCE) - end - - it "returns a complex number when negative and raised to a fractional power" do - ((-8.0) ** (1/3)).should be_close(Complex(1, 1.73205), TOLERANCE) - ((-8.0) ** (1.0/3)).should be_close(Complex(1, 1.73205), TOLERANCE) - end - end -end diff --git a/spec/ruby/library/mathn/integer/from_prime_division_spec.rb b/spec/ruby/library/mathn/integer/from_prime_division_spec.rb deleted file mode 100644 index df2db6d8c1..0000000000 --- a/spec/ruby/library/mathn/integer/from_prime_division_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Integer.from_prime_division" do - it "reverses a prime factorization of an integer" do - Integer.from_prime_division([[2, 1], [3, 2], [7, 1]]).should == 126 - end - end -end diff --git a/spec/ruby/library/mathn/integer/prime_division_spec.rb b/spec/ruby/library/mathn/integer/prime_division_spec.rb deleted file mode 100644 index e2141490f0..0000000000 --- a/spec/ruby/library/mathn/integer/prime_division_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Integer#prime_division" do - it "performs a prime factorization of a positive integer" do - 100.prime_division.should == [[2, 2], [5, 2]] - end - - # Proper handling of negative integers has been added to MRI trunk - # in revision 24091. Prior to that, all versions of MRI returned nonsense. - it "performs a prime factorization of a negative integer" do - -26.prime_division.should == [[-1, 1], [2, 1], [13, 1]] - end - - it "raises a ZeroDivisionError when is called on zero" do - lambda { 0.prime_division }.should raise_error(ZeroDivisionError) - end - end -end diff --git a/spec/ruby/library/mathn/math/fixtures/classes.rb b/spec/ruby/library/mathn/math/fixtures/classes.rb deleted file mode 100644 index 024732fa7a..0000000000 --- a/spec/ruby/library/mathn/math/fixtures/classes.rb +++ /dev/null @@ -1,3 +0,0 @@ -class IncludesMath - include Math -end diff --git a/spec/ruby/library/mathn/math/rsqrt_spec.rb b/spec/ruby/library/mathn/math/rsqrt_spec.rb deleted file mode 100644 index 6cb7595afe..0000000000 --- a/spec/ruby/library/mathn/math/rsqrt_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require_relative 'shared/rsqrt' - - describe "Math#rsqrt" do - it_behaves_like :mathn_math_rsqrt, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:rsqrt) - end - end - - describe "Math.rsqrt" do - it_behaves_like :mathn_math_rsqrt, :_, Math - end -end diff --git a/spec/ruby/library/mathn/math/shared/rsqrt.rb b/spec/ruby/library/mathn/math/shared/rsqrt.rb deleted file mode 100644 index 0f623a7d4f..0000000000 --- a/spec/ruby/library/mathn/math/shared/rsqrt.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'mathn' -require_relative '../fixtures/classes' - -describe :mathn_math_rsqrt, shared: true do - it "returns the square root for Rational numbers" do - @object.send(:rsqrt, Rational(9, 25)).should == Rational(3, 5) - @object.send(:rsqrt, 16/64).should == Rational(1, 2) - end - - it "returns the square root for positive numbers" do - @object.send(:rsqrt, 1).should == 1 - @object.send(:rsqrt, 4.0).should == 2.0 - @object.send(:rsqrt, 12.34).should == Math.sqrt!(12.34) - end - - it "raises an Math::DomainError if the argument is a negative number" do - lambda { @object.send(:rsqrt, -1) }.should raise_error(Math::DomainError) - lambda { @object.send(:rsqrt, -4.0) }.should raise_error(Math::DomainError) - lambda { @object.send(:rsqrt, -16/64) }.should raise_error(Math::DomainError) - end -end diff --git a/spec/ruby/library/mathn/math/shared/sqrt.rb b/spec/ruby/library/mathn/math/shared/sqrt.rb deleted file mode 100644 index 5e6dae1d4f..0000000000 --- a/spec/ruby/library/mathn/math/shared/sqrt.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'mathn' -require_relative '../fixtures/classes' - -describe :mathn_math_sqrt, shared: true do - it "returns the square root for Rational numbers" do - @object.send(:sqrt, Rational(9, 25)).should == Rational(3, 5) - @object.send(:sqrt, 16/64).should == Rational(1, 2) - end - - it "returns the square root for Complex numbers" do - @object.send(:sqrt, Complex(1, 0)).should == 1 - end - - it "returns the square root for positive numbers" do - @object.send(:sqrt, 1).should == 1 - @object.send(:sqrt, 4.0).should == 2.0 - @object.send(:sqrt, 12.34).should == Math.sqrt!(12.34) - end - - it "returns the square root for negative numbers" do - @object.send(:sqrt, -9).should == Complex(0, 3) - @object.send(:sqrt, -5.29).should == Complex(0, 2.3) - @object.send(:sqrt, -16/64).should == Complex(0, 1/2) - end -end diff --git a/spec/ruby/library/mathn/math/sqrt_spec.rb b/spec/ruby/library/mathn/math/sqrt_spec.rb deleted file mode 100644 index 49cfe3600e..0000000000 --- a/spec/ruby/library/mathn/math/sqrt_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require_relative 'shared/sqrt' - - describe "Math#rsqrt" do - it_behaves_like :mathn_math_sqrt, :_, IncludesMath.new - - it "is a private instance method" do - IncludesMath.should have_private_instance_method(:sqrt) - end - end - - describe "Math.rsqrt" do - it_behaves_like :mathn_math_sqrt, :_, Math - end -end diff --git a/spec/ruby/library/mathn/mathn_spec.rb b/spec/ruby/library/mathn/mathn_spec.rb deleted file mode 100644 index c9e8c05a8d..0000000000 --- a/spec/ruby/library/mathn/mathn_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../spec_helper' - -describe "mathn" do - ruby_version_is "2.5" do - it "is no longer part of the standard library" do - -> { require "mathn" }.should raise_error(LoadError) - end - end -end diff --git a/spec/ruby/library/mathn/rational/Rational_spec.rb b/spec/ruby/library/mathn/rational/Rational_spec.rb deleted file mode 100644 index 9a34c99751..0000000000 --- a/spec/ruby/library/mathn/rational/Rational_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Kernel#Rational" do - it "returns an Integer if denominator divides numerator evenly" do - Rational(42,6).should == 7 - Rational(42,6).should be_kind_of(Fixnum) - Rational(bignum_value,1).should == bignum_value - Rational(bignum_value,1).should be_kind_of(Bignum) - end - end -end diff --git a/spec/ruby/library/mathn/rational/inspect_spec.rb b/spec/ruby/library/mathn/rational/inspect_spec.rb deleted file mode 100644 index cbf67ec0f3..0000000000 --- a/spec/ruby/library/mathn/rational/inspect_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' - -ruby_version_is ''...'2.5' do - require 'mathn' - - describe "Rational#inspect" do - it "returns a string representation of self" do - Rational(3, 4).inspect.should == "(3/4)" - Rational(-5, 8).inspect.should == "(-5/8)" - Rational(-1, -2).inspect.should == "(1/2)" - Rational(0, 2).inspect.should == "0" - Rational(bignum_value, 1).inspect.should == "#{bignum_value}" - end - end -end diff --git a/spec/ruby/library/matrix/antisymmetric_spec.rb b/spec/ruby/library/matrix/antisymmetric_spec.rb index 534fab60ea..b4b8858f32 100644 --- a/spec/ruby/library/matrix/antisymmetric_spec.rb +++ b/spec/ruby/library/matrix/antisymmetric_spec.rb @@ -1,37 +1,36 @@ require_relative '../../spec_helper' + require 'matrix' -ruby_version_is "2.6" do - describe "Matrix#antisymmetric?" do - it "returns true for an antisymmetric Matrix" do - Matrix[[0, -2, Complex(1, 3)], [2, 0, 5], [-Complex(1, 3), -5, 0]].antisymmetric?.should be_true - end +describe "Matrix#antisymmetric?" do + it "returns true for an antisymmetric Matrix" do + Matrix[[0, -2, Complex(1, 3)], [2, 0, 5], [-Complex(1, 3), -5, 0]].antisymmetric?.should == true + end - it "returns true for a 0x0 empty matrix" do - Matrix.empty.antisymmetric?.should be_true - end + it "returns true for a 0x0 empty matrix" do + Matrix.empty.antisymmetric?.should == true + end - it "returns false for non-antisymmetric matrices" do - [ - Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]], - Matrix[[1, -2, 3], [2, 0, 6], [-3, -6, 0]], # wrong diagonal element - Matrix[[0, 2, -3], [2, 0, 6], [-3, 6, 0]] # only signs wrong - ].each do |matrix| - matrix.antisymmetric?.should be_false - end + it "returns false for non-antisymmetric matrices" do + [ + Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]], + Matrix[[1, -2, 3], [2, 0, 6], [-3, -6, 0]], # wrong diagonal element + Matrix[[0, 2, -3], [2, 0, 6], [-3, 6, 0]] # only signs wrong + ].each do |matrix| + matrix.antisymmetric?.should == false end + end - it "raises an error for rectangular matrices" do - [ - Matrix[[0], [0]], - Matrix[[0, 0]], - Matrix.empty(0, 2), - Matrix.empty(2, 0), - ].each do |rectangular_matrix| - lambda { - rectangular_matrix.antisymmetric? - }.should raise_error(Matrix::ErrDimensionMismatch) - end + it "raises an error for rectangular matrices" do + [ + Matrix[[0], [0]], + Matrix[[0, 0]], + Matrix.empty(0, 2), + Matrix.empty(2, 0), + ].each do |rectangular_matrix| + -> { + rectangular_matrix.antisymmetric? + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/build_spec.rb b/spec/ruby/library/matrix/build_spec.rb index 6819b9b617..49eb2e69a5 100644 --- a/spec/ruby/library/matrix/build_spec.rb +++ b/spec/ruby/library/matrix/build_spec.rb @@ -6,7 +6,7 @@ describe "Matrix.build" do it "returns a Matrix object of the given size" do m = Matrix.build(3, 4){1} - m.should be_an_instance_of(Matrix) + m.should.instance_of?(Matrix) m.row_size.should == 3 m.column_size.should == 4 end @@ -24,32 +24,32 @@ describe "Matrix.build" do it "returns an Enumerator is no block is given" do enum = Matrix.build(2, 1) - enum.should be_an_instance_of(Enumerator) + enum.should.instance_of?(Enumerator) enum.each{1}.should == Matrix[[1], [1]] end it "requires integers as parameters" do - lambda { Matrix.build("1", "2"){1} }.should raise_error(TypeError) - lambda { Matrix.build(nil, nil){1} }.should raise_error(TypeError) - lambda { Matrix.build(1..2){1} }.should raise_error(TypeError) + -> { Matrix.build("1", "2"){1} }.should.raise(TypeError) + -> { Matrix.build(nil, nil){1} }.should.raise(TypeError) + -> { Matrix.build(1..2){1} }.should.raise(TypeError) end it "requires non-negative integers" do - lambda { Matrix.build(-1, 1){1} }.should raise_error(ArgumentError) - lambda { Matrix.build(+1,-1){1} }.should raise_error(ArgumentError) + -> { Matrix.build(-1, 1){1} }.should.raise(ArgumentError) + -> { Matrix.build(+1,-1){1} }.should.raise(ArgumentError) end it "returns empty Matrix if one argument is zero" do m = Matrix.build(0, 3){ raise "Should not yield" } - m.should be_empty + m.should.empty? m.column_size.should == 3 m = Matrix.build(3, 0){ raise "Should not yield" } - m.should be_empty + m.should.empty? m.row_size.should == 3 end @@ -68,6 +68,6 @@ end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.build(3){1}.should be_an_instance_of(MatrixSub) + MatrixSub.build(3){1}.should.instance_of?(MatrixSub) end end diff --git a/spec/ruby/library/matrix/clone_spec.rb b/spec/ruby/library/matrix/clone_spec.rb index 74e5bf157e..51aefc6010 100644 --- a/spec/ruby/library/matrix/clone_spec.rb +++ b/spec/ruby/library/matrix/clone_spec.rb @@ -9,17 +9,17 @@ describe "Matrix#clone" do it "returns a shallow copy of the matrix" do b = @a.clone - @a.should_not equal(b) - b.should be_kind_of(Matrix) + @a.should_not.equal?(b) + b.should.is_a?(Matrix) b.should == @a 0.upto(@a.row_size - 1) do |i| - @a.row(i).should_not equal(b.row(i)) + @a.row(i).should_not.equal?(b.row(i)) end end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.clone.should be_an_instance_of(MatrixSub) + MatrixSub.ins.clone.should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/coerce_spec.rb b/spec/ruby/library/matrix/coerce_spec.rb index b8d5484657..6032dd2f62 100644 --- a/spec/ruby/library/matrix/coerce_spec.rb +++ b/spec/ruby/library/matrix/coerce_spec.rb @@ -2,9 +2,7 @@ require_relative '../../spec_helper' require 'matrix' describe "Matrix#coerce" do - it "needs to be reviewed for spec completeness" - - it "allows the division of fixnum by a Matrix " do + it "allows the division of integer by a Matrix" do (1/Matrix[[0,1],[-1,0]]).should == Matrix[[0,-1],[1,0]] end end diff --git a/spec/ruby/library/matrix/column_spec.rb b/spec/ruby/library/matrix/column_spec.rb index 46cd57f2b3..d5d8c80c1a 100644 --- a/spec/ruby/library/matrix/column_spec.rb +++ b/spec/ruby/library/matrix/column_spec.rb @@ -21,7 +21,7 @@ describe "Matrix#column" do end it "returns self when called with a block" do - @m.column(0) { |x| x }.should equal(@m) + @m.column(0) { |x| x }.should.equal?(@m) end it "returns nil when out of bounds" do @@ -29,7 +29,7 @@ describe "Matrix#column" do end it "never yields when out of bounds" do - lambda { @m.column(3){ raise } }.should_not raise_error - lambda { @m.column(-4){ raise } }.should_not raise_error + -> { @m.column(3){ raise } }.should_not.raise + -> { @m.column(-4){ raise } }.should_not.raise end end diff --git a/spec/ruby/library/matrix/column_vector_spec.rb b/spec/ruby/library/matrix/column_vector_spec.rb index 47e866a8d5..d86c3f9e42 100644 --- a/spec/ruby/library/matrix/column_vector_spec.rb +++ b/spec/ruby/library/matrix/column_vector_spec.rb @@ -6,20 +6,20 @@ describe "Matrix.column_vector" do it "returns a single column Matrix when called with an Array" do m = Matrix.column_vector([4,5,6]) - m.should be_an_instance_of(Matrix) + m.should.instance_of?(Matrix) m.should == Matrix[ [4],[5],[6] ] end it "returns an empty Matrix when called with an empty Array" do m = Matrix.column_vector([]) - m.should be_an_instance_of(Matrix) + m.should.instance_of?(Matrix) m.row_size.should == 0 m.column_size.should == 1 end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.column_vector([4,5,6]).should be_an_instance_of(MatrixSub) + MatrixSub.column_vector([4,5,6]).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/column_vectors_spec.rb b/spec/ruby/library/matrix/column_vectors_spec.rb index b0cb6f914c..7ac6871e7f 100644 --- a/spec/ruby/library/matrix/column_vectors_spec.rb +++ b/spec/ruby/library/matrix/column_vectors_spec.rb @@ -8,11 +8,11 @@ describe "Matrix#column_vectors" do end it "returns an Array" do - Matrix[ [1,2], [3,4] ].column_vectors.should be_an_instance_of(Array) + Matrix[ [1,2], [3,4] ].column_vectors.should.instance_of?(Array) end it "returns an Array of Vectors" do - @vectors.all? {|v| v.should be_an_instance_of(Vector)} + @vectors.all? {|v| v.should.instance_of?(Vector)} end it "returns each column as a Vector" do diff --git a/spec/ruby/library/matrix/columns_spec.rb b/spec/ruby/library/matrix/columns_spec.rb index 3095fdd7af..ac9587899d 100644 --- a/spec/ruby/library/matrix/columns_spec.rb +++ b/spec/ruby/library/matrix/columns_spec.rb @@ -10,7 +10,7 @@ describe "Matrix.columns" do end it "creates a Matrix from argument columns" do - @m.should be_an_instance_of(Matrix) + @m.should.instance_of?(Matrix) @m.column(0).to_a.should == @a @m.column(1).to_a.should == @b end @@ -36,7 +36,7 @@ describe "Matrix.columns" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.columns([[1]]).should be_an_instance_of(MatrixSub) + MatrixSub.columns([[1]]).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/constructor_spec.rb b/spec/ruby/library/matrix/constructor_spec.rb index 2479923fb5..026525f36d 100644 --- a/spec/ruby/library/matrix/constructor_spec.rb +++ b/spec/ruby/library/matrix/constructor_spec.rb @@ -5,10 +5,10 @@ require 'matrix' describe "Matrix.[]" do it "requires arrays as parameters" do - lambda { Matrix[5] }.should raise_error(TypeError) - lambda { Matrix[nil] }.should raise_error(TypeError) - lambda { Matrix[1..2] }.should raise_error(TypeError) - lambda { Matrix[[1, 2], 3] }.should raise_error(TypeError) + -> { Matrix[5] }.should.raise(TypeError) + -> { Matrix[nil] }.should.raise(TypeError) + -> { Matrix[1..2] }.should.raise(TypeError) + -> { Matrix[[1, 2], 3] }.should.raise(TypeError) end it "creates an empty Matrix with no arguments" do @@ -18,15 +18,13 @@ describe "Matrix.[]" do end it "raises for non-rectangular matrices" do - lambda{ Matrix[ [0], [0,1] ] }.should \ - raise_error(Matrix::ErrDimensionMismatch) - lambda{ Matrix[ [0,1], [0,1,2], [0,1] ]}.should \ - raise_error(Matrix::ErrDimensionMismatch) + ->{ Matrix[ [0], [0,1] ] }.should.raise(Matrix::ErrDimensionMismatch) + ->{ Matrix[ [0,1], [0,1,2], [0,1] ]}.should.raise(Matrix::ErrDimensionMismatch) end it "accepts vector arguments" do a = Matrix[Vector[1, 2], Vector[3, 4]] - a.should be_an_instance_of(Matrix) + a.should.instance_of?(Matrix) a.should == Matrix[ [1, 2], [3, 4] ] end @@ -38,7 +36,7 @@ describe "Matrix.[]" do it "returns a Matrix object" do - Matrix[ [1] ].should be_an_instance_of(Matrix) + Matrix[ [1] ].should.instance_of?(Matrix) end it "can create an nxn Matrix" do @@ -59,7 +57,7 @@ describe "Matrix.[]" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub[ [20,30], [40.5, 9] ].should be_an_instance_of(MatrixSub) + MatrixSub[ [20,30], [40.5, 9] ].should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/diagonal_spec.rb b/spec/ruby/library/matrix/diagonal_spec.rb index f066a21c47..ee84ac8c28 100644 --- a/spec/ruby/library/matrix/diagonal_spec.rb +++ b/spec/ruby/library/matrix/diagonal_spec.rb @@ -8,7 +8,7 @@ describe "Matrix.diagonal" do end it "returns an object of type Matrix" do - @m.should be_kind_of(Matrix) + @m.should.is_a?(Matrix) end it "returns a square Matrix of the right size" do @@ -34,27 +34,27 @@ describe "Matrix.diagonal" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.diagonal(1).should be_an_instance_of(MatrixSub) + MatrixSub.diagonal(1).should.instance_of?(MatrixSub) end end end describe "Matrix.diagonal?" do it "returns true for a diagonal Matrix" do - Matrix.diagonal([1, 2, 3]).diagonal?.should be_true + Matrix.diagonal([1, 2, 3]).diagonal?.should == true end it "returns true for a zero square Matrix" do - Matrix.zero(3).diagonal?.should be_true + Matrix.zero(3).diagonal?.should == true end it "returns false for a non diagonal square Matrix" do - Matrix[[0, 1], [0, 0]].diagonal?.should be_false - Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].diagonal?.should be_false + Matrix[[0, 1], [0, 0]].diagonal?.should == false + Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].diagonal?.should == false end it "returns true for an empty 0x0 matrix" do - Matrix.empty(0,0).diagonal?.should be_true + Matrix.empty(0,0).diagonal?.should == true end it "raises an error for rectangular matrices" do @@ -64,9 +64,9 @@ describe "Matrix.diagonal?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.diagonal? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/divide_spec.rb b/spec/ruby/library/matrix/divide_spec.rb index 205bc5d892..711a5189e4 100644 --- a/spec/ruby/library/matrix/divide_spec.rb +++ b/spec/ruby/library/matrix/divide_spec.rb @@ -30,25 +30,25 @@ describe "Matrix#/" do end it "raises a Matrix::ErrDimensionMismatch if the matrices are different sizes" do - lambda { @a / Matrix[ [1] ] }.should raise_error(Matrix::ErrDimensionMismatch) + -> { @a / Matrix[ [1] ] }.should.raise(Matrix::ErrDimensionMismatch) end it "returns an instance of Matrix" do - (@a / @b).should be_kind_of(Matrix) + (@a / @b).should.is_a?(Matrix) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do m = MatrixSub.ins - (m/m).should be_an_instance_of(MatrixSub) - (m/1).should be_an_instance_of(MatrixSub) + (m/m).should.instance_of?(MatrixSub) + (m/1).should.instance_of?(MatrixSub) end end it "raises a TypeError if other is of wrong type" do - lambda { @a / nil }.should raise_error(TypeError) - lambda { @a / "a" }.should raise_error(TypeError) - lambda { @a / [ [1, 2] ] }.should raise_error(TypeError) - lambda { @a / Object.new }.should raise_error(TypeError) + -> { @a / nil }.should.raise(TypeError) + -> { @a / "a" }.should.raise(TypeError) + -> { @a / [ [1, 2] ] }.should.raise(TypeError) + -> { @a / Object.new }.should.raise(TypeError) end end diff --git a/spec/ruby/library/matrix/each_spec.rb b/spec/ruby/library/matrix/each_spec.rb index 214aae1a3a..b4bfd3c76f 100644 --- a/spec/ruby/library/matrix/each_spec.rb +++ b/spec/ruby/library/matrix/each_spec.rb @@ -9,12 +9,12 @@ describe "Matrix#each" do it "returns an Enumerator when called without a block" do enum = @m.each - enum.should be_an_instance_of(Enumerator) + enum.should.instance_of?(Enumerator) enum.to_a.should == @result end it "returns self" do - @m.each{}.should equal(@m) + @m.each{}.should.equal?(@m) end it "yields the elements starting with the those of the first row" do @@ -31,15 +31,15 @@ describe "Matrix#each with an argument" do end it "raises an ArgumentError for unrecognized argument" do - lambda { + -> { @m.each("all"){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.each(nil){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.each(:left){} - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "yields the rights elements when passed :diagonal" do diff --git a/spec/ruby/library/matrix/each_with_index_spec.rb b/spec/ruby/library/matrix/each_with_index_spec.rb index 36a1309292..17e3f3f44c 100644 --- a/spec/ruby/library/matrix/each_with_index_spec.rb +++ b/spec/ruby/library/matrix/each_with_index_spec.rb @@ -16,12 +16,12 @@ describe "Matrix#each_with_index" do it "returns an Enumerator when called without a block" do enum = @m.each_with_index - enum.should be_an_instance_of(Enumerator) + enum.should.instance_of?(Enumerator) enum.to_a.should == @result end it "returns self" do - @m.each_with_index{}.should equal(@m) + @m.each_with_index{}.should.equal?(@m) end it "yields the elements starting with the those of the first row" do @@ -38,15 +38,15 @@ describe "Matrix#each_with_index with an argument" do end it "raises an ArgumentError for unrecognized argument" do - lambda { + -> { @m.each_with_index("all"){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.each_with_index(nil){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.each_with_index(:left){} - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "yields the rights elements when passed :diagonal" do diff --git a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalues_spec.rb b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalues_spec.rb index 8d47bed5e6..7552b7616c 100644 --- a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalues_spec.rb +++ b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalues_spec.rb @@ -8,7 +8,7 @@ describe "Matrix::EigenvalueDecomposition#eigenvalues" do [ Complex(1, -1), Complex(1, 1)] end - it "returns an array of real eigenvalues for a symetric matrix" do + it "returns an array of real eigenvalues for a symmetric matrix" do Matrix[[1, 2], [2, 1]].eigensystem.eigenvalues.sort.map!{|x| x.round(10)}.should == [ -1, 3 ] diff --git a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvector_matrix_spec.rb b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvector_matrix_spec.rb index 38217ca373..09f229ee15 100644 --- a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvector_matrix_spec.rb +++ b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvector_matrix_spec.rb @@ -10,7 +10,7 @@ describe "Matrix::EigenvalueDecomposition#eigenvector_matrix" do [Complex(0, 1), Complex(0, -1)]] end - it "returns an real eigenvector matrix for a symetric matrix" do + it "returns an real eigenvector matrix for a symmetric matrix" do # Fix me: should test for linearity, not for equality Matrix[[1, 2], [2, 1]].eigensystem.eigenvector_matrix.should == diff --git a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvectors_spec.rb b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvectors_spec.rb index 968d02e27c..2b6ce74ea8 100644 --- a/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvectors_spec.rb +++ b/spec/ruby/library/matrix/eigenvalue_decomposition/eigenvectors_spec.rb @@ -11,7 +11,7 @@ describe "Matrix::EigenvalueDecomposition#eigenvectors" do ] end - it "returns an array of real eigenvectors for a symetric matrix" do + it "returns an array of real eigenvectors for a symmetric matrix" do # Fix me: should test for linearity, not for equality Matrix[[1, 2], [2, 1]].eigensystem.eigenvectors.should == diff --git a/spec/ruby/library/matrix/eigenvalue_decomposition/initialize_spec.rb b/spec/ruby/library/matrix/eigenvalue_decomposition/initialize_spec.rb index f8964070d9..cbda82a16a 100644 --- a/spec/ruby/library/matrix/eigenvalue_decomposition/initialize_spec.rb +++ b/spec/ruby/library/matrix/eigenvalue_decomposition/initialize_spec.rb @@ -3,18 +3,18 @@ require 'matrix' describe "Matrix::EigenvalueDecomposition#initialize" do it "raises an error if argument is not a matrix" do - lambda { + -> { Matrix::EigenvalueDecomposition.new([[]]) - }.should raise_error(TypeError) - lambda { + }.should.raise(TypeError) + -> { Matrix::EigenvalueDecomposition.new(42) - }.should raise_error(TypeError) + }.should.raise(TypeError) end it "raises an error if matrix is not square" do - lambda { + -> { Matrix::EigenvalueDecomposition.new(Matrix[[1, 2]]) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end it "never hangs" do diff --git a/spec/ruby/library/matrix/element_reference_spec.rb b/spec/ruby/library/matrix/element_reference_spec.rb index b950d1c391..c6804b3846 100644 --- a/spec/ruby/library/matrix/element_reference_spec.rb +++ b/spec/ruby/library/matrix/element_reference_spec.rb @@ -16,8 +16,8 @@ describe "Matrix#[]" do end it "returns nil for an invalid index pair" do - @m[8,1].should be_nil - @m[1,8].should be_nil + @m[8,1].should == nil + @m[1,8].should == nil end end diff --git a/spec/ruby/library/matrix/empty_spec.rb b/spec/ruby/library/matrix/empty_spec.rb index ce23d926d6..7b0f0af9eb 100644 --- a/spec/ruby/library/matrix/empty_spec.rb +++ b/spec/ruby/library/matrix/empty_spec.rb @@ -4,20 +4,20 @@ require 'matrix' describe "Matrix#empty?" do it "returns true when the Matrix is empty" do - Matrix[ ].empty?.should be_true - Matrix[ [], [], [] ].empty?.should be_true - Matrix[ [], [], [] ].transpose.empty?.should be_true + Matrix[ ].empty?.should == true + Matrix[ [], [], [] ].empty?.should == true + Matrix[ [], [], [] ].transpose.empty?.should == true end it "returns false when the Matrix has elements" do - Matrix[ [1, 2] ].empty?.should be_false - Matrix[ [1], [2] ].empty?.should be_false + Matrix[ [1, 2] ].empty?.should == false + Matrix[ [1], [2] ].empty?.should == false end it "doesn't accept any parameter" do - lambda{ + ->{ Matrix[ [1, 2] ].empty?(42) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end @@ -38,31 +38,31 @@ describe "Matrix.empty" do end it "does not accept more than two parameters" do - lambda{ + ->{ Matrix.empty(1, 2, 3) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "raises an error if both dimensions are > 0" do - lambda{ + ->{ Matrix.empty(1, 2) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "raises an error if any dimension is < 0" do - lambda{ + ->{ Matrix.empty(-2, 0) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) - lambda{ + ->{ Matrix.empty(0, -2) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.empty(0, 1).should be_an_instance_of(MatrixSub) + MatrixSub.empty(0, 1).should.instance_of?(MatrixSub) end end diff --git a/spec/ruby/library/matrix/eql_spec.rb b/spec/ruby/library/matrix/eql_spec.rb index ea26c3320d..cda122f4d8 100644 --- a/spec/ruby/library/matrix/eql_spec.rb +++ b/spec/ruby/library/matrix/eql_spec.rb @@ -6,6 +6,6 @@ describe "Matrix#eql?" do it_behaves_like :equal, :eql? it "returns false if some elements are == but not eql?" do - Matrix[[1, 2],[3, 4]].eql?(Matrix[[1, 2],[3, 4.0]]).should be_false + Matrix[[1, 2],[3, 4]].eql?(Matrix[[1, 2],[3, 4.0]]).should == false end end diff --git a/spec/ruby/library/matrix/exponent_spec.rb b/spec/ruby/library/matrix/exponent_spec.rb index c496d9d3cc..4cbe63587d 100644 --- a/spec/ruby/library/matrix/exponent_spec.rb +++ b/spec/ruby/library/matrix/exponent_spec.rb @@ -17,21 +17,32 @@ describe "Matrix#**" do it "raises a ErrDimensionMismatch for non square matrices" do m = Matrix[ [1, 1], [1, 2], [2, 3]] - lambda { m ** 3 }.should raise_error(Matrix::ErrDimensionMismatch) - lambda { m ** 0 }.should raise_error(Matrix::ErrDimensionMismatch) + -> { m ** 3 }.should.raise(Matrix::ErrDimensionMismatch) + -> { m ** 0 }.should.raise(Matrix::ErrDimensionMismatch) end - describe "that is <= 0" do + describe "that is < 0" do it "returns the inverse of **(-n)" do m = Matrix[ [1, 1], [1, 2] ] (m ** -2).should == Matrix[ [5, -3], [-3, 2]] (m ** -4).should == (m.inverse ** 4) end - it "raises a ErrDimensionMismatch for irregular matrices" do + it "raises a ErrNotRegular for irregular matrices" do m = Matrix[ [1, 1], [1, 1] ] - lambda { m ** -2 }.should raise_error(Matrix::ErrNotRegular) - lambda { m ** 0 }.should raise_error(Matrix::ErrNotRegular) + -> { m ** -2 }.should.raise(Matrix::ErrNotRegular) + end + end + + describe "that is 0" do + it "returns the identity for square matrices" do + m = Matrix[ [1, 1], [1, 1] ] + (m ** 0).should == Matrix.identity(2) + end + + it "raises an ErrDimensionMismatch for non-square matrices" do + m = Matrix[ [1, 1] ] + -> { m ** 0 }.should.raise(Matrix::ErrDimensionMismatch) end end end @@ -45,7 +56,7 @@ describe "Matrix#**" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - (MatrixSub.ins ** 1).should be_an_instance_of(MatrixSub) + (MatrixSub.ins ** 1).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/find_index_spec.rb b/spec/ruby/library/matrix/find_index_spec.rb index 27672e526b..c7278fd449 100644 --- a/spec/ruby/library/matrix/find_index_spec.rb +++ b/spec/ruby/library/matrix/find_index_spec.rb @@ -8,12 +8,12 @@ describe "Matrix#find_index without any argument" do it "returns an Enumerator when called without a block" do enum = @m.find_index - enum.should be_an_instance_of(Enumerator) + enum.should.instance_of?(Enumerator) enum.to_a.should == [1, 2, 3, 4, 5, 6, 7, 8] end it "returns nil if the block is always false" do - @m.find_index{false}.should be_nil + @m.find_index{false}.should == nil end it "returns the first index for which the block is true" do @@ -48,7 +48,7 @@ describe "Matrix#find_index with a subselection argument" do it "returns an Enumerator when called without a block" do @tests.each do |matrix, h| h.each do |selector, result| - matrix.find_index(selector).should be_an_instance_of(Enumerator) + matrix.find_index(selector).should.instance_of?(Enumerator) end end end @@ -116,7 +116,7 @@ describe "Matrix#find_index with only a generic argument" do end it "returns nil if the value is not found" do - @m.find_index(42).should be_nil + @m.find_index(42).should == nil end it "returns the first index for of the requested value" do @@ -130,17 +130,17 @@ end describe "Matrix#find_index with two arguments" do it "raises an ArgumentError for an unrecognized last argument" do - lambda { + -> { @m.find_index(1, "all"){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.find_index(1, nil){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.find_index(1, :left){} - }.should raise_error(ArgumentError) - lambda { + }.should.raise(ArgumentError) + -> { @m.find_index(:diagonal, 1){} - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/matrix/hash_spec.rb b/spec/ruby/library/matrix/hash_spec.rb index fac9a06527..27bf7b9751 100644 --- a/spec/ruby/library/matrix/hash_spec.rb +++ b/spec/ruby/library/matrix/hash_spec.rb @@ -3,8 +3,8 @@ require 'matrix' describe "Matrix#hash" do - it "returns a Fixnum" do - Matrix[ [1,2] ].hash.should be_an_instance_of(Fixnum) + it "returns an Integer" do + Matrix[ [1,2] ].hash.should.instance_of?(Integer) end it "returns the same value for the same matrix" do diff --git a/spec/ruby/library/matrix/hermitian_spec.rb b/spec/ruby/library/matrix/hermitian_spec.rb index dda5280d64..94d0dbe6b6 100644 --- a/spec/ruby/library/matrix/hermitian_spec.rb +++ b/spec/ruby/library/matrix/hermitian_spec.rb @@ -3,15 +3,15 @@ require 'matrix' describe "Matrix.hermitian?" do it "returns true for a hermitian Matrix" do - Matrix[[1, 2, Complex(0, 3)], [2, 4, 5], [Complex(0, -3), 5, 6]].hermitian?.should be_true + Matrix[[1, 2, Complex(0, 3)], [2, 4, 5], [Complex(0, -3), 5, 6]].hermitian?.should == true end it "returns true for a 0x0 empty matrix" do - Matrix.empty.hermitian?.should be_true + Matrix.empty.hermitian?.should == true end it "returns false for an asymmetric Matrix" do - Matrix[[1, 2],[-2, 1]].hermitian?.should be_false + Matrix[[1, 2],[-2, 1]].hermitian?.should == false end it "raises an error for rectangular matrices" do @@ -21,14 +21,14 @@ describe "Matrix.hermitian?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.hermitian? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end it "returns false for a matrix with complex values on the diagonal" do - Matrix[[Complex(1,1)]].hermitian?.should be_false - Matrix[[Complex(1,0)]].hermitian?.should be_true + Matrix[[Complex(1,1)]].hermitian?.should == false + Matrix[[Complex(1,0)]].hermitian?.should == true end end diff --git a/spec/ruby/library/matrix/lower_triangular_spec.rb b/spec/ruby/library/matrix/lower_triangular_spec.rb index f3aa4501f4..7e8688fd9b 100644 --- a/spec/ruby/library/matrix/lower_triangular_spec.rb +++ b/spec/ruby/library/matrix/lower_triangular_spec.rb @@ -3,22 +3,22 @@ require 'matrix' describe "Matrix.lower_triangular?" do it "returns true for a square lower triangular Matrix" do - Matrix[[1, 0, 0], [1, 2, 0], [1, 2, 3]].lower_triangular?.should be_true - Matrix.diagonal([1, 2, 3]).lower_triangular?.should be_true - Matrix[[1, 0], [1, 2], [1, 2], [1, 2]].lower_triangular?.should be_true - Matrix[[1, 0, 0, 0], [1, 2, 0, 0]].lower_triangular?.should be_true + Matrix[[1, 0, 0], [1, 2, 0], [1, 2, 3]].lower_triangular?.should == true + Matrix.diagonal([1, 2, 3]).lower_triangular?.should == true + Matrix[[1, 0], [1, 2], [1, 2], [1, 2]].lower_triangular?.should == true + Matrix[[1, 0, 0, 0], [1, 2, 0, 0]].lower_triangular?.should == true end it "returns true for an empty Matrix" do - Matrix.empty(3, 0).lower_triangular?.should be_true - Matrix.empty(0, 3).lower_triangular?.should be_true - Matrix.empty(0, 0).lower_triangular?.should be_true + Matrix.empty(3, 0).lower_triangular?.should == true + Matrix.empty(0, 3).lower_triangular?.should == true + Matrix.empty(0, 0).lower_triangular?.should == true end it "returns false for a non lower triangular square Matrix" do - Matrix[[0, 1], [0, 0]].lower_triangular?.should be_false - Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].lower_triangular?.should be_false - Matrix[[0, 1], [0, 0], [0, 0], [0, 0]].lower_triangular?.should be_false - Matrix[[0, 0, 0, 1], [0, 0, 0, 0]].lower_triangular?.should be_false + Matrix[[0, 1], [0, 0]].lower_triangular?.should == false + Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].lower_triangular?.should == false + Matrix[[0, 1], [0, 0], [0, 0], [0, 0]].lower_triangular?.should == false + Matrix[[0, 0, 0, 1], [0, 0, 0, 0]].lower_triangular?.should == false end end diff --git a/spec/ruby/library/matrix/lup_decomposition/determinant_spec.rb b/spec/ruby/library/matrix/lup_decomposition/determinant_spec.rb index ca2ddf18c6..98ac5c71a3 100644 --- a/spec/ruby/library/matrix/lup_decomposition/determinant_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/determinant_spec.rb @@ -13,9 +13,9 @@ describe "Matrix::LUPDecomposition#determinant" do Matrix[[7, 8], [14, 46], [28, 82]], ].each do |m| lup = m.lup - lambda { + -> { lup.determinant - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/lup_decomposition/initialize_spec.rb b/spec/ruby/library/matrix/lup_decomposition/initialize_spec.rb index 00dc47ddb9..b813757525 100644 --- a/spec/ruby/library/matrix/lup_decomposition/initialize_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/initialize_spec.rb @@ -3,11 +3,11 @@ require 'matrix' describe "Matrix::LUPDecomposition#initialize" do it "raises an error if argument is not a matrix" do - lambda { + -> { Matrix::LUPDecomposition.new([[]]) - }.should raise_error(TypeError) - lambda { + }.should.raise(TypeError) + -> { Matrix::LUPDecomposition.new(42) - }.should raise_error(TypeError) + }.should.raise(TypeError) end end diff --git a/spec/ruby/library/matrix/lup_decomposition/l_spec.rb b/spec/ruby/library/matrix/lup_decomposition/l_spec.rb index 9514ab5d06..0a6797cc85 100644 --- a/spec/ruby/library/matrix/lup_decomposition/l_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/l_spec.rb @@ -13,6 +13,6 @@ describe "Matrix::LUPDecomposition#l" do end it "returns a lower triangular matrix" do - @l.lower_triangular?.should be_true + @l.lower_triangular?.should == true end end diff --git a/spec/ruby/library/matrix/lup_decomposition/p_spec.rb b/spec/ruby/library/matrix/lup_decomposition/p_spec.rb index c7b5e9196e..2c44399b79 100644 --- a/spec/ruby/library/matrix/lup_decomposition/p_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/p_spec.rb @@ -13,6 +13,6 @@ describe "Matrix::LUPDecomposition#p" do end it "returns a permutation matrix" do - @p.permutation?.should be_true + @p.permutation?.should == true end end diff --git a/spec/ruby/library/matrix/lup_decomposition/solve_spec.rb b/spec/ruby/library/matrix/lup_decomposition/solve_spec.rb index 43d49de9c7..9927e96727 100644 --- a/spec/ruby/library/matrix/lup_decomposition/solve_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/solve_spec.rb @@ -6,9 +6,9 @@ describe "Matrix::LUPDecomposition#solve" do it "raises an error for singular matrices" do a = Matrix[[1, 2, 3], [1, 3, 5], [2, 5, 8]] lu = Matrix::LUPDecomposition.new(a) - lambda { + -> { lu.solve(a) - }.should raise_error(Matrix::ErrNotRegular) + }.should.raise(Matrix::ErrNotRegular) end describe "for non singular matrices" do @@ -31,9 +31,9 @@ describe "Matrix::LUPDecomposition#solve" do it "raises an error when given a matrix of the wrong size" do values = Matrix[[1, 2, 3, 4], [0, 1, 2, 3]] - lambda { + -> { @lu.solve(values) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end it "returns the right vector when given a vector of the appropriate size" do @@ -44,9 +44,9 @@ describe "Matrix::LUPDecomposition#solve" do it "raises an error when given a vector of the wrong size" do values = Vector[14, 55] - lambda { + -> { @lu.solve(values) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/lup_decomposition/to_a_spec.rb b/spec/ruby/library/matrix/lup_decomposition/to_a_spec.rb index 9b1dccbbac..ab59677dd9 100644 --- a/spec/ruby/library/matrix/lup_decomposition/to_a_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/to_a_spec.rb @@ -10,9 +10,9 @@ describe "Matrix::LUPDecomposition#to_a" do end it "returns an array of three matrices" do - @to_a.should be_kind_of(Array) + @to_a.should.is_a?(Array) @to_a.length.should == 3 - @to_a.each{|m| m.should be_kind_of(Matrix)} + @to_a.each{|m| m.should.is_a?(Matrix)} end it "returns [l, u, p] such that l*u == a*p" do diff --git a/spec/ruby/library/matrix/lup_decomposition/u_spec.rb b/spec/ruby/library/matrix/lup_decomposition/u_spec.rb index ca3dfc1f00..967bc669dc 100644 --- a/spec/ruby/library/matrix/lup_decomposition/u_spec.rb +++ b/spec/ruby/library/matrix/lup_decomposition/u_spec.rb @@ -13,6 +13,6 @@ describe "Matrix::LUPDecomposition#u" do end it "returns an upper triangular matrix" do - @u.upper_triangular?.should be_true + @u.upper_triangular?.should == true end end diff --git a/spec/ruby/library/matrix/minor_spec.rb b/spec/ruby/library/matrix/minor_spec.rb index 009826c3d6..6b29db568b 100644 --- a/spec/ruby/library/matrix/minor_spec.rb +++ b/spec/ruby/library/matrix/minor_spec.rb @@ -79,7 +79,7 @@ describe "Matrix#minor" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.minor(0, 1, 0, 1).should be_an_instance_of(MatrixSub) + MatrixSub.ins.minor(0, 1, 0, 1).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/minus_spec.rb b/spec/ruby/library/matrix/minus_spec.rb index 25191893a6..7426aa2d2c 100644 --- a/spec/ruby/library/matrix/minus_spec.rb +++ b/spec/ruby/library/matrix/minus_spec.rb @@ -13,30 +13,30 @@ describe "Matrix#-" do end it "returns an instance of Matrix" do - (@a - @b).should be_kind_of(Matrix) + (@a - @b).should.is_a?(Matrix) end it "raises a Matrix::ErrDimensionMismatch if the matrices are different sizes" do - lambda { @a - Matrix[ [1] ] }.should raise_error(Matrix::ErrDimensionMismatch) + -> { @a - Matrix[ [1] ] }.should.raise(Matrix::ErrDimensionMismatch) end it "raises a ExceptionForMatrix::ErrOperationNotDefined if other is a Numeric Type" do - lambda { @a - 2 }.should raise_error(Matrix::ErrOperationNotDefined) - lambda { @a - 1.2 }.should raise_error(Matrix::ErrOperationNotDefined) - lambda { @a - bignum_value }.should raise_error(Matrix::ErrOperationNotDefined) + -> { @a - 2 }.should.raise(Matrix::ErrOperationNotDefined) + -> { @a - 1.2 }.should.raise(Matrix::ErrOperationNotDefined) + -> { @a - bignum_value }.should.raise(Matrix::ErrOperationNotDefined) end it "raises a TypeError if other is of wrong type" do - lambda { @a - nil }.should raise_error(TypeError) - lambda { @a - "a" }.should raise_error(TypeError) - lambda { @a - [ [1, 2] ] }.should raise_error(TypeError) - lambda { @a - Object.new }.should raise_error(TypeError) + -> { @a - nil }.should.raise(TypeError) + -> { @a - "a" }.should.raise(TypeError) + -> { @a - [ [1, 2] ] }.should.raise(TypeError) + -> { @a - Object.new }.should.raise(TypeError) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do m = MatrixSub.ins - (m-m).should be_an_instance_of(MatrixSub) + (m-m).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/multiply_spec.rb b/spec/ruby/library/matrix/multiply_spec.rb index 9b401a4dad..6c495c5521 100644 --- a/spec/ruby/library/matrix/multiply_spec.rb +++ b/spec/ruby/library/matrix/multiply_spec.rb @@ -1,4 +1,5 @@ require_relative '../../spec_helper' + require_relative 'fixtures/classes' require 'matrix' @@ -22,8 +23,8 @@ describe "Matrix#*" do it "returns the result of multiplying the elements of self and a Bignum" do (@a * bignum_value).should == Matrix[ - [9223372036854775808, 18446744073709551616], - [27670116110564327424, 36893488147419103232] + [18446744073709551616, 36893488147419103232], + [55340232221128654848, 73786976294838206464] ] end @@ -32,7 +33,7 @@ describe "Matrix#*" do end it "raises a Matrix::ErrDimensionMismatch if the matrices are different sizes" do - lambda { @a * Matrix[ [1] ] }.should raise_error(Matrix::ErrDimensionMismatch) + -> { @a * Matrix[ [1] ] }.should.raise(Matrix::ErrDimensionMismatch) end it "returns a zero matrix if (nx0) * (0xn)" do @@ -52,17 +53,17 @@ describe "Matrix#*" do end it "raises a TypeError if other is of wrong type" do - lambda { @a * nil }.should raise_error(TypeError) - lambda { @a * "a" }.should raise_error(TypeError) - lambda { @a * [ [1, 2] ] }.should raise_error(TypeError) - lambda { @a * Object.new }.should raise_error(TypeError) + -> { @a * nil }.should.raise(TypeError) + -> { @a * "a" }.should.raise(TypeError) + -> { @a * [ [1, 2] ] }.should.raise(TypeError) + -> { @a * Object.new }.should.raise(TypeError) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do m = MatrixSub.ins - (m*m).should be_an_instance_of(MatrixSub) - (m*1).should be_an_instance_of(MatrixSub) + (m*m).should.instance_of?(MatrixSub) + (m*1).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/new_spec.rb b/spec/ruby/library/matrix/new_spec.rb index 3005066846..bde9d9f4c8 100644 --- a/spec/ruby/library/matrix/new_spec.rb +++ b/spec/ruby/library/matrix/new_spec.rb @@ -3,6 +3,6 @@ require 'matrix' describe "Matrix.new" do it "is private" do - Matrix.should have_private_method(:new) + Matrix.private_methods(false).should.include?(:new) end end diff --git a/spec/ruby/library/matrix/normal_spec.rb b/spec/ruby/library/matrix/normal_spec.rb index 437a3c82c9..420d4b011f 100644 --- a/spec/ruby/library/matrix/normal_spec.rb +++ b/spec/ruby/library/matrix/normal_spec.rb @@ -3,12 +3,12 @@ require 'matrix' describe "Matrix.normal?" do # it "returns false for non normal matrices" do - # Matrix[[0, 1], [1, 2]].normal?.should == false + # Matrix[[0, 1], [1, 2]].should_not.normal? # end it "returns true for normal matrices" do - Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].normal?.should == true - Matrix[[0, Complex(0, 2)], [Complex(0, -2), 0]].normal?.should == true + Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].should.normal? + Matrix[[0, Complex(0, 2)], [Complex(0, -2), 0]].should.normal? end it "raises an error for rectangular matrices" do @@ -18,9 +18,9 @@ describe "Matrix.normal?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.normal? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/orthogonal_spec.rb b/spec/ruby/library/matrix/orthogonal_spec.rb index 81df1d15ee..71ac831fe8 100644 --- a/spec/ruby/library/matrix/orthogonal_spec.rb +++ b/spec/ruby/library/matrix/orthogonal_spec.rb @@ -3,12 +3,12 @@ require 'matrix' describe "Matrix.orthogonal?" do it "returns false for non orthogonal matrices" do - Matrix[[0, 1], [1, 2]].orthogonal?.should == false - Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].orthogonal?.should == false + Matrix[[0, 1], [1, 2]].should_not.orthogonal? + Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].should_not.orthogonal? end it "returns true for orthogonal matrices" do - Matrix[[0, 1], [1, 0]].orthogonal?.should == true + Matrix[[0, 1], [1, 0]].should.orthogonal? end it "raises an error for rectangular matrices" do @@ -18,9 +18,9 @@ describe "Matrix.orthogonal?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.orthogonal? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/permutation_spec.rb b/spec/ruby/library/matrix/permutation_spec.rb index f6666588de..43727edea1 100644 --- a/spec/ruby/library/matrix/permutation_spec.rb +++ b/spec/ruby/library/matrix/permutation_spec.rb @@ -3,18 +3,18 @@ require 'matrix' describe "Matrix#permutation?" do it "returns true for a permutation Matrix" do - Matrix[[0, 1, 0], [0, 0, 1], [1, 0, 0]].permutation?.should be_true + Matrix[[0, 1, 0], [0, 0, 1], [1, 0, 0]].permutation?.should == true end it "returns false for a non permutation square Matrix" do - Matrix[[0, 1], [0, 0]].permutation?.should be_false - Matrix[[-1, 0], [0, -1]].permutation?.should be_false - Matrix[[1, 0], [1, 0]].permutation?.should be_false - Matrix[[1, 0], [1, 1]].permutation?.should be_false + Matrix[[0, 1], [0, 0]].permutation?.should == false + Matrix[[-1, 0], [0, -1]].permutation?.should == false + Matrix[[1, 0], [1, 0]].permutation?.should == false + Matrix[[1, 0], [1, 1]].permutation?.should == false end it "returns true for an empty 0x0 matrix" do - Matrix.empty(0,0).permutation?.should be_true + Matrix.empty(0,0).permutation?.should == true end it "raises an error for rectangular matrices" do @@ -24,9 +24,9 @@ describe "Matrix#permutation?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.permutation? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/plus_spec.rb b/spec/ruby/library/matrix/plus_spec.rb index cad04f80a3..72a9ba8f8f 100644 --- a/spec/ruby/library/matrix/plus_spec.rb +++ b/spec/ruby/library/matrix/plus_spec.rb @@ -13,30 +13,30 @@ describe "Matrix#+" do end it "returns an instance of Matrix" do - (@a + @b).should be_kind_of(Matrix) + (@a + @b).should.is_a?(Matrix) end it "raises a Matrix::ErrDimensionMismatch if the matrices are different sizes" do - lambda { @a + Matrix[ [1] ] }.should raise_error(Matrix::ErrDimensionMismatch) + -> { @a + Matrix[ [1] ] }.should.raise(Matrix::ErrDimensionMismatch) end it "raises a ExceptionForMatrix::ErrOperationNotDefined if other is a Numeric Type" do - lambda { @a + 2 }.should raise_error(ExceptionForMatrix::ErrOperationNotDefined) - lambda { @a + 1.2 }.should raise_error(ExceptionForMatrix::ErrOperationNotDefined) - lambda { @a + bignum_value }.should raise_error(ExceptionForMatrix::ErrOperationNotDefined) + -> { @a + 2 }.should.raise(ExceptionForMatrix::ErrOperationNotDefined) + -> { @a + 1.2 }.should.raise(ExceptionForMatrix::ErrOperationNotDefined) + -> { @a + bignum_value }.should.raise(ExceptionForMatrix::ErrOperationNotDefined) end it "raises a TypeError if other is of wrong type" do - lambda { @a + nil }.should raise_error(TypeError) - lambda { @a + "a" }.should raise_error(TypeError) - lambda { @a + [ [1, 2] ] }.should raise_error(TypeError) - lambda { @a + Object.new }.should raise_error(TypeError) + -> { @a + nil }.should.raise(TypeError) + -> { @a + "a" }.should.raise(TypeError) + -> { @a + [ [1, 2] ] }.should.raise(TypeError) + -> { @a + Object.new }.should.raise(TypeError) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do m = MatrixSub.ins - (m+m).should be_an_instance_of(MatrixSub) + (m+m).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/real_spec.rb b/spec/ruby/library/matrix/real_spec.rb index 38033c63c8..4589dc22a5 100644 --- a/spec/ruby/library/matrix/real_spec.rb +++ b/spec/ruby/library/matrix/real_spec.rb @@ -4,22 +4,22 @@ require 'matrix' describe "Matrix#real?" do it "returns true for matrices with all real entries" do - Matrix[ [1, 2], [3, 4] ].real?.should be_true - Matrix[ [1.9, 2], [3, 4] ].real?.should be_true + Matrix[ [1, 2], [3, 4] ].real?.should == true + Matrix[ [1.9, 2], [3, 4] ].real?.should == true end it "returns true for empty matrices" do - Matrix.empty.real?.should be_true + Matrix.empty.real?.should == true end it "returns false if one element is a Complex" do - Matrix[ [Complex(1,1), 2], [3, 4] ].real?.should be_false + Matrix[ [Complex(1,1), 2], [3, 4] ].real?.should == false end # Guard against the Mathn library guard -> { !defined?(Math.rsqrt) } do it "returns false if one element is a Complex whose imaginary part is 0" do - Matrix[ [Complex(1,0), 2], [3, 4] ].real?.should be_false + Matrix[ [Complex(1,0), 2], [3, 4] ].real?.should == false end end end @@ -37,7 +37,7 @@ describe "Matrix#real" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.real.should be_an_instance_of(MatrixSub) + MatrixSub.ins.real.should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/regular_spec.rb b/spec/ruby/library/matrix/regular_spec.rb index 5dd4484ce4..4cb00819ac 100644 --- a/spec/ruby/library/matrix/regular_spec.rb +++ b/spec/ruby/library/matrix/regular_spec.rb @@ -5,27 +5,27 @@ describe "Matrix#regular?" do it "returns false for singular matrices" do m = Matrix[ [1,2,3], [3,4,3], [0,0,0] ] - m.regular?.should be_false + m.regular?.should == false m = Matrix[ [1,2,9], [3,4,9], [1,2,9] ] - m.regular?.should be_false + m.regular?.should == false end it "returns true if the Matrix is regular" do - Matrix[ [0,1], [1,0] ].regular?.should be_true + Matrix[ [0,1], [1,0] ].regular?.should == true end it "returns true for an empty 0x0 matrix" do - Matrix.empty(0,0).regular?.should be_true + Matrix.empty(0,0).regular?.should == true end it "raises an error for rectangular matrices" do - lambda { + -> { Matrix[[1], [2], [3]].regular? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) - lambda { + -> { Matrix.empty(3,0).regular? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end diff --git a/spec/ruby/library/matrix/round_spec.rb b/spec/ruby/library/matrix/round_spec.rb index 1dc29df890..cdec646fa1 100644 --- a/spec/ruby/library/matrix/round_spec.rb +++ b/spec/ruby/library/matrix/round_spec.rb @@ -15,7 +15,7 @@ describe "Matrix#round" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.round.should be_an_instance_of(MatrixSub) + MatrixSub.ins.round.should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/row_spec.rb b/spec/ruby/library/matrix/row_spec.rb index 1cf2c6ae2c..8a7662fdf2 100644 --- a/spec/ruby/library/matrix/row_spec.rb +++ b/spec/ruby/library/matrix/row_spec.rb @@ -21,7 +21,7 @@ describe "Matrix#row" do end it "returns self when called with a block" do - @m.row(0) { |x| x }.should equal(@m) + @m.row(0) { |x| x }.should.equal?(@m) end it "returns nil when out of bounds" do @@ -30,7 +30,7 @@ describe "Matrix#row" do end it "never yields when out of bounds" do - lambda { @m.row(3){ raise } }.should_not raise_error - lambda { @m.row(-4){ raise } }.should_not raise_error + -> { @m.row(3){ raise } }.should_not.raise + -> { @m.row(-4){ raise } }.should_not.raise end end diff --git a/spec/ruby/library/matrix/row_vector_spec.rb b/spec/ruby/library/matrix/row_vector_spec.rb index 341437ee05..f3919fb7d8 100644 --- a/spec/ruby/library/matrix/row_vector_spec.rb +++ b/spec/ruby/library/matrix/row_vector_spec.rb @@ -5,7 +5,7 @@ require 'matrix' describe "Matrix.row_vector" do it "returns a Matrix" do - Matrix.row_vector([]).should be_an_instance_of(Matrix) + Matrix.row_vector([]).should.instance_of?(Matrix) end it "returns a single-row Matrix with the specified values" do @@ -18,7 +18,7 @@ describe "Matrix.row_vector" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.row_vector([1]).should be_an_instance_of(MatrixSub) + MatrixSub.row_vector([1]).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/row_vectors_spec.rb b/spec/ruby/library/matrix/row_vectors_spec.rb index 6f99c439a6..4a0db67527 100644 --- a/spec/ruby/library/matrix/row_vectors_spec.rb +++ b/spec/ruby/library/matrix/row_vectors_spec.rb @@ -8,11 +8,11 @@ describe "Matrix#row_vectors" do end it "returns an Array" do - Matrix[ [1,2], [3,4] ].row_vectors.should be_an_instance_of(Array) + Matrix[ [1,2], [3,4] ].row_vectors.should.instance_of?(Array) end it "returns an Array of Vectors" do - @vectors.all? {|v| v.should be_an_instance_of(Vector)} + @vectors.all? {|v| v.should.instance_of?(Vector)} end it "returns each row as a Vector" do diff --git a/spec/ruby/library/matrix/rows_spec.rb b/spec/ruby/library/matrix/rows_spec.rb index 41ba635775..9c248cd8a4 100644 --- a/spec/ruby/library/matrix/rows_spec.rb +++ b/spec/ruby/library/matrix/rows_spec.rb @@ -10,7 +10,7 @@ describe "Matrix.rows" do end it "returns a Matrix" do - @m.should be_kind_of(Matrix) + @m.should.is_a?(Matrix) end it "creates a matrix from argument rows" do @@ -21,8 +21,8 @@ describe "Matrix.rows" do it "copies the original rows by default" do @a << 3 @b << 6 - @m.row(0).should_not equal(@a) - @m.row(1).should_not equal(@b) + @m.row(0).should_not.equal?(@a) + @m.row(1).should_not.equal?(@b) end it "references the original rows if copy is false" do @@ -35,7 +35,7 @@ describe "Matrix.rows" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.rows([[0, 1], [0, 1]]).should be_an_instance_of(MatrixSub) + MatrixSub.rows([[0, 1], [0, 1]]).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/scalar_spec.rb b/spec/ruby/library/matrix/scalar_spec.rb index 7fdd64c9d9..5b93b60533 100644 --- a/spec/ruby/library/matrix/scalar_spec.rb +++ b/spec/ruby/library/matrix/scalar_spec.rb @@ -10,7 +10,7 @@ describe "Matrix.scalar" do end it "returns a Matrix" do - @a.should be_kind_of(Matrix) + @a.should.is_a?(Matrix) end it "returns a n x n matrix" do @@ -41,7 +41,7 @@ describe "Matrix.scalar" do end it "returns a Matrix" do - @a.should be_kind_of(Matrix) + @a.should.is_a?(Matrix) end it "returns a square matrix, where the first argument specifies the side of the square" do diff --git a/spec/ruby/library/matrix/shared/collect.rb b/spec/ruby/library/matrix/shared/collect.rb index 852f7fd6cf..3a4dbe3a36 100644 --- a/spec/ruby/library/matrix/shared/collect.rb +++ b/spec/ruby/library/matrix/shared/collect.rb @@ -7,7 +7,7 @@ describe :collect, shared: true do end it "returns an instance of Matrix" do - @m.send(@method){|n| n * 2 }.should be_kind_of(Matrix) + @m.send(@method){|n| n * 2 }.should.is_a?(Matrix) end it "returns a Matrix where each element is the result of the block" do @@ -15,12 +15,12 @@ describe :collect, shared: true do end it "returns an enumerator if no block is given" do - @m.send(@method).should be_an_instance_of(Enumerator) + @m.send(@method).should.instance_of?(Enumerator) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.send(@method){1}.should be_an_instance_of(MatrixSub) + MatrixSub.ins.send(@method){1}.should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/shared/conjugate.rb b/spec/ruby/library/matrix/shared/conjugate.rb index d87658f855..ffdf5ebca1 100644 --- a/spec/ruby/library/matrix/shared/conjugate.rb +++ b/spec/ruby/library/matrix/shared/conjugate.rb @@ -14,7 +14,7 @@ describe :matrix_conjugate, shared: true do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.send(@method).should be_an_instance_of(MatrixSub) + MatrixSub.ins.send(@method).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/shared/determinant.rb b/spec/ruby/library/matrix/shared/determinant.rb index 47a58c62a6..b7c86393ba 100644 --- a/spec/ruby/library/matrix/shared/determinant.rb +++ b/spec/ruby/library/matrix/shared/determinant.rb @@ -27,12 +27,12 @@ describe :determinant, shared: true do end it "raises an error for rectangular matrices" do - lambda { + -> { Matrix[[1], [2], [3]].send(@method) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) - lambda { + -> { Matrix.empty(3,0).send(@method) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end diff --git a/spec/ruby/library/matrix/shared/equal_value.rb b/spec/ruby/library/matrix/shared/equal_value.rb index 2b2311d49e..9bc6ed908b 100644 --- a/spec/ruby/library/matrix/shared/equal_value.rb +++ b/spec/ruby/library/matrix/shared/equal_value.rb @@ -7,27 +7,27 @@ describe :equal, shared: true do end it "returns true for self" do - @matrix.send(@method, @matrix).should be_true + @matrix.send(@method, @matrix).should == true end it "returns true for equal matrices" do - @matrix.send(@method, Matrix[ [1, 2, 3, 4, 5], [2, 3, 4, 5, 6] ]).should be_true + @matrix.send(@method, Matrix[ [1, 2, 3, 4, 5], [2, 3, 4, 5, 6] ]).should == true end it "returns false for different matrices" do - @matrix.send(@method, Matrix[ [42, 2, 3, 4, 5], [2, 3, 4, 5, 6] ]).should be_false - @matrix.send(@method, Matrix[ [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7] ]).should be_false - @matrix.send(@method, Matrix[ [1, 2, 3], [2, 3, 4] ]).should be_false + @matrix.send(@method, Matrix[ [42, 2, 3, 4, 5], [2, 3, 4, 5, 6] ]).should == false + @matrix.send(@method, Matrix[ [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7] ]).should == false + @matrix.send(@method, Matrix[ [1, 2, 3], [2, 3, 4] ]).should == false end it "returns false for different empty matrices" do - Matrix.empty(42, 0).send(@method, Matrix.empty(6, 0)).should be_false - Matrix.empty(0, 42).send(@method, Matrix.empty(0, 6)).should be_false - Matrix.empty(0, 0).send(@method, Matrix.empty(6, 0)).should be_false - Matrix.empty(0, 0).send(@method, Matrix.empty(0, 6)).should be_false + Matrix.empty(42, 0).send(@method, Matrix.empty(6, 0)).should == false + Matrix.empty(0, 42).send(@method, Matrix.empty(0, 6)).should == false + Matrix.empty(0, 0).send(@method, Matrix.empty(6, 0)).should == false + Matrix.empty(0, 0).send(@method, Matrix.empty(0, 6)).should == false end it "doesn't distinguish on subclasses" do - MatrixSub.ins.send(@method, Matrix.I(2)).should be_true + MatrixSub.ins.send(@method, Matrix.I(2)).should == true end end diff --git a/spec/ruby/library/matrix/shared/identity.rb b/spec/ruby/library/matrix/shared/identity.rb index 114f86e7b0..df957b5a75 100644 --- a/spec/ruby/library/matrix/shared/identity.rb +++ b/spec/ruby/library/matrix/shared/identity.rb @@ -3,7 +3,7 @@ require 'matrix' describe :matrix_identity, shared: true do it "returns a Matrix" do - Matrix.send(@method, 2).should be_kind_of(Matrix) + Matrix.send(@method, 2).should.is_a?(Matrix) end it "returns a n x n identity matrix" do @@ -13,7 +13,7 @@ describe :matrix_identity, shared: true do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.send(@method, 2).should be_an_instance_of(MatrixSub) + MatrixSub.send(@method, 2).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/shared/imaginary.rb b/spec/ruby/library/matrix/shared/imaginary.rb index d28ecc69f1..16615213a2 100644 --- a/spec/ruby/library/matrix/shared/imaginary.rb +++ b/spec/ruby/library/matrix/shared/imaginary.rb @@ -14,7 +14,7 @@ describe :matrix_imaginary, shared: true do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.send(@method).should be_an_instance_of(MatrixSub) + MatrixSub.ins.send(@method).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/shared/inverse.rb b/spec/ruby/library/matrix/shared/inverse.rb index e1e5ae5758..ac463cf680 100644 --- a/spec/ruby/library/matrix/shared/inverse.rb +++ b/spec/ruby/library/matrix/shared/inverse.rb @@ -4,7 +4,7 @@ require 'matrix' describe :inverse, shared: true do it "returns a Matrix" do - Matrix[ [1,2], [2,1] ].send(@method).should be_an_instance_of(Matrix) + Matrix[ [1,2], [2,1] ].send(@method).should.instance_of?(Matrix) end it "returns the inverse of the Matrix" do @@ -25,14 +25,14 @@ describe :inverse, shared: true do end it "raises a ErrDimensionMismatch if the Matrix is not square" do - lambda{ + ->{ Matrix[ [1,2,3], [1,2,3] ].send(@method) - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.send(@method).should be_an_instance_of(MatrixSub) + MatrixSub.ins.send(@method).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/shared/rectangular.rb b/spec/ruby/library/matrix/shared/rectangular.rb index 3d9a0dfe8a..0229e614c6 100644 --- a/spec/ruby/library/matrix/shared/rectangular.rb +++ b/spec/ruby/library/matrix/shared/rectangular.rb @@ -12,7 +12,7 @@ describe :matrix_rectangular, shared: true do describe "for a subclass of Matrix" do it "returns instances of that subclass" do - MatrixSub.ins.send(@method).each{|m| m.should be_an_instance_of(MatrixSub) } + MatrixSub.ins.send(@method).each{|m| m.should.instance_of?(MatrixSub) } end end end diff --git a/spec/ruby/library/matrix/shared/trace.rb b/spec/ruby/library/matrix/shared/trace.rb index 2a42839f5d..c4a5491b22 100644 --- a/spec/ruby/library/matrix/shared/trace.rb +++ b/spec/ruby/library/matrix/shared/trace.rb @@ -6,7 +6,7 @@ describe :trace, shared: true do end it "returns the sum of diagonal elements in a rectangular Matrix" do - lambda{ Matrix[[1,2,3], [4,5,6]].trace}.should raise_error(Matrix::ErrDimensionMismatch) + ->{ Matrix[[1,2,3], [4,5,6]].trace}.should.raise(Matrix::ErrDimensionMismatch) end end diff --git a/spec/ruby/library/matrix/shared/transpose.rb b/spec/ruby/library/matrix/shared/transpose.rb index 89b1d025be..a0b495359b 100644 --- a/spec/ruby/library/matrix/shared/transpose.rb +++ b/spec/ruby/library/matrix/shared/transpose.rb @@ -13,7 +13,7 @@ describe :matrix_transpose, shared: true do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.ins.send(@method).should be_an_instance_of(MatrixSub) + MatrixSub.ins.send(@method).should.instance_of?(MatrixSub) end end end diff --git a/spec/ruby/library/matrix/singular_spec.rb b/spec/ruby/library/matrix/singular_spec.rb index 362f4cbb35..00b93af495 100644 --- a/spec/ruby/library/matrix/singular_spec.rb +++ b/spec/ruby/library/matrix/singular_spec.rb @@ -4,28 +4,28 @@ require 'matrix' describe "Matrix#singular?" do it "returns true for singular matrices" do m = Matrix[ [1,2,3], [3,4,3], [0,0,0] ] - m.singular?.should be_true + m.singular?.should == true m = Matrix[ [1,2,9], [3,4,9], [1,2,9] ] - m.singular?.should be_true + m.singular?.should == true end it "returns false if the Matrix is regular" do - Matrix[ [0,1], [1,0] ].singular?.should be_false + Matrix[ [0,1], [1,0] ].singular?.should == false end it "returns false for an empty 0x0 matrix" do - Matrix.empty(0,0).singular?.should be_false + Matrix.empty(0,0).singular?.should == false end it "raises an error for rectangular matrices" do - lambda { + -> { Matrix[[1], [2], [3]].singular? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) - lambda { + -> { Matrix.empty(3,0).singular? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end diff --git a/spec/ruby/library/matrix/square_spec.rb b/spec/ruby/library/matrix/square_spec.rb index 25d2d1ad9c..b8cf4acf44 100644 --- a/spec/ruby/library/matrix/square_spec.rb +++ b/spec/ruby/library/matrix/square_spec.rb @@ -4,25 +4,25 @@ require 'matrix' describe "Matrix#square?" do it "returns true when the Matrix is square" do - Matrix[ [1,2], [2,4] ].square?.should be_true - Matrix[ [100,3,5], [9.5, 4.9, 8], [2,0,77] ].square?.should be_true + Matrix[ [1,2], [2,4] ].square?.should == true + Matrix[ [100,3,5], [9.5, 4.9, 8], [2,0,77] ].square?.should == true end it "returns true when the Matrix has only one element" do - Matrix[ [9] ].square?.should be_true + Matrix[ [9] ].square?.should == true end it "returns false when the Matrix is rectangular" do - Matrix[ [1, 2] ].square?.should be_false + Matrix[ [1, 2] ].square?.should == false end it "returns false when the Matrix is rectangular" do - Matrix[ [1], [2] ].square?.should be_false + Matrix[ [1], [2] ].square?.should == false end it "returns handles empty matrices" do - Matrix[].square?.should be_true - Matrix[[]].square?.should be_false - Matrix.columns([[]]).square?.should be_false + Matrix[].square?.should == true + Matrix[[]].square?.should == false + Matrix.columns([[]]).square?.should == false end end diff --git a/spec/ruby/library/matrix/symmetric_spec.rb b/spec/ruby/library/matrix/symmetric_spec.rb index 7b7bce29fc..4b86c19503 100644 --- a/spec/ruby/library/matrix/symmetric_spec.rb +++ b/spec/ruby/library/matrix/symmetric_spec.rb @@ -3,15 +3,15 @@ require 'matrix' describe "Matrix.symmetric?" do it "returns true for a symmetric Matrix" do - Matrix[[1, 2, Complex(0, 3)], [2, 4, 5], [Complex(0, 3), 5, 6]].symmetric?.should be_true + Matrix[[1, 2, Complex(0, 3)], [2, 4, 5], [Complex(0, 3), 5, 6]].symmetric?.should == true end it "returns true for a 0x0 empty matrix" do - Matrix.empty.symmetric?.should be_true + Matrix.empty.symmetric?.should == true end it "returns false for an asymmetric Matrix" do - Matrix[[1, 2],[-2, 1]].symmetric?.should be_false + Matrix[[1, 2],[-2, 1]].symmetric?.should == false end it "raises an error for rectangular matrices" do @@ -21,9 +21,9 @@ describe "Matrix.symmetric?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.symmetric? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/unitary_spec.rb b/spec/ruby/library/matrix/unitary_spec.rb index 921ea3dda3..4490e8f8d4 100644 --- a/spec/ruby/library/matrix/unitary_spec.rb +++ b/spec/ruby/library/matrix/unitary_spec.rb @@ -1,16 +1,20 @@ require_relative '../../spec_helper' + require 'matrix' describe "Matrix.unitary?" do it "returns false for non unitary matrices" do - Matrix[[0, 1], [1, 2]].unitary?.should == false - Matrix[[0, Complex(0, 2)], [Complex(0, 2), 0]].unitary?.should == false - Matrix[[0, Complex(0, 1)], [Complex(0, -1), 0]].unitary?.should == false - Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].unitary?.should == false + Matrix[[0, 1], [1, 2]].should_not.unitary? + Matrix[[0, Complex(0, 2)], [Complex(0, 2), 0]].should_not.unitary? + Matrix[[1, 1, 0], [0, 1, 1], [1, 0, 1]].should_not.unitary? end it "returns true for unitary matrices" do - Matrix[[0, Complex(0, 1)], [Complex(0, 1), 0]].unitary?.should == true + Matrix[[0, Complex(0, 1)], [Complex(0, 1), 0]].should.unitary? + end + + it "returns true for unitary matrices with a Complex and a negative #imag" do + Matrix[[0, Complex(0, 1)], [Complex(0, -1), 0]].should.unitary? end it "raises an error for rectangular matrices" do @@ -20,9 +24,9 @@ describe "Matrix.unitary?" do Matrix.empty(0, 2), Matrix.empty(2, 0), ].each do |rectangular_matrix| - lambda { + -> { rectangular_matrix.unitary? - }.should raise_error(Matrix::ErrDimensionMismatch) + }.should.raise(Matrix::ErrDimensionMismatch) end end end diff --git a/spec/ruby/library/matrix/upper_triangular_spec.rb b/spec/ruby/library/matrix/upper_triangular_spec.rb index 2514294a80..0e2bf611e2 100644 --- a/spec/ruby/library/matrix/upper_triangular_spec.rb +++ b/spec/ruby/library/matrix/upper_triangular_spec.rb @@ -3,22 +3,22 @@ require 'matrix' describe "Matrix.upper_triangular?" do it "returns true for an upper triangular Matrix" do - Matrix[[1, 2, 3], [0, 2, 3], [0, 0, 3]].upper_triangular?.should be_true - Matrix.diagonal([1, 2, 3]).upper_triangular?.should be_true - Matrix[[1, 2], [0, 2], [0, 0], [0, 0]].upper_triangular?.should be_true - Matrix[[1, 2, 3, 4], [0, 2, 3, 4]].upper_triangular?.should be_true + Matrix[[1, 2, 3], [0, 2, 3], [0, 0, 3]].upper_triangular?.should == true + Matrix.diagonal([1, 2, 3]).upper_triangular?.should == true + Matrix[[1, 2], [0, 2], [0, 0], [0, 0]].upper_triangular?.should == true + Matrix[[1, 2, 3, 4], [0, 2, 3, 4]].upper_triangular?.should == true end it "returns false for a non upper triangular square Matrix" do - Matrix[[0, 0], [1, 0]].upper_triangular?.should be_false - Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].upper_triangular?.should be_false - Matrix[[0, 0], [0, 0], [0, 0], [0, 1]].upper_triangular?.should be_false - Matrix[[0, 0, 0, 0], [1, 0, 0, 0]].upper_triangular?.should be_false + Matrix[[0, 0], [1, 0]].upper_triangular?.should == false + Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].upper_triangular?.should == false + Matrix[[0, 0], [0, 0], [0, 0], [0, 1]].upper_triangular?.should == false + Matrix[[0, 0, 0, 0], [1, 0, 0, 0]].upper_triangular?.should == false end it "returns true for an empty matrix" do - Matrix.empty(3,0).upper_triangular?.should be_true - Matrix.empty(0,3).upper_triangular?.should be_true - Matrix.empty(0,0).upper_triangular?.should be_true + Matrix.empty(3,0).upper_triangular?.should == true + Matrix.empty(0,3).upper_triangular?.should == true + Matrix.empty(0,0).upper_triangular?.should == true end end diff --git a/spec/ruby/library/matrix/vector/cross_product_spec.rb b/spec/ruby/library/matrix/vector/cross_product_spec.rb index 5194782edd..96a462c067 100644 --- a/spec/ruby/library/matrix/vector/cross_product_spec.rb +++ b/spec/ruby/library/matrix/vector/cross_product_spec.rb @@ -7,8 +7,8 @@ describe "Vector#cross_product" do end it "raises an error unless both vectors have dimension 3" do - lambda { + -> { Vector[1, 2, 3].cross_product(Vector[0, -4]) - }.should raise_error(Vector::ErrDimensionMismatch) + }.should.raise(Vector::ErrDimensionMismatch) end end diff --git a/spec/ruby/library/matrix/vector/each2_spec.rb b/spec/ruby/library/matrix/vector/each2_spec.rb index 844b903336..86e7ed75aa 100644 --- a/spec/ruby/library/matrix/vector/each2_spec.rb +++ b/spec/ruby/library/matrix/vector/each2_spec.rb @@ -8,8 +8,8 @@ describe "Vector.each2" do end it "requires one argument" do - lambda { @v.each2(@v2, @v2){} }.should raise_error(ArgumentError) - lambda { @v.each2(){} }.should raise_error(ArgumentError) + -> { @v.each2(@v2, @v2){} }.should.raise(ArgumentError) + -> { @v.each2(){} }.should.raise(ArgumentError) end describe "given one argument" do @@ -20,8 +20,8 @@ describe "Vector.each2" do end it "raises a DimensionMismatch error if the Vector size is different" do - lambda { @v.each2(Vector[1,2]){} }.should raise_error(Vector::ErrDimensionMismatch) - lambda { @v.each2(Vector[1,2,3,4]){} }.should raise_error(Vector::ErrDimensionMismatch) + -> { @v.each2(Vector[1,2]){} }.should.raise(Vector::ErrDimensionMismatch) + -> { @v.each2(Vector[1,2,3,4]){} }.should.raise(Vector::ErrDimensionMismatch) end it "yields arguments in sequence" do @@ -37,12 +37,12 @@ describe "Vector.each2" do end it "returns self when given a block" do - @v.each2(@v2){}.should equal(@v) + @v.each2(@v2){}.should.equal?(@v) end it "returns an enumerator if no block given" do enum = @v.each2(@v2) - enum.should be_an_instance_of(Enumerator) + enum.should.instance_of?(Enumerator) enum.to_a.should == [[1, 4], [2, 5], [3, 6]] end end diff --git a/spec/ruby/library/matrix/vector/eql_spec.rb b/spec/ruby/library/matrix/vector/eql_spec.rb index eb2451b550..6e2cd47b8e 100644 --- a/spec/ruby/library/matrix/vector/eql_spec.rb +++ b/spec/ruby/library/matrix/vector/eql_spec.rb @@ -7,10 +7,10 @@ describe "Vector#eql?" do end it "returns true for self" do - @vector.eql?(@vector).should be_true + @vector.eql?(@vector).should == true end it "returns false when there are a pair corresponding elements which are not equal in the sense of Kernel#eql?" do - @vector.eql?(Vector[1, 2, 3, 4, 5.0]).should be_false + @vector.eql?(Vector[1, 2, 3, 4, 5.0]).should == false end end diff --git a/spec/ruby/library/matrix/vector/inner_product_spec.rb b/spec/ruby/library/matrix/vector/inner_product_spec.rb index 584226c450..79dee10833 100644 --- a/spec/ruby/library/matrix/vector/inner_product_spec.rb +++ b/spec/ruby/library/matrix/vector/inner_product_spec.rb @@ -11,9 +11,9 @@ describe "Vector#inner_product" do end it "raises an error for mismatched vectors" do - lambda { + -> { Vector[1, 2, 3].inner_product(Vector[0, -4]) - }.should raise_error(Vector::ErrDimensionMismatch) + }.should.raise(Vector::ErrDimensionMismatch) end it "uses the conjugate of its argument" do diff --git a/spec/ruby/library/matrix/vector/normalize_spec.rb b/spec/ruby/library/matrix/vector/normalize_spec.rb index 4ff9597c82..bb1f046786 100644 --- a/spec/ruby/library/matrix/vector/normalize_spec.rb +++ b/spec/ruby/library/matrix/vector/normalize_spec.rb @@ -8,11 +8,11 @@ describe "Vector#normalize" do end it "raises an error for zero vectors" do - lambda { + -> { Vector[].normalize - }.should raise_error(Vector::ZeroVectorError) - lambda { + }.should.raise(Vector::ZeroVectorError) + -> { Vector[0, 0, 0].normalize - }.should raise_error(Vector::ZeroVectorError) + }.should.raise(Vector::ZeroVectorError) end end diff --git a/spec/ruby/library/matrix/zero_spec.rb b/spec/ruby/library/matrix/zero_spec.rb index 643c57acba..406bcad6ed 100644 --- a/spec/ruby/library/matrix/zero_spec.rb +++ b/spec/ruby/library/matrix/zero_spec.rb @@ -4,7 +4,7 @@ require 'matrix' describe "Matrix.zero" do it "returns an object of type Matrix" do - Matrix.zero(3).should be_kind_of(Matrix) + Matrix.zero(3).should.is_a?(Matrix) end it "creates a n x n matrix" do @@ -30,23 +30,23 @@ describe "Matrix.zero" do describe "for a subclass of Matrix" do it "returns an instance of that subclass" do - MatrixSub.zero(3).should be_an_instance_of(MatrixSub) + MatrixSub.zero(3).should.instance_of?(MatrixSub) end end end describe "Matrix.zero?" do it "returns true for empty matrices" do - Matrix.empty.zero?.should == true - Matrix.empty(3,0).zero?.should == true - Matrix.empty(0,3).zero?.should == true + Matrix.empty.should.zero? + Matrix.empty(3,0).should.zero? + Matrix.empty(0,3).should.zero? end it "returns true for matrices with zero entries" do - Matrix.zero(2,3).zero?.should == true + Matrix.zero(2,3).should.zero? end it "returns false for matrices with non zero entries" do - Matrix[[1]].zero?.should == false + Matrix[[1]].should_not.zero? end end diff --git a/spec/ruby/library/mkmf/mkmf_spec.rb b/spec/ruby/library/mkmf/mkmf_spec.rb new file mode 100644 index 0000000000..18b090e703 --- /dev/null +++ b/spec/ruby/library/mkmf/mkmf_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../spec_helper' + +describe 'mkmf' do + it 'can be required with --enable-frozen-string-literal' do + ruby_exe('p MakeMakefile', options: '-rmkmf --enable-frozen-string-literal').should == "MakeMakefile\n" + end +end diff --git a/spec/ruby/library/monitor/enter_spec.rb b/spec/ruby/library/monitor/enter_spec.rb new file mode 100644 index 0000000000..f523c42087 --- /dev/null +++ b/spec/ruby/library/monitor/enter_spec.rb @@ -0,0 +1,28 @@ +require_relative '../../spec_helper' +require 'monitor' + +describe "Monitor#enter" do + it "acquires the monitor" do + monitor = Monitor.new + 10.times do + wait_q = Queue.new + continue_q = Queue.new + + thread = Thread.new do + begin + monitor.enter + wait_q << true + continue_q.pop + ensure + monitor.exit + end + end + + wait_q.pop + monitor.mon_locked?.should == true + continue_q << true + thread.join + monitor.mon_locked?.should == false + end + end +end diff --git a/spec/ruby/library/monitor/exit_spec.rb b/spec/ruby/library/monitor/exit_spec.rb new file mode 100644 index 0000000000..0748a523ac --- /dev/null +++ b/spec/ruby/library/monitor/exit_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../spec_helper' +require 'monitor' + +describe "Monitor#exit" do + it "raises ThreadError when monitor is not entered" do + m = Monitor.new + + -> { m.exit }.should.raise(ThreadError) + end +end diff --git a/spec/ruby/library/monitor/mon_initialize_spec.rb b/spec/ruby/library/monitor/mon_initialize_spec.rb index e0fe6c2d97..092aee929c 100644 --- a/spec/ruby/library/monitor/mon_initialize_spec.rb +++ b/spec/ruby/library/monitor/mon_initialize_spec.rb @@ -26,6 +26,6 @@ describe "MonitorMixin#mon_initialize" do instance = cls.new(1, 2, 3) copy = instance.dup - copy.should_not equal(instance) + copy.should_not.equal?(instance) end end diff --git a/spec/ruby/library/monitor/new_cond_spec.rb b/spec/ruby/library/monitor/new_cond_spec.rb new file mode 100644 index 0000000000..ec25d3f8a2 --- /dev/null +++ b/spec/ruby/library/monitor/new_cond_spec.rb @@ -0,0 +1,88 @@ +require_relative '../../spec_helper' +require 'monitor' + +describe "Monitor#new_cond" do + it "creates a MonitorMixin::ConditionVariable" do + m = Monitor.new + c = m.new_cond + c.class.should == MonitorMixin::ConditionVariable + end + + it 'returns a condition variable which can be waited on by a thread holding the monitor' do + m = Monitor.new + c = m.new_cond + + 10.times do + + wait_q = Queue.new + thread = Thread.new do + m.synchronize do + wait_q << true + c.wait + end + :done + end + + wait_q.pop + + # Synchronize can't happen until the other thread is waiting. + m.synchronize { c.signal } + + thread.join + thread.value.should == :done + end + end + + it 'returns a condition variable which can be waited on by a thread holding the monitor inside multiple synchronize blocks' do + m = Monitor.new + c = m.new_cond + + 10.times do + + wait_q = Queue.new + thread = Thread.new do + m.synchronize do + m.synchronize do + wait_q << true + c.wait + end + end + :done + end + + wait_q.pop + + #No need to wait here as we cannot synchronize until the other thread is waiting. + m.synchronize { c.signal } + + thread.join + thread.value.should == :done + end + end + + it 'returns a condition variable which can be signalled by a thread holding the monitor inside multiple synchronize blocks' do + m = Monitor.new + c = m.new_cond + + 10.times do + + wait_q = Queue.new + thread = Thread.new do + m.synchronize do + wait_q << true + c.wait + end + :done + end + + wait_q.pop + + # Synchronize can't happen until the other thread is waiting. + m.synchronize { m.synchronize { c.signal } } + + thread.join + thread.value.should == :done + end + end + +end diff --git a/spec/ruby/library/monitor/synchronize_spec.rb b/spec/ruby/library/monitor/synchronize_spec.rb new file mode 100644 index 0000000000..27cc1258b4 --- /dev/null +++ b/spec/ruby/library/monitor/synchronize_spec.rb @@ -0,0 +1,41 @@ +require_relative '../../spec_helper' +require 'monitor' + +describe "Monitor#synchronize" do + it "unlocks after return, even if it was interrupted by Thread#raise" do + exc_class = Class.new(RuntimeError) + + monitor = Monitor.new + 10.times do + wait_q = Queue.new + continue_q = Queue.new + + thread = Thread.new do + begin + monitor.synchronize do + wait_q << true + # Do not wait here, we are trying to interrupt the ensure part of #synchronize + end + continue_q.pop + rescue exc_class + monitor.should_not.mon_locked? + :ok + end + end + + wait_q.pop + thread.raise exc_class, "interrupt" + continue_q << true + thread.value.should == :ok + end + end + + it "raises a LocalJumpError if not passed a block" do + -> { Monitor.new.synchronize }.should.raise(LocalJumpError) + end + + it "raises a thread error if the monitor is not owned on exiting the block" do + monitor = Monitor.new + -> { monitor.synchronize { monitor.exit } }.should.raise(ThreadError) + end +end diff --git a/spec/ruby/library/monitor/try_enter_spec.rb b/spec/ruby/library/monitor/try_enter_spec.rb new file mode 100644 index 0000000000..04b878f720 --- /dev/null +++ b/spec/ruby/library/monitor/try_enter_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../spec_helper' +require 'monitor' + +describe "Monitor#try_enter" do + it "will acquire a monitor not held by another thread" do + monitor = Monitor.new + 10.times do + + thread = Thread.new do + val = monitor.try_enter + monitor.exit if val + val + end + + thread.join + thread.value.should == true + end + end + + it "will not acquire a monitor already held by another thread" do + monitor = Monitor.new + 10.times do + monitor.enter + begin + thread = Thread.new do + val = monitor.try_enter + monitor.exit if val + val + end + + thread.join + thread.value.should == false + ensure + monitor.exit + end + monitor.mon_locked?.should == false + end + end +end diff --git a/spec/ruby/library/net-ftp/FTPError_spec.rb b/spec/ruby/library/net-ftp/FTPError_spec.rb new file mode 100644 index 0000000000..b447e50546 --- /dev/null +++ b/spec/ruby/library/net-ftp/FTPError_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require 'net/ftp' + + describe "Net::FTPError" do + it "is an Exception" do + Net::FTPError.should < Exception + end + end +end diff --git a/spec/ruby/library/net-ftp/FTPPermError_spec.rb b/spec/ruby/library/net-ftp/FTPPermError_spec.rb new file mode 100644 index 0000000000..b9a2d93aef --- /dev/null +++ b/spec/ruby/library/net-ftp/FTPPermError_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require 'net/ftp' + + describe "Net::FTPPermError" do + it "is an Exception" do + Net::FTPPermError.should < Exception + end + + it "is a subclass of Net::FTPError" do + Net::FTPPermError.should < Net::FTPError + end + end +end diff --git a/spec/ruby/library/net-ftp/FTPProtoError_spec.rb b/spec/ruby/library/net-ftp/FTPProtoError_spec.rb new file mode 100644 index 0000000000..a1d9e44d63 --- /dev/null +++ b/spec/ruby/library/net-ftp/FTPProtoError_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require 'net/ftp' + + describe "Net::FTPProtoError" do + it "is an Exception" do + Net::FTPProtoError.should < Exception + end + + it "is a subclass of Net::FTPError" do + Net::FTPPermError.should < Net::FTPError + end + end +end diff --git a/spec/ruby/library/net-ftp/FTPReplyError_spec.rb b/spec/ruby/library/net-ftp/FTPReplyError_spec.rb new file mode 100644 index 0000000000..c9e6468323 --- /dev/null +++ b/spec/ruby/library/net-ftp/FTPReplyError_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require 'net/ftp' + + describe "Net::FTPReplyError" do + it "is an Exception" do + Net::FTPReplyError.should < Exception + end + + it "is a subclass of Net::FTPError" do + Net::FTPPermError.should < Net::FTPError + end + end +end diff --git a/spec/ruby/library/net-ftp/FTPTempError_spec.rb b/spec/ruby/library/net-ftp/FTPTempError_spec.rb new file mode 100644 index 0000000000..c0953cb0f2 --- /dev/null +++ b/spec/ruby/library/net-ftp/FTPTempError_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require 'net/ftp' + + describe "Net::FTPTempError" do + it "is an Exception" do + Net::FTPTempError.should < Exception + end + + it "is a subclass of Net::FTPError" do + Net::FTPPermError.should < Net::FTPError + end + end +end diff --git a/spec/ruby/library/net-ftp/abort_spec.rb b/spec/ruby/library/net-ftp/abort_spec.rb new file mode 100644 index 0000000000..9e8be53c68 --- /dev/null +++ b/spec/ruby/library/net-ftp/abort_spec.rb @@ -0,0 +1,65 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#abort" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the ABOR command to the server" do + -> { @ftp.abort }.should_not.raise + end + + it "ignores the response" do + @ftp.abort + @ftp.last_response.should == "220 Dummy FTP Server ready!\n" + end + + it "returns the full response" do + @ftp.abort.should == "226 Closing data connection. (ABOR)\n" + end + + it "does not raise any error when the response code is 225" do + @server.should_receive(:abor).and_respond("225 Data connection open; no transfer in progress.") + -> { @ftp.abort }.should_not.raise + end + + it "does not raise any error when the response code is 226" do + @server.should_receive(:abor).and_respond("226 Closing data connection.") + -> { @ftp.abort }.should_not.raise + end + + it "raises a Net::FTPProtoError when the response code is 500" do + @server.should_receive(:abor).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.abort }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPProtoError when the response code is 501" do + @server.should_receive(:abor).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.abort }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPProtoError when the response code is 502" do + @server.should_receive(:abor).and_respond("502 Command not implemented.") + -> { @ftp.abort }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPProtoError when the response code is 421" do + @server.should_receive(:abor).and_respond("421 Service not available, closing control connection.") + -> { @ftp.abort }.should.raise(Net::FTPProtoError) + end + end +end diff --git a/spec/ruby/library/net-ftp/acct_spec.rb b/spec/ruby/library/net-ftp/acct_spec.rb new file mode 100644 index 0000000000..a64a0f48a8 --- /dev/null +++ b/spec/ruby/library/net-ftp/acct_spec.rb @@ -0,0 +1,61 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#acct" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "writes the ACCT command to the server" do + @ftp.acct("my_account") + @ftp.last_response.should == "230 User 'my_account' logged in, proceed. (ACCT)\n" + end + + it "returns nil" do + @ftp.acct("my_account").should == nil + end + + it "does not raise any error when the response code is 230" do + @server.should_receive(:acct).and_respond("230 User logged in, proceed.") + -> { @ftp.acct("my_account") }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:acct).and_respond("530 Not logged in.") + -> { @ftp.acct("my_account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:acct).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.acct("my_account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:acct).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.acct("my_account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 503" do + @server.should_receive(:acct).and_respond("503 Bad sequence of commands.") + -> { @ftp.acct("my_account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:acct).and_respond("421 Service not available, closing control connection.") + -> { @ftp.acct("my_account") }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/binary_spec.rb b/spec/ruby/library/net-ftp/binary_spec.rb new file mode 100644 index 0000000000..de8d0ac103 --- /dev/null +++ b/spec/ruby/library/net-ftp/binary_spec.rb @@ -0,0 +1,27 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#binary" do + it "returns true when self is in binary mode" do + ftp = Net::FTP.new + ftp.binary.should == true + + ftp.binary = false + ftp.binary.should == false + end + end + + describe "Net::FTP#binary=" do + it "sets self to binary mode when passed true" do + ftp = Net::FTP.new + + ftp.binary = true + ftp.binary.should == true + + ftp.binary = false + ftp.binary.should == false + end + end +end diff --git a/spec/ruby/library/net-ftp/chdir_spec.rb b/spec/ruby/library/net-ftp/chdir_spec.rb new file mode 100644 index 0000000000..f8f352158c --- /dev/null +++ b/spec/ruby/library/net-ftp/chdir_spec.rb @@ -0,0 +1,102 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#chdir" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + describe "when switching to the parent directory" do + it "sends the 'CDUP' command to the server" do + @ftp.chdir("..") + @ftp.last_response.should == "200 Command okay. (CDUP)\n" + end + + it "returns nil" do + @ftp.chdir("..").should == nil + end + + it "does not raise a Net::FTPPermError when the response code is 500" do + @server.should_receive(:cdup).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.chdir("..") }.should_not.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:cdup).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.chdir("..") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:cdup).and_respond("502 Command not implemented.") + -> { @ftp.chdir("..") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:cdup).and_respond("421 Service not available, closing control connection.") + -> { @ftp.chdir("..") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:cdup).and_respond("530 Not logged in.") + -> { @ftp.chdir("..") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:cdup).and_respond("550 Requested action not taken.") + -> { @ftp.chdir("..") }.should.raise(Net::FTPPermError) + end + end + + it "writes the 'CWD' command with the passed directory to the socket" do + @ftp.chdir("test") + @ftp.last_response.should == "200 Command okay. (CWD test)\n" + end + + it "returns nil" do + @ftp.chdir("test").should == nil + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:cwd).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:cwd).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:cwd).and_respond("502 Command not implemented.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:cwd).and_respond("421 Service not available, closing control connection.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:cwd).and_respond("530 Not logged in.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:cwd).and_respond("550 Requested action not taken.") + -> { @ftp.chdir("test") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/close_spec.rb b/spec/ruby/library/net-ftp/close_spec.rb new file mode 100644 index 0000000000..9d5d4c638a --- /dev/null +++ b/spec/ruby/library/net-ftp/close_spec.rb @@ -0,0 +1,33 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#close" do + before :each do + @socket = mock("Socket") + @socket.stub!(:closed?).and_return(false) + @socket.stub!(:read_timeout).and_return(60) + @socket.stub!(:read_timeout=).and_return(3) + + @ftp = Net::FTP.new + @ftp.instance_variable_set(:@sock, @socket) + end + + it "closes the socket" do + @socket.should_receive(:close) + @ftp.close.should == nil + end + + it "does not try to close the socket if it has already been closed" do + @socket.should_receive(:closed?).and_return(true) + @socket.should_not_receive(:close) + @ftp.close.should == nil + end + + it "does not try to close the socket if it is nil" do + @ftp.instance_variable_set(:@sock, nil) + @ftp.close.should == nil + end + end +end diff --git a/spec/ruby/library/net-ftp/closed_spec.rb b/spec/ruby/library/net-ftp/closed_spec.rb new file mode 100644 index 0000000000..1c8693932e --- /dev/null +++ b/spec/ruby/library/net-ftp/closed_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#closed?" do + before :each do + @socket = mock("Socket") + + @ftp = Net::FTP.new + @ftp.instance_variable_set(:@sock, @socket) + end + + it "returns true when the socket is closed" do + @socket.should_receive(:closed?).and_return(true) + @ftp.closed?.should == true + end + + it "returns true when the socket is nil" do + @ftp.instance_variable_set(:@sock, nil) + @ftp.closed?.should == true + end + end +end diff --git a/spec/ruby/library/net-ftp/connect_spec.rb b/spec/ruby/library/net-ftp/connect_spec.rb new file mode 100644 index 0000000000..597381f67c --- /dev/null +++ b/spec/ruby/library/net-ftp/connect_spec.rb @@ -0,0 +1,46 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + # TODO: Add specs for using the SOCKSSocket + describe "Net::FTP#connect" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + end + + after :each do + @server.connect_message = nil + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "tries to connect to the FTP Server on the given host and port" do + -> { @ftp.connect(@server.hostname, @server.server_port) }.should_not.raise + end + + it "returns nil" do + @ftp.connect(@server.hostname, @server.server_port).should == nil + end + + it "does not raise any error when the response code is 220" do + @server.connect_message = "220 Dummy FTP Server ready!" + -> { @ftp.connect(@server.hostname, @server.server_port) }.should_not.raise + end + + it "raises a Net::FTPReplyError when the response code is 120" do + @server.connect_message = "120 Service ready in nnn minutes." + -> { @ftp.connect(@server.hostname, @server.server_port) }.should.raise(Net::FTPReplyError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.connect_message = "421 Service not available, closing control connection." + -> { @ftp.connect(@server.hostname, @server.server_port) }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/debug_mode_spec.rb b/spec/ruby/library/net-ftp/debug_mode_spec.rb new file mode 100644 index 0000000000..28765b9d1c --- /dev/null +++ b/spec/ruby/library/net-ftp/debug_mode_spec.rb @@ -0,0 +1,26 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#debug_mode" do + it "returns true when self is in debug mode" do + ftp = Net::FTP.new + ftp.debug_mode.should == false + + ftp.debug_mode = true + ftp.debug_mode.should == true + end + end + + describe "Net::FTP#debug_mode=" do + it "sets self into debug mode when passed true" do + ftp = Net::FTP.new + ftp.debug_mode = true + ftp.debug_mode.should == true + + ftp.debug_mode = false + ftp.debug_mode.should == false + end + end +end diff --git a/spec/ruby/library/net-ftp/default_passive_spec.rb b/spec/ruby/library/net-ftp/default_passive_spec.rb new file mode 100644 index 0000000000..b47b4e9782 --- /dev/null +++ b/spec/ruby/library/net-ftp/default_passive_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#default_passive" do + it "is true by default" do + ruby_exe(fixture(__FILE__, "default_passive.rb")).should == "true\ntrue\n" + end + end +end diff --git a/spec/ruby/library/net-ftp/delete_spec.rb b/spec/ruby/library/net-ftp/delete_spec.rb new file mode 100644 index 0000000000..40cd8f1d99 --- /dev/null +++ b/spec/ruby/library/net-ftp/delete_spec.rb @@ -0,0 +1,62 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#delete" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the DELE command with the passed filename to the server" do + @ftp.delete("test.file") + @ftp.last_response.should == "250 Requested file action okay, completed. (DELE test.file)\n" + end + + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:dele).and_respond("450 Requested file action not taken.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:dele).and_respond("550 Requested action not taken.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:dele).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:dele).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:dele).and_respond("502 Command not implemented.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:dele).and_respond("421 Service not available, closing control connection.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:dele).and_respond("530 Not logged in.") + -> { @ftp.delete("test.file") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/dir_spec.rb b/spec/ruby/library/net-ftp/dir_spec.rb new file mode 100644 index 0000000000..af38724fad --- /dev/null +++ b/spec/ruby/library/net-ftp/dir_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/list' + + describe "Net::FTP#dir" do + it_behaves_like :net_ftp_list, :dir + end +end diff --git a/spec/ruby/library/net/ftp/fixtures/default_passive.rb b/spec/ruby/library/net-ftp/fixtures/default_passive.rb index b6995d6f34..b6995d6f34 100644 --- a/spec/ruby/library/net/ftp/fixtures/default_passive.rb +++ b/spec/ruby/library/net-ftp/fixtures/default_passive.rb diff --git a/spec/ruby/library/net/ftp/fixtures/passive.rb b/spec/ruby/library/net-ftp/fixtures/passive.rb index 6b5cde82df..6b5cde82df 100644 --- a/spec/ruby/library/net/ftp/fixtures/passive.rb +++ b/spec/ruby/library/net-ftp/fixtures/passive.rb diff --git a/spec/ruby/library/net/ftp/fixtures/putbinaryfile b/spec/ruby/library/net-ftp/fixtures/putbinaryfile index f3130c6e43..f3130c6e43 100644 --- a/spec/ruby/library/net/ftp/fixtures/putbinaryfile +++ b/spec/ruby/library/net-ftp/fixtures/putbinaryfile diff --git a/spec/ruby/library/net/ftp/fixtures/puttextfile b/spec/ruby/library/net-ftp/fixtures/puttextfile index b4f3b2b62d..b4f3b2b62d 100644 --- a/spec/ruby/library/net/ftp/fixtures/puttextfile +++ b/spec/ruby/library/net-ftp/fixtures/puttextfile diff --git a/spec/ruby/library/net-ftp/fixtures/server.rb b/spec/ruby/library/net-ftp/fixtures/server.rb new file mode 100644 index 0000000000..9fc2beb57b --- /dev/null +++ b/spec/ruby/library/net-ftp/fixtures/server.rb @@ -0,0 +1,279 @@ +ruby_version_is ""..."4.1" do + module NetFTPSpecs + class DummyFTP + attr_accessor :connect_message + attr_reader :login_user, :login_pass, :login_acct + + # hostname or IP address + attr_reader :hostname + # port number + attr_reader :server_port + + def initialize + @hostname = "127.0.0.1" + @server = TCPServer.new(@hostname, 0) + @server_port = @server.addr[1] + + @handlers = {} + @commands = [] + @connect_message = nil + end + + def serve_once + @thread = Thread.new do + @socket = @server.accept + @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, 1) + begin + handle_request + ensure + @socket.close + end + end + end + + def handle_request + # Send out the welcome message. + response @connect_message || "220 Dummy FTP Server ready!" + + begin + while command = @socket.gets + command, argument = command.chomp.split(" ", 2) + + if command == "QUIT" + self.response("221 OK, bye") + break + elsif proc_handler = @handlers[command.downcase.to_sym] + if argument.nil? + proc_handler.call(self) + else + proc_handler.call(self, argument) + end + else + if argument.nil? + self.send(command.downcase.to_sym) + else + self.send(command.downcase.to_sym, argument) + end + end + end + rescue => e + self.error_response("Exception: #{e} #{e.backtrace.inspect}") + end + end + + def error_response(text) + self.response("451 #{text}") + end + + def response(text) + @socket.puts(text) unless @socket.closed? + end + + def stop + @datasocket.close unless @datasocket.nil? || @datasocket.closed? + @server.close + @thread.join + end + + + ## + def handle(sym, &block) + @handlers[sym] = block + end + + def should_receive(method) + @handler_for = method + self + end + + def and_respond(text) + @handlers[@handler_for] = -> s, *args { s.response(text) } + end + + ## + # FTP methods + ## + + def abor + self.response("226 Closing data connection. (ABOR)") + end + + def acct(account) + @login_acct = account + self.response("230 User '#{account}' logged in, proceed. (ACCT)") + end + + def cdup + self.response("200 Command okay. (CDUP)") + end + + def cwd(dir) + self.response("200 Command okay. (CWD #{dir})") + end + + def dele(file) + self.response("250 Requested file action okay, completed. (DELE #{file})") + end + + def eprt(arg) + _, _, host, port = arg.split("|") + + @datasocket = TCPSocket.new(host, port) + self.response("200 port opened") + end + + def help(param = :default) + if param == :default + self.response("211 System status, or system help reply. (HELP)") + else + self.response("211 System status, or system help reply. (HELP #{param})") + end + end + + def list(folder) + self.response("150 opening ASCII connection for file list") + @datasocket.puts("-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb") + @datasocket.puts("-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb") + @datasocket.puts("-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb") + @datasocket.close() + self.response("226 transfer complete (LIST #{folder})") + end + + def mdtm(filename) + self.response("213 19980705132316") + end + + def mkd(foldername) + self.response(%Q{257 "#{foldername.gsub('"', '""')}" created.}) + end + + def nlst(folder = nil) + self.response("150 opening ASCII connection for file list") + @datasocket.puts("last_response_code.rb") + @datasocket.puts("list.rb") + @datasocket.puts("pwd.rb") + @datasocket.close() + self.response("226 transfer complete (NLST#{folder ? " #{folder}" : ""})") + end + + def noop + self.response("200 Command okay. (NOOP)") + end + + def pass(password) + @login_pass = password + self.response("230 User logged in, proceed. (PASS #{password})") + end + + def port(arg) + nums = arg.split(",") + + if nums[0] == "::1" + # IPv6 + port = nums[1].to_i * 256 + nums[2].to_i + host = nums[0] + else + # IPv4 + port = nums[4].to_i * 256 + nums[5].to_i + host = nums[0..3].join(".") + end + + @datasocket = TCPSocket.new(host, port) + self.response("200 port opened") + end + + def pwd + self.response('257 "/some/dir/" - current directory') + end + + def retr(file) + self.response("125 Data transfer starting") + if @restart_at && @restart_at == 20 + @datasocket.puts("of the file named '#{file}'.") + @restart_at = nil + else + @datasocket.puts("This is the content") + @datasocket.puts("of the file named '#{file}'.") + end + @datasocket.close() + self.response("226 Closing data connection. (RETR #{file})") + end + + def rest(at_bytes) + @restart_at = at_bytes.to_i + self.response("350 Requested file action pending further information. (REST)") + end + + def rmd(folder) + self.response("250 Requested file action okay, completed. (RMD #{folder})") + end + + def rnfr(from) + @rename_from = from + self.response("350 Requested file action pending further information.") + end + + def rnto(to) + self.response("250 Requested file action okay, completed. (Renamed #{@rename_from} to #{to})") + @rename_from = nil + end + + def site(param) + self.response("200 Command okay. (SITE #{param})") + end + + def size(filename) + if filename == "binary" + self.response("213 24") + else + self.response("213 1024") + end + end + + def stat(param = :default) + if param == :default + self.response("211 System status, or system help reply. (STAT)") + else + self.response("211 System status, or system help reply. (STAT #{param})") + end + end + + def stor(file) + tmp_file = tmp("#{file}file", false) + + self.response("125 Data transfer starting.") + + mode = @restart_at ? "a" : "w" + + File.open(tmp_file, mode + "b") do |f| + loop do + data = @datasocket.recv(1024) + break if !data || data.empty? + f << data + end + end + + @datasocket.close() + self.response("200 OK, Data received. (STOR #{file})") + end + + def appe(file) + @restart_at = true + stor(file) + end + + def syst + self.response("215 FTP Dummy Server (SYST)") + end + + def type(type) + self.response("200 TYPE switched to #{type}") + end + + def user(name) + @login_user = name + self.response("230 User logged in, proceed. (USER #{name})") + end + end + end +end diff --git a/spec/ruby/library/net-ftp/get_spec.rb b/spec/ruby/library/net-ftp/get_spec.rb new file mode 100644 index 0000000000..6a8aa3e206 --- /dev/null +++ b/spec/ruby/library/net-ftp/get_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/gettextfile' + require_relative 'shared/getbinaryfile' + + describe "Net::FTP#get (binary mode)" do + before :each do + @binary_mode = true + end + + it_behaves_like :net_ftp_getbinaryfile, :get + end + + describe "Net::FTP#get (text mode)" do + before :each do + @binary_mode = false + end + + it_behaves_like :net_ftp_gettextfile, :get + end +end diff --git a/spec/ruby/library/net-ftp/getbinaryfile_spec.rb b/spec/ruby/library/net-ftp/getbinaryfile_spec.rb new file mode 100644 index 0000000000..6b2d38edf5 --- /dev/null +++ b/spec/ruby/library/net-ftp/getbinaryfile_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/getbinaryfile' + + describe "Net::FTP#getbinaryfile" do + it_behaves_like :net_ftp_getbinaryfile, :getbinaryfile + end +end diff --git a/spec/ruby/library/net-ftp/getdir_spec.rb b/spec/ruby/library/net-ftp/getdir_spec.rb new file mode 100644 index 0000000000..2ff62d399d --- /dev/null +++ b/spec/ruby/library/net-ftp/getdir_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'shared/pwd' + + describe "Net::FTP#getdir" do + it_behaves_like :net_ftp_pwd, :getdir + end +end diff --git a/spec/ruby/library/net-ftp/gettextfile_spec.rb b/spec/ruby/library/net-ftp/gettextfile_spec.rb new file mode 100644 index 0000000000..3bb037663b --- /dev/null +++ b/spec/ruby/library/net-ftp/gettextfile_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/gettextfile' + + describe "Net::FTP#gettextfile" do + it_behaves_like :net_ftp_gettextfile, :gettextfile + end +end diff --git a/spec/ruby/library/net-ftp/help_spec.rb b/spec/ruby/library/net-ftp/help_spec.rb new file mode 100644 index 0000000000..bb52fb9e69 --- /dev/null +++ b/spec/ruby/library/net-ftp/help_spec.rb @@ -0,0 +1,69 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#help" do + def with_connection + yield + end + + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "writes the HELP command to the server" do + @ftp.help + @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" + end + + it "returns the server's response" do + @ftp.help.should == "211 System status, or system help reply. (HELP)\n" + end + + it "writes the HELP command with an optional parameter to the socket" do + @ftp.help("some parameter").should == "211 System status, or system help reply. (HELP some parameter)\n" + end + + it "does not raise any error when the response code is 211" do + @server.should_receive(:help).and_respond("211 System status, or system help reply.") + -> { @ftp.help }.should_not.raise + end + + it "does not raise any error when the response code is 214" do + @server.should_receive(:help).and_respond("214 Help message.") + -> { @ftp.help }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:help).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.help }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:help).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.help }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:help).and_respond("502 Command not implemented.") + -> { @ftp.help }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:help).and_respond("421 Service not available, closing control connection.") + -> { @ftp.help }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/initialize_spec.rb b/spec/ruby/library/net-ftp/initialize_spec.rb new file mode 100644 index 0000000000..9079ad6b79 --- /dev/null +++ b/spec/ruby/library/net-ftp/initialize_spec.rb @@ -0,0 +1,408 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#initialize" do + before :each do + @ftp = Net::FTP.allocate + @ftp.stub!(:connect) + @port_args = [] + @port_args << 21 + end + + it "is private" do + Net::FTP.private_instance_methods(false).should.include?(:initialize) + end + + it "sets self into binary mode" do + @ftp.binary.should == nil + @ftp.send(:initialize) + @ftp.binary.should == true + end + + it "sets self into active mode" do + @ftp.passive.should == nil + @ftp.send(:initialize) + @ftp.passive.should == false + end + + it "sets self into non-debug mode" do + @ftp.debug_mode.should == nil + @ftp.send(:initialize) + @ftp.debug_mode.should == false + end + + it "sets self to not resume file uploads/downloads" do + @ftp.resume.should == nil + @ftp.send(:initialize) + @ftp.resume.should == false + end + + describe "when passed no arguments" do + it "does not try to connect" do + @ftp.should_not_receive(:connect) + @ftp.send(:initialize) + end + end + + describe "when passed host" do + it "tries to connect to the passed host" do + @ftp.should_receive(:connect).with("localhost", *@port_args) + @ftp.send(:initialize, "localhost") + end + end + + describe "when passed host, user" do + it "tries to connect to the passed host" do + @ftp.should_receive(:connect).with("localhost", *@port_args) + @ftp.send(:initialize, "localhost") + end + + it "tries to login with the passed username" do + @ftp.should_receive(:login).with("rubyspec", nil, nil) + @ftp.send(:initialize, "localhost", "rubyspec") + end + end + + describe "when passed host, user, password" do + it "tries to connect to the passed host" do + @ftp.should_receive(:connect).with("localhost", *@port_args) + @ftp.send(:initialize, "localhost") + end + + it "tries to login with the passed username and password" do + @ftp.should_receive(:login).with("rubyspec", "rocks", nil) + @ftp.send(:initialize, "localhost", "rubyspec", "rocks") + end + end + + describe "when passed host, user" do + it "tries to connect to the passed host" do + @ftp.should_receive(:connect).with("localhost", *@port_args) + @ftp.send(:initialize, "localhost") + end + + it "tries to login with the passed username, password and account" do + @ftp.should_receive(:login).with("rubyspec", "rocks", "account") + @ftp.send(:initialize, "localhost", "rubyspec", "rocks", "account") + end + end + + before :each do + @ftp.stub!(:login) + end + + describe 'when the host' do + describe 'is set' do + describe 'and port option' do + describe 'is set' do + it 'tries to connect to the host on the specified port' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ port: 8080 }) + @ftp.should_receive(:connect).with('localhost', 8080) + + @ftp.send(:initialize, 'localhost', options) + end + end + + describe 'is not set' do + it 'tries to connect to the host without a port' do + @ftp.should_receive(:connect).with("localhost", *@port_args) + + @ftp.send(:initialize, 'localhost') + end + end + end + + describe 'when the username option' do + describe 'is set' do + describe 'and the password option' do + describe 'is set' do + describe 'and the account option' do + describe 'is set' do + it 'tries to log in with the supplied parameters' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ username: 'a', password: 'topsecret', account: 'b' }) + @ftp.should_receive(:login).with('a', 'topsecret', 'b') + + @ftp.send(:initialize, 'localhost', options) + end + end + + describe 'is unset' do + it 'tries to log in with the supplied parameters' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ username: 'a', password: 'topsecret' }) + @ftp.should_receive(:login).with('a', 'topsecret', nil) + + @ftp.send(:initialize, 'localhost', options) + end + end + end + end + + describe 'is unset' do + describe 'and the account option' do + describe 'is set' do + it 'tries to log in with the supplied parameters' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ username: 'a', account: 'b' }) + @ftp.should_receive(:login).with('a', nil, 'b') + + @ftp.send(:initialize, 'localhost', options) + end + end + + describe 'is unset' do + it 'tries to log in with the supplied parameters' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ username: 'a'}) + @ftp.should_receive(:login).with('a', nil, nil) + + @ftp.send(:initialize, 'localhost', options) + end + end + end + end + end + end + + describe 'is not set' do + it 'does not try to log in' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({}) + @ftp.should_not_receive(:login) + + @ftp.send(:initialize, 'localhost', options) + end + end + end + end + + describe 'is unset' do + it 'does not try to connect' do + @ftp.should_not_receive(:connect) + + @ftp.send(:initialize) + end + + it 'does not try to log in' do + @ftp.should_not_receive(:login) + + @ftp.send(:initialize) + end + end + end + + describe 'when the passive option' do + describe 'is set' do + describe 'to true' do + it 'sets passive to true' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ passive: true }) + + @ftp.send(:initialize, nil, options) + @ftp.passive.should == true + end + end + + describe 'to false' do + it 'sets passive to false' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ passive: false }) + + @ftp.send(:initialize, nil, options) + @ftp.passive.should == false + end + end + end + + describe 'is unset' do + it 'sets passive to false' do + @ftp.send(:initialize) + @ftp.passive.should == false + end + end + end + + describe 'when the debug_mode option' do + describe 'is set' do + describe 'to true' do + it 'sets debug_mode to true' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ debug_mode: true }) + + @ftp.send(:initialize, nil, options) + @ftp.debug_mode.should == true + end + end + + describe 'to false' do + it 'sets debug_mode to false' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ debug_mode: false }) + + @ftp.send(:initialize, nil, options) + @ftp.debug_mode.should == false + end + end + end + + describe 'is unset' do + it 'sets debug_mode to false' do + @ftp.send(:initialize) + @ftp.debug_mode.should == false + end + end + end + + describe 'when the open_timeout option' do + describe 'is set' do + it 'sets open_timeout to the specified value' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ open_timeout: 42 }) + + @ftp.send(:initialize, nil, options) + @ftp.open_timeout.should == 42 + end + end + + describe 'is not set' do + it 'sets open_timeout to nil' do + @ftp.send(:initialize) + @ftp.open_timeout.should == nil + end + end + end + + describe 'when the read_timeout option' do + describe 'is set' do + it 'sets read_timeout to the specified value' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ read_timeout: 100 }) + + @ftp.send(:initialize, nil, options) + @ftp.read_timeout.should == 100 + end + end + + describe 'is not set' do + it 'sets read_timeout to the default value' do + @ftp.send(:initialize) + @ftp.read_timeout.should == 60 + end + end + end + + describe 'when the ssl_handshake_timeout option' do + describe 'is set' do + it 'sets ssl_handshake_timeout to the specified value' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ ssl_handshake_timeout: 23 }) + + @ftp.send(:initialize, nil, options) + @ftp.ssl_handshake_timeout.should == 23 + end + end + + describe 'is not set' do + it 'sets ssl_handshake_timeout to nil' do + @ftp.send(:initialize) + @ftp.ssl_handshake_timeout.should == nil + end + end + end + + describe 'when the ssl option' do + describe 'is set' do + describe "and the ssl option's value is true" do + it 'initializes ssl_context to a blank SSLContext object' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ ssl: true }) + + ssl_context = OpenSSL::SSL::SSLContext.allocate + ssl_context.stub!(:set_params) + + OpenSSL::SSL::SSLContext.should_receive(:new).and_return(ssl_context) + ssl_context.should_receive(:set_params).with({}) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@ssl_context).should == ssl_context + end + end + + describe "and the ssl option's value is a hash" do + it 'initializes ssl_context to a configured SSLContext object' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ ssl: {key: 'value'} }) + + ssl_context = OpenSSL::SSL::SSLContext.allocate + ssl_context.stub!(:set_params) + + OpenSSL::SSL::SSLContext.should_receive(:new).and_return(ssl_context) + ssl_context.should_receive(:set_params).with({key: 'value'}) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@ssl_context).should == ssl_context + end + end + + describe 'and private_data_connection' do + describe 'is set' do + it 'sets private_data_connection to that value' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ ssl: true, private_data_connection: 'true' }) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@private_data_connection).should == 'true' + end + end + + describe 'is not set' do + it 'sets private_data_connection to nil' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ ssl: true }) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@private_data_connection).should == true + end + end + end + end + + describe 'is not set' do + it 'sets ssl_context to nil' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({}) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@ssl_context).should == nil + end + + describe 'private_data_connection' do + describe 'is set' do + it 'raises an ArgumentError' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({ private_data_connection: true }) + + -> { + @ftp.send(:initialize, nil, options) + }.should.raise(ArgumentError, /private_data_connection can be set to true only when ssl is enabled/) + end + end + + describe 'is not set' do + it 'sets private_data_connection to false' do + options = mock('ftp initialize options') + options.should_receive(:to_hash).and_return({}) + + @ftp.send(:initialize, nil, options) + @ftp.instance_variable_get(:@private_data_connection).should == false + end + end + end + end + end + end +end diff --git a/spec/ruby/library/net-ftp/last_response_code_spec.rb b/spec/ruby/library/net-ftp/last_response_code_spec.rb new file mode 100644 index 0000000000..03329758b5 --- /dev/null +++ b/spec/ruby/library/net-ftp/last_response_code_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'shared/last_response_code' + require_relative 'fixtures/server' + + describe "Net::FTP#last_response_code" do + it_behaves_like :net_ftp_last_response_code, :last_response_code + end +end diff --git a/spec/ruby/library/net-ftp/last_response_spec.rb b/spec/ruby/library/net-ftp/last_response_spec.rb new file mode 100644 index 0000000000..7cda9fa7a4 --- /dev/null +++ b/spec/ruby/library/net-ftp/last_response_spec.rb @@ -0,0 +1,28 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#last_response" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "returns the last response" do + @ftp.last_response.should == "220 Dummy FTP Server ready!\n" + @ftp.help + @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" + end + end +end diff --git a/spec/ruby/library/net-ftp/lastresp_spec.rb b/spec/ruby/library/net-ftp/lastresp_spec.rb new file mode 100644 index 0000000000..c373670ec4 --- /dev/null +++ b/spec/ruby/library/net-ftp/lastresp_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'shared/last_response_code' + require_relative 'fixtures/server' + + describe "Net::FTP#lastresp" do + it_behaves_like :net_ftp_last_response_code, :lastresp + end +end diff --git a/spec/ruby/library/net-ftp/list_spec.rb b/spec/ruby/library/net-ftp/list_spec.rb new file mode 100644 index 0000000000..297d100dd9 --- /dev/null +++ b/spec/ruby/library/net-ftp/list_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/list' + + describe "Net::FTP#list" do + it_behaves_like :net_ftp_list, :list + end +end diff --git a/spec/ruby/library/net-ftp/login_spec.rb b/spec/ruby/library/net-ftp/login_spec.rb new file mode 100644 index 0000000000..05bb6b7f81 --- /dev/null +++ b/spec/ruby/library/net-ftp/login_spec.rb @@ -0,0 +1,198 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#login" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + describe "when passed no arguments" do + it "sends the USER command with 'anonymous' as name to the server" do + @ftp.login + @server.login_user.should == "anonymous" + end + + it "sends 'anonymous@' as a password when required" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @ftp.login + @server.login_pass.should == "anonymous@" + end + + it "raises a Net::FTPReplyError when the server requests an account" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @server.should_receive(:pass).and_respond("332 Need account for login.") + -> { @ftp.login }.should.raise(Net::FTPReplyError) + end + end + + describe "when passed name" do + it "sends the USER command with the passed name to the server" do + @ftp.login("rubyspec") + @server.login_user.should == "rubyspec" + end + + it "raises a Net::FTPReplyError when the server requests a password, but none was given" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + -> { @ftp.login("rubyspec") }.should.raise(Net::FTPReplyError) + end + + it "raises a Net::FTPReplyError when the server requests an account, but none was given" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @server.should_receive(:pass).and_respond("332 Need account for login.") + -> { @ftp.login("rubyspec") }.should.raise(Net::FTPReplyError) + end + end + + describe "when passed name, password" do + it "sends the USER command with the passed name to the server" do + @ftp.login("rubyspec", "rocks") + @server.login_user.should == "rubyspec" + end + + it "sends the passed password when required" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @ftp.login("rubyspec", "rocks") + @server.login_pass.should == "rocks" + end + + it "raises a Net::FTPReplyError when the server requests an account" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @server.should_receive(:pass).and_respond("332 Need account for login.") + -> { @ftp.login("rubyspec", "rocks") }.should.raise(Net::FTPReplyError) + end + end + + describe "when passed name, password, account" do + it "sends the USER command with the passed name to the server" do + @ftp.login("rubyspec", "rocks", "account") + @server.login_user.should == "rubyspec" + end + + it "sends the passed password when required" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @ftp.login("rubyspec", "rocks", "account") + @server.login_pass.should == "rocks" + end + + it "sends the passed account when required" do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @server.should_receive(:pass).and_respond("332 Need account for login.") + @ftp.login("rubyspec", "rocks", "account") + @server.login_acct.should == "account" + end + end + + describe "when the USER command fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:user).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:user).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:user).and_respond("502 Command not implemented.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:user).and_respond("421 Service not available, closing control connection.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:user).and_respond("530 Not logged in.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + end + + describe "when the PASS command fails" do + before :each do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + end + + it "does not raise an Error when the response code is 202" do + @server.should_receive(:pass).and_respond("202 Command not implemented, superfluous at this site.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:pass).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:pass).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:pass).and_respond("502 Command not implemented.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:pass).and_respond("421 Service not available, closing control connection.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:pass).and_respond("530 Not logged in.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + end + + describe "when the ACCT command fails" do + before :each do + @server.should_receive(:user).and_respond("331 User name okay, need password.") + @server.should_receive(:pass).and_respond("332 Need account for login.") + end + + it "does not raise an Error when the response code is 202" do + @server.should_receive(:acct).and_respond("202 Command not implemented, superfluous at this site.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:acct).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:acct).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:acct).and_respond("502 Command not implemented.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:acct).and_respond("421 Service not available, closing control connection.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:acct).and_respond("530 Not logged in.") + -> { @ftp.login("rubyspec", "rocks", "account") }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/ls_spec.rb b/spec/ruby/library/net-ftp/ls_spec.rb new file mode 100644 index 0000000000..f8fdb10e8f --- /dev/null +++ b/spec/ruby/library/net-ftp/ls_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/list' + + describe "Net::FTP#ls" do + it_behaves_like :net_ftp_list, :ls + end +end diff --git a/spec/ruby/library/net-ftp/mdtm_spec.rb b/spec/ruby/library/net-ftp/mdtm_spec.rb new file mode 100644 index 0000000000..effd22a6e4 --- /dev/null +++ b/spec/ruby/library/net-ftp/mdtm_spec.rb @@ -0,0 +1,41 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#mdtm" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the MDTM with the passed filename command to the server" do + @ftp.mdtm("test.file") + @ftp.last_response.should == "213 19980705132316\n" + end + + it "returns the last modification time of the passed file" do + @ftp.mdtm("test.file").should == "19980705132316" + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:mdtm).and_respond("550 Requested action not taken.") + -> { @ftp.mdtm("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:mdtm).and_respond("421 Service not available, closing control connection.") + -> { @ftp.mdtm("test.file") }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/mkdir_spec.rb b/spec/ruby/library/net-ftp/mkdir_spec.rb new file mode 100644 index 0000000000..6daeb7c022 --- /dev/null +++ b/spec/ruby/library/net-ftp/mkdir_spec.rb @@ -0,0 +1,64 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#mkdir" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the MKD command with the passed pathname to the server" do + @ftp.mkdir("test.folder") + @ftp.last_response.should == %{257 "test.folder" created.\n} + end + + it "returns the path to the newly created directory" do + @ftp.mkdir("test.folder").should == "test.folder" + @ftp.mkdir("/absolute/path/to/test.folder").should == "/absolute/path/to/test.folder" + @ftp.mkdir("relative/path/to/test.folder").should == "relative/path/to/test.folder" + @ftp.mkdir('/usr/dm/foo"bar').should == '/usr/dm/foo"bar' + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:mkd).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:mkd).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:mkd).and_respond("502 Command not implemented.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:mkd).and_respond("421 Service not available, closing control connection.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:mkd).and_respond("530 Not logged in.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:mkd).and_respond("550 Requested action not taken.") + -> { @ftp.mkdir("test.folder") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/mtime_spec.rb b/spec/ruby/library/net-ftp/mtime_spec.rb new file mode 100644 index 0000000000..694036a296 --- /dev/null +++ b/spec/ruby/library/net-ftp/mtime_spec.rb @@ -0,0 +1,53 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#mtime" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the MDTM with the passed filename command to the server" do + @ftp.mtime("test.file") + @ftp.last_response.should == "213 19980705132316\n" + end + + describe "when passed filename" do + it "returns the last modification time of the passed file as a Time object in the local time" do + @ftp.mtime("test.file").should == Time.gm("1998", "07", "05", "13", "23", "16") + end + end + + describe "when passed filename, local_time" do + it "returns the last modification time as a Time object in UTC when local_time is true" do + @ftp.mtime("test.file", true).should == Time.local("1998", "07", "05", "13", "23", "16") + end + + it "returns the last modification time as a Time object in the local time when local_time is false" do + @ftp.mtime("test.file", false).should == Time.gm("1998", "07", "05", "13", "23", "16") + end + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:mdtm).and_respond("550 Requested action not taken.") + -> { @ftp.mtime("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:mdtm).and_respond("421 Service not available, closing control connection.") + -> { @ftp.mtime("test.file") }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/nlst_spec.rb b/spec/ruby/library/net-ftp/nlst_spec.rb new file mode 100644 index 0000000000..87b80b43fd --- /dev/null +++ b/spec/ruby/library/net-ftp/nlst_spec.rb @@ -0,0 +1,95 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#nlst" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.passive = false + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + describe "when passed no arguments" do + it "returns an Array containing a list of files in the current dir" do + @ftp.nlst.should == ["last_response_code.rb", "list.rb", "pwd.rb"] + @ftp.last_response.should == "226 transfer complete (NLST)\n" + end + end + + describe "when passed dir" do + it "returns an Array containing a list of files in the passed dir" do + @ftp.nlst("test.folder").should == ["last_response_code.rb", "list.rb", "pwd.rb"] + @ftp.last_response.should == "226 transfer complete (NLST test.folder)\n" + end + end + + describe "when the NLST command fails" do + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:nlst).and_respond("450 Requested file action not taken..") + -> { @ftp.nlst }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:nlst).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:nlst).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:nlst).and_respond("502 Command not implemented.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:nlst).and_respond("421 Service not available, closing control connection.") + -> { @ftp.nlst }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:nlst).and_respond("530 Not logged in.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.nlst }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.nlst }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/noop_spec.rb b/spec/ruby/library/net-ftp/noop_spec.rb new file mode 100644 index 0000000000..43c48e355a --- /dev/null +++ b/spec/ruby/library/net-ftp/noop_spec.rb @@ -0,0 +1,41 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#noop" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the NOOP command to the server" do + @ftp.noop + @ftp.last_response.should == "200 Command okay. (NOOP)\n" + end + + it "returns nil" do + @ftp.noop.should == nil + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:noop).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.noop }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:noop).and_respond("421 Service not available, closing control connection.") + -> { @ftp.noop }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/open_spec.rb b/spec/ruby/library/net-ftp/open_spec.rb new file mode 100644 index 0000000000..2d6477ec4d --- /dev/null +++ b/spec/ruby/library/net-ftp/open_spec.rb @@ -0,0 +1,58 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP.open" do + before :each do + @ftp = mock("Net::FTP instance") + Net::FTP.stub!(:new).and_return(@ftp) + end + + describe "when passed no block" do + it "returns a new Net::FTP instance" do + Net::FTP.open("localhost").should.equal?(@ftp) + end + + it "passes the passed arguments down to Net::FTP.new" do + Net::FTP.should_receive(:new).with("localhost", "user", "password", "account") + Net::FTP.open("localhost", "user", "password", "account") + end + end + + describe "when passed a block" do + before :each do + @ftp.stub!(:close) + end + + it "yields a new Net::FTP instance to the passed block" do + yielded = false + Net::FTP.open("localhost") do |ftp| + yielded = true + ftp.should.equal?(@ftp) + end + yielded.should == true + end + + it "closes the Net::FTP instance after yielding" do + Net::FTP.open("localhost") do |ftp| + ftp.should_receive(:close) + end + end + + it "closes the Net::FTP instance even if an exception is raised while yielding" do + begin + Net::FTP.open("localhost") do |ftp| + ftp.should_receive(:close) + raise ArgumentError, "some exception" + end + rescue ArgumentError + end + end + + it "returns the block's return value" do + Net::FTP.open("localhost") { :test }.should == :test + end + end + end +end diff --git a/spec/ruby/library/net-ftp/passive_spec.rb b/spec/ruby/library/net-ftp/passive_spec.rb new file mode 100644 index 0000000000..6acabd3f98 --- /dev/null +++ b/spec/ruby/library/net-ftp/passive_spec.rb @@ -0,0 +1,31 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#passive" do + it "returns true when self is in passive mode" do + ftp = Net::FTP.new + ftp.passive.should == false + + ftp.passive = true + ftp.passive.should == true + end + + it "is the value of Net::FTP.default_value by default" do + ruby_exe(fixture(__FILE__, "passive.rb")).should == "true" + end + end + + describe "Net::FTP#passive=" do + it "sets self to passive mode when passed true" do + ftp = Net::FTP.new + + ftp.passive = true + ftp.passive.should == true + + ftp.passive = false + ftp.passive.should == false + end + end +end diff --git a/spec/ruby/library/net-ftp/put_spec.rb b/spec/ruby/library/net-ftp/put_spec.rb new file mode 100644 index 0000000000..603409e283 --- /dev/null +++ b/spec/ruby/library/net-ftp/put_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/puttextfile' + require_relative 'shared/putbinaryfile' + + describe "Net::FTP#put (binary mode)" do + before :each do + @binary_mode = true + end + + it_behaves_like :net_ftp_putbinaryfile, :put + end + + describe "Net::FTP#put (text mode)" do + before :each do + @binary_mode = false + end + + it_behaves_like :net_ftp_puttextfile, :put + end +end diff --git a/spec/ruby/library/net-ftp/putbinaryfile_spec.rb b/spec/ruby/library/net-ftp/putbinaryfile_spec.rb new file mode 100644 index 0000000000..ce8a6f0473 --- /dev/null +++ b/spec/ruby/library/net-ftp/putbinaryfile_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/putbinaryfile' + + describe "Net::FTP#putbinaryfile" do + it_behaves_like :net_ftp_putbinaryfile, :putbinaryfile + end +end diff --git a/spec/ruby/library/net-ftp/puttextfile_spec.rb b/spec/ruby/library/net-ftp/puttextfile_spec.rb new file mode 100644 index 0000000000..b4ab86aab1 --- /dev/null +++ b/spec/ruby/library/net-ftp/puttextfile_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + require_relative 'shared/puttextfile' + + describe "Net::FTP#puttextfile" do + it_behaves_like :net_ftp_puttextfile, :puttextfile + end +end diff --git a/spec/ruby/library/net-ftp/pwd_spec.rb b/spec/ruby/library/net-ftp/pwd_spec.rb new file mode 100644 index 0000000000..53692b553f --- /dev/null +++ b/spec/ruby/library/net-ftp/pwd_spec.rb @@ -0,0 +1,56 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#pwd" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the PWD command to the server" do + @ftp.pwd + @ftp.last_response.should == "257 \"/some/dir/\" - current directory\n" + end + + it "returns the current directory" do + @ftp.pwd.should == "/some/dir/" + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:pwd).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.pwd }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:pwd).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.pwd }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:pwd).and_respond("502 Command not implemented.") + -> { @ftp.pwd }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:pwd).and_respond("421 Service not available, closing control connection.") + -> { @ftp.pwd }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:pwd).and_respond("550 Requested action not taken.") + -> { @ftp.pwd }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/quit_spec.rb b/spec/ruby/library/net-ftp/quit_spec.rb new file mode 100644 index 0000000000..1af0107d34 --- /dev/null +++ b/spec/ruby/library/net-ftp/quit_spec.rb @@ -0,0 +1,36 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#quit" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the QUIT command to the server" do + @ftp.quit + @ftp.last_response.should == "221 OK, bye\n" + end + + it "does not close the socket automatically" do + @ftp.quit + @ftp.closed?.should == false + end + + it "returns nil" do + @ftp.quit.should == nil + end + end +end diff --git a/spec/ruby/library/net-ftp/rename_spec.rb b/spec/ruby/library/net-ftp/rename_spec.rb new file mode 100644 index 0000000000..6541fe5301 --- /dev/null +++ b/spec/ruby/library/net-ftp/rename_spec.rb @@ -0,0 +1,97 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#rename" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + describe "when passed from_name, to_name" do + it "sends the RNFR command with the passed from_name and the RNTO command with the passed to_name to the server" do + @ftp.rename("from.file", "to.file") + @ftp.last_response.should == "250 Requested file action okay, completed. (Renamed from.file to to.file)\n" + end + + it "returns something" do + @ftp.rename("from.file", "to.file").should == nil + end + end + + describe "when the RNFR command fails" do + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:rnfr).and_respond("450 Requested file action not taken.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:rnfr).and_respond("550 Requested action not taken.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:rnfr).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:rnfr).and_respond("502 Command not implemented.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:rnfr).and_respond("421 Service not available, closing control connection.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:rnfr).and_respond("530 Not logged in.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + end + + describe "when the RNTO command fails" do + it "raises a Net::FTPPermError when the response code is 532" do + @server.should_receive(:rnfr).and_respond("532 Need account for storing files.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 553" do + @server.should_receive(:rnto).and_respond("553 Requested action not taken.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:rnto).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:rnto).and_respond("502 Command not implemented.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:rnto).and_respond("421 Service not available, closing control connection.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:rnto).and_respond("530 Not logged in.") + -> { @ftp.rename("from.file", "to.file") }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/resume_spec.rb b/spec/ruby/library/net-ftp/resume_spec.rb new file mode 100644 index 0000000000..5ec565d155 --- /dev/null +++ b/spec/ruby/library/net-ftp/resume_spec.rb @@ -0,0 +1,26 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#resume" do + it "returns true when self is set to resume uploads/downloads" do + ftp = Net::FTP.new + ftp.resume.should == false + + ftp.resume = true + ftp.resume.should == true + end + end + + describe "Net::FTP#resume=" do + it "sets self to resume uploads/downloads when set to true" do + ftp = Net::FTP.new + ftp.resume = true + ftp.resume.should == true + + ftp.resume = false + ftp.resume.should == false + end + end +end diff --git a/spec/ruby/library/net-ftp/retrbinary_spec.rb b/spec/ruby/library/net-ftp/retrbinary_spec.rb new file mode 100644 index 0000000000..ff8c8098a4 --- /dev/null +++ b/spec/ruby/library/net-ftp/retrbinary_spec.rb @@ -0,0 +1,33 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#retrbinary" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the passed command to the server" do + @ftp.retrbinary("RETR test", 4096) {} + @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" + end + + it "yields the received content as binary blocks of the passed size" do + res = [] + @ftp.retrbinary("RETR test", 10) { |bin| res << bin } + res.should == [ "This is th", "e content\n", "of the fil", "e named 't", "est'.\n" ] + end + end +end diff --git a/spec/ruby/library/net-ftp/retrlines_spec.rb b/spec/ruby/library/net-ftp/retrlines_spec.rb new file mode 100644 index 0000000000..2963da14f7 --- /dev/null +++ b/spec/ruby/library/net-ftp/retrlines_spec.rb @@ -0,0 +1,37 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#retrlines" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the passed command over the socket" do + @ftp.retrlines("LIST test.dir") {} + @ftp.last_response.should == "226 transfer complete (LIST test.dir)\n" + end + + it "yields each received line to the passed block" do + res = [] + @ftp.retrlines("LIST test.dir") { |x| res << x } + res.should == [ + "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", + "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", + "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" + ] + end + end +end diff --git a/spec/ruby/library/net-ftp/return_code_spec.rb b/spec/ruby/library/net-ftp/return_code_spec.rb new file mode 100644 index 0000000000..fcf5a32aa7 --- /dev/null +++ b/spec/ruby/library/net-ftp/return_code_spec.rb @@ -0,0 +1,27 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#return_code" do + before :each do + @ftp = Net::FTP.new + end + + it "outputs a warning and returns a newline" do + -> do + @ftp.return_code.should == "\n" + end.should complain(/warning: Net::FTP#return_code is obsolete and do nothing/) + end + end + + describe "Net::FTP#return_code=" do + before :each do + @ftp = Net::FTP.new + end + + it "outputs a warning" do + -> { @ftp.return_code = 123 }.should complain(/warning: Net::FTP#return_code= is obsolete and do nothing/) + end + end +end diff --git a/spec/ruby/library/net-ftp/rmdir_spec.rb b/spec/ruby/library/net-ftp/rmdir_spec.rb new file mode 100644 index 0000000000..23650ebcc8 --- /dev/null +++ b/spec/ruby/library/net-ftp/rmdir_spec.rb @@ -0,0 +1,61 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#rmdir" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the RMD command with the passed pathname to the server" do + @ftp.rmdir("test.folder") + @ftp.last_response.should == "250 Requested file action okay, completed. (RMD test.folder)\n" + end + + it "returns nil" do + @ftp.rmdir("test.folder").should == nil + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:rmd).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:rmd).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:rmd).and_respond("502 Command not implemented.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:rmd).and_respond("421 Service not available, closing control connection.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:rmd).and_respond("530 Not logged in.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:rmd).and_respond("550 Requested action not taken.") + -> { @ftp.rmdir("test.folder") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/sendcmd_spec.rb b/spec/ruby/library/net-ftp/sendcmd_spec.rb new file mode 100644 index 0000000000..67dbd3bdb8 --- /dev/null +++ b/spec/ruby/library/net-ftp/sendcmd_spec.rb @@ -0,0 +1,57 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#sendcmd" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the passed command to the server" do + @ftp.sendcmd("HELP") + @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" + end + + it "returns the server's response" do + @ftp.sendcmd("HELP").should == "211 System status, or system help reply. (HELP)\n" + end + + it "raises no error when the response code is 1xx, 2xx or 3xx" do + @server.should_receive(:help).and_respond("120 Service ready in nnn minutes.") + -> { @ftp.sendcmd("HELP") }.should_not.raise + + @server.should_receive(:help).and_respond("200 Command okay.") + -> { @ftp.sendcmd("HELP") }.should_not.raise + + @server.should_receive(:help).and_respond("350 Requested file action pending further information.") + -> { @ftp.sendcmd("HELP") }.should_not.raise + end + + it "raises a Net::FTPTempError when the response code is 4xx" do + @server.should_receive(:help).and_respond("421 Service not available, closing control connection.") + -> { @ftp.sendcmd("HELP") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 5xx" do + @server.should_receive(:help).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.sendcmd("HELP") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPProtoError when the response code is not between 1xx-5xx" do + @server.should_receive(:help).and_respond("999 Invalid response.") + -> { @ftp.sendcmd("HELP") }.should.raise(Net::FTPProtoError) + end + end +end diff --git a/spec/ruby/library/net-ftp/set_socket_spec.rb b/spec/ruby/library/net-ftp/set_socket_spec.rb new file mode 100644 index 0000000000..ad83dfcc4f --- /dev/null +++ b/spec/ruby/library/net-ftp/set_socket_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + + describe "Net::FTP#set_socket" do + # TODO: I won't spec this method, as it is not used + # anywhere and it should be private anyway. + it "needs to be reviewed for spec completeness" + end +end diff --git a/spec/ruby/library/net-ftp/shared/getbinaryfile.rb b/spec/ruby/library/net-ftp/shared/getbinaryfile.rb new file mode 100644 index 0000000000..4fc4731c45 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/getbinaryfile.rb @@ -0,0 +1,152 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_getbinaryfile, shared: true do + before :each do + @fixture_file = __dir__ + "/../fixtures/getbinaryfile" + @tmp_file = tmp("getbinaryfile") + + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + @ftp.binary = @binary_mode + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @tmp_file + end + + it "sends the RETR command to the server" do + @ftp.send(@method, "test", @tmp_file) + @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" + end + + it "returns nil" do + @ftp.send(@method, "test", @tmp_file).should == nil + end + + it "saves the contents of the passed remote file to the passed local file" do + @ftp.send(@method, "test", @tmp_file) + File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" + end + + describe "when passed a block" do + it "yields the received content as binary blocks of the passed size" do + res = [] + @ftp.send(@method, "test", @tmp_file, 10) { |bin| res << bin } + res.should == [ "This is th", "e content\n", "of the fil", "e named 't", "est'.\n" ] + end + end + + describe "when resuming an existing file" do + before :each do + @tmp_file = tmp("getbinaryfile_resume") + + File.open(@tmp_file, "wb") do |f| + f << "This is the content\n" + end + + @ftp.resume = true + end + + it "saves the remaining content of the passed remote file to the passed local file" do + @ftp.send(@method, "test", @tmp_file) + File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" + end + + describe "and the REST command fails" do + it "raises a Net::FTPProtoError when the response code is 550" do + @server.should_receive(:rest).and_respond("Requested action not taken.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:rest).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:rest).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:rest).and_respond("502 Command not implemented.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:rest).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:rest).and_respond("530 Not logged in.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + end + end + + describe "when the RETR command fails" do + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:retr).and_respond("450 Requested file action not taken.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPProtoError when the response code is 550" do + @server.should_receive(:retr).and_respond("Requested action not taken.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:retr).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:retr).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:retr).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:retr).and_respond("530 Not logged in.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/gettextfile.rb b/spec/ruby/library/net-ftp/shared/gettextfile.rb new file mode 100644 index 0000000000..562c7a3047 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/gettextfile.rb @@ -0,0 +1,102 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_gettextfile, shared: true do + before :each do + @tmp_file = tmp("gettextfile") + + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + @ftp.binary = @binary_mode + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @tmp_file + end + + it "sends the RETR command to the server" do + @ftp.send(@method, "test", @tmp_file) + @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" + end + + it "returns nil" do + @ftp.send(@method, "test", @tmp_file).should == nil + end + + it "saves the contents of the passed remote file to the passed local file" do + @ftp.send(@method, "test", @tmp_file) + File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" + end + + describe "when passed a block" do + it "yields each line of the retrieved file to the passed block" do + res = [] + @ftp.send(@method, "test", @tmp_file) { |line| res << line } + res.should == [ "This is the content", "of the file named 'test'."] + end + end + + describe "when the RETR command fails" do + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:retr).and_respond("450 Requested file action not taken.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPProtoError when the response code is 550" do + @server.should_receive(:retr).and_respond("Requested action not taken.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:retr).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:retr).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:retr).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:retr).and_respond("530 Not logged in.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.send(@method, "test", @tmp_file) }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/last_response_code.rb b/spec/ruby/library/net-ftp/shared/last_response_code.rb new file mode 100644 index 0000000000..9d36e37f0c --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/last_response_code.rb @@ -0,0 +1,27 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_last_response_code, shared: true do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "returns the response code for the last response" do + @server.should_receive(:help).and_respond("200 Command okay.") + @ftp.help + @ftp.send(@method).should == "200" + + @server.should_receive(:help).and_respond("212 Directory status.") + @ftp.help + @ftp.send(@method).should == "212" + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/list.rb b/spec/ruby/library/net-ftp/shared/list.rb new file mode 100644 index 0000000000..ec372447e8 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/list.rb @@ -0,0 +1,106 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_list, shared: true do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.passive = false + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + describe "when passed a block" do + it "yields each file in the list of files in the passed dir" do + expected = [ + "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", + "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", + "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" + ] + + res = [] + @ftp.send(@method, "test.folder") { |line| res << line} + res.should == expected + + @ftp.last_response.should == "226 transfer complete (LIST test.folder)\n" + end + end + + describe "when passed no block" do + it "returns an Array containing a list of files in the passed dir" do + expected = [ + "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", + "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", + "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" + ] + + @ftp.send(@method, "test.folder").should == expected + + @ftp.last_response.should == "226 transfer complete (LIST test.folder)\n" + end + end + + describe "when the LIST command fails" do + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:list).and_respond("450 Requested file action not taken..") + -> { @ftp.send(@method) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:list).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:list).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:list).and_respond("502 Command not implemented.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:list).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:list).and_respond("530 Not logged in.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method) }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.send(@method) }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/putbinaryfile.rb b/spec/ruby/library/net-ftp/shared/putbinaryfile.rb new file mode 100644 index 0000000000..afbe3c61f8 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/putbinaryfile.rb @@ -0,0 +1,169 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_putbinaryfile, shared: true do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @local_fixture_file = __dir__ + "/../fixtures/putbinaryfile" + @remote_tmp_file = tmp("binaryfile", false) + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + @ftp.binary = @binary_mode + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @remote_tmp_file + end + + it "sends the STOR command to the server" do + @ftp.send(@method, @local_fixture_file, "binary") + @ftp.last_response.should == "200 OK, Data received. (STOR binary)\n" + end + + it "sends the contents of the passed local_file, without modifications" do + @ftp.send(@method, @local_fixture_file, "binary") + + remote_lines = File.readlines(@remote_tmp_file) + local_lines = File.readlines(@local_fixture_file) + + remote_lines.should == local_lines + end + + it "returns nil" do + @ftp.send(@method, @local_fixture_file, "binary").should == nil + end + + describe "when passed a block" do + it "yields the transmitted content as binary blocks of the passed size" do + res = [] + @ftp.send(@method, @local_fixture_file, "binary", 10) { |x| res << x } + res.should == [ + "This is an", " example f", + "ile\nwhich ", "is going t", + "o be trans", "mitted\nusi", + "ng #putbin", "aryfile.\n" + ] + end + end + + describe "when resuming an existing file" do + before :each do + File.open(@remote_tmp_file, "w") do |f| + f << "This is an example file\n" + end + + @ftp.resume = true + end + + it "sends the remaining content of the passed local_file to the passed remote_file" do + @ftp.send(@method, @local_fixture_file, "binary") + File.read(@remote_tmp_file).should == File.read(@local_fixture_file) + end + + describe "and the APPE command fails" do + it "raises a Net::FTPProtoError when the response code is 550" do + @server.should_receive(:appe).and_respond("Requested action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPProtoError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:appe).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:appe).and_respond("501 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:appe).and_respond("502 Command not implemented.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:appe).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:appe).and_respond("530 Not logged in.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + end + end + + describe "when the STOR command fails" do + it "raises a Net::FTPPermError when the response code is 532" do + @server.should_receive(:stor).and_respond("532 Need account for storing files.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:stor).and_respond("450 Requested file action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPTempError when the response code is 452" do + @server.should_receive(:stor).and_respond("452 Requested action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 553" do + @server.should_receive(:stor).and_respond("553 Requested action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:stor).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:stor).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:stor).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:stor).and_respond("530 Not logged in.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.send(@method, @local_fixture_file, "binary") }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/puttextfile.rb b/spec/ruby/library/net-ftp/shared/puttextfile.rb new file mode 100644 index 0000000000..3650cad230 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/puttextfile.rb @@ -0,0 +1,130 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_puttextfile, shared: true do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @local_fixture_file = __dir__ + "/../fixtures/puttextfile" + @remote_tmp_file = tmp("textfile", false) + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + @ftp.binary = @binary_mode + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @remote_tmp_file + end + + it "sends the STOR command to the server" do + @ftp.send(@method, @local_fixture_file, "text") + @ftp.last_response.should == "200 OK, Data received. (STOR text)\n" + end + + it "sends the contents of the passed local_file, using \\r\\n as the newline separator" do + @ftp.send(@method, @local_fixture_file, "text") + + remote_lines = File.binread(@remote_tmp_file) + local_lines = File.binread(@local_fixture_file) + + remote_lines.should_not == local_lines + remote_lines.should == local_lines.gsub("\n", "\r\n") + end + + guard -> { Net::FTP::VERSION < '0.3.6' } do + it "returns nil" do + @ftp.send(@method, @local_fixture_file, "text").should == nil + end + end + + guard -> { Net::FTP::VERSION >= '0.3.6' } do + it "returns the response" do + @ftp.send(@method, @local_fixture_file, "text").should == @ftp.last_response + end + end + + describe "when passed a block" do + it "yields each transmitted line" do + res = [] + @ftp.send(@method, @local_fixture_file, "text") { |x| res << x } + res.should == [ + "This is an example file\r\n", + "which is going to be transmitted\r\n", + "using #puttextfile.\r\n" + ] + end + end + + describe "when the STOR command fails" do + it "raises a Net::FTPPermError when the response code is 532" do + @server.should_receive(:stor).and_respond("532 Need account for storing files.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 450" do + @server.should_receive(:stor).and_respond("450 Requested file action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPTempError when the response code is 452" do + @server.should_receive(:stor).and_respond("452 Requested action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 553" do + @server.should_receive(:stor).and_respond("553 Requested action not taken.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:stor).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:stor).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:stor).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:stor).and_respond("530 Not logged in.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + end + + describe "when opening the data port fails" do + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") + @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") + @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") + @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:eprt).and_respond("530 Not logged in.") + @server.should_receive(:port).and_respond("530 Not logged in.") + -> { @ftp.send(@method, @local_fixture_file, "text") }.should.raise(Net::FTPPermError) + end + end + end +end diff --git a/spec/ruby/library/net-ftp/shared/pwd.rb b/spec/ruby/library/net-ftp/shared/pwd.rb new file mode 100644 index 0000000000..db3e587464 --- /dev/null +++ b/spec/ruby/library/net-ftp/shared/pwd.rb @@ -0,0 +1,5 @@ +ruby_version_is ""..."4.1" do + describe :net_ftp_pwd, shared: true do + + end +end diff --git a/spec/ruby/library/net-ftp/site_spec.rb b/spec/ruby/library/net-ftp/site_spec.rb new file mode 100644 index 0000000000..adc7dfafdf --- /dev/null +++ b/spec/ruby/library/net-ftp/site_spec.rb @@ -0,0 +1,56 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#site" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the SITE command with the passed argument to the server" do + @ftp.site("param") + @ftp.last_response.should == "200 Command okay. (SITE param)\n" + end + + it "returns nil" do + @ftp.site("param").should == nil + end + + it "does not raise an error when the response code is 202" do + @server.should_receive(:site).and_respond("202 Command not implemented, superfluous at this site.") + -> { @ftp.site("param") }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:site).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.site("param") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:site).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.site("param") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:site).and_respond("421 Service not available, closing control connection.") + -> { @ftp.site("param") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:site).and_respond("530 Requested action not taken.") + -> { @ftp.site("param") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/size_spec.rb b/spec/ruby/library/net-ftp/size_spec.rb new file mode 100644 index 0000000000..dd84e5a449 --- /dev/null +++ b/spec/ruby/library/net-ftp/size_spec.rb @@ -0,0 +1,51 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#size" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the SIZE command to the server" do + @ftp.size("test.file") + @ftp.last_response.should == "213 1024\n" + end + + it "returns the size of the passed file as Integer" do + @ftp.size("test.file").should.eql?(1024) + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:size).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.size("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:size).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.size("test.file") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:size).and_respond("421 Service not available, closing control connection.") + -> { @ftp.size("test.file") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 550" do + @server.should_receive(:size).and_respond("550 Requested action not taken.") + -> { @ftp.size("test.file") }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/spec_helper.rb b/spec/ruby/library/net-ftp/spec_helper.rb new file mode 100644 index 0000000000..7689b4fb0c --- /dev/null +++ b/spec/ruby/library/net-ftp/spec_helper.rb @@ -0,0 +1,7 @@ +ruby_version_is ""..."4.1" do + require "net/ftp" + + if defined?(Net::FTP.default_passive) + Net::FTP.default_passive = false + end +end diff --git a/spec/ruby/library/net-ftp/status_spec.rb b/spec/ruby/library/net-ftp/status_spec.rb new file mode 100644 index 0000000000..ce29e215d4 --- /dev/null +++ b/spec/ruby/library/net-ftp/status_spec.rb @@ -0,0 +1,70 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#status" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the STAT command to the server" do + @ftp.status + @ftp.last_response.should == "211 System status, or system help reply. (STAT)\n" + end + + it "sends the STAT command with an optional parameter to the server" do + @ftp.status("/pub").should == "211 System status, or system help reply. (STAT /pub)\n" + end + + it "returns the received information" do + @ftp.status.should == "211 System status, or system help reply. (STAT)\n" + end + + it "does not raise an error when the response code is 212" do + @server.should_receive(:stat).and_respond("212 Directory status.") + -> { @ftp.status }.should_not.raise + end + + it "does not raise an error when the response code is 213" do + @server.should_receive(:stat).and_respond("213 File status.") + -> { @ftp.status }.should_not.raise + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:stat).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.status }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:stat).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.status }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:stat).and_respond("502 Command not implemented.") + -> { @ftp.status }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:stat).and_respond("421 Service not available, closing control connection.") + -> { @ftp.status }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 530" do + @server.should_receive(:stat).and_respond("530 Requested action not taken.") + -> { @ftp.status }.should.raise(Net::FTPPermError) + end + end +end diff --git a/spec/ruby/library/net-ftp/storbinary_spec.rb b/spec/ruby/library/net-ftp/storbinary_spec.rb new file mode 100644 index 0000000000..a2f81fc669 --- /dev/null +++ b/spec/ruby/library/net-ftp/storbinary_spec.rb @@ -0,0 +1,52 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#storbinary" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @local_fixture_file = __dir__ + "/fixtures/putbinaryfile" + @tmp_file = tmp("binaryfile", false) + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @tmp_file + end + + it "sends the passed command and the passed File object's content to the server" do + File.open(@local_fixture_file) do |f| + f.binmode + + @ftp.storbinary("STOR binary", f, 4096) {} + @ftp.last_response.should == "200 OK, Data received. (STOR binary)\n" + end + end + + it "yields the transmitted content as binary blocks of the passed size" do + File.open(@local_fixture_file) do |f| + f.binmode + + res = [] + @ftp.storbinary("STOR binary", f, 10) { |x| res << x } + res.should == [ + "This is an", " example f", + "ile\nwhich ", "is going t", + "o be trans", "mitted\nusi", + "ng #putbin", "aryfile.\n" + ] + end + end + end +end diff --git a/spec/ruby/library/net-ftp/storlines_spec.rb b/spec/ruby/library/net-ftp/storlines_spec.rb new file mode 100644 index 0000000000..09340bafe9 --- /dev/null +++ b/spec/ruby/library/net-ftp/storlines_spec.rb @@ -0,0 +1,47 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#storlines" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @local_fixture_file = __dir__ + "/fixtures/puttextfile" + @tmp_file = tmp("textfile", false) + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + + rm_r @tmp_file + end + + it "sends the passed command and the passed File object's content to the server" do + File.open(@local_fixture_file) do |f| + @ftp.storlines("STOR text", f) {} + @ftp.last_response.should == "200 OK, Data received. (STOR text)\n" + end + end + + it "yields each line of the transmitted content" do + File.open(@local_fixture_file) do |f| + res = [] + @ftp.storlines("STOR text", f) { |x| res << x } + res.should == [ + "This is an example file\r\n", + "which is going to be transmitted\r\n", + "using #puttextfile.\r\n" + ] + end + end + end +end diff --git a/spec/ruby/library/net-ftp/system_spec.rb b/spec/ruby/library/net-ftp/system_spec.rb new file mode 100644 index 0000000000..fa61776282 --- /dev/null +++ b/spec/ruby/library/net-ftp/system_spec.rb @@ -0,0 +1,51 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#system" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the SYST command to the server" do + @ftp.system + @ftp.last_response.should =~ /\A215 FTP Dummy Server \(SYST\)\Z/ + end + + it "returns the received information" do + @ftp.system.should =~ /\AFTP Dummy Server \(SYST\)\Z/ + end + + it "raises a Net::FTPPermError when the response code is 500" do + @server.should_receive(:syst).and_respond("500 Syntax error, command unrecognized.") + -> { @ftp.system }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 501" do + @server.should_receive(:syst).and_respond("501 Syntax error in parameters or arguments.") + -> { @ftp.system }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPPermError when the response code is 502" do + @server.should_receive(:syst).and_respond("502 Command not implemented.") + -> { @ftp.system }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPTempError when the response code is 421" do + @server.should_receive(:syst).and_respond("421 Service not available, closing control connection.") + -> { @ftp.system }.should.raise(Net::FTPTempError) + end + end +end diff --git a/spec/ruby/library/net-ftp/voidcmd_spec.rb b/spec/ruby/library/net-ftp/voidcmd_spec.rb new file mode 100644 index 0000000000..4f74da7a70 --- /dev/null +++ b/spec/ruby/library/net-ftp/voidcmd_spec.rb @@ -0,0 +1,57 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#voidcmd" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "sends the passed command to the server" do + @server.should_receive(:help).and_respond("2xx Does not raise.") + -> { @ftp.voidcmd("HELP") }.should_not.raise + end + + it "returns nil" do + @server.should_receive(:help).and_respond("2xx Does not raise.") + @ftp.voidcmd("HELP").should == nil + end + + it "raises a Net::FTPReplyError when the response code is 1xx" do + @server.should_receive(:help).and_respond("1xx Does raise a Net::FTPReplyError.") + -> { @ftp.voidcmd("HELP") }.should.raise(Net::FTPReplyError) + end + + it "raises a Net::FTPReplyError when the response code is 3xx" do + @server.should_receive(:help).and_respond("3xx Does raise a Net::FTPReplyError.") + -> { @ftp.voidcmd("HELP") }.should.raise(Net::FTPReplyError) + end + + it "raises a Net::FTPTempError when the response code is 4xx" do + @server.should_receive(:help).and_respond("4xx Does raise a Net::FTPTempError.") + -> { @ftp.voidcmd("HELP") }.should.raise(Net::FTPTempError) + end + + it "raises a Net::FTPPermError when the response code is 5xx" do + @server.should_receive(:help).and_respond("5xx Does raise a Net::FTPPermError.") + -> { @ftp.voidcmd("HELP") }.should.raise(Net::FTPPermError) + end + + it "raises a Net::FTPProtoError when the response code is not valid" do + @server.should_receive(:help).and_respond("999 Does raise a Net::FTPProtoError.") + -> { @ftp.voidcmd("HELP") }.should.raise(Net::FTPProtoError) + end + end +end diff --git a/spec/ruby/library/net-ftp/welcome_spec.rb b/spec/ruby/library/net-ftp/welcome_spec.rb new file mode 100644 index 0000000000..761a0f9a3e --- /dev/null +++ b/spec/ruby/library/net-ftp/welcome_spec.rb @@ -0,0 +1,28 @@ +require_relative '../../spec_helper' + +ruby_version_is ""..."4.1" do + require_relative 'spec_helper' + require_relative 'fixtures/server' + + describe "Net::FTP#welcome" do + before :each do + @server = NetFTPSpecs::DummyFTP.new + @server.serve_once + + @ftp = Net::FTP.new + @ftp.connect(@server.hostname, @server.server_port) + end + + after :each do + @ftp.quit rescue nil + @ftp.close + @server.stop + end + + it "returns the server's welcome message" do + @ftp.welcome.should == nil + @ftp.login + @ftp.welcome.should == "230 User logged in, proceed. (USER anonymous)\n" + end + end +end diff --git a/spec/ruby/library/net-http/HTTPBadResponse_spec.rb b/spec/ruby/library/net-http/HTTPBadResponse_spec.rb new file mode 100644 index 0000000000..8f2e8ccfaf --- /dev/null +++ b/spec/ruby/library/net-http/HTTPBadResponse_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPBadResponse" do + it "is a subclass of StandardError" do + Net::HTTPBadResponse.should < StandardError + end +end diff --git a/spec/ruby/library/net-http/HTTPClientExcepton_spec.rb b/spec/ruby/library/net-http/HTTPClientExcepton_spec.rb new file mode 100644 index 0000000000..2992e6596f --- /dev/null +++ b/spec/ruby/library/net-http/HTTPClientExcepton_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPClientException" do + it "is a subclass of Net::ProtoServerError" do + Net::HTTPClientException.should < Net::ProtoServerError + end + + it "includes the Net::HTTPExceptions module" do + Net::HTTPClientException.should < Net::HTTPExceptions + end +end diff --git a/spec/ruby/library/net-http/HTTPError_spec.rb b/spec/ruby/library/net-http/HTTPError_spec.rb new file mode 100644 index 0000000000..7f79eef8cf --- /dev/null +++ b/spec/ruby/library/net-http/HTTPError_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPError" do + it "is a subclass of Net::ProtocolError" do + Net::HTTPError.should < Net::ProtocolError + end + + it "includes the Net::HTTPExceptions module" do + Net::HTTPError.should < Net::HTTPExceptions + end +end diff --git a/spec/ruby/library/net-http/HTTPFatalError_spec.rb b/spec/ruby/library/net-http/HTTPFatalError_spec.rb new file mode 100644 index 0000000000..0113b9da2d --- /dev/null +++ b/spec/ruby/library/net-http/HTTPFatalError_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPFatalError" do + it "is a subclass of Net::ProtoFatalError" do + Net::HTTPFatalError.should < Net::ProtoFatalError + end + + it "includes the Net::HTTPExceptions module" do + Net::HTTPFatalError.should < Net::HTTPExceptions + end +end diff --git a/spec/ruby/library/net-http/HTTPHeaderSyntaxError_spec.rb b/spec/ruby/library/net-http/HTTPHeaderSyntaxError_spec.rb new file mode 100644 index 0000000000..b3b73ff46f --- /dev/null +++ b/spec/ruby/library/net-http/HTTPHeaderSyntaxError_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPHeaderSyntaxError" do + it "is a subclass of StandardError" do + Net::HTTPHeaderSyntaxError.should < StandardError + end +end diff --git a/spec/ruby/library/net-http/HTTPRetriableError_spec.rb b/spec/ruby/library/net-http/HTTPRetriableError_spec.rb new file mode 100644 index 0000000000..677731fb68 --- /dev/null +++ b/spec/ruby/library/net-http/HTTPRetriableError_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPRetriableError" do + it "is a subclass of Net::ProtoRetriableError" do + Net::HTTPRetriableError.should < Net::ProtoRetriableError + end + + it "includes the Net::HTTPExceptions module" do + Net::HTTPRetriableError.should < Net::HTTPExceptions + end +end diff --git a/spec/ruby/library/net-http/HTTPServerException_spec.rb b/spec/ruby/library/net-http/HTTPServerException_spec.rb new file mode 100644 index 0000000000..020d3cce85 --- /dev/null +++ b/spec/ruby/library/net-http/HTTPServerException_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../spec_helper' +require 'net/http' + +describe "Net::HTTPServerException" do + it "is a subclass of Net::ProtoServerError and is warned as deprecated" do + -> { eval("Net::HTTPServerException").should < Net::ProtoServerError }.should complain(/warning: constant Net::HTTPServerException is deprecated/) + end + + it "includes the Net::HTTPExceptions module and is warned as deprecated" do + -> { eval("Net::HTTPServerException").should < Net::HTTPExceptions }.should complain(/warning: constant Net::HTTPServerException is deprecated/) + end +end diff --git a/spec/ruby/library/net-http/http/Proxy_spec.rb b/spec/ruby/library/net-http/http/Proxy_spec.rb new file mode 100644 index 0000000000..7753ce5e30 --- /dev/null +++ b/spec/ruby/library/net-http/http/Proxy_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.Proxy" do + it "returns a new subclass of Net::HTTP" do + Net::HTTP.Proxy("localhost").should < Net::HTTP + end + + it "returns Net::HTTP when the passed address is nil" do + Net::HTTP.Proxy(nil).should == Net::HTTP + end + + it "sets the returned subclasses' proxy options based on the passed arguments" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.proxy_address.should == "localhost" + http_with_proxy.proxy_port.should.eql?(1234) + http_with_proxy.proxy_user.should == "rspec" + http_with_proxy.proxy_pass.should == "rocks" + end +end + +describe "Net::HTTP#proxy?" do + describe "when self is no proxy class instance" do + it "returns false" do + Net::HTTP.new("localhost", 3333).proxy?.should == false + end + end + + describe "when self is a proxy class instance" do + it "returns false" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.new("localhost", 3333).proxy?.should == true + end + end +end diff --git a/spec/ruby/library/net-http/http/active_spec.rb b/spec/ruby/library/net-http/http/active_spec.rb new file mode 100644 index 0000000000..c260274594 --- /dev/null +++ b/spec/ruby/library/net-http/http/active_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/started' + +describe "Net::HTTP#active?" do + it_behaves_like :net_http_started_p, :active? +end diff --git a/spec/ruby/library/net-http/http/address_spec.rb b/spec/ruby/library/net-http/http/address_spec.rb new file mode 100644 index 0000000000..7c5b82a8f9 --- /dev/null +++ b/spec/ruby/library/net-http/http/address_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#address" do + it "returns the current host name" do + net = Net::HTTP.new("localhost") + net.address.should == "localhost" + end +end diff --git a/spec/ruby/library/net-http/http/close_on_empty_response_spec.rb b/spec/ruby/library/net-http/http/close_on_empty_response_spec.rb new file mode 100644 index 0000000000..9cc756befb --- /dev/null +++ b/spec/ruby/library/net-http/http/close_on_empty_response_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#close_on_empty_response" do + it "needs to be reviewed for spec completeness" +end + +describe "Net::HTTP#close_on_empty_response=" do + it "needs to be reviewed for spec completeness" +end diff --git a/spec/ruby/library/net-http/http/copy_spec.rb b/spec/ruby/library/net-http/http/copy_spec.rb new file mode 100644 index 0000000000..1f3e25009f --- /dev/null +++ b/spec/ruby/library/net-http/http/copy_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#copy" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a COPY request to the passed path and returns the response" do + response = @http.copy("/request") + response.should.is_a?(Net::HTTPResponse) + response.body.should == "Request type: COPY" + end +end diff --git a/spec/ruby/library/net-http/http/default_port_spec.rb b/spec/ruby/library/net-http/http/default_port_spec.rb new file mode 100644 index 0000000000..20407d0b12 --- /dev/null +++ b/spec/ruby/library/net-http/http/default_port_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.default_port" do + it "returns 80" do + Net::HTTP.http_default_port.should.eql?(80) + end +end diff --git a/spec/ruby/library/net-http/http/delete_spec.rb b/spec/ruby/library/net-http/http/delete_spec.rb new file mode 100644 index 0000000000..09ddd74000 --- /dev/null +++ b/spec/ruby/library/net-http/http/delete_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#delete" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a DELETE request to the passed path and returns the response" do + response = @http.delete("/request") + response.should.is_a?(Net::HTTPResponse) + response.body.should == "Request type: DELETE" + end +end diff --git a/spec/ruby/library/net-http/http/finish_spec.rb b/spec/ruby/library/net-http/http/finish_spec.rb new file mode 100644 index 0000000000..0d466675f3 --- /dev/null +++ b/spec/ruby/library/net-http/http/finish_spec.rb @@ -0,0 +1,29 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#finish" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when self has been started" do + it "closes the tcp connection" do + @http.start + @http.finish + @http.started?.should == false + end + end + + describe "when self has not been started yet" do + it "raises an IOError" do + -> { @http.finish }.should.raise(IOError) + end + end +end diff --git a/spec/ruby/library/net-http/http/fixtures/http_server.rb b/spec/ruby/library/net-http/http/fixtures/http_server.rb new file mode 100644 index 0000000000..c1cedbfa76 --- /dev/null +++ b/spec/ruby/library/net-http/http/fixtures/http_server.rb @@ -0,0 +1,123 @@ +require 'socket' + +module NetHTTPSpecs + class NullWriter + def <<(s) end + def puts(*args) end + def print(*args) end + def printf(*args) end + end + + class SmallHTTPServer + def initialize(bind_address) + @server = TCPServer.new(bind_address, 0) + @thread = Thread.new { + Thread.current.abort_on_exception = true + listen + } + end + + def ip + @server.addr[3] + end + + def port + @server.addr[1] + end + + def listen + until @server.closed? + client = @server.accept + handle_client(client) + end + end + + def handle_client(client) + begin + until client.closed? + request = client.gets("\r\n\r\n") + break unless request + if request == "CLOSE" + @server.close + break + end + handle_request(client, request) + end + ensure + client.close + end + end + + def parse_request(request) + request, *headers = request.chomp.lines.map { |line| line.chomp } + request_method, request_uri, _http_version = request.split + headers = headers.map { |line| line.split(': ', 2) }.to_h + [request_method, request_uri, headers] + end + + def handle_request(client, request) + request_method, request_uri, headers = parse_request(request) + + if headers.include? 'Content-Length' + request_body_size = Integer(headers['Content-Length']) + request_body = client.read(request_body_size) + end + + case request_uri + when '/' + raise request_method unless request_method == 'GET' + reply(client, "This is the index page.", request_method) + when '/request' + reply(client, "Request type: #{request_method}", request_method) + when '/request/body' + reply(client, request_body, request_method) + when '/request/header' + reply(client, headers.inspect, request_method) + when '/request/basic_auth' + reply(client, "username: \npassword: ", request_method) + else + raise request_uri + end + end + + def reply(client, body, request_method) + client.print "HTTP/1.1 200 OK\r\n" + if request_method == 'HEAD' + client.close + else + client.print "Content-Type: text/plain\r\n" + client.print "Content-Length: #{body.bytesize}\r\n" + client.print "\r\n" + client.print body + end + end + + def close + TCPSocket.open(ip, port) do |socket| + socket.write "CLOSE" + end + @thread.join + end + end + + @server = nil + + class << self + def port + raise "server not started" unless @server + @server.port + end + + def start_server + bind_address = platform_is(:windows) ? "localhost" : "127.0.0.1" + @server = SmallHTTPServer.new(bind_address) + end + + def stop_server + if @server + @server.close + @server = nil + end + end + end +end diff --git a/spec/ruby/library/net-http/http/get2_spec.rb b/spec/ruby/library/net-http/http/get2_spec.rb new file mode 100644 index 0000000000..57c05ec64b --- /dev/null +++ b/spec/ruby/library/net-http/http/get2_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_get' + +describe "Net::HTTP#get2" do + it_behaves_like :net_http_request_get, :get2 +end diff --git a/spec/ruby/library/net-http/http/get_print_spec.rb b/spec/ruby/library/net-http/http/get_print_spec.rb new file mode 100644 index 0000000000..3c24ce44ea --- /dev/null +++ b/spec/ruby/library/net-http/http/get_print_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.get_print" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + end + + after :each do + NetHTTPSpecs.stop_server + end + + describe "when passed URI" do + it "it prints the body of the specified uri to $stdout" do + -> do + Net::HTTP.get_print URI.parse("http://localhost:#{@port}/") + end.should output(/This is the index page\./) + end + end + + describe "when passed host, path, port" do + it "it prints the body of the specified uri to $stdout" do + -> do + Net::HTTP.get_print 'localhost', "/", @port + end.should output(/This is the index page\./) + end + end +end diff --git a/spec/ruby/library/net-http/http/get_response_spec.rb b/spec/ruby/library/net-http/http/get_response_spec.rb new file mode 100644 index 0000000000..7133ef8101 --- /dev/null +++ b/spec/ruby/library/net-http/http/get_response_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.get_response" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + end + + after :each do + NetHTTPSpecs.stop_server + end + + describe "when passed URI" do + it "returns the response for the specified uri" do + res = Net::HTTP.get_response(URI.parse("http://localhost:#{@port}/")) + res.content_type.should == "text/plain" + res.body.should == "This is the index page." + end + end + + describe "when passed host, path, port" do + it "returns the response for the specified host-path-combination" do + res = Net::HTTP.get_response('localhost', "/", @port) + res.content_type.should == "text/plain" + res.body.should == "This is the index page." + end + end +end diff --git a/spec/ruby/library/net-http/http/get_spec.rb b/spec/ruby/library/net-http/http/get_spec.rb new file mode 100644 index 0000000000..9be726dc3b --- /dev/null +++ b/spec/ruby/library/net-http/http/get_spec.rb @@ -0,0 +1,94 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.get" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + end + + after :each do + NetHTTPSpecs.stop_server + end + + describe "when passed URI" do + it "returns the body of the specified uri" do + Net::HTTP.get(URI.parse("http://localhost:#{@port}/")).should == "This is the index page." + end + end + + describe "when passed host, path, port" do + it "returns the body of the specified host-path-combination" do + Net::HTTP.get('localhost', "/", @port).should == "This is the index page." + end + end +end + +quarantine! do # These specs fail frequently with CHECK_LEAKS=true +describe "Net::HTTP.get" do + describe "when reading gzipped contents" do + def start_threads + require 'zlib' + require 'stringio' + + server = nil + server_thread = Thread.new do + server = TCPServer.new("127.0.0.1", 0) + begin + c = server.accept + ensure + server.close + end + c.print "HTTP/1.1 200\r\n" + c.print "Content-Type: text/plain\r\n" + c.print "Content-Encoding: gzip\r\n" + s = StringIO.new + z = Zlib::GzipWriter.new(s) + begin + z.write 'Hello World!' + ensure + z.close + end + c.print "Content-Length: #{s.length}\r\n\r\n" + # Write partial gzip content + c.write s.string.byteslice(0..-2) + c.flush + c + end + Thread.pass until server && server_thread.stop? + + client_thread = Thread.new do + Thread.current.report_on_exception = false + Net::HTTP.get("127.0.0.1", '/', server.connect_address.ip_port) + end + + socket = server_thread.value + Thread.pass until client_thread.stop? + + [socket, client_thread] + end + + it "propagates exceptions interrupting the thread and does not replace it with Zlib::BufError" do + my_exception = Class.new(RuntimeError) + socket, client_thread = start_threads + begin + client_thread.raise my_exception, "my exception" + -> { client_thread.value }.should.raise(my_exception) + ensure + socket.close + end + end + + it "lets the kill Thread exception goes through and does not replace it with Zlib::BufError" do + socket, client_thread = start_threads + begin + client_thread.kill + client_thread.value.should == nil + ensure + socket.close + end + end + end +end +end diff --git a/spec/ruby/library/net-http/http/head2_spec.rb b/spec/ruby/library/net-http/http/head2_spec.rb new file mode 100644 index 0000000000..84cfff33d7 --- /dev/null +++ b/spec/ruby/library/net-http/http/head2_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_head' + +describe "Net::HTTP#head2" do + it_behaves_like :net_http_request_head, :head2 +end diff --git a/spec/ruby/library/net-http/http/head_spec.rb b/spec/ruby/library/net-http/http/head_spec.rb new file mode 100644 index 0000000000..4824d22534 --- /dev/null +++ b/spec/ruby/library/net-http/http/head_spec.rb @@ -0,0 +1,25 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#head" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a HEAD request to the passed path and returns the response" do + response = @http.head("/request") + # HEAD requests have no responses + response.body.should == nil + end + + it "returns a Net::HTTPResponse" do + @http.head("/request").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/http_default_port_spec.rb b/spec/ruby/library/net-http/http/http_default_port_spec.rb new file mode 100644 index 0000000000..82c88e58a8 --- /dev/null +++ b/spec/ruby/library/net-http/http/http_default_port_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.http_default_port" do + it "returns 80" do + Net::HTTP.http_default_port.should.eql?(80) + end +end diff --git a/spec/ruby/library/net-http/http/https_default_port_spec.rb b/spec/ruby/library/net-http/http/https_default_port_spec.rb new file mode 100644 index 0000000000..24b9c3b462 --- /dev/null +++ b/spec/ruby/library/net-http/http/https_default_port_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.https_default_port" do + it "returns 443" do + Net::HTTP.https_default_port.should.eql?(443) + end +end diff --git a/spec/ruby/library/net-http/http/initialize_spec.rb b/spec/ruby/library/net-http/http/initialize_spec.rb new file mode 100644 index 0000000000..907314cb25 --- /dev/null +++ b/spec/ruby/library/net-http/http/initialize_spec.rb @@ -0,0 +1,46 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#initialize" do + it "is private" do + Net::HTTP.private_instance_methods(false).should.include?(:initialize) + end + + describe "when passed address" do + before :each do + @net = Net::HTTP.allocate + @net.send(:initialize, "localhost") + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @net.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the default HTTP port" do + @net.port.should.eql?(Net::HTTP.default_port) + end + + it "does not start the new Net::HTTP instance" do + @net.started?.should == false + end + end + + describe "when passed address, port" do + before :each do + @net = Net::HTTP.allocate + @net.send(:initialize, "localhost", 3333) + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @net.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the passed port" do + @net.port.should.eql?(3333) + end + + it "does not start the new Net::HTTP instance" do + @net.started?.should == false + end + end +end diff --git a/spec/ruby/library/net-http/http/inspect_spec.rb b/spec/ruby/library/net-http/http/inspect_spec.rb new file mode 100644 index 0000000000..fd4e6116c7 --- /dev/null +++ b/spec/ruby/library/net-http/http/inspect_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#inspect" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + @http = Net::HTTP.new("localhost", @port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "returns a String representation of self" do + @http.inspect.should.is_a?(String) + @http.inspect.should == "#<Net::HTTP localhost:#{@port} open=false>" + + @http.start + @http.inspect.should == "#<Net::HTTP localhost:#{@port} open=true>" + end +end diff --git a/spec/ruby/library/net-http/http/is_version_1_1_spec.rb b/spec/ruby/library/net-http/http/is_version_1_1_spec.rb new file mode 100644 index 0000000000..bdb343f9e0 --- /dev/null +++ b/spec/ruby/library/net-http/http/is_version_1_1_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/version_1_1' + +describe "Net::HTTP.is_version_1_1?" do + it_behaves_like :net_http_version_1_1_p, :is_version_1_1? +end diff --git a/spec/ruby/library/net-http/http/is_version_1_2_spec.rb b/spec/ruby/library/net-http/http/is_version_1_2_spec.rb new file mode 100644 index 0000000000..555bb205dd --- /dev/null +++ b/spec/ruby/library/net-http/http/is_version_1_2_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/version_1_2' + +describe "Net::HTTP.is_version_1_2?" do + it_behaves_like :net_http_version_1_2_p, :is_version_1_2? +end diff --git a/spec/ruby/library/net-http/http/lock_spec.rb b/spec/ruby/library/net-http/http/lock_spec.rb new file mode 100644 index 0000000000..12df138ad0 --- /dev/null +++ b/spec/ruby/library/net-http/http/lock_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#lock" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a LOCK request to the passed path and returns the response" do + response = @http.lock("/request", "test=test") + response.should.is_a?(Net::HTTPResponse) + response.body.should == "Request type: LOCK" + end +end diff --git a/spec/ruby/library/net-http/http/mkcol_spec.rb b/spec/ruby/library/net-http/http/mkcol_spec.rb new file mode 100644 index 0000000000..b1a5055982 --- /dev/null +++ b/spec/ruby/library/net-http/http/mkcol_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#mkcol" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a MKCOL request to the passed path and returns the response" do + response = @http.mkcol("/request") + response.should.is_a?(Net::HTTPResponse) + response.body.should == "Request type: MKCOL" + end +end diff --git a/spec/ruby/library/net-http/http/move_spec.rb b/spec/ruby/library/net-http/http/move_spec.rb new file mode 100644 index 0000000000..a57c2a0f49 --- /dev/null +++ b/spec/ruby/library/net-http/http/move_spec.rb @@ -0,0 +1,25 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#head" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a MOVE request to the passed path and returns the response" do + response = @http.move("/request") + # HEAD requests have no responses + response.body.should == "Request type: MOVE" + end + + it "returns a Net::HTTPResponse" do + @http.move("/request").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/new_spec.rb b/spec/ruby/library/net-http/http/new_spec.rb new file mode 100644 index 0000000000..8feb3d1351 --- /dev/null +++ b/spec/ruby/library/net-http/http/new_spec.rb @@ -0,0 +1,86 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.new" do + describe "when passed address" do + before :each do + @http = Net::HTTP.new("localhost") + end + + it "returns a Net::HTTP instance" do + @http.proxy?.should == false + @http.instance_of?(Net::HTTP).should == true + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @http.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the default HTTP port" do + @http.port.should.eql?(Net::HTTP.default_port) + end + + it "does not start the new Net::HTTP instance" do + @http.started?.should == false + end + end + + describe "when passed address, port" do + before :each do + @http = Net::HTTP.new("localhost", 3333) + end + + it "returns a Net::HTTP instance" do + @http.proxy?.should == false + @http.instance_of?(Net::HTTP).should == true + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @http.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the passed port" do + @http.port.should.eql?(3333) + end + + it "does not start the new Net::HTTP instance" do + @http.started?.should == false + end + end + + describe "when passed address, port, *proxy_options" do + it "returns a Net::HTTP instance" do + http = Net::HTTP.new("localhost", 3333, "localhost") + http.proxy?.should == true + http.instance_of?(Net::HTTP).should == true + http.should.is_a?(Net::HTTP) + end + + it "correctly sets the passed Proxy options" do + http = Net::HTTP.new("localhost", 3333, "localhost") + http.proxy_address.should == "localhost" + http.proxy_port.should.eql?(80) + http.proxy_user.should == nil + http.proxy_pass.should == nil + + http = Net::HTTP.new("localhost", 3333, "localhost", 1234) + http.proxy_address.should == "localhost" + http.proxy_port.should.eql?(1234) + http.proxy_user.should == nil + http.proxy_pass.should == nil + + http = Net::HTTP.new("localhost", 3333, "localhost", 1234, "rubyspec") + http.proxy_address.should == "localhost" + http.proxy_port.should.eql?(1234) + http.proxy_user.should == "rubyspec" + http.proxy_pass.should == nil + + http = Net::HTTP.new("localhost", 3333, "localhost", 1234, "rubyspec", "rocks") + http.proxy_address.should == "localhost" + http.proxy_port.should.eql?(1234) + http.proxy_user.should == "rubyspec" + http.proxy_pass.should == "rocks" + end + end + +end diff --git a/spec/ruby/library/net-http/http/newobj_spec.rb b/spec/ruby/library/net-http/http/newobj_spec.rb new file mode 100644 index 0000000000..d398fb7d9a --- /dev/null +++ b/spec/ruby/library/net-http/http/newobj_spec.rb @@ -0,0 +1,48 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.newobj" do + before :each do + @net = Net::HTTP.newobj("localhost") + end + + describe "when passed address" do + it "returns a new Net::HTTP instance" do + @net.should.is_a?(Net::HTTP) + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @net.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the default HTTP port" do + @net.port.should.eql?(Net::HTTP.default_port) + end + + it "does not start the new Net::HTTP instance" do + @net.started?.should == false + end + end + + describe "when passed address, port" do + before :each do + @net = Net::HTTP.newobj("localhost", 3333) + end + + it "returns a new Net::HTTP instance" do + @net.should.is_a?(Net::HTTP) + end + + it "sets the new Net::HTTP instance's address to the passed address" do + @net.address.should == "localhost" + end + + it "sets the new Net::HTTP instance's port to the passed port" do + @net.port.should.eql?(3333) + end + + it "does not start the new Net::HTTP instance" do + @net.started?.should == false + end + end +end diff --git a/spec/ruby/library/net-http/http/open_timeout_spec.rb b/spec/ruby/library/net-http/http/open_timeout_spec.rb new file mode 100644 index 0000000000..d00f844b38 --- /dev/null +++ b/spec/ruby/library/net-http/http/open_timeout_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#open_timeout" do + it "returns the seconds to wait till the connection is open" do + net = Net::HTTP.new("localhost") + net.open_timeout.should.eql?(60) + net.open_timeout = 10 + net.open_timeout.should.eql?(10) + end +end + +describe "Net::HTTP#open_timeout=" do + it "sets the seconds to wait till the connection is open" do + net = Net::HTTP.new("localhost") + net.open_timeout = 10 + net.open_timeout.should.eql?(10) + end + + it "returns the newly set value" do + net = Net::HTTP.new("localhost") + (net.open_timeout = 10).should.eql?(10) + end +end diff --git a/spec/ruby/library/net-http/http/options_spec.rb b/spec/ruby/library/net-http/http/options_spec.rb new file mode 100644 index 0000000000..3b90573cfa --- /dev/null +++ b/spec/ruby/library/net-http/http/options_spec.rb @@ -0,0 +1,25 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#options" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an options request to the passed path and returns the response" do + response = @http.options("/request") + + response.body.should == "Request type: OPTIONS" + end + + it "returns a Net::HTTPResponse" do + @http.options("/request").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/port_spec.rb b/spec/ruby/library/net-http/http/port_spec.rb new file mode 100644 index 0000000000..edb689f9ca --- /dev/null +++ b/spec/ruby/library/net-http/http/port_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#port" do + it "returns the current port number" do + net = Net::HTTP.new("localhost", 3333) + net.port.should.eql?(3333) + end +end diff --git a/spec/ruby/library/net-http/http/post2_spec.rb b/spec/ruby/library/net-http/http/post2_spec.rb new file mode 100644 index 0000000000..abc998709f --- /dev/null +++ b/spec/ruby/library/net-http/http/post2_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_post' + +describe "Net::HTTP#post2" do + it_behaves_like :net_http_request_post, :post2 +end diff --git a/spec/ruby/library/net-http/http/post_form_spec.rb b/spec/ruby/library/net-http/http/post_form_spec.rb new file mode 100644 index 0000000000..de64a25bae --- /dev/null +++ b/spec/ruby/library/net-http/http/post_form_spec.rb @@ -0,0 +1,22 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.post_form when passed URI" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + end + + after :each do + NetHTTPSpecs.stop_server + end + + it "POSTs the passed form data to the given uri" do + uri = URI.parse("http://localhost:#{@port}/request/body") + data = { test: :data } + + res = Net::HTTP.post_form(uri, data) + res.body.should == "test=data" + end +end diff --git a/spec/ruby/library/net-http/http/post_spec.rb b/spec/ruby/library/net-http/http/post_spec.rb new file mode 100644 index 0000000000..f294411197 --- /dev/null +++ b/spec/ruby/library/net-http/http/post_spec.rb @@ -0,0 +1,76 @@ +require_relative '../../../spec_helper' +require 'net/http' +require 'uri' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.post" do + before :each do + NetHTTPSpecs.start_server + end + + after :each do + NetHTTPSpecs.stop_server + end + + it "sends post request to the specified URI and returns response" do + response = Net::HTTP.post( + URI("http://localhost:#{NetHTTPSpecs.port}/request"), + '{ "q": "ruby", "max": "50" }', + "Content-Type" => "application/json") + response.body.should == "Request type: POST" + end + + it "returns a Net::HTTPResponse" do + response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request"), "test=test") + response.should.is_a?(Net::HTTPResponse) + end + + ruby_version_is ""..."4.0" do + it "sends Content-Type: application/x-www-form-urlencoded by default" do + response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request/header"), "test=test") + response.body.should.include?({ "Content-Type" => "application/x-www-form-urlencoded" }.inspect.delete("{}")) + end + end + + it "does not support HTTP Basic Auth" do + response = Net::HTTP.post( + URI("http://john:qwerty@localhost:#{NetHTTPSpecs.port}/request/basic_auth"), + "test=test") + response.body.should == "username: \npassword: " + end +end + +describe "Net::HTTP#post" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an post request to the passed path and returns the response" do + response = @http.post("/request", "test=test") + response.body.should == "Request type: POST" + end + + it "returns a Net::HTTPResponse" do + @http.post("/request", "test=test").should.is_a?(Net::HTTPResponse) + end + + describe "when passed a block" do + it "yields fragments of the response body to the passed block" do + str = +"" + @http.post("/request", "test=test") do |res| + str << res + end + str.should == "Request type: POST" + end + + it "returns a Net::HTTPResponse" do + @http.post("/request", "test=test") {}.should.is_a?(Net::HTTPResponse) + end + end +end diff --git a/spec/ruby/library/net-http/http/propfind_spec.rb b/spec/ruby/library/net-http/http/propfind_spec.rb new file mode 100644 index 0000000000..6a1be0392a --- /dev/null +++ b/spec/ruby/library/net-http/http/propfind_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#propfind" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an propfind request to the passed path and returns the response" do + response = @http.propfind("/request", "test=test") + response.body.should == "Request type: PROPFIND" + end + + it "returns a Net::HTTPResponse" do + @http.propfind("/request", "test=test").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/proppatch_spec.rb b/spec/ruby/library/net-http/http/proppatch_spec.rb new file mode 100644 index 0000000000..074dfafaef --- /dev/null +++ b/spec/ruby/library/net-http/http/proppatch_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#proppatch" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an proppatch request to the passed path and returns the response" do + response = @http.proppatch("/request", "test=test") + response.body.should == "Request type: PROPPATCH" + end + + it "returns a Net::HTTPResponse" do + @http.proppatch("/request", "test=test").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/proxy_address_spec.rb b/spec/ruby/library/net-http/http/proxy_address_spec.rb new file mode 100644 index 0000000000..ba040336ad --- /dev/null +++ b/spec/ruby/library/net-http/http/proxy_address_spec.rb @@ -0,0 +1,31 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.proxy_address" do + describe "when self is no proxy class" do + it "returns nil" do + Net::HTTP.proxy_address.should == nil + end + end + + describe "when self is a proxy class" do + it "returns the address for self's proxy connection" do + Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_address.should == "localhost" + end + end +end + +describe "Net::HTTP#proxy_address" do + describe "when self is no proxy class instance" do + it "returns nil" do + Net::HTTP.new("localhost", 3333).proxy_address.should == nil + end + end + + describe "when self is a proxy class instance" do + it "returns the password for self's proxy connection" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.new("localhost", 3333).proxy_address.should == "localhost" + end + end +end diff --git a/spec/ruby/library/net-http/http/proxy_class_spec.rb b/spec/ruby/library/net-http/http/proxy_class_spec.rb new file mode 100644 index 0000000000..eda027c893 --- /dev/null +++ b/spec/ruby/library/net-http/http/proxy_class_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.proxy_class?" do + it "returns true if self is a class created with Net::HTTP.Proxy" do + Net::HTTP.proxy_class?.should == false + Net::HTTP.Proxy("localhost").proxy_class?.should == true + end +end diff --git a/spec/ruby/library/net-http/http/proxy_pass_spec.rb b/spec/ruby/library/net-http/http/proxy_pass_spec.rb new file mode 100644 index 0000000000..ad02d896c0 --- /dev/null +++ b/spec/ruby/library/net-http/http/proxy_pass_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.proxy_pass" do + describe "when self is no proxy class" do + it "returns nil" do + Net::HTTP.proxy_pass.should == nil + end + end + + describe "when self is a proxy class" do + it "returns nil if no password was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").proxy_pass.should == nil + end + + it "returns the password for self's proxy connection" do + Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_pass.should == "rocks" + end + end +end + +describe "Net::HTTP#proxy_pass" do + describe "when self is no proxy class instance" do + it "returns nil" do + Net::HTTP.new("localhost", 3333).proxy_pass.should == nil + end + end + + describe "when self is a proxy class instance" do + it "returns nil if no password was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_pass.should == nil + end + + it "returns the password for self's proxy connection" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.new("localhost", 3333).proxy_pass.should == "rocks" + end + end +end diff --git a/spec/ruby/library/net-http/http/proxy_port_spec.rb b/spec/ruby/library/net-http/http/proxy_port_spec.rb new file mode 100644 index 0000000000..21c1e4180e --- /dev/null +++ b/spec/ruby/library/net-http/http/proxy_port_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.proxy_port" do + describe "when self is no proxy class" do + it "returns nil" do + Net::HTTP.proxy_port.should == nil + end + end + + describe "when self is a proxy class" do + it "returns 80 if no port was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").proxy_port.should.eql?(80) + end + + it "returns the port for self's proxy connection" do + Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_port.should.eql?(1234) + end + end +end + +describe "Net::HTTP#proxy_port" do + describe "when self is no proxy class instance" do + it "returns nil" do + Net::HTTP.new("localhost", 3333).proxy_port.should == nil + end + end + + describe "when self is a proxy class instance" do + it "returns 80 if no port was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_port.should.eql?(80) + end + + it "returns the port for self's proxy connection" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.new("localhost", 3333).proxy_port.should.eql?(1234) + end + end +end diff --git a/spec/ruby/library/net-http/http/proxy_user_spec.rb b/spec/ruby/library/net-http/http/proxy_user_spec.rb new file mode 100644 index 0000000000..492ea2e8ee --- /dev/null +++ b/spec/ruby/library/net-http/http/proxy_user_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.proxy_user" do + describe "when self is no proxy class" do + it "returns nil" do + Net::HTTP.proxy_user.should == nil + end + end + + describe "when self is a proxy class" do + it "returns nil if no username was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").proxy_user.should == nil + end + + it "returns the username for self's proxy connection" do + Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_user.should == "rspec" + end + end +end + +describe "Net::HTTP#proxy_user" do + describe "when self is no proxy class instance" do + it "returns nil" do + Net::HTTP.new("localhost", 3333).proxy_user.should == nil + end + end + + describe "when self is a proxy class instance" do + it "returns nil if no username was set for self's proxy connection" do + Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_user.should == nil + end + + it "returns the username for self's proxy connection" do + http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") + http_with_proxy.new("localhost", 3333).proxy_user.should == "rspec" + end + end +end diff --git a/spec/ruby/library/net-http/http/put2_spec.rb b/spec/ruby/library/net-http/http/put2_spec.rb new file mode 100644 index 0000000000..7b03a39d0b --- /dev/null +++ b/spec/ruby/library/net-http/http/put2_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_put' + +describe "Net::HTTP#put2" do + it_behaves_like :net_http_request_put, :put2 +end diff --git a/spec/ruby/library/net-http/http/put_spec.rb b/spec/ruby/library/net-http/http/put_spec.rb new file mode 100644 index 0000000000..7ef9219f63 --- /dev/null +++ b/spec/ruby/library/net-http/http/put_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#put" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an put request to the passed path and returns the response" do + response = @http.put("/request", "test=test") + response.body.should == "Request type: PUT" + end + + it "returns a Net::HTTPResponse" do + @http.put("/request", "test=test").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/read_timeout_spec.rb b/spec/ruby/library/net-http/http/read_timeout_spec.rb new file mode 100644 index 0000000000..81e71337bb --- /dev/null +++ b/spec/ruby/library/net-http/http/read_timeout_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#read_timeout" do + it "returns the seconds to wait until reading one block" do + net = Net::HTTP.new("localhost") + net.read_timeout.should.eql?(60) + net.read_timeout = 10 + net.read_timeout.should.eql?(10) + end +end + +describe "Net::HTTP#read_timeout=" do + it "sets the seconds to wait till the connection is open" do + net = Net::HTTP.new("localhost") + net.read_timeout = 10 + net.read_timeout.should.eql?(10) + end + + it "returns the newly set value" do + net = Net::HTTP.new("localhost") + (net.read_timeout = 10).should.eql?(10) + end +end diff --git a/spec/ruby/library/net-http/http/request_get_spec.rb b/spec/ruby/library/net-http/http/request_get_spec.rb new file mode 100644 index 0000000000..98025a14a1 --- /dev/null +++ b/spec/ruby/library/net-http/http/request_get_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_get' + +describe "Net::HTTP#request_get" do + it_behaves_like :net_http_request_get, :get2 +end diff --git a/spec/ruby/library/net-http/http/request_head_spec.rb b/spec/ruby/library/net-http/http/request_head_spec.rb new file mode 100644 index 0000000000..8f514d4eee --- /dev/null +++ b/spec/ruby/library/net-http/http/request_head_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_head' + +describe "Net::HTTP#request_head" do + it_behaves_like :net_http_request_head, :request_head +end diff --git a/spec/ruby/library/net-http/http/request_post_spec.rb b/spec/ruby/library/net-http/http/request_post_spec.rb new file mode 100644 index 0000000000..719bd5a7ee --- /dev/null +++ b/spec/ruby/library/net-http/http/request_post_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_post' + +describe "Net::HTTP#request_post" do + it_behaves_like :net_http_request_post, :request_post +end diff --git a/spec/ruby/library/net-http/http/request_put_spec.rb b/spec/ruby/library/net-http/http/request_put_spec.rb new file mode 100644 index 0000000000..9fcf3a98d6 --- /dev/null +++ b/spec/ruby/library/net-http/http/request_put_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/request_put' + +describe "Net::HTTP#request_put" do + it_behaves_like :net_http_request_put, :request_put +end diff --git a/spec/ruby/library/net-http/http/request_spec.rb b/spec/ruby/library/net-http/http/request_spec.rb new file mode 100644 index 0000000000..e05ee96b55 --- /dev/null +++ b/spec/ruby/library/net-http/http/request_spec.rb @@ -0,0 +1,109 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#request" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when passed request_object" do + it "makes a HTTP Request based on the passed request_object" do + response = @http.request(Net::HTTP::Get.new("/request"), "test=test") + response.body.should == "Request type: GET" + + response = @http.request(Net::HTTP::Head.new("/request"), "test=test") + response.body.should == nil + + response = @http.request(Net::HTTP::Post.new("/request"), "test=test") + response.body.should == "Request type: POST" + + response = @http.request(Net::HTTP::Put.new("/request"), "test=test") + response.body.should == "Request type: PUT" + + response = @http.request(Net::HTTP::Proppatch.new("/request"), "test=test") + response.body.should == "Request type: PROPPATCH" + + response = @http.request(Net::HTTP::Lock.new("/request"), "test=test") + response.body.should == "Request type: LOCK" + + response = @http.request(Net::HTTP::Unlock.new("/request"), "test=test") + response.body.should == "Request type: UNLOCK" + + # TODO: Does not work? + #response = @http.request(Net::HTTP::Options.new("/request"), "test=test") + #response.body.should == nil + + response = @http.request(Net::HTTP::Propfind.new("/request"), "test=test") + response.body.should == "Request type: PROPFIND" + + response = @http.request(Net::HTTP::Delete.new("/request"), "test=test") + response.body.should == "Request type: DELETE" + + response = @http.request(Net::HTTP::Move.new("/request"), "test=test") + response.body.should == "Request type: MOVE" + + response = @http.request(Net::HTTP::Copy.new("/request"), "test=test") + response.body.should == "Request type: COPY" + + response = @http.request(Net::HTTP::Mkcol.new("/request"), "test=test") + response.body.should == "Request type: MKCOL" + + response = @http.request(Net::HTTP::Trace.new("/request"), "test=test") + response.body.should == "Request type: TRACE" + end + end + + describe "when passed request_object and request_body" do + it "sends the passed request_body when making the HTTP Request" do + response = @http.request(Net::HTTP::Get.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Head.new("/request/body"), "test=test") + response.body.should == nil + + response = @http.request(Net::HTTP::Post.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Put.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Proppatch.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Lock.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Unlock.new("/request/body"), "test=test") + response.body.should == "test=test" + + # TODO: Does not work? + #response = @http.request(Net::HTTP::Options.new("/request/body"), "test=test") + #response.body.should == nil + + response = @http.request(Net::HTTP::Propfind.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Delete.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Move.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Copy.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Mkcol.new("/request/body"), "test=test") + response.body.should == "test=test" + + response = @http.request(Net::HTTP::Trace.new("/request/body"), "test=test") + response.body.should == "test=test" + end + end +end diff --git a/spec/ruby/library/net-http/http/request_types_spec.rb b/spec/ruby/library/net-http/http/request_types_spec.rb new file mode 100644 index 0000000000..0adc625979 --- /dev/null +++ b/spec/ruby/library/net-http/http/request_types_spec.rb @@ -0,0 +1,254 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP::Get" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Get.should < Net::HTTPRequest + end + + it "represents the 'GET'-Request-Method" do + Net::HTTP::Get::METHOD.should == "GET" + end + + it "has no Request Body" do + Net::HTTP::Get::REQUEST_HAS_BODY.should == false + end + + it "has a Response Body" do + Net::HTTP::Get::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Head" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Head.should < Net::HTTPRequest + end + + it "represents the 'HEAD'-Request-Method" do + Net::HTTP::Head::METHOD.should == "HEAD" + end + + it "has no Request Body" do + Net::HTTP::Head::REQUEST_HAS_BODY.should == false + end + + it "has no Response Body" do + Net::HTTP::Head::RESPONSE_HAS_BODY.should == false + end +end + +describe "Net::HTTP::Post" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Post.should < Net::HTTPRequest + end + + it "represents the 'POST'-Request-Method" do + Net::HTTP::Post::METHOD.should == "POST" + end + + it "has a Request Body" do + Net::HTTP::Post::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Post::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Put" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Put.should < Net::HTTPRequest + end + + it "represents the 'PUT'-Request-Method" do + Net::HTTP::Put::METHOD.should == "PUT" + end + + it "has a Request Body" do + Net::HTTP::Put::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Put::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Delete" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Delete.should < Net::HTTPRequest + end + + it "represents the 'DELETE'-Request-Method" do + Net::HTTP::Delete::METHOD.should == "DELETE" + end + + it "has no Request Body" do + Net::HTTP::Delete::REQUEST_HAS_BODY.should == false + end + + it "has a Response Body" do + Net::HTTP::Delete::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Options" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Options.should < Net::HTTPRequest + end + + it "represents the 'OPTIONS'-Request-Method" do + Net::HTTP::Options::METHOD.should == "OPTIONS" + end + + it "has no Request Body" do + Net::HTTP::Options::REQUEST_HAS_BODY.should == false + end + + it "has no Response Body" do + Net::HTTP::Options::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Trace" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Trace.should < Net::HTTPRequest + end + + it "represents the 'TRACE'-Request-Method" do + Net::HTTP::Trace::METHOD.should == "TRACE" + end + + it "has no Request Body" do + Net::HTTP::Trace::REQUEST_HAS_BODY.should == false + end + + it "has a Response Body" do + Net::HTTP::Trace::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Propfind" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Propfind.should < Net::HTTPRequest + end + + it "represents the 'PROPFIND'-Request-Method" do + Net::HTTP::Propfind::METHOD.should == "PROPFIND" + end + + it "has a Request Body" do + Net::HTTP::Propfind::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Propfind::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Proppatch" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Proppatch.should < Net::HTTPRequest + end + + it "represents the 'PROPPATCH'-Request-Method" do + Net::HTTP::Proppatch::METHOD.should == "PROPPATCH" + end + + it "has a Request Body" do + Net::HTTP::Proppatch::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Proppatch::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Mkcol" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Mkcol.should < Net::HTTPRequest + end + + it "represents the 'MKCOL'-Request-Method" do + Net::HTTP::Mkcol::METHOD.should == "MKCOL" + end + + it "has a Request Body" do + Net::HTTP::Mkcol::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Mkcol::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Copy" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Copy.should < Net::HTTPRequest + end + + it "represents the 'COPY'-Request-Method" do + Net::HTTP::Copy::METHOD.should == "COPY" + end + + it "has no Request Body" do + Net::HTTP::Copy::REQUEST_HAS_BODY.should == false + end + + it "has a Response Body" do + Net::HTTP::Copy::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Move" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Move.should < Net::HTTPRequest + end + + it "represents the 'MOVE'-Request-Method" do + Net::HTTP::Move::METHOD.should == "MOVE" + end + + it "has no Request Body" do + Net::HTTP::Move::REQUEST_HAS_BODY.should == false + end + + it "has a Response Body" do + Net::HTTP::Move::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Lock" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Lock.should < Net::HTTPRequest + end + + it "represents the 'LOCK'-Request-Method" do + Net::HTTP::Lock::METHOD.should == "LOCK" + end + + it "has a Request Body" do + Net::HTTP::Lock::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Lock::RESPONSE_HAS_BODY.should == true + end +end + +describe "Net::HTTP::Unlock" do + it "is a subclass of Net::HTTPRequest" do + Net::HTTP::Unlock.should < Net::HTTPRequest + end + + it "represents the 'UNLOCK'-Request-Method" do + Net::HTTP::Unlock::METHOD.should == "UNLOCK" + end + + it "has a Request Body" do + Net::HTTP::Unlock::REQUEST_HAS_BODY.should == true + end + + it "has a Response Body" do + Net::HTTP::Unlock::RESPONSE_HAS_BODY.should == true + end +end diff --git a/spec/ruby/library/net-http/http/send_request_spec.rb b/spec/ruby/library/net-http/http/send_request_spec.rb new file mode 100644 index 0000000000..e2dfc505b6 --- /dev/null +++ b/spec/ruby/library/net-http/http/send_request_spec.rb @@ -0,0 +1,61 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#send_request" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + + # HEAD is special so handled separately + @methods = %w[ + GET POST PUT DELETE + OPTIONS + PROPFIND PROPPATCH LOCK UNLOCK + ] + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + # TODO: Does only work with GET and POST requests + describe "when passed type, path" do + it "sends a HTTP Request of the passed type to the passed path" do + response = @http.send_request("HEAD", "/request") + response.body.should == nil + + (@methods - %w[POST PUT]).each do |method| + response = @http.send_request(method, "/request") + response.body.should == "Request type: #{method}" + end + end + end + + describe "when passed type, path, body" do + it "sends a HTTP Request with the passed body" do + response = @http.send_request("HEAD", "/request/body", "test=test") + response.body.should == nil + + @methods.each do |method| + response = @http.send_request(method, "/request/body", "test=test") + response.body.should == "test=test" + end + end + end + + describe "when passed type, path, body, headers" do + it "sends a HTTP Request with the passed headers" do + referer = 'https://www.ruby-lang.org/'.freeze + + response = @http.send_request("HEAD", "/request/header", "test=test", "referer" => referer) + response.body.should == nil + + @methods.each do |method| + response = @http.send_request(method, "/request/header", "test=test", "referer" => referer) + response.body.should.include?({ "Referer" => referer }.inspect.delete("{}")) + end + end + end +end diff --git a/spec/ruby/library/net-http/http/set_debug_output_spec.rb b/spec/ruby/library/net-http/http/set_debug_output_spec.rb new file mode 100644 index 0000000000..491ac38b5d --- /dev/null +++ b/spec/ruby/library/net-http/http/set_debug_output_spec.rb @@ -0,0 +1,33 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" +require_relative 'fixtures/http_server' + +describe "Net::HTTP#set_debug_output when passed io" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sets the passed io as output stream for debugging" do + io = StringIO.new + + @http.set_debug_output(io) + @http.start + io.string.should_not.empty? + size = io.string.size + + @http.get("/") + io.string.size.should > size + end + + it "outputs a warning when the connection has already been started" do + @http.start + -> { @http.set_debug_output(StringIO.new) }.should complain(/Net::HTTP#set_debug_output called after HTTP started/) + end +end diff --git a/spec/ruby/library/net-http/http/shared/request_get.rb b/spec/ruby/library/net-http/http/shared/request_get.rb new file mode 100644 index 0000000000..4f2f152ea4 --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/request_get.rb @@ -0,0 +1,41 @@ +describe :net_http_request_get, shared: true do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when passed no block" do + it "sends a GET request to the passed path and returns the response" do + response = @http.send(@method, "/request") + response.body.should == "Request type: GET" + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request") + response.should.is_a?(Net::HTTPResponse) + end + end + + describe "when passed a block" do + it "sends a GET request to the passed path and returns the response" do + response = @http.send(@method, "/request") {} + response.body.should == "Request type: GET" + end + + it "yields the response to the passed block" do + @http.send(@method, "/request") do |response| + response.body.should == "Request type: GET" + end + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request") {} + response.should.is_a?(Net::HTTPResponse) + end + end +end diff --git a/spec/ruby/library/net-http/http/shared/request_head.rb b/spec/ruby/library/net-http/http/shared/request_head.rb new file mode 100644 index 0000000000..a5fe787d32 --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/request_head.rb @@ -0,0 +1,41 @@ +describe :net_http_request_head, shared: true do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when passed no block" do + it "sends a head request to the passed path and returns the response" do + response = @http.send(@method, "/request") + response.body.should == nil + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request") + response.should.is_a?(Net::HTTPResponse) + end + end + + describe "when passed a block" do + it "sends a head request to the passed path and returns the response" do + response = @http.send(@method, "/request") {} + response.body.should == nil + end + + it "yields the response to the passed block" do + @http.send(@method, "/request") do |response| + response.body.should == nil + end + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request") {} + response.should.is_a?(Net::HTTPResponse) + end + end +end diff --git a/spec/ruby/library/net-http/http/shared/request_post.rb b/spec/ruby/library/net-http/http/shared/request_post.rb new file mode 100644 index 0000000000..73cfd577cf --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/request_post.rb @@ -0,0 +1,41 @@ +describe :net_http_request_post, shared: true do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when passed no block" do + it "sends a post request to the passed path and returns the response" do + response = @http.send(@method, "/request", "test=test") + response.body.should == "Request type: POST" + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request", "test=test") + response.should.is_a?(Net::HTTPResponse) + end + end + + describe "when passed a block" do + it "sends a post request to the passed path and returns the response" do + response = @http.send(@method, "/request", "test=test") {} + response.body.should == "Request type: POST" + end + + it "yields the response to the passed block" do + @http.send(@method, "/request", "test=test") do |response| + response.body.should == "Request type: POST" + end + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request", "test=test") {} + response.should.is_a?(Net::HTTPResponse) + end + end +end diff --git a/spec/ruby/library/net-http/http/shared/request_put.rb b/spec/ruby/library/net-http/http/shared/request_put.rb new file mode 100644 index 0000000000..3b64d7e055 --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/request_put.rb @@ -0,0 +1,41 @@ +describe :net_http_request_put, shared: true do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + describe "when passed no block" do + it "sends a put request to the passed path and returns the response" do + response = @http.send(@method, "/request", "test=test") + response.body.should == "Request type: PUT" + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request", "test=test") + response.should.is_a?(Net::HTTPResponse) + end + end + + describe "when passed a block" do + it "sends a put request to the passed path and returns the response" do + response = @http.send(@method, "/request", "test=test") {} + response.body.should == "Request type: PUT" + end + + it "yields the response to the passed block" do + @http.send(@method, "/request", "test=test") do |response| + response.body.should == "Request type: PUT" + end + end + + it "returns a Net::HTTPResponse object" do + response = @http.send(@method, "/request", "test=test") {} + response.should.is_a?(Net::HTTPResponse) + end + end +end diff --git a/spec/ruby/library/net-http/http/shared/started.rb b/spec/ruby/library/net-http/http/shared/started.rb new file mode 100644 index 0000000000..0ab18a4e83 --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/started.rb @@ -0,0 +1,26 @@ +describe :net_http_started_p, shared: true do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "returns true when self has been started" do + @http.start + @http.send(@method).should == true + end + + it "returns false when self has not been started yet" do + @http.send(@method).should == false + end + + it "returns false when self has been stopped again" do + @http.start + @http.finish + @http.send(@method).should == false + end +end diff --git a/spec/ruby/library/net-http/http/shared/version_1_1.rb b/spec/ruby/library/net-http/http/shared/version_1_1.rb new file mode 100644 index 0000000000..84e7264eab --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/version_1_1.rb @@ -0,0 +1,6 @@ +describe :net_http_version_1_1_p, shared: true do + it "returns the state of net/http 1.1 features" do + Net::HTTP.version_1_2 + Net::HTTP.send(@method).should == false + end +end diff --git a/spec/ruby/library/net-http/http/shared/version_1_2.rb b/spec/ruby/library/net-http/http/shared/version_1_2.rb new file mode 100644 index 0000000000..dcf5419704 --- /dev/null +++ b/spec/ruby/library/net-http/http/shared/version_1_2.rb @@ -0,0 +1,6 @@ +describe :net_http_version_1_2_p, shared: true do + it "returns the state of net/http 1.2 features" do + Net::HTTP.version_1_2 + Net::HTTP.send(@method).should == true + end +end diff --git a/spec/ruby/library/net-http/http/socket_type_spec.rb b/spec/ruby/library/net-http/http/socket_type_spec.rb new file mode 100644 index 0000000000..f6826777b0 --- /dev/null +++ b/spec/ruby/library/net-http/http/socket_type_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP.socket_type" do + it "returns BufferedIO" do + Net::HTTP.socket_type.should == Net::BufferedIO + end +end diff --git a/spec/ruby/library/net-http/http/start_spec.rb b/spec/ruby/library/net-http/http/start_spec.rb new file mode 100644 index 0000000000..1aebc16f4d --- /dev/null +++ b/spec/ruby/library/net-http/http/start_spec.rb @@ -0,0 +1,111 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP.start" do + before :each do + NetHTTPSpecs.start_server + @port = NetHTTPSpecs.port + end + + after :each do + NetHTTPSpecs.stop_server + end + + describe "when not passed a block" do + before :each do + @http = Net::HTTP.start("localhost", @port) + end + + after :each do + @http.finish if @http.started? + end + + it "returns a new Net::HTTP object for the passed address and port" do + @http.should.is_a?(Net::HTTP) + @http.address.should == "localhost" + @http.port.should == @port + end + + it "opens the tcp connection" do + @http.started?.should == true + end + end + + describe "when passed a block" do + it "returns the blocks return value" do + Net::HTTP.start("localhost", @port) { :test }.should == :test + end + + it "yields the new Net::HTTP object to the block" do + yielded = false + Net::HTTP.start("localhost", @port) do |net| + yielded = true + net.should.is_a?(Net::HTTP) + end + yielded.should == true + end + + it "opens the tcp connection before yielding" do + Net::HTTP.start("localhost", @port) { |http| http.started?.should == true } + end + + it "closes the tcp connection after yielding" do + net = nil + Net::HTTP.start("localhost", @port) { |x| net = x } + net.started?.should == false + end + end +end + +describe "Net::HTTP#start" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "returns self" do + @http.start.should.equal?(@http) + end + + it "opens the tcp connection" do + @http.start + @http.started?.should == true + end + + describe "when self has already been started" do + it "raises an IOError" do + @http.start + -> { @http.start }.should.raise(IOError) + end + end + + describe "when passed a block" do + it "returns the blocks return value" do + @http.start { :test }.should == :test + end + + it "yields the new Net::HTTP object to the block" do + yielded = false + @http.start do |http| + yielded = true + http.should.equal?(@http) + end + yielded.should == true + end + + it "opens the tcp connection before yielding" do + @http.start { |http| http.started?.should == true } + end + + it "closes the tcp connection after yielding" do + @http.start { } + @http.started?.should == false + end + end +end diff --git a/spec/ruby/library/net-http/http/started_spec.rb b/spec/ruby/library/net-http/http/started_spec.rb new file mode 100644 index 0000000000..cbb82ceefa --- /dev/null +++ b/spec/ruby/library/net-http/http/started_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' +require_relative 'shared/started' + +describe "Net::HTTP#started?" do + it_behaves_like :net_http_started_p, :started? +end diff --git a/spec/ruby/library/net-http/http/trace_spec.rb b/spec/ruby/library/net-http/http/trace_spec.rb new file mode 100644 index 0000000000..e0ff741b04 --- /dev/null +++ b/spec/ruby/library/net-http/http/trace_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#trace" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends a TRACE request to the passed path and returns the response" do + response = @http.trace("/request") + response.body.should == "Request type: TRACE" + end + + it "returns a Net::HTTPResponse" do + @http.trace("/request").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/unlock_spec.rb b/spec/ruby/library/net-http/http/unlock_spec.rb new file mode 100644 index 0000000000..cbfc803f09 --- /dev/null +++ b/spec/ruby/library/net-http/http/unlock_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/http_server' + +describe "Net::HTTP#unlock" do + before :each do + NetHTTPSpecs.start_server + @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) + end + + after :each do + @http.finish if @http.started? + NetHTTPSpecs.stop_server + end + + it "sends an UNLOCK request to the passed path and returns the response" do + response = @http.unlock("/request", "test=test") + response.body.should == "Request type: UNLOCK" + end + + it "returns a Net::HTTPResponse" do + @http.unlock("/request", "test=test").should.is_a?(Net::HTTPResponse) + end +end diff --git a/spec/ruby/library/net-http/http/use_ssl_spec.rb b/spec/ruby/library/net-http/http/use_ssl_spec.rb new file mode 100644 index 0000000000..b283655359 --- /dev/null +++ b/spec/ruby/library/net-http/http/use_ssl_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTP#use_ssl?" do + it "returns false" do + http = Net::HTTP.new("localhost") + http.use_ssl?.should == false + end +end diff --git a/spec/ruby/library/net-http/http/version_1_1_spec.rb b/spec/ruby/library/net-http/http/version_1_1_spec.rb new file mode 100644 index 0000000000..34a4ac8a6b --- /dev/null +++ b/spec/ruby/library/net-http/http/version_1_1_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/version_1_1' + +describe "Net::HTTP.version_1_1?" do + it_behaves_like :net_http_version_1_1_p, :version_1_1? +end diff --git a/spec/ruby/library/net-http/http/version_1_2_spec.rb b/spec/ruby/library/net-http/http/version_1_2_spec.rb new file mode 100644 index 0000000000..4918597234 --- /dev/null +++ b/spec/ruby/library/net-http/http/version_1_2_spec.rb @@ -0,0 +1,20 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/version_1_2' + +describe "Net::HTTP.version_1_2" do + it "turns on net/http 1.2 features" do + Net::HTTP.version_1_2 + + Net::HTTP.version_1_2?.should == true + Net::HTTP.version_1_1?.should == false + end + + it "returns true" do + Net::HTTP.version_1_2.should == true + end +end + +describe "Net::HTTP.version_1_2?" do + it_behaves_like :net_http_version_1_2_p, :version_1_2? +end diff --git a/spec/ruby/library/net/http/httpexceptions/fixtures/classes.rb b/spec/ruby/library/net-http/httpexceptions/fixtures/classes.rb index abe8855eff..abe8855eff 100644 --- a/spec/ruby/library/net/http/httpexceptions/fixtures/classes.rb +++ b/spec/ruby/library/net-http/httpexceptions/fixtures/classes.rb diff --git a/spec/ruby/library/net-http/httpexceptions/initialize_spec.rb b/spec/ruby/library/net-http/httpexceptions/initialize_spec.rb new file mode 100644 index 0000000000..5316cca69d --- /dev/null +++ b/spec/ruby/library/net-http/httpexceptions/initialize_spec.rb @@ -0,0 +1,17 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPExceptions#initialize when passed message, response" do + before :each do + @exception = NetHTTPExceptionsSpecs::Simple.new("error message", "a http response") + end + + it "calls super with the passed message" do + @exception.message.should == "error message" + end + + it "sets self's response to the passed response" do + @exception.response.should == "a http response" + end +end diff --git a/spec/ruby/library/net-http/httpexceptions/response_spec.rb b/spec/ruby/library/net-http/httpexceptions/response_spec.rb new file mode 100644 index 0000000000..d718b1ae21 --- /dev/null +++ b/spec/ruby/library/net-http/httpexceptions/response_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPExceptions#response" do + it "returns self's response" do + exception = NetHTTPExceptionsSpecs::Simple.new("error message", "a http response") + exception.response.should == "a http response" + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/body_exist_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/body_exist_spec.rb new file mode 100644 index 0000000000..96a761929e --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/body_exist_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#body_exist?" do + it "returns true when the response is expected to have a body" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.body_exist?.should == true + + request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") + request.body_exist?.should == false + end + + describe "when $VERBOSE is true" do + it "emits a warning" do + request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") + -> { + request.body_exist? + }.should complain(/body_exist\? is obsolete/, verbose: true) + end + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/body_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/body_spec.rb new file mode 100644 index 0000000000..63cda994e5 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/body_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" + +describe "Net::HTTPGenericRequest#body" do + it "returns self's request body" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.body.should == nil + + request.body = "Some Content" + request.body.should == "Some Content" + end +end + +describe "Net::HTTPGenericRequest#body=" do + before :each do + @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + end + + it "sets self's body content to the passed String" do + @request.body = "Some Content" + @request.body.should == "Some Content" + end + + it "sets self's body stream to nil" do + @request.body_stream = StringIO.new("") + @request.body = "Some Content" + @request.body_stream.should == nil + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/body_stream_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/body_stream_spec.rb new file mode 100644 index 0000000000..3237dbb861 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/body_stream_spec.rb @@ -0,0 +1,32 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" + +describe "Net::HTTPGenericRequest#body_stream" do + it "returns self's body stream Object" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.body_stream.should == nil + + stream = StringIO.new("test") + request.body_stream = stream + request.body_stream.should.equal?(stream) + end +end + +describe "Net::HTTPGenericRequest#body_stream=" do + before :each do + @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + @stream = StringIO.new("test") + end + + it "sets self's body stream to the passed Object" do + @request.body_stream = @stream + @request.body_stream.should.equal?(@stream) + end + + it "sets self's body to nil" do + @request.body = "Some Content" + @request.body_stream = @stream + @request.body.should == nil + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/exec_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/exec_spec.rb new file mode 100644 index 0000000000..0ccf80e3b6 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/exec_spec.rb @@ -0,0 +1,135 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" + +describe "Net::HTTPGenericRequest#exec when passed socket, version, path" do + before :each do + @socket = StringIO.new(+"") + @buffered_socket = Net::BufferedIO.new(@socket) + end + + it "executes the request over the socket to the path using the HTTP version" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + + request.exec(@buffered_socket, "1.1", "/some/path") + str = @socket.string + + str.should =~ %r[POST /some/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str[-4..-1].should == "\r\n\r\n" + + request = Net::HTTPGenericRequest.new("GET", true, true, "/some/path", + "Content-Type" => "text/html") + + request.exec(@buffered_socket, "1.0", "/some/other/path") + str = @socket.string + + str.should =~ %r[GET /some/other/path HTTP/1.0\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: text/html\r\n] + str[-4..-1].should == "\r\n\r\n" + end + + describe "when a request body is set" do + ruby_version_is ""..."4.0" do + it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.body = "Some Content" + + request.exec(@buffered_socket, "1.1", "/some/other/path") + str = @socket.string + + str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n] + str.should =~ %r[Content-Length: 12\r\n] + str[-16..-1].should == "\r\n\r\nSome Content" + end + end + + it "correctly sets the 'Content-Length' header and includes the body" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", + "Content-Type" => "text/html") + request.body = "Some Content" + + request.exec(@buffered_socket, "1.1", "/some/other/path") + str = @socket.string + + str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: text/html\r\n] + str.should =~ %r[Content-Length: 12\r\n] + str[-16..-1].should == "\r\n\r\nSome Content" + end + end + + describe "when a body stream is set" do + ruby_version_is ""..."4.0" do + it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", + "Content-Length" => "10") + request.body_stream = StringIO.new("a" * 20) + + request.exec(@buffered_socket, "1.1", "/some/other/path") + str = @socket.string + + str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n] + str.should =~ %r[Content-Length: 10\r\n] + str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa" + end + end + + it "sends the whole stream, regardless of the 'Content-Length' header" do + request = Net::HTTPGenericRequest.new("POST", true, true,"/some/path", + "Content-Type" => "text/html", + "Content-Length" => "10") + request.body_stream = StringIO.new("a" * 20) + + request.exec(@buffered_socket, "1.1", "/some/other/path") + str = @socket.string + + str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: text/html\r\n] + str.should =~ %r[Content-Length: 10\r\n] + str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa" + end + + it "sends the request in chunks when 'Transfer-Encoding' is set to 'chunked'" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", + "Content-Type" => "text/html", + "Transfer-Encoding" => "chunked") + datasize = 1024 * 10 + request.body_stream = StringIO.new("a" * datasize) + + request.exec(@buffered_socket, "1.1", "/some/other/path") + str = @socket.string + + str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] + str.should =~ %r[Accept: \*/\*\r\n] + str.should =~ %r[Content-Type: text/html\r\n] + str.should =~ %r[Transfer-Encoding: chunked\r\n] + str =~ %r[\r\n\r\n] + str = $' + while datasize > 0 + chunk_size_line, str = str.split(/\r\n/, 2) + chunk_size = chunk_size_line[/\A[0-9A-Fa-f]+/].to_i(16) + str.slice!(0, chunk_size).should == 'a' * chunk_size + datasize -= chunk_size + str.slice!(0, 2).should == "\r\n" + end + datasize.should == 0 + str.should == %"0\r\n\r\n" + end + + it "raises an ArgumentError when the 'Content-Length' is not set or 'Transfer-Encoding' is not set to 'chunked'" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", + "Content-Type" => "text/html") + request.body_stream = StringIO.new("Some Content") + + -> { request.exec(@buffered_socket, "1.1", "/some/other/path") }.should.raise(ArgumentError) + end + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/inspect_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/inspect_spec.rb new file mode 100644 index 0000000000..d03b6e6953 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/inspect_spec.rb @@ -0,0 +1,25 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#inspect" do + it "returns a String representation of self" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.inspect.should == "#<Net::HTTPGenericRequest POST>" + + request = Net::HTTPGenericRequest.new("GET", false, true, "/some/path") + request.inspect.should == "#<Net::HTTPGenericRequest GET>" + + request = Net::HTTPGenericRequest.new("BLA", true, true, "/some/path") + request.inspect.should == "#<Net::HTTPGenericRequest BLA>" + + # Subclasses + request = Net::HTTP::Get.new("/some/path") + request.inspect.should == "#<Net::HTTP::Get GET>" + + request = Net::HTTP::Post.new("/some/path") + request.inspect.should == "#<Net::HTTP::Post POST>" + + request = Net::HTTP::Trace.new("/some/path") + request.inspect.should == "#<Net::HTTP::Trace TRACE>" + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/method_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/method_spec.rb new file mode 100644 index 0000000000..794bd328cd --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/method_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#method" do + it "returns self's request method" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.method.should == "POST" + + request = Net::HTTPGenericRequest.new("GET", false, true, "/some/path") + request.method.should == "GET" + + request = Net::HTTPGenericRequest.new("BLA", true, true, "/some/path") + request.method.should == "BLA" + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/path_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/path_spec.rb new file mode 100644 index 0000000000..a9fac3f67e --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/path_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#path" do + it "returns self's request path" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.path.should == "/some/path" + + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/other/path") + request.path.should == "/some/other/path" + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/request_body_permitted_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/request_body_permitted_spec.rb new file mode 100644 index 0000000000..ba836e8130 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/request_body_permitted_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#request_body_permitted?" do + it "returns true when the request is expected to have a body" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.request_body_permitted?.should == true + + request = Net::HTTPGenericRequest.new("POST", false, true, "/some/path") + request.request_body_permitted?.should == false + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/response_body_permitted_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/response_body_permitted_spec.rb new file mode 100644 index 0000000000..067500f60d --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/response_body_permitted_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#response_body_permitted?" do + it "returns true when the response is expected to have a body" do + request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + request.response_body_permitted?.should == true + + request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") + request.response_body_permitted?.should == false + end +end diff --git a/spec/ruby/library/net-http/httpgenericrequest/set_body_internal_spec.rb b/spec/ruby/library/net-http/httpgenericrequest/set_body_internal_spec.rb new file mode 100644 index 0000000000..f241d8d698 --- /dev/null +++ b/spec/ruby/library/net-http/httpgenericrequest/set_body_internal_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPGenericRequest#set_body_internal when passed string" do + before :each do + @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") + end + + it "sets self's body to the passed string" do + @request.set_body_internal("Some Content") + @request.body.should == "Some Content" + end + + it "raises an ArgumentError when the body or body_stream of self have already been set" do + @request.body = "Some Content" + -> { @request.set_body_internal("Some other Content") }.should.raise(ArgumentError) + + @request.body_stream = "Some Content" + -> { @request.set_body_internal("Some other Content") }.should.raise(ArgumentError) + end +end diff --git a/spec/ruby/library/net-http/httpheader/add_field_spec.rb b/spec/ruby/library/net-http/httpheader/add_field_spec.rb new file mode 100644 index 0000000000..8cd3d33517 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/add_field_spec.rb @@ -0,0 +1,31 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#add_field when passed key, value" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "adds the passed value to the header entry with the passed key" do + @headers.add_field("My-Header", "a") + @headers.get_fields("My-Header").should == ["a"] + + @headers.add_field("My-Header", "b") + @headers.get_fields("My-Header").should == ["a", "b"] + + @headers.add_field("My-Header", "c") + @headers.get_fields("My-Header").should == ["a", "b", "c"] + end + + it "is case-insensitive" do + @headers.add_field("My-Header", "a") + @headers.get_fields("My-Header").should == ["a"] + + @headers.add_field("my-header", "b") + @headers.get_fields("My-Header").should == ["a", "b"] + + @headers.add_field("MY-HEADER", "c") + @headers.get_fields("My-Header").should == ["a", "b", "c"] + end +end diff --git a/spec/ruby/library/net-http/httpheader/basic_auth_spec.rb b/spec/ruby/library/net-http/httpheader/basic_auth_spec.rb new file mode 100644 index 0000000000..db7ca84d13 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/basic_auth_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#basic_auth when passed account, password" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "sets the 'Authorization' Header entry for basic authorization" do + @headers.basic_auth("rubyspec", "rocks") + @headers["Authorization"].should == "Basic cnVieXNwZWM6cm9ja3M=" + end +end diff --git a/spec/ruby/library/net-http/httpheader/canonical_each_spec.rb b/spec/ruby/library/net-http/httpheader/canonical_each_spec.rb new file mode 100644 index 0000000000..64a5cae89e --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/canonical_each_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_capitalized' + +describe "Net::HTTPHeader#canonical_each" do + it_behaves_like :net_httpheader_each_capitalized, :canonical_each +end diff --git a/spec/ruby/library/net-http/httpheader/chunked_spec.rb b/spec/ruby/library/net-http/httpheader/chunked_spec.rb new file mode 100644 index 0000000000..4da218ae25 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/chunked_spec.rb @@ -0,0 +1,22 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#chunked?" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns true if the 'Transfer-Encoding' header entry is set to chunked" do + @headers.chunked?.should == false + + @headers["Transfer-Encoding"] = "bla" + @headers.chunked?.should == false + + @headers["Transfer-Encoding"] = "blachunkedbla" + @headers.chunked?.should == false + + @headers["Transfer-Encoding"] = "chunked" + @headers.chunked?.should == true + end +end diff --git a/spec/ruby/library/net-http/httpheader/content_length_spec.rb b/spec/ruby/library/net-http/httpheader/content_length_spec.rb new file mode 100644 index 0000000000..c66d5673c1 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/content_length_spec.rb @@ -0,0 +1,54 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#content_length" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns nil if no 'Content-Length' header entry is set" do + @headers.content_length.should == nil + end + + it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Length' header entry has an invalid format" do + @headers["Content-Length"] = "invalid" + -> { @headers.content_length }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "returns the value of the 'Content-Length' header entry as an Integer" do + @headers["Content-Length"] = "123" + @headers.content_length.should.eql?(123) + + @headers["Content-Length"] = "123valid" + @headers.content_length.should.eql?(123) + + @headers["Content-Length"] = "valid123" + @headers.content_length.should.eql?(123) + end +end + +describe "Net::HTTPHeader#content_length=" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "removes the 'Content-Length' entry if passed false or nil" do + @headers["Content-Length"] = "123" + @headers.content_length = nil + @headers["Content-Length"].should == nil + end + + it "sets the 'Content-Length' entry to the passed value" do + @headers.content_length = "123" + @headers["Content-Length"].should == "123" + + @headers.content_length = "123valid" + @headers["Content-Length"].should == "123" + end + + it "sets the 'Content-Length' entry to 0 if the passed value is not valid" do + @headers.content_length = "invalid123" + @headers["Content-Length"].should == "0" + end +end diff --git a/spec/ruby/library/net-http/httpheader/content_range_spec.rb b/spec/ruby/library/net-http/httpheader/content_range_spec.rb new file mode 100644 index 0000000000..3635fb3f1b --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/content_range_spec.rb @@ -0,0 +1,32 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#content_range" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns a Range object that represents the 'Content-Range' header entry" do + @headers["Content-Range"] = "bytes 0-499/1234" + @headers.content_range.should == (0..499) + + @headers["Content-Range"] = "bytes 500-1233/1234" + @headers.content_range.should == (500..1233) + end + + it "returns nil when there is no 'Content-Range' header entry" do + @headers.content_range.should == nil + end + + it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Range' has an invalid format" do + @headers["Content-Range"] = "invalid" + -> { @headers.content_range }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Content-Range"] = "bytes 123-abc" + -> { @headers.content_range }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Content-Range"] = "bytes abc-123" + -> { @headers.content_range }.should.raise(Net::HTTPHeaderSyntaxError) + end +end diff --git a/spec/ruby/library/net-http/httpheader/content_type_spec.rb b/spec/ruby/library/net-http/httpheader/content_type_spec.rb new file mode 100644 index 0000000000..c9c936ba0f --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/content_type_spec.rb @@ -0,0 +1,26 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_content_type' + +describe "Net::HTTPHeader#content_type" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the content type string, as per 'Content-Type' header entry" do + @headers["Content-Type"] = "text/html" + @headers.content_type.should == "text/html" + + @headers["Content-Type"] = "text/html;charset=utf-8" + @headers.content_type.should == "text/html" + end + + it "returns nil if the 'Content-Type' header entry does not exist" do + @headers.content_type.should == nil + end +end + +describe "Net::HTTPHeader#content_type=" do + it_behaves_like :net_httpheader_set_content_type, :content_type= +end diff --git a/spec/ruby/library/net-http/httpheader/delete_spec.rb b/spec/ruby/library/net-http/httpheader/delete_spec.rb new file mode 100644 index 0000000000..09bae65a13 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/delete_spec.rb @@ -0,0 +1,30 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#delete when passed key" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "removes the header entry with the passed key" do + @headers["My-Header"] = "test" + @headers.delete("My-Header") + + @headers["My-Header"].should == nil + @headers.size.should.eql?(0) + end + + it "returns the removed values" do + @headers["My-Header"] = "test" + @headers.delete("My-Header").should == ["test"] + end + + it "is case-insensitive" do + @headers["My-Header"] = "test" + @headers.delete("my-header") + + @headers["My-Header"].should == nil + @headers.size.should.eql?(0) + end +end diff --git a/spec/ruby/library/net-http/httpheader/each_capitalized_name_spec.rb b/spec/ruby/library/net-http/httpheader/each_capitalized_name_spec.rb new file mode 100644 index 0000000000..54874c0535 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_capitalized_name_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#each_capitalized_name" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + @headers["My-Header"] = "test" + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + end + + describe "when passed a block" do + it "yields each header key to the passed block (keys capitalized)" do + res = [] + @headers.each_capitalized_name do |key| + res << key + end + res.sort.should == ["My-Header", "My-Other-Header"] + end + end + + describe "when passed no block" do + it "returns an Enumerator" do + enumerator = @headers.each_capitalized_name + enumerator.should.instance_of?(Enumerator) + + res = [] + enumerator.each do |key| + res << key + end + res.sort.should == ["My-Header", "My-Other-Header"] + end + end +end diff --git a/spec/ruby/library/net-http/httpheader/each_capitalized_spec.rb b/spec/ruby/library/net-http/httpheader/each_capitalized_spec.rb new file mode 100644 index 0000000000..1e853995ea --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_capitalized_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_capitalized' + +describe "Net::HTTPHeader#each_capitalized" do + it_behaves_like :net_httpheader_each_capitalized, :each_capitalized +end diff --git a/spec/ruby/library/net-http/httpheader/each_header_spec.rb b/spec/ruby/library/net-http/httpheader/each_header_spec.rb new file mode 100644 index 0000000000..869feebacf --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_header_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_header' + +describe "Net::HTTPHeader#each_header" do + it_behaves_like :net_httpheader_each_header, :each_header +end diff --git a/spec/ruby/library/net-http/httpheader/each_key_spec.rb b/spec/ruby/library/net-http/httpheader/each_key_spec.rb new file mode 100644 index 0000000000..1ad145629f --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_key_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_name' + +describe "Net::HTTPHeader#each_key" do + it_behaves_like :net_httpheader_each_name, :each_key +end diff --git a/spec/ruby/library/net-http/httpheader/each_name_spec.rb b/spec/ruby/library/net-http/httpheader/each_name_spec.rb new file mode 100644 index 0000000000..f819bd989d --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_name_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_name' + +describe "Net::HTTPHeader#each_name" do + it_behaves_like :net_httpheader_each_name, :each_name +end diff --git a/spec/ruby/library/net-http/httpheader/each_spec.rb b/spec/ruby/library/net-http/httpheader/each_spec.rb new file mode 100644 index 0000000000..ff37249d0a --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/each_header' + +describe "Net::HTTPHeader#each" do + it_behaves_like :net_httpheader_each_header, :each +end diff --git a/spec/ruby/library/net-http/httpheader/each_value_spec.rb b/spec/ruby/library/net-http/httpheader/each_value_spec.rb new file mode 100644 index 0000000000..55ba4c1ef8 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/each_value_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#each_value" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + @headers["My-Header"] = "test" + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + end + + describe "when passed a block" do + it "yields each header entry's joined values" do + res = [] + @headers.each_value do |value| + res << value + end + res.sort.should == ["a, b", "test"] + end + end + + describe "when passed no block" do + it "returns an Enumerator" do + enumerator = @headers.each_value + enumerator.should.instance_of?(Enumerator) + + res = [] + enumerator.each do |key| + res << key + end + res.sort.should == ["a, b", "test"] + end + end +end diff --git a/spec/ruby/library/net-http/httpheader/element_reference_spec.rb b/spec/ruby/library/net-http/httpheader/element_reference_spec.rb new file mode 100644 index 0000000000..f12f8494db --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/element_reference_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#[] when passed key" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the value of the header entry with the passed key" do + @headers["My-Header"] = "test" + @headers["My-Header"].should == "test" + @headers["My-Other-Header"] = "another test" + @headers["My-Other-Header"].should == "another test" + end + + it "is case-insensitive" do + @headers["My-Header"] = "test" + + @headers['My-Header'].should == "test" + @headers['my-Header'].should == "test" + @headers['My-header'].should == "test" + @headers['my-header'].should == "test" + @headers['MY-HEADER'].should == "test" + end + + it "returns multi-element values joined together" do + @headers["My-Header"] = "test" + @headers.add_field("My-Header", "another test") + @headers.add_field("My-Header", "and one more") + + @headers["My-Header"].should == "test, another test, and one more" + end + + it "returns nil for non-existing entries" do + @headers["My-Header"].should == nil + @headers["My-Other-Header"].should == nil + end +end diff --git a/spec/ruby/library/net-http/httpheader/element_set_spec.rb b/spec/ruby/library/net-http/httpheader/element_set_spec.rb new file mode 100644 index 0000000000..633fe18b2e --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/element_set_spec.rb @@ -0,0 +1,41 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#[]= when passed key, value" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "sets the header entry with the passed key to the passed value" do + @headers["My-Header"] = "test" + @headers["My-Header"].should == "test" + + @headers["My-Header"] = "overwritten" + @headers["My-Header"].should == "overwritten" + + @headers["My-Other-Header"] = "another test" + @headers["My-Other-Header"].should == "another test" + end + + it "is case-insensitive" do + @headers['My-Header'] = "test" + @headers['my-Header'] = "another test" + @headers['My-header'] = "and one more test" + @headers['my-header'] = "and another one" + @headers['MY-HEADER'] = "last one" + + @headers["My-Header"].should == "last one" + @headers.size.should.eql?(1) + end + + it "removes the header entry with the passed key when the value is false or nil" do + @headers['My-Header'] = "test" + @headers['My-Header'] = nil + @headers['My-Header'].should == nil + + @headers['My-Header'] = "test" + @headers['My-Header'] = false + @headers['My-Header'].should == nil + end +end diff --git a/spec/ruby/library/net-http/httpheader/fetch_spec.rb b/spec/ruby/library/net-http/httpheader/fetch_spec.rb new file mode 100644 index 0000000000..d1c273dada --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/fetch_spec.rb @@ -0,0 +1,68 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#fetch" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + describe "when passed key" do + it "returns the header entry for the passed key" do + @headers["My-Header"] = "test" + @headers.fetch("My-Header").should == "test" + + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + @headers.add_field("My-Other-Header", "c") + @headers.fetch("My-Other-Header").should == "a, b, c" + end + + it "is case-insensitive" do + @headers["My-Header"] = "test" + @headers.fetch("my-header").should == "test" + @headers.fetch("MY-HEADER").should == "test" + end + + it "returns nil when there is no entry for the passed key" do + -> { @headers.fetch("my-header") }.should.raise(IndexError) + end + end + + describe "when passed key, default" do + it "returns the header entry for the passed key" do + @headers["My-Header"] = "test" + @headers.fetch("My-Header", "bla").should == "test" + + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + @headers.add_field("My-Other-Header", "c") + @headers.fetch("My-Other-Header", "bla").should == "a, b, c" + end + + # TODO: This raises a NoMethodError: undefined method `join' for "bla":String + it "returns the default value when there is no entry for the passed key" do + @headers.fetch("My-Header", "bla").should == "bla" + end + end + + describe "when passed key and block" do + it "returns the header entry for the passed key" do + @headers["My-Header"] = "test" + @headers.fetch("My-Header") {}.should == "test" + + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + @headers.add_field("My-Other-Header", "c") + -> { + @result = @headers.fetch("My-Other-Header", "bla") {} + }.should complain(/block supersedes default value argument/) + @result.should == "a, b, c" + end + + # TODO: This raises a NoMethodError: undefined method `join' for "redaeh-ym":String + it "yieldsand returns the block's return value when there is no entry for the passed key" do + @headers.fetch("My-Header") { |key| key.reverse }.should == "redaeh-ym" + end + end +end diff --git a/spec/ruby/library/net/http/httpheader/fixtures/classes.rb b/spec/ruby/library/net-http/httpheader/fixtures/classes.rb index b5ec6abd75..b5ec6abd75 100644 --- a/spec/ruby/library/net/http/httpheader/fixtures/classes.rb +++ b/spec/ruby/library/net-http/httpheader/fixtures/classes.rb diff --git a/spec/ruby/library/net-http/httpheader/form_data_spec.rb b/spec/ruby/library/net-http/httpheader/form_data_spec.rb new file mode 100644 index 0000000000..acd913f53a --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/form_data_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_form_data' + +describe "Net::HTTPHeader#form_data=" do + it_behaves_like :net_httpheader_set_form_data, :form_data= +end diff --git a/spec/ruby/library/net-http/httpheader/get_fields_spec.rb b/spec/ruby/library/net-http/httpheader/get_fields_spec.rb new file mode 100644 index 0000000000..76da63bc31 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/get_fields_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#get_fields when passed key" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns an Array containing the values of the header entry with the passed key" do + @headers["My-Header"] = "a" + @headers.get_fields("My-Header").should == ["a"] + + @headers.add_field("My-Header", "b") + @headers.get_fields("My-Header").should == ["a", "b"] + end + + it "returns a copy of the header entry values" do + @headers["My-Header"] = "a" + + @headers.get_fields("My-Header").clear + @headers.get_fields("My-Header").should == ["a"] + + @headers.get_fields("My-Header") << "b" + @headers.get_fields("My-Header").should == ["a"] + end + + it "returns nil for non-existing header entries" do + @headers.get_fields("My-Header").should == nil + @headers.get_fields("My-Other-header").should == nil + end + + it "is case-insensitive" do + @headers["My-Header"] = "test" + @headers.get_fields("My-Header").should == ["test"] + @headers.get_fields("my-header").should == ["test"] + @headers.get_fields("MY-HEADER").should == ["test"] + end +end diff --git a/spec/ruby/library/net-http/httpheader/initialize_http_header_spec.rb b/spec/ruby/library/net-http/httpheader/initialize_http_header_spec.rb new file mode 100644 index 0000000000..f9e6d208e5 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/initialize_http_header_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#initialize_http_header when passed Hash" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.allocate + end + + it "initializes the HTTP Header using the passed Hash" do + @headers.initialize_http_header("My-Header" => "test", "My-Other-Header" => "another test") + @headers["My-Header"].should == "test" + @headers["My-Other-Header"].should == "another test" + end + + it "complains about duplicate keys when in verbose mode" do + -> do + @headers.initialize_http_header("My-Header" => "test", "my-header" => "another test") + end.should complain(/duplicated HTTP header/, verbose: true) + end +end diff --git a/spec/ruby/library/net-http/httpheader/key_spec.rb b/spec/ruby/library/net-http/httpheader/key_spec.rb new file mode 100644 index 0000000000..65662591eb --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/key_spec.rb @@ -0,0 +1,21 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#key? when passed key" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns true if the header entry with the passed key exists" do + @headers.key?("My-Header").should == false + @headers["My-Header"] = "test" + @headers.key?("My-Header").should == true + end + + it "is case-insensitive" do + @headers["My-Header"] = "test" + @headers.key?("my-header").should == true + @headers.key?("MY-HEADER").should == true + end +end diff --git a/spec/ruby/library/net-http/httpheader/length_spec.rb b/spec/ruby/library/net-http/httpheader/length_spec.rb new file mode 100644 index 0000000000..57e32742e4 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/length_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/size' + +describe "Net::HTTPHeader#length" do + it_behaves_like :net_httpheader_size, :length +end diff --git a/spec/ruby/library/net-http/httpheader/main_type_spec.rb b/spec/ruby/library/net-http/httpheader/main_type_spec.rb new file mode 100644 index 0000000000..af7d3e05a3 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/main_type_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#main_type" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the 'main-content-type', as per 'Content-Type' header entry" do + @headers["Content-Type"] = "text/html" + @headers.main_type.should == "text" + + @headers["Content-Type"] = "application/pdf" + @headers.main_type.should == "application" + + @headers["Content-Type"] = "text/html;charset=utf-8" + @headers.main_type.should == "text" + end + + it "returns nil if the 'Content-Type' header entry does not exist" do + @headers.main_type.should == nil + end +end diff --git a/spec/ruby/library/net-http/httpheader/proxy_basic_auth_spec.rb b/spec/ruby/library/net-http/httpheader/proxy_basic_auth_spec.rb new file mode 100644 index 0000000000..d9f6afc5a7 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/proxy_basic_auth_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#proxy_basic_auth when passed account, password" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "sets the 'Proxy-Authorization' Header entry for basic authorization" do + @headers.proxy_basic_auth("rubyspec", "rocks") + @headers["Proxy-Authorization"].should == "Basic cnVieXNwZWM6cm9ja3M=" + end +end diff --git a/spec/ruby/library/net-http/httpheader/range_length_spec.rb b/spec/ruby/library/net-http/httpheader/range_length_spec.rb new file mode 100644 index 0000000000..34db7e6126 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/range_length_spec.rb @@ -0,0 +1,32 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#range_length" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the length of the Range represented by the 'Content-Range' header entry" do + @headers["Content-Range"] = "bytes 0-499/1234" + @headers.range_length.should.eql?(500) + + @headers["Content-Range"] = "bytes 500-1233/1234" + @headers.range_length.should.eql?(734) + end + + it "returns nil when there is no 'Content-Range' header entry" do + @headers.range_length.should == nil + end + + it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Range' has an invalid format" do + @headers["Content-Range"] = "invalid" + -> { @headers.range_length }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Content-Range"] = "bytes 123-abc" + -> { @headers.range_length }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Content-Range"] = "bytes abc-123" + -> { @headers.range_length }.should.raise(Net::HTTPHeaderSyntaxError) + end +end diff --git a/spec/ruby/library/net-http/httpheader/range_spec.rb b/spec/ruby/library/net-http/httpheader/range_spec.rb new file mode 100644 index 0000000000..0fc0feb5c9 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/range_spec.rb @@ -0,0 +1,48 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_range' + +describe "Net::HTTPHeader#range" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns a Range object that represents the 'Range' header entry" do + @headers["Range"] = "bytes=0-499" + @headers.range.should == [0..499] + + @headers["Range"] = "bytes=500-1233" + @headers.range.should == [500..1233] + + @headers["Range"] = "bytes=10-" + @headers.range.should == [10..-1] + + @headers["Range"] = "bytes=-10" + @headers.range.should == [-10..-1] + end + + it "returns nil when there is no 'Range' header entry" do + @headers.range.should == nil + end + + it "raises a Net::HTTPHeaderSyntaxError when the 'Range' has an invalid format" do + @headers["Range"] = "invalid" + -> { @headers.range }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Range"] = "bytes 123-abc" + -> { @headers.range }.should.raise(Net::HTTPHeaderSyntaxError) + + @headers["Range"] = "bytes abc-123" + -> { @headers.range }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "raises a Net::HTTPHeaderSyntaxError when the 'Range' was not specified" do + @headers["Range"] = "bytes=-" + -> { @headers.range }.should.raise(Net::HTTPHeaderSyntaxError) + end +end + +describe "Net::HTTPHeader#range=" do + it_behaves_like :net_httpheader_set_range, :range= +end diff --git a/spec/ruby/library/net-http/httpheader/set_content_type_spec.rb b/spec/ruby/library/net-http/httpheader/set_content_type_spec.rb new file mode 100644 index 0000000000..7ec4f90b8e --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/set_content_type_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_content_type' + +describe "Net::HTTPHeader#set_content_type" do + it_behaves_like :net_httpheader_set_content_type, :set_content_type +end diff --git a/spec/ruby/library/net-http/httpheader/set_form_data_spec.rb b/spec/ruby/library/net-http/httpheader/set_form_data_spec.rb new file mode 100644 index 0000000000..7aac19f045 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/set_form_data_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_form_data' + +describe "Net::HTTPHeader#set_form_data" do + it_behaves_like :net_httpheader_set_form_data, :set_form_data +end diff --git a/spec/ruby/library/net-http/httpheader/set_range_spec.rb b/spec/ruby/library/net-http/httpheader/set_range_spec.rb new file mode 100644 index 0000000000..0f98de55e6 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/set_range_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/set_range' + +describe "Net::HTTPHeader#set_range" do + it_behaves_like :net_httpheader_set_range, :set_range +end diff --git a/spec/ruby/library/net-http/httpheader/shared/each_capitalized.rb b/spec/ruby/library/net-http/httpheader/shared/each_capitalized.rb new file mode 100644 index 0000000000..c12df62787 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/shared/each_capitalized.rb @@ -0,0 +1,31 @@ +describe :net_httpheader_each_capitalized, shared: true do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + @headers["my-header"] = "test" + @headers.add_field("my-Other-Header", "a") + @headers.add_field("My-Other-header", "b") + end + + describe "when passed a block" do + it "yields each header entry to the passed block (capitalized keys, values joined)" do + res = [] + @headers.send(@method) do |key, value| + res << [key, value] + end + res.sort.should == [["My-Header", "test"], ["My-Other-Header", "a, b"]] + end + end + + describe "when passed no block" do + it "returns an Enumerator" do + enumerator = @headers.send(@method) + enumerator.should.instance_of?(Enumerator) + + res = [] + enumerator.each do |*key| + res << key + end + res.sort.should == [["My-Header", "test"], ["My-Other-Header", "a, b"]] + end + end +end diff --git a/spec/ruby/library/net-http/httpheader/shared/each_header.rb b/spec/ruby/library/net-http/httpheader/shared/each_header.rb new file mode 100644 index 0000000000..5913665a4d --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/shared/each_header.rb @@ -0,0 +1,31 @@ +describe :net_httpheader_each_header, shared: true do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + @headers["My-Header"] = "test" + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + end + + describe "when passed a block" do + it "yields each header entry to the passed block (keys in lower case, values joined)" do + res = [] + @headers.send(@method) do |key, value| + res << [key, value] + end + res.sort.should == [["my-header", "test"], ["my-other-header", "a, b"]] + end + end + + describe "when passed no block" do + it "returns an Enumerator" do + enumerator = @headers.send(@method) + enumerator.should.instance_of?(Enumerator) + + res = [] + enumerator.each do |*key| + res << key + end + res.sort.should == [["my-header", "test"], ["my-other-header", "a, b"]] + end + end +end diff --git a/spec/ruby/library/net-http/httpheader/shared/each_name.rb b/spec/ruby/library/net-http/httpheader/shared/each_name.rb new file mode 100644 index 0000000000..29c9400fef --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/shared/each_name.rb @@ -0,0 +1,31 @@ +describe :net_httpheader_each_name, shared: true do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + @headers["My-Header"] = "test" + @headers.add_field("My-Other-Header", "a") + @headers.add_field("My-Other-Header", "b") + end + + describe "when passed a block" do + it "yields each header key to the passed block (keys in lower case)" do + res = [] + @headers.send(@method) do |key| + res << key + end + res.sort.should == ["my-header", "my-other-header"] + end + end + + describe "when passed no block" do + it "returns an Enumerator" do + enumerator = @headers.send(@method) + enumerator.should.instance_of?(Enumerator) + + res = [] + enumerator.each do |key| + res << key + end + res.sort.should == ["my-header", "my-other-header"] + end + end +end diff --git a/spec/ruby/library/net/http/httpheader/shared/set_content_type.rb b/spec/ruby/library/net-http/httpheader/shared/set_content_type.rb index b7359bdca6..b7359bdca6 100644 --- a/spec/ruby/library/net/http/httpheader/shared/set_content_type.rb +++ b/spec/ruby/library/net-http/httpheader/shared/set_content_type.rb diff --git a/spec/ruby/library/net/http/httpheader/shared/set_form_data.rb b/spec/ruby/library/net-http/httpheader/shared/set_form_data.rb index db20b18803..db20b18803 100644 --- a/spec/ruby/library/net/http/httpheader/shared/set_form_data.rb +++ b/spec/ruby/library/net-http/httpheader/shared/set_form_data.rb diff --git a/spec/ruby/library/net-http/httpheader/shared/set_range.rb b/spec/ruby/library/net-http/httpheader/shared/set_range.rb new file mode 100644 index 0000000000..9ab50a075e --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/shared/set_range.rb @@ -0,0 +1,89 @@ +describe :net_httpheader_set_range, shared: true do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + describe "when passed nil" do + it "returns nil" do + @headers.send(@method, nil).should == nil + end + + it "deletes the 'Range' header entry" do + @headers["Range"] = "bytes 0-499/1234" + @headers.send(@method, nil) + @headers["Range"].should == nil + end + end + + describe "when passed Numeric" do + it "sets the 'Range' header entry based on the passed Numeric" do + @headers.send(@method, 10) + @headers["Range"].should == "bytes=0-9" + + @headers.send(@method, -10) + @headers["Range"].should == "bytes=-10" + + @headers.send(@method, 10.9) + @headers["Range"].should == "bytes=0-9" + end + end + + describe "when passed Range" do + it "sets the 'Range' header entry based on the passed Range" do + @headers.send(@method, 10..200) + @headers["Range"].should == "bytes=10-200" + + @headers.send(@method, 1..5) + @headers["Range"].should == "bytes=1-5" + + @headers.send(@method, 1...5) + @headers["Range"].should == "bytes=1-4" + + @headers.send(@method, 234..567) + @headers["Range"].should == "bytes=234-567" + + @headers.send(@method, -5..-1) + @headers["Range"].should == "bytes=-5" + + @headers.send(@method, 1..-1) + @headers["Range"].should == "bytes=1-" + end + + it "raises a Net::HTTPHeaderSyntaxError when the first Range element is negative" do + -> { @headers.send(@method, -10..5) }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "raises a Net::HTTPHeaderSyntaxError when the last Range element is negative" do + -> { @headers.send(@method, 10..-5) }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "raises a Net::HTTPHeaderSyntaxError when the last Range element is smaller than the first" do + -> { @headers.send(@method, 10..5) }.should.raise(Net::HTTPHeaderSyntaxError) + end + end + + describe "when passed start, end" do + it "sets the 'Range' header entry based on the passed start and length values" do + @headers.send(@method, 10, 200) + @headers["Range"].should == "bytes=10-209" + + @headers.send(@method, 1, 5) + @headers["Range"].should == "bytes=1-5" + + @headers.send(@method, 234, 567) + @headers["Range"].should == "bytes=234-800" + end + + it "raises a Net::HTTPHeaderSyntaxError when start is negative" do + -> { @headers.send(@method, -10, 5) }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "raises a Net::HTTPHeaderSyntaxError when start + length is negative" do + -> { @headers.send(@method, 10, -15) }.should.raise(Net::HTTPHeaderSyntaxError) + end + + it "raises a Net::HTTPHeaderSyntaxError when length is negative" do + -> { @headers.send(@method, 10, -4) }.should.raise(Net::HTTPHeaderSyntaxError) + end + end +end diff --git a/spec/ruby/library/net-http/httpheader/shared/size.rb b/spec/ruby/library/net-http/httpheader/shared/size.rb new file mode 100644 index 0000000000..b38310a940 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/shared/size.rb @@ -0,0 +1,18 @@ +describe :net_httpheader_size, shared: true do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the number of header entries in self" do + @headers.send(@method).should.eql?(0) + + @headers["a"] = "b" + @headers.send(@method).should.eql?(1) + + @headers["b"] = "b" + @headers.send(@method).should.eql?(2) + + @headers["c"] = "c" + @headers.send(@method).should.eql?(3) + end +end diff --git a/spec/ruby/library/net-http/httpheader/size_spec.rb b/spec/ruby/library/net-http/httpheader/size_spec.rb new file mode 100644 index 0000000000..210060ce21 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/size_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' +require_relative 'shared/size' + +describe "Net::HTTPHeader#size" do + it_behaves_like :net_httpheader_size, :size +end diff --git a/spec/ruby/library/net-http/httpheader/sub_type_spec.rb b/spec/ruby/library/net-http/httpheader/sub_type_spec.rb new file mode 100644 index 0000000000..9e7d2a5368 --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/sub_type_spec.rb @@ -0,0 +1,32 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#sub_type" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns the 'sub-content-type', as per 'Content-Type' header entry" do + @headers["Content-Type"] = "text/html" + @headers.sub_type.should == "html" + + @headers["Content-Type"] = "application/pdf" + @headers.sub_type.should == "pdf" + + @headers["Content-Type"] = "text/html;charset=utf-8" + @headers.sub_type.should == "html" + end + + it "returns nil if no 'sub-content-type' is set" do + @headers["Content-Type"] = "text" + @headers.sub_type.should == nil + + @headers["Content-Type"] = "text;charset=utf-8" + @headers.sub_type.should == nil + end + + it "returns nil if the 'Content-Type' header entry does not exist" do + @headers.sub_type.should == nil + end +end diff --git a/spec/ruby/library/net-http/httpheader/to_hash_spec.rb b/spec/ruby/library/net-http/httpheader/to_hash_spec.rb new file mode 100644 index 0000000000..e245c20d4c --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/to_hash_spec.rb @@ -0,0 +1,25 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#to_hash" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns a Hash representing all Header entries (keys in lower case, values as arrays)" do + @headers.to_hash.should == {} + + @headers["My-Header"] = "test" + @headers.to_hash.should == { "my-header" => ["test"] } + + @headers.add_field("My-Header", "another test") + @headers.to_hash.should == { "my-header" => ["test", "another test"] } + end + + it "does not allow modifying the headers from the returned hash" do + @headers.to_hash["my-header"] = ["test"] + @headers.to_hash.should == {} + @headers.key?("my-header").should == false + end +end diff --git a/spec/ruby/library/net-http/httpheader/type_params_spec.rb b/spec/ruby/library/net-http/httpheader/type_params_spec.rb new file mode 100644 index 0000000000..ac97e2b48c --- /dev/null +++ b/spec/ruby/library/net-http/httpheader/type_params_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'fixtures/classes' + +describe "Net::HTTPHeader#type_params" do + before :each do + @headers = NetHTTPHeaderSpecs::Example.new + end + + it "returns additional 'Content-Type' information as a Hash" do + @headers["Content-Type"] = "text/html;charset=utf-8" + @headers.type_params.should == {"charset" => "utf-8"} + + @headers["Content-Type"] = "text/html; charset=utf-8; rubyspec=rocks" + @headers.type_params.should == {"charset" => "utf-8", "rubyspec" => "rocks"} + end + + it "returns an empty Hash when no additional 'Content-Type' information is set" do + @headers.type_params.should == {} + + @headers["Content-Type"] = "text/html" + @headers.type_params.should == {} + end +end diff --git a/spec/ruby/library/net-http/httprequest/initialize_spec.rb b/spec/ruby/library/net-http/httprequest/initialize_spec.rb new file mode 100644 index 0000000000..1229986bef --- /dev/null +++ b/spec/ruby/library/net-http/httprequest/initialize_spec.rb @@ -0,0 +1,45 @@ +require_relative '../../../spec_helper' +require 'net/http' + +module NetHTTPRequestSpecs + class TestRequest < Net::HTTPRequest + METHOD = "TEST" + REQUEST_HAS_BODY = false + RESPONSE_HAS_BODY = true + end +end + +describe "Net::HTTPRequest#initialize" do + before :each do + @req = NetHTTPRequestSpecs::TestRequest.allocate + end + + it "uses the METHOD constants to set the request method" do + @req.send(:initialize, "/some/path") + @req.method.should == "TEST" + end + + it "uses the REQUEST_HAS_BODY to set whether the Request has a body or not" do + @req.send(:initialize, "/some/path") + @req.request_body_permitted?.should == false + end + + it "uses the RESPONSE_HAS_BODY to set whether the Response can have a body or not" do + @req.send(:initialize, "/some/path") + @req.response_body_permitted?.should == true + end + + describe "when passed path" do + it "sets self's path to the passed path" do + @req.send(:initialize, "/some/path") + @req.path.should == "/some/path" + end + end + + describe "when passed path, headers" do + it "uses the passed headers Hash to initialize self's header entries" do + @req.send(:initialize, "/some/path", "Content-Type" => "text/html") + @req["Content-Type"].should == "text/html" + end + end +end diff --git a/spec/ruby/library/net-http/httpresponse/body_permitted_spec.rb b/spec/ruby/library/net-http/httpresponse/body_permitted_spec.rb new file mode 100644 index 0000000000..68965de4a1 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/body_permitted_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse.body_permitted?" do + it "returns true if this response type can have a response body" do + Net::HTTPUnknownResponse.should.body_permitted? + Net::HTTPInformation.should_not.body_permitted? + Net::HTTPSuccess.should.body_permitted? + Net::HTTPRedirection.should.body_permitted? + Net::HTTPClientError.should.body_permitted? + Net::HTTPServerError.should.body_permitted? + end +end diff --git a/spec/ruby/library/net-http/httpresponse/body_spec.rb b/spec/ruby/library/net-http/httpresponse/body_spec.rb new file mode 100644 index 0000000000..ddfcd834c4 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/body_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/body' + +describe "Net::HTTPResponse#body" do + it_behaves_like :net_httpresponse_body, :body +end diff --git a/spec/ruby/library/net-http/httpresponse/code_spec.rb b/spec/ruby/library/net-http/httpresponse/code_spec.rb new file mode 100644 index 0000000000..699062ad97 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/code_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#code" do + it "returns the result code string" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.code.should == "???" + + res = Net::HTTPInformation.new("1.0", "1xx", "test response") + res.code.should == "1xx" + + res = Net::HTTPSuccess.new("1.0", "2xx", "test response") + res.code.should == "2xx" + + res = Net::HTTPRedirection.new("1.0", "3xx", "test response") + res.code.should == "3xx" + + res = Net::HTTPClientError.new("1.0", "4xx", "test response") + res.code.should == "4xx" + + res = Net::HTTPServerError.new("1.0", "5xx", "test response") + res.code.should == "5xx" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/code_type_spec.rb b/spec/ruby/library/net-http/httpresponse/code_type_spec.rb new file mode 100644 index 0000000000..beb661cbbe --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/code_type_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#code_type" do + it "returns self's class" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.code_type.should == Net::HTTPUnknownResponse + + res = Net::HTTPInformation.new("1.0", "1xx", "test response") + res.code_type.should == Net::HTTPInformation + + res = Net::HTTPSuccess.new("1.0", "2xx", "test response") + res.code_type.should == Net::HTTPSuccess + + res = Net::HTTPRedirection.new("1.0", "3xx", "test response") + res.code_type.should == Net::HTTPRedirection + + res = Net::HTTPClientError.new("1.0", "4xx", "test response") + res.code_type.should == Net::HTTPClientError + + res = Net::HTTPServerError.new("1.0", "5xx", "test response") + res.code_type.should == Net::HTTPServerError + end +end diff --git a/spec/ruby/library/net-http/httpresponse/entity_spec.rb b/spec/ruby/library/net-http/httpresponse/entity_spec.rb new file mode 100644 index 0000000000..ca8c4b29c0 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/entity_spec.rb @@ -0,0 +1,7 @@ +require_relative '../../../spec_helper' +require 'net/http' +require_relative 'shared/body' + +describe "Net::HTTPResponse#entity" do + it_behaves_like :net_httpresponse_body, :entity +end diff --git a/spec/ruby/library/net-http/httpresponse/error_spec.rb b/spec/ruby/library/net-http/httpresponse/error_spec.rb new file mode 100644 index 0000000000..e194df95af --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/error_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#error!" do + it "raises self's class 'EXCEPTION_TYPE' Exception" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + -> { res.error! }.should.raise(Net::HTTPError) + + res = Net::HTTPInformation.new("1.0", "1xx", "test response") + -> { res.error! }.should.raise(Net::HTTPError) + + res = Net::HTTPSuccess.new("1.0", "2xx", "test response") + -> { res.error! }.should.raise(Net::HTTPError) + + res = Net::HTTPRedirection.new("1.0", "3xx", "test response") + -> { res.error! }.should.raise(Net::HTTPRetriableError) + + res = Net::HTTPClientError.new("1.0", "4xx", "test response") + -> { res.error! }.should.raise(Net::HTTPClientException) + + res = Net::HTTPServerError.new("1.0", "5xx", "test response") + -> { res.error! }.should.raise(Net::HTTPFatalError) + end +end diff --git a/spec/ruby/library/net-http/httpresponse/error_type_spec.rb b/spec/ruby/library/net-http/httpresponse/error_type_spec.rb new file mode 100644 index 0000000000..3969621a5e --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/error_type_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#error_type" do + it "returns self's class 'EXCEPTION_TYPE' constant" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.error_type.should == Net::HTTPError + + res = Net::HTTPInformation.new("1.0", "1xx", "test response") + res.error_type.should == Net::HTTPError + + res = Net::HTTPSuccess.new("1.0", "2xx", "test response") + res.error_type.should == Net::HTTPError + + res = Net::HTTPRedirection.new("1.0", "3xx", "test response") + res.error_type.should == Net::HTTPRetriableError + + res = Net::HTTPClientError.new("1.0", "4xx", "test response") + res.error_type.should == Net::HTTPClientException + + res = Net::HTTPServerError.new("1.0", "5xx", "test response") + res.error_type.should == Net::HTTPFatalError + end +end diff --git a/spec/ruby/library/net-http/httpresponse/exception_type_spec.rb b/spec/ruby/library/net-http/httpresponse/exception_type_spec.rb new file mode 100644 index 0000000000..dd2761a744 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/exception_type_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse.exception_type" do + it "returns self's 'EXCEPTION_TYPE' constant" do + Net::HTTPUnknownResponse.exception_type.should == Net::HTTPError + Net::HTTPInformation.exception_type.should == Net::HTTPError + Net::HTTPSuccess.exception_type.should == Net::HTTPError + Net::HTTPRedirection.exception_type.should == Net::HTTPRetriableError + Net::HTTPClientError.exception_type.should == Net::HTTPClientException + Net::HTTPServerError.exception_type.should == Net::HTTPFatalError + end +end diff --git a/spec/ruby/library/net-http/httpresponse/header_spec.rb b/spec/ruby/library/net-http/httpresponse/header_spec.rb new file mode 100644 index 0000000000..3ddadfb8e4 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/header_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#header" do + it "returns self" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.response.should.equal?(res) + end +end diff --git a/spec/ruby/library/net-http/httpresponse/http_version_spec.rb b/spec/ruby/library/net-http/httpresponse/http_version_spec.rb new file mode 100644 index 0000000000..a3e413a360 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/http_version_spec.rb @@ -0,0 +1,12 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#http_version" do + it "returns self's http version" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.http_version.should == "1.0" + + res = Net::HTTPUnknownResponse.new("1.1", "???", "test response") + res.http_version.should == "1.1" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/initialize_spec.rb b/spec/ruby/library/net-http/httpresponse/initialize_spec.rb new file mode 100644 index 0000000000..673c11a245 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/initialize_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#initialize when passed http_version, response_code, response_message" do + it "sets self http_version, response_code and response_message to the passed values" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.http_version.should == "1.0" + res.code.should == "???" + res.message.should == "test response" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/inspect_spec.rb b/spec/ruby/library/net-http/httpresponse/inspect_spec.rb new file mode 100644 index 0000000000..43071ec8cd --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/inspect_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" + +describe "Net::HTTPResponse#inspect" do + it "returns a String representation of self" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=false>" + + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + socket = Net::BufferedIO.new(StringIO.new("test body")) + res.reading_body(socket, true) {} + res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=true>" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/message_spec.rb b/spec/ruby/library/net-http/httpresponse/message_spec.rb new file mode 100644 index 0000000000..5ba73bb449 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/message_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#message" do + it "returns self's response message" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.message.should == "test response" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/msg_spec.rb b/spec/ruby/library/net-http/httpresponse/msg_spec.rb new file mode 100644 index 0000000000..04f5836d7a --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/msg_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#msg" do + it "returns self's response message" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.message.should == "test response" + end +end diff --git a/spec/ruby/library/net-http/httpresponse/read_body_spec.rb b/spec/ruby/library/net-http/httpresponse/read_body_spec.rb new file mode 100644 index 0000000000..d8b2418624 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/read_body_spec.rb @@ -0,0 +1,86 @@ +require_relative '../../../spec_helper' +require 'net/http' +require 'stringio' + +describe "Net::HTTPResponse#read_body" do + before :each do + @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + @socket = Net::BufferedIO.new(StringIO.new("test body")) + end + + describe "when passed no arguments" do + it "returns the read body" do + @res.reading_body(@socket, true) do + @res.read_body.should == "test body" + end + end + + it "returns the previously read body if called a second time" do + @res.reading_body(@socket, true) do + @res.read_body.should.equal?(@res.read_body) + end + end + end + + describe "when passed a buffer" do + it "reads the body to the passed buffer" do + @res.reading_body(@socket, true) do + buffer = +"" + @res.read_body(buffer) + buffer.should == "test body" + end + end + + it "returns the passed buffer" do + @res.reading_body(@socket, true) do + buffer = +"" + @res.read_body(buffer).should.equal?(buffer) + end + end + + it "raises an IOError if called a second time" do + @res.reading_body(@socket, true) do + @res.read_body(+"") + -> { @res.read_body(+"") }.should.raise(IOError) + end + end + end + + describe "when passed a block" do + it "reads the body and yields it to the passed block (in chunks)" do + @res.reading_body(@socket, true) do + yielded = false + + buffer = +"" + @res.read_body do |body| + yielded = true + buffer << body + end + + yielded.should == true + buffer.should == "test body" + end + end + + it "returns the ReadAdapter" do + @res.reading_body(@socket, true) do + @res.read_body { nil }.should.is_a?(Net::ReadAdapter) + end + end + + it "raises an IOError if called a second time" do + @res.reading_body(@socket, true) do + @res.read_body {} + -> { @res.read_body {} }.should.raise(IOError) + end + end + end + + describe "when passed buffer and block" do + it "raises an ArgumentError" do + @res.reading_body(@socket, true) do + -> { @res.read_body(+"") {} }.should.raise(ArgumentError) + end + end + end +end diff --git a/spec/ruby/library/net-http/httpresponse/read_header_spec.rb b/spec/ruby/library/net-http/httpresponse/read_header_spec.rb new file mode 100644 index 0000000000..70ce988502 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/read_header_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#read_header" do + it "returns self" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.response.should.equal?(res) + end +end diff --git a/spec/ruby/library/net-http/httpresponse/read_new_spec.rb b/spec/ruby/library/net-http/httpresponse/read_new_spec.rb new file mode 100644 index 0000000000..3795e29d83 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/read_new_spec.rb @@ -0,0 +1,23 @@ +require_relative '../../../spec_helper' +require 'net/http' +require 'stringio' + +describe "Net::HTTPResponse.read_new" do + it "creates a HTTPResponse object based on the response read from the passed socket" do + socket = Net::BufferedIO.new(StringIO.new(<<EOS)) +HTTP/1.1 200 OK +Content-Type: text/html; charset=utf-8 + +test-body +EOS + response = Net::HTTPResponse.read_new(socket) + + response.should.is_a?(Net::HTTPOK) + response.code.should == "200" + response["Content-Type"].should == "text/html; charset=utf-8" + + response.reading_body(socket, true) do + response.body.should == "test-body\n" + end + end +end diff --git a/spec/ruby/library/net-http/httpresponse/reading_body_spec.rb b/spec/ruby/library/net-http/httpresponse/reading_body_spec.rb new file mode 100644 index 0000000000..a3671d6eb5 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/reading_body_spec.rb @@ -0,0 +1,58 @@ +require_relative '../../../spec_helper' +require 'net/http' +require "stringio" + +describe "Net::HTTPResponse#reading_body" do + before :each do + @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + @socket = Net::BufferedIO.new(StringIO.new("test body")) + end + + describe "when body_allowed is true" do + it "reads and returns the response body for self from the passed socket" do + @res.reading_body(@socket, true) {}.should == "test body" + @res.body.should == "test body" + end + + it "yields the passed block before reading the body" do + yielded = false + + @res.reading_body(@socket, true) do + @res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=false>" + yielded = true + end + + yielded.should == true + end + + describe "but the response type is not allowed to have a body" do + before :each do + @res = Net::HTTPInformation.new("1.0", "???", "test response") + end + + it "returns nil" do + @res.reading_body(@socket, false) {}.should == nil + @res.body.should == nil + end + + it "yields the passed block" do + yielded = false + @res.reading_body(@socket, true) { yielded = true } + yielded.should == true + end + end + end + + describe "when body_allowed is false" do + it "returns nil" do + @res.reading_body(@socket, false) {}.should == nil + @res.body.should == nil + end + + it "yields the passed block" do + yielded = false + @res.reading_body(@socket, true) { yielded = true } + yielded.should == true + end + end +end diff --git a/spec/ruby/library/net-http/httpresponse/response_spec.rb b/spec/ruby/library/net-http/httpresponse/response_spec.rb new file mode 100644 index 0000000000..440c33c168 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/response_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#response" do + it "returns self" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + res.response.should.equal?(res) + end +end diff --git a/spec/ruby/library/net-http/httpresponse/shared/body.rb b/spec/ruby/library/net-http/httpresponse/shared/body.rb new file mode 100644 index 0000000000..368774fb52 --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/shared/body.rb @@ -0,0 +1,20 @@ +require 'stringio' + +describe :net_httpresponse_body, shared: true do + before :each do + @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + @socket = Net::BufferedIO.new(StringIO.new("test body")) + end + + it "returns the read body" do + @res.reading_body(@socket, true) do + @res.send(@method).should == "test body" + end + end + + it "returns the previously read body if called a second time" do + @res.reading_body(@socket, true) do + @res.send(@method).should.equal?(@res.send(@method)) + end + end +end diff --git a/spec/ruby/library/net-http/httpresponse/value_spec.rb b/spec/ruby/library/net-http/httpresponse/value_spec.rb new file mode 100644 index 0000000000..e32d37500a --- /dev/null +++ b/spec/ruby/library/net-http/httpresponse/value_spec.rb @@ -0,0 +1,24 @@ +require_relative '../../../spec_helper' +require 'net/http' + +describe "Net::HTTPResponse#value" do + it "raises an HTTP error for non 2xx HTTP Responses" do + res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") + -> { res.value }.should.raise(Net::HTTPError) + + res = Net::HTTPInformation.new("1.0", "1xx", "test response") + -> { res.value }.should.raise(Net::HTTPError) + + res = Net::HTTPSuccess.new("1.0", "2xx", "test response") + -> { res.value }.should_not.raise(Net::HTTPError) + + res = Net::HTTPRedirection.new("1.0", "3xx", "test response") + -> { res.value }.should.raise(Net::HTTPRetriableError) + + res = Net::HTTPClientError.new("1.0", "4xx", "test response") + -> { res.value }.should.raise(Net::HTTPClientException) + + res = Net::HTTPServerError.new("1.0", "5xx", "test response") + -> { res.value }.should.raise(Net::HTTPFatalError) + end +end diff --git a/spec/ruby/library/net/FTPError_spec.rb b/spec/ruby/library/net/FTPError_spec.rb deleted file mode 100644 index 0c31b65dcc..0000000000 --- a/spec/ruby/library/net/FTPError_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../spec_helper' -require 'net/ftp' - -describe "Net::FTPError" do - it "is an Exception" do - Net::FTPError.should < Exception - end -end diff --git a/spec/ruby/library/net/FTPPermError_spec.rb b/spec/ruby/library/net/FTPPermError_spec.rb deleted file mode 100644 index b43e12c503..0000000000 --- a/spec/ruby/library/net/FTPPermError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../spec_helper' -require 'net/ftp' - -describe "Net::FTPPermError" do - it "is an Exception" do - Net::FTPPermError.should < Exception - end - - it "is a subclass of Net::FTPError" do - Net::FTPPermError.should < Net::FTPError - end -end diff --git a/spec/ruby/library/net/FTPProtoError_spec.rb b/spec/ruby/library/net/FTPProtoError_spec.rb deleted file mode 100644 index e7abbc0dd8..0000000000 --- a/spec/ruby/library/net/FTPProtoError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../spec_helper' -require 'net/ftp' - -describe "Net::FTPProtoError" do - it "is an Exception" do - Net::FTPProtoError.should < Exception - end - - it "is a subclass of Net::FTPError" do - Net::FTPPermError.should < Net::FTPError - end -end diff --git a/spec/ruby/library/net/FTPReplyError_spec.rb b/spec/ruby/library/net/FTPReplyError_spec.rb deleted file mode 100644 index fcc7501fc1..0000000000 --- a/spec/ruby/library/net/FTPReplyError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../spec_helper' -require 'net/ftp' - -describe "Net::FTPReplyError" do - it "is an Exception" do - Net::FTPReplyError.should < Exception - end - - it "is a subclass of Net::FTPError" do - Net::FTPPermError.should < Net::FTPError - end -end diff --git a/spec/ruby/library/net/FTPTempError_spec.rb b/spec/ruby/library/net/FTPTempError_spec.rb deleted file mode 100644 index f4b045dfb5..0000000000 --- a/spec/ruby/library/net/FTPTempError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../spec_helper' -require 'net/ftp' - -describe "Net::FTPTempError" do - it "is an Exception" do - Net::FTPTempError.should < Exception - end - - it "is a subclass of Net::FTPError" do - Net::FTPPermError.should < Net::FTPError - end -end diff --git a/spec/ruby/library/net/ftp/abort_spec.rb b/spec/ruby/library/net/ftp/abort_spec.rb deleted file mode 100644 index ff2144a3a0..0000000000 --- a/spec/ruby/library/net/ftp/abort_spec.rb +++ /dev/null @@ -1,62 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#abort" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the ABOR command to the server" do - lambda { @ftp.abort }.should_not raise_error - end - - it "ignores the response" do - @ftp.abort - @ftp.last_response.should == "220 Dummy FTP Server ready!\n" - end - - it "returns the full response" do - @ftp.abort.should == "226 Closing data connection. (ABOR)\n" - end - - it "does not raise any error when the response code is 225" do - @server.should_receive(:abor).and_respond("225 Data connection open; no transfer in progress.") - lambda { @ftp.abort }.should_not raise_error - end - - it "does not raise any error when the response code is 226" do - @server.should_receive(:abor).and_respond("226 Closing data connection.") - lambda { @ftp.abort }.should_not raise_error - end - - it "raises a Net::FTPProtoError when the response code is 500" do - @server.should_receive(:abor).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.abort }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPProtoError when the response code is 501" do - @server.should_receive(:abor).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.abort }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPProtoError when the response code is 502" do - @server.should_receive(:abor).and_respond("502 Command not implemented.") - lambda { @ftp.abort }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPProtoError when the response code is 421" do - @server.should_receive(:abor).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.abort }.should raise_error(Net::FTPProtoError) - end -end diff --git a/spec/ruby/library/net/ftp/acct_spec.rb b/spec/ruby/library/net/ftp/acct_spec.rb deleted file mode 100644 index 3db51fca0f..0000000000 --- a/spec/ruby/library/net/ftp/acct_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#acct" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "writes the ACCT command to the server" do - @ftp.acct("my_account") - @ftp.last_response.should == "230 User 'my_account' logged in, proceed. (ACCT)\n" - end - - it "returns nil" do - @ftp.acct("my_account").should == nil - end - - it "does not raise any error when the response code is 230" do - @server.should_receive(:acct).and_respond("230 User logged in, proceed.") - lambda { @ftp.acct("my_account") }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:acct).and_respond("530 Not logged in.") - lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:acct).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:acct).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 503" do - @server.should_receive(:acct).and_respond("503 Bad sequence of commands.") - lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:acct).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/binary_spec.rb b/spec/ruby/library/net/ftp/binary_spec.rb deleted file mode 100644 index 60e312a673..0000000000 --- a/spec/ruby/library/net/ftp/binary_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#binary" do - it "returns true when self is in binary mode" do - ftp = Net::FTP.new - ftp.binary.should be_true - - ftp.binary = false - ftp.binary.should be_false - end -end - -describe "Net::FTP#binary=" do - it "sets self to binary mode when passed true" do - ftp = Net::FTP.new - - ftp.binary = true - ftp.binary.should be_true - - ftp.binary = false - ftp.binary.should be_false - end -end diff --git a/spec/ruby/library/net/ftp/chdir_spec.rb b/spec/ruby/library/net/ftp/chdir_spec.rb deleted file mode 100644 index 1f558c47e8..0000000000 --- a/spec/ruby/library/net/ftp/chdir_spec.rb +++ /dev/null @@ -1,99 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#chdir" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - describe "when switching to the parent directory" do - it "sends the 'CDUP' command to the server" do - @ftp.chdir("..") - @ftp.last_response.should == "200 Command okay. (CDUP)\n" - end - - it "returns nil" do - @ftp.chdir("..").should be_nil - end - - it "does not raise a Net::FTPPermError when the response code is 500" do - @server.should_receive(:cdup).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.chdir("..") }.should_not raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:cdup).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:cdup).and_respond("502 Command not implemented.") - lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:cdup).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.chdir("..") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:cdup).and_respond("530 Not logged in.") - lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:cdup).and_respond("550 Requested action not taken.") - lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError) - end - end - - it "writes the 'CWD' command with the passed directory to the socket" do - @ftp.chdir("test") - @ftp.last_response.should == "200 Command okay. (CWD test)\n" - end - - it "returns nil" do - @ftp.chdir("test").should be_nil - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:cwd).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:cwd).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:cwd).and_respond("502 Command not implemented.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:cwd).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:cwd).and_respond("530 Not logged in.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:cwd).and_respond("550 Requested action not taken.") - lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/close_spec.rb b/spec/ruby/library/net/ftp/close_spec.rb deleted file mode 100644 index 95c72b29ed..0000000000 --- a/spec/ruby/library/net/ftp/close_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#close" do - before :each do - @socket = mock("Socket") - @socket.stub!(:closed?).and_return(false) - @socket.stub!(:read_timeout).and_return(60) - @socket.stub!(:read_timeout=).and_return(3) - - @ftp = Net::FTP.new - @ftp.instance_variable_set(:@sock, @socket) - end - - it "closes the socket" do - @socket.should_receive(:close) - @ftp.close.should be_nil - end - - it "does not try to close the socket if it has already been closed" do - @socket.should_receive(:closed?).and_return(true) - @socket.should_not_receive(:close) - @ftp.close.should be_nil - end - - it "does not try to close the socket if it is nil" do - @ftp.instance_variable_set(:@sock, nil) - @ftp.close.should be_nil - end -end diff --git a/spec/ruby/library/net/ftp/closed_spec.rb b/spec/ruby/library/net/ftp/closed_spec.rb deleted file mode 100644 index 1f3e69b0c1..0000000000 --- a/spec/ruby/library/net/ftp/closed_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#closed?" do - before :each do - @socket = mock("Socket") - - @ftp = Net::FTP.new - @ftp.instance_variable_set(:@sock, @socket) - end - - it "returns true when the socket is closed" do - @socket.should_receive(:closed?).and_return(true) - @ftp.closed?.should be_true - end - - it "returns true when the socket is nil" do - @ftp.instance_variable_set(:@sock, nil) - @ftp.closed?.should be_true - end -end diff --git a/spec/ruby/library/net/ftp/connect_spec.rb b/spec/ruby/library/net/ftp/connect_spec.rb deleted file mode 100644 index 981751233e..0000000000 --- a/spec/ruby/library/net/ftp/connect_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -# TODO: Add specs for using the SOCKSSocket -describe "Net::FTP#connect" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - end - - after :each do - @server.connect_message = nil - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "tries to connect to the FTP Server on the given host and port" do - lambda { @ftp.connect(@server.hostname, @server.server_port) }.should_not raise_error - end - - it "returns nil" do - @ftp.connect(@server.hostname, @server.server_port).should be_nil - end - - it "prints a small debug line when in debug mode" do - @ftp.debug_mode = true - lambda { @ftp.connect(@server.hostname, @server.server_port) }.should output(/#{"connect: "}#{@server.hostname}#{", "}#{@server.server_port}#{"\\nget: 220 Dummy FTP Server ready!"}/) - @ftp.debug_mode = false - end - - it "does not raise any error when the response code is 220" do - @server.connect_message = "220 Dummy FTP Server ready!" - lambda { @ftp.connect(@server.hostname, @server.server_port) }.should_not raise_error - end - - it "raises a Net::FTPReplyError when the response code is 120" do - @server.connect_message = "120 Service ready in nnn minutes." - lambda { @ftp.connect(@server.hostname, @server.server_port) }.should raise_error(Net::FTPReplyError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.connect_message = "421 Service not available, closing control connection." - lambda { @ftp.connect(@server.hostname, @server.server_port) }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/debug_mode_spec.rb b/spec/ruby/library/net/ftp/debug_mode_spec.rb deleted file mode 100644 index f49da55ed1..0000000000 --- a/spec/ruby/library/net/ftp/debug_mode_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#debug_mode" do - it "returns true when self is in debug mode" do - ftp = Net::FTP.new - ftp.debug_mode.should be_false - - ftp.debug_mode = true - ftp.debug_mode.should be_true - end -end - -describe "Net::FTP#debug_mode=" do - it "sets self into debug mode when passed true" do - ftp = Net::FTP.new - ftp.debug_mode = true - ftp.debug_mode.should be_true - - ftp.debug_mode = false - ftp.debug_mode.should be_false - end -end diff --git a/spec/ruby/library/net/ftp/default_passive_spec.rb b/spec/ruby/library/net/ftp/default_passive_spec.rb deleted file mode 100644 index 30eb8f9da2..0000000000 --- a/spec/ruby/library/net/ftp/default_passive_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#default_passive" do - it "is true by default" do - ruby_exe(fixture(__FILE__, "default_passive.rb")).should == "true\ntrue\n" - end -end diff --git a/spec/ruby/library/net/ftp/delete_spec.rb b/spec/ruby/library/net/ftp/delete_spec.rb deleted file mode 100644 index fa0eddb312..0000000000 --- a/spec/ruby/library/net/ftp/delete_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#delete" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the DELE command with the passed filename to the server" do - @ftp.delete("test.file") - @ftp.last_response.should == "250 Requested file action okay, completed. (DELE test.file)\n" - end - - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:dele).and_respond("450 Requested file action not taken.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:dele).and_respond("550 Requested action not taken.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:dele).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:dele).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:dele).and_respond("502 Command not implemented.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:dele).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:dele).and_respond("530 Not logged in.") - lambda { @ftp.delete("test.file") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/dir_spec.rb b/spec/ruby/library/net/ftp/dir_spec.rb deleted file mode 100644 index 47ac7b8d9b..0000000000 --- a/spec/ruby/library/net/ftp/dir_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/list' - -describe "Net::FTP#dir" do - it_behaves_like :net_ftp_list, :dir -end diff --git a/spec/ruby/library/net/ftp/fixtures/server.rb b/spec/ruby/library/net/ftp/fixtures/server.rb deleted file mode 100644 index 65339cfaf9..0000000000 --- a/spec/ruby/library/net/ftp/fixtures/server.rb +++ /dev/null @@ -1,277 +0,0 @@ -module NetFTPSpecs - class DummyFTP - attr_accessor :connect_message - attr_reader :login_user, :login_pass, :login_acct - - # hostname or IP address - attr_reader :hostname - # port number - attr_reader :server_port - - def initialize - @hostname = "localhost" - @server = TCPServer.new(@hostname, 0) - @server_port = @server.addr[1] - - @handlers = {} - @commands = [] - @connect_message = nil - end - - def serve_once - @thread = Thread.new do - @socket = @server.accept - @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, 1) - begin - handle_request - ensure - @socket.close - end - end - end - - def handle_request - # Send out the welcome message. - response @connect_message || "220 Dummy FTP Server ready!" - - begin - while command = @socket.gets - command, argument = command.chomp.split(" ", 2) - - if command == "QUIT" - self.response("221 OK, bye") - break - elsif proc_handler = @handlers[command.downcase.to_sym] - if argument.nil? - proc_handler.call(self) - else - proc_handler.call(self, argument) - end - else - if argument.nil? - self.send(command.downcase.to_sym) - else - self.send(command.downcase.to_sym, argument) - end - end - end - rescue => e - self.error_response("Exception: #{e} #{e.backtrace.inspect}") - end - end - - def error_response(text) - self.response("451 #{text}") - end - - def response(text) - @socket.puts(text) unless @socket.closed? - end - - def stop - @datasocket.close unless @datasocket.nil? || @datasocket.closed? - @server.close - @thread.join - end - - - ## - def handle(sym, &block) - @handlers[sym] = block - end - - def should_receive(method) - @handler_for = method - self - end - - def and_respond(text) - @handlers[@handler_for] = lambda { |s, *args| s.response(text) } - end - - ## - # FTP methods - ## - - def abor - self.response("226 Closing data connection. (ABOR)") - end - - def acct(account) - @login_acct = account - self.response("230 User '#{account}' logged in, proceed. (ACCT)") - end - - def cdup - self.response("200 Command okay. (CDUP)") - end - - def cwd(dir) - self.response("200 Command okay. (CWD #{dir})") - end - - def dele(file) - self.response("250 Requested file action okay, completed. (DELE #{file})") - end - - def eprt(arg) - _, _, host, port = arg.split("|") - - @datasocket = TCPSocket.new(host, port) - self.response("200 port opened") - end - - def help(param = :default) - if param == :default - self.response("211 System status, or system help reply. (HELP)") - else - self.response("211 System status, or system help reply. (HELP #{param})") - end - end - - def list(folder) - self.response("150 opening ASCII connection for file list") - @datasocket.puts("-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb") - @datasocket.puts("-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb") - @datasocket.puts("-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb") - @datasocket.close() - self.response("226 transfer complete (LIST #{folder})") - end - - def mdtm(filename) - self.response("213 19980705132316") - end - - def mkd(foldername) - self.response(%Q{257 "#{foldername.gsub('"', '""')}" created.}) - end - - def nlst(folder = nil) - self.response("150 opening ASCII connection for file list") - @datasocket.puts("last_response_code.rb") - @datasocket.puts("list.rb") - @datasocket.puts("pwd.rb") - @datasocket.close() - self.response("226 transfer complete (NLST#{folder ? " #{folder}" : ""})") - end - - def noop - self.response("200 Command okay. (NOOP)") - end - - def pass(password) - @login_pass = password - self.response("230 User logged in, proceed. (PASS #{password})") - end - - def port(arg) - nums = arg.split(",") - - if nums[0] == "::1" - # IPv6 - port = nums[1].to_i * 256 + nums[2].to_i - host = nums[0] - else - # IPv4 - port = nums[4].to_i * 256 + nums[5].to_i - host = nums[0..3].join(".") - end - - @datasocket = TCPSocket.new(host, port) - self.response("200 port opened") - end - - def pwd - self.response('257 "/some/dir/" - current directory') - end - - def retr(file) - self.response("125 Data transfer starting") - if @restart_at && @restart_at == 20 - @datasocket.puts("of the file named '#{file}'.") - @restart_at = nil - else - @datasocket.puts("This is the content") - @datasocket.puts("of the file named '#{file}'.") - end - @datasocket.close() - self.response("226 Closing data connection. (RETR #{file})") - end - - def rest(at_bytes) - @restart_at = at_bytes.to_i - self.response("350 Requested file action pending further information. (REST)") - end - - def rmd(folder) - self.response("250 Requested file action okay, completed. (RMD #{folder})") - end - - def rnfr(from) - @rename_from = from - self.response("350 Requested file action pending further information.") - end - - def rnto(to) - self.response("250 Requested file action okay, completed. (Renamed #{@rename_from} to #{to})") - @rename_from = nil - end - - def site(param) - self.response("200 Command okay. (SITE #{param})") - end - - def size(filename) - if filename == "binary" - self.response("213 24") - else - self.response("213 1024") - end - end - - def stat(param = :default) - if param == :default - self.response("211 System status, or system help reply. (STAT)") - else - self.response("211 System status, or system help reply. (STAT #{param})") - end - end - - def stor(file) - tmp_file = tmp("#{file}file", false) - - self.response("125 Data transfer starting.") - - mode = @restart_at ? "a" : "w" - - File.open(tmp_file, mode + "b") do |f| - loop do - data = @datasocket.recv(1024) - break if !data || data.empty? - f << data - end - end - - #@datasocket.close() - self.response("200 OK, Data received. (STOR #{file})") - end - - def appe(file) - @restart_at = true - stor(file) - end - - def syst - self.response("215 FTP Dummy Server (SYST)") - end - - def type(type) - self.response("200 TYPE switched to #{type}") - end - - def user(name) - @login_user = name - self.response("230 User logged in, proceed. (USER #{name})") - end - end -end diff --git a/spec/ruby/library/net/ftp/get_spec.rb b/spec/ruby/library/net/ftp/get_spec.rb deleted file mode 100644 index c4672b55a5..0000000000 --- a/spec/ruby/library/net/ftp/get_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/gettextfile' -require_relative 'shared/getbinaryfile' - -describe "Net::FTP#get (binary mode)" do - before :each do - @binary_mode = true - end - - it_behaves_like :net_ftp_getbinaryfile, :get -end - -describe "Net::FTP#get (text mode)" do - before :each do - @binary_mode = false - end - - it_behaves_like :net_ftp_gettextfile, :get -end diff --git a/spec/ruby/library/net/ftp/getbinaryfile_spec.rb b/spec/ruby/library/net/ftp/getbinaryfile_spec.rb deleted file mode 100644 index 155851b53c..0000000000 --- a/spec/ruby/library/net/ftp/getbinaryfile_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/getbinaryfile' - -describe "Net::FTP#getbinaryfile" do - it_behaves_like :net_ftp_getbinaryfile, :getbinaryfile -end diff --git a/spec/ruby/library/net/ftp/getdir_spec.rb b/spec/ruby/library/net/ftp/getdir_spec.rb deleted file mode 100644 index eea35ac130..0000000000 --- a/spec/ruby/library/net/ftp/getdir_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'shared/pwd' - -describe "Net::FTP#getdir" do - it_behaves_like :net_ftp_pwd, :getdir -end diff --git a/spec/ruby/library/net/ftp/gettextfile_spec.rb b/spec/ruby/library/net/ftp/gettextfile_spec.rb deleted file mode 100644 index 79395ae009..0000000000 --- a/spec/ruby/library/net/ftp/gettextfile_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/gettextfile' - -describe "Net::FTP#gettextfile" do - it_behaves_like :net_ftp_gettextfile, :gettextfile -end diff --git a/spec/ruby/library/net/ftp/help_spec.rb b/spec/ruby/library/net/ftp/help_spec.rb deleted file mode 100644 index c7a089a588..0000000000 --- a/spec/ruby/library/net/ftp/help_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#help" do - def with_connection - yield - end - - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "writes the HELP command to the server" do - @ftp.help - @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" - end - - it "returns the server's response" do - @ftp.help.should == "211 System status, or system help reply. (HELP)\n" - end - - it "writes the HELP command with an optional parameter to the socket" do - @ftp.help("some parameter").should == "211 System status, or system help reply. (HELP some parameter)\n" - end - - it "does not raise any error when the response code is 211" do - @server.should_receive(:help).and_respond("211 System status, or system help reply.") - lambda { @ftp.help }.should_not raise_error - end - - it "does not raise any error when the response code is 214" do - @server.should_receive(:help).and_respond("214 Help message.") - lambda { @ftp.help }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:help).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.help }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:help).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.help }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:help).and_respond("502 Command not implemented.") - lambda { @ftp.help }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:help).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.help }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/initialize_spec.rb b/spec/ruby/library/net/ftp/initialize_spec.rb deleted file mode 100644 index cd6252ac31..0000000000 --- a/spec/ruby/library/net/ftp/initialize_spec.rb +++ /dev/null @@ -1,409 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#initialize" do - before :each do - @ftp = Net::FTP.allocate - @ftp.stub!(:connect) - @port_args = [] - ruby_version_is "2.5" do - @port_args << 21 - end - end - - it "is private" do - Net::FTP.should have_private_instance_method(:initialize) - end - - it "sets self into binary mode" do - @ftp.binary.should be_nil - @ftp.send(:initialize) - @ftp.binary.should be_true - end - - it "sets self into active mode" do - @ftp.passive.should be_nil - @ftp.send(:initialize) - @ftp.passive.should be_false - end - - it "sets self into non-debug mode" do - @ftp.debug_mode.should be_nil - @ftp.send(:initialize) - @ftp.debug_mode.should be_false - end - - it "sets self to not resume file uploads/downloads" do - @ftp.resume.should be_nil - @ftp.send(:initialize) - @ftp.resume.should be_false - end - - describe "when passed no arguments" do - it "does not try to connect" do - @ftp.should_not_receive(:connect) - @ftp.send(:initialize) - end - end - - describe "when passed host" do - it "tries to connect to the passed host" do - @ftp.should_receive(:connect).with("localhost", *@port_args) - @ftp.send(:initialize, "localhost") - end - end - - describe "when passed host, user" do - it "tries to connect to the passed host" do - @ftp.should_receive(:connect).with("localhost", *@port_args) - @ftp.send(:initialize, "localhost") - end - - it "tries to login with the passed username" do - @ftp.should_receive(:login).with("rubyspec", nil, nil) - @ftp.send(:initialize, "localhost", "rubyspec") - end - end - - describe "when passed host, user, password" do - it "tries to connect to the passed host" do - @ftp.should_receive(:connect).with("localhost", *@port_args) - @ftp.send(:initialize, "localhost") - end - - it "tries to login with the passed username and password" do - @ftp.should_receive(:login).with("rubyspec", "rocks", nil) - @ftp.send(:initialize, "localhost", "rubyspec", "rocks") - end - end - - describe "when passed host, user" do - it "tries to connect to the passed host" do - @ftp.should_receive(:connect).with("localhost", *@port_args) - @ftp.send(:initialize, "localhost") - end - - it "tries to login with the passed username, password and account" do - @ftp.should_receive(:login).with("rubyspec", "rocks", "account") - @ftp.send(:initialize, "localhost", "rubyspec", "rocks", "account") - end - end - - ruby_version_is '2.4' do - before :each do - @ftp.stub!(:login) - end - - describe 'when the host' do - describe 'is set' do - describe 'and port option' do - describe 'is set' do - it 'tries to connect to the host on the specified port' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ port: 8080 }) - @ftp.should_receive(:connect).with('localhost', 8080) - - @ftp.send(:initialize, 'localhost', options) - end - end - - describe 'is not set' do - it 'tries to connect to the host without a port' do - @ftp.should_receive(:connect).with("localhost", *@port_args) - - @ftp.send(:initialize, 'localhost') - end - end - end - - describe 'when the username option' do - describe 'is set' do - describe 'and the password option' do - describe 'is set' do - describe 'and the account option' do - describe 'is set' do - it 'tries to log in with the supplied parameters' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ username: 'a', password: 'topsecret', account: 'b' }) - @ftp.should_receive(:login).with('a', 'topsecret', 'b') - - @ftp.send(:initialize, 'localhost', options) - end - end - - describe 'is unset' do - it 'tries to log in with the supplied parameters' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ username: 'a', password: 'topsecret' }) - @ftp.should_receive(:login).with('a', 'topsecret', nil) - - @ftp.send(:initialize, 'localhost', options) - end - end - end - end - - describe 'is unset' do - describe 'and the account option' do - describe 'is set' do - it 'tries to log in with the supplied parameters' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ username: 'a', account: 'b' }) - @ftp.should_receive(:login).with('a', nil, 'b') - - @ftp.send(:initialize, 'localhost', options) - end - end - - describe 'is unset' do - it 'tries to log in with the supplied parameters' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ username: 'a'}) - @ftp.should_receive(:login).with('a', nil, nil) - - @ftp.send(:initialize, 'localhost', options) - end - end - end - end - end - end - - describe 'is not set' do - it 'does not try to log in' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({}) - @ftp.should_not_receive(:login) - - @ftp.send(:initialize, 'localhost', options) - end - end - end - end - - describe 'is unset' do - it 'does not try to connect' do - @ftp.should_not_receive(:connect) - - @ftp.send(:initialize) - end - - it 'does not try to log in' do - @ftp.should_not_receive(:login) - - @ftp.send(:initialize) - end - end - end - - describe 'when the passive option' do - describe 'is set' do - describe 'to true' do - it 'sets passive to true' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ passive: true }) - - @ftp.send(:initialize, nil, options) - @ftp.passive.should == true - end - end - - describe 'to false' do - it 'sets passive to false' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ passive: false }) - - @ftp.send(:initialize, nil, options) - @ftp.passive.should == false - end - end - end - - describe 'is unset' do - it 'sets passive to false' do - @ftp.send(:initialize) - @ftp.passive.should == false - end - end - end - - describe 'when the debug_mode option' do - describe 'is set' do - describe 'to true' do - it 'sets debug_mode to true' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ debug_mode: true }) - - @ftp.send(:initialize, nil, options) - @ftp.debug_mode.should == true - end - end - - describe 'to false' do - it 'sets debug_mode to false' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ debug_mode: false }) - - @ftp.send(:initialize, nil, options) - @ftp.debug_mode.should == false - end - end - end - - describe 'is unset' do - it 'sets debug_mode to false' do - @ftp.send(:initialize) - @ftp.debug_mode.should == false - end - end - end - - describe 'when the open_timeout option' do - describe 'is set' do - it 'sets open_timeout to the specified value' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ open_timeout: 42 }) - - @ftp.send(:initialize, nil, options) - @ftp.open_timeout.should == 42 - end - end - - describe 'is not set' do - it 'sets open_timeout to nil' do - @ftp.send(:initialize) - @ftp.open_timeout.should == nil - end - end - end - - describe 'when the read_timeout option' do - describe 'is set' do - it 'sets read_timeout to the specified value' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ read_timeout: 100 }) - - @ftp.send(:initialize, nil, options) - @ftp.read_timeout.should == 100 - end - end - - describe 'is not set' do - it 'sets read_timeout to the default value' do - @ftp.send(:initialize) - @ftp.read_timeout.should == 60 - end - end - end - - describe 'when the ssl_handshake_timeout option' do - describe 'is set' do - it 'sets ssl_handshake_timeout to the specified value' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ ssl_handshake_timeout: 23 }) - - @ftp.send(:initialize, nil, options) - @ftp.ssl_handshake_timeout.should == 23 - end - end - - describe 'is not set' do - it 'sets ssl_handshake_timeout to nil' do - @ftp.send(:initialize) - @ftp.ssl_handshake_timeout.should == nil - end - end - end - - describe 'when the ssl option' do - describe 'is set' do - describe "and the ssl option's value is true" do - it 'initializes ssl_context to a blank SSLContext object' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ ssl: true }) - - ssl_context = OpenSSL::SSL::SSLContext.allocate - ssl_context.stub!(:set_params) - - OpenSSL::SSL::SSLContext.should_receive(:new).and_return(ssl_context) - ssl_context.should_receive(:set_params).with({}) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@ssl_context).should == ssl_context - end - end - - describe "and the ssl option's value is a hash" do - it 'initializes ssl_context to a configured SSLContext object' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ ssl: {key: 'value'} }) - - ssl_context = OpenSSL::SSL::SSLContext.allocate - ssl_context.stub!(:set_params) - - OpenSSL::SSL::SSLContext.should_receive(:new).and_return(ssl_context) - ssl_context.should_receive(:set_params).with({key: 'value'}) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@ssl_context).should == ssl_context - end - end - - describe 'and private_data_connection' do - describe 'is set' do - it 'sets private_data_connection to that value' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ ssl: true, private_data_connection: 'true' }) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@private_data_connection).should == 'true' - end - end - - describe 'is not set' do - it 'sets private_data_connection to nil' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ ssl: true }) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@private_data_connection).should == true - end - end - end - end - - describe 'is not set' do - it 'sets ssl_context to nil' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({}) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@ssl_context).should == nil - end - - describe 'private_data_connection' do - describe 'is set' do - it 'raises an ArgumentError' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({ private_data_connection: true }) - - -> { - @ftp.send(:initialize, nil, options) - }.should raise_error(ArgumentError, /private_data_connection can be set to true only when ssl is enabled/) - end - end - - describe 'is not set' do - it 'sets private_data_connection to false' do - options = mock('ftp initialize options') - options.should_receive(:to_hash).and_return({}) - - @ftp.send(:initialize, nil, options) - @ftp.instance_variable_get(:@private_data_connection).should == false - end - end - end - end - end - end -end diff --git a/spec/ruby/library/net/ftp/last_response_code_spec.rb b/spec/ruby/library/net/ftp/last_response_code_spec.rb deleted file mode 100644 index 3eb20f7ad8..0000000000 --- a/spec/ruby/library/net/ftp/last_response_code_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'shared/last_response_code' -require_relative 'fixtures/server' - -describe "Net::FTP#last_response_code" do - it_behaves_like :net_ftp_last_response_code, :last_response_code -end diff --git a/spec/ruby/library/net/ftp/last_response_spec.rb b/spec/ruby/library/net/ftp/last_response_spec.rb deleted file mode 100644 index ada665d59c..0000000000 --- a/spec/ruby/library/net/ftp/last_response_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#last_response" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "returns the last response" do - @ftp.last_response.should == "220 Dummy FTP Server ready!\n" - @ftp.help - @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" - end -end diff --git a/spec/ruby/library/net/ftp/lastresp_spec.rb b/spec/ruby/library/net/ftp/lastresp_spec.rb deleted file mode 100644 index 273e216e8b..0000000000 --- a/spec/ruby/library/net/ftp/lastresp_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'shared/last_response_code' -require_relative 'fixtures/server' - -describe "Net::FTP#lastresp" do - it_behaves_like :net_ftp_last_response_code, :lastresp -end diff --git a/spec/ruby/library/net/ftp/list_spec.rb b/spec/ruby/library/net/ftp/list_spec.rb deleted file mode 100644 index 6175172923..0000000000 --- a/spec/ruby/library/net/ftp/list_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/list' - -describe "Net::FTP#list" do - it_behaves_like :net_ftp_list, :list -end diff --git a/spec/ruby/library/net/ftp/login_spec.rb b/spec/ruby/library/net/ftp/login_spec.rb deleted file mode 100644 index c4f14f8747..0000000000 --- a/spec/ruby/library/net/ftp/login_spec.rb +++ /dev/null @@ -1,195 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#login" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - describe "when passed no arguments" do - it "sends the USER command with 'anonymous' as name to the server" do - @ftp.login - @server.login_user.should == "anonymous" - end - - it "sends 'anonymous@' as a password when required" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @ftp.login - @server.login_pass.should == "anonymous@" - end - - it "raises a Net::FTPReplyError when the server requests an account" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @server.should_receive(:pass).and_respond("332 Need account for login.") - lambda { @ftp.login }.should raise_error(Net::FTPReplyError) - end - end - - describe "when passed name" do - it "sends the USER command with the passed name to the server" do - @ftp.login("rubyspec") - @server.login_user.should == "rubyspec" - end - - it "raises a Net::FTPReplyError when the server requests a password, but none was given" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - lambda { @ftp.login("rubyspec") }.should raise_error(Net::FTPReplyError) - end - - it "raises a Net::FTPReplyError when the server requests an account, but none was given" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @server.should_receive(:pass).and_respond("332 Need account for login.") - lambda { @ftp.login("rubyspec") }.should raise_error(Net::FTPReplyError) - end - end - - describe "when passed name, password" do - it "sends the USER command with the passed name to the server" do - @ftp.login("rubyspec", "rocks") - @server.login_user.should == "rubyspec" - end - - it "sends the passed password when required" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @ftp.login("rubyspec", "rocks") - @server.login_pass.should == "rocks" - end - - it "raises a Net::FTPReplyError when the server requests an account" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @server.should_receive(:pass).and_respond("332 Need account for login.") - lambda { @ftp.login("rubyspec", "rocks") }.should raise_error(Net::FTPReplyError) - end - end - - describe "when passed name, password, account" do - it "sends the USER command with the passed name to the server" do - @ftp.login("rubyspec", "rocks", "account") - @server.login_user.should == "rubyspec" - end - - it "sends the passed password when required" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @ftp.login("rubyspec", "rocks", "account") - @server.login_pass.should == "rocks" - end - - it "sends the passed account when required" do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @server.should_receive(:pass).and_respond("332 Need account for login.") - @ftp.login("rubyspec", "rocks", "account") - @server.login_acct.should == "account" - end - end - - describe "when the USER command fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:user).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:user).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:user).and_respond("502 Command not implemented.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:user).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:user).and_respond("530 Not logged in.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - end - - describe "when the PASS command fails" do - before :each do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - end - - it "does not raise an Error when the response code is 202" do - @server.should_receive(:pass).and_respond("202 Command not implemented, superfluous at this site.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:pass).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:pass).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:pass).and_respond("502 Command not implemented.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:pass).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:pass).and_respond("530 Not logged in.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - end - - describe "when the ACCT command fails" do - before :each do - @server.should_receive(:user).and_respond("331 User name okay, need password.") - @server.should_receive(:pass).and_respond("332 Need account for login.") - end - - it "does not raise an Error when the response code is 202" do - @server.should_receive(:acct).and_respond("202 Command not implemented, superfluous at this site.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:acct).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:acct).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:acct).and_respond("502 Command not implemented.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:acct).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:acct).and_respond("530 Not logged in.") - lambda { @ftp.login("rubyspec", "rocks", "account") }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/ls_spec.rb b/spec/ruby/library/net/ftp/ls_spec.rb deleted file mode 100644 index e729eb9481..0000000000 --- a/spec/ruby/library/net/ftp/ls_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/list' - -describe "Net::FTP#ls" do - it_behaves_like :net_ftp_list, :ls -end diff --git a/spec/ruby/library/net/ftp/mdtm_spec.rb b/spec/ruby/library/net/ftp/mdtm_spec.rb deleted file mode 100644 index ddcc06d708..0000000000 --- a/spec/ruby/library/net/ftp/mdtm_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#mdtm" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the MDTM with the passed filename command to the server" do - @ftp.mdtm("test.file") - @ftp.last_response.should == "213 19980705132316\n" - end - - it "returns the last modification time of the passed file" do - @ftp.mdtm("test.file").should == "19980705132316" - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:mdtm).and_respond("550 Requested action not taken.") - lambda { @ftp.mdtm("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:mdtm).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.mdtm("test.file") }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/mkdir_spec.rb b/spec/ruby/library/net/ftp/mkdir_spec.rb deleted file mode 100644 index 0d8314bfa3..0000000000 --- a/spec/ruby/library/net/ftp/mkdir_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#mkdir" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the MKD command with the passed pathname to the server" do - @ftp.mkdir("test.folder") - @ftp.last_response.should == %{257 "test.folder" created.\n} - end - - it "returns the path to the newly created directory" do - @ftp.mkdir("test.folder").should == "test.folder" - @ftp.mkdir("/absolute/path/to/test.folder").should == "/absolute/path/to/test.folder" - @ftp.mkdir("relative/path/to/test.folder").should == "relative/path/to/test.folder" - @ftp.mkdir('/usr/dm/foo"bar').should == '/usr/dm/foo"bar' - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:mkd).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:mkd).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:mkd).and_respond("502 Command not implemented.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:mkd).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:mkd).and_respond("530 Not logged in.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:mkd).and_respond("550 Requested action not taken.") - lambda { @ftp.mkdir("test.folder") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/mtime_spec.rb b/spec/ruby/library/net/ftp/mtime_spec.rb deleted file mode 100644 index e05e92f58f..0000000000 --- a/spec/ruby/library/net/ftp/mtime_spec.rb +++ /dev/null @@ -1,50 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#mtime" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the MDTM with the passed filename command to the server" do - @ftp.mtime("test.file") - @ftp.last_response.should == "213 19980705132316\n" - end - - describe "when passed filename" do - it "returns the last modification time of the passed file as a Time object in the local time" do - @ftp.mtime("test.file").should == Time.gm("1998", "07", "05", "13", "23", "16") - end - end - - describe "when passed filename, local_time" do - it "returns the last modification time as a Time object in UTC when local_time is true" do - @ftp.mtime("test.file", true).should == Time.local("1998", "07", "05", "13", "23", "16") - end - - it "returns the last modification time as a Time object in the local time when local_time is false" do - @ftp.mtime("test.file", false).should == Time.gm("1998", "07", "05", "13", "23", "16") - end - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:mdtm).and_respond("550 Requested action not taken.") - lambda { @ftp.mtime("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:mdtm).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.mtime("test.file") }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/nlst_spec.rb b/spec/ruby/library/net/ftp/nlst_spec.rb deleted file mode 100644 index 36ca7a6127..0000000000 --- a/spec/ruby/library/net/ftp/nlst_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#nlst" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.passive = false - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - describe "when passed no arguments" do - it "returns an Array containing a list of files in the current dir" do - @ftp.nlst.should == ["last_response_code.rb", "list.rb", "pwd.rb"] - @ftp.last_response.should == "226 transfer complete (NLST)\n" - end - end - - describe "when passed dir" do - it "returns an Array containing a list of files in the passed dir" do - @ftp.nlst("test.folder").should == ["last_response_code.rb", "list.rb", "pwd.rb"] - @ftp.last_response.should == "226 transfer complete (NLST test.folder)\n" - end - end - - describe "when the NLST command fails" do - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:nlst).and_respond("450 Requested file action not taken..") - lambda { @ftp.nlst }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:nlst).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:nlst).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:nlst).and_respond("502 Command not implemented.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:nlst).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.nlst }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:nlst).and_respond("530 Not logged in.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.nlst }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.nlst }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/noop_spec.rb b/spec/ruby/library/net/ftp/noop_spec.rb deleted file mode 100644 index eca8911b7b..0000000000 --- a/spec/ruby/library/net/ftp/noop_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#noop" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the NOOP command to the server" do - @ftp.noop - @ftp.last_response.should == "200 Command okay. (NOOP)\n" - end - - it "returns nil" do - @ftp.noop.should be_nil - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:noop).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.noop }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:noop).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.noop }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/open_spec.rb b/spec/ruby/library/net/ftp/open_spec.rb deleted file mode 100644 index 7be02ff373..0000000000 --- a/spec/ruby/library/net/ftp/open_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP.open" do - before :each do - @ftp = mock("Net::FTP instance") - Net::FTP.stub!(:new).and_return(@ftp) - end - - describe "when passed no block" do - it "returns a new Net::FTP instance" do - Net::FTP.open("localhost").should equal(@ftp) - end - - it "passes the passed arguments down to Net::FTP.new" do - Net::FTP.should_receive(:new).with("localhost", "user", "password", "account") - Net::FTP.open("localhost", "user", "password", "account") - end - end - - describe "when passed a block" do - before :each do - @ftp.stub!(:close) - end - - it "yields a new Net::FTP instance to the passed block" do - yielded = false - Net::FTP.open("localhost") do |ftp| - yielded = true - ftp.should equal(@ftp) - end - yielded.should be_true - end - - it "closes the Net::FTP instance after yielding" do - Net::FTP.open("localhost") do |ftp| - ftp.should_receive(:close) - end - end - - it "closes the Net::FTP instance even if an exception is raised while yielding" do - begin - Net::FTP.open("localhost") do |ftp| - ftp.should_receive(:close) - raise ArgumentError, "some exception" - end - rescue ArgumentError - end - end - - it "returns the block's return value" do - Net::FTP.open("localhost") { :test }.should == :test - end - end -end diff --git a/spec/ruby/library/net/ftp/passive_spec.rb b/spec/ruby/library/net/ftp/passive_spec.rb deleted file mode 100644 index e8db030cbd..0000000000 --- a/spec/ruby/library/net/ftp/passive_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#passive" do - it "returns true when self is in passive mode" do - ftp = Net::FTP.new - ftp.passive.should be_false - - ftp.passive = true - ftp.passive.should be_true - end - - it "is the value of Net::FTP.default_value by default" do - ruby_exe(fixture(__FILE__, "passive.rb")).should == "true" - end -end - -describe "Net::FTP#passive=" do - it "sets self to passive mode when passed true" do - ftp = Net::FTP.new - - ftp.passive = true - ftp.passive.should be_true - - ftp.passive = false - ftp.passive.should be_false - end -end diff --git a/spec/ruby/library/net/ftp/put_spec.rb b/spec/ruby/library/net/ftp/put_spec.rb deleted file mode 100644 index f1f85b5d05..0000000000 --- a/spec/ruby/library/net/ftp/put_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/puttextfile' -require_relative 'shared/putbinaryfile' - -describe "Net::FTP#put (binary mode)" do - before :each do - @binary_mode = true - end - - it_behaves_like :net_ftp_putbinaryfile, :put -end - -describe "Net::FTP#put (text mode)" do - before :each do - @binary_mode = false - end - - it_behaves_like :net_ftp_puttextfile, :put -end diff --git a/spec/ruby/library/net/ftp/putbinaryfile_spec.rb b/spec/ruby/library/net/ftp/putbinaryfile_spec.rb deleted file mode 100644 index cb1c7bef5a..0000000000 --- a/spec/ruby/library/net/ftp/putbinaryfile_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/putbinaryfile' - -describe "Net::FTP#putbinaryfile" do - it_behaves_like :net_ftp_putbinaryfile, :putbinaryfile -end diff --git a/spec/ruby/library/net/ftp/puttextfile_spec.rb b/spec/ruby/library/net/ftp/puttextfile_spec.rb deleted file mode 100644 index 00a930afd7..0000000000 --- a/spec/ruby/library/net/ftp/puttextfile_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' -require_relative 'shared/puttextfile' - -describe "Net::FTP#puttextfile" do - it_behaves_like :net_ftp_puttextfile, :puttextfile -end diff --git a/spec/ruby/library/net/ftp/pwd_spec.rb b/spec/ruby/library/net/ftp/pwd_spec.rb deleted file mode 100644 index f515cd29a0..0000000000 --- a/spec/ruby/library/net/ftp/pwd_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#pwd" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the PWD command to the server" do - @ftp.pwd - @ftp.last_response.should == "257 \"/some/dir/\" - current directory\n" - end - - it "returns the current directory" do - @ftp.pwd.should == "/some/dir/" - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:pwd).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.pwd }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:pwd).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.pwd }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:pwd).and_respond("502 Command not implemented.") - lambda { @ftp.pwd }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:pwd).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.pwd }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:pwd).and_respond("550 Requested action not taken.") - lambda { @ftp.pwd }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/quit_spec.rb b/spec/ruby/library/net/ftp/quit_spec.rb deleted file mode 100644 index fdc3a2f795..0000000000 --- a/spec/ruby/library/net/ftp/quit_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#quit" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the QUIT command to the server" do - @ftp.quit - @ftp.last_response.should == "221 OK, bye\n" - end - - it "does not close the socket automagically" do - @ftp.quit - @ftp.closed?.should be_false - end - - it "returns nil" do - @ftp.quit.should be_nil - end -end diff --git a/spec/ruby/library/net/ftp/rename_spec.rb b/spec/ruby/library/net/ftp/rename_spec.rb deleted file mode 100644 index e1fd4e47cf..0000000000 --- a/spec/ruby/library/net/ftp/rename_spec.rb +++ /dev/null @@ -1,94 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#rename" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - describe "when passed from_name, to_name" do - it "sends the RNFR command with the passed from_name and the RNTO command with the passed to_name to the server" do - @ftp.rename("from.file", "to.file") - @ftp.last_response.should == "250 Requested file action okay, completed. (Renamed from.file to to.file)\n" - end - - it "returns something" do - @ftp.rename("from.file", "to.file").should be_nil - end - end - - describe "when the RNFR command fails" do - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:rnfr).and_respond("450 Requested file action not taken.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:rnfr).and_respond("550 Requested action not taken.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:rnfr).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:rnfr).and_respond("502 Command not implemented.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:rnfr).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:rnfr).and_respond("530 Not logged in.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - end - - describe "when the RNTO command fails" do - it "raises a Net::FTPPermError when the response code is 532" do - @server.should_receive(:rnfr).and_respond("532 Need account for storing files.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 553" do - @server.should_receive(:rnto).and_respond("553 Requested action not taken.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:rnto).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:rnto).and_respond("502 Command not implemented.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:rnto).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:rnto).and_respond("530 Not logged in.") - lambda { @ftp.rename("from.file", "to.file") }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/resume_spec.rb b/spec/ruby/library/net/ftp/resume_spec.rb deleted file mode 100644 index 51b1cff2a4..0000000000 --- a/spec/ruby/library/net/ftp/resume_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#resume" do - it "returns true when self is set to resume uploads/downloads" do - ftp = Net::FTP.new - ftp.resume.should be_false - - ftp.resume = true - ftp.resume.should be_true - end -end - -describe "Net::FTP#resume=" do - it "sets self to resume uploads/downloads when set to true" do - ftp = Net::FTP.new - ftp.resume = true - ftp.resume.should be_true - - ftp.resume = false - ftp.resume.should be_false - end -end diff --git a/spec/ruby/library/net/ftp/retrbinary_spec.rb b/spec/ruby/library/net/ftp/retrbinary_spec.rb deleted file mode 100644 index 30e2484af5..0000000000 --- a/spec/ruby/library/net/ftp/retrbinary_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#retrbinary" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the passed command to the server" do - @ftp.retrbinary("RETR test", 4096) {} - @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" - end - - it "yields the received content as binary blocks of the passed size" do - res = [] - @ftp.retrbinary("RETR test", 10) { |bin| res << bin } - res.should == [ "This is th", "e content\n", "of the fil", "e named 't", "est'.\n" ] - end -end diff --git a/spec/ruby/library/net/ftp/retrlines_spec.rb b/spec/ruby/library/net/ftp/retrlines_spec.rb deleted file mode 100644 index 546df3844e..0000000000 --- a/spec/ruby/library/net/ftp/retrlines_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#retrlines" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the passed command over the socket" do - @ftp.retrlines("LIST test.dir") {} - @ftp.last_response.should == "226 transfer complete (LIST test.dir)\n" - end - - it "yields each received line to the passed block" do - res = [] - @ftp.retrlines("LIST test.dir") { |x| res << x } - res.should == [ - "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", - "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", - "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" - ] - end -end diff --git a/spec/ruby/library/net/ftp/return_code_spec.rb b/spec/ruby/library/net/ftp/return_code_spec.rb deleted file mode 100644 index 605f66ec6e..0000000000 --- a/spec/ruby/library/net/ftp/return_code_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#return_code" do - before :each do - @ftp = Net::FTP.new - end - - it "outputs a warning and returns a newline" do - lambda do - @ftp.return_code.should == "\n" - end.should complain(/warning: Net::FTP#return_code is obsolete and do nothing/) - end -end - -describe "Net::FTP#return_code=" do - before :each do - @ftp = Net::FTP.new - end - - it "outputs a warning" do - lambda { @ftp.return_code = 123 }.should complain(/warning: Net::FTP#return_code= is obsolete and do nothing/) - end -end diff --git a/spec/ruby/library/net/ftp/rmdir_spec.rb b/spec/ruby/library/net/ftp/rmdir_spec.rb deleted file mode 100644 index ab92a8678b..0000000000 --- a/spec/ruby/library/net/ftp/rmdir_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#rmdir" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the RMD command with the passed pathname to the server" do - @ftp.rmdir("test.folder") - @ftp.last_response.should == "250 Requested file action okay, completed. (RMD test.folder)\n" - end - - it "returns nil" do - @ftp.rmdir("test.folder").should be_nil - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:rmd).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:rmd).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:rmd).and_respond("502 Command not implemented.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:rmd).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:rmd).and_respond("530 Not logged in.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:rmd).and_respond("550 Requested action not taken.") - lambda { @ftp.rmdir("test.folder") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/sendcmd_spec.rb b/spec/ruby/library/net/ftp/sendcmd_spec.rb deleted file mode 100644 index 631bc10c84..0000000000 --- a/spec/ruby/library/net/ftp/sendcmd_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#sendcmd" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the passed command to the server" do - @ftp.sendcmd("HELP") - @ftp.last_response.should == "211 System status, or system help reply. (HELP)\n" - end - - it "returns the server's response" do - @ftp.sendcmd("HELP").should == "211 System status, or system help reply. (HELP)\n" - end - - it "raises no error when the response code is 1xx, 2xx or 3xx" do - @server.should_receive(:help).and_respond("120 Service ready in nnn minutes.") - lambda { @ftp.sendcmd("HELP") }.should_not raise_error - - @server.should_receive(:help).and_respond("200 Command okay.") - lambda { @ftp.sendcmd("HELP") }.should_not raise_error - - @server.should_receive(:help).and_respond("350 Requested file action pending further information.") - lambda { @ftp.sendcmd("HELP") }.should_not raise_error - end - - it "raises a Net::FTPTempError when the response code is 4xx" do - @server.should_receive(:help).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.sendcmd("HELP") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 5xx" do - @server.should_receive(:help).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.sendcmd("HELP") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPProtoError when the response code is not between 1xx-5xx" do - @server.should_receive(:help).and_respond("999 Invalid response.") - lambda { @ftp.sendcmd("HELP") }.should raise_error(Net::FTPProtoError) - end -end diff --git a/spec/ruby/library/net/ftp/set_socket_spec.rb b/spec/ruby/library/net/ftp/set_socket_spec.rb deleted file mode 100644 index 3aa5686326..0000000000 --- a/spec/ruby/library/net/ftp/set_socket_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' - -describe "Net::FTP#set_socket" do - # TODO: I won't spec this method, as it is not used - # anywhere and it should be private anyway. - #it "needs to be reviewed for spec completeness" -end diff --git a/spec/ruby/library/net/ftp/shared/getbinaryfile.rb b/spec/ruby/library/net/ftp/shared/getbinaryfile.rb deleted file mode 100644 index 2252935b2d..0000000000 --- a/spec/ruby/library/net/ftp/shared/getbinaryfile.rb +++ /dev/null @@ -1,150 +0,0 @@ -describe :net_ftp_getbinaryfile, shared: :true do - before :each do - @fixture_file = File.dirname(__FILE__) + "/../fixtures/getbinaryfile" - @tmp_file = tmp("getbinaryfile") - - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - @ftp.binary = @binary_mode - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @tmp_file - end - - it "sends the RETR command to the server" do - @ftp.send(@method, "test", @tmp_file) - @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" - end - - it "returns nil" do - @ftp.send(@method, "test", @tmp_file).should be_nil - end - - it "saves the contents of the passed remote file to the passed local file" do - @ftp.send(@method, "test", @tmp_file) - File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" - end - - describe "when passed a block" do - it "yields the received content as binary blocks of the passed size" do - res = [] - @ftp.send(@method, "test", @tmp_file, 10) { |bin| res << bin } - res.should == [ "This is th", "e content\n", "of the fil", "e named 't", "est'.\n" ] - end - end - - describe "when resuming an existing file" do - before :each do - @tmp_file = tmp("getbinaryfile_resume") - - File.open(@tmp_file, "wb") do |f| - f << "This is the content\n" - end - - @ftp.resume = true - end - - it "saves the remaining content of the passed remote file to the passed local file" do - @ftp.send(@method, "test", @tmp_file) - File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" - end - - describe "and the REST command fails" do - it "raises a Net::FTPProtoError when the response code is 550" do - @server.should_receive(:rest).and_respond("Requested action not taken.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:rest).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:rest).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:rest).and_respond("502 Command not implemented.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:rest).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:rest).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - end - end - - describe "when the RETR command fails" do - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:retr).and_respond("450 Requested file action not taken.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPProtoError when the response code is 550" do - @server.should_receive(:retr).and_respond("Requested action not taken.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:retr).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:retr).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:retr).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:retr).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/shared/gettextfile.rb b/spec/ruby/library/net/ftp/shared/gettextfile.rb deleted file mode 100644 index 6219581d12..0000000000 --- a/spec/ruby/library/net/ftp/shared/gettextfile.rb +++ /dev/null @@ -1,100 +0,0 @@ -describe :net_ftp_gettextfile, shared: :true do - before :each do - @tmp_file = tmp("gettextfile") - - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - @ftp.binary = @binary_mode - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @tmp_file - end - - it "sends the RETR command to the server" do - @ftp.send(@method, "test", @tmp_file) - @ftp.last_response.should == "226 Closing data connection. (RETR test)\n" - end - - it "returns nil" do - @ftp.send(@method, "test", @tmp_file).should be_nil - end - - it "saves the contents of the passed remote file to the passed local file" do - @ftp.send(@method, "test", @tmp_file) - File.read(@tmp_file).should == "This is the content\nof the file named 'test'.\n" - end - - describe "when passed a block" do - it "yields each line of the retrieved file to the passed block" do - res = [] - @ftp.send(@method, "test", @tmp_file) { |line| res << line } - res.should == [ "This is the content", "of the file named 'test'."] - end - end - - describe "when the RETR command fails" do - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:retr).and_respond("450 Requested file action not taken.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPProtoError when the response code is 550" do - @server.should_receive(:retr).and_respond("Requested action not taken.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:retr).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:retr).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:retr).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:retr).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, "test", @tmp_file) }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/shared/last_response_code.rb b/spec/ruby/library/net/ftp/shared/last_response_code.rb deleted file mode 100644 index 4fe53677db..0000000000 --- a/spec/ruby/library/net/ftp/shared/last_response_code.rb +++ /dev/null @@ -1,25 +0,0 @@ -describe :net_ftp_last_response_code, shared: true do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "returns the response code for the last response" do - @server.should_receive(:help).and_respond("200 Command okay.") - @ftp.help - @ftp.send(@method).should == "200" - - @server.should_receive(:help).and_respond("212 Directory status.") - @ftp.help - @ftp.send(@method).should == "212" - end -end diff --git a/spec/ruby/library/net/ftp/shared/list.rb b/spec/ruby/library/net/ftp/shared/list.rb deleted file mode 100644 index 50ca8ad119..0000000000 --- a/spec/ruby/library/net/ftp/shared/list.rb +++ /dev/null @@ -1,104 +0,0 @@ -describe :net_ftp_list, shared: true do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.passive = false - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - describe "when passed a block" do - it "yields each file in the list of files in the passed dir" do - expected = [ - "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", - "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", - "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" - ] - - res = [] - @ftp.send(@method, "test.folder") { |line| res << line} - res.should == expected - - @ftp.last_response.should == "226 transfer complete (LIST test.folder)\n" - end - end - - describe "when passed no block" do - it "returns an Array containing a list of files in the passed dir" do - expected = [ - "-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb", - "-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb", - "-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb" - ] - - @ftp.send(@method, "test.folder").should == expected - - @ftp.last_response.should == "226 transfer complete (LIST test.folder)\n" - end - end - - describe "when the LIST command fails" do - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:list).and_respond("450 Requested file action not taken..") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:list).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:list).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:list).and_respond("502 Command not implemented.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:list).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:list).and_respond("530 Not logged in.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.send(@method) }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/shared/putbinaryfile.rb b/spec/ruby/library/net/ftp/shared/putbinaryfile.rb deleted file mode 100644 index 74eaf320ae..0000000000 --- a/spec/ruby/library/net/ftp/shared/putbinaryfile.rb +++ /dev/null @@ -1,167 +0,0 @@ -describe :net_ftp_putbinaryfile, shared: :true do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @local_fixture_file = File.dirname(__FILE__) + "/../fixtures/putbinaryfile" - @remote_tmp_file = tmp("binaryfile", false) - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - @ftp.binary = @binary_mode - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @remote_tmp_file - end - - it "sends the STOR command to the server" do - @ftp.send(@method, @local_fixture_file, "binary") - @ftp.last_response.should == "200 OK, Data received. (STOR binary)\n" - end - - it "sends the contents of the passed local_file, without modifications" do - @ftp.send(@method, @local_fixture_file, "binary") - - remote_lines = File.readlines(@remote_tmp_file) - local_lines = File.readlines(@local_fixture_file) - - remote_lines.should == local_lines - end - - it "returns nil" do - @ftp.send(@method, @local_fixture_file, "binary").should be_nil - end - - describe "when passed a block" do - it "yields the transmitted content as binary blocks of the passed size" do - res = [] - @ftp.send(@method, @local_fixture_file, "binary", 10) { |x| res << x } - res.should == [ - "This is an", " example f", - "ile\nwhich ", "is going t", - "o be trans", "mitted\nusi", - "ng #putbin", "aryfile.\n" - ] - end - end - - describe "when resuming an existing file" do - before :each do - File.open(@remote_tmp_file, "w") do |f| - f << "This is an example file\n" - end - - @ftp.resume = true - end - - it "sends the remaining content of the passed local_file to the passed remote_file" do - @ftp.send(@method, @local_fixture_file, "binary") - File.read(@remote_tmp_file).should == File.read(@local_fixture_file) - end - - describe "and the APPE command fails" do - it "raises a Net::FTPProtoError when the response code is 550" do - @server.should_receive(:appe).and_respond("Requested action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPProtoError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:appe).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:appe).and_respond("501 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:appe).and_respond("502 Command not implemented.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:appe).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:appe).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - end - end - - describe "when the STOR command fails" do - it "raises a Net::FTPPermError when the response code is 532" do - @server.should_receive(:stor).and_respond("532 Need account for storing files.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:stor).and_respond("450 Requested file action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPTempError when the response code is 452" do - @server.should_receive(:stor).and_respond("452 Requested action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 553" do - @server.should_receive(:stor).and_respond("553 Requested action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:stor).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:stor).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:stor).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:stor).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, @local_fixture_file, "binary") }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/shared/puttextfile.rb b/spec/ruby/library/net/ftp/shared/puttextfile.rb deleted file mode 100644 index 9bfdc7c41e..0000000000 --- a/spec/ruby/library/net/ftp/shared/puttextfile.rb +++ /dev/null @@ -1,120 +0,0 @@ -describe :net_ftp_puttextfile, shared: true do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @local_fixture_file = File.dirname(__FILE__) + "/../fixtures/puttextfile" - @remote_tmp_file = tmp("textfile", false) - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - @ftp.binary = @binary_mode - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @remote_tmp_file - end - - it "sends the STOR command to the server" do - @ftp.send(@method, @local_fixture_file, "text") - @ftp.last_response.should == "200 OK, Data received. (STOR text)\n" - end - - it "sends the contents of the passed local_file, using \\r\\n as the newline separator" do - @ftp.send(@method, @local_fixture_file, "text") - - remote_lines = open(@remote_tmp_file, "rb") {|f| f.read } - local_lines = open(@local_fixture_file, "rb") {|f| f.read } - - remote_lines.should_not == local_lines - remote_lines.should == local_lines.gsub("\n", "\r\n") - end - - it "returns nil" do - @ftp.send(@method, @local_fixture_file, "text").should be_nil - end - - describe "when passed a block" do - it "yields each transmitted line" do - res = [] - @ftp.send(@method, @local_fixture_file, "text") { |x| res << x } - res.should == [ - "This is an example file\r\n", - "which is going to be transmitted\r\n", - "using #puttextfile.\r\n" - ] - end - end - - describe "when the STOR command fails" do - it "raises a Net::FTPPermError when the response code is 532" do - @server.should_receive(:stor).and_respond("532 Need account for storing files.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 450" do - @server.should_receive(:stor).and_respond("450 Requested file action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPTempError when the response code is 452" do - @server.should_receive(:stor).and_respond("452 Requested action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 553" do - @server.should_receive(:stor).and_respond("553 Requested action not taken.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:stor).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:stor).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:stor).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:stor).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - end - - describe "when opening the data port fails" do - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:eprt).and_respond("500 Syntax error, command unrecognized.") - @server.should_receive(:port).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:eprt).and_respond("501 Syntax error in parameters or arguments.") - @server.should_receive(:port).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:eprt).and_respond("421 Service not available, closing control connection.") - @server.should_receive(:port).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:eprt).and_respond("530 Not logged in.") - @server.should_receive(:port).and_respond("530 Not logged in.") - lambda { @ftp.send(@method, @local_fixture_file, "text") }.should raise_error(Net::FTPPermError) - end - end -end diff --git a/spec/ruby/library/net/ftp/shared/pwd.rb b/spec/ruby/library/net/ftp/shared/pwd.rb deleted file mode 100644 index 951d020f2d..0000000000 --- a/spec/ruby/library/net/ftp/shared/pwd.rb +++ /dev/null @@ -1,3 +0,0 @@ -describe :net_ftp_pwd, shared: true do - -end diff --git a/spec/ruby/library/net/ftp/site_spec.rb b/spec/ruby/library/net/ftp/site_spec.rb deleted file mode 100644 index 85aa2609c1..0000000000 --- a/spec/ruby/library/net/ftp/site_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#site" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the SITE command with the passed argument to the server" do - @ftp.site("param") - @ftp.last_response.should == "200 Command okay. (SITE param)\n" - end - - it "returns nil" do - @ftp.site("param").should be_nil - end - - it "does not raise an error when the response code is 202" do - @server.should_receive(:site).and_respond("202 Command not implemented, superfluous at this site.") - lambda { @ftp.site("param") }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:site).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.site("param") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:site).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.site("param") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:site).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.site("param") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:site).and_respond("530 Requested action not taken.") - lambda { @ftp.site("param") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/size_spec.rb b/spec/ruby/library/net/ftp/size_spec.rb deleted file mode 100644 index eb3ee90d0f..0000000000 --- a/spec/ruby/library/net/ftp/size_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#size" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the SIZE command to the server" do - @ftp.size("test.file") - @ftp.last_response.should == "213 1024\n" - end - - it "returns the size of the passed file as Integer" do - @ftp.size("test.file").should eql(1024) - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:size).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.size("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:size).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.size("test.file") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:size).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.size("test.file") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 550" do - @server.should_receive(:size).and_respond("550 Requested action not taken.") - lambda { @ftp.size("test.file") }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/spec_helper.rb b/spec/ruby/library/net/ftp/spec_helper.rb deleted file mode 100644 index c87d16218b..0000000000 --- a/spec/ruby/library/net/ftp/spec_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "net/ftp" - -if defined?(Net::FTP.default_passive) - Net::FTP.default_passive = false -end diff --git a/spec/ruby/library/net/ftp/status_spec.rb b/spec/ruby/library/net/ftp/status_spec.rb deleted file mode 100644 index 22d0d47254..0000000000 --- a/spec/ruby/library/net/ftp/status_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#status" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the STAT command to the server" do - @ftp.status - @ftp.last_response.should == "211 System status, or system help reply. (STAT)\n" - end - - ruby_version_is "2.4" do - it "sends the STAT command with an optional parameter to the server" do - @ftp.status("/pub").should == "211 System status, or system help reply. (STAT /pub)\n" - end - end - - it "returns the received information" do - @ftp.status.should == "211 System status, or system help reply. (STAT)\n" - end - - it "does not raise an error when the response code is 212" do - @server.should_receive(:stat).and_respond("212 Directory status.") - lambda { @ftp.status }.should_not raise_error - end - - it "does not raise an error when the response code is 213" do - @server.should_receive(:stat).and_respond("213 File status.") - lambda { @ftp.status }.should_not raise_error - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:stat).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.status }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:stat).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.status }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:stat).and_respond("502 Command not implemented.") - lambda { @ftp.status }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:stat).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.status }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 530" do - @server.should_receive(:stat).and_respond("530 Requested action not taken.") - lambda { @ftp.status }.should raise_error(Net::FTPPermError) - end -end diff --git a/spec/ruby/library/net/ftp/storbinary_spec.rb b/spec/ruby/library/net/ftp/storbinary_spec.rb deleted file mode 100644 index eb65db1e8d..0000000000 --- a/spec/ruby/library/net/ftp/storbinary_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#storbinary" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @local_fixture_file = File.dirname(__FILE__) + "/fixtures/putbinaryfile" - @tmp_file = tmp("binaryfile", false) - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @tmp_file - end - - it "sends the passed command and the passed File object's content to the server" do - File.open(@local_fixture_file) do |f| - f.binmode - - @ftp.storbinary("STOR binary", f, 4096) {} - @ftp.last_response.should == "200 OK, Data received. (STOR binary)\n" - end - end - - it "yields the transmitted content as binary blocks of the passed size" do - File.open(@local_fixture_file) do |f| - f.binmode - - res = [] - @ftp.storbinary("STOR binary", f, 10) { |x| res << x } - res.should == [ - "This is an", " example f", - "ile\nwhich ", "is going t", - "o be trans", "mitted\nusi", - "ng #putbin", "aryfile.\n" - ] - end - end -end diff --git a/spec/ruby/library/net/ftp/storlines_spec.rb b/spec/ruby/library/net/ftp/storlines_spec.rb deleted file mode 100644 index 4affa37eee..0000000000 --- a/spec/ruby/library/net/ftp/storlines_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#storlines" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @local_fixture_file = File.dirname(__FILE__) + "/fixtures/puttextfile" - @tmp_file = tmp("textfile", false) - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - - rm_r @tmp_file - end - - it "sends the passed command and the passed File object's content to the server" do - File.open(@local_fixture_file) do |f| - @ftp.storlines("STOR text", f) {} - @ftp.last_response.should == "200 OK, Data received. (STOR text)\n" - end - end - - it "yields each line of the transmitted content" do - File.open(@local_fixture_file) do |f| - res = [] - @ftp.storlines("STOR text", f) { |x| res << x } - res.should == [ - "This is an example file\r\n", - "which is going to be transmitted\r\n", - "using #puttextfile.\r\n" - ] - end - end -end diff --git a/spec/ruby/library/net/ftp/system_spec.rb b/spec/ruby/library/net/ftp/system_spec.rb deleted file mode 100644 index 73a5ddc72f..0000000000 --- a/spec/ruby/library/net/ftp/system_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#system" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the SYST command to the server" do - @ftp.system - @ftp.last_response.should =~ /\A215 FTP Dummy Server \(SYST\)\Z/ - end - - it "returns the received information" do - @ftp.system.should =~ /\AFTP Dummy Server \(SYST\)\Z/ - end - - it "raises a Net::FTPPermError when the response code is 500" do - @server.should_receive(:syst).and_respond("500 Syntax error, command unrecognized.") - lambda { @ftp.system }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 501" do - @server.should_receive(:syst).and_respond("501 Syntax error in parameters or arguments.") - lambda { @ftp.system }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPPermError when the response code is 502" do - @server.should_receive(:syst).and_respond("502 Command not implemented.") - lambda { @ftp.system }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPTempError when the response code is 421" do - @server.should_receive(:syst).and_respond("421 Service not available, closing control connection.") - lambda { @ftp.system }.should raise_error(Net::FTPTempError) - end -end diff --git a/spec/ruby/library/net/ftp/voidcmd_spec.rb b/spec/ruby/library/net/ftp/voidcmd_spec.rb deleted file mode 100644 index 5e82b70a78..0000000000 --- a/spec/ruby/library/net/ftp/voidcmd_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#voidcmd" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "sends the passed command to the server" do - @server.should_receive(:help).and_respond("2xx Does not raise.") - lambda { @ftp.voidcmd("HELP") }.should_not raise_error - end - - it "returns nil" do - @server.should_receive(:help).and_respond("2xx Does not raise.") - @ftp.voidcmd("HELP").should be_nil - end - - it "raises a Net::FTPReplyError when the response code is 1xx" do - @server.should_receive(:help).and_respond("1xx Does raise a Net::FTPReplyError.") - lambda { @ftp.voidcmd("HELP") }.should raise_error(Net::FTPReplyError) - end - - it "raises a Net::FTPReplyError when the response code is 3xx" do - @server.should_receive(:help).and_respond("3xx Does raise a Net::FTPReplyError.") - lambda { @ftp.voidcmd("HELP") }.should raise_error(Net::FTPReplyError) - end - - it "raises a Net::FTPTempError when the response code is 4xx" do - @server.should_receive(:help).and_respond("4xx Does raise a Net::FTPTempError.") - lambda { @ftp.voidcmd("HELP") }.should raise_error(Net::FTPTempError) - end - - it "raises a Net::FTPPermError when the response code is 5xx" do - @server.should_receive(:help).and_respond("5xx Does raise a Net::FTPPermError.") - lambda { @ftp.voidcmd("HELP") }.should raise_error(Net::FTPPermError) - end - - it "raises a Net::FTPProtoError when the response code is not valid" do - @server.should_receive(:help).and_respond("999 Does raise a Net::FTPProtoError.") - lambda { @ftp.voidcmd("HELP") }.should raise_error(Net::FTPProtoError) - end -end diff --git a/spec/ruby/library/net/ftp/welcome_spec.rb b/spec/ruby/library/net/ftp/welcome_spec.rb deleted file mode 100644 index a0d7483949..0000000000 --- a/spec/ruby/library/net/ftp/welcome_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'spec_helper' -require_relative 'fixtures/server' - -describe "Net::FTP#welcome" do - before :each do - @server = NetFTPSpecs::DummyFTP.new - @server.serve_once - - @ftp = Net::FTP.new - @ftp.connect(@server.hostname, @server.server_port) - end - - after :each do - @ftp.quit rescue nil - @ftp.close - @server.stop - end - - it "returns the server's welcome message" do - @ftp.welcome.should be_nil - @ftp.login - @ftp.welcome.should == "230 User logged in, proceed. (USER anonymous)\n" - end -end diff --git a/spec/ruby/library/net/http/HTTPBadResponse_spec.rb b/spec/ruby/library/net/http/HTTPBadResponse_spec.rb deleted file mode 100644 index be644968f5..0000000000 --- a/spec/ruby/library/net/http/HTTPBadResponse_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -describe "Net::HTTPBadResponse" do - it "is a subclass of StandardError" do - Net::HTTPBadResponse.should < StandardError - end -end diff --git a/spec/ruby/library/net/http/HTTPClientExcepton_spec.rb b/spec/ruby/library/net/http/HTTPClientExcepton_spec.rb deleted file mode 100644 index 08347464ec..0000000000 --- a/spec/ruby/library/net/http/HTTPClientExcepton_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -ruby_version_is "2.6" do - describe "Net::HTTPClientException" do - it "is a subclass of Net::ProtoServerError" do - Net::HTTPClientException.should < Net::ProtoServerError - end - - it "includes the Net::HTTPExceptions module" do - Net::HTTPClientException.should < Net::HTTPExceptions - end - end -end diff --git a/spec/ruby/library/net/http/HTTPError_spec.rb b/spec/ruby/library/net/http/HTTPError_spec.rb deleted file mode 100644 index ab5f491bb7..0000000000 --- a/spec/ruby/library/net/http/HTTPError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -describe "Net::HTTPError" do - it "is a subclass of Net::ProtocolError" do - Net::HTTPError.should < Net::ProtocolError - end - - it "includes the Net::HTTPExceptions module" do - Net::HTTPError.should < Net::HTTPExceptions - end -end diff --git a/spec/ruby/library/net/http/HTTPFatalError_spec.rb b/spec/ruby/library/net/http/HTTPFatalError_spec.rb deleted file mode 100644 index 6ab36bff6c..0000000000 --- a/spec/ruby/library/net/http/HTTPFatalError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -describe "Net::HTTPFatalError" do - it "is a subclass of Net::ProtoFatalError" do - Net::HTTPFatalError.should < Net::ProtoFatalError - end - - it "includes the Net::HTTPExceptions module" do - Net::HTTPFatalError.should < Net::HTTPExceptions - end -end diff --git a/spec/ruby/library/net/http/HTTPHeaderSyntaxError_spec.rb b/spec/ruby/library/net/http/HTTPHeaderSyntaxError_spec.rb deleted file mode 100644 index 38e9454f99..0000000000 --- a/spec/ruby/library/net/http/HTTPHeaderSyntaxError_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -describe "Net::HTTPHeaderSyntaxError" do - it "is a subclass of StandardError" do - Net::HTTPHeaderSyntaxError.should < StandardError - end -end diff --git a/spec/ruby/library/net/http/HTTPRetriableError_spec.rb b/spec/ruby/library/net/http/HTTPRetriableError_spec.rb deleted file mode 100644 index 3a4bb9146c..0000000000 --- a/spec/ruby/library/net/http/HTTPRetriableError_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -describe "Net::HTTPRetriableError" do - it "is a subclass of Net::ProtoRetriableError" do - Net::HTTPRetriableError.should < Net::ProtoRetriableError - end - - it "includes the Net::HTTPExceptions module" do - Net::HTTPRetriableError.should < Net::HTTPExceptions - end -end diff --git a/spec/ruby/library/net/http/HTTPServerException_spec.rb b/spec/ruby/library/net/http/HTTPServerException_spec.rb deleted file mode 100644 index 3960effadd..0000000000 --- a/spec/ruby/library/net/http/HTTPServerException_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../../spec_helper' -require 'net/http' - -ruby_version_is ""..."2.6" do - describe "Net::HTTPServerException" do - it "is a subclass of Net::ProtoServerError" do - Net::HTTPServerException.should < Net::ProtoServerError - end - - it "includes the Net::HTTPExceptions module" do - Net::HTTPServerException.should < Net::HTTPExceptions - end - end -end - -ruby_version_is "2.6" do - describe "Net::HTTPServerException" do - it "is a subclass of Net::ProtoServerError and is warned as deprecated" do - lambda { Net::HTTPServerException.should < Net::ProtoServerError }.should complain(/warning: constant Net::HTTPServerException is deprecated/) - end - - it "includes the Net::HTTPExceptions module and is warned as deprecated" do - lambda { Net::HTTPServerException.should < Net::HTTPExceptions }.should complain(/warning: constant Net::HTTPServerException is deprecated/) - end - end -end diff --git a/spec/ruby/library/net/http/http/Proxy_spec.rb b/spec/ruby/library/net/http/http/Proxy_spec.rb deleted file mode 100644 index f85ccc0ee9..0000000000 --- a/spec/ruby/library/net/http/http/Proxy_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.Proxy" do - it "returns a new subclass of Net::HTTP" do - Net::HTTP.Proxy("localhost").should < Net::HTTP - end - - it "returns Net::HTTP when the passed address is nil" do - Net::HTTP.Proxy(nil).should == Net::HTTP - end - - it "sets the returned subclasses' proxy options based on the passed arguments" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.proxy_address.should == "localhost" - http_with_proxy.proxy_port.should eql(1234) - http_with_proxy.proxy_user.should == "rspec" - http_with_proxy.proxy_pass.should == "rocks" - end -end - -describe "Net::HTTP#proxy?" do - describe "when self is no proxy class instance" do - it "returns false" do - Net::HTTP.new("localhost", 3333).proxy?.should be_false - end - end - - describe "when self is a proxy class instance" do - it "returns false" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.new("localhost", 3333).proxy?.should be_true - end - end -end diff --git a/spec/ruby/library/net/http/http/active_spec.rb b/spec/ruby/library/net/http/http/active_spec.rb deleted file mode 100644 index ef657243ba..0000000000 --- a/spec/ruby/library/net/http/http/active_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/started' - -describe "Net::HTTP#active?" do - it_behaves_like :net_http_started_p, :active? -end diff --git a/spec/ruby/library/net/http/http/address_spec.rb b/spec/ruby/library/net/http/http/address_spec.rb deleted file mode 100644 index 5fce76d767..0000000000 --- a/spec/ruby/library/net/http/http/address_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#address" do - it "returns the current host name" do - net = Net::HTTP.new("localhost") - net.address.should == "localhost" - end -end diff --git a/spec/ruby/library/net/http/http/close_on_empty_response_spec.rb b/spec/ruby/library/net/http/http/close_on_empty_response_spec.rb deleted file mode 100644 index a97b7b6c43..0000000000 --- a/spec/ruby/library/net/http/http/close_on_empty_response_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#close_on_empty_response" do - it "needs to be reviewed for spec completeness" -end - -describe "Net::HTTP#close_on_empty_response=" do - it "needs to be reviewed for spec completeness" -end diff --git a/spec/ruby/library/net/http/http/copy_spec.rb b/spec/ruby/library/net/http/http/copy_spec.rb deleted file mode 100644 index 5ebfdc334e..0000000000 --- a/spec/ruby/library/net/http/http/copy_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#copy" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a COPY request to the passed path and returns the response" do - response = @http.copy("/request") - response.should be_kind_of(Net::HTTPResponse) - response.body.should == "Request type: COPY" - end -end diff --git a/spec/ruby/library/net/http/http/default_port_spec.rb b/spec/ruby/library/net/http/http/default_port_spec.rb deleted file mode 100644 index 30db18efae..0000000000 --- a/spec/ruby/library/net/http/http/default_port_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.default_port" do - it "returns 80" do - Net::HTTP.http_default_port.should eql(80) - end -end diff --git a/spec/ruby/library/net/http/http/delete_spec.rb b/spec/ruby/library/net/http/http/delete_spec.rb deleted file mode 100644 index 160c653115..0000000000 --- a/spec/ruby/library/net/http/http/delete_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#delete" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a DELETE request to the passed path and returns the response" do - response = @http.delete("/request") - response.should be_kind_of(Net::HTTPResponse) - response.body.should == "Request type: DELETE" - end -end diff --git a/spec/ruby/library/net/http/http/finish_spec.rb b/spec/ruby/library/net/http/http/finish_spec.rb deleted file mode 100644 index b031c58e2c..0000000000 --- a/spec/ruby/library/net/http/http/finish_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#finish" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when self has been started" do - it "closes the tcp connection" do - @http.start - @http.finish - @http.started?.should be_false - end - end - - describe "when self has not been started yet" do - it "raises an IOError" do - lambda { @http.finish }.should raise_error(IOError) - end - end -end diff --git a/spec/ruby/library/net/http/http/fixtures/http_server.rb b/spec/ruby/library/net/http/http/fixtures/http_server.rb deleted file mode 100644 index 49e8f437cc..0000000000 --- a/spec/ruby/library/net/http/http/fixtures/http_server.rb +++ /dev/null @@ -1,105 +0,0 @@ -require 'webrick' -require 'webrick/httpservlet/abstract' - -module NetHTTPSpecs - class NullWriter - def <<(s) end - def puts(*args) end - def print(*args) end - def printf(*args) end - end - - class SpecServlet < WEBrick::HTTPServlet::AbstractServlet - def handle(req, res) - reply(req, res) - end - - %w{ do_GET do_HEAD do_POST do_PUT do_PROPPATCH do_LOCK do_UNLOCK - do_OPTIONS do_PROPFIND do_DELETE do_MOVE do_COPY - do_MKCOL do_TRACE }.each do |method| - alias_method method.to_sym, :handle - end - end - - class RequestServlet < SpecServlet - def reply(req, res) - res.content_type = "text/plain" - res.body = "Request type: #{req.request_method}" - end - end - - class RequestBodyServlet < SpecServlet - def reply(req, res) - res.content_type = "text/plain" - res.body = req.body - end - end - - class RequestHeaderServlet < SpecServlet - def reply(req, res) - res.content_type = "text/plain" - res.body = req.header.inspect - end - end - - class RequestBasicAuthServlet < SpecServlet - def reply(req, res) - res.content_type = "text/plain" - - WEBrick::HTTPAuth.basic_auth(req, res, "realm") do |user, pass| - res.body = "username: #{user}\npassword: #{pass}" - true - end - end - end - - class << self - @server = nil - @server_thread = nil - - def port - raise "server not started" unless @server - @server.config[:Port] - end - - def start_server - server_config = { - BindAddress: "127.0.0.1", - Port: 0, - Logger: WEBrick::Log.new(NullWriter.new), - AccessLog: [], - ServerType: Thread - } - - @server = WEBrick::HTTPServer.new(server_config) - - @server.mount_proc('/') do |req, res| - res.content_type = "text/plain" - res.body = "This is the index page." - end - @server.mount('/request', RequestServlet) - @server.mount("/request/body", RequestBodyServlet) - @server.mount("/request/header", RequestHeaderServlet) - @server.mount("/request/basic_auth", RequestBasicAuthServlet) - - @server_thread = @server.start - end - - def stop_server - if @server - begin - @server.shutdown - rescue Errno::EPIPE - # Because WEBrick is not thread-safe and only catches IOError - end - @server = nil - end - if @server_thread - @server_thread.join - @server_thread = nil - end - timeout = WEBrick::Utils::TimeoutHandler - timeout.terminate if timeout.respond_to?(:terminate) - end - end -end diff --git a/spec/ruby/library/net/http/http/get2_spec.rb b/spec/ruby/library/net/http/http/get2_spec.rb deleted file mode 100644 index 71dfc3d39b..0000000000 --- a/spec/ruby/library/net/http/http/get2_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_get' - -describe "Net::HTTP#get2" do - it_behaves_like :net_ftp_request_get, :get2 -end diff --git a/spec/ruby/library/net/http/http/get_print_spec.rb b/spec/ruby/library/net/http/http/get_print_spec.rb deleted file mode 100644 index 6174e3eb21..0000000000 --- a/spec/ruby/library/net/http/http/get_print_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP.get_print" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - end - - after :each do - NetHTTPSpecs.stop_server - end - - describe "when passed URI" do - it "it prints the body of the specified uri to $stdout" do - lambda do - Net::HTTP.get_print URI.parse("http://localhost:#{@port}/") - end.should output(/This is the index page\./) - end - end - - describe "when passed host, path, port" do - it "it prints the body of the specified uri to $stdout" do - lambda do - Net::HTTP.get_print 'localhost', "/", @port - end.should output(/This is the index page\./) - end - end -end diff --git a/spec/ruby/library/net/http/http/get_response_spec.rb b/spec/ruby/library/net/http/http/get_response_spec.rb deleted file mode 100644 index 941b35e773..0000000000 --- a/spec/ruby/library/net/http/http/get_response_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP.get_response" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - end - - after :each do - NetHTTPSpecs.stop_server - end - - describe "when passed URI" do - it "returns the response for the specified uri" do - res = Net::HTTP.get_response(URI.parse("http://localhost:#{@port}/")) - res.content_type.should == "text/plain" - res.body.should == "This is the index page." - end - end - - describe "when passed host, path, port" do - it "returns the response for the specified host-path-combination" do - res = Net::HTTP.get_response('localhost', "/", @port) - res.content_type.should == "text/plain" - res.body.should == "This is the index page." - end - end -end diff --git a/spec/ruby/library/net/http/http/get_spec.rb b/spec/ruby/library/net/http/http/get_spec.rb deleted file mode 100644 index 4b8af5950a..0000000000 --- a/spec/ruby/library/net/http/http/get_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP.get when passed URI" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - end - - after :each do - NetHTTPSpecs.stop_server - end - - describe "when passed URI" do - it "returns the body of the specified uri" do - Net::HTTP.get(URI.parse("http://localhost:#{@port}/")).should == "This is the index page." - end - end - - describe "when passed host, path, port" do - it "returns the body of the specified host-path-combination" do - Net::HTTP.get('localhost', "/", @port).should == "This is the index page." - end - end -end diff --git a/spec/ruby/library/net/http/http/head2_spec.rb b/spec/ruby/library/net/http/http/head2_spec.rb deleted file mode 100644 index 606798e4af..0000000000 --- a/spec/ruby/library/net/http/http/head2_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_head' - -describe "Net::HTTP#head2" do - it_behaves_like :net_ftp_request_head, :head2 -end diff --git a/spec/ruby/library/net/http/http/head_spec.rb b/spec/ruby/library/net/http/http/head_spec.rb deleted file mode 100644 index 925a8e6043..0000000000 --- a/spec/ruby/library/net/http/http/head_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#head" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a HEAD request to the passed path and returns the response" do - response = @http.head("/request") - # HEAD requests have no responses - response.body.should be_nil - end - - it "returns a Net::HTTPResponse" do - @http.head("/request").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/http_default_port_spec.rb b/spec/ruby/library/net/http/http/http_default_port_spec.rb deleted file mode 100644 index cf7f73e630..0000000000 --- a/spec/ruby/library/net/http/http/http_default_port_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.http_default_port" do - it "returns 80" do - Net::HTTP.http_default_port.should eql(80) - end -end diff --git a/spec/ruby/library/net/http/http/https_default_port_spec.rb b/spec/ruby/library/net/http/http/https_default_port_spec.rb deleted file mode 100644 index fbf0bd1abc..0000000000 --- a/spec/ruby/library/net/http/http/https_default_port_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.https_default_port" do - it "returns 443" do - Net::HTTP.https_default_port.should eql(443) - end -end diff --git a/spec/ruby/library/net/http/http/initialize_spec.rb b/spec/ruby/library/net/http/http/initialize_spec.rb deleted file mode 100644 index 7683713a0e..0000000000 --- a/spec/ruby/library/net/http/http/initialize_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#initialize" do - it "is private" do - Net::HTTP.should have_private_instance_method(:initialize) - end - - describe "when passed address" do - before :each do - @net = Net::HTTP.allocate - @net.send(:initialize, "localhost") - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @net.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the default HTTP port" do - @net.port.should eql(Net::HTTP.default_port) - end - - it "does not start the new Net::HTTP instance" do - @net.started?.should be_false - end - end - - describe "when passed address, port" do - before :each do - @net = Net::HTTP.allocate - @net.send(:initialize, "localhost", 3333) - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @net.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the passed port" do - @net.port.should eql(3333) - end - - it "does not start the new Net::HTTP instance" do - @net.started?.should be_false - end - end -end diff --git a/spec/ruby/library/net/http/http/inspect_spec.rb b/spec/ruby/library/net/http/http/inspect_spec.rb deleted file mode 100644 index b1e799ca34..0000000000 --- a/spec/ruby/library/net/http/http/inspect_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#inspect" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - @http = Net::HTTP.new("localhost", @port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "returns a String representation of self" do - @http.inspect.should be_kind_of(String) - @http.inspect.should == "#<Net::HTTP localhost:#{@port} open=false>" - - @http.start - @http.inspect.should == "#<Net::HTTP localhost:#{@port} open=true>" - end -end diff --git a/spec/ruby/library/net/http/http/is_version_1_1_spec.rb b/spec/ruby/library/net/http/http/is_version_1_1_spec.rb deleted file mode 100644 index f37695b777..0000000000 --- a/spec/ruby/library/net/http/http/is_version_1_1_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/version_1_1' - -describe "Net::HTTP.is_version_1_1?" do - it_behaves_like :net_http_version_1_1_p, :is_version_1_1? -end diff --git a/spec/ruby/library/net/http/http/is_version_1_2_spec.rb b/spec/ruby/library/net/http/http/is_version_1_2_spec.rb deleted file mode 100644 index 82dbdc87aa..0000000000 --- a/spec/ruby/library/net/http/http/is_version_1_2_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/version_1_2' - -describe "Net::HTTP.is_version_1_2?" do - it_behaves_like :net_http_version_1_2_p, :is_version_1_2? -end diff --git a/spec/ruby/library/net/http/http/lock_spec.rb b/spec/ruby/library/net/http/http/lock_spec.rb deleted file mode 100644 index bb76607a8b..0000000000 --- a/spec/ruby/library/net/http/http/lock_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#lock" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a LOCK request to the passed path and returns the response" do - response = @http.lock("/request", "test=test") - response.should be_kind_of(Net::HTTPResponse) - response.body.should == "Request type: LOCK" - end -end diff --git a/spec/ruby/library/net/http/http/mkcol_spec.rb b/spec/ruby/library/net/http/http/mkcol_spec.rb deleted file mode 100644 index 33017625e2..0000000000 --- a/spec/ruby/library/net/http/http/mkcol_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#mkcol" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a MKCOL request to the passed path and returns the response" do - response = @http.mkcol("/request") - response.should be_kind_of(Net::HTTPResponse) - response.body.should == "Request type: MKCOL" - end -end diff --git a/spec/ruby/library/net/http/http/move_spec.rb b/spec/ruby/library/net/http/http/move_spec.rb deleted file mode 100644 index 4d6b828150..0000000000 --- a/spec/ruby/library/net/http/http/move_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#head" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a MOVE request to the passed path and returns the response" do - response = @http.move("/request") - # HEAD requests have no responses - response.body.should == "Request type: MOVE" - end - - it "returns a Net::HTTPResponse" do - @http.move("/request").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/new_spec.rb b/spec/ruby/library/net/http/http/new_spec.rb deleted file mode 100644 index 491d1d01fd..0000000000 --- a/spec/ruby/library/net/http/http/new_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.new" do - describe "when passed address" do - before :each do - @http = Net::HTTP.new("localhost") - end - - it "returns a Net::HTTP instance" do - @http.proxy?.should be_false - @http.instance_of?(Net::HTTP).should be_true - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @http.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the default HTTP port" do - @http.port.should eql(Net::HTTP.default_port) - end - - it "does not start the new Net::HTTP instance" do - @http.started?.should be_false - end - end - - describe "when passed address, port" do - before :each do - @http = Net::HTTP.new("localhost", 3333) - end - - it "returns a Net::HTTP instance" do - @http.proxy?.should be_false - @http.instance_of?(Net::HTTP).should be_true - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @http.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the passed port" do - @http.port.should eql(3333) - end - - it "does not start the new Net::HTTP instance" do - @http.started?.should be_false - end - end - - describe "when passed address, port, *proxy_options" do - it "returns a Net::HTTP instance" do - http = Net::HTTP.new("localhost", 3333, "localhost") - http.proxy?.should be_true - http.instance_of?(Net::HTTP).should be_true - http.should be_kind_of(Net::HTTP) - end - - it "correctly sets the passed Proxy options" do - http = Net::HTTP.new("localhost", 3333, "localhost") - http.proxy_address.should == "localhost" - http.proxy_port.should eql(80) - http.proxy_user.should be_nil - http.proxy_pass.should be_nil - - http = Net::HTTP.new("localhost", 3333, "localhost", 1234) - http.proxy_address.should == "localhost" - http.proxy_port.should eql(1234) - http.proxy_user.should be_nil - http.proxy_pass.should be_nil - - http = Net::HTTP.new("localhost", 3333, "localhost", 1234, "rubyspec") - http.proxy_address.should == "localhost" - http.proxy_port.should eql(1234) - http.proxy_user.should == "rubyspec" - http.proxy_pass.should be_nil - - http = Net::HTTP.new("localhost", 3333, "localhost", 1234, "rubyspec", "rocks") - http.proxy_address.should == "localhost" - http.proxy_port.should eql(1234) - http.proxy_user.should == "rubyspec" - http.proxy_pass.should == "rocks" - end - end - -end diff --git a/spec/ruby/library/net/http/http/newobj_spec.rb b/spec/ruby/library/net/http/http/newobj_spec.rb deleted file mode 100644 index b261dcc5db..0000000000 --- a/spec/ruby/library/net/http/http/newobj_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.newobj" do - before :each do - @net = Net::HTTP.newobj("localhost") - end - - describe "when passed address" do - it "returns a new Net::HTTP instance" do - @net.should be_kind_of(Net::HTTP) - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @net.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the default HTTP port" do - @net.port.should eql(Net::HTTP.default_port) - end - - it "does not start the new Net::HTTP instance" do - @net.started?.should be_false - end - end - - describe "when passed address, port" do - before :each do - @net = Net::HTTP.newobj("localhost", 3333) - end - - it "returns a new Net::HTTP instance" do - @net.should be_kind_of(Net::HTTP) - end - - it "sets the new Net::HTTP instance's address to the passed address" do - @net.address.should == "localhost" - end - - it "sets the new Net::HTTP instance's port to the passed port" do - @net.port.should eql(3333) - end - - it "does not start the new Net::HTTP instance" do - @net.started?.should be_false - end - end -end diff --git a/spec/ruby/library/net/http/http/open_timeout_spec.rb b/spec/ruby/library/net/http/http/open_timeout_spec.rb deleted file mode 100644 index 44b33615e6..0000000000 --- a/spec/ruby/library/net/http/http/open_timeout_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#open_timeout" do - it "returns the seconds to wait till the connection is open" do - net = Net::HTTP.new("localhost") - net.open_timeout.should eql(60) - net.open_timeout = 10 - net.open_timeout.should eql(10) - end -end - -describe "Net::HTTP#open_timeout=" do - it "sets the seconds to wait till the connection is open" do - net = Net::HTTP.new("localhost") - net.open_timeout = 10 - net.open_timeout.should eql(10) - end - - it "returns the newly set value" do - net = Net::HTTP.new("localhost") - (net.open_timeout = 10).should eql(10) - end -end diff --git a/spec/ruby/library/net/http/http/options_spec.rb b/spec/ruby/library/net/http/http/options_spec.rb deleted file mode 100644 index d798e69197..0000000000 --- a/spec/ruby/library/net/http/http/options_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#options" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an options request to the passed path and returns the response" do - response = @http.options("/request") - - response.body.should == "Request type: OPTIONS" - end - - it "returns a Net::HTTPResponse" do - @http.options("/request").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/port_spec.rb b/spec/ruby/library/net/http/http/port_spec.rb deleted file mode 100644 index 7de295ca75..0000000000 --- a/spec/ruby/library/net/http/http/port_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#port" do - it "returns the current port number" do - net = Net::HTTP.new("localhost", 3333) - net.port.should eql(3333) - end -end diff --git a/spec/ruby/library/net/http/http/post2_spec.rb b/spec/ruby/library/net/http/http/post2_spec.rb deleted file mode 100644 index eab9a6a1d2..0000000000 --- a/spec/ruby/library/net/http/http/post2_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_post' - -describe "Net::HTTP#post2" do - it_behaves_like :net_ftp_request_post, :post2 -end diff --git a/spec/ruby/library/net/http/http/post_form_spec.rb b/spec/ruby/library/net/http/http/post_form_spec.rb deleted file mode 100644 index 891e05e7af..0000000000 --- a/spec/ruby/library/net/http/http/post_form_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP.post_form when passed URI" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - end - - after :each do - NetHTTPSpecs.stop_server - end - - it "POSTs the passed form data to the given uri" do - uri = URI.parse("http://localhost:#{@port}/request/body") - data = { test: :data } - - res = Net::HTTP.post_form(uri, data) - res.body.should == "test=data" - end -end diff --git a/spec/ruby/library/net/http/http/post_spec.rb b/spec/ruby/library/net/http/http/post_spec.rb deleted file mode 100644 index c8d41b9617..0000000000 --- a/spec/ruby/library/net/http/http/post_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require 'uri' -require_relative 'fixtures/http_server' - -ruby_version_is '2.4' do - describe "Net::HTTP.post" do - before :each do - NetHTTPSpecs.start_server - end - - after :each do - NetHTTPSpecs.stop_server - end - - it "sends post request to the specified URI and returns response" do - response = Net::HTTP.post( - URI("http://localhost:#{NetHTTPSpecs.port}/request"), - '{ "q": "ruby", "max": "50" }', - "Content-Type" => "application/json") - response.body.should == "Request type: POST" - end - - it "returns a Net::HTTPResponse" do - response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request"), "test=test") - response.should be_kind_of(Net::HTTPResponse) - end - - it "sends Content-Type: application/x-www-form-urlencoded by default" do - response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request/header"), "test=test") - response.body.should include('"content-type"=>["application/x-www-form-urlencoded"]') - end - - it "does not support HTTP Basic Auth" do - response = Net::HTTP.post( - URI("http://john:qwerty@localhost:#{NetHTTPSpecs.port}/request/basic_auth"), - "test=test") - response.body.should == "username: \npassword: " - end - end -end - -describe "Net::HTTP#post" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an post request to the passed path and returns the response" do - response = @http.post("/request", "test=test") - response.body.should == "Request type: POST" - end - - it "returns a Net::HTTPResponse" do - @http.post("/request", "test=test").should be_kind_of(Net::HTTPResponse) - end - - describe "when passed a block" do - it "yields fragments of the response body to the passed block" do - str = "" - @http.post("/request", "test=test") do |res| - str << res - end - str.should == "Request type: POST" - end - - it "returns a Net::HTTPResponse" do - @http.post("/request", "test=test") {}.should be_kind_of(Net::HTTPResponse) - end - end -end diff --git a/spec/ruby/library/net/http/http/propfind_spec.rb b/spec/ruby/library/net/http/http/propfind_spec.rb deleted file mode 100644 index 5240171618..0000000000 --- a/spec/ruby/library/net/http/http/propfind_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#propfind" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an propfind request to the passed path and returns the response" do - response = @http.propfind("/request", "test=test") - response.body.should == "Request type: PROPFIND" - end - - it "returns a Net::HTTPResponse" do - @http.propfind("/request", "test=test").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/proppatch_spec.rb b/spec/ruby/library/net/http/http/proppatch_spec.rb deleted file mode 100644 index 7a761a9f23..0000000000 --- a/spec/ruby/library/net/http/http/proppatch_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#proppatch" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an proppatch request to the passed path and returns the response" do - response = @http.proppatch("/request", "test=test") - response.body.should == "Request type: PROPPATCH" - end - - it "returns a Net::HTTPResponse" do - @http.proppatch("/request", "test=test").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/proxy_address_spec.rb b/spec/ruby/library/net/http/http/proxy_address_spec.rb deleted file mode 100644 index 8d152b8d44..0000000000 --- a/spec/ruby/library/net/http/http/proxy_address_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.proxy_address" do - describe "when self is no proxy class" do - it "returns nil" do - Net::HTTP.proxy_address.should be_nil - end - end - - describe "when self is a proxy class" do - it "returns the address for self's proxy connection" do - Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_address.should == "localhost" - end - end -end - -describe "Net::HTTP#proxy_address" do - describe "when self is no proxy class instance" do - it "returns nil" do - Net::HTTP.new("localhost", 3333).proxy_address.should be_nil - end - end - - describe "when self is a proxy class instance" do - it "returns the password for self's proxy connection" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.new("localhost", 3333).proxy_address.should == "localhost" - end - end -end diff --git a/spec/ruby/library/net/http/http/proxy_class_spec.rb b/spec/ruby/library/net/http/http/proxy_class_spec.rb deleted file mode 100644 index 2aab804ed3..0000000000 --- a/spec/ruby/library/net/http/http/proxy_class_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.proxy_class?" do - it "returns true if sels is a class created with Net::HTTP.Proxy" do - Net::HTTP.proxy_class?.should be_false - Net::HTTP.Proxy("localhost").proxy_class?.should be_true - end -end diff --git a/spec/ruby/library/net/http/http/proxy_pass_spec.rb b/spec/ruby/library/net/http/http/proxy_pass_spec.rb deleted file mode 100644 index 94a0034544..0000000000 --- a/spec/ruby/library/net/http/http/proxy_pass_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.proxy_pass" do - describe "when self is no proxy class" do - it "returns nil" do - Net::HTTP.proxy_pass.should be_nil - end - end - - describe "when self is a proxy class" do - it "returns nil if no password was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").proxy_pass.should be_nil - end - - it "returns the password for self's proxy connection" do - Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_pass.should == "rocks" - end - end -end - -describe "Net::HTTP#proxy_pass" do - describe "when self is no proxy class instance" do - it "returns nil" do - Net::HTTP.new("localhost", 3333).proxy_pass.should be_nil - end - end - - describe "when self is a proxy class instance" do - it "returns nil if no password was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_pass.should be_nil - end - - it "returns the password for self's proxy connection" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.new("localhost", 3333).proxy_pass.should == "rocks" - end - end -end diff --git a/spec/ruby/library/net/http/http/proxy_port_spec.rb b/spec/ruby/library/net/http/http/proxy_port_spec.rb deleted file mode 100644 index 339f7ee850..0000000000 --- a/spec/ruby/library/net/http/http/proxy_port_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.proxy_port" do - describe "when self is no proxy class" do - it "returns nil" do - Net::HTTP.proxy_port.should be_nil - end - end - - describe "when self is a proxy class" do - it "returns 80 if no port was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").proxy_port.should eql(80) - end - - it "returns the port for self's proxy connection" do - Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_port.should eql(1234) - end - end -end - -describe "Net::HTTP#proxy_port" do - describe "when self is no proxy class instance" do - it "returns nil" do - Net::HTTP.new("localhost", 3333).proxy_port.should be_nil - end - end - - describe "when self is a proxy class instance" do - it "returns 80 if no port was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_port.should eql(80) - end - - it "returns the port for self's proxy connection" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.new("localhost", 3333).proxy_port.should eql(1234) - end - end -end diff --git a/spec/ruby/library/net/http/http/proxy_user_spec.rb b/spec/ruby/library/net/http/http/proxy_user_spec.rb deleted file mode 100644 index 01fda400e9..0000000000 --- a/spec/ruby/library/net/http/http/proxy_user_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.proxy_user" do - describe "when self is no proxy class" do - it "returns nil" do - Net::HTTP.proxy_user.should be_nil - end - end - - describe "when self is a proxy class" do - it "returns nil if no username was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").proxy_user.should be_nil - end - - it "returns the username for self's proxy connection" do - Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks").proxy_user.should == "rspec" - end - end -end - -describe "Net::HTTP#proxy_user" do - describe "when self is no proxy class instance" do - it "returns nil" do - Net::HTTP.new("localhost", 3333).proxy_user.should be_nil - end - end - - describe "when self is a proxy class instance" do - it "returns nil if no username was set for self's proxy connection" do - Net::HTTP.Proxy("localhost").new("localhost", 3333).proxy_user.should be_nil - end - - it "returns the username for self's proxy connection" do - http_with_proxy = Net::HTTP.Proxy("localhost", 1234, "rspec", "rocks") - http_with_proxy.new("localhost", 3333).proxy_user.should == "rspec" - end - end -end diff --git a/spec/ruby/library/net/http/http/put2_spec.rb b/spec/ruby/library/net/http/http/put2_spec.rb deleted file mode 100644 index 0ee3590639..0000000000 --- a/spec/ruby/library/net/http/http/put2_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_put' - -describe "Net::HTTP#put2" do - it_behaves_like :net_ftp_request_put, :put2 -end diff --git a/spec/ruby/library/net/http/http/put_spec.rb b/spec/ruby/library/net/http/http/put_spec.rb deleted file mode 100644 index 3ca0d0963e..0000000000 --- a/spec/ruby/library/net/http/http/put_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#put" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an put request to the passed path and returns the response" do - response = @http.put("/request", "test=test") - response.body.should == "Request type: PUT" - end - - it "returns a Net::HTTPResponse" do - @http.put("/request", "test=test").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/read_timeout_spec.rb b/spec/ruby/library/net/http/http/read_timeout_spec.rb deleted file mode 100644 index e23ee76025..0000000000 --- a/spec/ruby/library/net/http/http/read_timeout_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#read_timeout" do - it "returns the seconds to wait until reading one block" do - net = Net::HTTP.new("localhost") - net.read_timeout.should eql(60) - net.read_timeout = 10 - net.read_timeout.should eql(10) - end -end - -describe "Net::HTTP#read_timeout=" do - it "sets the seconds to wait till the connection is open" do - net = Net::HTTP.new("localhost") - net.read_timeout = 10 - net.read_timeout.should eql(10) - end - - it "returns the newly set value" do - net = Net::HTTP.new("localhost") - (net.read_timeout = 10).should eql(10) - end -end diff --git a/spec/ruby/library/net/http/http/request_get_spec.rb b/spec/ruby/library/net/http/http/request_get_spec.rb deleted file mode 100644 index f53a2e9d65..0000000000 --- a/spec/ruby/library/net/http/http/request_get_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_get' - -describe "Net::HTTP#request_get" do - it_behaves_like :net_ftp_request_get, :get2 -end diff --git a/spec/ruby/library/net/http/http/request_head_spec.rb b/spec/ruby/library/net/http/http/request_head_spec.rb deleted file mode 100644 index dc47557b9d..0000000000 --- a/spec/ruby/library/net/http/http/request_head_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_head' - -describe "Net::HTTP#request_head" do - it_behaves_like :net_ftp_request_head, :request_head -end diff --git a/spec/ruby/library/net/http/http/request_post_spec.rb b/spec/ruby/library/net/http/http/request_post_spec.rb deleted file mode 100644 index 0b408fa84d..0000000000 --- a/spec/ruby/library/net/http/http/request_post_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_post' - -describe "Net::HTTP#request_post" do - it_behaves_like :net_ftp_request_post, :request_post -end diff --git a/spec/ruby/library/net/http/http/request_put_spec.rb b/spec/ruby/library/net/http/http/request_put_spec.rb deleted file mode 100644 index 987b52ceb0..0000000000 --- a/spec/ruby/library/net/http/http/request_put_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/request_put' - -describe "Net::HTTP#request_put" do - it_behaves_like :net_ftp_request_put, :request_put -end diff --git a/spec/ruby/library/net/http/http/request_spec.rb b/spec/ruby/library/net/http/http/request_spec.rb deleted file mode 100644 index e63dde9c8d..0000000000 --- a/spec/ruby/library/net/http/http/request_spec.rb +++ /dev/null @@ -1,109 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#request" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when passed request_object" do - it "makes a HTTP Request based on the passed request_object" do - response = @http.request(Net::HTTP::Get.new("/request"), "test=test") - response.body.should == "Request type: GET" - - response = @http.request(Net::HTTP::Head.new("/request"), "test=test") - response.body.should be_nil - - response = @http.request(Net::HTTP::Post.new("/request"), "test=test") - response.body.should == "Request type: POST" - - response = @http.request(Net::HTTP::Put.new("/request"), "test=test") - response.body.should == "Request type: PUT" - - response = @http.request(Net::HTTP::Proppatch.new("/request"), "test=test") - response.body.should == "Request type: PROPPATCH" - - response = @http.request(Net::HTTP::Lock.new("/request"), "test=test") - response.body.should == "Request type: LOCK" - - response = @http.request(Net::HTTP::Unlock.new("/request"), "test=test") - response.body.should == "Request type: UNLOCK" - - # TODO: Does not work? - #response = @http.request(Net::HTTP::Options.new("/request"), "test=test") - #response.body.should be_nil - - response = @http.request(Net::HTTP::Propfind.new("/request"), "test=test") - response.body.should == "Request type: PROPFIND" - - response = @http.request(Net::HTTP::Delete.new("/request"), "test=test") - response.body.should == "Request type: DELETE" - - response = @http.request(Net::HTTP::Move.new("/request"), "test=test") - response.body.should == "Request type: MOVE" - - response = @http.request(Net::HTTP::Copy.new("/request"), "test=test") - response.body.should == "Request type: COPY" - - response = @http.request(Net::HTTP::Mkcol.new("/request"), "test=test") - response.body.should == "Request type: MKCOL" - - response = @http.request(Net::HTTP::Trace.new("/request"), "test=test") - response.body.should == "Request type: TRACE" - end - end - - describe "when passed request_object and request_body" do - it "sends the passed request_body when making the HTTP Request" do - response = @http.request(Net::HTTP::Get.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Head.new("/request/body"), "test=test") - response.body.should be_nil - - response = @http.request(Net::HTTP::Post.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Put.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Proppatch.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Lock.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Unlock.new("/request/body"), "test=test") - response.body.should == "test=test" - - # TODO: Does not work? - #response = @http.request(Net::HTTP::Options.new("/request/body"), "test=test") - #response.body.should be_nil - - response = @http.request(Net::HTTP::Propfind.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Delete.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Move.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Copy.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Mkcol.new("/request/body"), "test=test") - response.body.should == "test=test" - - response = @http.request(Net::HTTP::Trace.new("/request/body"), "test=test") - response.body.should == "test=test" - end - end -end diff --git a/spec/ruby/library/net/http/http/request_types_spec.rb b/spec/ruby/library/net/http/http/request_types_spec.rb deleted file mode 100644 index 99d754d3d1..0000000000 --- a/spec/ruby/library/net/http/http/request_types_spec.rb +++ /dev/null @@ -1,254 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP::Get" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Get.should < Net::HTTPRequest - end - - it "represents the 'GET'-Request-Method" do - Net::HTTP::Get::METHOD.should == "GET" - end - - it "has no Request Body" do - Net::HTTP::Get::REQUEST_HAS_BODY.should be_false - end - - it "has a Response Body" do - Net::HTTP::Get::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Head" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Head.should < Net::HTTPRequest - end - - it "represents the 'HEAD'-Request-Method" do - Net::HTTP::Head::METHOD.should == "HEAD" - end - - it "has no Request Body" do - Net::HTTP::Head::REQUEST_HAS_BODY.should be_false - end - - it "has no Response Body" do - Net::HTTP::Head::RESPONSE_HAS_BODY.should be_false - end -end - -describe "Net::HTTP::Post" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Post.should < Net::HTTPRequest - end - - it "represents the 'POST'-Request-Method" do - Net::HTTP::Post::METHOD.should == "POST" - end - - it "has a Request Body" do - Net::HTTP::Post::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Post::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Put" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Put.should < Net::HTTPRequest - end - - it "represents the 'PUT'-Request-Method" do - Net::HTTP::Put::METHOD.should == "PUT" - end - - it "has a Request Body" do - Net::HTTP::Put::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Put::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Delete" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Delete.should < Net::HTTPRequest - end - - it "represents the 'DELETE'-Request-Method" do - Net::HTTP::Delete::METHOD.should == "DELETE" - end - - it "has no Request Body" do - Net::HTTP::Delete::REQUEST_HAS_BODY.should be_false - end - - it "has a Response Body" do - Net::HTTP::Delete::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Options" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Options.should < Net::HTTPRequest - end - - it "represents the 'OPTIONS'-Request-Method" do - Net::HTTP::Options::METHOD.should == "OPTIONS" - end - - it "has no Request Body" do - Net::HTTP::Options::REQUEST_HAS_BODY.should be_false - end - - it "has no Response Body" do - Net::HTTP::Options::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Trace" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Trace.should < Net::HTTPRequest - end - - it "represents the 'TRACE'-Request-Method" do - Net::HTTP::Trace::METHOD.should == "TRACE" - end - - it "has no Request Body" do - Net::HTTP::Trace::REQUEST_HAS_BODY.should be_false - end - - it "has a Response Body" do - Net::HTTP::Trace::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Propfind" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Propfind.should < Net::HTTPRequest - end - - it "represents the 'PROPFIND'-Request-Method" do - Net::HTTP::Propfind::METHOD.should == "PROPFIND" - end - - it "has a Request Body" do - Net::HTTP::Propfind::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Propfind::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Proppatch" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Proppatch.should < Net::HTTPRequest - end - - it "represents the 'PROPPATCH'-Request-Method" do - Net::HTTP::Proppatch::METHOD.should == "PROPPATCH" - end - - it "has a Request Body" do - Net::HTTP::Proppatch::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Proppatch::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Mkcol" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Mkcol.should < Net::HTTPRequest - end - - it "represents the 'MKCOL'-Request-Method" do - Net::HTTP::Mkcol::METHOD.should == "MKCOL" - end - - it "has a Request Body" do - Net::HTTP::Mkcol::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Mkcol::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Copy" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Copy.should < Net::HTTPRequest - end - - it "represents the 'COPY'-Request-Method" do - Net::HTTP::Copy::METHOD.should == "COPY" - end - - it "has no Request Body" do - Net::HTTP::Copy::REQUEST_HAS_BODY.should be_false - end - - it "has a Response Body" do - Net::HTTP::Copy::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Move" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Move.should < Net::HTTPRequest - end - - it "represents the 'MOVE'-Request-Method" do - Net::HTTP::Move::METHOD.should == "MOVE" - end - - it "has no Request Body" do - Net::HTTP::Move::REQUEST_HAS_BODY.should be_false - end - - it "has a Response Body" do - Net::HTTP::Move::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Lock" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Lock.should < Net::HTTPRequest - end - - it "represents the 'LOCK'-Request-Method" do - Net::HTTP::Lock::METHOD.should == "LOCK" - end - - it "has a Request Body" do - Net::HTTP::Lock::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Lock::RESPONSE_HAS_BODY.should be_true - end -end - -describe "Net::HTTP::Unlock" do - it "is a subclass of Net::HTTPRequest" do - Net::HTTP::Unlock.should < Net::HTTPRequest - end - - it "represents the 'UNLOCK'-Request-Method" do - Net::HTTP::Unlock::METHOD.should == "UNLOCK" - end - - it "has a Request Body" do - Net::HTTP::Unlock::REQUEST_HAS_BODY.should be_true - end - - it "has a Response Body" do - Net::HTTP::Unlock::RESPONSE_HAS_BODY.should be_true - end -end diff --git a/spec/ruby/library/net/http/http/send_request_spec.rb b/spec/ruby/library/net/http/http/send_request_spec.rb deleted file mode 100644 index 03fd32e470..0000000000 --- a/spec/ruby/library/net/http/http/send_request_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#send_request" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - - # HEAD is special so handled separately - @methods = %w[ - GET POST PUT DELETE - OPTIONS - PROPFIND PROPPATCH LOCK UNLOCK - ] - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - # TODO: Does only work with GET and POST requests - describe "when passed type, path" do - it "sends a HTTP Request of the passed type to the passed path" do - response = @http.send_request("HEAD", "/request") - response.body.should be_nil - - @methods.each do |method| - response = @http.send_request(method, "/request") - response.body.should == "Request type: #{method}" - end - end - end - - describe "when passed type, path, body" do - it "sends a HTTP Request with the passed body" do - response = @http.send_request("HEAD", "/request/body", "test=test") - response.body.should be_nil - - @methods.each do |method| - response = @http.send_request(method, "/request/body", "test=test") - response.body.should == "test=test" - end - end - end - - describe "when passed type, path, body, headers" do - it "sends a HTTP Request with the passed headers" do - referer = 'https://www.ruby-lang.org/'.freeze - - response = @http.send_request("HEAD", "/request/header", "test=test", "referer" => referer) - response.body.should be_nil - - @methods.each do |method| - response = @http.send_request(method, "/request/header", "test=test", "referer" => referer) - response.body.should include('"referer"=>["' + referer + '"]') - end - end - end -end diff --git a/spec/ruby/library/net/http/http/set_debug_output_spec.rb b/spec/ruby/library/net/http/http/set_debug_output_spec.rb deleted file mode 100644 index e0fe4796da..0000000000 --- a/spec/ruby/library/net/http/http/set_debug_output_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" -require_relative 'fixtures/http_server' - -describe "Net::HTTP#set_debug_output when passed io" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sets the passed io as output stream for debugging" do - io = StringIO.new - - @http.set_debug_output(io) - @http.start - io.string.should_not be_empty - size = io.string.size - - @http.get("/") - io.string.size.should > size - end - - it "outputs a warning when the connection has already been started" do - @http.start - lambda { @http.set_debug_output(StringIO.new) }.should complain(/Net::HTTP#set_debug_output called after HTTP started/) - end -end diff --git a/spec/ruby/library/net/http/http/shared/request_get.rb b/spec/ruby/library/net/http/http/shared/request_get.rb deleted file mode 100644 index b0eca665d6..0000000000 --- a/spec/ruby/library/net/http/http/shared/request_get.rb +++ /dev/null @@ -1,41 +0,0 @@ -describe :net_ftp_request_get, shared: true do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when passed no block" do - it "sends a GET request to the passed path and returns the response" do - response = @http.send(@method, "/request") - response.body.should == "Request type: GET" - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request") - response.should be_kind_of(Net::HTTPResponse) - end - end - - describe "when passed a block" do - it "sends a GET request to the passed path and returns the response" do - response = @http.send(@method, "/request") {} - response.body.should == "Request type: GET" - end - - it "yields the response to the passed block" do - @http.send(@method, "/request") do |response| - response.body.should == "Request type: GET" - end - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request") {} - response.should be_kind_of(Net::HTTPResponse) - end - end -end diff --git a/spec/ruby/library/net/http/http/shared/request_head.rb b/spec/ruby/library/net/http/http/shared/request_head.rb deleted file mode 100644 index 0e669de9ac..0000000000 --- a/spec/ruby/library/net/http/http/shared/request_head.rb +++ /dev/null @@ -1,41 +0,0 @@ -describe :net_ftp_request_head, shared: true do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when passed no block" do - it "sends a head request to the passed path and returns the response" do - response = @http.send(@method, "/request") - response.body.should be_nil - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request") - response.should be_kind_of(Net::HTTPResponse) - end - end - - describe "when passed a block" do - it "sends a head request to the passed path and returns the response" do - response = @http.send(@method, "/request") {} - response.body.should be_nil - end - - it "yields the response to the passed block" do - @http.send(@method, "/request") do |response| - response.body.should be_nil - end - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request") {} - response.should be_kind_of(Net::HTTPResponse) - end - end -end diff --git a/spec/ruby/library/net/http/http/shared/request_post.rb b/spec/ruby/library/net/http/http/shared/request_post.rb deleted file mode 100644 index 06c5e139f9..0000000000 --- a/spec/ruby/library/net/http/http/shared/request_post.rb +++ /dev/null @@ -1,41 +0,0 @@ -describe :net_ftp_request_post, shared: true do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when passed no block" do - it "sends a post request to the passed path and returns the response" do - response = @http.send(@method, "/request", "test=test") - response.body.should == "Request type: POST" - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request", "test=test") - response.should be_kind_of(Net::HTTPResponse) - end - end - - describe "when passed a block" do - it "sends a post request to the passed path and returns the response" do - response = @http.send(@method, "/request", "test=test") {} - response.body.should == "Request type: POST" - end - - it "yields the response to the passed block" do - @http.send(@method, "/request", "test=test") do |response| - response.body.should == "Request type: POST" - end - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request", "test=test") {} - response.should be_kind_of(Net::HTTPResponse) - end - end -end diff --git a/spec/ruby/library/net/http/http/shared/request_put.rb b/spec/ruby/library/net/http/http/shared/request_put.rb deleted file mode 100644 index 6ae791d7e7..0000000000 --- a/spec/ruby/library/net/http/http/shared/request_put.rb +++ /dev/null @@ -1,41 +0,0 @@ -describe :net_ftp_request_put, shared: true do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - describe "when passed no block" do - it "sends a put request to the passed path and returns the response" do - response = @http.send(@method, "/request", "test=test") - response.body.should == "Request type: PUT" - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request", "test=test") - response.should be_kind_of(Net::HTTPResponse) - end - end - - describe "when passed a block" do - it "sends a put request to the passed path and returns the response" do - response = @http.send(@method, "/request", "test=test") {} - response.body.should == "Request type: PUT" - end - - it "yields the response to the passed block" do - @http.send(@method, "/request", "test=test") do |response| - response.body.should == "Request type: PUT" - end - end - - it "returns a Net::HTTPResponse object" do - response = @http.send(@method, "/request", "test=test") {} - response.should be_kind_of(Net::HTTPResponse) - end - end -end diff --git a/spec/ruby/library/net/http/http/shared/started.rb b/spec/ruby/library/net/http/http/shared/started.rb deleted file mode 100644 index 9ff6272c31..0000000000 --- a/spec/ruby/library/net/http/http/shared/started.rb +++ /dev/null @@ -1,26 +0,0 @@ -describe :net_http_started_p, shared: true do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "returns true when self has been started" do - @http.start - @http.send(@method).should be_true - end - - it "returns false when self has not been started yet" do - @http.send(@method).should be_false - end - - it "returns false when self has been stopped again" do - @http.start - @http.finish - @http.send(@method).should be_false - end -end diff --git a/spec/ruby/library/net/http/http/shared/version_1_1.rb b/spec/ruby/library/net/http/http/shared/version_1_1.rb deleted file mode 100644 index db3d6a986d..0000000000 --- a/spec/ruby/library/net/http/http/shared/version_1_1.rb +++ /dev/null @@ -1,6 +0,0 @@ -describe :net_http_version_1_1_p, shared: true do - it "returns the state of net/http 1.1 features" do - Net::HTTP.version_1_2 - Net::HTTP.send(@method).should be_false - end -end diff --git a/spec/ruby/library/net/http/http/shared/version_1_2.rb b/spec/ruby/library/net/http/http/shared/version_1_2.rb deleted file mode 100644 index b044182c60..0000000000 --- a/spec/ruby/library/net/http/http/shared/version_1_2.rb +++ /dev/null @@ -1,6 +0,0 @@ -describe :net_http_version_1_2_p, shared: true do - it "returns the state of net/http 1.2 features" do - Net::HTTP.version_1_2 - Net::HTTP.send(@method).should be_true - end -end diff --git a/spec/ruby/library/net/http/http/socket_type_spec.rb b/spec/ruby/library/net/http/http/socket_type_spec.rb deleted file mode 100644 index 5c844ddf94..0000000000 --- a/spec/ruby/library/net/http/http/socket_type_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP.socket_type" do - it "returns BufferedIO" do - Net::HTTP.socket_type.should == Net::BufferedIO - end -end diff --git a/spec/ruby/library/net/http/http/start_spec.rb b/spec/ruby/library/net/http/http/start_spec.rb deleted file mode 100644 index e23f9183f7..0000000000 --- a/spec/ruby/library/net/http/http/start_spec.rb +++ /dev/null @@ -1,111 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP.start" do - before :each do - NetHTTPSpecs.start_server - @port = NetHTTPSpecs.port - end - - after :each do - NetHTTPSpecs.stop_server - end - - describe "when not passed a block" do - before :each do - @http = Net::HTTP.start("localhost", @port) - end - - after :each do - @http.finish if @http.started? - end - - it "returns a new Net::HTTP object for the passed address and port" do - @http.should be_kind_of(Net::HTTP) - @http.address.should == "localhost" - @http.port.should == @port - end - - it "opens the tcp connection" do - @http.started?.should be_true - end - end - - describe "when passed a block" do - it "returns the blocks return value" do - Net::HTTP.start("localhost", @port) { :test }.should == :test - end - - it "yields the new Net::HTTP object to the block" do - yielded = false - Net::HTTP.start("localhost", @port) do |net| - yielded = true - net.should be_kind_of(Net::HTTP) - end - yielded.should be_true - end - - it "opens the tcp connection before yielding" do - Net::HTTP.start("localhost", @port) { |http| http.started?.should be_true } - end - - it "closes the tcp connection after yielding" do - net = nil - Net::HTTP.start("localhost", @port) { |x| net = x } - net.started?.should be_false - end - end -end - -describe "Net::HTTP#start" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.new("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "returns self" do - @http.start.should equal(@http) - end - - it "opens the tcp connection" do - @http.start - @http.started?.should be_true - end - - describe "when self has already been started" do - it "raises an IOError" do - @http.start - lambda { @http.start }.should raise_error(IOError) - end - end - - describe "when passed a block" do - it "returns the blocks return value" do - @http.start { :test }.should == :test - end - - it "yields the new Net::HTTP object to the block" do - yielded = false - @http.start do |http| - yielded = true - http.should equal(@http) - end - yielded.should be_true - end - - it "opens the tcp connection before yielding" do - @http.start { |http| http.started?.should be_true } - end - - it "closes the tcp connection after yielding" do - @http.start { } - @http.started?.should be_false - end - end -end diff --git a/spec/ruby/library/net/http/http/started_spec.rb b/spec/ruby/library/net/http/http/started_spec.rb deleted file mode 100644 index ea441ed16a..0000000000 --- a/spec/ruby/library/net/http/http/started_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' -require_relative 'shared/started' - -describe "Net::HTTP#started?" do - it_behaves_like :net_http_started_p, :started? -end diff --git a/spec/ruby/library/net/http/http/trace_spec.rb b/spec/ruby/library/net/http/http/trace_spec.rb deleted file mode 100644 index 94a1bf6655..0000000000 --- a/spec/ruby/library/net/http/http/trace_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#trace" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends a TRACE request to the passed path and returns the response" do - response = @http.trace("/request") - response.body.should == "Request type: TRACE" - end - - it "returns a Net::HTTPResponse" do - @http.trace("/request").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/unlock_spec.rb b/spec/ruby/library/net/http/http/unlock_spec.rb deleted file mode 100644 index a4f1b7a1d1..0000000000 --- a/spec/ruby/library/net/http/http/unlock_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/http_server' - -describe "Net::HTTP#unlock" do - before :each do - NetHTTPSpecs.start_server - @http = Net::HTTP.start("localhost", NetHTTPSpecs.port) - end - - after :each do - @http.finish if @http.started? - NetHTTPSpecs.stop_server - end - - it "sends an UNLOCK request to the passed path and returns the response" do - response = @http.unlock("/request", "test=test") - response.body.should == "Request type: UNLOCK" - end - - it "returns a Net::HTTPResponse" do - @http.unlock("/request", "test=test").should be_kind_of(Net::HTTPResponse) - end -end diff --git a/spec/ruby/library/net/http/http/use_ssl_spec.rb b/spec/ruby/library/net/http/http/use_ssl_spec.rb deleted file mode 100644 index be1ec7fa25..0000000000 --- a/spec/ruby/library/net/http/http/use_ssl_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTP#use_ssl?" do - it "returns false" do - http = Net::HTTP.new("localhost") - http.use_ssl?.should be_false - end -end diff --git a/spec/ruby/library/net/http/http/version_1_1_spec.rb b/spec/ruby/library/net/http/http/version_1_1_spec.rb deleted file mode 100644 index 1c069e9ea6..0000000000 --- a/spec/ruby/library/net/http/http/version_1_1_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/version_1_1' - -describe "Net::HTTP.version_1_1?" do - it_behaves_like :net_http_version_1_1_p, :version_1_1? -end diff --git a/spec/ruby/library/net/http/http/version_1_2_spec.rb b/spec/ruby/library/net/http/http/version_1_2_spec.rb deleted file mode 100644 index 4e601462c9..0000000000 --- a/spec/ruby/library/net/http/http/version_1_2_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/version_1_2' - -describe "Net::HTTP.version_1_2" do - it "turns on net/http 1.2 features" do - Net::HTTP.version_1_2 - - Net::HTTP.version_1_2?.should be_true - Net::HTTP.version_1_1?.should be_false - end - - it "returns true" do - Net::HTTP.version_1_2.should be_true - end -end - -describe "Net::HTTP.version_1_2?" do - it_behaves_like :net_http_version_1_2_p, :version_1_2? -end diff --git a/spec/ruby/library/net/http/httpexceptions/initialize_spec.rb b/spec/ruby/library/net/http/httpexceptions/initialize_spec.rb deleted file mode 100644 index 8e3fd8cc02..0000000000 --- a/spec/ruby/library/net/http/httpexceptions/initialize_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPExceptions#initialize when passed message, response" do - before :each do - @exception = NetHTTPExceptionsSpecs::Simple.new("error message", "a http response") - end - - it "calls super with the passed message" do - @exception.message.should == "error message" - end - - it "sets self's response to the passed response" do - @exception.response.should == "a http response" - end -end diff --git a/spec/ruby/library/net/http/httpexceptions/response_spec.rb b/spec/ruby/library/net/http/httpexceptions/response_spec.rb deleted file mode 100644 index 205b2bc212..0000000000 --- a/spec/ruby/library/net/http/httpexceptions/response_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPExceptions#response" do - it "returns self's response" do - exception = NetHTTPExceptionsSpecs::Simple.new("error message", "a http response") - exception.response.should == "a http response" - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/body_exist_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/body_exist_spec.rb deleted file mode 100644 index ab56176a5c..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/body_exist_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#body_exist?" do - it "returns true when the response is expected to have a body" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.body_exist?.should be_true - - request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") - request.body_exist?.should be_false - end - - describe "when $VERBOSE is true" do - it "emits a warning" do - request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") - lambda { - $VERBOSE = true - request.body_exist? - }.should complain(/body_exist\? is obsolete/) - end - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/body_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/body_spec.rb deleted file mode 100644 index a215895b57..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/body_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" - -describe "Net::HTTPGenericRequest#body" do - it "returns self's request body" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.body.should be_nil - - request.body = "Some Content" - request.body.should == "Some Content" - end -end - -describe "Net::HTTPGenericRequest#body=" do - before :each do - @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - end - - it "sets self's body content to the passed String" do - @request.body = "Some Content" - @request.body.should == "Some Content" - end - - it "sets self's body stream to nil" do - @request.body_stream = StringIO.new("") - @request.body = "Some Content" - @request.body_stream.should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/body_stream_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/body_stream_spec.rb deleted file mode 100644 index c2a60e6836..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/body_stream_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" - -describe "Net::HTTPGenericRequest#body_stream" do - it "returns self's body stream Object" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.body_stream.should be_nil - - stream = StringIO.new("test") - request.body_stream = stream - request.body_stream.should equal(stream) - end -end - -describe "Net::HTTPGenericRequest#body_stream=" do - before :each do - @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - @stream = StringIO.new("test") - end - - it "sets self's body stream to the passed Object" do - @request.body_stream = @stream - @request.body_stream.should equal(@stream) - end - - it "sets self's body to nil" do - @request.body = "Some Content" - @request.body_stream = @stream - @request.body.should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/exec_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/exec_spec.rb deleted file mode 100644 index 90e158a159..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/exec_spec.rb +++ /dev/null @@ -1,131 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" - -describe "Net::HTTPGenericRequest#exec when passed socket, version, path" do - before :each do - @socket = StringIO.new("") - @buffered_socket = Net::BufferedIO.new(@socket) - end - - it "executes the request over the socket to the path using the HTTP version" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - - request.exec(@buffered_socket, "1.1", "/some/path") - str = @socket.string - - str.should =~ %r[POST /some/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str[-4..-1].should == "\r\n\r\n" - - request = Net::HTTPGenericRequest.new("GET", true, true, "/some/path", - "Content-Type" => "text/html") - - request.exec(@buffered_socket, "1.0", "/some/other/path") - str = @socket.string - - str.should =~ %r[GET /some/other/path HTTP/1.0\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: text/html\r\n] - str[-4..-1].should == "\r\n\r\n" - end - - describe "when a request body is set" do - it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.body = "Some Content" - - request.exec(@buffered_socket, "1.1", "/some/other/path") - str = @socket.string - - str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n] - str.should =~ %r[Content-Length: 12\r\n] - str[-16..-1].should == "\r\n\r\nSome Content" - end - - it "correctly sets the 'Content-Length' header and includes the body" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", - "Content-Type" => "text/html") - request.body = "Some Content" - - request.exec(@buffered_socket, "1.1", "/some/other/path") - str = @socket.string - - str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: text/html\r\n] - str.should =~ %r[Content-Length: 12\r\n] - str[-16..-1].should == "\r\n\r\nSome Content" - end - end - - describe "when a body stream is set" do - it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", - "Content-Length" => "10") - request.body_stream = StringIO.new("a" * 20) - - request.exec(@buffered_socket, "1.1", "/some/other/path") - str = @socket.string - - str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n] - str.should =~ %r[Content-Length: 10\r\n] - str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa" - end - - it "sends the whole stream, regardless of the 'Content-Length' header" do - request = Net::HTTPGenericRequest.new("POST", true, true,"/some/path", - "Content-Type" => "text/html", - "Content-Length" => "10") - request.body_stream = StringIO.new("a" * 20) - - request.exec(@buffered_socket, "1.1", "/some/other/path") - str = @socket.string - - str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: text/html\r\n] - str.should =~ %r[Content-Length: 10\r\n] - str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa" - end - - it "sends the request in chunks when 'Transfer-Encoding' is set to 'chunked'" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", - "Content-Type" => "text/html", - "Transfer-Encoding" => "chunked") - datasize = 1024 * 10 - request.body_stream = StringIO.new("a" * datasize) - - request.exec(@buffered_socket, "1.1", "/some/other/path") - str = @socket.string - - str.should =~ %r[POST /some/other/path HTTP/1.1\r\n] - str.should =~ %r[Accept: \*/\*\r\n] - str.should =~ %r[Content-Type: text/html\r\n] - str.should =~ %r[Transfer-Encoding: chunked\r\n] - str =~ %r[\r\n\r\n] - str = $' - while datasize > 0 - chunk_size_line, str = str.split(/\r\n/, 2) - chunk_size = chunk_size_line[/\A[0-9A-Fa-f]+/].to_i(16) - str.slice!(0, chunk_size).should == 'a' * chunk_size - datasize -= chunk_size - str.slice!(0, 2).should == "\r\n" - end - datasize.should == 0 - str.should == %"0\r\n\r\n" - end - - it "raises an ArgumentError when the 'Content-Length' is not set or 'Transfer-Encoding' is not set to 'chunked'" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path", - "Content-Type" => "text/html") - request.body_stream = StringIO.new("Some Content") - - lambda { request.exec(@buffered_socket, "1.1", "/some/other/path") }.should raise_error(ArgumentError) - end - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/inspect_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/inspect_spec.rb deleted file mode 100644 index 36240949c3..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/inspect_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#inspect" do - it "returns a String representation of self" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.inspect.should == "#<Net::HTTPGenericRequest POST>" - - request = Net::HTTPGenericRequest.new("GET", false, true, "/some/path") - request.inspect.should == "#<Net::HTTPGenericRequest GET>" - - request = Net::HTTPGenericRequest.new("BLA", true, true, "/some/path") - request.inspect.should == "#<Net::HTTPGenericRequest BLA>" - - # Subclasses - request = Net::HTTP::Get.new("/some/path") - request.inspect.should == "#<Net::HTTP::Get GET>" - - request = Net::HTTP::Post.new("/some/path") - request.inspect.should == "#<Net::HTTP::Post POST>" - - request = Net::HTTP::Trace.new("/some/path") - request.inspect.should == "#<Net::HTTP::Trace TRACE>" - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/method_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/method_spec.rb deleted file mode 100644 index 3f7c2cbf2b..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/method_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#method" do - it "returns self's request method" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.method.should == "POST" - - request = Net::HTTPGenericRequest.new("GET", false, true, "/some/path") - request.method.should == "GET" - - request = Net::HTTPGenericRequest.new("BLA", true, true, "/some/path") - request.method.should == "BLA" - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/path_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/path_spec.rb deleted file mode 100644 index fc4cf9af53..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/path_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#path" do - it "returns self's request path" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.path.should == "/some/path" - - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/other/path") - request.path.should == "/some/other/path" - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/request_body_permitted_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/request_body_permitted_spec.rb deleted file mode 100644 index 50cd1ff637..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/request_body_permitted_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#request_body_permitted?" do - it "returns true when the request is expected to have a body" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.request_body_permitted?.should be_true - - request = Net::HTTPGenericRequest.new("POST", false, true, "/some/path") - request.request_body_permitted?.should be_false - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/response_body_permitted_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/response_body_permitted_spec.rb deleted file mode 100644 index 0c4165d0ab..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/response_body_permitted_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#response_body_permitted?" do - it "returns true when the response is expected to have a body" do - request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - request.response_body_permitted?.should be_true - - request = Net::HTTPGenericRequest.new("POST", true, false, "/some/path") - request.response_body_permitted?.should be_false - end -end diff --git a/spec/ruby/library/net/http/httpgenericrequest/set_body_internal_spec.rb b/spec/ruby/library/net/http/httpgenericrequest/set_body_internal_spec.rb deleted file mode 100644 index ef2edc019a..0000000000 --- a/spec/ruby/library/net/http/httpgenericrequest/set_body_internal_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPGenericRequest#set_body_internal when passed string" do - before :each do - @request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path") - end - - it "sets self's body to the passed string" do - @request.set_body_internal("Some Content") - @request.body.should == "Some Content" - end - - it "raises an ArgumentError when the body or body_stream of self have already been set" do - @request.body = "Some Content" - lambda { @request.set_body_internal("Some other Content") }.should raise_error(ArgumentError) - - @request.body_stream = "Some Content" - lambda { @request.set_body_internal("Some other Content") }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/net/http/httpheader/add_field_spec.rb b/spec/ruby/library/net/http/httpheader/add_field_spec.rb deleted file mode 100644 index 882d5ac5bb..0000000000 --- a/spec/ruby/library/net/http/httpheader/add_field_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#add_field when passed key, value" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "adds the passed value to the header entry with the passed key" do - @headers.add_field("My-Header", "a") - @headers.get_fields("My-Header").should == ["a"] - - @headers.add_field("My-Header", "b") - @headers.get_fields("My-Header").should == ["a", "b"] - - @headers.add_field("My-Header", "c") - @headers.get_fields("My-Header").should == ["a", "b", "c"] - end - - it "is case-insensitive" do - @headers.add_field("My-Header", "a") - @headers.get_fields("My-Header").should == ["a"] - - @headers.add_field("my-header", "b") - @headers.get_fields("My-Header").should == ["a", "b"] - - @headers.add_field("MY-HEADER", "c") - @headers.get_fields("My-Header").should == ["a", "b", "c"] - end -end diff --git a/spec/ruby/library/net/http/httpheader/basic_auth_spec.rb b/spec/ruby/library/net/http/httpheader/basic_auth_spec.rb deleted file mode 100644 index fa2a710fe1..0000000000 --- a/spec/ruby/library/net/http/httpheader/basic_auth_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#basic_auth when passed account, password" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "sets the 'Authorization' Header entry for basic authorization" do - @headers.basic_auth("rubyspec", "rocks") - @headers["Authorization"].should == "Basic cnVieXNwZWM6cm9ja3M=" - end -end diff --git a/spec/ruby/library/net/http/httpheader/canonical_each_spec.rb b/spec/ruby/library/net/http/httpheader/canonical_each_spec.rb deleted file mode 100644 index 0dddd3049b..0000000000 --- a/spec/ruby/library/net/http/httpheader/canonical_each_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_capitalized' - -describe "Net::HTTPHeader#canonical_each" do - it_behaves_like :net_httpheader_each_capitalized, :canonical_each -end diff --git a/spec/ruby/library/net/http/httpheader/chunked_spec.rb b/spec/ruby/library/net/http/httpheader/chunked_spec.rb deleted file mode 100644 index 96b758981b..0000000000 --- a/spec/ruby/library/net/http/httpheader/chunked_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#chunked?" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns true if the 'Transfer-Encoding' header entry is set to chunked" do - @headers.chunked?.should be_false - - @headers["Transfer-Encoding"] = "bla" - @headers.chunked?.should be_false - - @headers["Transfer-Encoding"] = "blachunkedbla" - @headers.chunked?.should be_false - - @headers["Transfer-Encoding"] = "chunked" - @headers.chunked?.should be_true - end -end diff --git a/spec/ruby/library/net/http/httpheader/content_length_spec.rb b/spec/ruby/library/net/http/httpheader/content_length_spec.rb deleted file mode 100644 index 44c971c98e..0000000000 --- a/spec/ruby/library/net/http/httpheader/content_length_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#content_length" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns nil if no 'Content-Length' header entry is set" do - @headers.content_length.should be_nil - end - - it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Length' header entry has an invalid format" do - @headers["Content-Length"] = "invalid" - lambda { @headers.content_length }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "returns the value of the 'Content-Length' header entry as an Integer" do - @headers["Content-Length"] = "123" - @headers.content_length.should eql(123) - - @headers["Content-Length"] = "123valid" - @headers.content_length.should eql(123) - - @headers["Content-Length"] = "valid123" - @headers.content_length.should eql(123) - end -end - -describe "Net::HTTPHeader#content_length=" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "removes the 'Content-Length' entry if passed false or nil" do - @headers["Content-Length"] = "123" - @headers.content_length = nil - @headers["Content-Length"].should be_nil - end - - it "sets the 'Content-Length' entry to the passed value" do - @headers.content_length = "123" - @headers["Content-Length"].should == "123" - - @headers.content_length = "123valid" - @headers["Content-Length"].should == "123" - end - - it "sets the 'Content-Length' entry to 0 if the passed value is not valid" do - @headers.content_length = "invalid123" - @headers["Content-Length"].should == "0" - end -end diff --git a/spec/ruby/library/net/http/httpheader/content_range_spec.rb b/spec/ruby/library/net/http/httpheader/content_range_spec.rb deleted file mode 100644 index 23dc92348b..0000000000 --- a/spec/ruby/library/net/http/httpheader/content_range_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#content_range" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns a Range object that represents the 'Content-Range' header entry" do - @headers["Content-Range"] = "bytes 0-499/1234" - @headers.content_range.should == (0..499) - - @headers["Content-Range"] = "bytes 500-1233/1234" - @headers.content_range.should == (500..1233) - end - - it "returns nil when there is no 'Content-Range' header entry" do - @headers.content_range.should be_nil - end - - it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Range' has an invalid format" do - @headers["Content-Range"] = "invalid" - lambda { @headers.content_range }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Content-Range"] = "bytes 123-abc" - lambda { @headers.content_range }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Content-Range"] = "bytes abc-123" - lambda { @headers.content_range }.should raise_error(Net::HTTPHeaderSyntaxError) - end -end diff --git a/spec/ruby/library/net/http/httpheader/content_type_spec.rb b/spec/ruby/library/net/http/httpheader/content_type_spec.rb deleted file mode 100644 index 1f8b4ba326..0000000000 --- a/spec/ruby/library/net/http/httpheader/content_type_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_content_type' - -describe "Net::HTTPHeader#content_type" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the content type string, as per 'Content-Type' header entry" do - @headers["Content-Type"] = "text/html" - @headers.content_type.should == "text/html" - - @headers["Content-Type"] = "text/html;charset=utf-8" - @headers.content_type.should == "text/html" - end - - it "returns nil if the 'Content-Type' header entry does not exist" do - @headers.content_type.should be_nil - end -end - -describe "Net::HTTPHeader#content_type=" do - it_behaves_like :net_httpheader_set_content_type, :content_type= -end diff --git a/spec/ruby/library/net/http/httpheader/delete_spec.rb b/spec/ruby/library/net/http/httpheader/delete_spec.rb deleted file mode 100644 index 603ae198de..0000000000 --- a/spec/ruby/library/net/http/httpheader/delete_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#delete when passed key" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "removes the header entry with the passed key" do - @headers["My-Header"] = "test" - @headers.delete("My-Header") - - @headers["My-Header"].should be_nil - @headers.size.should eql(0) - end - - it "returns the removed values" do - @headers["My-Header"] = "test" - @headers.delete("My-Header").should == ["test"] - end - - it "is case-insensitive" do - @headers["My-Header"] = "test" - @headers.delete("my-header") - - @headers["My-Header"].should be_nil - @headers.size.should eql(0) - end -end diff --git a/spec/ruby/library/net/http/httpheader/each_capitalized_name_spec.rb b/spec/ruby/library/net/http/httpheader/each_capitalized_name_spec.rb deleted file mode 100644 index 1af2c6939c..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_capitalized_name_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#each_capitalized_name" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - @headers["My-Header"] = "test" - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - end - - describe "when passed a block" do - it "yields each header key to the passed block (keys capitalized)" do - res = [] - @headers.each_capitalized_name do |key| - res << key - end - res.sort.should == ["My-Header", "My-Other-Header"] - end - end - - describe "when passed no block" do - it "returns an Enumerator" do - enumerator = @headers.each_capitalized_name - enumerator.should be_an_instance_of(Enumerator) - - res = [] - enumerator.each do |key| - res << key - end - res.sort.should == ["My-Header", "My-Other-Header"] - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/each_capitalized_spec.rb b/spec/ruby/library/net/http/httpheader/each_capitalized_spec.rb deleted file mode 100644 index 961a2d051f..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_capitalized_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_capitalized' - -describe "Net::HTTPHeader#each_capitalized" do - it_behaves_like :net_httpheader_each_capitalized, :each_capitalized -end diff --git a/spec/ruby/library/net/http/httpheader/each_header_spec.rb b/spec/ruby/library/net/http/httpheader/each_header_spec.rb deleted file mode 100644 index 19634a001b..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_header_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_header' - -describe "Net::HTTPHeader#each_header" do - it_behaves_like :net_httpheader_each_header, :each_header -end diff --git a/spec/ruby/library/net/http/httpheader/each_key_spec.rb b/spec/ruby/library/net/http/httpheader/each_key_spec.rb deleted file mode 100644 index ebb17d2eac..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_key_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_name' - -describe "Net::HTTPHeader#each_key" do - it_behaves_like :net_httpheader_each_name, :each_key -end diff --git a/spec/ruby/library/net/http/httpheader/each_name_spec.rb b/spec/ruby/library/net/http/httpheader/each_name_spec.rb deleted file mode 100644 index f4533ebcfb..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_name_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_name' - -describe "Net::HTTPHeader#each_name" do - it_behaves_like :net_httpheader_each_name, :each_name -end diff --git a/spec/ruby/library/net/http/httpheader/each_spec.rb b/spec/ruby/library/net/http/httpheader/each_spec.rb deleted file mode 100644 index 7ba8434f75..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/each_header' - -describe "Net::HTTPHeader#each" do - it_behaves_like :net_httpheader_each_header, :each -end diff --git a/spec/ruby/library/net/http/httpheader/each_value_spec.rb b/spec/ruby/library/net/http/httpheader/each_value_spec.rb deleted file mode 100644 index 3224de7703..0000000000 --- a/spec/ruby/library/net/http/httpheader/each_value_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#each_value" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - @headers["My-Header"] = "test" - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - end - - describe "when passed a block" do - it "yields each header entry's joined values" do - res = [] - @headers.each_value do |value| - res << value - end - res.sort.should == ["a, b", "test"] - end - end - - describe "when passed no block" do - it "returns an Enumerator" do - enumerator = @headers.each_value - enumerator.should be_an_instance_of(Enumerator) - - res = [] - enumerator.each do |key| - res << key - end - res.sort.should == ["a, b", "test"] - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/element_reference_spec.rb b/spec/ruby/library/net/http/httpheader/element_reference_spec.rb deleted file mode 100644 index 4a35e20d20..0000000000 --- a/spec/ruby/library/net/http/httpheader/element_reference_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#[] when passed key" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the value of the header entry with the passed key" do - @headers["My-Header"] = "test" - @headers["My-Header"].should == "test" - @headers["My-Other-Header"] = "another test" - @headers["My-Other-Header"].should == "another test" - end - - it "is case-insensitive" do - @headers["My-Header"] = "test" - - @headers['My-Header'].should == "test" - @headers['my-Header'].should == "test" - @headers['My-header'].should == "test" - @headers['my-header'].should == "test" - @headers['MY-HEADER'].should == "test" - end - - it "returns multi-element values joined together" do - @headers["My-Header"] = "test" - @headers.add_field("My-Header", "another test") - @headers.add_field("My-Header", "and one more") - - @headers["My-Header"].should == "test, another test, and one more" - end - - it "returns nil for non-existing entries" do - @headers["My-Header"].should be_nil - @headers["My-Other-Header"].should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpheader/element_set_spec.rb b/spec/ruby/library/net/http/httpheader/element_set_spec.rb deleted file mode 100644 index e9ad64fafc..0000000000 --- a/spec/ruby/library/net/http/httpheader/element_set_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#[]= when passed key, value" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "sets the header entry with the passed key to the passed value" do - @headers["My-Header"] = "test" - @headers["My-Header"].should == "test" - - @headers["My-Header"] = "overwritten" - @headers["My-Header"].should == "overwritten" - - @headers["My-Other-Header"] = "another test" - @headers["My-Other-Header"].should == "another test" - end - - it "is case-insensitive" do - @headers['My-Header'] = "test" - @headers['my-Header'] = "another test" - @headers['My-header'] = "and one more test" - @headers['my-header'] = "and another one" - @headers['MY-HEADER'] = "last one" - - @headers["My-Header"].should == "last one" - @headers.size.should eql(1) - end - - it "removes the header entry with the passed key when the value is false or nil" do - @headers['My-Header'] = "test" - @headers['My-Header'] = nil - @headers['My-Header'].should be_nil - - @headers['My-Header'] = "test" - @headers['My-Header'] = false - @headers['My-Header'].should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpheader/fetch_spec.rb b/spec/ruby/library/net/http/httpheader/fetch_spec.rb deleted file mode 100644 index 4d608cdb0d..0000000000 --- a/spec/ruby/library/net/http/httpheader/fetch_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#fetch" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - describe "when passed key" do - it "returns the header entry for the passed key" do - @headers["My-Header"] = "test" - @headers.fetch("My-Header").should == "test" - - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - @headers.add_field("My-Other-Header", "c") - @headers.fetch("My-Other-Header").should == "a, b, c" - end - - it "is case-insensitive" do - @headers["My-Header"] = "test" - @headers.fetch("my-header").should == "test" - @headers.fetch("MY-HEADER").should == "test" - end - - it "returns nil when there is no entry for the passed key" do - lambda { @headers.fetch("my-header") }.should raise_error(IndexError) - end - end - - describe "when passed key, default" do - it "returns the header entry for the passed key" do - @headers["My-Header"] = "test" - @headers.fetch("My-Header", "bla").should == "test" - - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - @headers.add_field("My-Other-Header", "c") - @headers.fetch("My-Other-Header", "bla").should == "a, b, c" - end - - # TODO: This raises a NoMethodError: undefined method `join' for "bla":String - it "returns the default value when there is no entry for the passed key" do - @headers.fetch("My-Header", "bla").should == "bla" - end - end - - describe "when passed key and block" do - it "returns the header entry for the passed key" do - @headers["My-Header"] = "test" - @headers.fetch("My-Header") {}.should == "test" - - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - @headers.add_field("My-Other-Header", "c") - -> { - @result = @headers.fetch("My-Other-Header", "bla") {} - }.should complain(/block supersedes default value argument/) - @result.should == "a, b, c" - end - - # TODO: This raises a NoMethodError: undefined method `join' for "redaeh-ym":String - it "yieldsand returns the block's return value when there is no entry for the passed key" do - @headers.fetch("My-Header") { |key| key.reverse }.should == "redaeh-ym" - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/form_data_spec.rb b/spec/ruby/library/net/http/httpheader/form_data_spec.rb deleted file mode 100644 index 9b29a03159..0000000000 --- a/spec/ruby/library/net/http/httpheader/form_data_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_form_data' - -describe "Net::HTTPHeader#form_data=" do - it_behaves_like :net_httpheader_set_form_data, :form_data= -end diff --git a/spec/ruby/library/net/http/httpheader/get_fields_spec.rb b/spec/ruby/library/net/http/httpheader/get_fields_spec.rb deleted file mode 100644 index 1b623bf2a3..0000000000 --- a/spec/ruby/library/net/http/httpheader/get_fields_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#get_fields when passed key" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns an Array containing the values of the header entry with the passed key" do - @headers["My-Header"] = "a" - @headers.get_fields("My-Header").should == ["a"] - - @headers.add_field("My-Header", "b") - @headers.get_fields("My-Header").should == ["a", "b"] - end - - it "returns a copy of the header entry values" do - @headers["My-Header"] = "a" - - @headers.get_fields("My-Header").clear - @headers.get_fields("My-Header").should == ["a"] - - @headers.get_fields("My-Header") << "b" - @headers.get_fields("My-Header").should == ["a"] - end - - it "returns nil for non-existing header entries" do - @headers.get_fields("My-Header").should be_nil - @headers.get_fields("My-Other-header").should be_nil - end - - it "is case-insensitive" do - @headers["My-Header"] = "test" - @headers.get_fields("My-Header").should == ["test"] - @headers.get_fields("my-header").should == ["test"] - @headers.get_fields("MY-HEADER").should == ["test"] - end -end diff --git a/spec/ruby/library/net/http/httpheader/initialize_http_header_spec.rb b/spec/ruby/library/net/http/httpheader/initialize_http_header_spec.rb deleted file mode 100644 index 92a0b82d60..0000000000 --- a/spec/ruby/library/net/http/httpheader/initialize_http_header_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#initialize_http_header when passed Hash" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.allocate - end - - it "initializes the HTTP Header using the passed Hash" do - @headers.initialize_http_header("My-Header" => "test", "My-Other-Header" => "another test") - @headers["My-Header"].should == "test" - @headers["My-Other-Header"].should == "another test" - end - - it "complains about duplicate keys when in verbose mode" do - lambda do - $VERBOSE = true - @headers.initialize_http_header("My-Header" => "test", "my-header" => "another test") - end.should complain(/duplicated HTTP header/) - end -end diff --git a/spec/ruby/library/net/http/httpheader/key_spec.rb b/spec/ruby/library/net/http/httpheader/key_spec.rb deleted file mode 100644 index 9099024229..0000000000 --- a/spec/ruby/library/net/http/httpheader/key_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#key? when passed key" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns true if the header entry with the passed key exists" do - @headers.key?("My-Header").should be_false - @headers["My-Header"] = "test" - @headers.key?("My-Header").should be_true - end - - it "is case-insensitive" do - @headers["My-Header"] = "test" - @headers.key?("my-header").should be_true - @headers.key?("MY-HEADER").should be_true - end -end diff --git a/spec/ruby/library/net/http/httpheader/length_spec.rb b/spec/ruby/library/net/http/httpheader/length_spec.rb deleted file mode 100644 index 0d1da149f4..0000000000 --- a/spec/ruby/library/net/http/httpheader/length_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/size' - -describe "Net::HTTPHeader#length" do - it_behaves_like :net_httpheader_size, :length -end diff --git a/spec/ruby/library/net/http/httpheader/main_type_spec.rb b/spec/ruby/library/net/http/httpheader/main_type_spec.rb deleted file mode 100644 index 3e18de6b5b..0000000000 --- a/spec/ruby/library/net/http/httpheader/main_type_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#main_type" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the 'main-content-type', as per 'Content-Type' header entry" do - @headers["Content-Type"] = "text/html" - @headers.main_type.should == "text" - - @headers["Content-Type"] = "application/pdf" - @headers.main_type.should == "application" - - @headers["Content-Type"] = "text/html;charset=utf-8" - @headers.main_type.should == "text" - end - - it "returns nil if the 'Content-Type' header entry does not exist" do - @headers.main_type.should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpheader/proxy_basic_auth_spec.rb b/spec/ruby/library/net/http/httpheader/proxy_basic_auth_spec.rb deleted file mode 100644 index 8b576ee164..0000000000 --- a/spec/ruby/library/net/http/httpheader/proxy_basic_auth_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#proxy_basic_auth when passed account, password" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "sets the 'Proxy-Authorization' Header entry for basic authorization" do - @headers.proxy_basic_auth("rubyspec", "rocks") - @headers["Proxy-Authorization"].should == "Basic cnVieXNwZWM6cm9ja3M=" - end -end diff --git a/spec/ruby/library/net/http/httpheader/range_length_spec.rb b/spec/ruby/library/net/http/httpheader/range_length_spec.rb deleted file mode 100644 index 4415c8e5ba..0000000000 --- a/spec/ruby/library/net/http/httpheader/range_length_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#range_length" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the length of the Range represented by the 'Content-Range' header entry" do - @headers["Content-Range"] = "bytes 0-499/1234" - @headers.range_length.should eql(500) - - @headers["Content-Range"] = "bytes 500-1233/1234" - @headers.range_length.should eql(734) - end - - it "returns nil when there is no 'Content-Range' header entry" do - @headers.range_length.should be_nil - end - - it "raises a Net::HTTPHeaderSyntaxError when the 'Content-Range' has an invalid format" do - @headers["Content-Range"] = "invalid" - lambda { @headers.range_length }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Content-Range"] = "bytes 123-abc" - lambda { @headers.range_length }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Content-Range"] = "bytes abc-123" - lambda { @headers.range_length }.should raise_error(Net::HTTPHeaderSyntaxError) - end -end diff --git a/spec/ruby/library/net/http/httpheader/range_spec.rb b/spec/ruby/library/net/http/httpheader/range_spec.rb deleted file mode 100644 index 5f06e03a1c..0000000000 --- a/spec/ruby/library/net/http/httpheader/range_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_range' - -describe "Net::HTTPHeader#range" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns a Range object that represents the 'Range' header entry" do - @headers["Range"] = "bytes=0-499" - @headers.range.should == [0..499] - - @headers["Range"] = "bytes=500-1233" - @headers.range.should == [500..1233] - - @headers["Range"] = "bytes=10-" - @headers.range.should == [10..-1] - - @headers["Range"] = "bytes=-10" - @headers.range.should == [-10..-1] - end - - it "returns nil when there is no 'Range' header entry" do - @headers.range.should be_nil - end - - it "raises a Net::HTTPHeaderSyntaxError when the 'Range' has an invalid format" do - @headers["Range"] = "invalid" - lambda { @headers.range }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Range"] = "bytes 123-abc" - lambda { @headers.range }.should raise_error(Net::HTTPHeaderSyntaxError) - - @headers["Range"] = "bytes abc-123" - lambda { @headers.range }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "raises a Net::HTTPHeaderSyntaxError when the 'Range' was not specified" do - @headers["Range"] = "bytes=-" - lambda { @headers.range }.should raise_error(Net::HTTPHeaderSyntaxError) - end -end - -describe "Net::HTTPHeader#range=" do - it_behaves_like :net_httpheader_set_range, :range= -end diff --git a/spec/ruby/library/net/http/httpheader/set_content_type_spec.rb b/spec/ruby/library/net/http/httpheader/set_content_type_spec.rb deleted file mode 100644 index 125f7a7e0d..0000000000 --- a/spec/ruby/library/net/http/httpheader/set_content_type_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_content_type' - -describe "Net::HTTPHeader#set_content_type" do - it_behaves_like :net_httpheader_set_content_type, :set_content_type -end diff --git a/spec/ruby/library/net/http/httpheader/set_form_data_spec.rb b/spec/ruby/library/net/http/httpheader/set_form_data_spec.rb deleted file mode 100644 index 14c66ae01c..0000000000 --- a/spec/ruby/library/net/http/httpheader/set_form_data_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_form_data' - -describe "Net::HTTPHeader#set_form_data" do - it_behaves_like :net_httpheader_set_form_data, :set_form_data -end diff --git a/spec/ruby/library/net/http/httpheader/set_range_spec.rb b/spec/ruby/library/net/http/httpheader/set_range_spec.rb deleted file mode 100644 index 85b9c50422..0000000000 --- a/spec/ruby/library/net/http/httpheader/set_range_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/set_range' - -describe "Net::HTTPHeader#set_range" do - it_behaves_like :net_httpheader_set_range, :set_range -end diff --git a/spec/ruby/library/net/http/httpheader/shared/each_capitalized.rb b/spec/ruby/library/net/http/httpheader/shared/each_capitalized.rb deleted file mode 100644 index 3bac409876..0000000000 --- a/spec/ruby/library/net/http/httpheader/shared/each_capitalized.rb +++ /dev/null @@ -1,31 +0,0 @@ -describe :net_httpheader_each_capitalized, shared: true do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - @headers["my-header"] = "test" - @headers.add_field("my-Other-Header", "a") - @headers.add_field("My-Other-header", "b") - end - - describe "when passed a block" do - it "yields each header entry to the passed block (capitalized keys, values joined)" do - res = [] - @headers.send(@method) do |key, value| - res << [key, value] - end - res.sort.should == [["My-Header", "test"], ["My-Other-Header", "a, b"]] - end - end - - describe "when passed no block" do - it "returns an Enumerator" do - enumerator = @headers.send(@method) - enumerator.should be_an_instance_of(Enumerator) - - res = [] - enumerator.each do |*key| - res << key - end - res.sort.should == [["My-Header", "test"], ["My-Other-Header", "a, b"]] - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/shared/each_header.rb b/spec/ruby/library/net/http/httpheader/shared/each_header.rb deleted file mode 100644 index 6bf3a6ddfe..0000000000 --- a/spec/ruby/library/net/http/httpheader/shared/each_header.rb +++ /dev/null @@ -1,31 +0,0 @@ -describe :net_httpheader_each_header, shared: true do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - @headers["My-Header"] = "test" - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - end - - describe "when passed a block" do - it "yields each header entry to the passed block (keys in lower case, values joined)" do - res = [] - @headers.send(@method) do |key, value| - res << [key, value] - end - res.sort.should == [["my-header", "test"], ["my-other-header", "a, b"]] - end - end - - describe "when passed no block" do - it "returns an Enumerator" do - enumerator = @headers.send(@method) - enumerator.should be_an_instance_of(Enumerator) - - res = [] - enumerator.each do |*key| - res << key - end - res.sort.should == [["my-header", "test"], ["my-other-header", "a, b"]] - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/shared/each_name.rb b/spec/ruby/library/net/http/httpheader/shared/each_name.rb deleted file mode 100644 index efc6a09dfd..0000000000 --- a/spec/ruby/library/net/http/httpheader/shared/each_name.rb +++ /dev/null @@ -1,31 +0,0 @@ -describe :net_httpheader_each_name, shared: true do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - @headers["My-Header"] = "test" - @headers.add_field("My-Other-Header", "a") - @headers.add_field("My-Other-Header", "b") - end - - describe "when passed a block" do - it "yields each header key to the passed block (keys in lower case)" do - res = [] - @headers.send(@method) do |key| - res << key - end - res.sort.should == ["my-header", "my-other-header"] - end - end - - describe "when passed no block" do - it "returns an Enumerator" do - enumerator = @headers.send(@method) - enumerator.should be_an_instance_of(Enumerator) - - res = [] - enumerator.each do |key| - res << key - end - res.sort.should == ["my-header", "my-other-header"] - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/shared/set_range.rb b/spec/ruby/library/net/http/httpheader/shared/set_range.rb deleted file mode 100644 index 6a98edbe10..0000000000 --- a/spec/ruby/library/net/http/httpheader/shared/set_range.rb +++ /dev/null @@ -1,89 +0,0 @@ -describe :net_httpheader_set_range, shared: true do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - describe "when passed nil" do - it "returns nil" do - @headers.send(@method, nil).should be_nil - end - - it "deletes the 'Range' header entry" do - @headers["Range"] = "bytes 0-499/1234" - @headers.send(@method, nil) - @headers["Range"].should be_nil - end - end - - describe "when passed Numeric" do - it "sets the 'Range' header entry based on the passed Numeric" do - @headers.send(@method, 10) - @headers["Range"].should == "bytes=0-9" - - @headers.send(@method, -10) - @headers["Range"].should == "bytes=-10" - - @headers.send(@method, 10.9) - @headers["Range"].should == "bytes=0-9" - end - end - - describe "when passed Range" do - it "sets the 'Range' header entry based on the passed Range" do - @headers.send(@method, 10..200) - @headers["Range"].should == "bytes=10-200" - - @headers.send(@method, 1..5) - @headers["Range"].should == "bytes=1-5" - - @headers.send(@method, 1...5) - @headers["Range"].should == "bytes=1-4" - - @headers.send(@method, 234..567) - @headers["Range"].should == "bytes=234-567" - - @headers.send(@method, -5..-1) - @headers["Range"].should == "bytes=-5" - - @headers.send(@method, 1..-1) - @headers["Range"].should == "bytes=1-" - end - - it "raises a Net::HTTPHeaderSyntaxError when the first Range element is negative" do - lambda { @headers.send(@method, -10..5) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "raises a Net::HTTPHeaderSyntaxError when the last Range element is negative" do - lambda { @headers.send(@method, 10..-5) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "raises a Net::HTTPHeaderSyntaxError when the last Range element is smaller than the first" do - lambda { @headers.send(@method, 10..5) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - end - - describe "when passed start, end" do - it "sets the 'Range' header entry based on the passed start and length values" do - @headers.send(@method, 10, 200) - @headers["Range"].should == "bytes=10-209" - - @headers.send(@method, 1, 5) - @headers["Range"].should == "bytes=1-5" - - @headers.send(@method, 234, 567) - @headers["Range"].should == "bytes=234-800" - end - - it "raises a Net::HTTPHeaderSyntaxError when start is negative" do - lambda { @headers.send(@method, -10, 5) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "raises a Net::HTTPHeaderSyntaxError when start + length is negative" do - lambda { @headers.send(@method, 10, -15) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - - it "raises a Net::HTTPHeaderSyntaxError when length is negative" do - lambda { @headers.send(@method, 10, -4) }.should raise_error(Net::HTTPHeaderSyntaxError) - end - end -end diff --git a/spec/ruby/library/net/http/httpheader/shared/size.rb b/spec/ruby/library/net/http/httpheader/shared/size.rb deleted file mode 100644 index e2b1e4c22b..0000000000 --- a/spec/ruby/library/net/http/httpheader/shared/size.rb +++ /dev/null @@ -1,18 +0,0 @@ -describe :net_httpheader_size, shared: true do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the number of header entries in self" do - @headers.send(@method).should eql(0) - - @headers["a"] = "b" - @headers.send(@method).should eql(1) - - @headers["b"] = "b" - @headers.send(@method).should eql(2) - - @headers["c"] = "c" - @headers.send(@method).should eql(3) - end -end diff --git a/spec/ruby/library/net/http/httpheader/size_spec.rb b/spec/ruby/library/net/http/httpheader/size_spec.rb deleted file mode 100644 index a7d78f96e0..0000000000 --- a/spec/ruby/library/net/http/httpheader/size_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' -require_relative 'shared/size' - -describe "Net::HTTPHeader#size" do - it_behaves_like :net_httpheader_size, :size -end diff --git a/spec/ruby/library/net/http/httpheader/sub_type_spec.rb b/spec/ruby/library/net/http/httpheader/sub_type_spec.rb deleted file mode 100644 index 3c73ca0027..0000000000 --- a/spec/ruby/library/net/http/httpheader/sub_type_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#sub_type" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns the 'sub-content-type', as per 'Content-Type' header entry" do - @headers["Content-Type"] = "text/html" - @headers.sub_type.should == "html" - - @headers["Content-Type"] = "application/pdf" - @headers.sub_type.should == "pdf" - - @headers["Content-Type"] = "text/html;charset=utf-8" - @headers.sub_type.should == "html" - end - - it "returns nil if no 'sub-content-type' is set" do - @headers["Content-Type"] = "text" - @headers.sub_type.should be_nil - - @headers["Content-Type"] = "text;charset=utf-8" - @headers.sub_type.should be_nil - end - - it "returns nil if the 'Content-Type' header entry does not exist" do - @headers.sub_type.should be_nil - end -end diff --git a/spec/ruby/library/net/http/httpheader/to_hash_spec.rb b/spec/ruby/library/net/http/httpheader/to_hash_spec.rb deleted file mode 100644 index 8c1d36c30a..0000000000 --- a/spec/ruby/library/net/http/httpheader/to_hash_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#to_hash" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns a Hash representing all Header entries (keys in lower case, values as arrays)" do - @headers.to_hash.should == {} - - @headers["My-Header"] = "test" - @headers.to_hash.should == { "my-header" => ["test"] } - - @headers.add_field("My-Header", "another test") - @headers.to_hash.should == { "my-header" => ["test", "another test"] } - end - - it "does not allow modifying the headers from the returned hash" do - @headers.to_hash["my-header"] = ["test"] - @headers.to_hash.should == {} - @headers.key?("my-header").should be_false - end -end diff --git a/spec/ruby/library/net/http/httpheader/type_params_spec.rb b/spec/ruby/library/net/http/httpheader/type_params_spec.rb deleted file mode 100644 index e77be7ea85..0000000000 --- a/spec/ruby/library/net/http/httpheader/type_params_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'fixtures/classes' - -describe "Net::HTTPHeader#type_params" do - before :each do - @headers = NetHTTPHeaderSpecs::Example.new - end - - it "returns additional 'Content-Type' information as a Hash" do - @headers["Content-Type"] = "text/html;charset=utf-8" - @headers.type_params.should == {"charset" => "utf-8"} - - @headers["Content-Type"] = "text/html; charset=utf-8; rubyspec=rocks" - @headers.type_params.should == {"charset" => "utf-8", "rubyspec" => "rocks"} - end - - it "returns an empty Hash when no additional 'Content-Type' information is set" do - @headers.type_params.should == {} - - @headers["Content-Type"] = "text/html" - @headers.type_params.should == {} - end -end diff --git a/spec/ruby/library/net/http/httprequest/initialize_spec.rb b/spec/ruby/library/net/http/httprequest/initialize_spec.rb deleted file mode 100644 index 88e9fb1c77..0000000000 --- a/spec/ruby/library/net/http/httprequest/initialize_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -module NetHTTPRequestSpecs - class TestRequest < Net::HTTPRequest - METHOD = "TEST" - REQUEST_HAS_BODY = false - RESPONSE_HAS_BODY = true - end -end - -describe "Net::HTTPRequest#initialize" do - before :each do - @req = NetHTTPRequestSpecs::TestRequest.allocate - end - - it "uses the METHOD constants to set the request method" do - @req.send(:initialize, "/some/path") - @req.method.should == "TEST" - end - - it "uses the REQUEST_HAS_BODY to set whether the Request has a body or not" do - @req.send(:initialize, "/some/path") - @req.request_body_permitted?.should be_false - end - - it "uses the RESPONSE_HAS_BODY to set whether the Response can have a body or not" do - @req.send(:initialize, "/some/path") - @req.response_body_permitted?.should be_true - end - - describe "when passed path" do - it "sets self's path to the passed path" do - @req.send(:initialize, "/some/path") - @req.path.should == "/some/path" - end - end - - describe "when passed path, headers" do - it "uses the passed headers Hash to initialize self's header entries" do - @req.send(:initialize, "/some/path", "Content-Type" => "text/html") - @req["Content-Type"].should == "text/html" - end - end -end diff --git a/spec/ruby/library/net/http/httpresponse/body_permitted_spec.rb b/spec/ruby/library/net/http/httpresponse/body_permitted_spec.rb deleted file mode 100644 index 68a0454f79..0000000000 --- a/spec/ruby/library/net/http/httpresponse/body_permitted_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse.body_permitted?" do - it "returns true if this response type can have a response body" do - Net::HTTPUnknownResponse.body_permitted?.should == true - Net::HTTPInformation.body_permitted?.should == false - Net::HTTPSuccess.body_permitted?.should == true - Net::HTTPRedirection.body_permitted?.should == true - Net::HTTPClientError.body_permitted?.should == true - Net::HTTPServerError.body_permitted?.should == true - end -end diff --git a/spec/ruby/library/net/http/httpresponse/body_spec.rb b/spec/ruby/library/net/http/httpresponse/body_spec.rb deleted file mode 100644 index 79569441f1..0000000000 --- a/spec/ruby/library/net/http/httpresponse/body_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/body' - -describe "Net::HTTPResponse#body" do - it_behaves_like :net_httpresponse_body, :body -end diff --git a/spec/ruby/library/net/http/httpresponse/code_spec.rb b/spec/ruby/library/net/http/httpresponse/code_spec.rb deleted file mode 100644 index 114277cb43..0000000000 --- a/spec/ruby/library/net/http/httpresponse/code_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#code" do - it "returns the result code string" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.code.should == "???" - - res = Net::HTTPInformation.new("1.0", "1xx", "test response") - res.code.should == "1xx" - - res = Net::HTTPSuccess.new("1.0", "2xx", "test response") - res.code.should == "2xx" - - res = Net::HTTPRedirection.new("1.0", "3xx", "test response") - res.code.should == "3xx" - - res = Net::HTTPClientError.new("1.0", "4xx", "test response") - res.code.should == "4xx" - - res = Net::HTTPServerError.new("1.0", "5xx", "test response") - res.code.should == "5xx" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/code_type_spec.rb b/spec/ruby/library/net/http/httpresponse/code_type_spec.rb deleted file mode 100644 index fa2d572e9a..0000000000 --- a/spec/ruby/library/net/http/httpresponse/code_type_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#code_type" do - it "returns self's class" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.code_type.should == Net::HTTPUnknownResponse - - res = Net::HTTPInformation.new("1.0", "1xx", "test response") - res.code_type.should == Net::HTTPInformation - - res = Net::HTTPSuccess.new("1.0", "2xx", "test response") - res.code_type.should == Net::HTTPSuccess - - res = Net::HTTPRedirection.new("1.0", "3xx", "test response") - res.code_type.should == Net::HTTPRedirection - - res = Net::HTTPClientError.new("1.0", "4xx", "test response") - res.code_type.should == Net::HTTPClientError - - res = Net::HTTPServerError.new("1.0", "5xx", "test response") - res.code_type.should == Net::HTTPServerError - end -end diff --git a/spec/ruby/library/net/http/httpresponse/entity_spec.rb b/spec/ruby/library/net/http/httpresponse/entity_spec.rb deleted file mode 100644 index f1639042c1..0000000000 --- a/spec/ruby/library/net/http/httpresponse/entity_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require_relative 'shared/body' - -describe "Net::HTTPResponse#entity" do - it_behaves_like :net_httpresponse_body, :entity -end diff --git a/spec/ruby/library/net/http/httpresponse/error_spec.rb b/spec/ruby/library/net/http/httpresponse/error_spec.rb deleted file mode 100644 index a3a3cee162..0000000000 --- a/spec/ruby/library/net/http/httpresponse/error_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#error!" do - it "raises self's class 'EXCEPTION_TYPE' Exception" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - lambda { res.error! }.should raise_error(Net::HTTPError) - - res = Net::HTTPInformation.new("1.0", "1xx", "test response") - lambda { res.error! }.should raise_error(Net::HTTPError) - - res = Net::HTTPSuccess.new("1.0", "2xx", "test response") - lambda { res.error! }.should raise_error(Net::HTTPError) - - res = Net::HTTPRedirection.new("1.0", "3xx", "test response") - lambda { res.error! }.should raise_error(Net::HTTPRetriableError) - - res = Net::HTTPClientError.new("1.0", "4xx", "test response") - ruby_version_is ""..."2.6" do - lambda { res.error! }.should raise_error(Net::HTTPServerException) - end - ruby_version_is "2.6" do - lambda { res.error! }.should raise_error(Net::HTTPClientException) - end - - res = Net::HTTPServerError.new("1.0", "5xx", "test response") - lambda { res.error! }.should raise_error(Net::HTTPFatalError) - end -end diff --git a/spec/ruby/library/net/http/httpresponse/error_type_spec.rb b/spec/ruby/library/net/http/httpresponse/error_type_spec.rb deleted file mode 100644 index 6705f8b1aa..0000000000 --- a/spec/ruby/library/net/http/httpresponse/error_type_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#error_type" do - it "returns self's class 'EXCEPTION_TYPE' constant" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.error_type.should == Net::HTTPError - - res = Net::HTTPInformation.new("1.0", "1xx", "test response") - res.error_type.should == Net::HTTPError - - res = Net::HTTPSuccess.new("1.0", "2xx", "test response") - res.error_type.should == Net::HTTPError - - res = Net::HTTPRedirection.new("1.0", "3xx", "test response") - res.error_type.should == Net::HTTPRetriableError - - res = Net::HTTPClientError.new("1.0", "4xx", "test response") - ruby_version_is ""..."2.6" do - res.error_type.should == Net::HTTPServerException - end - ruby_version_is "2.6" do - res.error_type.should == Net::HTTPClientException - end - - res = Net::HTTPServerError.new("1.0", "5xx", "test response") - res.error_type.should == Net::HTTPFatalError - end -end diff --git a/spec/ruby/library/net/http/httpresponse/exception_type_spec.rb b/spec/ruby/library/net/http/httpresponse/exception_type_spec.rb deleted file mode 100644 index c0812cd322..0000000000 --- a/spec/ruby/library/net/http/httpresponse/exception_type_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse.exception_type" do - it "returns self's 'EXCEPTION_TYPE' constant" do - Net::HTTPUnknownResponse.exception_type.should == Net::HTTPError - Net::HTTPInformation.exception_type.should == Net::HTTPError - Net::HTTPSuccess.exception_type.should == Net::HTTPError - Net::HTTPRedirection.exception_type.should == Net::HTTPRetriableError - ruby_version_is ""..."2.6" do - Net::HTTPClientError.exception_type.should == Net::HTTPServerException - end - ruby_version_is "2.6" do - Net::HTTPClientError.exception_type.should == Net::HTTPClientException - end - Net::HTTPServerError.exception_type.should == Net::HTTPFatalError - end -end diff --git a/spec/ruby/library/net/http/httpresponse/header_spec.rb b/spec/ruby/library/net/http/httpresponse/header_spec.rb deleted file mode 100644 index a9615feda8..0000000000 --- a/spec/ruby/library/net/http/httpresponse/header_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#header" do - it "returns self" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.response.should equal(res) - end -end diff --git a/spec/ruby/library/net/http/httpresponse/http_version_spec.rb b/spec/ruby/library/net/http/httpresponse/http_version_spec.rb deleted file mode 100644 index db85696d77..0000000000 --- a/spec/ruby/library/net/http/httpresponse/http_version_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#http_version" do - it "returns self's http version" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.http_version.should == "1.0" - - res = Net::HTTPUnknownResponse.new("1.1", "???", "test response") - res.http_version.should == "1.1" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/initialize_spec.rb b/spec/ruby/library/net/http/httpresponse/initialize_spec.rb deleted file mode 100644 index eb77e2e277..0000000000 --- a/spec/ruby/library/net/http/httpresponse/initialize_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#initialize when passed http_version, response_code, response_message" do - it "sets self http_version, response_code and response_message to the passed values" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.http_version.should == "1.0" - res.code.should == "???" - res.message.should == "test response" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/inspect_spec.rb b/spec/ruby/library/net/http/httpresponse/inspect_spec.rb deleted file mode 100644 index 1e1a2c7cc7..0000000000 --- a/spec/ruby/library/net/http/httpresponse/inspect_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" - -describe "Net::HTTPResponse#inspect" do - it "returns a String representation of self" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=false>" - - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - socket = Net::BufferedIO.new(StringIO.new("test body")) - res.reading_body(socket, true) {} - res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=true>" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/message_spec.rb b/spec/ruby/library/net/http/httpresponse/message_spec.rb deleted file mode 100644 index ae8e3678a1..0000000000 --- a/spec/ruby/library/net/http/httpresponse/message_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#message" do - it "returns self's response message" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.message.should == "test response" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/msg_spec.rb b/spec/ruby/library/net/http/httpresponse/msg_spec.rb deleted file mode 100644 index 0e5e7eb4aa..0000000000 --- a/spec/ruby/library/net/http/httpresponse/msg_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#msg" do - it "returns self's response message" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.message.should == "test response" - end -end diff --git a/spec/ruby/library/net/http/httpresponse/read_body_spec.rb b/spec/ruby/library/net/http/httpresponse/read_body_spec.rb deleted file mode 100644 index 500155eb5b..0000000000 --- a/spec/ruby/library/net/http/httpresponse/read_body_spec.rb +++ /dev/null @@ -1,85 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#read_body" do - before :each do - @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - @socket = Net::BufferedIO.new(StringIO.new("test body")) - end - - describe "when passed no arguments" do - it "returns the read body" do - @res.reading_body(@socket, true) do - @res.read_body.should == "test body" - end - end - - it "returns the previously read body if called a second time" do - @res.reading_body(@socket, true) do - @res.read_body.should equal(@res.read_body) - end - end - end - - describe "when passed a buffer" do - it "reads the body to the passed buffer" do - @res.reading_body(@socket, true) do - buffer = "" - @res.read_body(buffer) - buffer.should == "test body" - end - end - - it "returns the passed buffer" do - @res.reading_body(@socket, true) do - buffer = "" - @res.read_body(buffer).should equal(buffer) - end - end - - it "raises an IOError if called a second time" do - @res.reading_body(@socket, true) do - @res.read_body("") - lambda { @res.read_body("") }.should raise_error(IOError) - end - end - end - - describe "when passed a block" do - it "reads the body and yields it to the passed block (in chunks)" do - @res.reading_body(@socket, true) do - yielded = false - - buffer = "" - @res.read_body do |body| - yielded = true - buffer << body - end - - yielded.should be_true - buffer.should == "test body" - end - end - - it "returns the ReadAdapter" do - @res.reading_body(@socket, true) do - @res.read_body { nil }.should be_kind_of(Net::ReadAdapter) - end - end - - it "raises an IOError if called a second time" do - @res.reading_body(@socket, true) do - @res.read_body {} - lambda { @res.read_body {} }.should raise_error(IOError) - end - end - end - - describe "when passed buffer and block" do - it "rauses an ArgumentError" do - @res.reading_body(@socket, true) do - lambda { @res.read_body("") {} }.should raise_error(ArgumentError) - end - end - end -end diff --git a/spec/ruby/library/net/http/httpresponse/read_header_spec.rb b/spec/ruby/library/net/http/httpresponse/read_header_spec.rb deleted file mode 100644 index 6af8c6bd6a..0000000000 --- a/spec/ruby/library/net/http/httpresponse/read_header_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#read_header" do - it "returns self" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.response.should equal(res) - end -end diff --git a/spec/ruby/library/net/http/httpresponse/read_new_spec.rb b/spec/ruby/library/net/http/httpresponse/read_new_spec.rb deleted file mode 100644 index 73c7ddc100..0000000000 --- a/spec/ruby/library/net/http/httpresponse/read_new_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse.read_new" do - it "creates a HTTPResponse object based on the response read from the passed socket" do - socket = Net::BufferedIO.new(StringIO.new(<<EOS)) -HTTP/1.1 200 OK -Content-Type: text/html; charset=utf-8 - -test-body -EOS - response = Net::HTTPResponse.read_new(socket) - - response.should be_kind_of(Net::HTTPOK) - response.code.should == "200" - response["Content-Type"].should == "text/html; charset=utf-8" - - response.reading_body(socket, true) do - response.body.should == "test-body\n" - end - end -end diff --git a/spec/ruby/library/net/http/httpresponse/reading_body_spec.rb b/spec/ruby/library/net/http/httpresponse/reading_body_spec.rb deleted file mode 100644 index ebdab891e1..0000000000 --- a/spec/ruby/library/net/http/httpresponse/reading_body_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' -require "stringio" - -describe "Net::HTTPResponse#reading_body" do - before :each do - @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - @socket = Net::BufferedIO.new(StringIO.new("test body")) - end - - describe "when body_allowed is true" do - it "reads and returns the response body for self from the passed socket" do - @res.reading_body(@socket, true) {}.should == "test body" - @res.body.should == "test body" - end - - it "yields the passed block before reading the body" do - yielded = false - - @res.reading_body(@socket, true) do - @res.inspect.should == "#<Net::HTTPUnknownResponse ??? test response readbody=false>" - yielded = true - end - - yielded.should be_true - end - - describe "but the response type is not allowed to have a body" do - before :each do - @res = Net::HTTPInformation.new("1.0", "???", "test response") - end - - it "returns nil" do - @res.reading_body(@socket, false) {}.should be_nil - @res.body.should be_nil - end - - it "yields the passed block" do - yielded = false - @res.reading_body(@socket, true) { yielded = true } - yielded.should be_true - end - end - end - - describe "when body_allowed is false" do - it "returns nil" do - @res.reading_body(@socket, false) {}.should be_nil - @res.body.should be_nil - end - - it "yields the passed block" do - yielded = false - @res.reading_body(@socket, true) { yielded = true } - yielded.should be_true - end - end -end diff --git a/spec/ruby/library/net/http/httpresponse/response_spec.rb b/spec/ruby/library/net/http/httpresponse/response_spec.rb deleted file mode 100644 index f6035f3695..0000000000 --- a/spec/ruby/library/net/http/httpresponse/response_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#response" do - it "returns self" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - res.response.should equal(res) - end -end diff --git a/spec/ruby/library/net/http/httpresponse/shared/body.rb b/spec/ruby/library/net/http/httpresponse/shared/body.rb deleted file mode 100644 index 91d5fe6375..0000000000 --- a/spec/ruby/library/net/http/httpresponse/shared/body.rb +++ /dev/null @@ -1,18 +0,0 @@ -describe :net_httpresponse_body, shared: true do - before :each do - @res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - @socket = Net::BufferedIO.new(StringIO.new("test body")) - end - - it "returns the read body" do - @res.reading_body(@socket, true) do - @res.send(@method).should == "test body" - end - end - - it "returns the previously read body if called a second time" do - @res.reading_body(@socket, true) do - @res.send(@method).should equal(@res.send(@method)) - end - end -end diff --git a/spec/ruby/library/net/http/httpresponse/value_spec.rb b/spec/ruby/library/net/http/httpresponse/value_spec.rb deleted file mode 100644 index 1b19d1d6f7..0000000000 --- a/spec/ruby/library/net/http/httpresponse/value_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../../spec_helper' -require 'net/http' - -describe "Net::HTTPResponse#value" do - it "raises an HTTP error for non 2xx HTTP Responses" do - res = Net::HTTPUnknownResponse.new("1.0", "???", "test response") - lambda { res.value }.should raise_error(Net::HTTPError) - - res = Net::HTTPInformation.new("1.0", "1xx", "test response") - lambda { res.value }.should raise_error(Net::HTTPError) - - res = Net::HTTPSuccess.new("1.0", "2xx", "test response") - lambda { res.value }.should_not raise_error(Net::HTTPError) - - res = Net::HTTPRedirection.new("1.0", "3xx", "test response") - lambda { res.value }.should raise_error(Net::HTTPRetriableError) - - res = Net::HTTPClientError.new("1.0", "4xx", "test response") - ruby_version_is ""..."2.6" do - lambda { res.value }.should raise_error(Net::HTTPServerException) - end - ruby_version_is "2.6" do - lambda { res.value }.should raise_error(Net::HTTPClientException) - end - - res = Net::HTTPServerError.new("1.0", "5xx", "test response") - lambda { res.value }.should raise_error(Net::HTTPFatalError) - end -end diff --git a/spec/ruby/library/objectspace/dump_all_spec.rb b/spec/ruby/library/objectspace/dump_all_spec.rb new file mode 100644 index 0000000000..c92812ebd5 --- /dev/null +++ b/spec/ruby/library/objectspace/dump_all_spec.rb @@ -0,0 +1,112 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.dump_all" do + it "dumps Ruby heap to string when passed output: :string" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace") + string = "abc" + dump = ObjectSpace.dump_all(output: :string) + puts dump.class + puts dump.include?('"value":"abc"') + RUBY + + stdout.should == "String\ntrue\n" + end + + it "dumps Ruby heap to a temporary file when passed output: :file" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace") + string = "abc" + file = ObjectSpace.dump_all(output: :file) + + begin + file.flush + file.rewind + content = file.read + + puts file.class + puts content.include?('"value":"abc"') + ensure + file.close + File.unlink file.path + end + RUBY + + stdout.should == "File\ntrue\n" + end + + it "dumps Ruby heap to a temporary file when :output not specified" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace") + string = "abc" + file = ObjectSpace.dump_all + + begin + file.flush + file.rewind + content = file.read + + puts file.class + puts content.include?('"value":"abc"') + ensure + file.close + File.unlink file.path + end + RUBY + + stdout.should == "File\ntrue\n" + end + + it "dumps Ruby heap to a temporary file when passed output: :nil" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace") + string = "abc" + file = ObjectSpace.dump_all(output: nil) + + begin + file.flush + file.rewind + content = file.read + + puts file.class + puts content.include?('"value":"abc"') + ensure + file.close + File.unlink file.path + end + RUBY + + stdout.should == "File\ntrue\n" + end + + it "dumps Ruby heap to stdout when passed output: :stdout" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace") + string = "abc" + ObjectSpace.dump_all(output: :stdout) + RUBY + + stdout.should.include?('"value":"abc"') + end + + it "dumps Ruby heap to provided IO when passed output: IO" do + stdout = ruby_exe(<<~RUBY, options: "-robjspace -rtempfile") + string = "abc" + io = Tempfile.create("object_space_dump_all") + + begin + result = ObjectSpace.dump_all(output: io) + io.rewind + content = io.read + + puts result.equal?(io) + puts content.include?('"value":"abc"') + ensure + io.close + File.unlink io.path + end + RUBY + + stdout.should == "true\ntrue\n" + end + + it "raises ArgumentError when passed not supported :output value" do + -> { ObjectSpace.dump_all(output: Object.new) }.should.raise(ArgumentError, /wrong output option/) + end +end diff --git a/spec/ruby/library/objectspace/dump_spec.rb b/spec/ruby/library/objectspace/dump_spec.rb new file mode 100644 index 0000000000..4b5e0da198 --- /dev/null +++ b/spec/ruby/library/objectspace/dump_spec.rb @@ -0,0 +1,70 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.dump" do + it "dumps the content of object as JSON" do + require 'json' + string = ObjectSpace.dump("abc") + dump = JSON.parse(string) + + dump['type'].should == "STRING" + dump['value'].should == "abc" + end + + it "dumps to string when passed output: :string" do + string = ObjectSpace.dump("abc", output: :string) + string.should.is_a?(String) + string.should.include?('"value":"abc"') + end + + it "dumps to string when :output not specified" do + string = ObjectSpace.dump("abc") + string.should.is_a?(String) + string.should.include?('"value":"abc"') + end + + it "dumps to a temporary file when passed output: :file" do + file = ObjectSpace.dump("abc", output: :file) + file.should.is_a?(File) + + file.rewind + content = file.read + content.should.include?('"value":"abc"') + ensure + file.close + File.unlink file.path + end + + it "dumps to a temporary file when passed output: :nil" do + file = ObjectSpace.dump("abc", output: nil) + file.should.is_a?(File) + + file.rewind + file.read.should.include?('"value":"abc"') + ensure + file.close + File.unlink file.path + end + + it "dumps to stdout when passed output: :stdout" do + stdout = ruby_exe('ObjectSpace.dump("abc", output: :stdout)', options: "-robjspace").chomp + stdout.should.include?('"value":"abc"') + end + + it "dumps to provided IO when passed output: IO" do + filename = tmp("io_read.txt") + io = File.open(filename, "w+") + result = ObjectSpace.dump("abc", output: io) + result.should.equal? io + + io.rewind + io.read.should.include?('"value":"abc"') + ensure + io.close + rm_r filename + end + + it "raises ArgumentError when passed not supported :output value" do + -> { ObjectSpace.dump("abc", output: Object.new) }.should.raise(ArgumentError, /wrong output option/) + end +end diff --git a/spec/ruby/library/objectspace/fixtures/trace.rb b/spec/ruby/library/objectspace/fixtures/trace.rb new file mode 100644 index 0000000000..e53a7a0cac --- /dev/null +++ b/spec/ruby/library/objectspace/fixtures/trace.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: false +require "objspace/trace" +a = "foo" +b = "b" + "a" + "r" +c = 42 +p a, b, c diff --git a/spec/ruby/library/objectspace/memsize_of_all_spec.rb b/spec/ruby/library/objectspace/memsize_of_all_spec.rb new file mode 100644 index 0000000000..9fc6e8be9d --- /dev/null +++ b/spec/ruby/library/objectspace/memsize_of_all_spec.rb @@ -0,0 +1,22 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.memsize_of_all" do + it "returns a non-zero Integer for all objects" do + ObjectSpace.memsize_of_all.should.is_a?(Integer) + ObjectSpace.memsize_of_all.should > 0 + end + + it "returns a non-zero Integer for Class" do + ObjectSpace.memsize_of_all(Class).should.is_a?(Integer) + ObjectSpace.memsize_of_all(Class).should > 0 + end + + it "increases when a new object is allocated" do + c = Class.new + before = ObjectSpace.memsize_of_all(c) + o = c.new + after = ObjectSpace.memsize_of_all(c) + after.should > before + end +end diff --git a/spec/ruby/library/objectspace/memsize_of_spec.rb b/spec/ruby/library/objectspace/memsize_of_spec.rb new file mode 100644 index 0000000000..9c8aea4e84 --- /dev/null +++ b/spec/ruby/library/objectspace/memsize_of_spec.rb @@ -0,0 +1,34 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.memsize_of" do + it "returns 0 for true, false and nil" do + ObjectSpace.memsize_of(true).should == 0 + ObjectSpace.memsize_of(false).should == 0 + ObjectSpace.memsize_of(nil).should == 0 + end + + it "returns 0 for small Integers" do + ObjectSpace.memsize_of(42).should == 0 + end + + it "returns 0 for literal Symbols" do + ObjectSpace.memsize_of(:object_space_memsize_spec_static_sym).should == 0 + end + + it "returns a positive Integer for an Object" do + obj = Object.new + ObjectSpace.memsize_of(obj).should.is_a?(Integer) + ObjectSpace.memsize_of(obj).should > 0 + end + + it "is larger if the Object has more instance variables" do + obj = Object.new + before = ObjectSpace.memsize_of(obj) + 100.times do |i| + obj.instance_variable_set(:"@foo#{i}", nil) + end + after = ObjectSpace.memsize_of(obj) + after.should > before + end +end diff --git a/spec/ruby/library/objectspace/reachable_objects_from_spec.rb b/spec/ruby/library/objectspace/reachable_objects_from_spec.rb new file mode 100644 index 0000000000..4620bdec31 --- /dev/null +++ b/spec/ruby/library/objectspace/reachable_objects_from_spec.rb @@ -0,0 +1,59 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.reachable_objects_from" do + it "returns nil for true and false" do + ObjectSpace.reachable_objects_from(true).should == nil + ObjectSpace.reachable_objects_from(false).should == nil + end + + it "returns nil for nil" do + ObjectSpace.reachable_objects_from(nil).should == nil + end + + it "returns nil for small Integers" do + ObjectSpace.reachable_objects_from(42).should == nil + end + + it "enumerates objects directly reachable from a given object" do + ObjectSpace.reachable_objects_from(['a', 'b', 'c']).to_set.should >= Set[Array, 'a', 'b', 'c'] + ObjectSpace.reachable_objects_from(Object.new).should == [Object] + end + + it "finds an object stored in an Array" do + obj = Object.new + ary = [obj] + reachable = ObjectSpace.reachable_objects_from(ary) + reachable.should.include?(obj) + end + + it "finds an object stored in a copy-on-write Array" do + removed = Object.new + obj = Object.new + ary = [removed, obj] + ary.shift + reachable = ObjectSpace.reachable_objects_from(ary) + reachable.should.include?(obj) + reachable.should_not.include?(removed) + end + + it "finds an object stored in a Queue" do + o = Object.new + q = Queue.new + q << o + + reachable = ObjectSpace.reachable_objects_from(q) + reachable = reachable + reachable.flat_map { |r| ObjectSpace.reachable_objects_from(r) } + reachable.should.include?(o) + end + + it "finds an object stored in a SizedQueue" do + o = Object.new + q = SizedQueue.new(3) + q << o + + reachable = ObjectSpace.reachable_objects_from(q) + reachable = reachable + reachable.flat_map { |r| ObjectSpace.reachable_objects_from(r) } + reachable.should.include?(o) + end +end diff --git a/spec/ruby/library/objectspace/trace_object_allocations_spec.rb b/spec/ruby/library/objectspace/trace_object_allocations_spec.rb new file mode 100644 index 0000000000..0bb6efbfa5 --- /dev/null +++ b/spec/ruby/library/objectspace/trace_object_allocations_spec.rb @@ -0,0 +1,163 @@ +require_relative '../../spec_helper' +require 'objspace' + +describe "ObjectSpace.trace_object_allocations" do + def has_class_frame? + Class.new { + attr_reader :c + + def initialize + @c = caller_locations.first.label =~ /new/ + end + }.new.c + end + + def obj_class_path + has_class_frame? ? "Class" : nil + end + + it "runs a block" do + ScratchPad.clear + ObjectSpace.trace_object_allocations do + ScratchPad.record :a + end + ScratchPad.recorded.should == :a + end + + it "records info for allocation_class_path" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + a = [1, 2, 3] + ObjectSpace.allocation_class_path(a).should == nil + end + end + + it "records info for allocation_generation" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_generation(o).should.kind_of?(Integer) + a = [1, 2, 3] + ObjectSpace.allocation_generation(a).should.kind_of?(Integer) + end + end + + it "records info for allocation_method_id" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_method_id(o).should == (has_class_frame? ? :new : nil) + a = [1, 2, 3] + ObjectSpace.allocation_method_id(a).should == nil + end + end + + it "records info for allocation_sourcefile" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_sourcefile(o).should == __FILE__ + a = [1, 2, 3] + ObjectSpace.allocation_sourcefile(a).should == __FILE__ + end + end + + it "records info for allocation_sourceline" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_sourceline(o).should == __LINE__ - 1 + a = [1, 2, 3] + ObjectSpace.allocation_sourceline(a).should == __LINE__ - 1 + end + end + + it "can be cleared using trace_object_allocations_clear" do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + ObjectSpace.trace_object_allocations_clear + ObjectSpace.allocation_class_path(o).should == nil + end + end + + it "does not clears allocation data after returning" do + o = nil + ObjectSpace.trace_object_allocations do + o = Object.new + end + ObjectSpace.allocation_class_path(o).should == obj_class_path + end + + it "can be used without a block using trace_object_allocations_start and _stop" do + ObjectSpace.trace_object_allocations_start + begin + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + a = [1, 2, 3] + ObjectSpace.allocation_class_path(a).should == nil + ensure + ObjectSpace.trace_object_allocations_stop + end + end + + it "does not clears allocation data after trace_object_allocations_stop" do + ObjectSpace.trace_object_allocations_start + begin + o = Object.new + ensure + ObjectSpace.trace_object_allocations_stop + end + ObjectSpace.allocation_class_path(o).should == obj_class_path + end + + it "can be nested" do + ObjectSpace.trace_object_allocations do + ObjectSpace.trace_object_allocations do + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + end + end + end + + it "can be nested without a block using trace_object_allocations_start and _stop" do + ObjectSpace.trace_object_allocations_start + begin + ObjectSpace.trace_object_allocations_start + begin + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + ensure + ObjectSpace.trace_object_allocations_stop + end + ensure + ObjectSpace.trace_object_allocations_stop + end + end + + it "can be nested with more _stop than _start" do + ObjectSpace.trace_object_allocations_start + begin + o = Object.new + ObjectSpace.allocation_class_path(o).should == obj_class_path + ObjectSpace.trace_object_allocations_stop + ensure + ObjectSpace.trace_object_allocations_stop + end + end + + it "returns nil for class_path, generation, method_id, sourcefile, and sourceline for immutable objects" do + ObjectSpace.trace_object_allocations_start + begin + one = nil + two = 42 + three = :foo + [one, two, three].each do |i| + ObjectSpace.allocation_class_path(i).should == nil + ObjectSpace.allocation_generation(i).should == nil + ObjectSpace.allocation_method_id(i).should == nil + ObjectSpace.allocation_sourcefile(i).should == nil + ObjectSpace.allocation_sourceline(i).should == nil + end + ensure + ObjectSpace.trace_object_allocations_stop + end + end +end diff --git a/spec/ruby/library/objectspace/trace_spec.rb b/spec/ruby/library/objectspace/trace_spec.rb new file mode 100644 index 0000000000..3957dc930d --- /dev/null +++ b/spec/ruby/library/objectspace/trace_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../spec_helper' + +describe 'require "objspace/trace"' do + it "shows object allocation sites" do + file = fixture(__FILE__ , "trace.rb") + ruby_exe(file, args: "2>&1").lines(chomp: true).should == [ + "objspace/trace is enabled", + "\"foo\" @ #{file}:3", + "\"bar\" @ #{file}:4", + "42" + ] + end +end diff --git a/spec/ruby/library/observer/notify_observers_spec.rb b/spec/ruby/library/observer/notify_observers_spec.rb index 86422fc4a0..6f3f984637 100644 --- a/spec/ruby/library/observer/notify_observers_spec.rb +++ b/spec/ruby/library/observer/notify_observers_spec.rb @@ -16,9 +16,9 @@ describe "Observer#notify_observers" do end it "verifies observer responds to update" do - lambda { + -> { @observable.add_observer(@observable) - }.should raise_error(NoMethodError) + }.should.raise(NoMethodError) end it "receives the callback" do diff --git a/spec/ruby/library/open3/popen3_spec.rb b/spec/ruby/library/open3/popen3_spec.rb index 9afb5f5382..3651bd516c 100644 --- a/spec/ruby/library/open3/popen3_spec.rb +++ b/spec/ruby/library/open3/popen3_spec.rb @@ -5,10 +5,10 @@ describe "Open3.popen3" do it "returns in, out, err and a thread waiting the process" do stdin, out, err, waiter = Open3.popen3(ruby_cmd("print :foo")) begin - stdin.should be_kind_of IO - out.should be_kind_of IO - err.should be_kind_of IO - waiter.should be_kind_of Thread + stdin.should.is_a? IO + out.should.is_a? IO + err.should.is_a? IO + waiter.should.is_a? Thread out.read.should == "foo" ensure @@ -38,6 +38,4 @@ describe "Open3.popen3" do out.read.should == "foo" end end - - it "needs to be reviewed for spec completeness" end diff --git a/spec/ruby/library/openssl/cipher_spec.rb b/spec/ruby/library/openssl/cipher_spec.rb index f66f25f9c6..91da1c592c 100644 --- a/spec/ruby/library/openssl/cipher_spec.rb +++ b/spec/ruby/library/openssl/cipher_spec.rb @@ -4,6 +4,6 @@ require 'openssl' describe "OpenSSL::Cipher's CipherError" do it "exists under OpenSSL::Cipher namespace" do - OpenSSL::Cipher.should have_constant :CipherError + OpenSSL::Cipher.should.const_defined?(:CipherError, false) end end diff --git a/spec/ruby/library/openssl/config/freeze_spec.rb b/spec/ruby/library/openssl/config/freeze_spec.rb deleted file mode 100644 index 69c96cf85e..0000000000 --- a/spec/ruby/library/openssl/config/freeze_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../../spec_helper' -require_relative '../shared/constants' - -require 'openssl' - -describe "OpenSSL::Config#freeze" do - it "needs to be reviewed for completeness" - - it "freezes" do - c = OpenSSL::Config.new - lambda { - c['foo'] = [ ['key', 'value'] ] - }.should_not raise_error - c.freeze - c.frozen?.should be_true - lambda { - c['foo'] = [ ['key', 'value'] ] - }.should raise_error(TypeError) - end -end diff --git a/spec/ruby/library/openssl/digest/append_spec.rb b/spec/ruby/library/openssl/digest/append_spec.rb new file mode 100644 index 0000000000..08802b7253 --- /dev/null +++ b/spec/ruby/library/openssl/digest/append_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../../spec_helper' +require_relative 'shared/update' + +describe "OpenSSL::Digest#<<" do + it_behaves_like :openssl_digest_update, :<< +end diff --git a/spec/ruby/library/openssl/digest/block_length_spec.rb b/spec/ruby/library/openssl/digest/block_length_spec.rb new file mode 100644 index 0000000000..444ed9d20d --- /dev/null +++ b/spec/ruby/library/openssl/digest/block_length_spec.rb @@ -0,0 +1,44 @@ +require_relative '../../../spec_helper' +require_relative '../../../library/digest/sha1/shared/constants' +require_relative '../../../library/digest/sha256/shared/constants' +require_relative '../../../library/digest/sha384/shared/constants' +require_relative '../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe "OpenSSL::Digest#block_length" do + context "when the digest object is created via a name argument" do + it "returns a SHA1 block length" do + OpenSSL::Digest.new('sha1').block_length.should == SHA1Constants::BlockLength + end + + it "returns a SHA256 block length" do + OpenSSL::Digest.new('sha256').block_length.should == SHA256Constants::BlockLength + end + + it "returns a SHA384 block length" do + OpenSSL::Digest.new('sha384').block_length.should == SHA384Constants::BlockLength + end + + it "returns a SHA512 block length" do + OpenSSL::Digest.new('sha512').block_length.should == SHA512Constants::BlockLength + end + end + + context "when the digest object is created via a subclass" do + it "returns a SHA1 block length" do + OpenSSL::Digest::SHA1.new.block_length.should == SHA1Constants::BlockLength + end + + it "returns a SHA256 block length" do + OpenSSL::Digest::SHA256.new.block_length.should == SHA256Constants::BlockLength + end + + it "returns a SHA384 block length" do + OpenSSL::Digest::SHA384.new.block_length.should == SHA384Constants::BlockLength + end + + it "returns a SHA512 block length" do + OpenSSL::Digest::SHA512.new.block_length.should == SHA512Constants::BlockLength + end + end +end diff --git a/spec/ruby/library/openssl/digest/digest_length_spec.rb b/spec/ruby/library/openssl/digest/digest_length_spec.rb new file mode 100644 index 0000000000..37d1cba9a7 --- /dev/null +++ b/spec/ruby/library/openssl/digest/digest_length_spec.rb @@ -0,0 +1,44 @@ +require_relative '../../../spec_helper' +require_relative '../../../library/digest/sha1/shared/constants' +require_relative '../../../library/digest/sha256/shared/constants' +require_relative '../../../library/digest/sha384/shared/constants' +require_relative '../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe "OpenSSL::Digest#digest_length" do + context "when the digest object is created via a name argument" do + it "returns a SHA1 digest length" do + OpenSSL::Digest.new('sha1').digest_length.should == SHA1Constants::DigestLength + end + + it "returns a SHA256 digest length" do + OpenSSL::Digest.new('sha256').digest_length.should == SHA256Constants::DigestLength + end + + it "returns a SHA384 digest length" do + OpenSSL::Digest.new('sha384').digest_length.should == SHA384Constants::DigestLength + end + + it "returns a SHA512 digest length" do + OpenSSL::Digest.new('sha512').digest_length.should == SHA512Constants::DigestLength + end + end + + context "when the digest object is created via a subclass" do + it "returns a SHA1 digest length" do + OpenSSL::Digest::SHA1.new.digest_length.should == SHA1Constants::DigestLength + end + + it "returns a SHA256 digest length" do + OpenSSL::Digest::SHA256.new.digest_length.should == SHA256Constants::DigestLength + end + + it "returns a SHA384 digest length" do + OpenSSL::Digest::SHA384.new.digest_length.should == SHA384Constants::DigestLength + end + + it "returns a SHA512 digest length" do + OpenSSL::Digest::SHA512.new.digest_length.should == SHA512Constants::DigestLength + end + end +end diff --git a/spec/ruby/library/openssl/digest/digest_spec.rb b/spec/ruby/library/openssl/digest/digest_spec.rb new file mode 100644 index 0000000000..cf27d01b6d --- /dev/null +++ b/spec/ruby/library/openssl/digest/digest_spec.rb @@ -0,0 +1,62 @@ +require_relative '../../../spec_helper' +require_relative '../../../library/digest/sha1/shared/constants' +require_relative '../../../library/digest/sha256/shared/constants' +require_relative '../../../library/digest/sha384/shared/constants' +require_relative '../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe "OpenSSL::Digest class methods" do + describe ".digest" do + it "returns a SHA1 digest" do + OpenSSL::Digest.digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Digest + end + + it "returns a SHA256 digest" do + OpenSSL::Digest.digest('sha256', SHA256Constants::Contents).should == SHA256Constants::Digest + end + + it "returns a SHA384 digest" do + OpenSSL::Digest.digest('sha384', SHA384Constants::Contents).should == SHA384Constants::Digest + end + + it "returns a SHA512 digest" do + OpenSSL::Digest.digest('sha512', SHA512Constants::Contents).should == SHA512Constants::Digest + end + end + + describe ".hexdigest" do + it "returns a SHA1 hexdigest" do + OpenSSL::Digest.hexdigest('sha1', SHA1Constants::Contents).should == SHA1Constants::Hexdigest + end + + it "returns a SHA256 hexdigest" do + OpenSSL::Digest.hexdigest('sha256', SHA256Constants::Contents).should == SHA256Constants::Hexdigest + end + + it "returns a SHA384 hexdigest" do + OpenSSL::Digest.hexdigest('sha384', SHA384Constants::Contents).should == SHA384Constants::Hexdigest + end + + it "returns a SHA512 hexdigest" do + OpenSSL::Digest.hexdigest('sha512', SHA512Constants::Contents).should == SHA512Constants::Hexdigest + end + end + + describe ".base64digest" do + it "returns a SHA1 base64digest" do + OpenSSL::Digest.base64digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Base64digest + end + + it "returns a SHA256 base64digest" do + OpenSSL::Digest.base64digest('sha256', SHA256Constants::Contents).should == SHA256Constants::Base64digest + end + + it "returns a SHA384 base64digest" do + OpenSSL::Digest.base64digest('sha384', SHA384Constants::Contents).should == SHA384Constants::Base64digest + end + + it "returns a SHA512 base64digest" do + OpenSSL::Digest.base64digest('sha512', SHA512Constants::Contents).should == SHA512Constants::Base64digest + end + end +end diff --git a/spec/ruby/library/openssl/digest/initialize_spec.rb b/spec/ruby/library/openssl/digest/initialize_spec.rb new file mode 100644 index 0000000000..e24ab51d14 --- /dev/null +++ b/spec/ruby/library/openssl/digest/initialize_spec.rb @@ -0,0 +1,137 @@ +require_relative '../../../spec_helper' +require_relative '../../../library/digest/sha1/shared/constants' +require_relative '../../../library/digest/sha256/shared/constants' +require_relative '../../../library/digest/sha384/shared/constants' +require_relative '../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe "OpenSSL::Digest#initialize" do + describe "can be called with a digest name" do + it "returns a SHA1 object" do + OpenSSL::Digest.new("sha1").name.should == "SHA1" + end + + it "returns a SHA256 object" do + OpenSSL::Digest.new("sha256").name.should == "SHA256" + end + + it "returns a SHA384 object" do + OpenSSL::Digest.new("sha384").name.should == "SHA384" + end + + it "returns a SHA512 object" do + OpenSSL::Digest.new("sha512").name.should == "SHA512" + end + + version_is OpenSSL::VERSION, "4.0.0" do + it "throws an error when called with an unknown digest" do + -> { OpenSSL::Digest.new("wd40") }.should.raise(OpenSSL::Digest::DigestError, /wd40/) + end + end + + it "cannot be called with a symbol" do + -> { OpenSSL::Digest.new(:SHA1) }.should.raise(TypeError) + end + end + + describe "can be called with a digest object" do + it "returns a SHA1 object" do + OpenSSL::Digest.new(OpenSSL::Digest::SHA1.new).name.should == "SHA1" + end + + it "returns a SHA256 object" do + OpenSSL::Digest.new(OpenSSL::Digest::SHA256.new).name.should == "SHA256" + end + + it "returns a SHA384 object" do + OpenSSL::Digest.new(OpenSSL::Digest::SHA384.new).name.should == "SHA384" + end + + it "returns a SHA512 object" do + OpenSSL::Digest.new(OpenSSL::Digest::SHA512.new).name.should == "SHA512" + end + + it "ignores the state of the digest object" do + sha1 = OpenSSL::Digest.new('sha1', SHA1Constants::Contents) + OpenSSL::Digest.new(sha1).digest.should == SHA1Constants::BlankDigest + end + end + + it "cannot be called with a digest class" do + -> { OpenSSL::Digest.new(OpenSSL::Digest::SHA1) }.should.raise(TypeError) + end + + context "when called without an initial String argument" do + it "returns a SHA1 digest" do + OpenSSL::Digest.new("sha1").digest.should == SHA1Constants::BlankDigest + end + + it "returns a SHA256 digest" do + OpenSSL::Digest.new("sha256").digest.should == SHA256Constants::BlankDigest + end + + it "returns a SHA384 digest" do + OpenSSL::Digest.new("sha384").digest.should == SHA384Constants::BlankDigest + end + + it "returns a SHA512 digest" do + OpenSSL::Digest.new("sha512").digest.should == SHA512Constants::BlankDigest + end + end + + context "when called with an initial String argument" do + it "returns a SHA1 digest of that argument" do + OpenSSL::Digest.new("sha1", SHA1Constants::Contents).digest.should == SHA1Constants::Digest + end + + it "returns a SHA256 digest of that argument" do + OpenSSL::Digest.new("sha256", SHA256Constants::Contents).digest.should == SHA256Constants::Digest + end + + it "returns a SHA384 digest of that argument" do + OpenSSL::Digest.new("sha384", SHA384Constants::Contents).digest.should == SHA384Constants::Digest + end + + it "returns a SHA512 digest of that argument" do + OpenSSL::Digest.new("sha512", SHA512Constants::Contents).digest.should == SHA512Constants::Digest + end + end + + context "can be called on subclasses" do + describe "can be called without an initial String argument on subclasses" do + it "returns a SHA1 digest" do + OpenSSL::Digest::SHA1.new.digest.should == SHA1Constants::BlankDigest + end + + it "returns a SHA256 digest" do + OpenSSL::Digest::SHA256.new.digest.should == SHA256Constants::BlankDigest + end + + it "returns a SHA384 digest" do + OpenSSL::Digest::SHA384.new.digest.should == SHA384Constants::BlankDigest + end + + it "returns a SHA512 digest" do + OpenSSL::Digest::SHA512.new.digest.should == SHA512Constants::BlankDigest + end + end + + describe "can be called with an initial String argument on subclasses" do + it "returns a SHA1 digest" do + OpenSSL::Digest::SHA1.new(SHA1Constants::Contents).digest.should == SHA1Constants::Digest + end + + it "returns a SHA256 digest" do + OpenSSL::Digest::SHA256.new(SHA256Constants::Contents).digest.should == SHA256Constants::Digest + end + + it "returns a SHA384 digest" do + OpenSSL::Digest::SHA384.new(SHA384Constants::Contents).digest.should == SHA384Constants::Digest + end + + it "returns a SHA512 digest" do + OpenSSL::Digest::SHA512.new(SHA512Constants::Contents).digest.should == SHA512Constants::Digest + end + end + end +end diff --git a/spec/ruby/library/openssl/digest/name_spec.rb b/spec/ruby/library/openssl/digest/name_spec.rb new file mode 100644 index 0000000000..b379f35c1c --- /dev/null +++ b/spec/ruby/library/openssl/digest/name_spec.rb @@ -0,0 +1,16 @@ +require_relative '../../../spec_helper' +require 'openssl' + +describe "OpenSSL::Digest#name" do + it "returns the name of digest" do + OpenSSL::Digest.new('SHA1').name.should == 'SHA1' + end + + it "converts the name to the internal representation of OpenSSL" do + OpenSSL::Digest.new('sha1').name.should == 'SHA1' + end + + it "works on subclasses too" do + OpenSSL::Digest::SHA1.new.name.should == 'SHA1' + end +end diff --git a/spec/ruby/library/openssl/digest/reset_spec.rb b/spec/ruby/library/openssl/digest/reset_spec.rb new file mode 100644 index 0000000000..c19bf46633 --- /dev/null +++ b/spec/ruby/library/openssl/digest/reset_spec.rb @@ -0,0 +1,36 @@ +require_relative '../../../spec_helper' +require_relative '../../../library/digest/sha1/shared/constants' +require_relative '../../../library/digest/sha256/shared/constants' +require_relative '../../../library/digest/sha384/shared/constants' +require_relative '../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe "OpenSSL::Digest#reset" do + it "works for a SHA1 digest" do + digest = OpenSSL::Digest.new('sha1', SHA1Constants::Contents) + digest.reset + digest.update(SHA1Constants::Contents) + digest.digest.should == SHA1Constants::Digest + end + + it "works for a SHA256 digest" do + digest = OpenSSL::Digest.new('sha256', SHA256Constants::Contents) + digest.reset + digest.update(SHA256Constants::Contents) + digest.digest.should == SHA256Constants::Digest + end + + it "works for a SHA384 digest" do + digest = OpenSSL::Digest.new('sha384', SHA384Constants::Contents) + digest.reset + digest.update(SHA384Constants::Contents) + digest.digest.should == SHA384Constants::Digest + end + + it "works for a SHA512 digest" do + digest = OpenSSL::Digest.new('sha512', SHA512Constants::Contents) + digest.reset + digest.update(SHA512Constants::Contents) + digest.digest.should == SHA512Constants::Digest + end +end diff --git a/spec/ruby/library/openssl/digest/shared/update.rb b/spec/ruby/library/openssl/digest/shared/update.rb new file mode 100644 index 0000000000..37277c945d --- /dev/null +++ b/spec/ruby/library/openssl/digest/shared/update.rb @@ -0,0 +1,123 @@ +require_relative '../../../../library/digest/sha1/shared/constants' +require_relative '../../../../library/digest/sha256/shared/constants' +require_relative '../../../../library/digest/sha384/shared/constants' +require_relative '../../../../library/digest/sha512/shared/constants' +require 'openssl' + +describe :openssl_digest_update, shared: true do + context "when given input as a single string" do + it "returns a SHA1 digest" do + digest = OpenSSL::Digest.new('sha1') + digest.send(@method, SHA1Constants::Contents) + digest.digest.should == SHA1Constants::Digest + end + + it "returns a SHA256 digest" do + digest = OpenSSL::Digest.new('sha256') + digest.send(@method, SHA256Constants::Contents) + digest.digest.should == SHA256Constants::Digest + end + + it "returns a SHA384 digest" do + digest = OpenSSL::Digest.new('sha384') + digest.send(@method, SHA384Constants::Contents) + digest.digest.should == SHA384Constants::Digest + end + + it "returns a SHA512 digest" do + digest = OpenSSL::Digest.new('sha512') + digest.send(@method, SHA512Constants::Contents) + digest.digest.should == SHA512Constants::Digest + end + end + + context "when given input as multiple smaller substrings" do + it "returns a SHA1 digest" do + digest = OpenSSL::Digest.new('sha1') + SHA1Constants::Contents.each_char { |b| digest.send(@method, b) } + digest.digest.should == SHA1Constants::Digest + end + + it "returns a SHA256 digest" do + digest = OpenSSL::Digest.new('sha256') + SHA256Constants::Contents.each_char { |b| digest.send(@method, b) } + digest.digest.should == SHA256Constants::Digest + end + + it "returns a SHA384 digest" do + digest = OpenSSL::Digest.new('sha384') + SHA384Constants::Contents.each_char { |b| digest.send(@method, b) } + digest.digest.should == SHA384Constants::Digest + end + + it "returns a SHA512 digest" do + digest = OpenSSL::Digest.new('sha512') + SHA512Constants::Contents.each_char { |b| digest.send(@method, b) } + digest.digest.should == SHA512Constants::Digest + end + end + + context "when input is not a String and responds to #to_str" do + it "returns a SHA1 digest" do + str = mock('str') + str.should_receive(:to_str).and_return(SHA1Constants::Contents) + digest = OpenSSL::Digest.new('sha1') + digest.send(@method, str) + digest.digest.should == SHA1Constants::Digest + end + + it "returns a SHA256 digest" do + str = mock('str') + str.should_receive(:to_str).and_return(SHA256Constants::Contents) + digest = OpenSSL::Digest.new('sha256') + digest.send(@method, str) + digest.digest.should == SHA256Constants::Digest + end + + it "returns a SHA384 digest" do + str = mock('str') + str.should_receive(:to_str).and_return(SHA384Constants::Contents) + digest = OpenSSL::Digest.new('sha384') + digest.send(@method, str) + digest.digest.should == SHA384Constants::Digest + end + + it "returns a SHA512 digest" do + str = mock('str') + str.should_receive(:to_str).and_return(SHA512Constants::Contents) + digest = OpenSSL::Digest.new('sha512') + digest.send(@method, str) + digest.digest.should == SHA512Constants::Digest + end + end + + context "when input is not a String and does not respond to #to_str" do + it "raises a TypeError with SHA1" do + digest = OpenSSL::Digest.new('sha1') + -> { + digest.send(@method, Object.new) + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end + + it "raises a TypeError with SHA256" do + digest = OpenSSL::Digest.new('sha256') + -> { + digest.send(@method, Object.new) + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end + + it "raises a TypeError with SHA384" do + digest = OpenSSL::Digest.new('sha384') + -> { + digest.send(@method, Object.new) + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end + + it "raises a TypeError with SHA512" do + digest = OpenSSL::Digest.new('sha512') + -> { + digest.send(@method, Object.new) + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end + end +end diff --git a/spec/ruby/library/openssl/digest/update_spec.rb b/spec/ruby/library/openssl/digest/update_spec.rb new file mode 100644 index 0000000000..3a90b06c6b --- /dev/null +++ b/spec/ruby/library/openssl/digest/update_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../../spec_helper' +require_relative 'shared/update' + +describe "OpenSSL::Digest#update" do + it_behaves_like :openssl_digest_update, :update +end diff --git a/spec/ruby/library/openssl/fixed_length_secure_compare_spec.rb b/spec/ruby/library/openssl/fixed_length_secure_compare_spec.rb new file mode 100644 index 0000000000..cc638e1f0d --- /dev/null +++ b/spec/ruby/library/openssl/fixed_length_secure_compare_spec.rb @@ -0,0 +1,42 @@ +require_relative '../../spec_helper' +require 'openssl' + +describe "OpenSSL.fixed_length_secure_compare" do + it "returns true for two strings with the same content" do + input1 = "the quick brown fox jumps over the lazy dog" + input2 = "the quick brown fox jumps over the lazy dog" + OpenSSL.fixed_length_secure_compare(input1, input2).should == true + end + + it "returns false for two strings of equal size with different content" do + input1 = "the quick brown fox jumps over the lazy dog" + input2 = "the lazy dog jumps over the quick brown fox" + OpenSSL.fixed_length_secure_compare(input1, input2).should == false + end + + it "converts both arguments to strings using #to_str" do + input1 = mock("input1") + input1.should_receive(:to_str).and_return("the quick brown fox jumps over the lazy dog") + input2 = mock("input2") + input2.should_receive(:to_str).and_return("the quick brown fox jumps over the lazy dog") + OpenSSL.fixed_length_secure_compare(input1, input2).should == true + end + + it "does not accept arguments that are not string and cannot be coerced into strings" do + -> { + OpenSSL.fixed_length_secure_compare("input1", :input2) + }.should.raise(TypeError, 'no implicit conversion of Symbol into String') + + -> { + OpenSSL.fixed_length_secure_compare(Object.new, "input2") + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end + + it "raises an ArgumentError for two strings of different size" do + input1 = "the quick brown fox jumps over the lazy dog" + input2 = "the quick brown fox" + -> { + OpenSSL.fixed_length_secure_compare(input1, input2) + }.should.raise(ArgumentError, 'inputs must be of equal length') + end +end diff --git a/spec/ruby/library/openssl/hmac/digest_spec.rb b/spec/ruby/library/openssl/hmac/digest_spec.rb index 22bc7023bc..03ed136e64 100644 --- a/spec/ruby/library/openssl/hmac/digest_spec.rb +++ b/spec/ruby/library/openssl/hmac/digest_spec.rb @@ -4,7 +4,7 @@ require 'openssl' describe "OpenSSL::HMAC.digest" do it "returns an SHA1 digest" do - cur_digest = OpenSSL::Digest::SHA1.new + cur_digest = OpenSSL::Digest.new("SHA1") cur_digest.digest.should == HMACConstants::BlankSHA1Digest digest = OpenSSL::HMAC.digest(cur_digest, HMACConstants::Key, diff --git a/spec/ruby/library/openssl/hmac/hexdigest_spec.rb b/spec/ruby/library/openssl/hmac/hexdigest_spec.rb index 7f73b2db09..3508c1bbd7 100644 --- a/spec/ruby/library/openssl/hmac/hexdigest_spec.rb +++ b/spec/ruby/library/openssl/hmac/hexdigest_spec.rb @@ -4,7 +4,7 @@ require 'openssl' describe "OpenSSL::HMAC.hexdigest" do it "returns an SHA1 hex digest" do - cur_digest = OpenSSL::Digest::SHA1.new + cur_digest = OpenSSL::Digest.new("SHA1") cur_digest.hexdigest.should == HMACConstants::BlankSHA1HexDigest hexdigest = OpenSSL::HMAC.hexdigest(cur_digest, HMACConstants::Key, diff --git a/spec/ruby/library/openssl/kdf/pbkdf2_hmac_spec.rb b/spec/ruby/library/openssl/kdf/pbkdf2_hmac_spec.rb new file mode 100644 index 0000000000..2558dbb9ec --- /dev/null +++ b/spec/ruby/library/openssl/kdf/pbkdf2_hmac_spec.rb @@ -0,0 +1,162 @@ +require_relative '../../../spec_helper' +require 'openssl' + +describe "OpenSSL::KDF.pbkdf2_hmac" do + before :each do + @defaults = { + salt: "\x00".b * 16, + iterations: 20_000, + length: 16, + hash: "sha1" + } + end + + it "creates the same value with the same input" do + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "supports nullbytes embedded in the password" do + key = OpenSSL::KDF.pbkdf2_hmac("sec\x00ret".b, **@defaults) + key.should == "\xB9\x7F\xB0\xC2\th\xC8<\x86\xF3\x94Ij7\xEF\xF1".b + end + + it "coerces the password into a String using #to_str" do + pass = mock("pass") + pass.should_receive(:to_str).and_return("secret") + key = OpenSSL::KDF.pbkdf2_hmac(pass, **@defaults) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "coerces the salt into a String using #to_str" do + salt = mock("salt") + salt.should_receive(:to_str).and_return("\x00".b * 16) + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, salt: salt) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "coerces the iterations into an Integer using #to_int" do + iterations = mock("iterations") + iterations.should_receive(:to_int).and_return(20_000) + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, iterations: iterations) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "coerces the length into an Integer using #to_int" do + length = mock("length") + length.should_receive(:to_int).and_return(16) + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, length: length) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "accepts a OpenSSL::Digest object as hash" do + hash = OpenSSL::Digest.new("sha1") + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, hash: hash) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0".b + end + + it "accepts an empty password" do + key = OpenSSL::KDF.pbkdf2_hmac("", **@defaults) + key.should == "k\x9F-\xB1\xF7\x9A\v\xA1(C\xF9\x85!P\xEF\x8C".b + end + + it "accepts an empty salt" do + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, salt: "") + key.should == "\xD5f\xE5\xEA\xF91\x1D\xD3evD\xED\xDB\xE80\x80".b + end + + it "accepts an empty length" do + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, length: 0) + key.should.empty? + end + + it "accepts an arbitrary length" do + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, length: 19) + key.should == "!\x99+\xF0^\xD0\x8BM\x158\xC4\xAC\x9C\xF1\xF0\xE0\xCF\xBB\x7F".b + end + + it "accepts any hash function known to OpenSSL" do + key = OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, hash: "sha512") + key.should == "N\x12}D\xCE\x99\xDBC\x8E\xEC\xAAr\xEA1\xDF\xFF".b + end + + it "raises a TypeError when password is not a String and does not respond to #to_str" do + -> { + OpenSSL::KDF.pbkdf2_hmac(Object.new, **@defaults) + }.should.raise(TypeError, "no implicit conversion of Object into String") + end + + it "raises a TypeError when salt is not a String and does not respond to #to_str" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, salt: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into String") + end + + it "raises a TypeError when iterations is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, iterations: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises a TypeError when length is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, length: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises a TypeError when hash is neither a String nor an OpenSSL::Digest" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, hash: Object.new) + }.should.raise(TypeError) + end + + version_is OpenSSL::VERSION, "4.0.0" do + it "raises a OpenSSL::Digest::DigestError for unknown digest algorithms" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, hash: "wd40") + }.should.raise(OpenSSL::Digest::DigestError, /wd40/) + end + end + + it "treats salt as a required keyword" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults.except(:salt)) + }.should.raise(ArgumentError, 'missing keyword: :salt') + end + + it "treats iterations as a required keyword" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults.except(:iterations)) + }.should.raise(ArgumentError, 'missing keyword: :iterations') + end + + it "treats length as a required keyword" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults.except(:length)) + }.should.raise(ArgumentError, 'missing keyword: :length') + end + + it "treats hash as a required keyword" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults.except(:hash)) + }.should.raise(ArgumentError, 'missing keyword: :hash') + end + + it "treats all keywords as required" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret") + }.should.raise(ArgumentError, 'missing keywords: :salt, :iterations, :length, :hash') + end + + guard -> { OpenSSL::OPENSSL_VERSION_NUMBER >= 0x30000000 } do + it "raises an OpenSSL::KDF::KDFError for 0 or less iterations" do + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, iterations: 0) + }.should.raise(OpenSSL::KDF::KDFError, "PKCS5_PBKDF2_HMAC: invalid iteration count") + + -> { + OpenSSL::KDF.pbkdf2_hmac("secret", **@defaults, iterations: -1) + }.should.raise(OpenSSL::KDF::KDFError, /PKCS5_PBKDF2_HMAC/) + end + end +end diff --git a/spec/ruby/library/openssl/kdf/scrypt_spec.rb b/spec/ruby/library/openssl/kdf/scrypt_spec.rb new file mode 100644 index 0000000000..c00f91bb5b --- /dev/null +++ b/spec/ruby/library/openssl/kdf/scrypt_spec.rb @@ -0,0 +1,210 @@ +require_relative '../../../spec_helper' +require 'openssl' + +# LibreSSL seems not to support scrypt +guard -> { OpenSSL::OPENSSL_VERSION.start_with?('OpenSSL') and OpenSSL::OPENSSL_VERSION_NUMBER >= 0x10100000 } do + describe "OpenSSL::KDF.scrypt" do + before :each do + @defaults = { + salt: "\x00".b * 16, + N: 2**14, + r: 8, + p: 1, + length: 32 + } + end + + it "creates the same value with the same input" do + key = OpenSSL::KDF.scrypt("secret", **@defaults) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "supports nullbytes embedded into the password" do + key = OpenSSL::KDF.scrypt("sec\x00ret".b, **@defaults) + key.should == "\xF9\xA4\xA0\xF1p\xF4\xF0\xCAT\xB4v\xEB\r7\x88N\xF7\x15]Ns\xFCwt4a\xC9\xC6\xA7\x13\x81&".b + end + + it "coerces the password into a String using #to_str" do + pass = mock("pass") + pass.should_receive(:to_str).and_return("secret") + key = OpenSSL::KDF.scrypt(pass, **@defaults) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "coerces the salt into a String using #to_str" do + salt = mock("salt") + salt.should_receive(:to_str).and_return("\x00".b * 16) + key = OpenSSL::KDF.scrypt("secret", **@defaults, salt: salt) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "coerces the N into an Integer using #to_int" do + n = mock("N") + n.should_receive(:to_int).and_return(2**14) + key = OpenSSL::KDF.scrypt("secret", **@defaults, N: n) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "coerces the r into an Integer using #to_int" do + r = mock("r") + r.should_receive(:to_int).and_return(8) + key = OpenSSL::KDF.scrypt("secret", **@defaults, r: r) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "coerces the p into an Integer using #to_int" do + p = mock("p") + p.should_receive(:to_int).and_return(1) + key = OpenSSL::KDF.scrypt("secret", **@defaults, p: p) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "coerces the length into an Integer using #to_int" do + length = mock("length") + length.should_receive(:to_int).and_return(32) + key = OpenSSL::KDF.scrypt("secret", **@defaults, length: length) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D\x17}\xF2\x84T\xD4)\xC2>\xFE\x93\xE3\xF4".b + end + + it "accepts an empty password" do + key = OpenSSL::KDF.scrypt("", **@defaults) + key.should == "\xAA\xFC\xF5^E\x94v\xFFk\xE6\xF0vR\xE7\x13\xA7\xF5\x15'\x9A\xE4C\x9Dn\x18F_E\xD2\v\e\xB3".b + end + + it "accepts an empty salt" do + key = OpenSSL::KDF.scrypt("secret", **@defaults, salt: "") + key.should == "\x96\xACDl\xCB3/aN\xB0F\x8A#\xD7\x92\xD2O\x1E\v\xBB\xCE\xC0\xAA\xB9\x0F]\xB09\xEA8\xDD\e".b + end + + it "accepts a zero length" do + key = OpenSSL::KDF.scrypt("secret", **@defaults, length: 0) + key.should.empty? + end + + it "accepts an arbitrary length" do + key = OpenSSL::KDF.scrypt("secret", **@defaults, length: 19) + key.should == "h\xB2k\xDF]\xDA\xE1.-(\xCF\xAC\x91D\x8F\xC2a\x9C\x9D".b + end + + it "raises a TypeError when password is not a String and does not respond to #to_str" do + -> { + OpenSSL::KDF.scrypt(Object.new, **@defaults) + }.should.raise(TypeError, "no implicit conversion of Object into String") + end + + it "raises a TypeError when salt is not a String and does not respond to #to_str" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, salt: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into String") + end + + it "raises a TypeError when N is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, N: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises a TypeError when r is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, r: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises a TypeError when p is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, p: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises a TypeError when length is not an Integer and does not respond to #to_int" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, length: Object.new) + }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "treats salt as a required keyword" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults.except(:salt)) + }.should.raise(ArgumentError, 'missing keyword: :salt') + end + + it "treats N as a required keyword" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults.except(:N)) + }.should.raise(ArgumentError, 'missing keyword: :N') + end + + it "treats r as a required keyword" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults.except(:r)) + }.should.raise(ArgumentError, 'missing keyword: :r') + end + + it "treats p as a required keyword" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults.except(:p)) + }.should.raise(ArgumentError, 'missing keyword: :p') + end + + it "treats length as a required keyword" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults.except(:length)) + }.should.raise(ArgumentError, 'missing keyword: :length') + end + + it "treats all keywords as required" do + -> { + OpenSSL::KDF.scrypt("secret") + }.should.raise(ArgumentError, 'missing keywords: :salt, :N, :r, :p, :length') + end + + it "requires N to be a power of 2" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, N: 2**14 - 1) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + end + + it "requires N to be at least 2" do + key = OpenSSL::KDF.scrypt("secret", **@defaults, N: 2) + key.should == "\x06A$a\xA9!\xBE\x01\x85\xA7\x18\xBCEa\x82\xC5\xFEl\x93\xAB\xBD\xF7\x8B\x84\v\xFC\eN\xEBQ\xE6\xD2".b + + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, N: 1) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, N: 0) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, N: -1) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + end + + it "requires r to be positive" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, r: 0) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, r: -1) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + end + + it "requires p to be positive" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, p: 0) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, p: -1) + }.should.raise(OpenSSL::KDF::KDFError, /EVP_PBE_scrypt/) + end + + it "requires length to be not negative" do + -> { + OpenSSL::KDF.scrypt("secret", **@defaults, length: -1) + }.should.raise(ArgumentError, "negative string size (or size too big)") + end + end +end diff --git a/spec/ruby/library/openssl/random/shared/random_bytes.rb b/spec/ruby/library/openssl/random/shared/random_bytes.rb index 3a3a6b2bc4..4d1751e57e 100644 --- a/spec/ruby/library/openssl/random/shared/random_bytes.rb +++ b/spec/ruby/library/openssl/random/shared/random_bytes.rb @@ -1,11 +1,11 @@ require_relative '../../../../spec_helper' require 'openssl' -describe :openssl_random_bytes, shared: true do |cmd| +describe :openssl_random_bytes, shared: true do it "generates a random binary string of specified length" do (1..64).each do |idx| bytes = OpenSSL::Random.send(@method, idx) - bytes.should be_kind_of(String) + bytes.should.is_a?(String) bytes.length.should == idx end end @@ -22,8 +22,8 @@ describe :openssl_random_bytes, shared: true do |cmd| end it "raises ArgumentError on negative arguments" do - lambda { + -> { OpenSSL::Random.send(@method, -1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/openssl/secure_compare_spec.rb b/spec/ruby/library/openssl/secure_compare_spec.rb new file mode 100644 index 0000000000..ce2a4a0d43 --- /dev/null +++ b/spec/ruby/library/openssl/secure_compare_spec.rb @@ -0,0 +1,38 @@ +require_relative '../../spec_helper' +require 'openssl' + +describe "OpenSSL.secure_compare" do + it "returns true for two strings with the same content" do + input1 = "the quick brown fox jumps over the lazy dog" + input2 = "the quick brown fox jumps over the lazy dog" + OpenSSL.secure_compare(input1, input2).should == true + end + + it "returns false for two strings with different content" do + input1 = "the quick brown fox jumps over the lazy dog" + input2 = "the lazy dog jumps over the quick brown fox" + OpenSSL.secure_compare(input1, input2).should == false + end + + it "converts both arguments to strings using #to_str, but adds equality check for the original objects" do + input1 = mock("input1") + input1.should_receive(:to_str).and_return("the quick brown fox jumps over the lazy dog") + input2 = mock("input2") + input2.should_receive(:to_str).and_return("the quick brown fox jumps over the lazy dog") + OpenSSL.secure_compare(input1, input2).should == false + + input = mock("input") + input.should_receive(:to_str).twice.and_return("the quick brown fox jumps over the lazy dog") + OpenSSL.secure_compare(input, input).should == true + end + + it "does not accept arguments that are not string and cannot be coerced into strings" do + -> { + OpenSSL.secure_compare("input1", :input2) + }.should.raise(TypeError, 'no implicit conversion of Symbol into String') + + -> { + OpenSSL.secure_compare(Object.new, "input2") + }.should.raise(TypeError, 'no implicit conversion of Object into String') + end +end diff --git a/spec/ruby/library/openssl/shared/constants.rb b/spec/ruby/library/openssl/shared/constants.rb index 0bed4156a1..836f75011b 100644 --- a/spec/ruby/library/openssl/shared/constants.rb +++ b/spec/ruby/library/openssl/shared/constants.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary module HMACConstants Contents = "Ipsum is simply dummy text of the printing and typesetting industry. \nLorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. \nIt has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. \nIt was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." diff --git a/spec/ruby/library/openssl/x509/name/parse_spec.rb b/spec/ruby/library/openssl/x509/name/parse_spec.rb index 6a43f5aea3..84e3d442f6 100644 --- a/spec/ruby/library/openssl/x509/name/parse_spec.rb +++ b/spec/ruby/library/openssl/x509/name/parse_spec.rb @@ -35,14 +35,14 @@ describe "OpenSSL::X509::Name.parse" do end it "raises TypeError if the given string contains no key/value pairs" do - lambda do + -> do OpenSSL::X509::Name.parse("hello") - end.should raise_error(TypeError) + end.should.raise(TypeError) end it "raises OpenSSL::X509::NameError if the given string contains invalid keys" do - lambda do + -> do OpenSSL::X509::Name.parse("hello=goodbye") - end.should raise_error(OpenSSL::X509::NameError) + end.should.raise(OpenSSL::X509::NameError) end end diff --git a/spec/ruby/library/openssl/x509/store/verify_spec.rb b/spec/ruby/library/openssl/x509/store/verify_spec.rb new file mode 100644 index 0000000000..6a6a53d992 --- /dev/null +++ b/spec/ruby/library/openssl/x509/store/verify_spec.rb @@ -0,0 +1,78 @@ +require_relative '../../../../spec_helper' +require 'openssl' + +describe "OpenSSL::X509::Store#verify" do + it "returns true for valid certificate" do + key = OpenSSL::PKey::RSA.new 2048 + cert = OpenSSL::X509::Certificate.new + cert.version = 2 + cert.serial = 1 + cert.subject = OpenSSL::X509::Name.parse "/DC=org/DC=truffleruby/CN=TruffleRuby CA" + cert.issuer = cert.subject + cert.public_key = key.public_key + cert.not_before = Time.now - 10 + cert.not_after = cert.not_before + 365 * 24 * 60 * 60 + cert.sign key, OpenSSL::Digest.new('SHA256') + store = OpenSSL::X509::Store.new + store.add_cert(cert) + [store.verify(cert), store.error, store.error_string].should == [true, 0, "ok"] + end + + it "returns false for an expired certificate" do + key = OpenSSL::PKey::RSA.new 2048 + cert = OpenSSL::X509::Certificate.new + cert.version = 2 + cert.serial = 1 + cert.subject = OpenSSL::X509::Name.parse "/DC=org/DC=truffleruby/CN=TruffleRuby CA" + cert.issuer = cert.subject + cert.public_key = key.public_key + cert.not_before = Time.now - 10 + cert.not_after = Time.now - 5 + cert.sign key, OpenSSL::Digest.new('SHA256') + store = OpenSSL::X509::Store.new + store.add_cert(cert) + store.verify(cert).should == false + end + + it "returns false for an expired root certificate" do + root_key = OpenSSL::PKey::RSA.new 2048 + root_cert = OpenSSL::X509::Certificate.new + root_cert.version = 2 + root_cert.serial = 1 + root_cert.subject = OpenSSL::X509::Name.parse "/DC=org/DC=truffleruby/CN=TruffleRuby CA" + root_cert.issuer = root_cert.subject + root_cert.public_key = root_key.public_key + root_cert.not_before = Time.now - 10 + root_cert.not_after = Time.now - 5 + ef = OpenSSL::X509::ExtensionFactory.new + ef.subject_certificate = root_cert + ef.issuer_certificate = root_cert + root_cert.add_extension(ef.create_extension("basicConstraints","CA:TRUE",true)) + root_cert.add_extension(ef.create_extension("keyUsage","keyCertSign, cRLSign", true)) + root_cert.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false)) + root_cert.add_extension(ef.create_extension("authorityKeyIdentifier","keyid:always",false)) + root_cert.sign(root_key, OpenSSL::Digest.new('SHA256')) + + + key = OpenSSL::PKey::RSA.new 2048 + cert = OpenSSL::X509::Certificate.new + cert.version = 2 + cert.serial = 2 + cert.subject = OpenSSL::X509::Name.parse "/DC=org/DC=truffleruby/CN=TruffleRuby certificate" + cert.issuer = root_cert.subject + cert.public_key = key.public_key + cert.not_before = Time.now + cert.not_after = cert.not_before + 1 * 365 * 24 * 60 * 60 + ef = OpenSSL::X509::ExtensionFactory.new + ef.subject_certificate = cert + ef.issuer_certificate = root_cert + cert.add_extension(ef.create_extension("keyUsage","digitalSignature", true)) + cert.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false)) + cert.sign(root_key, OpenSSL::Digest.new('SHA256')) + + store = OpenSSL::X509::Store.new + store.add_cert(root_cert) + store.add_cert(cert) + store.verify(cert).should == false + end +end diff --git a/spec/ruby/library/openstruct/delete_field_spec.rb b/spec/ruby/library/openstruct/delete_field_spec.rb index 9ac80196cc..12fed6c90d 100644 --- a/spec/ruby/library/openstruct/delete_field_spec.rb +++ b/spec/ruby/library/openstruct/delete_field_spec.rb @@ -8,12 +8,12 @@ describe "OpenStruct#delete_field" do it "removes the named field from self's method/value table" do @os.delete_field(:name) - @os[:name].should be_nil + @os[:name].should == nil end it "does remove the accessor methods" do @os.delete_field(:name) - @os.respond_to?(:name).should be_false - @os.respond_to?(:name=).should be_false + @os.respond_to?(:name).should == false + @os.respond_to?(:name=).should == false end end diff --git a/spec/ruby/library/openstruct/equal_value_spec.rb b/spec/ruby/library/openstruct/equal_value_spec.rb index 103ac13588..c72c09ce14 100644 --- a/spec/ruby/library/openstruct/equal_value_spec.rb +++ b/spec/ruby/library/openstruct/equal_value_spec.rb @@ -8,21 +8,21 @@ describe "OpenStruct#==" do end it "returns false when the passed argument is no OpenStruct" do - (@os == Object.new).should be_false - (@os == "Test").should be_false - (@os == 10).should be_false - (@os == :sym).should be_false + (@os == Object.new).should == false + (@os == "Test").should == false + (@os == 10).should == false + (@os == :sym).should == false end it "returns true when self and other are equal method/value wise" do - (@os == @os).should be_true - (@os == OpenStruct.new(name: "John")).should be_true - (@os == OpenStructSpecs::OpenStructSub.new(name: "John")).should be_true + (@os == @os).should == true + (@os == OpenStruct.new(name: "John")).should == true + (@os == OpenStructSpecs::OpenStructSub.new(name: "John")).should == true - (@os == OpenStruct.new(name: "Jonny")).should be_false - (@os == OpenStructSpecs::OpenStructSub.new(name: "Jonny")).should be_false + (@os == OpenStruct.new(name: "Jonny")).should == false + (@os == OpenStructSpecs::OpenStructSub.new(name: "Jonny")).should == false - (@os == OpenStruct.new(name: "John", age: 20)).should be_false - (@os == OpenStructSpecs::OpenStructSub.new(name: "John", age: 20)).should be_false + (@os == OpenStruct.new(name: "John", age: 20)).should == false + (@os == OpenStructSpecs::OpenStructSub.new(name: "John", age: 20)).should == false end end diff --git a/spec/ruby/library/openstruct/frozen_spec.rb b/spec/ruby/library/openstruct/frozen_spec.rb index 27931fe5ac..c37fd18c8c 100644 --- a/spec/ruby/library/openstruct/frozen_spec.rb +++ b/spec/ruby/library/openstruct/frozen_spec.rb @@ -9,28 +9,30 @@ describe "OpenStruct.new when frozen" do # method_missing case handled in method_missing_spec.rb # it "is still readable" do - @os.age.should eql(70) - @os.pension.should eql(300) + @os.age.should.eql?(70) + @os.pension.should.eql?(300) @os.name.should == "John Smith" end - it "is not writeable" do - lambda{ @os.age = 42 }.should raise_error( RuntimeError ) + it "is not writable" do + ->{ @os.age = 42 }.should.raise( RuntimeError ) end it "cannot create new fields" do - lambda{ @os.state = :new }.should raise_error( RuntimeError ) + ->{ @os.state = :new }.should.raise( RuntimeError ) end it "creates a frozen clone" do f = @os.clone + f.frozen?.should == true f.age.should == 70 - lambda{ f.age = 0 }.should raise_error( RuntimeError ) - lambda{ f.state = :newer }.should raise_error( RuntimeError ) + ->{ f.age = 0 }.should.raise( RuntimeError ) + ->{ f.state = :newer }.should.raise( RuntimeError ) end it "creates an unfrozen dup" do d = @os.dup + d.frozen?.should == false d.age.should == 70 d.age = 42 d.age.should == 42 diff --git a/spec/ruby/library/openstruct/initialize_spec.rb b/spec/ruby/library/openstruct/initialize_spec.rb index dee5de48c6..52304cf780 100644 --- a/spec/ruby/library/openstruct/initialize_spec.rb +++ b/spec/ruby/library/openstruct/initialize_spec.rb @@ -3,6 +3,6 @@ require 'ostruct' describe "OpenStruct#initialize" do it "is private" do - OpenStruct.should have_private_instance_method(:initialize) + OpenStruct.private_instance_methods(false).should.include?(:initialize) end end diff --git a/spec/ruby/library/openstruct/marshal_load_spec.rb b/spec/ruby/library/openstruct/marshal_load_spec.rb index e07c4cef05..a8cdda3b43 100644 --- a/spec/ruby/library/openstruct/marshal_load_spec.rb +++ b/spec/ruby/library/openstruct/marshal_load_spec.rb @@ -4,9 +4,9 @@ require "ostruct" describe "OpenStruct#marshal_load when passed [Hash]" do it "defines methods based on the passed Hash" do os = OpenStruct.new - os.marshal_load(age: 20, name: "John") + os.send :marshal_load, age: 20, name: "John" - os.age.should eql(20) + os.age.should.eql?(20) os.name.should == "John" end end diff --git a/spec/ruby/library/openstruct/method_missing_spec.rb b/spec/ruby/library/openstruct/method_missing_spec.rb index eefe30661a..cf6734d629 100644 --- a/spec/ruby/library/openstruct/method_missing_spec.rb +++ b/spec/ruby/library/openstruct/method_missing_spec.rb @@ -7,41 +7,18 @@ describe "OpenStruct#method_missing when called with a method name ending in '=' end it "raises an ArgumentError when not passed any additional arguments" do - lambda { @os.method_missing(:test=) }.should raise_error(ArgumentError) - end - - it "raises a TypeError when self is frozen" do - @os.freeze - lambda { @os.method_missing(:test=, "test") }.should raise_error(RuntimeError) - end - - it "creates accessor methods" do - @os.method_missing(:test=, "test") - @os.respond_to?(:test=).should be_true - @os.respond_to?(:test).should be_true - - @os.test.should == "test" - @os.test = "changed" - @os.test.should == "changed" - end - - it "updates the method/value table with the passed method/value" do - @os.method_missing(:test=, "test") - @os.send(:table)[:test].should == "test" + -> { @os.send(:test=) }.should.raise(ArgumentError) end end describe "OpenStruct#method_missing when passed additional arguments" do - it "raises a NoMethodError" do + it "raises a NoMethodError when the key does not exist" do os = OpenStruct.new - lambda { os.method_missing(:test, 1, 2, 3) }.should raise_error(NoMethodError) + -> { os.test(1, 2, 3) }.should.raise(NoMethodError) end -end -describe "OpenStruct#method_missing when not passed any additional arguments" do - it "returns the value for the passed method from the method/value table" do - os = OpenStruct.new(age: 20) - os.method_missing(:age).should eql(20) - os.method_missing(:name).should be_nil + it "raises an ArgumentError when the key exists" do + os = OpenStruct.new(test: 20) + -> { os.test(1, 2, 3) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/openstruct/new_spec.rb b/spec/ruby/library/openstruct/new_spec.rb index 5d2cacea40..9e53948c82 100644 --- a/spec/ruby/library/openstruct/new_spec.rb +++ b/spec/ruby/library/openstruct/new_spec.rb @@ -7,8 +7,8 @@ describe "OpenStruct.new when passed [Hash]" do end it "creates an attribute for each key of the passed Hash" do - @os.age.should eql(70) - @os.pension.should eql(300) + @os.age.should.eql?(70) + @os.pension.should.eql?(300) @os.name.should == "John Smith" end end diff --git a/spec/ruby/library/openstruct/shared/inspect.rb b/spec/ruby/library/openstruct/shared/inspect.rb index ffcd690e1f..d5fffa0e2e 100644 --- a/spec/ruby/library/openstruct/shared/inspect.rb +++ b/spec/ruby/library/openstruct/shared/inspect.rb @@ -4,7 +4,7 @@ describe :ostruct_inspect, shared: true do os.send(@method).should == "#<OpenStruct name=\"John Smith\">" os = OpenStruct.new(age: 20, name: "John Smith") - os.send(@method).should be_kind_of(String) + os.send(@method).should.is_a?(String) end it "correctly handles self-referential OpenStructs" do diff --git a/spec/ruby/library/openstruct/to_h_spec.rb b/spec/ruby/library/openstruct/to_h_spec.rb index f3e157816b..7d9c7db5dc 100644 --- a/spec/ruby/library/openstruct/to_h_spec.rb +++ b/spec/ruby/library/openstruct/to_h_spec.rb @@ -19,11 +19,50 @@ describe "OpenStruct#to_h" do end it "does not return the hash used as initializer" do - @to_h.should_not equal(@h) + @to_h.should_not.equal?(@h) end it "returns a Hash that is independent from the struct" do @to_h[:age] = 71 @os.age.should == 70 end + + context "with block" do + it "converts [key, value] pairs returned by the block to a hash" do + h = @os.to_h { |k, v| [k.to_s, v*2] } + h.should == { "name" => "John SmithJohn Smith", "age" => 140, "pension" => 600 } + end + + it "raises ArgumentError if block returns longer or shorter array" do + -> do + @os.to_h { |k, v| [k.to_s, v*2, 1] } + end.should.raise(ArgumentError, /element has wrong array length/) + + -> do + @os.to_h { |k, v| [k] } + end.should.raise(ArgumentError, /element has wrong array length/) + end + + it "raises TypeError if block returns something other than Array" do + -> do + @os.to_h { |k, v| "not-array" } + end.should.raise(TypeError, /wrong element type String/) + end + + it "coerces returned pair to Array with #to_ary" do + x = mock('x') + x.stub!(:to_ary).and_return([:b, 'b']) + + @os.to_h { |k| x }.should == { :b => 'b' } + end + + it "does not coerce returned pair to Array with #to_a" do + x = mock('x') + x.stub!(:to_a).and_return([:b, 'b']) + + -> do + @os.to_h { |k| x } + end.should.raise(TypeError, /wrong element type MockObject/) + end + end end diff --git a/spec/ruby/library/optionparser/order_spec.rb b/spec/ruby/library/optionparser/order_spec.rb index 9d8f48d320..e49bd25554 100644 --- a/spec/ruby/library/optionparser/order_spec.rb +++ b/spec/ruby/library/optionparser/order_spec.rb @@ -2,31 +2,27 @@ require_relative '../../spec_helper' require 'optparse' describe "OptionParser#order" do - ruby_version_is '2.4' do - it "accepts `into` keyword argument and stores result in it" do - options = {} - parser = OptionParser.new do |opts| - opts.on("-v", "--[no-]verbose", "Run verbosely") - opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") - end - parser.order %w[--verbose --require optparse], into: options - - options.should == { verbose: true, require: "optparse" } + it "accepts `into` keyword argument and stores result in it" do + options = {} + parser = OptionParser.new do |opts| + opts.on("-v", "--[no-]verbose", "Run verbosely") + opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") end + parser.order %w[--verbose --require optparse], into: options + + options.should == { verbose: true, require: "optparse" } end end describe "OptionParser#order!" do - ruby_version_is '2.4' do - it "accepts `into` keyword argument and stores result in it" do - options = {} - parser = OptionParser.new do |opts| - opts.on("-v", "--[no-]verbose", "Run verbosely") - opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") - end - parser.order! %w[--verbose --require optparse], into: options - - options.should == { verbose: true, require: "optparse" } + it "accepts `into` keyword argument and stores result in it" do + options = {} + parser = OptionParser.new do |opts| + opts.on("-v", "--[no-]verbose", "Run verbosely") + opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") end + parser.order! %w[--verbose --require optparse], into: options + + options.should == { verbose: true, require: "optparse" } end end diff --git a/spec/ruby/library/optionparser/parse_spec.rb b/spec/ruby/library/optionparser/parse_spec.rb index 5b105a7d0e..9511acb1db 100644 --- a/spec/ruby/library/optionparser/parse_spec.rb +++ b/spec/ruby/library/optionparser/parse_spec.rb @@ -2,31 +2,27 @@ require_relative '../../spec_helper' require 'optparse' describe "OptionParser#parse" do - ruby_version_is '2.4' do - it "accepts `into` keyword argument and stores result in it" do - options = {} - parser = OptionParser.new do |opts| - opts.on("-v", "--[no-]verbose", "Run verbosely") - opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") - end - parser.parse %w[--verbose --require optparse], into: options - - options.should == { verbose: true, require: "optparse" } + it "accepts `into` keyword argument and stores result in it" do + options = {} + parser = OptionParser.new do |opts| + opts.on("-v", "--[no-]verbose", "Run verbosely") + opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") end + parser.parse %w[--verbose --require optparse], into: options + + options.should == { verbose: true, require: "optparse" } end end describe "OptionParser#parse!" do - ruby_version_is '2.4' do - it "accepts `into` keyword argument and stores result in it" do - options = {} - parser = OptionParser.new do |opts| - opts.on("-v", "--[no-]verbose", "Run verbosely") - opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") - end - parser.parse! %w[--verbose --require optparse], into: options - - options.should == { verbose: true, require: "optparse" } + it "accepts `into` keyword argument and stores result in it" do + options = {} + parser = OptionParser.new do |opts| + opts.on("-v", "--[no-]verbose", "Run verbosely") + opts.on("-r", "--require LIBRARY", "Require the LIBRARY before executing your script") end + parser.parse! %w[--verbose --require optparse], into: options + + options.should == { verbose: true, require: "optparse" } end end diff --git a/spec/ruby/library/pathname/absolute_spec.rb b/spec/ruby/library/pathname/absolute_spec.rb index dce3ae72ee..109abb8ee9 100644 --- a/spec/ruby/library/pathname/absolute_spec.rb +++ b/spec/ruby/library/pathname/absolute_spec.rb @@ -4,19 +4,19 @@ require 'pathname' describe "Pathname#absolute?" do it "returns true for the root directory" do - Pathname.new('/').absolute?.should == true + Pathname.new('/').should.absolute? end it "returns true for a dir starting with a slash" do - Pathname.new('/usr/local/bin').absolute?.should == true + Pathname.new('/usr/local/bin').should.absolute? end it "returns false for a dir not starting with a slash" do - Pathname.new('fish').absolute?.should == false + Pathname.new('fish').should_not.absolute? end it "returns false for a dir not starting with a slash" do - Pathname.new('fish/dog/cow').absolute?.should == false + Pathname.new('fish/dog/cow').should_not.absolute? end end diff --git a/spec/ruby/library/pathname/birthtime_spec.rb b/spec/ruby/library/pathname/birthtime_spec.rb new file mode 100644 index 0000000000..387f0aa54d --- /dev/null +++ b/spec/ruby/library/pathname/birthtime_spec.rb @@ -0,0 +1,16 @@ +require_relative '../../spec_helper' +require 'pathname' + +describe "Pathname#birthtime" do + platform_is :windows, :darwin, :freebsd, :netbsd do + it "returns the birth time for self" do + Pathname.new(__FILE__).birthtime.should.is_a?(Time) + end + end + + platform_is :openbsd do + it "raises an NotImplementedError" do + -> { Pathname.new(__FILE__).birthtime }.should.raise(NotImplementedError) + end + end +end diff --git a/spec/ruby/library/pathname/divide_spec.rb b/spec/ruby/library/pathname/divide_spec.rb new file mode 100644 index 0000000000..8af79d0c8f --- /dev/null +++ b/spec/ruby/library/pathname/divide_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/plus' + +describe "Pathname#/" do + it_behaves_like :pathname_plus, :/ +end diff --git a/spec/ruby/library/pathname/empty_spec.rb b/spec/ruby/library/pathname/empty_spec.rb index 6f46486a69..9f0305a0f0 100644 --- a/spec/ruby/library/pathname/empty_spec.rb +++ b/spec/ruby/library/pathname/empty_spec.rb @@ -1,34 +1,32 @@ require_relative '../../spec_helper' require 'pathname' -ruby_version_is '2.4' do - describe 'Pathname#empty?' do - before :all do - @file = tmp 'new_file_path_name.txt' - touch @file - @dir = tmp 'new_directory_path_name' - Dir.mkdir @dir - end +describe 'Pathname#empty?' do + before :all do + @file = tmp 'new_file_path_name.txt' + touch @file + @dir = tmp 'new_directory_path_name' + Dir.mkdir @dir + end - after :all do - rm_r @file - rm_r @dir - end + after :all do + rm_r @file + rm_r @dir + end - it 'returns true when file is not empty' do - Pathname.new(__FILE__).empty?.should be_false - end + it 'returns true when file is not empty' do + Pathname.new(__FILE__).empty?.should == false + end - it 'returns false when the directory is not empty' do - Pathname.new(__dir__).empty?.should be_false - end + it 'returns false when the directory is not empty' do + Pathname.new(__dir__).empty?.should == false + end - it 'return true when file is empty' do - Pathname.new(@file).empty?.should be_true - end + it 'return true when file is empty' do + Pathname.new(@file).empty?.should == true + end - it 'returns true when directory is empty' do - Pathname.new(@dir).empty?.should be_true - end + it 'returns true when directory is empty' do + Pathname.new(@dir).empty?.should == true end end diff --git a/spec/ruby/library/pathname/glob_spec.rb b/spec/ruby/library/pathname/glob_spec.rb new file mode 100644 index 0000000000..e20e6f8f85 --- /dev/null +++ b/spec/ruby/library/pathname/glob_spec.rb @@ -0,0 +1,92 @@ +require_relative '../../spec_helper' +require 'pathname' + +describe 'Pathname.glob' do + before :all do + @dir = tmp('pathname_glob') + '/' + @file_1 = @dir + 'lib/ipaddr.rb' + @file_2 = @dir + 'lib/irb.rb' + @file_3 = @dir + 'lib/.hidden.rb' + + touch @file_1 + touch @file_2 + touch @file_3 + end + + after :all do + rm_r @dir[0...-1] + end + + it 'returns [] for no match' do + Pathname.glob(@dir + 'lib/*.js').should == [] + end + + it 'returns [] when the pathname does not exist' do + Pathname.glob('i_dont_exist/lib/*.js').should == [] + end + + it 'returns matching file paths' do + Pathname.glob(@dir + 'lib/*i*.rb').sort.should == [Pathname.new(@file_1), Pathname.new(@file_2)].sort + end + + it 'returns matching file paths when a flag is provided' do + expected = [Pathname.new(@file_1), Pathname.new(@file_2), Pathname.new(@file_3)].sort + Pathname.glob(@dir + 'lib/*i*.rb', File::FNM_DOTMATCH).sort.should == expected + end + + it 'returns matching file paths when supplied :base keyword argument' do + Pathname.glob('*i*.rb', base: @dir + 'lib').sort.should == [Pathname.new('ipaddr.rb'), Pathname.new('irb.rb')].sort + end + + it "raises an ArgumentError when supplied a keyword argument other than :base" do + -> { + Pathname.glob('*i*.rb', foo: @dir + 'lib') + }.should.raise(ArgumentError, "unknown keyword: :foo") + end + + it "does not raise an ArgumentError when supplied a flag and :base keyword argument" do + expected = [Pathname.new('ipaddr.rb'), Pathname.new('irb.rb'), Pathname.new('.hidden.rb')].sort + Pathname.glob('*i*.rb', File::FNM_DOTMATCH, base: @dir + 'lib').sort.should == expected + end +end + + +describe 'Pathname#glob' do + before :all do + @dir = tmp('pathname_glob') + '/' + @file_1 = @dir + 'lib/ipaddr.rb' + @file_2 = @dir + 'lib/irb.rb' + @file_3 = @dir + 'lib/.hidden.rb' + + touch @file_1 + touch @file_2 + touch @file_3 + end + + after :all do + rm_r @dir[0...-1] + end + + it 'returns [] for no match' do + Pathname.new(@dir).glob('lib/*.js').should == [] + end + + it 'returns [] when the pathname does not exist' do + Pathname.new('./i_dont_exist').glob('lib/*.js').should == [] + end + + it 'returns matching file paths' do + Pathname.new(@dir).glob('lib/*i*.rb').sort.should == [Pathname.new(@file_1), Pathname.new(@file_2)].sort + end + + it 'yields matching file paths to block' do + ary = [] + Pathname.new(@dir).glob('lib/*i*.rb') { |p| ary << p }.should == nil + ary.sort.should == [Pathname.new(@file_1), Pathname.new(@file_2)].sort + end + + it 'returns matching file paths when a flag is provided' do + expected = [Pathname.new(@file_1), Pathname.new(@file_2), Pathname.new(@file_3)].sort + Pathname.new(@dir).glob('lib/*i*.rb', File::FNM_DOTMATCH).sort.should == expected + end +end diff --git a/spec/ruby/library/pathname/inspect_spec.rb b/spec/ruby/library/pathname/inspect_spec.rb new file mode 100644 index 0000000000..3abba6cbb5 --- /dev/null +++ b/spec/ruby/library/pathname/inspect_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../spec_helper' +require 'pathname' + +describe "Pathname#inspect" do + it "returns a consistent String" do + result = Pathname.new('/tmp').inspect + result.should.instance_of?(String) + result.should == "#<Pathname:/tmp>" + end +end diff --git a/spec/ruby/library/pathname/new_spec.rb b/spec/ruby/library/pathname/new_spec.rb index 4f519af398..3ef9d9b76d 100644 --- a/spec/ruby/library/pathname/new_spec.rb +++ b/spec/ruby/library/pathname/new_spec.rb @@ -3,23 +3,18 @@ require 'pathname' describe "Pathname.new" do it "returns a new Pathname Object with 1 argument" do - Pathname.new('').should be_kind_of(Pathname) + Pathname.new('').should.is_a?(Pathname) end it "raises an ArgumentError when called with \0" do - lambda { Pathname.new("\0")}.should raise_error(ArgumentError) - end - - it "is tainted if path is tainted" do - path = '/usr/local/bin'.taint - Pathname.new(path).tainted?.should == true + -> { Pathname.new("\0")}.should.raise(ArgumentError) end it "raises a TypeError if not passed a String type" do - lambda { Pathname.new(nil) }.should raise_error(TypeError) - lambda { Pathname.new(0) }.should raise_error(TypeError) - lambda { Pathname.new(true) }.should raise_error(TypeError) - lambda { Pathname.new(false) }.should raise_error(TypeError) + -> { Pathname.new(nil) }.should.raise(TypeError) + -> { Pathname.new(0) }.should.raise(TypeError) + -> { Pathname.new(true) }.should.raise(TypeError) + -> { Pathname.new(false) }.should.raise(TypeError) end it "initializes with an object with to_path" do diff --git a/spec/ruby/library/pathname/pathname_spec.rb b/spec/ruby/library/pathname/pathname_spec.rb new file mode 100644 index 0000000000..6fa6fd2bcb --- /dev/null +++ b/spec/ruby/library/pathname/pathname_spec.rb @@ -0,0 +1,19 @@ +require_relative '../../spec_helper' +require 'pathname' + +describe "Kernel#Pathname" do + it "is a private instance method" do + Kernel.private_instance_methods(false).should.include?(:Pathname) + end + + it "is also a public method" do + Kernel.should.respond_to?(:Pathname) + end + + it "returns same argument when called with a pathname argument" do + path = Pathname('foo') + new_path = Pathname(path) + + path.should.equal?(new_path) + end +end diff --git a/spec/ruby/library/pathname/plus_spec.rb b/spec/ruby/library/pathname/plus_spec.rb new file mode 100644 index 0000000000..57e472c266 --- /dev/null +++ b/spec/ruby/library/pathname/plus_spec.rb @@ -0,0 +1,6 @@ +require_relative '../../spec_helper' +require_relative 'shared/plus' + +describe "Pathname#+" do + it_behaves_like :pathname_plus, :+ +end diff --git a/spec/ruby/library/pathname/realdirpath_spec.rb b/spec/ruby/library/pathname/realdirpath_spec.rb index a9e44e354e..e50741a737 100644 --- a/spec/ruby/library/pathname/realdirpath_spec.rb +++ b/spec/ruby/library/pathname/realdirpath_spec.rb @@ -4,7 +4,7 @@ require 'pathname' describe "Pathname#realdirpath" do it "returns a Pathname" do - Pathname.pwd.realdirpath.should be_an_instance_of(Pathname) + Pathname.pwd.realdirpath.should.instance_of?(Pathname) end end diff --git a/spec/ruby/library/pathname/realpath_spec.rb b/spec/ruby/library/pathname/realpath_spec.rb index f2c654308e..d8b87f57d0 100644 --- a/spec/ruby/library/pathname/realpath_spec.rb +++ b/spec/ruby/library/pathname/realpath_spec.rb @@ -4,7 +4,7 @@ require 'pathname' describe "Pathname#realpath" do it "returns a Pathname" do - Pathname.pwd.realpath.should be_an_instance_of(Pathname) + Pathname.pwd.realpath.should.instance_of?(Pathname) end end diff --git a/spec/ruby/library/pathname/relative_path_from_spec.rb b/spec/ruby/library/pathname/relative_path_from_spec.rb index 1a941be926..7cbd22c3d6 100644 --- a/spec/ruby/library/pathname/relative_path_from_spec.rb +++ b/spec/ruby/library/pathname/relative_path_from_spec.rb @@ -7,11 +7,11 @@ describe "Pathname#relative_path_from" do end it "raises an error when the two paths do not share a common prefix" do - lambda { relative_path_str('/usr', 'foo') }.should raise_error(ArgumentError) + -> { relative_path_str('/usr', 'foo') }.should.raise(ArgumentError) end it "raises an error when the base directory has .." do - lambda { relative_path_str('a', '..') }.should raise_error(ArgumentError) + -> { relative_path_str('a', '..') }.should.raise(ArgumentError) end it "returns a path relative from root" do @@ -48,4 +48,8 @@ describe "Pathname#relative_path_from" do relative_path_str('..', '..').should == '.' relative_path_str('..', '.').should == '..' end + + it 'converts string argument to Pathname' do + Pathname.new('/usr/bin/ls').relative_path_from('/usr').to_s.should == 'bin/ls' + end end diff --git a/spec/ruby/library/pathname/relative_spec.rb b/spec/ruby/library/pathname/relative_spec.rb index 1a08891e6c..0fab9a7b9f 100644 --- a/spec/ruby/library/pathname/relative_spec.rb +++ b/spec/ruby/library/pathname/relative_spec.rb @@ -4,19 +4,19 @@ require 'pathname' describe "Pathname#relative?" do it "returns false for the root directory" do - Pathname.new('/').relative?.should == false + Pathname.new('/').should_not.relative? end it "returns false for a dir starting with a slash" do - Pathname.new('/usr/local/bin').relative?.should == false + Pathname.new('/usr/local/bin').should_not.relative? end it "returns true for a dir not starting with a slash" do - Pathname.new('fish').relative?.should == true + Pathname.new('fish').should.relative? end it "returns true for a dir not starting with a slash" do - Pathname.new('fish/dog/cow').relative?.should == true + Pathname.new('fish/dog/cow').should.relative? end end diff --git a/spec/ruby/library/pathname/root_spec.rb b/spec/ruby/library/pathname/root_spec.rb index 5fec0ee956..cd2be24516 100644 --- a/spec/ruby/library/pathname/root_spec.rb +++ b/spec/ruby/library/pathname/root_spec.rb @@ -4,23 +4,23 @@ require 'pathname' describe "Pathname#root?" do it "returns true for root directories" do - Pathname.new('/').root?.should == true + Pathname.new('/').should.root? end it "returns false for empty string" do - Pathname.new('').root?.should == false + Pathname.new('').should_not.root? end it "returns false for a top level directory" do - Pathname.new('/usr').root?.should == false + Pathname.new('/usr').should_not.root? end it "returns false for a top level with .. appended directory" do - Pathname.new('/usr/..').root?.should == false + Pathname.new('/usr/..').should_not.root? end it "returns false for a directory below top level" do - Pathname.new('/usr/local/bin/').root?.should == false + Pathname.new('/usr/local/bin/').should_not.root? end end diff --git a/spec/ruby/library/pathname/shared/plus.rb b/spec/ruby/library/pathname/shared/plus.rb new file mode 100644 index 0000000000..b3b896ea43 --- /dev/null +++ b/spec/ruby/library/pathname/shared/plus.rb @@ -0,0 +1,8 @@ +require 'pathname' + +describe :pathname_plus, shared: true do + it "appends a pathname to self" do + p = Pathname.new("/usr") + p.send(@method, "bin/ruby").should == Pathname.new("/usr/bin/ruby") + end +end diff --git a/spec/ruby/library/pp/pp_spec.rb b/spec/ruby/library/pp/pp_spec.rb index dba20d190d..e45a6bb94f 100644 --- a/spec/ruby/library/pp/pp_spec.rb +++ b/spec/ruby/library/pp/pp_spec.rb @@ -5,7 +5,7 @@ describe "PP.pp" do it 'works with default arguments' do array = [1, 2, 3] - lambda { + -> { PP.pp array }.should output "[1, 2, 3]\n" end @@ -14,12 +14,17 @@ describe "PP.pp" do array = [1, 2, 3] other_out = IOStub.new - lambda { + -> { PP.pp array, other_out }.should output "" # no output on stdout other_out.to_s.should == "[1, 2, 3]\n" end - it "needs to be reviewed for spec completeness" + it 'correctly prints a Hash' do + hash = { 'key' => 42 } + -> { + PP.pp hash + }.should output("#{hash.inspect}\n") + end end diff --git a/spec/ruby/library/prime/each_spec.rb b/spec/ruby/library/prime/each_spec.rb index b99cf7cf0e..d81e952a88 100644 --- a/spec/ruby/library/prime/each_spec.rb +++ b/spec/ruby/library/prime/each_spec.rb @@ -32,11 +32,11 @@ describe :prime_each, shared: true do all_prime &&= (2..Math.sqrt(prime)).all? { |d| prime % d != 0 } end - all_prime.should be_true + all_prime.should == true end it "returns the last evaluated expression in the passed block" do - @object.each { break :value }.should equal(:value) + @object.each { break :value }.should.equal?(:value) end describe "when not passed a block" do @@ -45,23 +45,23 @@ describe :prime_each, shared: true do end it "returns an object that is Enumerable" do - @prime_enum.each.should be_kind_of(Enumerable) + @prime_enum.each.should.is_a?(Enumerable) end it "returns an object that responds to #with_index" do - @prime_enum.should respond_to(:with_index) + @prime_enum.should.respond_to?(:with_index) end it "returns an object that responds to #with_object" do - @prime_enum.should respond_to(:with_object) + @prime_enum.should.respond_to?(:with_object) end it "returns an object that responds to #next" do - @prime_enum.should respond_to(:next) + @prime_enum.should.respond_to?(:next) end it "returns an object that responds to #rewind" do - @prime_enum.should respond_to(:rewind) + @prime_enum.should.respond_to?(:rewind) end it "yields primes starting at 2 independent of prior enumerators" do @@ -106,13 +106,13 @@ describe :prime_each_with_arguments, shared: true do ScratchPad.recorded.all? do |prime| (2..Math.sqrt(prime)).all? { |d| prime % d != 0 } - end.should be_true + end.should == true - ScratchPad.recorded.all? { |prime| prime <= bound }.should be_true + ScratchPad.recorded.all? { |prime| prime <= bound }.should == true end it "returns nil when no prime is generated" do - @object.each(1) { :value }.should be_nil + @object.each(1) { :value }.should == nil end it "yields primes starting at 2 independent of prior enumeration" do @@ -132,7 +132,7 @@ describe :prime_each_with_arguments, shared: true do describe "when not passed a block" do it "returns an object that returns primes less than or equal to the bound" do bound = 100 - @object.each(bound).all? { |prime| prime <= bound }.should be_true + @object.each(bound).all? { |prime| prime <= bound }.should == true end end end diff --git a/spec/ruby/library/prime/instance_spec.rb b/spec/ruby/library/prime/instance_spec.rb index 156337c46a..680895eb64 100644 --- a/spec/ruby/library/prime/instance_spec.rb +++ b/spec/ruby/library/prime/instance_spec.rb @@ -3,19 +3,19 @@ require 'prime' describe "Prime.instance" do it "returns a object representing the set of prime numbers" do - Prime.instance.should be_kind_of(Prime) + Prime.instance.should.is_a?(Prime) end it "returns a object with no obsolete features" do - Prime.instance.should_not respond_to(:succ) - Prime.instance.should_not respond_to(:next) + Prime.instance.should_not.respond_to?(:succ) + Prime.instance.should_not.respond_to?(:next) end it "does not complain anything" do - lambda { Prime.instance }.should_not complain + -> { Prime.instance }.should_not complain end it "raises a ArgumentError when is called with some arguments" do - lambda { Prime.instance(1) }.should raise_error(ArgumentError) + -> { Prime.instance(1) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/prime/integer/prime_division_spec.rb b/spec/ruby/library/prime/integer/prime_division_spec.rb index 60ba21037f..5631b22d0a 100644 --- a/spec/ruby/library/prime/integer/prime_division_spec.rb +++ b/spec/ruby/library/prime/integer/prime_division_spec.rb @@ -14,6 +14,6 @@ describe "Integer#prime_division" do -1.prime_division.should == [[-1, 1]] end it "raises ZeroDivisionError for 0" do - lambda { 0.prime_division }.should raise_error(ZeroDivisionError) + -> { 0.prime_division }.should.raise(ZeroDivisionError) end end diff --git a/spec/ruby/library/prime/integer/prime_spec.rb b/spec/ruby/library/prime/integer/prime_spec.rb index 53de76d5ab..d24f883b19 100644 --- a/spec/ruby/library/prime/integer/prime_spec.rb +++ b/spec/ruby/library/prime/integer/prime_spec.rb @@ -3,15 +3,15 @@ require 'prime' describe "Integer#prime?" do it "returns a true value for prime numbers" do - 2.prime?.should be_true - 3.prime?.should be_true - (2**31-1).prime?.should be_true # 8th Mersenne prime (M8) + 2.prime?.should == true + 3.prime?.should == true + (2**31-1).prime?.should == true # 8th Mersenne prime (M8) end it "returns a false value for composite numbers" do - 4.prime?.should be_false - 15.prime?.should be_false - (2**32-1).prime?.should be_false - ( (2**17-1)*(2**19-1) ).prime?.should be_false # M6*M7 + 4.prime?.should == false + 15.prime?.should == false + (2**32-1).prime?.should == false + ( (2**17-1)*(2**19-1) ).prime?.should == false # M6*M7 end end diff --git a/spec/ruby/library/prime/prime_division_spec.rb b/spec/ruby/library/prime/prime_division_spec.rb index 151b046f44..cc39969a56 100644 --- a/spec/ruby/library/prime/prime_division_spec.rb +++ b/spec/ruby/library/prime/prime_division_spec.rb @@ -16,10 +16,10 @@ describe "Prime.prime_division" do end it "includes [[-1, 1]] in the divisors of a negative number" do - Prime.prime_division(-10).should include([-1, 1]) + Prime.prime_division(-10).should.include?([-1, 1]) end it "raises ZeroDivisionError for 0" do - lambda { Prime.prime_division(0) }.should raise_error(ZeroDivisionError) + -> { Prime.prime_division(0) }.should.raise(ZeroDivisionError) end end diff --git a/spec/ruby/library/prime/prime_spec.rb b/spec/ruby/library/prime/prime_spec.rb index 0896c7f0f3..207c763aed 100644 --- a/spec/ruby/library/prime/prime_spec.rb +++ b/spec/ruby/library/prime/prime_spec.rb @@ -3,15 +3,15 @@ require 'prime' describe "Prime#prime?" do it "returns a true value for prime numbers" do - Prime.prime?(2).should be_true - Prime.prime?(3).should be_true - Prime.prime?(2**31-1).should be_true # 8th Mersenne prime (M8) + Prime.prime?(2).should == true + Prime.prime?(3).should == true + Prime.prime?(2**31-1).should == true # 8th Mersenne prime (M8) end it "returns a false value for composite numbers" do - Prime.prime?(4).should be_false - Prime.prime?(15).should be_false - Prime.prime?(2**32-1).should be_false - Prime.prime?( (2**17-1)*(2**19-1) ).should be_false # M6*M7 + Prime.prime?(4).should == false + Prime.prime?(15).should == false + Prime.prime?(2**32-1).should == false + Prime.prime?( (2**17-1)*(2**19-1) ).should == false # M6*M7 end end diff --git a/spec/ruby/library/random/formatter/alphanumeric_spec.rb b/spec/ruby/library/random/formatter/alphanumeric_spec.rb new file mode 100644 index 0000000000..62a4698d0d --- /dev/null +++ b/spec/ruby/library/random/formatter/alphanumeric_spec.rb @@ -0,0 +1,54 @@ +require_relative '../../../spec_helper' + +require 'random/formatter' + +describe "Random::Formatter#alphanumeric" do + before :each do + @object = Object.new + @object.extend(Random::Formatter) + @object.define_singleton_method(:bytes) do |n| + "\x00".b * n + end + end + + it "generates a random alphanumeric string" do + @object.alphanumeric.should =~ /\A[A-Za-z0-9]+\z/ + end + + it "has a default size of 16 characters" do + @object.alphanumeric.size.should == 16 + end + + it "accepts a 'size' argument" do + @object.alphanumeric(10).size.should == 10 + end + + it "uses the default size if 'nil' is given as size argument" do + @object.alphanumeric(nil).size.should == 16 + end + + it "raises an ArgumentError if the size is not numeric" do + -> { + @object.alphanumeric("10") + }.should.raise(ArgumentError) + end + + it "does not coerce the size argument with #to_int" do + size = mock("size") + size.should_not_receive(:to_int) + -> { + @object.alphanumeric(size) + }.should.raise(ArgumentError) + end + + it "accepts a 'chars' argument with the output alphabet" do + @object.alphanumeric(chars: ['a', 'b']).should =~ /\A[ab]+\z/ + end + + it "converts the elements of chars using #to_s" do + to_s = mock("to_s") + to_s.should_receive(:to_s).and_return("[mock to_s]") + # Using 1 value in chars results in an infinite loop + @object.alphanumeric(1, chars: [to_s, to_s]).should == "[mock to_s]" + end +end diff --git a/spec/ruby/library/rbconfig/rbconfig_spec.rb b/spec/ruby/library/rbconfig/rbconfig_spec.rb index caa557c32c..4195128a05 100644 --- a/spec/ruby/library/rbconfig/rbconfig_spec.rb +++ b/spec/ruby/library/rbconfig/rbconfig_spec.rb @@ -1,11 +1,163 @@ require_relative '../../spec_helper' require 'rbconfig' -describe 'RbConfig::CONFIG values' do - it 'are all strings' do +describe 'RbConfig::CONFIG' do + it 'values are all strings' do RbConfig::CONFIG.each do |k, v| - k.should be_kind_of String - v.should be_kind_of String + k.should.is_a? String + v.should.is_a? String + end + end + + it 'has MAJOR, MINOR, TEENY, and PATCHLEVEL matching RUBY_VERSION and RUBY_PATCHLEVEL' do + major, minor, teeny = RUBY_VERSION.split('.') + RbConfig::CONFIG.values_at("MAJOR", "MINOR", "TEENY", "PATCHLEVEL").should == [ + major, minor, teeny, RUBY_PATCHLEVEL.to_s + ] + end + + # These directories have no meanings before the installation. + guard -> { RbConfig::TOPDIR } do + it "['rubylibdir'] returns the directory containing Ruby standard libraries" do + rubylibdir = RbConfig::CONFIG['rubylibdir'] + File.directory?(rubylibdir).should == true + File.should.exist?("#{rubylibdir}/fileutils.rb") + end + + it "['archdir'] returns the directory containing standard libraries C extensions" do + archdir = RbConfig::CONFIG['archdir'] + File.directory?(archdir).should == true + File.should.exist?("#{archdir}/etc.#{RbConfig::CONFIG['DLEXT']}") + end + + it "['sitelibdir'] is set and is part of $LOAD_PATH" do + sitelibdir = RbConfig::CONFIG['sitelibdir'] + sitelibdir.should.is_a? String + $LOAD_PATH.map{|path| File.realpath(path) rescue path }.should.include? sitelibdir + end + end + + it "contains no frozen strings even with --enable-frozen-string-literal" do + ruby_exe(<<-RUBY, options: '--enable-frozen-string-literal').should == "Done\n" + require 'rbconfig' + RbConfig::CONFIG.each do |k, v| + if v.frozen? + puts "\#{k} Failure" + end + end + puts 'Done' + RUBY + end + + platform_is_not :windows do + it "['LIBRUBY'] is the same as LIBRUBY_SO if and only if ENABLE_SHARED" do + case RbConfig::CONFIG['ENABLE_SHARED'] + when 'yes' + RbConfig::CONFIG['LIBRUBY'].should == RbConfig::CONFIG['LIBRUBY_SO'] + when 'no' + RbConfig::CONFIG['LIBRUBY'].should_not == RbConfig::CONFIG['LIBRUBY_SO'] + end + end + end + + guard -> { RbConfig::TOPDIR } do + it "libdir/LIBRUBY_SO is the path to libruby and it exists if and only if ENABLE_SHARED" do + libdirname = RbConfig::CONFIG['LIBPATHENV'] == 'PATH' ? 'bindir' : + RbConfig::CONFIG['libdirname'] + libdir = RbConfig::CONFIG[libdirname] + libruby_so = "#{libdir}/#{RbConfig::CONFIG['LIBRUBY_SO']}" + case RbConfig::CONFIG['ENABLE_SHARED'] + when 'yes' + File.should.exist?(libruby_so) + when 'no' + File.should_not.exist?(libruby_so) + end + end + end + + platform_is :linux do + it "['AR'] exists and can be executed" do + ar = RbConfig::CONFIG.fetch('AR') + out = `#{ar} --version` + $?.should.success? + out.should_not.empty? + end + + it "['STRIP'] exists and can be executed" do + strip = RbConfig::CONFIG.fetch('STRIP') + copy = tmp("sh") + cp '/bin/sh', copy + begin + out = `#{strip} #{copy}` + $?.should.success? + ensure + rm_r copy + end + end + end + + guard -> { %w[aarch64 arm64].include? RbConfig::CONFIG['host_cpu'] } do + it "['host_cpu'] returns CPU architecture properly for AArch64" do + platform_is :darwin do + RbConfig::CONFIG['host_cpu'].should == 'arm64' + end + + platform_is_not :darwin do + RbConfig::CONFIG['host_cpu'].should == 'aarch64' + end + end + end + + guard -> { platform_is(:linux) || platform_is(:darwin) } do + it "['host_os'] returns a proper OS name or platform" do + platform_is :darwin do + RbConfig::CONFIG['host_os'].should.match?(/darwin/) + end + + platform_is :linux do + RbConfig::CONFIG['host_os'].should.match?(/linux/) + end + end + end +end + +describe "RbConfig::TOPDIR" do + it "either returns nil (if not installed) or the prefix" do + if RbConfig::TOPDIR + RbConfig::TOPDIR.should == RbConfig::CONFIG["prefix"] + else + RbConfig::TOPDIR.should == nil + end + end +end + +describe "RUBY_PLATFORM" do + it "RUBY_PLATFORM contains a proper CPU architecture" do + RUBY_PLATFORM.should.include? RbConfig::CONFIG['host_cpu'] + end + + guard -> { platform_is(:linux) || platform_is(:darwin) } do + it "RUBY_PLATFORM contains OS name" do + # don't use RbConfig::CONFIG['host_os'] as far as it could be slightly different, e.g. linux-gnu + platform_is(:linux) do + RUBY_PLATFORM.should.include? 'linux' + end + + platform_is(:darwin) do + RUBY_PLATFORM.should.include? 'darwin' + end + end + end +end + +describe "RUBY_DESCRIPTION" do + guard_not -> { RUBY_ENGINE == "ruby" && !RbConfig::TOPDIR } do + it "contains version" do + RUBY_DESCRIPTION.should.include? RUBY_VERSION + end + + it "contains RUBY_PLATFORM" do + RUBY_DESCRIPTION.should.include? RUBY_PLATFORM end end end diff --git a/spec/ruby/library/rbconfig/sizeof/limits_spec.rb b/spec/ruby/library/rbconfig/sizeof/limits_spec.rb new file mode 100644 index 0000000000..08b1185965 --- /dev/null +++ b/spec/ruby/library/rbconfig/sizeof/limits_spec.rb @@ -0,0 +1,40 @@ +require_relative '../../../spec_helper' +require 'rbconfig/sizeof' + +describe "RbConfig::LIMITS" do + it "is a Hash" do + RbConfig::LIMITS.should.is_a?(Hash) + end + + it "has string keys and numeric values" do + RbConfig::LIMITS.each do |key, value| + key.should.is_a? String + value.should.is_a? Numeric + end + end + + it "contains FIXNUM_MIN and FIXNUM_MAX" do + RbConfig::LIMITS["FIXNUM_MIN"].should < 0 + RbConfig::LIMITS["FIXNUM_MAX"].should > 0 + end + + it "contains CHAR_MIN and CHAR_MAX" do + RbConfig::LIMITS["CHAR_MIN"].should <= 0 + RbConfig::LIMITS["CHAR_MAX"].should > 0 + end + + it "contains SHRT_MIN and SHRT_MAX" do + RbConfig::LIMITS["SHRT_MIN"].should == -32768 + RbConfig::LIMITS["SHRT_MAX"].should == 32767 + end + + it "contains INT_MIN and INT_MAX" do + RbConfig::LIMITS["INT_MIN"].should < 0 + RbConfig::LIMITS["INT_MAX"].should > 0 + end + + it "contains LONG_MIN and LONG_MAX" do + RbConfig::LIMITS["LONG_MIN"].should < 0 + RbConfig::LIMITS["LONG_MAX"].should > 0 + end +end diff --git a/spec/ruby/library/rbconfig/sizeof/sizeof_spec.rb b/spec/ruby/library/rbconfig/sizeof/sizeof_spec.rb index f2582dc4fd..b74dae5166 100644 --- a/spec/ruby/library/rbconfig/sizeof/sizeof_spec.rb +++ b/spec/ruby/library/rbconfig/sizeof/sizeof_spec.rb @@ -3,13 +3,13 @@ require 'rbconfig/sizeof' describe "RbConfig::SIZEOF" do it "is a Hash" do - RbConfig::SIZEOF.should be_kind_of(Hash) + RbConfig::SIZEOF.should.is_a?(Hash) end it "has string keys and integer values" do RbConfig::SIZEOF.each do |key, value| - key.should be_kind_of String - value.should be_kind_of Integer + key.should.is_a? String + value.should.is_a? Integer end end diff --git a/spec/ruby/library/rbconfig/unicode_emoji_version_spec.rb b/spec/ruby/library/rbconfig/unicode_emoji_version_spec.rb new file mode 100644 index 0000000000..521a750bf7 --- /dev/null +++ b/spec/ruby/library/rbconfig/unicode_emoji_version_spec.rb @@ -0,0 +1,17 @@ +require_relative '../../spec_helper' +require 'rbconfig' + +describe "RbConfig::CONFIG['UNICODE_EMOJI_VERSION']" do + ruby_version_is ""..."3.4" do + it "is 15.0" do + RbConfig::CONFIG['UNICODE_EMOJI_VERSION'].should == "15.0" + end + end + + # Caution: ruby_version_is means is_or_later + ruby_version_is "4.0" do + it "is 17.0" do + RbConfig::CONFIG['UNICODE_EMOJI_VERSION'].should == "17.0" + end + end +end diff --git a/spec/ruby/library/rbconfig/unicode_version_spec.rb b/spec/ruby/library/rbconfig/unicode_version_spec.rb new file mode 100644 index 0000000000..5cdde74f79 --- /dev/null +++ b/spec/ruby/library/rbconfig/unicode_version_spec.rb @@ -0,0 +1,17 @@ +require_relative '../../spec_helper' +require 'rbconfig' + +describe "RbConfig::CONFIG['UNICODE_VERSION']" do + ruby_version_is ""..."3.4" do + it "is 15.0.0" do + RbConfig::CONFIG['UNICODE_VERSION'].should == "15.0.0" + end + end + + # Caution: ruby_version_is means is_or_later + ruby_version_is "4.0" do + it "is 17.0.0" do + RbConfig::CONFIG['UNICODE_VERSION'].should == "17.0.0" + end + end +end diff --git a/spec/ruby/library/readline/basic_quote_characters_spec.rb b/spec/ruby/library/readline/basic_quote_characters_spec.rb index 216899d875..f6467c8be4 100644 --- a/spec/ruby/library/readline/basic_quote_characters_spec.rb +++ b/spec/ruby/library/readline/basic_quote_characters_spec.rb @@ -4,7 +4,7 @@ platform_is_not :darwin do with_feature :readline do describe "Readline.basic_quote_characters" do it "returns not nil" do - Readline.basic_quote_characters.should_not be_nil + Readline.basic_quote_characters.should_not == nil end end diff --git a/spec/ruby/library/readline/basic_word_break_characters_spec.rb b/spec/ruby/library/readline/basic_word_break_characters_spec.rb index daa0e1cb76..ef05d6560b 100644 --- a/spec/ruby/library/readline/basic_word_break_characters_spec.rb +++ b/spec/ruby/library/readline/basic_word_break_characters_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.basic_word_break_characters" do it "returns not nil" do - Readline.basic_word_break_characters.should_not be_nil + Readline.basic_word_break_characters.should_not == nil end end diff --git a/spec/ruby/library/readline/completer_quote_characters_spec.rb b/spec/ruby/library/readline/completer_quote_characters_spec.rb index 86c58f3cf6..1109ea1f03 100644 --- a/spec/ruby/library/readline/completer_quote_characters_spec.rb +++ b/spec/ruby/library/readline/completer_quote_characters_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.completer_quote_characters" do it "returns nil" do - Readline.completer_quote_characters.should be_nil + Readline.completer_quote_characters.should == nil end end diff --git a/spec/ruby/library/readline/completer_word_break_characters_spec.rb b/spec/ruby/library/readline/completer_word_break_characters_spec.rb index c72f1135c4..91a002b9de 100644 --- a/spec/ruby/library/readline/completer_word_break_characters_spec.rb +++ b/spec/ruby/library/readline/completer_word_break_characters_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.completer_word_break_characters" do it "returns nil" do - Readline.completer_word_break_characters.should be_nil + Readline.completer_word_break_characters.should == nil end end diff --git a/spec/ruby/library/readline/completion_append_character_spec.rb b/spec/ruby/library/readline/completion_append_character_spec.rb index 615b523f4e..2a14d5d30e 100644 --- a/spec/ruby/library/readline/completion_append_character_spec.rb +++ b/spec/ruby/library/readline/completion_append_character_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.completion_append_character" do it "returns not nil" do - Readline.completion_append_character.should_not be_nil + Readline.completion_append_character.should_not == nil end end diff --git a/spec/ruby/library/readline/completion_case_fold_spec.rb b/spec/ruby/library/readline/completion_case_fold_spec.rb index 966f5d6c79..b6a4aab101 100644 --- a/spec/ruby/library/readline/completion_case_fold_spec.rb +++ b/spec/ruby/library/readline/completion_case_fold_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.completion_case_fold" do it "returns nil" do - Readline.completion_case_fold.should be_nil + Readline.completion_case_fold.should == nil end end diff --git a/spec/ruby/library/readline/completion_proc_spec.rb b/spec/ruby/library/readline/completion_proc_spec.rb index 721acaa1d0..037fc6de21 100644 --- a/spec/ruby/library/readline/completion_proc_spec.rb +++ b/spec/ruby/library/readline/completion_proc_spec.rb @@ -3,7 +3,7 @@ require_relative 'spec_helper' with_feature :readline do describe "Readline.completion_proc" do it "returns nil" do - Readline.completion_proc.should be_nil + Readline.completion_proc.should == nil end end @@ -16,7 +16,7 @@ with_feature :readline do end it "returns an ArgumentError if not given an Proc or #call" do - lambda { Readline.completion_proc = "test" }.should raise_error(ArgumentError) + -> { Readline.completion_proc = "test" }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/readline/constants_spec.rb b/spec/ruby/library/readline/constants_spec.rb index 8fee274866..91536ce1cc 100644 --- a/spec/ruby/library/readline/constants_spec.rb +++ b/spec/ruby/library/readline/constants_spec.rb @@ -11,8 +11,8 @@ with_feature :readline do describe "Readline::VERSION" do it "is defined and is a non-empty String" do Readline.const_defined?(:VERSION).should == true - Readline::VERSION.should be_kind_of(String) - Readline::VERSION.should_not be_empty + Readline::VERSION.should.is_a?(String) + Readline::VERSION.should_not.empty? end end end diff --git a/spec/ruby/library/readline/emacs_editing_mode_spec.rb b/spec/ruby/library/readline/emacs_editing_mode_spec.rb index f7e8eda982..93ded3d023 100644 --- a/spec/ruby/library/readline/emacs_editing_mode_spec.rb +++ b/spec/ruby/library/readline/emacs_editing_mode_spec.rb @@ -4,7 +4,7 @@ platform_is_not :darwin do with_feature :readline do describe "Readline.emacs_editing_mode" do it "returns nil" do - Readline.emacs_editing_mode.should be_nil + Readline.emacs_editing_mode.should == nil end end end diff --git a/spec/ruby/library/readline/filename_quote_characters_spec.rb b/spec/ruby/library/readline/filename_quote_characters_spec.rb index de8ce700a8..6bcb04fc79 100644 --- a/spec/ruby/library/readline/filename_quote_characters_spec.rb +++ b/spec/ruby/library/readline/filename_quote_characters_spec.rb @@ -4,7 +4,7 @@ platform_is_not :darwin do with_feature :readline do describe "Readline.filename_quote_characters" do it "returns nil" do - Readline.filename_quote_characters.should be_nil + Readline.filename_quote_characters.should == nil end end diff --git a/spec/ruby/library/readline/history/append_spec.rb b/spec/ruby/library/readline/history/append_spec.rb index ee26b01255..be0e515b84 100644 --- a/spec/ruby/library/readline/history/append_spec.rb +++ b/spec/ruby/library/readline/history/append_spec.rb @@ -22,7 +22,7 @@ with_feature :readline do end it "raises a TypeError when the passed Object can't be converted to a String" do - lambda { Readline::HISTORY << mock("Object") }.should raise_error(TypeError) + -> { Readline::HISTORY << mock("Object") }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/readline/history/delete_at_spec.rb b/spec/ruby/library/readline/history/delete_at_spec.rb index 407006c20c..4383ff7e83 100644 --- a/spec/ruby/library/readline/history/delete_at_spec.rb +++ b/spec/ruby/library/readline/history/delete_at_spec.rb @@ -31,15 +31,8 @@ with_feature :readline do end it "raises an IndexError when the given index is greater than the history size" do - lambda { Readline::HISTORY.delete_at(10) }.should raise_error(IndexError) - lambda { Readline::HISTORY.delete_at(-10) }.should raise_error(IndexError) - end - - it "taints the returned strings" do - Readline::HISTORY.push("1", "2", "3") - Readline::HISTORY.delete_at(0).tainted?.should be_true - Readline::HISTORY.delete_at(0).tainted?.should be_true - Readline::HISTORY.delete_at(0).tainted?.should be_true + -> { Readline::HISTORY.delete_at(10) }.should.raise(IndexError) + -> { Readline::HISTORY.delete_at(-10) }.should.raise(IndexError) end end end diff --git a/spec/ruby/library/readline/history/each_spec.rb b/spec/ruby/library/readline/history/each_spec.rb index 4b87df7640..aa48dd46df 100644 --- a/spec/ruby/library/readline/history/each_spec.rb +++ b/spec/ruby/library/readline/history/each_spec.rb @@ -19,11 +19,5 @@ with_feature :readline do end result.should == ["1", "2", "3"] end - - it "yields tainted Objects" do - Readline::HISTORY.each do |x| - x.tainted?.should be_true - end - end end end diff --git a/spec/ruby/library/readline/history/element_reference_spec.rb b/spec/ruby/library/readline/history/element_reference_spec.rb index a85d069111..1f1642626f 100644 --- a/spec/ruby/library/readline/history/element_reference_spec.rb +++ b/spec/ruby/library/readline/history/element_reference_spec.rb @@ -12,11 +12,6 @@ with_feature :readline do Readline::HISTORY.pop end - it "returns tainted objects" do - Readline::HISTORY[0].tainted?.should be_true - Readline::HISTORY[1].tainted?.should be_true - end - it "returns the history item at the passed index" do Readline::HISTORY[0].should == "1" Readline::HISTORY[1].should == "2" @@ -28,13 +23,13 @@ with_feature :readline do end it "raises an IndexError when there is no item at the passed index" do - lambda { Readline::HISTORY[-10] }.should raise_error(IndexError) - lambda { Readline::HISTORY[-9] }.should raise_error(IndexError) - lambda { Readline::HISTORY[-8] }.should raise_error(IndexError) + -> { Readline::HISTORY[-10] }.should.raise(IndexError) + -> { Readline::HISTORY[-9] }.should.raise(IndexError) + -> { Readline::HISTORY[-8] }.should.raise(IndexError) - lambda { Readline::HISTORY[8] }.should raise_error(IndexError) - lambda { Readline::HISTORY[9] }.should raise_error(IndexError) - lambda { Readline::HISTORY[10] }.should raise_error(IndexError) + -> { Readline::HISTORY[8] }.should.raise(IndexError) + -> { Readline::HISTORY[9] }.should.raise(IndexError) + -> { Readline::HISTORY[10] }.should.raise(IndexError) end end end diff --git a/spec/ruby/library/readline/history/element_set_spec.rb b/spec/ruby/library/readline/history/element_set_spec.rb index 67ecf0ef2b..0787b6343d 100644 --- a/spec/ruby/library/readline/history/element_set_spec.rb +++ b/spec/ruby/library/readline/history/element_set_spec.rb @@ -17,7 +17,7 @@ with_feature :readline do end it "raises an IndexError when there is no item at the passed positive index" do - lambda { Readline::HISTORY[10] = "test" }.should raise_error(IndexError) + -> { Readline::HISTORY[10] = "test" }.should.raise(IndexError) end it "sets the item at the given index" do @@ -29,7 +29,7 @@ with_feature :readline do end it "raises an IndexError when there is no item at the passed negative index" do - lambda { Readline::HISTORY[10] = "test" }.should raise_error(IndexError) + -> { Readline::HISTORY[10] = "test" }.should.raise(IndexError) end end end diff --git a/spec/ruby/library/readline/history/empty_spec.rb b/spec/ruby/library/readline/history/empty_spec.rb index 31d01d9601..5b722dccd3 100644 --- a/spec/ruby/library/readline/history/empty_spec.rb +++ b/spec/ruby/library/readline/history/empty_spec.rb @@ -3,11 +3,11 @@ require_relative '../spec_helper' with_feature :readline do describe "Readline::HISTORY.empty?" do it "returns true when the history is empty" do - Readline::HISTORY.should be_empty + Readline::HISTORY.should.empty? Readline::HISTORY.push("test") - Readline::HISTORY.should_not be_empty + Readline::HISTORY.should_not.empty? Readline::HISTORY.pop - Readline::HISTORY.should be_empty + Readline::HISTORY.should.empty? end end end diff --git a/spec/ruby/library/readline/history/history_spec.rb b/spec/ruby/library/readline/history/history_spec.rb index 927dd52ebf..3233071033 100644 --- a/spec/ruby/library/readline/history/history_spec.rb +++ b/spec/ruby/library/readline/history/history_spec.rb @@ -3,7 +3,7 @@ require_relative '../spec_helper' with_feature :readline do describe "Readline::HISTORY" do it "is extended with the Enumerable module" do - Readline::HISTORY.should be_kind_of(Enumerable) + Readline::HISTORY.should.is_a?(Enumerable) end end end diff --git a/spec/ruby/library/readline/history/pop_spec.rb b/spec/ruby/library/readline/history/pop_spec.rb index 3a4c3579d0..0b780a38cc 100644 --- a/spec/ruby/library/readline/history/pop_spec.rb +++ b/spec/ruby/library/readline/history/pop_spec.rb @@ -3,7 +3,7 @@ require_relative '../spec_helper' with_feature :readline do describe "Readline::HISTORY.pop" do it "returns nil when the history is empty" do - Readline::HISTORY.pop.should be_nil + Readline::HISTORY.pop.should == nil end it "returns and removes the last item from the history" do @@ -19,12 +19,5 @@ with_feature :readline do Readline::HISTORY.pop.should == "1" Readline::HISTORY.size.should == 0 end - - it "taints the returned strings" do - Readline::HISTORY.push("1", "2", "3") - Readline::HISTORY.pop.tainted?.should be_true - Readline::HISTORY.pop.tainted?.should be_true - Readline::HISTORY.pop.tainted?.should be_true - end end end diff --git a/spec/ruby/library/readline/history/push_spec.rb b/spec/ruby/library/readline/history/push_spec.rb index f91121f351..4bbf1763a1 100644 --- a/spec/ruby/library/readline/history/push_spec.rb +++ b/spec/ruby/library/readline/history/push_spec.rb @@ -20,7 +20,7 @@ with_feature :readline do end it "raises a TypeError when the passed Object can't be converted to a String" do - lambda { Readline::HISTORY.push(mock("Object")) }.should raise_error(TypeError) + -> { Readline::HISTORY.push(mock("Object")) }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/readline/history/shift_spec.rb b/spec/ruby/library/readline/history/shift_spec.rb index fdc637fc35..d852480a2a 100644 --- a/spec/ruby/library/readline/history/shift_spec.rb +++ b/spec/ruby/library/readline/history/shift_spec.rb @@ -3,7 +3,7 @@ require_relative '../spec_helper' with_feature :readline do describe "Readline::HISTORY.shift" do it "returns nil when the history is empty" do - Readline::HISTORY.shift.should be_nil + Readline::HISTORY.shift.should == nil end it "returns and removes the first item from the history" do @@ -19,12 +19,5 @@ with_feature :readline do Readline::HISTORY.shift.should == "3" Readline::HISTORY.size.should == 0 end - - it "taints the returned strings" do - Readline::HISTORY.push("1", "2", "3") - Readline::HISTORY.shift.tainted?.should be_true - Readline::HISTORY.shift.tainted?.should be_true - Readline::HISTORY.shift.tainted?.should be_true - end end end diff --git a/spec/ruby/library/readline/readline_spec.rb b/spec/ruby/library/readline/readline_spec.rb index f716d7b2df..6e349ad543 100644 --- a/spec/ruby/library/readline/readline_spec.rb +++ b/spec/ruby/library/readline/readline_spec.rb @@ -21,11 +21,6 @@ with_feature :readline do ruby_exe('File.write ARGV[0], Readline.readline', @options) File.read(@out).should == "test" end - - it "taints the returned strings" do - ruby_exe('File.write ARGV[0], Readline.readline.tainted?', @options) - File.read(@out).should == "true" - end end end end diff --git a/spec/ruby/library/readline/spec_helper.rb b/spec/ruby/library/readline/spec_helper.rb index 56077c53c4..32d820f7ac 100644 --- a/spec/ruby/library/readline/spec_helper.rb +++ b/spec/ruby/library/readline/spec_helper.rb @@ -4,8 +4,8 @@ begin require 'readline' rescue LoadError else - # rb-readline behaves quite differently - unless defined?(RbReadline) + # rb-readline and reline behave quite differently + unless defined?(RbReadline) or defined?(Reline) MSpec.enable_feature :readline end end diff --git a/spec/ruby/library/readline/vi_editing_mode_spec.rb b/spec/ruby/library/readline/vi_editing_mode_spec.rb index 6622962ceb..3ce4f5a7e6 100644 --- a/spec/ruby/library/readline/vi_editing_mode_spec.rb +++ b/spec/ruby/library/readline/vi_editing_mode_spec.rb @@ -4,7 +4,7 @@ platform_is_not :darwin do with_feature :readline do describe "Readline.vi_editing_mode" do it "returns nil" do - Readline.vi_editing_mode.should be_nil + Readline.vi_editing_mode.should == nil end end end diff --git a/spec/ruby/library/resolv/fixtures/hosts b/spec/ruby/library/resolv/fixtures/hosts new file mode 100644 index 0000000000..a50f3d6a69 --- /dev/null +++ b/spec/ruby/library/resolv/fixtures/hosts @@ -0,0 +1 @@ +127.0.0.1 localhost localhost4 diff --git a/spec/ruby/library/resolv/get_address_spec.rb b/spec/ruby/library/resolv/get_address_spec.rb index 3506a652b6..9caa94643a 100644 --- a/spec/ruby/library/resolv/get_address_spec.rb +++ b/spec/ruby/library/resolv/get_address_spec.rb @@ -2,20 +2,18 @@ require_relative '../../spec_helper' require 'resolv' describe "Resolv#getaddress" do - platform_is_not :windows do - it "resolves localhost" do - res = Resolv.new([Resolv::Hosts.new]) + it "resolves localhost" do + hosts = Resolv::Hosts.new(fixture(__FILE__ , "hosts")) + res = Resolv.new([hosts]) - lambda { - res.getaddress("localhost") - }.should_not raise_error(Resolv::ResolvError) - end + res.getaddress("localhost").should == "127.0.0.1" + res.getaddress("localhost4").should == "127.0.0.1" end it "raises ResolvError if the name can not be looked up" do res = Resolv.new([]) - lambda { + -> { res.getaddress("should.raise.error.") - }.should raise_error(Resolv::ResolvError) + }.should.raise(Resolv::ResolvError) end end diff --git a/spec/ruby/library/resolv/get_addresses_spec.rb b/spec/ruby/library/resolv/get_addresses_spec.rb index c484161163..b84f29b7da 100644 --- a/spec/ruby/library/resolv/get_addresses_spec.rb +++ b/spec/ruby/library/resolv/get_addresses_spec.rb @@ -2,13 +2,11 @@ require_relative '../../spec_helper' require 'resolv' describe "Resolv#getaddresses" do - platform_is_not :windows do - it "resolves localhost" do - res = Resolv.new([Resolv::Hosts.new]) + it "resolves localhost" do + hosts = Resolv::Hosts.new(fixture(__FILE__ , "hosts")) + res = Resolv.new([hosts]) - addresses = res.getaddresses("localhost") - addresses.should_not == nil - addresses.size.should > 0 - end + res.getaddresses("localhost").should == ["127.0.0.1"] + res.getaddresses("localhost4").should == ["127.0.0.1"] end end diff --git a/spec/ruby/library/resolv/get_name_spec.rb b/spec/ruby/library/resolv/get_name_spec.rb index 0433836b5f..81e0cda28d 100644 --- a/spec/ruby/library/resolv/get_name_spec.rb +++ b/spec/ruby/library/resolv/get_name_spec.rb @@ -2,18 +2,17 @@ require_relative '../../spec_helper' require 'resolv' describe "Resolv#getname" do - platform_is_not :windows do - it "resolves 127.0.0.1" do - lambda { - Resolv.getname("127.0.0.1") - }.should_not raise_error(Resolv::ResolvError) - end + it "resolves 127.0.0.1" do + hosts = Resolv::Hosts.new(fixture(__FILE__ , "hosts")) + res = Resolv.new([hosts]) + + res.getname("127.0.0.1").should == "localhost" end it "raises ResolvError when there is no result" do res = Resolv.new([]) - lambda { + -> { res.getname("should.raise.error") - }.should raise_error(Resolv::ResolvError) + }.should.raise(Resolv::ResolvError) end end diff --git a/spec/ruby/library/resolv/get_names_spec.rb b/spec/ruby/library/resolv/get_names_spec.rb index fa77ba771f..c405360615 100644 --- a/spec/ruby/library/resolv/get_names_spec.rb +++ b/spec/ruby/library/resolv/get_names_spec.rb @@ -2,13 +2,10 @@ require_relative '../../spec_helper' require 'resolv' describe "Resolv#getnames" do - platform_is_not :windows do - it "resolves 127.0.0.1" do - res = Resolv.new([Resolv::Hosts.new]) + it "resolves 127.0.0.1" do + hosts = Resolv::Hosts.new(fixture(__FILE__ , "hosts")) + res = Resolv.new([hosts]) - names = res.getnames("127.0.0.1") - names.should_not == nil - names.size.should > 0 - end + names = res.getnames("127.0.0.1").should == ["localhost", "localhost4"] end end diff --git a/spec/ruby/library/rexml/attribute/clone_spec.rb b/spec/ruby/library/rexml/attribute/clone_spec.rb deleted file mode 100644 index 9a4a4079e1..0000000000 --- a/spec/ruby/library/rexml/attribute/clone_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#clone" do - it "returns a copy of this Attribute" do - orig = REXML::Attribute.new("name", "value&&") - orig.should == orig.clone - orig.clone.to_s.should == orig.to_s - orig.clone.to_string.should == orig.to_string - end -end diff --git a/spec/ruby/library/rexml/attribute/element_spec.rb b/spec/ruby/library/rexml/attribute/element_spec.rb deleted file mode 100644 index 832e7e9a41..0000000000 --- a/spec/ruby/library/rexml/attribute/element_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#element" do - it "returns the parent element" do - e = REXML::Element.new "root" - - REXML::Attribute.new("name", "value", e).element.should == e - REXML::Attribute.new("name", "default_constructor").element.should == nil - end -end - -describe "REXML::Attribute#element=" do - it "sets the parent element" do - e = REXML::Element.new "root" - f = REXML::Element.new "temp" - a = REXML::Attribute.new("name", "value", e) - a.element.should == e - - a.element = f - a.element.should == f - end -end diff --git a/spec/ruby/library/rexml/attribute/equal_value_spec.rb b/spec/ruby/library/rexml/attribute/equal_value_spec.rb deleted file mode 100644 index 8bf2c0a3a1..0000000000 --- a/spec/ruby/library/rexml/attribute/equal_value_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#==" do - it "returns true if other has equal name and value" do - a1 = REXML::Attribute.new("foo", "bar") - a1.should == a1.clone - - a2 = REXML::Attribute.new("foo", "bar") - a1.should == a2 - - a3 = REXML::Attribute.new("foo", "bla") - a1.should_not == a3 - - a4 = REXML::Attribute.new("baz", "bar") - a1.should_not == a4 - end -end diff --git a/spec/ruby/library/rexml/attribute/hash_spec.rb b/spec/ruby/library/rexml/attribute/hash_spec.rb deleted file mode 100644 index dd71b28108..0000000000 --- a/spec/ruby/library/rexml/attribute/hash_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#hash" do - # These are not really complete, any idea on how to make them more - # "testable" will be appreciated. - it "returns a hashcode made of the name and value of self" do - a = REXML::Attribute.new("name", "value") - a.hash.should be_kind_of(Numeric) - b = REXML::Attribute.new(a) - a.hash.should == b.hash - end -end diff --git a/spec/ruby/library/rexml/attribute/initialize_spec.rb b/spec/ruby/library/rexml/attribute/initialize_spec.rb deleted file mode 100644 index 3452b6c864..0000000000 --- a/spec/ruby/library/rexml/attribute/initialize_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#initialize" do - before :each do - @e = REXML::Element.new "root" - @name = REXML::Attribute.new("name", "Nicko") - @e.add_attribute @name - end - - it "receives two strings for name and value" do - @e.attributes["name"].should == "Nicko" - @e.add_attribute REXML::Attribute.new("last_name", nil) - @e.attributes["last_name"].should == "" - end - - it "receives an Attribute and clones it" do - copy = REXML::Attribute.new(@name) - copy.should == @name - end - - it "recives a parent node" do - last_name = REXML::Attribute.new("last_name", "McBrain", @e) - last_name.element.should == @e - - last_name = REXML::Attribute.new(@name, @e) - last_name.element.should == @e - end -end diff --git a/spec/ruby/library/rexml/attribute/inspect_spec.rb b/spec/ruby/library/rexml/attribute/inspect_spec.rb deleted file mode 100644 index 86a437ec74..0000000000 --- a/spec/ruby/library/rexml/attribute/inspect_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#inspect" do - it "returns the name and value as a string" do - a = REXML::Attribute.new("my_name", "my_value") - a.inspect.should == "my_name='my_value'" - end - - it "accepts attributes with no value" do - a = REXML::Attribute.new("my_name") - a.inspect.should == "my_name=''" - end - - it "does not escape text" do - a = REXML::Attribute.new("&&", "<>") - a.inspect.should == "&&='<>'" - end -end diff --git a/spec/ruby/library/rexml/attribute/namespace_spec.rb b/spec/ruby/library/rexml/attribute/namespace_spec.rb deleted file mode 100644 index 9d50770735..0000000000 --- a/spec/ruby/library/rexml/attribute/namespace_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#namespace" do - it "returns the namespace url" do - e = REXML::Element.new("root") - e.add_attribute REXML::Attribute.new("xmlns:ns", "http://some_uri") - e.namespace("ns").should == "http://some_uri" - end - - it "returns nil if namespace is not defined" do - e = REXML::Element.new("root") - e.add_attribute REXML::Attribute.new("test", "value") - e.namespace("test").should == nil - e.namespace("ns").should == nil - end - - it "defaults arg to nil" do - e = REXML::Element.new("root") - e.add_attribute REXML::Attribute.new("xmlns:ns", "http://some_uri") - e.namespace.should == "" - e.namespace("ns").should == "http://some_uri" - end -end diff --git a/spec/ruby/library/rexml/attribute/node_type_spec.rb b/spec/ruby/library/rexml/attribute/node_type_spec.rb deleted file mode 100644 index 664d7cfa03..0000000000 --- a/spec/ruby/library/rexml/attribute/node_type_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#node_type" do - it "always returns :attribute" do - attr = REXML::Attribute.new("foo", "bar") - attr.node_type.should == :attribute - REXML::Attribute.new(attr).node_type.should == :attribute - end -end diff --git a/spec/ruby/library/rexml/attribute/prefix_spec.rb b/spec/ruby/library/rexml/attribute/prefix_spec.rb deleted file mode 100644 index 2a47f74ad1..0000000000 --- a/spec/ruby/library/rexml/attribute/prefix_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#prefix" do - it "returns the namespace of the Attribute" do - ans = REXML::Attribute.new("ns:someattr", "some_value") - out = REXML::Attribute.new("out:something", "some_other_value") - - ans.prefix.should == "ns" - out.prefix.should == "out" - end - - it "returns an empty string for Attributes with no prefixes" do - attr = REXML::Attribute.new("foo", "bar") - - attr.prefix.should == "" - end -end diff --git a/spec/ruby/library/rexml/attribute/remove_spec.rb b/spec/ruby/library/rexml/attribute/remove_spec.rb deleted file mode 100644 index b97b860a5f..0000000000 --- a/spec/ruby/library/rexml/attribute/remove_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#remove" do - before :each do - @e = REXML::Element.new "Root" - @attr = REXML::Attribute.new("foo", "bar") - end - - it "deletes this Attribute from parent" do - @e.add_attribute(@attr) - @e.attributes["foo"].should_not == nil - @attr.remove - @e.attributes["foo"].should == nil - end - - it "does not anything if element has no parent" do - lambda {@attr.remove}.should_not raise_error(Exception) - end -end diff --git a/spec/ruby/library/rexml/attribute/to_s_spec.rb b/spec/ruby/library/rexml/attribute/to_s_spec.rb deleted file mode 100644 index e1ce48ec33..0000000000 --- a/spec/ruby/library/rexml/attribute/to_s_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#to_s" do - it "returns the value of the Attribute" do - REXML::Attribute.new("name", "some_value").to_s.should == "some_value" - end - - it "returns the escaped value if it was created from Attribute" do - orig = REXML::Attribute.new("name", "<&>") - copy = REXML::Attribute.new(orig) - copy.to_s.should == "<&>" - end -end diff --git a/spec/ruby/library/rexml/attribute/to_string_spec.rb b/spec/ruby/library/rexml/attribute/to_string_spec.rb deleted file mode 100644 index 420913afeb..0000000000 --- a/spec/ruby/library/rexml/attribute/to_string_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#to_string" do - it "returns the attribute as XML" do - attr = REXML::Attribute.new("name", "value") - attr_empty = REXML::Attribute.new("name") - attr_ns = REXML::Attribute.new("xmlns:ns", "http://uri") - - attr.to_string.should == "name='value'" - attr_empty.to_string.should == "name=''" - attr_ns.to_string.should == "xmlns:ns='http://uri'" - end -end diff --git a/spec/ruby/library/rexml/attribute/value_spec.rb b/spec/ruby/library/rexml/attribute/value_spec.rb deleted file mode 100644 index 7763976881..0000000000 --- a/spec/ruby/library/rexml/attribute/value_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#value" do - it "returns the value of the Attribute unnormalized" do - attr = REXML::Attribute.new("name", "value") - attr_ents = REXML::Attribute.new("name", "<&>") - attr_empty = REXML::Attribute.new("name") - - attr.value.should == "value" - attr_ents.value.should == "<&>" - attr_empty.value.should == "" - end -end diff --git a/spec/ruby/library/rexml/attribute/write_spec.rb b/spec/ruby/library/rexml/attribute/write_spec.rb deleted file mode 100644 index 7ada7460f9..0000000000 --- a/spec/ruby/library/rexml/attribute/write_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#write" do - before :each do - @attr = REXML::Attribute.new("name", "Charlotte") - @s = "" - end - - it "writes the name and value to output" do - @attr.write(@s) - @s.should == "name='Charlotte'" - end - - it "currently ignores the second argument" do - @attr.write(@s, 3) - @s.should == "name='Charlotte'" - - @s = "" - @attr.write(@s, "foo") - @s.should == "name='Charlotte'" - end -end diff --git a/spec/ruby/library/rexml/attribute/xpath_spec.rb b/spec/ruby/library/rexml/attribute/xpath_spec.rb deleted file mode 100644 index beefb036cc..0000000000 --- a/spec/ruby/library/rexml/attribute/xpath_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attribute#xpath" do - - before :each do - @e = REXML::Element.new "root" - @attr = REXML::Attribute.new("year", "1989") - end - - it "returns the path for Attribute" do - @e.add_attribute @attr - @attr.xpath.should == "root/@year" - end - - it "raises an error if attribute has no parent" do - lambda { @attr.xpath }.should raise_error(Exception) - end -end diff --git a/spec/ruby/library/rexml/attributes/add_spec.rb b/spec/ruby/library/rexml/attributes/add_spec.rb deleted file mode 100644 index 32a927e10b..0000000000 --- a/spec/ruby/library/rexml/attributes/add_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/add' -require 'rexml/document' - -describe "REXML::Attributes#add" do - it_behaves_like :rexml_attribute_add, :add -end diff --git a/spec/ruby/library/rexml/attributes/append_spec.rb b/spec/ruby/library/rexml/attributes/append_spec.rb deleted file mode 100644 index f1b08f7d6a..0000000000 --- a/spec/ruby/library/rexml/attributes/append_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/add' -require 'rexml/document' - -describe "REXML::Attributes#<<" do - it_behaves_like :rexml_attribute_add, :<< -end diff --git a/spec/ruby/library/rexml/attributes/delete_all_spec.rb b/spec/ruby/library/rexml/attributes/delete_all_spec.rb deleted file mode 100644 index 9340b5693b..0000000000 --- a/spec/ruby/library/rexml/attributes/delete_all_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#delete_all" do - before :each do - @e = REXML::Element.new("root") - end - - it "deletes all attributes that match name" do - uri = REXML::Attribute.new("uri", "http://something") - @e.attributes << uri - @e.attributes.delete_all("uri") - @e.attributes.should be_empty - @e.attributes["uri"].should == nil - end - - it "deletes all attributes that match name with a namespace" do - ns_uri = REXML::Attribute.new("xmlns:uri", "http://something_here_too") - @e.attributes << ns_uri - @e.attributes.delete_all("xmlns:uri") - @e.attributes.should be_empty - @e.attributes["xmlns:uri"].should == nil - end - - it "returns the removed attribute" do - uri = REXML::Attribute.new("uri", "http://something_here_too") - @e.attributes << uri - attrs = @e.attributes.delete_all("uri") - attrs.first.should == uri - end -end diff --git a/spec/ruby/library/rexml/attributes/delete_spec.rb b/spec/ruby/library/rexml/attributes/delete_spec.rb deleted file mode 100644 index 495e4085ef..0000000000 --- a/spec/ruby/library/rexml/attributes/delete_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#delete" do - before :each do - @e = REXML::Element.new("root") - @name = REXML::Attribute.new("name", "Pepe") - end - - it "takes an attribute name and deletes the attribute" do - @e.attributes.delete("name") - @e.attributes["name"].should be_nil - @e.attributes.should be_empty - end - - it "takes an Attribute and deletes it" do - @e.attributes.delete(@name) - @e.attributes["name"].should be_nil - @e.attributes.should be_empty - end - - it "returns the element with the attribute removed" do - ret_val = @e.attributes.delete(@name) - ret_val.should == @e - ret_val.attributes.should be_empty - end -end diff --git a/spec/ruby/library/rexml/attributes/each_attribute_spec.rb b/spec/ruby/library/rexml/attributes/each_attribute_spec.rb deleted file mode 100644 index e84c8dbf51..0000000000 --- a/spec/ruby/library/rexml/attributes/each_attribute_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#each_attribute" do - it "iterates over the attributes yielding actual Attribute objects" do - e = REXML::Element.new("root") - name = REXML::Attribute.new("name", "Joe") - ns_uri = REXML::Attribute.new("xmlns:ns", "http://some_uri") - e.add_attribute name - e.add_attribute ns_uri - - attributes = [] - - e.attributes.each_attribute do |attr| - attributes << attr - end - - attributes = attributes.sort_by {|a| a.name } - attributes.first.should == name - attributes.last.should == ns_uri - end -end diff --git a/spec/ruby/library/rexml/attributes/each_spec.rb b/spec/ruby/library/rexml/attributes/each_spec.rb deleted file mode 100644 index ed60634b90..0000000000 --- a/spec/ruby/library/rexml/attributes/each_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#each" do - before :each do - @e = REXML::Element.new("root") - @name = REXML::Attribute.new("name", "Joe") - @ns_uri = REXML::Attribute.new("xmlns:ns", "http://some_uri") - @e.add_attribute @name - @e.add_attribute @ns_uri - end - - it "iterates over the attributes yielding expanded-name/value" do - attributes = [] - @e.attributes.each do |attr| - attr.should be_kind_of(Array) - attributes << attr - end - attributes = attributes.sort_by {|a| a.first } - attributes.first.should == ["name", "Joe"] - attributes.last.should == ["xmlns:ns", "http://some_uri"] - end -end diff --git a/spec/ruby/library/rexml/attributes/element_reference_spec.rb b/spec/ruby/library/rexml/attributes/element_reference_spec.rb deleted file mode 100644 index dac7952669..0000000000 --- a/spec/ruby/library/rexml/attributes/element_reference_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#[]" do - before :each do - @e = REXML::Element.new("root") - @lang = REXML::Attribute.new("language", "english") - @e.attributes << @lang - end - - it "returns the value of an attribute" do - @e.attributes["language"].should == "english" - end - - it "returns nil if the attribute does not exist" do - @e.attributes["chunky bacon"].should == nil - end -end diff --git a/spec/ruby/library/rexml/attributes/element_set_spec.rb b/spec/ruby/library/rexml/attributes/element_set_spec.rb deleted file mode 100644 index 1ed94dd2a1..0000000000 --- a/spec/ruby/library/rexml/attributes/element_set_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#[]=" do - before :each do - @e = REXML::Element.new("song") - @name = REXML::Attribute.new("name", "Holy Smoke!") - @e.attributes << @name - end - - it "sets an attribute" do - @e.attributes["author"] = "_why's foxes" - @e.attributes["author"].should == "_why's foxes" - end - - it "overwrites an existing attribute" do - @e.attributes["name"] = "Chunky Bacon" - @e.attributes["name"].should == "Chunky Bacon" - end - - it "deletes an attribute is value is nil" do - @e.attributes["name"] = nil - @e.attributes.length.should == 0 - end -end diff --git a/spec/ruby/library/rexml/attributes/get_attribute_ns_spec.rb b/spec/ruby/library/rexml/attributes/get_attribute_ns_spec.rb deleted file mode 100644 index 1664d6e42a..0000000000 --- a/spec/ruby/library/rexml/attributes/get_attribute_ns_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#get_attribute_ns" do - it "returns an attribute by name and namespace" do - e = REXML::Element.new("root") - attr = REXML::Attribute.new("xmlns:ns", "http://some_url") - e.attributes << attr - attr.prefix.should == "xmlns" - # This might be a bug in Attribute, commenting until those specs - # are ready - # e.attributes.get_attribute_ns(attr.prefix, "name").should == "http://some_url" - end -end diff --git a/spec/ruby/library/rexml/attributes/get_attribute_spec.rb b/spec/ruby/library/rexml/attributes/get_attribute_spec.rb deleted file mode 100644 index cfe58c1b9e..0000000000 --- a/spec/ruby/library/rexml/attributes/get_attribute_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#get_attribute" do - before :each do - @e = REXML::Element.new("root") - @name = REXML::Attribute.new("name", "Dave") - @e.attributes << @name - end - - it "fetches an attributes" do - @e.attributes.get_attribute("name").should == @name - end - - it "fetches an namespaced attribute" do - ns_name = REXML::Attribute.new("im:name", "Murray") - @e.attributes << ns_name - @e.attributes.get_attribute("name").should == @name - @e.attributes.get_attribute("im:name").should == ns_name - end - - it "returns an Attribute" do - @e.attributes.get_attribute("name").should be_kind_of(REXML::Attribute) - end - - it "returns nil if it attribute does not exist" do - @e.attributes.get_attribute("fake").should be_nil - end -end diff --git a/spec/ruby/library/rexml/attributes/initialize_spec.rb b/spec/ruby/library/rexml/attributes/initialize_spec.rb deleted file mode 100644 index f18bd20c69..0000000000 --- a/spec/ruby/library/rexml/attributes/initialize_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#initialize" do - it "is auto initialized by Element" do - e = REXML::Element.new "root" - e.attributes.should be_kind_of(REXML::Attributes) - - e.attributes << REXML::Attribute.new("name", "Paul") - e.attributes["name"].should == "Paul" - end - - it "receives a parent node" do - e = REXML::Element.new "root" - e.attributes << REXML::Attribute.new("name", "Vic") - e.attributes["name"].should == "Vic" - end -end diff --git a/spec/ruby/library/rexml/attributes/length_spec.rb b/spec/ruby/library/rexml/attributes/length_spec.rb deleted file mode 100644 index 3a8361b8d7..0000000000 --- a/spec/ruby/library/rexml/attributes/length_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/length' -require 'rexml/document' - -describe "REXML::Attributes#length" do - it_behaves_like :rexml_attribute_length, :length -end diff --git a/spec/ruby/library/rexml/attributes/namespaces_spec.rb b/spec/ruby/library/rexml/attributes/namespaces_spec.rb deleted file mode 100644 index 9e329fef6f..0000000000 --- a/spec/ruby/library/rexml/attributes/namespaces_spec.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#namespaces" do - it "needs to be reviewed for spec completeness" -end diff --git a/spec/ruby/library/rexml/attributes/prefixes_spec.rb b/spec/ruby/library/rexml/attributes/prefixes_spec.rb deleted file mode 100644 index 4675095aad..0000000000 --- a/spec/ruby/library/rexml/attributes/prefixes_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#prefixes" do - before :each do - @e = REXML::Element.new("root") - a1 = REXML::Attribute.new("xmlns:a", "bar") - a2 = REXML::Attribute.new("xmlns:b", "bla") - a3 = REXML::Attribute.new("xmlns:c", "baz") - @e.attributes << a1 - @e.attributes << a2 - @e.attributes << a3 - - @e.attributes << REXML::Attribute.new("xmlns", "foo") - end - - it "returns an array with the prefixes of each attribute" do - @e.attributes.prefixes.sort.should == ["a", "b", "c"] - end - - it "does not include the default namespace" do - @e.attributes.prefixes.include?("xmlns").should == false - end -end diff --git a/spec/ruby/library/rexml/attributes/shared/add.rb b/spec/ruby/library/rexml/attributes/shared/add.rb deleted file mode 100644 index 872f149f45..0000000000 --- a/spec/ruby/library/rexml/attributes/shared/add.rb +++ /dev/null @@ -1,17 +0,0 @@ -describe :rexml_attribute_add, shared: true do - before :each do - @e = REXML::Element.new("root") - @attr = REXML::Attributes.new(@e) - @name = REXML::Attribute.new("name", "Joe") - end - - it "adds an attribute" do - @attr.send(@method, @name) - @attr["name"].should == "Joe" - end - - it "replaces an existing attribute" do - @attr.send(@method, REXML::Attribute.new("name", "Bruce")) - @attr["name"].should == "Bruce" - end -end diff --git a/spec/ruby/library/rexml/attributes/shared/length.rb b/spec/ruby/library/rexml/attributes/shared/length.rb deleted file mode 100644 index 7848f9bf33..0000000000 --- a/spec/ruby/library/rexml/attributes/shared/length.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../../../spec_helper' -require 'rexml/document' - -describe :rexml_attribute_length, shared: true do - it "returns the number of attributes" do - e = REXML::Element.new("root") - e.attributes.send(@method).should == 0 - - e.attributes << REXML::Attribute.new("name", "John") - e.attributes << REXML::Attribute.new("another_name", "Leo") - e.attributes.send(@method).should == 2 - end -end diff --git a/spec/ruby/library/rexml/attributes/size_spec.rb b/spec/ruby/library/rexml/attributes/size_spec.rb deleted file mode 100644 index 3b1df9510d..0000000000 --- a/spec/ruby/library/rexml/attributes/size_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/length' -require 'rexml/document' - -describe "REXML::Attributes#size" do - it_behaves_like :rexml_attribute_length, :size -end diff --git a/spec/ruby/library/rexml/attributes/to_a_spec.rb b/spec/ruby/library/rexml/attributes/to_a_spec.rb deleted file mode 100644 index 1fbf71b683..0000000000 --- a/spec/ruby/library/rexml/attributes/to_a_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Attributes#to_a" do - it "returns an array with the attributes" do - e = REXML::Element.new("root") - name = REXML::Attribute.new("name", "Dave") - last = REXML::Attribute.new("last_name", "Murray") - - e.attributes << name - e.attributes << last - - e.attributes.to_a.sort{|a,b|a.to_s<=>b.to_s}.should == [name, last] - end - - it "returns an empty array if it has no attributes" do - REXML::Element.new("root").attributes.to_a.should == [] - end -end diff --git a/spec/ruby/library/rexml/cdata/clone_spec.rb b/spec/ruby/library/rexml/cdata/clone_spec.rb deleted file mode 100644 index 7d3cfda902..0000000000 --- a/spec/ruby/library/rexml/cdata/clone_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::CData#clone" do - it "makes a copy of itself" do - c = REXML::CData.new("some text") - c.clone.to_s.should == c.to_s - c.clone.should == c - end -end diff --git a/spec/ruby/library/rexml/cdata/initialize_spec.rb b/spec/ruby/library/rexml/cdata/initialize_spec.rb deleted file mode 100644 index 0184440d87..0000000000 --- a/spec/ruby/library/rexml/cdata/initialize_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::CData#initialize" do - it "creates a new CData object" do - c = REXML::CData.new("some text") - c.should be_kind_of(REXML::CData) - c.should be_kind_of(REXML::Text) - end - - it "respects whitespace if whitespace is true" do - c = REXML::CData.new("whitespace test", true) - c1 = REXML::CData.new("whitespace test", false) - - c.to_s.should == "whitespace test" - c1.to_s.should == "whitespace test" - end - - it "receives parent as third argument" do - e = REXML::Element.new("root") - REXML::CData.new("test", true, e) - e.to_s.should == "<root><![CDATA[test]]></root>" - end -end diff --git a/spec/ruby/library/rexml/cdata/shared/to_s.rb b/spec/ruby/library/rexml/cdata/shared/to_s.rb deleted file mode 100644 index f8c4951c95..0000000000 --- a/spec/ruby/library/rexml/cdata/shared/to_s.rb +++ /dev/null @@ -1,11 +0,0 @@ -describe :rexml_cdata_to_s, shared: true do - it "returns the contents of the CData" do - c = REXML::CData.new("some text") - c.send(@method).should == "some text" - end - - it "does not escape text" do - c1 = REXML::CData.new("some& text\n") - c1.send(@method).should == "some& text\n" - end -end diff --git a/spec/ruby/library/rexml/cdata/to_s_spec.rb b/spec/ruby/library/rexml/cdata/to_s_spec.rb deleted file mode 100644 index ff3076e55e..0000000000 --- a/spec/ruby/library/rexml/cdata/to_s_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/to_s' -require 'rexml/document' - -describe "REXML::CData#to_s" do - it_behaves_like :rexml_cdata_to_s, :to_s -end diff --git a/spec/ruby/library/rexml/cdata/value_spec.rb b/spec/ruby/library/rexml/cdata/value_spec.rb deleted file mode 100644 index 6e8f8587a1..0000000000 --- a/spec/ruby/library/rexml/cdata/value_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/to_s' -require 'rexml/document' - -describe "REXML::CData#value" do - it_behaves_like :rexml_cdata_to_s, :value -end diff --git a/spec/ruby/library/rexml/document/add_element_spec.rb b/spec/ruby/library/rexml/document/add_element_spec.rb deleted file mode 100644 index 42981d6465..0000000000 --- a/spec/ruby/library/rexml/document/add_element_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#add_element" do - it "adds arg1 with attributes arg2 as root node" do - d = REXML::Document.new - e = REXML::Element.new("root") - d.add_element e - d.root.should == e - end - - it "sets arg2 as arg1's attributes" do - d = REXML::Document.new - e = REXML::Element.new("root") - attr = {"foo" => "bar"} - d.add_element(e,attr) - d.root.attributes["foo"].should == attr["foo"] - end - - it "accepts a node name as arg1 and adds it as root" do - d = REXML::Document.new - d.add_element "foo" - d.root.name.should == "foo" - end - - it "sets arg1's context to the root's context" do - d = REXML::Document.new("", {"foo" => "bar"}) - d.add_element "foo" - d.root.context.should == d.context - end -end diff --git a/spec/ruby/library/rexml/document/add_spec.rb b/spec/ruby/library/rexml/document/add_spec.rb deleted file mode 100644 index a200da1e3d..0000000000 --- a/spec/ruby/library/rexml/document/add_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -# This spec defines Document#add and Document#<< - -describe :rexml_document_add, shared: true do - before :each do - @doc = REXML::Document.new("<root/>") - @decl = REXML::XMLDecl.new("1.0") - end - - it "sets document's XML declaration" do - @doc.send(@method, @decl) - @doc.xml_decl.should == @decl - end - - it "inserts XML declaration as first node" do - @doc.send(@method, @decl) - @doc.children[0].version.should == "1.0" - end - - it "overwrites existing XML declaration" do - @doc.send(@method, @decl) - @doc.send(@method, REXML::XMLDecl.new("2.0")) - @doc.xml_decl.version.should == "2.0" - end - - it "sets document DocType" do - @doc.send(@method, REXML::DocType.new("transitional")) - @doc.doctype.name.should == "transitional" - end - - it "overwrites existing DocType" do - @doc.send(@method, REXML::DocType.new("transitional")) - @doc.send(@method, REXML::DocType.new("strict")) - @doc.doctype.name.should == "strict" - end - - it "adds root node unless it exists" do - d = REXML::Document.new("") - elem = REXML::Element.new "root" - d.send(@method, elem) - d.root.should == elem - end - - it "refuses to add second root" do - lambda { @doc.send(@method, REXML::Element.new("foo")) }.should raise_error(RuntimeError) - end -end - -describe "REXML::Document#add" do - it_behaves_like :rexml_document_add, :add -end - -describe "REXML::Document#<<" do - it_behaves_like :rexml_document_add, :<< -end diff --git a/spec/ruby/library/rexml/document/clone_spec.rb b/spec/ruby/library/rexml/document/clone_spec.rb deleted file mode 100644 index 4aebb6f156..0000000000 --- a/spec/ruby/library/rexml/document/clone_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -# According to the MRI documentation (http://www.ruby-doc.org/stdlib/libdoc/rexml/rdoc/index.html), -# clone's behavior "should be obvious". Apparently "obvious" means cloning -# only the attributes and the context of the document, not its children. -describe "REXML::Document#clone" do - it "clones document attributes" do - d = REXML::Document.new("foo") - d.attributes["foo"] = "bar" - e = d.clone - e.attributes.should == d.attributes - end - - it "clones document context" do - d = REXML::Document.new("foo", {"foo" => "bar"}) - e = d.clone - e.context.should == d.context - end -end diff --git a/spec/ruby/library/rexml/document/doctype_spec.rb b/spec/ruby/library/rexml/document/doctype_spec.rb deleted file mode 100644 index b919b071e1..0000000000 --- a/spec/ruby/library/rexml/document/doctype_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#doctype" do - it "returns the doctype" do - d = REXML::Document.new - dt = REXML::DocType.new("foo") - d.add dt - d.doctype.should == dt - end - - it "returns nil if there's no doctype" do - REXML::Document.new.doctype.should == nil - end -end diff --git a/spec/ruby/library/rexml/document/encoding_spec.rb b/spec/ruby/library/rexml/document/encoding_spec.rb deleted file mode 100644 index 343e0ee45f..0000000000 --- a/spec/ruby/library/rexml/document/encoding_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#encoding" do - before :each do - @doc = REXML::Document.new - end - - it "returns encoding from XML declaration" do - @doc.add REXML::XMLDecl.new(nil, "UTF-16", nil) - @doc.encoding.should == "UTF-16" - end - - it "returns encoding from XML declaration (for UTF-16 as well)" do - @doc.add REXML::XMLDecl.new("1.0", "UTF-8", nil) - @doc.encoding.should == "UTF-8" - end - - it "uses UTF-8 as default encoding" do - @doc.encoding.should == "UTF-8" - end -end diff --git a/spec/ruby/library/rexml/document/expanded_name_spec.rb b/spec/ruby/library/rexml/document/expanded_name_spec.rb deleted file mode 100644 index 1225d13fb0..0000000000 --- a/spec/ruby/library/rexml/document/expanded_name_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe :document_expanded_name, shared: true do - it "returns an empty string for root" do # root nodes have no expanded name - REXML::Document.new.send(@method).should == "" - end -end - -describe "REXML::Document#expanded_name" do - it_behaves_like :document_expanded_name, :expanded_name -end - -describe "REXML::Document#name" do - it_behaves_like :document_expanded_name, :name -end diff --git a/spec/ruby/library/rexml/document/new_spec.rb b/spec/ruby/library/rexml/document/new_spec.rb deleted file mode 100644 index 39e806a472..0000000000 --- a/spec/ruby/library/rexml/document/new_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Document#new" do - - it "initializes context of {} unless specified" do - d = REXML::Document.new("<foo />") - d.context.should == {} - end - - it "has empty attributes if source is nil" do - d = REXML::Document.new(nil) - d.elements.should be_empty - end - - it "can use other document context" do - s = REXML::Document.new("") - d = REXML::Document.new(s) - d.context.should == s.context - end - - it "clones source attributes" do - s = REXML::Document.new("<root />") - s.attributes["some_attr"] = "some_val" - d = REXML::Document.new(s) - d.attributes.should == s.attributes - end - - it "raises an error if source is not a Document, String or IO" do - lambda {REXML::Document.new(3)}.should raise_error(RuntimeError) - end - - it "does not perform XML validation" do - REXML::Document.new("Invalid document").should be_kind_of(REXML::Document) - end -end diff --git a/spec/ruby/library/rexml/document/node_type_spec.rb b/spec/ruby/library/rexml/document/node_type_spec.rb deleted file mode 100644 index 85a4d507aa..0000000000 --- a/spec/ruby/library/rexml/document/node_type_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#node_type" do - it "returns :document" do - REXML::Document.new.node_type.should == :document - end -end diff --git a/spec/ruby/library/rexml/document/root_spec.rb b/spec/ruby/library/rexml/document/root_spec.rb deleted file mode 100644 index 3c24e79b2d..0000000000 --- a/spec/ruby/library/rexml/document/root_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#root" do - it "returns document root tag name" do - REXML::Document.new("<foo/>").root.name.should == "foo" - end - - it "returns nil if there is not root" do - REXML::Document.new.root.should == nil - end -end diff --git a/spec/ruby/library/rexml/document/stand_alone_spec.rb b/spec/ruby/library/rexml/document/stand_alone_spec.rb deleted file mode 100644 index 4ac24329d6..0000000000 --- a/spec/ruby/library/rexml/document/stand_alone_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#stand_alone?" do - it "returns the XMLDecl standalone value" do - d = REXML::Document.new - decl = REXML::XMLDecl.new("1.0", "UTF-8", "yes") - d.add decl - d.stand_alone?.should == "yes" - end - - # According to the docs this should return the default XMLDecl but that - # will carry some more problems when printing the document. Currently, it - # returns nil. See http://www.ruby-forum.com/topic/146812#650061 - it "returns the default value when no XML declaration present" do - REXML::Document.new.stand_alone?.should == nil - end - -end diff --git a/spec/ruby/library/rexml/document/version_spec.rb b/spec/ruby/library/rexml/document/version_spec.rb deleted file mode 100644 index 983b4b9af0..0000000000 --- a/spec/ruby/library/rexml/document/version_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#version" do - it "returns XML version from declaration" do - d = REXML::Document.new - d.add REXML::XMLDecl.new("1.1") - d.version.should == "1.1" - end - - it "returns the default version when declaration is not present" do - REXML::Document.new.version.should == REXML::XMLDecl::DEFAULT_VERSION - end -end diff --git a/spec/ruby/library/rexml/document/write_spec.rb b/spec/ruby/library/rexml/document/write_spec.rb deleted file mode 100644 index efa94b7117..0000000000 --- a/spec/ruby/library/rexml/document/write_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'rexml/document' -require 'rexml/formatters/transitive' -require_relative '../../../spec_helper' - -# Maybe this can be cleaned -describe "REXML::Document#write" do - before :each do - @d = REXML::Document.new - city = REXML::Element.new "Springfield" - street = REXML::Element.new "EvergreenTerrace" - address = REXML::Element.new "House742" - @d << city << street << address - @str = "" - end - - it "returns document source as string" do - @d.write(@str) - @str.should == "<Springfield><EvergreenTerrace><House742/></EvergreenTerrace></Springfield>" - end - - it "returns document indented" do - @d.write(@str, 2) - @str.should =~ /\s*<Springfield>\s*<EvergreenTerrace>\s*<House742\/>\s*<\/EvergreenTerrace>\s*<\/Springfield>/ - end - - it "returns document with transitive support" do - @d.write(@str, 2, true) - @str.should =~ /\s*<Springfield\s*><EvergreenTerrace\s*><House742\s*\/><\/EvergreenTerrace\s*><\/Springfield\s*>/ - end - - it "returns document with support for IE" do - @d.write(@str, -1, false, true) - @str.should == "<Springfield><EvergreenTerrace><House742 /></EvergreenTerrace></Springfield>" - end -end diff --git a/spec/ruby/library/rexml/document/xml_decl_spec.rb b/spec/ruby/library/rexml/document/xml_decl_spec.rb deleted file mode 100644 index 30288a150b..0000000000 --- a/spec/ruby/library/rexml/document/xml_decl_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Document#xml_decl" do - it "returns XML declaration of the document" do - d = REXML::Document.new - decl = REXML::XMLDecl.new("1.0", "UTF-16", "yes") - d.add decl - d.xml_decl.should == decl - end - - it "returns default XML declaration unless present" do - REXML::Document.new.xml_decl.should == REXML::XMLDecl.new - end -end diff --git a/spec/ruby/library/rexml/element/add_attribute_spec.rb b/spec/ruby/library/rexml/element/add_attribute_spec.rb deleted file mode 100644 index d15fb81ef1..0000000000 --- a/spec/ruby/library/rexml/element/add_attribute_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#add_attribute" do - before :each do - @person = REXML::Element.new "person" - @person.attributes["name"] = "Bill" - end - - it "adds a new attribute" do - @person.add_attribute("age", "17") - @person.attributes["age"].should == "17" - end - - it "overwrites an existing attribute" do - @person.add_attribute("name", "Bill") - @person.attributes["name"].should == "Bill" - end - - it "accepts a pair of strings" do - @person.add_attribute("male", "true") - @person.attributes["male"].should == "true" - end - - it "accepts an Attribute for key" do - attr = REXML::Attribute.new("male", "true") - @person.add_attribute attr - @person.attributes["male"].should == "true" - end - - it "ignores value if key is an Attribute" do - attr = REXML::Attribute.new("male", "true") - @person.add_attribute(attr, "false") - @person.attributes["male"].should == "true" - end - - it "returns the attribute added" do - attr = REXML::Attribute.new("name", "Tony") - @person.add_attribute(attr).should == attr - end -end diff --git a/spec/ruby/library/rexml/element/add_attributes_spec.rb b/spec/ruby/library/rexml/element/add_attributes_spec.rb deleted file mode 100644 index b462fdf5fe..0000000000 --- a/spec/ruby/library/rexml/element/add_attributes_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#add_attributes" do - before :each do - @person = REXML::Element.new "person" - @person.attributes["name"] = "Bill" - end - - it "adds multiple attributes from a hash" do - @person.add_attributes({"name" => "Joe", "age" => "27"}) - @person.attributes["name"].should == "Joe" - @person.attributes["age"].should == "27" - end - - it "adds multiple attributes from an array" do - attrs = { "name" => "Joe", "age" => "27"} - @person.add_attributes attrs.to_a - @person.attributes["name"].should == "Joe" - @person.attributes["age"].should == "27" - end -end diff --git a/spec/ruby/library/rexml/element/add_element_spec.rb b/spec/ruby/library/rexml/element/add_element_spec.rb deleted file mode 100644 index 8e2ffe3148..0000000000 --- a/spec/ruby/library/rexml/element/add_element_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - - -describe "REXML::Element#add_element" do - before :each do - @root = REXML::Element.new("root") - end - - it "adds a child without attributes" do - name = REXML::Element.new("name") - @root.add_element name - @root.elements["name"].name.should == name.name - @root.elements["name"].attributes.should == name.attributes - @root.elements["name"].context.should == name.context - end - - it "adds a child with attributes" do - person = REXML::Element.new("person") - @root.add_element(person, {"name" => "Madonna"}) - @root.elements["person"].name.should == person.name - @root.elements["person"].attributes.should == person.attributes - @root.elements["person"].context.should == person.context - end - - it "adds a child with name" do - @root.add_element "name" - @root.elements["name"].name.should == "name" - @root.elements["name"].attributes.should == {} - @root.elements["name"].context.should == nil - end - - it "returns the added child" do - name = @root.add_element "name" - @root.elements["name"].name.should == name.name - @root.elements["name"].attributes.should == name.attributes - @root.elements["name"].context.should == name.context - end -end diff --git a/spec/ruby/library/rexml/element/add_namespace_spec.rb b/spec/ruby/library/rexml/element/add_namespace_spec.rb deleted file mode 100644 index 77c00eec46..0000000000 --- a/spec/ruby/library/rexml/element/add_namespace_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#add_namespace" do - before :each do - @elem = REXML::Element.new("person") - end - - it "adds a namespace to element" do - @elem.add_namespace("foo", "bar") - @elem.namespace("foo").should == "bar" - end - - it "accepts a prefix string as prefix" do - @elem.add_namespace("xmlns:foo", "bar") - @elem.namespace("foo").should == "bar" - end - - it "uses prefix as URI if uri is nil" do - @elem.add_namespace("some_uri", nil) - @elem.namespace.should == "some_uri" - end -end diff --git a/spec/ruby/library/rexml/element/add_text_spec.rb b/spec/ruby/library/rexml/element/add_text_spec.rb deleted file mode 100644 index 54e127bf4b..0000000000 --- a/spec/ruby/library/rexml/element/add_text_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#add_text" do - before :each do - @name = REXML::Element.new "Name" - end - - it "adds text to an element" do - @name.add_text "Ringo" - @name.to_s.should == "<Name>Ringo</Name>" - end - - it "accepts a Text" do - @name.add_text(REXML::Text.new("Ringo")) - @name.to_s.should == "<Name>Ringo</Name>" - end - - it "joins the new text with the old one" do - @name.add_text "Ringo" - @name.add_text " Starr" - @name.to_s.should == "<Name>Ringo Starr</Name>" - end -end diff --git a/spec/ruby/library/rexml/element/attribute_spec.rb b/spec/ruby/library/rexml/element/attribute_spec.rb deleted file mode 100644 index e40d612ef3..0000000000 --- a/spec/ruby/library/rexml/element/attribute_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#attribute" do - it "returns an attribute by name" do - person = REXML::Element.new "Person" - attribute = REXML::Attribute.new("drink", "coffee") - person.add_attribute(attribute) - person.attribute("drink").should == attribute - end - - it "supports attributes inside namespaces" do - e = REXML::Element.new("element") - e.add_attributes({"xmlns:ns" => "http://some_uri"}) - e.attribute("ns", "ns").to_s.should == "http://some_uri" - end -end diff --git a/spec/ruby/library/rexml/element/attributes_spec.rb b/spec/ruby/library/rexml/element/attributes_spec.rb deleted file mode 100644 index 8959b769a8..0000000000 --- a/spec/ruby/library/rexml/element/attributes_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#attributes" do - it "returns element's Attributes" do - p = REXML::Element.new "Person" - - name = REXML::Attribute.new("name", "John") - attrs = REXML::Attributes.new(p) - attrs.add name - - p.add_attribute name - p.attributes.should == attrs - end - - it "returns an empty hash if element has no attributes" do - REXML::Element.new("Person").attributes.should == {} - end -end diff --git a/spec/ruby/library/rexml/element/cdatas_spec.rb b/spec/ruby/library/rexml/element/cdatas_spec.rb deleted file mode 100644 index a371a5734b..0000000000 --- a/spec/ruby/library/rexml/element/cdatas_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#cdatas" do - before :each do - @e = REXML::Element.new("Root") - end - - it "returns the array of children cdatas" do - c = REXML::CData.new("Primary") - d = REXML::CData.new("Secondary") - @e << c - @e << d - @e.cdatas.should == [c, d] - end - - it "freezes the returned array" do - @e.cdatas.frozen?.should == true - end - - it "returns an empty array if element has no cdata" do - @e.cdatas.should == [] - end -end diff --git a/spec/ruby/library/rexml/element/clone_spec.rb b/spec/ruby/library/rexml/element/clone_spec.rb deleted file mode 100644 index d26392db41..0000000000 --- a/spec/ruby/library/rexml/element/clone_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#clone" do - before :each do - @e = REXML::Element.new "a" - end - it "creates a copy of element" do - @e.clone.to_s.should == @e.to_s - end - - it "copies the attributes" do - @e.add_attribute("foo", "bar") - @e.clone.to_s.should == @e.to_s - end - - it "does not copy the text" do - @e.add_text "some text..." - @e.clone.to_s.should_not == @e - @e.clone.to_s.should == "<a/>" - end - - it "does not copy the child elements" do - b = REXML::Element.new "b" - @e << b - @e.clone.should_not == @e - @e.clone.to_s.should == "<a/>" - end -end diff --git a/spec/ruby/library/rexml/element/comments_spec.rb b/spec/ruby/library/rexml/element/comments_spec.rb deleted file mode 100644 index 9dac2cc5b8..0000000000 --- a/spec/ruby/library/rexml/element/comments_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#comments" do - before :each do - @e = REXML::Element.new "root" - @c1 = REXML::Comment.new "this is a comment" - @c2 = REXML::Comment.new "this is another comment" - @e << @c1 - @e << @c2 - end - - it "returns the array of comments" do - @e.comments.should == [@c1, @c2] - end - - it "returns a frozen object" do - @e.comments.frozen?.should == true - end -end diff --git a/spec/ruby/library/rexml/element/delete_attribute_spec.rb b/spec/ruby/library/rexml/element/delete_attribute_spec.rb deleted file mode 100644 index 5c55c5efda..0000000000 --- a/spec/ruby/library/rexml/element/delete_attribute_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#delete_attribute" do - before :each do - @e = REXML::Element.new("Person") - @attr = REXML::Attribute.new("name", "Sean") - @e.add_attribute(@attr) - end - - it "deletes an attribute from the element" do - @e.delete_attribute("name") - @e.attributes["name"].should be_nil - end - -# Bug was filled with a patch in Ruby's tracker #20298 - quarantine! do - it "receives an Attribute" do - @e.add_attribute(@attr) - @e.delete_attribute(@attr) - @e.attributes["name"].should be_nil - end - end - - # Docs say that it returns the removed attribute but then examples - # show it returns the element with the attribute removed. - # Also fixed in #20298 - it "returns the element with the attribute removed" do - elem = @e.delete_attribute("name") - elem.attributes.should be_empty - elem.to_s.should eql("<Person/>") - end - - it "returns nil if the attribute does not exist" do - @e.delete_attribute("name") - at = @e.delete_attribute("name") - at.should be_nil - end -end diff --git a/spec/ruby/library/rexml/element/delete_element_spec.rb b/spec/ruby/library/rexml/element/delete_element_spec.rb deleted file mode 100644 index 9417229bd4..0000000000 --- a/spec/ruby/library/rexml/element/delete_element_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#delete_element" do - before :each do - @root = REXML::Element.new("root") - end - - it "deletes the child element" do - node = REXML::Element.new("some_node") - @root.add_element node - @root.delete_element node - @root.elements.size.should == 0 - end - - it "deletes a child via XPath" do - @root.add_element "some_node" - @root.delete_element "some_node" - @root.elements.size.should == 0 - end - - it "deletes the child at index" do - @root.add_element "some_node" - @root.delete_element 1 - @root.elements.size.should == 0 - end - - # According to the docs this should return the deleted element - # but it won't if it's an Element. - it "deletes Element and returns it" do - node = REXML::Element.new("some_node") - @root.add_element node - del_node = @root.delete_element node - del_node.should == node - end - - # Note how passing the string will return the removed element - # but passing the Element as above won't. - it "deletes an element and returns it" do - node = REXML::Element.new("some_node") - @root.add_element node - del_node = @root.delete_element "some_node" - del_node.should == node - end - - it "returns nil unless element exists" do - @root.delete_element("something").should == nil - end -end diff --git a/spec/ruby/library/rexml/element/delete_namespace_spec.rb b/spec/ruby/library/rexml/element/delete_namespace_spec.rb deleted file mode 100644 index 8683a40cab..0000000000 --- a/spec/ruby/library/rexml/element/delete_namespace_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#delete_namespace" do - - before :each do - @doc = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>" - end - - it "deletes a namespace from the element" do - @doc.root.delete_namespace 'foo' - @doc.root.namespace("foo").should be_nil - @doc.root.to_s.should == "<a xmlns='twiddle'/>" - end - - it "deletes default namespace when called with no args" do - @doc.root.delete_namespace - @doc.root.namespace.should be_empty - @doc.root.to_s.should == "<a xmlns:foo='bar'/>" - end - - it "returns the element" do - @doc.root.delete_namespace.should == @doc.root - end -end diff --git a/spec/ruby/library/rexml/element/document_spec.rb b/spec/ruby/library/rexml/element/document_spec.rb deleted file mode 100644 index 24773580f2..0000000000 --- a/spec/ruby/library/rexml/element/document_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#document" do - - it "returns the element's document" do - d = REXML::Document.new("<root><elem/></root>") - d << REXML::XMLDecl.new - d.root.document.should == d - d.root.document.to_s.should == d.to_s - end - - it "returns nil if it belongs to no document" do - REXML::Element.new("standalone").document.should be_nil - end -end diff --git a/spec/ruby/library/rexml/element/each_element_with_attribute_spec.rb b/spec/ruby/library/rexml/element/each_element_with_attribute_spec.rb deleted file mode 100644 index 3c5da3f015..0000000000 --- a/spec/ruby/library/rexml/element/each_element_with_attribute_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#each_element_with_attributes" do - before :each do - @document = REXML::Element.new("people") - @father = REXML::Element.new("Person") - @father.attributes["name"] = "Joe" - @son = REXML::Element.new("Child") - @son.attributes["name"] = "Fred" - @document.root << @father - @document.root << @son - @childs = [] - end - - it "returns childs with attribute" do - @document.each_element_with_attribute("name") { |elem| @childs << elem } - @childs[0].should == @father - @childs[1].should == @son - end - - it "takes attribute value as second argument" do - @document.each_element_with_attribute("name", "Fred"){ |elem| elem.should == @son } - end - - it "takes max number of childs as third argument" do - @document.each_element_with_attribute("name", nil, 1) { |elem| @childs << elem } - @childs.size.should == 1 - @childs[0].should == @father - end - - it "takes XPath filter as fourth argument" do - @document.each_element_with_attribute("name", nil, 0, "Child"){ |elem| elem.should == @son} - end -end diff --git a/spec/ruby/library/rexml/element/each_element_with_text_spec.rb b/spec/ruby/library/rexml/element/each_element_with_text_spec.rb deleted file mode 100644 index 5f9e5b85dc..0000000000 --- a/spec/ruby/library/rexml/element/each_element_with_text_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#each_element_with_text" do - before :each do - @document = REXML::Element.new("people") - - @joe = REXML::Element.new("Person") - @joe.text = "Joe" - @fred = REXML::Element.new("Person") - @fred.text = "Fred" - @another = REXML::Element.new("AnotherPerson") - @another.text = "Fred" - @document.root << @joe - @document.root << @fred - @document.root << @another - @childs = [] - end - - it "returns childs with text" do - @document.each_element_with_text("Joe"){|c| c.should == @joe} - end - - it "takes max as second argument" do - @document.each_element_with_text("Fred", 1){ |c| c.should == @fred} - end - - it "takes XPath filter as third argument" do - @document.each_element_with_text("Fred", 0, "Person"){ |c| c.should == @fred} - end -end diff --git a/spec/ruby/library/rexml/element/element_reference_spec.rb b/spec/ruby/library/rexml/element/element_reference_spec.rb deleted file mode 100644 index db94303b1e..0000000000 --- a/spec/ruby/library/rexml/element/element_reference_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#[]" do - - before :each do - @doc = REXML::Document.new("<root foo='bar'></root>") - @child = REXML::Element.new("child") - @doc.root.add_element @child - end - - ruby_version_is "2.4" do - it "return attribute value if argument is string or symbol" do - @doc.root[:foo].should == 'bar' - @doc.root['foo'].should == 'bar' - end - - it "return nth element if argument is int" do - @doc.root[0].should == @child - end - end -end diff --git a/spec/ruby/library/rexml/element/get_text_spec.rb b/spec/ruby/library/rexml/element/get_text_spec.rb deleted file mode 100644 index 8ee9ea0824..0000000000 --- a/spec/ruby/library/rexml/element/get_text_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#get_text" do - before :each do - @doc = REXML::Document.new "<p>some text<b>this is bold!</b> more text</p>" - end - - it "returns the first text child node" do - @doc.root.get_text.value.should == "some text" - @doc.root.get_text.should be_kind_of(REXML::Text) - end - - it "returns text from an element matching path" do - @doc.root.get_text("b").value.should == "this is bold!" - @doc.root.get_text("b").should be_kind_of(REXML::Text) - end -end diff --git a/spec/ruby/library/rexml/element/has_attributes_spec.rb b/spec/ruby/library/rexml/element/has_attributes_spec.rb deleted file mode 100644 index f89ec675f5..0000000000 --- a/spec/ruby/library/rexml/element/has_attributes_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#has_attributes?" do - before :each do - @e = REXML::Element.new("test_elem") - end - - it "returns true when element has any attributes" do - @e.add_attribute("name", "Joe") - @e.has_attributes?.should be_true - end - - it "returns false if element has no attributes" do - @e.has_attributes?.should be_false - end -end diff --git a/spec/ruby/library/rexml/element/has_elements_spec.rb b/spec/ruby/library/rexml/element/has_elements_spec.rb deleted file mode 100644 index dc5fc9c25b..0000000000 --- a/spec/ruby/library/rexml/element/has_elements_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#has_elements?" do - before :each do - @e = REXML::Element.new("root") - end - - it "returns true if element has child elements" do - child = REXML::Element.new("child") - @e << child - @e.has_elements?.should be_true - end - - it "returns false if element doesn't have child elements" do - @e.has_elements?.should be_false - end -end diff --git a/spec/ruby/library/rexml/element/has_text_spec.rb b/spec/ruby/library/rexml/element/has_text_spec.rb deleted file mode 100644 index e9d5a176cb..0000000000 --- a/spec/ruby/library/rexml/element/has_text_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#has_text?" do - - it "returns true if element has a Text child" do - e = REXML::Element.new("Person") - e.text = "My text" - e.has_text?.should be_true - end - - it "returns false if it has no Text childs" do - e = REXML::Element.new("Person") - e.has_text?.should be_false - end -end diff --git a/spec/ruby/library/rexml/element/inspect_spec.rb b/spec/ruby/library/rexml/element/inspect_spec.rb deleted file mode 100644 index f45edd0b1f..0000000000 --- a/spec/ruby/library/rexml/element/inspect_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#inspect" do - - before :each do - @name = REXML::Element.new "name" - end - - it "returns the node as a string" do - @name.inspect.should == "<name/>" - end - - it "inserts '...' if the node has children" do - e = REXML::Element.new "last_name" - @name << e - @name.inspect.should == "<name> ... </>" - # This might make more sense but differs from MRI's default behavior - # @name.inspect.should == "<name> ... </name>" - end - - it "inserts the attributes in the string" do - @name.add_attribute "language" - @name.attributes["language"] = "english" - @name.inspect.should == "<name language='english'/>" - end -end diff --git a/spec/ruby/library/rexml/element/instructions_spec.rb b/spec/ruby/library/rexml/element/instructions_spec.rb deleted file mode 100644 index aa2d192e7c..0000000000 --- a/spec/ruby/library/rexml/element/instructions_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#instructions" do - before :each do - @elem = REXML::Element.new("root") - end - it "returns the Instruction children nodes" do - inst = REXML::Instruction.new("xml-stylesheet", "href='headlines.css'") - @elem << inst - @elem.instructions.first.should == inst - end - - it "returns an empty array if it has no Instruction children" do - @elem.instructions.should be_empty - end - - it "freezes the returned array" do - @elem.instructions.frozen?.should be_true - end -end diff --git a/spec/ruby/library/rexml/element/namespace_spec.rb b/spec/ruby/library/rexml/element/namespace_spec.rb deleted file mode 100644 index 89662f3599..0000000000 --- a/spec/ruby/library/rexml/element/namespace_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#namespace" do - before :each do - @doc = REXML::Document.new("<a xmlns='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>") - @elem = @doc.elements["//b"] - end - - it "returns the default namespace" do - @elem.namespace.should == "1" - end - - it "accepts a namespace prefix" do - @elem.namespace("y").should == "2" - @doc.elements["//c"].namespace("z").should == "3" - end - - it "returns an empty String if default namespace is not defined" do - e = REXML::Document.new("<a/>") - e.root.namespace.should be_empty - end - - it "returns nil if namespace is not defined" do - @elem.namespace("z").should be_nil - end -end diff --git a/spec/ruby/library/rexml/element/namespaces_spec.rb b/spec/ruby/library/rexml/element/namespaces_spec.rb deleted file mode 100644 index a84c1d1dab..0000000000 --- a/spec/ruby/library/rexml/element/namespaces_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#namespaces" do - before :each do - doc = REXML::Document.new("<a xmlns='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>") - @elem = doc.elements["//c"] - end - - it "returns a hash of the namespaces" do - ns = {"y"=>"2", "z"=>"3", "xmlns"=>"1"} - @elem.namespaces.keys.sort.should == ns.keys.sort - @elem.namespaces.values.sort.should == ns.values.sort - end - - it "returns an empty hash if no namespaces exist" do - e = REXML::Element.new "element" - e.namespaces.kind_of?(Hash).should == true - e.namespaces.should be_empty - end - - it "uses namespace prefixes as keys" do - prefixes = ["y", "z", "xmlns"] - @elem.namespaces.keys.sort.should == prefixes.sort - end - - it "uses namespace values as the hash values" do - values = ["2", "3", "1"] - @elem.namespaces.values.sort.should == values.sort - end - -end diff --git a/spec/ruby/library/rexml/element/new_spec.rb b/spec/ruby/library/rexml/element/new_spec.rb deleted file mode 100644 index 4ffdf4dabe..0000000000 --- a/spec/ruby/library/rexml/element/new_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#new" do - - it "creates element from tag name" do - REXML::Element.new("foo").name.should == "foo" - end - - it "creates element with default attributes" do - e = REXML::Element.new - e.name.should == REXML::Element::UNDEFINED - e.context.should == nil - e.parent.should == nil - end - - it "creates element from another element" do - e = REXML::Element.new "foo" - f = REXML::Element.new e - e.name.should == f.name - e.context.should == f.context - e.parent.should == f.parent - end - - it "takes parent as second argument" do - parent = REXML::Element.new "foo" - child = REXML::Element.new "bar", parent - child.parent.should == parent - end - - it "takes context as third argument" do - context = {"some_key" => "some_value"} - REXML::Element.new("foo", nil, context).context.should == context - end -end diff --git a/spec/ruby/library/rexml/element/next_element_spec.rb b/spec/ruby/library/rexml/element/next_element_spec.rb deleted file mode 100644 index 5b6d6cad9b..0000000000 --- a/spec/ruby/library/rexml/element/next_element_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#next_element" do - before :each do - @a = REXML::Element.new "a" - @b = REXML::Element.new "b" - @c = REXML::Element.new "c" - @a.root << @b - @a.root << @c - end - it "returns next existing element" do - @a.elements["b"].next_element.should == @c - end - - it "returns nil on last element" do - @a.elements["c"].next_element.should == nil - end -end diff --git a/spec/ruby/library/rexml/element/node_type_spec.rb b/spec/ruby/library/rexml/element/node_type_spec.rb deleted file mode 100644 index bcab9e126d..0000000000 --- a/spec/ruby/library/rexml/element/node_type_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#node_type" do - it "returns :element" do - REXML::Element.new("MyElem").node_type.should == :element - end -end diff --git a/spec/ruby/library/rexml/element/prefixes_spec.rb b/spec/ruby/library/rexml/element/prefixes_spec.rb deleted file mode 100644 index b6edf9a847..0000000000 --- a/spec/ruby/library/rexml/element/prefixes_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#prefixes" do - before :each do - doc = REXML::Document.new("<a xmlns='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>") - @elem = doc.elements["//c"] - end - - it "returns an array of the prefixes of the namespaces" do - @elem.prefixes.should == ["y", "z"] - end - - it "does not include the default namespace" do - @elem.prefixes.include?("xmlns").should == false - end - - it "returns an empty array if no namespace was defined" do - doc = REXML::Document.new "<root><something/></root>" - root = doc.elements["//root"] - root.prefixes.should == [] - end -end diff --git a/spec/ruby/library/rexml/element/previous_element_spec.rb b/spec/ruby/library/rexml/element/previous_element_spec.rb deleted file mode 100644 index 2fe79d955f..0000000000 --- a/spec/ruby/library/rexml/element/previous_element_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#previous_element" do - before :each do - @a = REXML::Element.new "a" - @b = REXML::Element.new "b" - @c = REXML::Element.new "c" - @a.root << @b - @a.root << @c - end - - it "returns previous element" do - @a.elements["c"].previous_element.should == @b - end - - it "returns nil on first element" do - @a.elements["b"].previous_element.should == nil - end -end diff --git a/spec/ruby/library/rexml/element/raw_spec.rb b/spec/ruby/library/rexml/element/raw_spec.rb deleted file mode 100644 index 404ccce5f4..0000000000 --- a/spec/ruby/library/rexml/element/raw_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#raw" do - it "returns true if raw mode is set to all" do - REXML::Element.new("MyElem", nil, {raw: :all}).raw.should == true - end - - it "returns true if raw mode is set to expanded_name" do - REXML::Element.new("MyElem", nil, {raw: "MyElem"}).raw.should == true - end - - it "returns false if raw mode is not set" do - REXML::Element.new("MyElem", nil, {raw: ""}).raw.should == false - end - - it "returns false if raw is not :all or expanded_name" do - REXML::Element.new("MyElem", nil, {raw: "Something"}).raw.should == false - end - - it "returns nil if context is not set" do - REXML::Element.new("MyElem").raw.should == nil - end -end diff --git a/spec/ruby/library/rexml/element/root_spec.rb b/spec/ruby/library/rexml/element/root_spec.rb deleted file mode 100644 index 1e0669033e..0000000000 --- a/spec/ruby/library/rexml/element/root_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Element#root" do - before :each do - @doc = REXML::Document.new - @root = REXML::Element.new "root" - @node = REXML::Element.new "node" - @doc << @root << @node - end - - it "returns first child on documents" do - @doc.root.should == @root - end - - it "returns self on root nodes" do - @root.root.should == @root - end - - it "returns parent's root on child nodes" do - @node.root.should == @root - end - - it "returns self on standalone nodes" do - e = REXML::Element.new "Elem" # Note that it doesn't have a parent node - e.root.should == e - end -end diff --git a/spec/ruby/library/rexml/element/text_spec.rb b/spec/ruby/library/rexml/element/text_spec.rb deleted file mode 100644 index 7c290c4cda..0000000000 --- a/spec/ruby/library/rexml/element/text_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#text" do - before :each do - @e = REXML::Element.new "name" - @e.text = "John" - end - - it "returns the text node of element" do - @e.text.should == "John" - end - - it "returns the text node value" do - t = REXML::Text.new "Joe" - @e.text = t - @e.text.should == "Joe" - @e.text.should_not == t - end - - it "returns nil if no text is attached" do - elem = REXML::Element.new "name" - elem.text.should == nil - end -end - -describe "REXML::Element#text=" do - before :each do - @e = REXML::Element.new "name" - @e.text = "John" - end - - it "sets the text node" do - @e.to_s.should == "<name>John</name>" - end - - it "replaces existing text" do - @e.text = "Joe" - @e.to_s.should == "<name>Joe</name>" - end - - it "receives nil as an argument" do - @e.text = nil - @e.to_s.should == "<name/>" - end -end diff --git a/spec/ruby/library/rexml/element/texts_spec.rb b/spec/ruby/library/rexml/element/texts_spec.rb deleted file mode 100644 index 7975833c89..0000000000 --- a/spec/ruby/library/rexml/element/texts_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#texts" do - - it "returns an array of the Text children" do - e = REXML::Element.new("root") - e.add_text "First" - e.add_text "Second" - e.texts.should == ["FirstSecond"] - end - - it "returns an empty array if it has no Text children" do - REXML::Element.new("root").texts.should == [] - end -end diff --git a/spec/ruby/library/rexml/element/whitespace_spec.rb b/spec/ruby/library/rexml/element/whitespace_spec.rb deleted file mode 100644 index dc785ae5ce..0000000000 --- a/spec/ruby/library/rexml/element/whitespace_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe "REXML::Element#whitespace" do - it "returns true if whitespace is respected in the element" do - e = REXML::Element.new("root") - e.whitespace.should be_true - - e = REXML::Element.new("root", nil, respect_whitespace: :all) - e.whitespace.should be_true - - e = REXML::Element.new("root", nil, respect_whitespace: ["root"]) - e.whitespace.should be_true - end - - it "returns false if whitespace is ignored inside element" do - e = REXML::Element.new("root", nil, compress_whitespace: :all) - e.whitespace.should be_false - - e = REXML::Element.new("root", nil, compress_whitespace: ["root"]) - e.whitespace.should be_false - end -end diff --git a/spec/ruby/library/rexml/node/each_recursive_spec.rb b/spec/ruby/library/rexml/node/each_recursive_spec.rb deleted file mode 100644 index dd4aa9a2f2..0000000000 --- a/spec/ruby/library/rexml/node/each_recursive_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#each_recursive" do - before :each do - @doc = REXML::Document.new - @doc << REXML::XMLDecl.new - @root = REXML::Element.new "root" - @child1 = REXML::Element.new "child1" - @child2 = REXML::Element.new "child2" - @root << @child1 - @root << @child2 - @doc << @root - end - - it "visits all subnodes of self" do - nodes = [] - @doc.each_recursive { |node| nodes << node} - nodes.should == [@root, @child1, @child2] - end -end diff --git a/spec/ruby/library/rexml/node/find_first_recursive_spec.rb b/spec/ruby/library/rexml/node/find_first_recursive_spec.rb deleted file mode 100644 index ba46f2ca35..0000000000 --- a/spec/ruby/library/rexml/node/find_first_recursive_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#find_first_recursive" do - before :each do - @e = REXML::Element.new("root") - @node1 = REXML::Element.new("node") - @node2 = REXML::Element.new("another node") - @subnode = REXML::Element.new("another node") - @node1 << @subnode - @e << @node1 - @e << @node2 - end - - it "finds the first element that matches block" do - found = @e.find_first_recursive { |n| n.to_s == "<node><another node/></node>"} - found.should == @node1 - end - - it "visits the nodes in preorder" do - found = @e.find_first_recursive { |n| n.to_s == "<another node/>"} - found.should == @subnode - found.should_not == @node2 - end -end diff --git a/spec/ruby/library/rexml/node/index_in_parent_spec.rb b/spec/ruby/library/rexml/node/index_in_parent_spec.rb deleted file mode 100644 index 092851e3e7..0000000000 --- a/spec/ruby/library/rexml/node/index_in_parent_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#index_in_parent" do - it "returns the index (starting from 1) of self in parent" do - e = REXML::Element.new("root") - node1 = REXML::Element.new("node") - node2 = REXML::Element.new("another node") - e << node1 - e << node2 - - node1.index_in_parent.should == 1 - node2.index_in_parent.should == 2 - end -end diff --git a/spec/ruby/library/rexml/node/next_sibling_node_spec.rb b/spec/ruby/library/rexml/node/next_sibling_node_spec.rb deleted file mode 100644 index 2e8601627d..0000000000 --- a/spec/ruby/library/rexml/node/next_sibling_node_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#next_sibling_node" do - before :each do - @e = REXML::Element.new("root") - @node1 = REXML::Element.new("node") - @node2 = REXML::Element.new("another node") - @e << @node1 - @e << @node2 - end - - it "returns the next child node in parent" do - @node1.next_sibling_node.should == @node2 - end - - it "returns nil if there are no more child nodes next" do - @node2.next_sibling_node.should == nil - @e.next_sibling_node.should == nil - end -end diff --git a/spec/ruby/library/rexml/node/parent_spec.rb b/spec/ruby/library/rexml/node/parent_spec.rb deleted file mode 100644 index d88ba69657..0000000000 --- a/spec/ruby/library/rexml/node/parent_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#parent?" do - it "returns true for Elements" do - e = REXML::Element.new("foo") - e.parent?.should == true - end - - it "returns true for Documents" do - e = REXML::Document.new - e.parent?.should == true - end - - # This includes attributes, CDatas and declarations. - it "returns false for Texts" do - e = REXML::Text.new("foo") - e.parent?.should == false - end -end diff --git a/spec/ruby/library/rexml/node/previous_sibling_node_spec.rb b/spec/ruby/library/rexml/node/previous_sibling_node_spec.rb deleted file mode 100644 index 8b96f1565a..0000000000 --- a/spec/ruby/library/rexml/node/previous_sibling_node_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Node#previous_sibling_node" do - before :each do - @e = REXML::Element.new("root") - @node1 = REXML::Element.new("node") - @node2 = REXML::Element.new("another node") - @e << @node1 - @e << @node2 - end - - it "returns the previous child node in parent" do - @node2.previous_sibling_node.should == @node1 - end - - it "returns nil if there are no more child nodes before" do - @node1.previous_sibling_node.should == nil - @e.previous_sibling_node.should == nil - end -end diff --git a/spec/ruby/library/rexml/shared/each_element.rb b/spec/ruby/library/rexml/shared/each_element.rb deleted file mode 100644 index 2e0871161d..0000000000 --- a/spec/ruby/library/rexml/shared/each_element.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe :rexml_each_element, shared: true do - before :each do - @e = REXML::Element.new "root" - s1 = REXML::Element.new "node1" - s2 = REXML::Element.new "node2" - s3 = REXML::Element.new "node3" - s4 = REXML::Element.new "sub_node" - @e << s1 - @e << s2 - @e << s3 - @e << s4 - end - - it "iterates through element" do - str = "" - @e.send(@method) { |elem| str << elem.name << " " } - str.should == "node1 node2 node3 sub_node " - end - - it "iterates through element filtering with XPath" do - str = "" - @e.send(@method, "/*"){ |e| str << e.name << " "} - str.should == "node1 node2 node3 sub_node " - end -end - -describe "REXML::Element#each_element" do - it_behaves_like :rexml_each_element, :each_element -end - -describe "REXML::Elements#each" do - it_behaves_like :rexml_each_element, :each -end diff --git a/spec/ruby/library/rexml/shared/elements_to_a.rb b/spec/ruby/library/rexml/shared/elements_to_a.rb deleted file mode 100644 index 388250d8b3..0000000000 --- a/spec/ruby/library/rexml/shared/elements_to_a.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'rexml/document' -require_relative '../../../spec_helper' - -describe :rexml_elements_to_a, shared: true do - before :each do - @e = REXML::Element.new "root" - @first = REXML::Element.new("FirstChild") - @second = REXML::Element.new("SecondChild") - @e << @first - @e << @second - end - - it "returns elements that match xpath" do - @e.elements.send(@method, "FirstChild").first.should == @first - end - - # According to the docs REXML::Element#get_elements is an alias for - # REXML::Elements.to_a. Implementation wise there's a difference, get_elements - # always needs the first param (even if it's nil). - # A patch was submitted: - # http://rubyforge.org/tracker/index.php?func=detail&aid=19354&group_id=426&atid=1698 - it "returns all childs if xpath is nil" do - @e.elements.send(@method).should == [@first, @second] - end - -end - -describe "REXML::REXML::Elements#to_a" do - it_behaves_like :rexml_elements_to_a, :to_a -end - -describe "REXML::REXML::Element#get_elements" do - it_behaves_like :rexml_elements_to_a, :get_elements -end diff --git a/spec/ruby/library/rexml/text/append_spec.rb b/spec/ruby/library/rexml/text/append_spec.rb deleted file mode 100644 index de281fb0b0..0000000000 --- a/spec/ruby/library/rexml/text/append_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#<<" do - it "appends a string to this text node" do - text = REXML::Text.new("foo") - text << "bar" - text.should == "foobar" - end -end diff --git a/spec/ruby/library/rexml/text/clone_spec.rb b/spec/ruby/library/rexml/text/clone_spec.rb deleted file mode 100644 index 8031e140c7..0000000000 --- a/spec/ruby/library/rexml/text/clone_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#clone" do - it "creates a copy of this node" do - text = REXML::Text.new("foo") - text.clone.should == "foo" - text.clone.should == text - end -end diff --git a/spec/ruby/library/rexml/text/comparison_spec.rb b/spec/ruby/library/rexml/text/comparison_spec.rb deleted file mode 100644 index 8bc5d66a03..0000000000 --- a/spec/ruby/library/rexml/text/comparison_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#<=>" do - before :each do - @first = REXML::Text.new("abc") - @last = REXML::Text.new("def") - end - - it "returns -1 if lvalue is less than rvalue" do - val = @first <=> @last - val.should == -1 - end - - it "returns -1 if lvalue is greater than rvalue" do - val = @last <=> @first - val.should == 1 - end - - it "returns 0 if both values are equal" do - tmp = REXML::Text.new("tmp") - val = tmp <=> tmp - val.should == 0 - end -end diff --git a/spec/ruby/library/rexml/text/empty_spec.rb b/spec/ruby/library/rexml/text/empty_spec.rb deleted file mode 100644 index d0b66b7a2a..0000000000 --- a/spec/ruby/library/rexml/text/empty_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#empty?" do - it "returns true if the text is empty" do - REXML::Text.new("").empty?.should == true - end - - it "returns false if the text is not empty" do - REXML::Text.new("some_text").empty?.should == false - end -end diff --git a/spec/ruby/library/rexml/text/indent_text_spec.rb b/spec/ruby/library/rexml/text/indent_text_spec.rb deleted file mode 100644 index 1b0ee5ab16..0000000000 --- a/spec/ruby/library/rexml/text/indent_text_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#indent_text" do - before :each do - @t = REXML::Text.new("") - end - it "indents a string with default parameters" do - @t.indent_text("foo").should == "\tfoo" - end - - it "accepts a custom indentation level as second argument" do - @t.indent_text("foo", 2, "\t", true).should == "\t\tfoo" - end - - it "accepts a custom separator as third argument" do - @t.indent_text("foo", 1, "\n", true).should == "\nfoo" - end - - it "accepts a fourth parameter to skip the first line" do - @t.indent_text("foo", 1, "\t", false).should == "foo" - end -end diff --git a/spec/ruby/library/rexml/text/inspect_spec.rb b/spec/ruby/library/rexml/text/inspect_spec.rb deleted file mode 100644 index 0d66088a64..0000000000 --- a/spec/ruby/library/rexml/text/inspect_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#inspect" do - it "inspects the string attribute as a string" do - REXML::Text.new("a text").inspect.should == "a text".inspect - end -end diff --git a/spec/ruby/library/rexml/text/new_spec.rb b/spec/ruby/library/rexml/text/new_spec.rb deleted file mode 100644 index a1fdcddf28..0000000000 --- a/spec/ruby/library/rexml/text/new_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text.new" do - - it "creates a Text child node with no parent" do - t = REXML::Text.new("test") - t.should be_kind_of(REXML::Child) - t.should == "test" - t.parent.should == nil - end - - it "respects whitespace if second argument is true" do - t = REXML::Text.new("testing whitespace", true) - t.should == "testing whitespace" - t = REXML::Text.new(" ", true) - t.should == " " - end - - it "receives a parent as third argument" do - e = REXML::Element.new("root") - t = REXML::Text.new("test", false, e) - t.parent.should == e - e.to_s.should == "<root>test</root>" - end - - it "expects escaped text if raw is true" do - t = REXML::Text.new("<&>", false, nil, true) - t.should == "<&>" - - lambda{ REXML::Text.new("<&>", false, nil, true)}.should raise_error(Exception) - end - - it "uses raw value of the parent if raw is nil" do - e1 = REXML::Element.new("root", nil, { raw: :all}) - lambda {REXML::Text.new("<&>", false, e1)}.should raise_error(Exception) - - e2 = REXML::Element.new("root", nil, { raw: []}) - e2.raw.should be_false - t1 = REXML::Text.new("<&>", false, e2) - t1.should == "<&>" - end - - it "escapes the values if raw is false" do - t = REXML::Text.new("<&>", false, nil, false) - t.should == "<&>" - end -end diff --git a/spec/ruby/library/rexml/text/node_type_spec.rb b/spec/ruby/library/rexml/text/node_type_spec.rb deleted file mode 100644 index 1c25a74dad..0000000000 --- a/spec/ruby/library/rexml/text/node_type_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#node_type" do - it "returns :text" do - REXML::Text.new("test").node_type.should == :text - end -end diff --git a/spec/ruby/library/rexml/text/normalize_spec.rb b/spec/ruby/library/rexml/text/normalize_spec.rb deleted file mode 100644 index ce3b2b3b5f..0000000000 --- a/spec/ruby/library/rexml/text/normalize_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text.normalize" do - it "escapes a string with <, >, &, ' and \" " do - REXML::Text.normalize("< > & \" '").should == "< > & " '" - end -end diff --git a/spec/ruby/library/rexml/text/read_with_substitution_spec.rb b/spec/ruby/library/rexml/text/read_with_substitution_spec.rb deleted file mode 100644 index a9b4d30bc5..0000000000 --- a/spec/ruby/library/rexml/text/read_with_substitution_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text.read_with_substitution" do - it "reads a text and escapes entities" do - REXML::Text.read_with_substitution("< > & " '").should == "< > & \" '" - end - - it "accepts an regex for invalid expressions and raises an error if text matches" do - lambda {REXML::Text.read_with_substitution("this is illegal", /illegal/)}.should raise_error(Exception) - end -end diff --git a/spec/ruby/library/rexml/text/to_s_spec.rb b/spec/ruby/library/rexml/text/to_s_spec.rb deleted file mode 100644 index 14d7399a60..0000000000 --- a/spec/ruby/library/rexml/text/to_s_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#to_s" do - it "returns the string of this Text node" do - u = REXML::Text.new("sean russell", false, nil, true) - u.to_s.should == "sean russell" - - t = REXML::Text.new("some test text") - t.to_s.should == "some test text" - end - - it "escapes the text" do - t = REXML::Text.new("& < >") - t.to_s.should == "& < >" - end -end diff --git a/spec/ruby/library/rexml/text/unnormalize_spec.rb b/spec/ruby/library/rexml/text/unnormalize_spec.rb deleted file mode 100644 index 3072809c13..0000000000 --- a/spec/ruby/library/rexml/text/unnormalize_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text.unnormalize" do - it "unescapes a string with the values defined in SETUTITSBUS" do - REXML::Text.unnormalize("< > & " '").should == "< > & \" '" - end -end diff --git a/spec/ruby/library/rexml/text/value_spec.rb b/spec/ruby/library/rexml/text/value_spec.rb deleted file mode 100644 index b0545b3cbd..0000000000 --- a/spec/ruby/library/rexml/text/value_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#value" do - it "returns the text value of this node" do - REXML::Text.new("test").value.should == "test" - end - - it "does not escape entities" do - REXML::Text.new("& \"").value.should == "& \"" - end - - it "follows the respect_whitespace attribute" do - REXML::Text.new("test bar", false).value.should == "test bar" - REXML::Text.new("test bar", true).value.should == "test bar" - end - - it "ignores the raw attribute" do - REXML::Text.new("sean russell", false, nil, true).value.should == "sean russell" - end -end - -describe "REXML::Text#value=" do - before :each do - @t = REXML::Text.new("new") - end - - it "sets the text of the node" do - @t.value = "another text" - @t.to_s.should == "another text" - end - - it "escapes entities" do - @t.value = "<a>" - @t.to_s.should == "<a>" - end -end diff --git a/spec/ruby/library/rexml/text/wrap_spec.rb b/spec/ruby/library/rexml/text/wrap_spec.rb deleted file mode 100644 index 0b60fd4151..0000000000 --- a/spec/ruby/library/rexml/text/wrap_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#wrap" do - before :each do - @t = REXML::Text.new("abc def") - end - - it "wraps the text at width" do - @t.wrap("abc def", 3, false).should == "abc\ndef" - end - - it "returns the string if width is greater than the size of the string" do - @t.wrap("abc def", 10, false).should == "abc def" - end - - it "takes a newline at the beginning option as the third parameter" do - @t.wrap("abc def", 3, true).should == "\nabc\ndef" - end -end diff --git a/spec/ruby/library/rexml/text/write_with_substitution_spec.rb b/spec/ruby/library/rexml/text/write_with_substitution_spec.rb deleted file mode 100644 index ee79489d86..0000000000 --- a/spec/ruby/library/rexml/text/write_with_substitution_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require 'rexml/document' - -describe "REXML::Text#write_with_substitution" do - before :each do - @t = REXML::Text.new("test") - @f = tmp("rexml_spec") - @file = File.open(@f, "w+") - end - - after :each do - @file.close - rm_r @f - end - - it "writes out the input to a String" do - s = "" - @t.write_with_substitution(s, "some text") - s.should == "some text" - end - - it "writes out the input to an IO" do - @t.write_with_substitution(@file, "some text") - @file.rewind - @file.gets.should == "some text" - end - - it "escapes characters" do - @t.write_with_substitution(@file, "& < >") - @file.rewind - @file.gets.should == "& < >" - end -end diff --git a/spec/ruby/library/ripper/lex_spec.rb b/spec/ruby/library/ripper/lex_spec.rb new file mode 100644 index 0000000000..0255480579 --- /dev/null +++ b/spec/ruby/library/ripper/lex_spec.rb @@ -0,0 +1,23 @@ +require_relative '../../spec_helper' +require 'ripper' + +describe "Ripper.lex" do + it "lexes a simple method declaration" do + expected = [ + [[1, 0], :on_kw, "def", 'FNAME'], + [[1, 3], :on_sp, " ", 'FNAME'], + [[1, 4], :on_ident, "m", 'ENDFN'], + [[1, 5], :on_lparen, "(", 'BEG|LABEL'], + [[1, 6], :on_ident, "a", 'ARG'], + [[1, 7], :on_rparen, ")", 'ENDFN'], + [[1, 8], :on_semicolon, ";", 'BEG'], + [[1, 9], :on_kw, "nil", 'END'], + [[1, 12], :on_sp, " ", 'END'], + [[1, 13], :on_kw, "end", 'END'] + ] + lexed = Ripper.lex("def m(a);nil end") + lexed.map { |e| + e[0...-1] + [e[-1].to_s] + }.should == expected + end +end diff --git a/spec/ruby/library/ripper/sexp_spec.rb b/spec/ruby/library/ripper/sexp_spec.rb new file mode 100644 index 0000000000..6c69624c65 --- /dev/null +++ b/spec/ruby/library/ripper/sexp_spec.rb @@ -0,0 +1,13 @@ +require_relative '../../spec_helper' +require 'ripper' + +describe "Ripper.sexp" do + it "returns an s-expression for a method declaration" do + expected = [:program, + [[:def, + [:@ident, "hello", [1, 4]], + [:params, nil, nil, nil, nil, nil, nil, nil], + [:bodystmt, [[:@int, "42", [1, 11]]], nil, nil, nil]]]] + Ripper.sexp("def hello; 42; end").should == expected + end +end diff --git a/spec/ruby/library/rubygems/gem/bin_path_spec.rb b/spec/ruby/library/rubygems/gem/bin_path_spec.rb new file mode 100644 index 0000000000..0b8c4db08b --- /dev/null +++ b/spec/ruby/library/rubygems/gem/bin_path_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../../spec_helper' +require 'rubygems' + +describe "Gem.bin_path" do + before :each do + @bundle_gemfile = ENV['BUNDLE_GEMFILE'] + ENV['BUNDLE_GEMFILE'] = tmp("no-gemfile") + end + + after :each do + ENV['BUNDLE_GEMFILE'] = @bundle_gemfile + end + + platform_is_not :windows do + it "finds executables of default gems, which are the only files shipped for default gems" do + # For instance, Gem.bin_path("bundler", "bundle") is used by rails new + + if Gem.respond_to? :default_specifications_dir + default_specifications_dir = Gem.default_specifications_dir + else + default_specifications_dir = Gem::Specification.default_specifications_dir + end + + skip "Could not find the default gemspecs" unless Dir.exist?(default_specifications_dir) + skip "default_specifications_dir mismatch with GEM_HOME" if ENV["GEM_HOME"] && !default_specifications_dir.start_with?(ENV['GEM_HOME']) + + Gem::Specification.each_spec([default_specifications_dir]) do |spec| + spec.executables.each do |exe| + path = Gem.bin_path(spec.name, exe) + File.should.exist?(path) + end + end + end + end +end diff --git a/spec/ruby/library/rubygems/gem/load_path_insert_index_spec.rb b/spec/ruby/library/rubygems/gem/load_path_insert_index_spec.rb new file mode 100644 index 0000000000..693c72a29e --- /dev/null +++ b/spec/ruby/library/rubygems/gem/load_path_insert_index_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../../spec_helper' +require 'rubygems' + +describe "Gem.load_path_insert_index" do + guard -> { RbConfig::TOPDIR } do + it "is set for an installed Ruby" do + Gem.load_path_insert_index.should.is_a? Integer + end + end +end diff --git a/spec/ruby/library/scanf/io/block_scanf_spec.rb b/spec/ruby/library/scanf/io/block_scanf_spec.rb deleted file mode 100644 index 2c1e242cf6..0000000000 --- a/spec/ruby/library/scanf/io/block_scanf_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/block_scanf' -require 'scanf' - -describe "IO#block_scanf" do - it_behaves_like :scanf_io_block_scanf, :block_scanf -end diff --git a/spec/ruby/library/scanf/io/fixtures/date.txt b/spec/ruby/library/scanf/io/fixtures/date.txt deleted file mode 100644 index a1bd635c0c..0000000000 --- a/spec/ruby/library/scanf/io/fixtures/date.txt +++ /dev/null @@ -1,4 +0,0 @@ -Beethoven 1770 -Bach 1685 -Handel 1685 - diff --git a/spec/ruby/library/scanf/io/fixtures/helloworld.txt b/spec/ruby/library/scanf/io/fixtures/helloworld.txt deleted file mode 100644 index 3b18e512db..0000000000 --- a/spec/ruby/library/scanf/io/fixtures/helloworld.txt +++ /dev/null @@ -1 +0,0 @@ -hello world diff --git a/spec/ruby/library/scanf/io/scanf_spec.rb b/spec/ruby/library/scanf/io/scanf_spec.rb deleted file mode 100644 index 94e999335e..0000000000 --- a/spec/ruby/library/scanf/io/scanf_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/block_scanf' -require 'scanf' - -describe "IO#scanf" do - before :each do - @hw = File.open(File.dirname(__FILE__) + '/fixtures/helloworld.txt', 'r') - @data = File.open(File.dirname(__FILE__) + '/fixtures/date.txt', 'r') - end - - after :each do - @hw.close unless @hw.closed? - @data.close unless @data.closed? - end - - it "returns an array containing the input converted in the specified type" do - @hw.scanf("%s%s").should == ["hello", "world"] - @data.scanf("%s%d").should == ["Beethoven", 1770] - end - - it "returns an array containing the input converted in the specified type with given maximum field width" do - @hw.scanf("%2s").should == ["he"] - @data.scanf("%2c").should == ["Be"] - end - - it "returns an empty array when a wrong specifier is passed" do - @hw.scanf("%a").should == [] - @hw.scanf("%1").should == [] - @data.scanf("abc").should == [] - end -end - -describe "IO#scanf with block" do - it_behaves_like :scanf_io_block_scanf, :scanf -end diff --git a/spec/ruby/library/scanf/io/shared/block_scanf.rb b/spec/ruby/library/scanf/io/shared/block_scanf.rb deleted file mode 100644 index 8c5bffb93b..0000000000 --- a/spec/ruby/library/scanf/io/shared/block_scanf.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'scanf' - -describe :scanf_io_block_scanf, shared: true do - before :each do - @data= File.open(File.dirname(__FILE__) + '/../fixtures/date.txt', 'r') - end - - after :each do - @data.close unless @data.closed? - end - - it "passes each match to the block as an array" do - res = @data.send(@method, "%s%d") { |name, year| "#{name} was born in #{year}." } - res.should == ["Beethoven was born in 1770.", "Bach was born in 1685.", "Handel was born in 1685."] - end - - it "keeps scanning the input and cycling back to the beginning of the input string" do - a = [] - @data.send(@method, "%s"){|w| a << w} - a.should == [["Beethoven"], ["1770"], ["Bach"], ["1685"], ["Handel"], ["1685"]] - end - - it "returns an empty array when a wrong specifier is passed" do - a = [] - @data.send(@method, "%z"){|w| a << w} - a.empty?.should be_true - end -end diff --git a/spec/ruby/library/scanf/string/block_scanf_spec.rb b/spec/ruby/library/scanf/string/block_scanf_spec.rb deleted file mode 100644 index d5c42cb395..0000000000 --- a/spec/ruby/library/scanf/string/block_scanf_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/block_scanf' -require 'scanf' - -describe "String#block_scanf" do - it_behaves_like :scanf_string_block_scanf, :block_scanf -end diff --git a/spec/ruby/library/scanf/string/scanf_spec.rb b/spec/ruby/library/scanf/string/scanf_spec.rb deleted file mode 100644 index fbe2590476..0000000000 --- a/spec/ruby/library/scanf/string/scanf_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/block_scanf' -require 'scanf' - -describe "String#scanf" do - it "returns an array containing the input converted in the specified type" do - "hello world".scanf("%s").should == ["hello"] - "hello world".scanf("%s%d").should == ["hello"] - "hello world".scanf("%s%c").should == ["hello", " "] - "hello world".scanf("%c%s").should == ["h", "ello"] - "hello world".scanf("%s%s").should == ["hello", "world"] - "hello world".scanf("%c").should == ["h"] - "123".scanf("%s").should == ["123"] - "123".scanf("%c").should == ["1"] - "123".scanf("%d").should == [123] - "123".scanf("%u").should == [123] - "123".scanf("%o").should == [83] - "123".scanf("%x").should == [291] - "123".scanf("%i").should == [123] - "0123".scanf("%i").should == [83] - "123".scanf("%f").should == [123.0] - "0X123".scanf("%i").should == [291] - "0x123".scanf("%i").should == [291] - end - - it "returns an array containing the input converted in the specified type with given maximum field width" do - "hello world".scanf("%2s").should == ["he"] - "hello world".scanf("%2c").should == ["he"] - "123".scanf("%2s").should == ["12"] - "123".scanf("%2c").should == ["12"] - "123".scanf("%2d").should == [12] - "123".scanf("%2u").should == [12] - "123".scanf("%2o").should == [10] - "123".scanf("%2x").should == [18] - "123".scanf("%2i").should == [12] - "0123".scanf("%2i").should == [1] - "123".scanf("%2f").should == [12.0] - "0X123".scanf("%2i").should == [0] - "0X123".scanf("%3i").should == [1] - "0X123".scanf("%4i").should == [18] - end - - it "returns an empty array when a wrong specifier is passed" do - "hello world".scanf("%a").should == [] - "123".scanf("%1").should == [] - "123".scanf("abc").should == [] - "123".scanf(:d).should == [] - end -end - -describe "String#scanf with block" do - it_behaves_like :scanf_string_block_scanf, :scanf -end diff --git a/spec/ruby/library/scanf/string/shared/block_scanf.rb b/spec/ruby/library/scanf/string/shared/block_scanf.rb deleted file mode 100644 index 25ab3f442a..0000000000 --- a/spec/ruby/library/scanf/string/shared/block_scanf.rb +++ /dev/null @@ -1,25 +0,0 @@ -require 'scanf' - -describe :scanf_string_block_scanf, shared: true do - it "passes each match to the block as an array" do - a = [] - "hello world".send(@method, "%s%s"){|w| a << w} - a.should == [["hello", "world"]] - end - - it "keeps scanning the input and cycling back to the beginning of the input string" do - a = [] - "hello world".send(@method, "%s"){|w| a << w} - a.should == [["hello"], ["world"]] - - string = "123 abc 456 def 789 ghi" - s = string.send(@method, "%d%s"){|num,str| [num * 2, str.upcase]} - s.should == [[246, "ABC"], [912, "DEF"], [1578, "GHI"]] - end - - it "returns an empty array when a wrong specifier is passed" do - a = [] - "hello world".send(@method, "%z"){|w| a << w} - a.empty?.should be_true - end -end diff --git a/spec/ruby/library/securerandom/base64_spec.rb b/spec/ruby/library/securerandom/base64_spec.rb index c0ddbf85ce..49d4b8a029 100644 --- a/spec/ruby/library/securerandom/base64_spec.rb +++ b/spec/ruby/library/securerandom/base64_spec.rb @@ -6,13 +6,13 @@ describe "SecureRandom.base64" do it "generates a random base64 string out of specified number of random bytes" do (16..128).each do |idx| base64 = SecureRandom.base64(idx) - base64.should be_kind_of(String) + base64.should.is_a?(String) base64.length.should < 2 * idx base64.should =~ /^[A-Za-z0-9\+\/]+={0,2}$/ end base64 = SecureRandom.base64(16.5) - base64.should be_kind_of(String) + base64.should.is_a?(String) base64.length.should < 2 * 16 end @@ -32,19 +32,19 @@ describe "SecureRandom.base64" do end it "generates a random base64 string out of 32 random bytes" do - SecureRandom.base64.should be_kind_of(String) + SecureRandom.base64.should.is_a?(String) SecureRandom.base64.length.should < 32 * 2 end it "treats nil argument as default one and generates a random base64 string" do - SecureRandom.base64(nil).should be_kind_of(String) + SecureRandom.base64(nil).should.is_a?(String) SecureRandom.base64(nil).length.should < 32 * 2 end it "raises ArgumentError on negative arguments" do - lambda { + -> { SecureRandom.base64(-1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "tries to convert the passed argument to an Integer using #to_int" do diff --git a/spec/ruby/library/securerandom/bytes_spec.rb b/spec/ruby/library/securerandom/bytes_spec.rb new file mode 100644 index 0000000000..a1ab836d16 --- /dev/null +++ b/spec/ruby/library/securerandom/bytes_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' +require_relative '../../core/random/shared/bytes' + +require 'securerandom' + +describe "SecureRandom.bytes" do + it_behaves_like :random_bytes, :bytes, SecureRandom +end diff --git a/spec/ruby/library/securerandom/hex_spec.rb b/spec/ruby/library/securerandom/hex_spec.rb index 1e647edebc..ec33aca1ee 100644 --- a/spec/ruby/library/securerandom/hex_spec.rb +++ b/spec/ruby/library/securerandom/hex_spec.rb @@ -3,16 +3,16 @@ require_relative '../../spec_helper' require 'securerandom' describe "SecureRandom.hex" do - it "generates a random hex string of length twice the specified argement" do + it "generates a random hex string of length twice the specified argument" do (1..64).each do |idx| hex = SecureRandom.hex(idx) - hex.should be_kind_of(String) + hex.should.is_a?(String) hex.length.should == 2 * idx end base64 = SecureRandom.hex(5.5) - base64.should be_kind_of(String) - base64.length.should eql(10) + base64.should.is_a?(String) + base64.length.should.eql?(10) end it "returns an empty string when argument is 0" do @@ -31,24 +31,24 @@ describe "SecureRandom.hex" do end it "generates a random hex string of length 32 if no argument is provided" do - SecureRandom.hex.should be_kind_of(String) + SecureRandom.hex.should.is_a?(String) SecureRandom.hex.length.should == 32 end it "treats nil argument as default one and generates a random hex string of length 32" do - SecureRandom.hex(nil).should be_kind_of(String) + SecureRandom.hex(nil).should.is_a?(String) SecureRandom.hex(nil).length.should == 32 end it "raises ArgumentError on negative arguments" do - lambda { + -> { SecureRandom.hex(-1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "tries to convert the passed argument to an Integer using #to_int" do obj = mock("to_int") obj.should_receive(:to_int).and_return(5) - SecureRandom.hex(obj).size.should eql(10) + SecureRandom.hex(obj).size.should.eql?(10) end end diff --git a/spec/ruby/library/securerandom/random_bytes_spec.rb b/spec/ruby/library/securerandom/random_bytes_spec.rb index 7ab949f5d4..4e30a53163 100644 --- a/spec/ruby/library/securerandom/random_bytes_spec.rb +++ b/spec/ruby/library/securerandom/random_bytes_spec.rb @@ -1,28 +1,31 @@ require_relative '../../spec_helper' +require_relative '../../core/random/shared/bytes' require 'securerandom' describe "SecureRandom.random_bytes" do + it_behaves_like :random_bytes, :random_bytes, SecureRandom + it "generates a random binary string of length 16 if no argument is provided" do bytes = SecureRandom.random_bytes - bytes.should be_kind_of(String) + bytes.should.is_a?(String) bytes.length.should == 16 end it "generates a random binary string of length 16 if argument is nil" do bytes = SecureRandom.random_bytes(nil) - bytes.should be_kind_of(String) + bytes.should.is_a?(String) bytes.length.should == 16 end it "generates a random binary string of specified length" do (1..64).each do |idx| bytes = SecureRandom.random_bytes(idx) - bytes.should be_kind_of(String) + bytes.should.is_a?(String) bytes.length.should == idx end - SecureRandom.random_bytes(2.2).length.should eql(2) + SecureRandom.random_bytes(2.2).length.should.eql?(2) end it "generates different binary strings with subsequent invocations" do @@ -37,14 +40,14 @@ describe "SecureRandom.random_bytes" do end it "raises ArgumentError on negative arguments" do - lambda { + -> { SecureRandom.random_bytes(-1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "tries to convert the passed argument to an Integer using #to_int" do obj = mock("to_int") obj.should_receive(:to_int).and_return(5) - SecureRandom.random_bytes(obj).size.should eql(5) + SecureRandom.random_bytes(obj).size.should.eql?(5) end end diff --git a/spec/ruby/library/securerandom/random_number_spec.rb b/spec/ruby/library/securerandom/random_number_spec.rb index 6b3279e6d7..97cd66f7bc 100644 --- a/spec/ruby/library/securerandom/random_number_spec.rb +++ b/spec/ruby/library/securerandom/random_number_spec.rb @@ -1,14 +1,18 @@ require_relative '../../spec_helper' +require_relative '../../core/random/shared/rand' require 'securerandom' describe "SecureRandom.random_number" do + it_behaves_like :random_number, :rand, SecureRandom + it_behaves_like :random_number, :random_number, SecureRandom + it "generates a random positive number smaller then the positive integer argument" do (1..64).each do |idx| num = SecureRandom.random_number(idx) - num.should be_kind_of(Fixnum) - (0 <= num).should == true - (num < idx).should == true + num.should.is_a?(Integer) + 0.should <= num + num.should < idx end end @@ -16,27 +20,27 @@ describe "SecureRandom.random_number" do max = 12345678901234567890 11.times do num = SecureRandom.random_number max - num.should be_kind_of(Integer) - (0 <= num).should == true - (num < max).should == true + num.should.is_a?(Integer) + 0.should <= num + num.should < max end end it "generates a random float number between 0.0 and 1.0 if no argument provided" do 64.times do num = SecureRandom.random_number - num.should be_kind_of(Float) - (0.0 <= num).should == true - (num < 1.0).should == true + num.should.is_a?(Float) + 0.0.should <= num + num.should < 1.0 end end it "generates a random value in given (integer) range limits" do 64.times do num = SecureRandom.random_number 11...13 - num.should be_kind_of(Integer) - (11 <= num).should == true - (num < 13).should == true + num.should.is_a?(Integer) + 11.should <= num + num.should < 13 end end @@ -45,33 +49,33 @@ describe "SecureRandom.random_number" do upper = 12345678901234567890 + 5 32.times do num = SecureRandom.random_number lower..upper - num.should be_kind_of(Integer) - (lower <= num).should == true - (num <= upper).should == true + num.should.is_a?(Integer) + lower.should <= num + num.should <= upper end end it "generates a random value in given (float) range limits" do 64.times do num = SecureRandom.random_number 0.6..0.9 - num.should be_kind_of(Float) - (0.6 <= num).should == true - (num <= 0.9).should == true + num.should.is_a?(Float) + 0.6.should <= num + num.should <= 0.9 end end it "generates a random float number between 0.0 and 1.0 if argument is negative" do num = SecureRandom.random_number(-10) - num.should be_kind_of(Float) - (0.0 <= num).should == true - (num < 1.0).should == true + num.should.is_a?(Float) + 0.0.should <= num + num.should < 1.0 end it "generates a random float number between 0.0 and 1.0 if argument is negative float" do num = SecureRandom.random_number(-11.1) - num.should be_kind_of(Float) - (0.0 <= num).should == true - (num < 1.0).should == true + num.should.is_a?(Float) + 0.0.should <= num + num.should < 1.0 end it "generates different float numbers with subsequent invocations" do @@ -80,14 +84,14 @@ describe "SecureRandom.random_number" do 256.times do val = SecureRandom.random_number # make sure the random values are not repeating - values.include?(val).should == false + values.should_not.include?(val) values << val end end it "raises ArgumentError if the argument is non-numeric" do - lambda { + -> { SecureRandom.random_number(Object.new) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/set/add_spec.rb b/spec/ruby/library/set/add_spec.rb deleted file mode 100644 index 68356cc111..0000000000 --- a/spec/ruby/library/set/add_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/add' - -describe "Set#add" do - it_behaves_like :set_add, :add -end - -describe "Set#add?" do - before :each do - @set = Set.new - end - - it "adds the passed Object to self" do - @set.add?("cat") - @set.should include("cat") - end - - it "returns self when the Object has not yet been added to self" do - @set.add?("cat").should equal(@set) - end - - it "returns nil when the Object has already been added to self" do - @set.add?("cat") - @set.add?("cat").should be_nil - end -end diff --git a/spec/ruby/library/set/append_spec.rb b/spec/ruby/library/set/append_spec.rb deleted file mode 100644 index 8b3498b779..0000000000 --- a/spec/ruby/library/set/append_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/add' - -describe "Set#<<" do - it_behaves_like :set_add, :<< -end diff --git a/spec/ruby/library/set/case_compare_spec.rb b/spec/ruby/library/set/case_compare_spec.rb deleted file mode 100644 index 193006dbda..0000000000 --- a/spec/ruby/library/set/case_compare_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/include' -require 'set' - -ruby_version_is "2.5" do - describe "Set#===" do - it_behaves_like :set_include, :=== - - it "is an alias for include?" do - set = Set.new - set.method(:===).should == set.method(:include?) - end - end -end diff --git a/spec/ruby/library/set/case_equality_spec.rb b/spec/ruby/library/set/case_equality_spec.rb deleted file mode 100644 index 875630612e..0000000000 --- a/spec/ruby/library/set/case_equality_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/include' -require 'set' - -ruby_version_is "2.5" do - describe "Set#===" do - it_behaves_like :set_include, :=== - end -end diff --git a/spec/ruby/library/set/classify_spec.rb b/spec/ruby/library/set/classify_spec.rb deleted file mode 100644 index ec600c91d6..0000000000 --- a/spec/ruby/library/set/classify_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#classify" do - before :each do - @set = Set["one", "two", "three", "four"] - end - - it "yields each Object in self" do - res = [] - @set.classify { |x| res << x } - res.sort.should == ["one", "two", "three", "four"].sort - end - - it "returns an Enumerator when passed no block" do - enum = @set.classify - enum.should be_an_instance_of(Enumerator) - - classified = enum.each { |x| x.length } - classified.should == { 3 => Set["one", "two"], 4 => Set["four"], 5 => Set["three"] } - end - - it "classifies the Objects in self based on the block's return value" do - classified = @set.classify { |x| x.length } - classified.should == { 3 => Set["one", "two"], 4 => Set["four"], 5 => Set["three"] } - end -end diff --git a/spec/ruby/library/set/clear_spec.rb b/spec/ruby/library/set/clear_spec.rb deleted file mode 100644 index 2b1c9c5b5a..0000000000 --- a/spec/ruby/library/set/clear_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#clear" do - before :each do - @set = Set["one", "two", "three", "four"] - end - - it "removes all elements from self" do - @set.clear - @set.should be_empty - end - - it "returns self" do - @set.clear.should equal(@set) - end -end diff --git a/spec/ruby/library/set/collect_spec.rb b/spec/ruby/library/set/collect_spec.rb deleted file mode 100644 index f8813a9331..0000000000 --- a/spec/ruby/library/set/collect_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/collect' - -describe "Set#collect!" do - it_behaves_like :set_collect_bang, :collect! -end diff --git a/spec/ruby/library/set/compare_by_identity_spec.rb b/spec/ruby/library/set/compare_by_identity_spec.rb deleted file mode 100644 index 363a108935..0000000000 --- a/spec/ruby/library/set/compare_by_identity_spec.rb +++ /dev/null @@ -1,147 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -ruby_version_is '2.4' do - describe "Set#compare_by_identity" do - it "compares its members by identity" do - a = "a" - b1 = "b" - b2 = "b" - - set = Set.new - set.compare_by_identity - set.merge([a, a, b1, b2]) - set.to_a.sort.should == [a, b1, b2].sort - end - - it "causes future comparisons on the receiver to be made by identity" do - elt = [1] - set = Set.new - set << elt - set.member?(elt.dup).should be_true - set.compare_by_identity - set.member?(elt.dup).should be_false - end - - it "rehashes internally so that old members can be looked up" do - set = Set.new - (1..10).each { |k| set << k } - o = Object.new - def o.hash; 123; end - set << o - set.compare_by_identity - set.member?(o).should be_true - end - - it "returns self" do - set = Set.new - result = set.compare_by_identity - result.should equal(set) - end - - it "is idempotent and has no effect on an already compare_by_identity set" do - set = Set.new.compare_by_identity - set << :foo - set.compare_by_identity.should equal(set) - set.compare_by_identity?.should == true - set.to_a.should == [:foo] - end - - it "uses the semantics of BasicObject#equal? to determine members identity" do - :a.equal?(:a).should == true - Set.new.compare_by_identity.merge([:a, :a]).to_a.should == [:a] - - ary1 = [1] - ary2 = [1] - ary1.equal?(ary2).should == false - Set.new.compare_by_identity.merge([ary1, ary2]).to_a.sort.should == [ary1, ary2].sort - end - - it "uses #equal? semantics, but doesn't actually call #equal? to determine identity" do - set = Set.new.compare_by_identity - obj = mock("equal") - obj.should_not_receive(:equal?) - set << :foo - set << obj - set.to_a.should == [:foo, obj] - end - - it "does not call #hash on members" do - elt = mock("element") - elt.should_not_receive(:hash) - set = Set.new.compare_by_identity - set << elt - set.member?(elt).should be_true - end - - it "regards #dup'd objects as having different identities" do - a1 = "a" - a2 = a1.dup - - set = Set.new.compare_by_identity - set.merge([a1, a2]) - set.to_a.sort.should == [a1, a2].sort - end - - it "regards #clone'd objects as having different identities" do - a1 = "a" - a2 = a1.clone - - set = Set.new.compare_by_identity - set.merge([a1, a2]) - set.to_a.sort.should == [a1, a2].sort - end - - it "raises a #{frozen_error_class} on frozen sets" do - set = Set.new.freeze - lambda { - set.compare_by_identity - }.should raise_error(frozen_error_class, /frozen Hash/) - end - - it "persists over #dups" do - set = Set.new.compare_by_identity - set << :a - set_dup = set.dup - set_dup.should == set - set_dup << :a - set_dup.to_a.should == [:a] - end - - it "persists over #clones" do - set = Set.new.compare_by_identity - set << :a - set_clone = set.clone - set_clone.should == set - set_clone << :a - set_clone.to_a.should == [:a] - end - - it "is not equal to set what does not compare by identity" do - Set.new([1, 2]).should == Set.new([1, 2]) - Set.new([1, 2]).should_not == Set.new([1, 2]).compare_by_identity - end - end -end - -ruby_version_is '2.4' do - describe "Set#compare_by_identity?" do - it "returns false by default" do - Set.new.compare_by_identity?.should == false - end - - it "returns true once #compare_by_identity has been invoked on self" do - set = Set.new - set.compare_by_identity - set.compare_by_identity?.should == true - end - - it "returns true when called multiple times on the same set" do - set = Set.new - set.compare_by_identity - set.compare_by_identity?.should == true - set.compare_by_identity?.should == true - set.compare_by_identity?.should == true - end - end -end diff --git a/spec/ruby/library/set/constructor_spec.rb b/spec/ruby/library/set/constructor_spec.rb deleted file mode 100644 index bb84861514..0000000000 --- a/spec/ruby/library/set/constructor_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set[]" do - it "returns a new Set populated with the passed Objects" do - set = Set[1, 2, 3] - - set.instance_of?(Set).should be_true - set.size.should eql(3) - - set.should include(1) - set.should include(2) - set.should include(3) - end -end diff --git a/spec/ruby/library/set/delete_if_spec.rb b/spec/ruby/library/set/delete_if_spec.rb deleted file mode 100644 index 33caeeaab7..0000000000 --- a/spec/ruby/library/set/delete_if_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#delete_if" do - before :each do - @set = Set["one", "two", "three"] - end - - it "yields every element of self" do - ret = [] - @set.delete_if { |x| ret << x } - ret.sort.should == ["one", "two", "three"].sort - end - - it "deletes every element from self for which the passed block returns true" do - @set.delete_if { |x| x.size == 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self" do - @set.delete_if { |x| x }.should equal(@set) - end - - it "returns an Enumerator when passed no block" do - enum = @set.delete_if - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size == 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/delete_spec.rb b/spec/ruby/library/set/delete_spec.rb deleted file mode 100644 index b12524384a..0000000000 --- a/spec/ruby/library/set/delete_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#delete" do - before :each do - @set = Set["a", "b", "c"] - end - - it "deletes the passed Object from self" do - @set.delete("a") - @set.should_not include("a") - end - - it "returns self" do - @set.delete("a").should equal(@set) - @set.delete("x").should equal(@set) - end -end - -describe "Set#delete?" do - before :each do - @set = Set["a", "b", "c"] - end - - it "deletes the passed Object from self" do - @set.delete?("a") - @set.should_not include("a") - end - - it "returns self when the passed Object is in self" do - @set.delete?("a").should equal(@set) - end - - it "returns nil when the passed Object is not in self" do - @set.delete?("x").should be_nil - end -end diff --git a/spec/ruby/library/set/difference_spec.rb b/spec/ruby/library/set/difference_spec.rb deleted file mode 100644 index 422f2ed3c7..0000000000 --- a/spec/ruby/library/set/difference_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/difference' - -describe "Set#difference" do - it_behaves_like :set_difference, :difference -end diff --git a/spec/ruby/library/set/divide_spec.rb b/spec/ruby/library/set/divide_spec.rb deleted file mode 100644 index fdd8cd9622..0000000000 --- a/spec/ruby/library/set/divide_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#divide" do - it "divides self into a set of subsets based on the blocks return values" do - set = Set["one", "two", "three", "four", "five"].divide { |x| x.length } - set.map { |x| x.to_a.sort }.sort.should == [["five", "four"], ["one", "two"], ["three"]] - end - - it "yields each Object to the block" do - ret = [] - Set["one", "two", "three", "four", "five"].divide { |x| ret << x } - ret.sort.should == ["five", "four", "one", "three", "two"] - end - - # BUG: Does not raise a LocalJumpError, but a NoMethodError - # - # it "raises a LocalJumpError when not passed a block" do - # lambda { Set[1].divide }.should raise_error(LocalJumpError) - # end -end - -describe "Set#divide when passed a block with an arity of 2" do - it "divides self into a set of subsets based on the blocks return values" do - set = Set[1, 3, 4, 6, 9, 10, 11].divide { |x, y| (x - y).abs == 1 } - set.map{ |x| x.to_a.sort }.sort.should == [[1], [3, 4], [6], [9, 10, 11]] - end - - it "yields each two Object to the block" do - ret = [] - Set[1, 2].divide { |x, y| ret << [x, y] } - ret.sort.should == [[1, 1], [1, 2], [2, 1], [2, 2]] - end -end diff --git a/spec/ruby/library/set/each_spec.rb b/spec/ruby/library/set/each_spec.rb deleted file mode 100644 index 9bb5ead03a..0000000000 --- a/spec/ruby/library/set/each_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#each" do - before :each do - @set = Set[1, 2, 3] - end - - it "yields each Object in self" do - ret = [] - @set.each { |x| ret << x } - ret.sort.should == [1, 2, 3] - end - - it "returns self" do - @set.each { |x| x }.should equal(@set) - end - - it "returns an Enumerator when not passed a block" do - enum = @set.each - - ret = [] - enum.each { |x| ret << x } - ret.sort.should == [1, 2, 3] - end -end diff --git a/spec/ruby/library/set/empty_spec.rb b/spec/ruby/library/set/empty_spec.rb deleted file mode 100644 index 1789a664c7..0000000000 --- a/spec/ruby/library/set/empty_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#empty?" do - it "returns true if self is empty" do - Set[].empty?.should be_true - Set[1].empty?.should be_false - Set[1,2,3].empty?.should be_false - end -end diff --git a/spec/ruby/library/set/enumerable/to_set_spec.rb b/spec/ruby/library/set/enumerable/to_set_spec.rb deleted file mode 100644 index 6d81710a2f..0000000000 --- a/spec/ruby/library/set/enumerable/to_set_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "Emumerable#to_set" do - it "returns a new Set created from self" do - [1, 2, 3].to_set.should == Set[1, 2, 3] - {a: 1, b: 2}.to_set.should == Set[[:b, 2], [:a, 1]] - end - - it "allows passing an alternate class for Set" do - sorted_set = [1, 2, 3].to_set(SortedSet) - sorted_set.should == SortedSet[1, 2, 3] - sorted_set.instance_of?(SortedSet).should == true - end - - it "passes down passed blocks" do - [1, 2, 3].to_set { |x| x * x }.should == Set[1, 4, 9] - end -end diff --git a/spec/ruby/library/set/eql_spec.rb b/spec/ruby/library/set/eql_spec.rb deleted file mode 100644 index dd8e633775..0000000000 --- a/spec/ruby/library/set/eql_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#eql?" do - it "returns true when the passed argument is a Set and contains the same elements" do - Set[].should eql(Set[]) - Set[1, 2, 3].should eql(Set[1, 2, 3]) - Set[1, 2, 3].should eql(Set[3, 2, 1]) - Set["a", :b, ?c].should eql(Set[?c, :b, "a"]) - - Set[1, 2, 3].should_not eql(Set[1.0, 2, 3]) - Set[1, 2, 3].should_not eql(Set[2, 3]) - Set[1, 2, 3].should_not eql(Set[]) - end -end diff --git a/spec/ruby/library/set/equal_value_spec.rb b/spec/ruby/library/set/equal_value_spec.rb deleted file mode 100644 index 10e0efab1b..0000000000 --- a/spec/ruby/library/set/equal_value_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#==" do - it "returns true when the passed Object is a Set and self and the Object contain the same elements" do - Set[].should == Set[] - Set[1, 2, 3].should == Set[1, 2, 3] - Set["1", "2", "3"].should == Set["1", "2", "3"] - - Set[1, 2, 3].should_not == Set[1.0, 2, 3] - Set[1, 2, 3].should_not == [1, 2, 3] - end - - it "does not depend on the order of the elements" do - Set[1, 2, 3].should == Set[3, 2, 1] - Set[:a, "b", ?c].should == Set[?c, "b", :a] - end - - it "does not depend on the order of nested Sets" do - Set[Set[1], Set[2], Set[3]].should == Set[Set[3], Set[2], Set[1]] - - set1 = Set[Set["a", "b"], Set["c", "d"], Set["e", "f"]] - set2 = Set[Set["c", "d"], Set["a", "b"], Set["e", "f"]] - set1.should == set2 - end -end diff --git a/spec/ruby/library/set/exclusion_spec.rb b/spec/ruby/library/set/exclusion_spec.rb deleted file mode 100644 index 407aa70032..0000000000 --- a/spec/ruby/library/set/exclusion_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#^" do - before :each do - @set = Set[1, 2, 3, 4] - end - - it "returns a new Set containing elements that are not in both self and the passed Enumberable" do - (@set ^ Set[3, 4, 5]).should == Set[1, 2, 5] - (@set ^ [3, 4, 5]).should == Set[1, 2, 5] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set ^ 3 }.should raise_error(ArgumentError) - lambda { @set ^ Object.new }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/filter_spec.rb b/spec/ruby/library/set/filter_spec.rb deleted file mode 100644 index a4dfe70d52..0000000000 --- a/spec/ruby/library/set/filter_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/select' - -ruby_version_is "2.6" do - describe "Set#filter!" do - it_behaves_like :set_select_bang, :filter! - end -end diff --git a/spec/ruby/library/set/flatten_merge_spec.rb b/spec/ruby/library/set/flatten_merge_spec.rb deleted file mode 100644 index b4494b13a7..0000000000 --- a/spec/ruby/library/set/flatten_merge_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#flatten_merge" do - it "is protected" do - Set.should have_protected_instance_method("flatten_merge") - end - - it "flattens the passed Set and merges it into self" do - set1 = Set[1, 2] - set2 = Set[3, 4, Set[5, 6]] - - set1.send(:flatten_merge, set2).should == Set[1, 2, 3, 4, 5, 6] - end - - it "raises an ArgumentError when trying to flatten a recursive Set" do - set1 = Set[1, 2, 3] - set2 = Set[5, 6, 7] - set2 << set2 - - lambda { set1.send(:flatten_merge, set2) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/flatten_spec.rb b/spec/ruby/library/set/flatten_spec.rb deleted file mode 100644 index 4a037bbd5e..0000000000 --- a/spec/ruby/library/set/flatten_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#flatten" do - it "returns a copy of self with each included Set flattened" do - set = Set[1, 2, Set[3, 4, Set[5, 6, Set[7, 8]]], 9, 10] - flattened_set = set.flatten - - flattened_set.should_not equal(set) - flattened_set.should == Set[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - end - - it "raises an ArgumentError when self is recursive" do - (set = Set[]) << set - lambda { set.flatten }.should raise_error(ArgumentError) - end -end - -describe "Set#flatten!" do - it "flattens self" do - set = Set[1, 2, Set[3, 4, Set[5, 6, Set[7, 8]]], 9, 10] - set.flatten! - set.should == Set[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - end - - it "returns self when self was modified" do - set = Set[1, 2, Set[3, 4]] - set.flatten!.should equal(set) - end - - it "returns nil when self was not modified" do - set = Set[1, 2, 3, 4] - set.flatten!.should be_nil - end - - it "raises an ArgumentError when self is recursive" do - (set = Set[]) << set - lambda { set.flatten! }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/hash_spec.rb b/spec/ruby/library/set/hash_spec.rb deleted file mode 100644 index 47c43c05f1..0000000000 --- a/spec/ruby/library/set/hash_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#hash" do - it "is static" do - Set[].hash.should == Set[].hash - Set[1, 2, 3].hash.should == Set[1, 2, 3].hash - Set[:a, "b", ?c].hash.should == Set[?c, "b", :a].hash - - Set[].hash.should_not == Set[1, 2, 3].hash - Set[1, 2, 3].hash.should_not == Set[:a, "b", ?c].hash - end -end diff --git a/spec/ruby/library/set/include_spec.rb b/spec/ruby/library/set/include_spec.rb deleted file mode 100644 index 68532d9a04..0000000000 --- a/spec/ruby/library/set/include_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/include' -require 'set' - -describe "Set#include?" do - it_behaves_like :set_include, :include? -end diff --git a/spec/ruby/library/set/initialize_spec.rb b/spec/ruby/library/set/initialize_spec.rb deleted file mode 100644 index 11a1095fd7..0000000000 --- a/spec/ruby/library/set/initialize_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#initialize" do - it "is private" do - Set.should have_private_instance_method(:initialize) - end - - it "adds all elements of the passed Enumerable to self" do - s = Set.new([1, 2, 3]) - s.size.should eql(3) - s.should include(1) - s.should include(2) - s.should include(3) - end - - it "preprocesses all elements by a passed block before adding to self" do - s = Set.new([1, 2, 3]) { |x| x * x } - s.size.should eql(3) - s.should include(1) - s.should include(4) - s.should include(9) - end -end diff --git a/spec/ruby/library/set/inspect_spec.rb b/spec/ruby/library/set/inspect_spec.rb deleted file mode 100644 index 4060c63b95..0000000000 --- a/spec/ruby/library/set/inspect_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/inspect' -require 'set' - -describe "Set#inspect" do - it_behaves_like :set_inspect, :inspect -end diff --git a/spec/ruby/library/set/intersection_spec.rb b/spec/ruby/library/set/intersection_spec.rb deleted file mode 100644 index 792c2d8f07..0000000000 --- a/spec/ruby/library/set/intersection_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/intersection' -require 'set' - -describe "Set#intersection" do - it_behaves_like :set_intersection, :intersection -end - -describe "Set#&" do - it_behaves_like :set_intersection, :& -end diff --git a/spec/ruby/library/set/keep_if_spec.rb b/spec/ruby/library/set/keep_if_spec.rb deleted file mode 100644 index 7edc80769f..0000000000 --- a/spec/ruby/library/set/keep_if_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#keep_if" do - before :each do - @set = Set["one", "two", "three"] - end - - it "yields every element of self" do - ret = [] - @set.keep_if { |x| ret << x } - ret.sort.should == ["one", "two", "three"].sort - end - - it "keeps every element from self for which the passed block returns true" do - @set.keep_if { |x| x.size != 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self" do - @set.keep_if {}.should equal(@set) - end - - it "returns an Enumerator when passed no block" do - enum = @set.keep_if - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size != 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/length_spec.rb b/spec/ruby/library/set/length_spec.rb deleted file mode 100644 index fef63d25a7..0000000000 --- a/spec/ruby/library/set/length_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/length' -require 'set' - -describe "Set#length" do - it_behaves_like :set_length, :length -end diff --git a/spec/ruby/library/set/map_spec.rb b/spec/ruby/library/set/map_spec.rb deleted file mode 100644 index e60e98b179..0000000000 --- a/spec/ruby/library/set/map_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/collect' - -describe "Set#map!" do - it_behaves_like :set_collect_bang, :map! -end diff --git a/spec/ruby/library/set/member_spec.rb b/spec/ruby/library/set/member_spec.rb deleted file mode 100644 index 5b56a38ab9..0000000000 --- a/spec/ruby/library/set/member_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/include' -require 'set' - -describe "Set#member?" do - it_behaves_like :set_include, :member? -end diff --git a/spec/ruby/library/set/merge_spec.rb b/spec/ruby/library/set/merge_spec.rb deleted file mode 100644 index 5c65af0a9b..0000000000 --- a/spec/ruby/library/set/merge_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#merge" do - it "adds the elements of the passed Enumerable to self" do - Set[:a, :b].merge(Set[:b, :c, :d]).should == Set[:a, :b, :c, :d] - Set[1, 2].merge([3, 4]).should == Set[1, 2, 3, 4] - end - - it "returns self" do - set = Set[1, 2] - set.merge([3, 4]).should equal(set) - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { Set[1, 2].merge(1) }.should raise_error(ArgumentError) - lambda { Set[1, 2].merge(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/minus_spec.rb b/spec/ruby/library/set/minus_spec.rb deleted file mode 100644 index 3fe0b6a2cc..0000000000 --- a/spec/ruby/library/set/minus_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require 'set' -require_relative 'shared/difference' - -describe "Set#-" do - it_behaves_like :set_difference, :- -end diff --git a/spec/ruby/library/set/plus_spec.rb b/spec/ruby/library/set/plus_spec.rb deleted file mode 100644 index 3e70d3269d..0000000000 --- a/spec/ruby/library/set/plus_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/union' -require 'set' - -describe "Set#+" do - it_behaves_like :set_union, :+ -end diff --git a/spec/ruby/library/set/pretty_print_cycle_spec.rb b/spec/ruby/library/set/pretty_print_cycle_spec.rb deleted file mode 100644 index 4f440353e5..0000000000 --- a/spec/ruby/library/set/pretty_print_cycle_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#pretty_print_cycle" do - it "passes the 'pretty print' representation of a self-referencing Set to the pretty print writer" do - pp = mock("PrettyPrint") - pp.should_receive(:text).with("#<Set: {...}>") - Set[1, 2, 3].pretty_print_cycle(pp) - end -end diff --git a/spec/ruby/library/set/pretty_print_spec.rb b/spec/ruby/library/set/pretty_print_spec.rb deleted file mode 100644 index f2392e6968..0000000000 --- a/spec/ruby/library/set/pretty_print_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#pretty_print" do - it "passes the 'pretty print' representation of self to the pretty print writer" do - pp = mock("PrettyPrint") - set = Set[1, 2, 3] - - pp.should_receive(:text).with("#<Set: {") - pp.should_receive(:text).with("}>") - - pp.should_receive(:nest).with(1).and_yield - pp.should_receive(:seplist).with(set) - - set.pretty_print(pp) - end -end diff --git a/spec/ruby/library/set/proper_subset_spec.rb b/spec/ruby/library/set/proper_subset_spec.rb deleted file mode 100644 index d925e80a8b..0000000000 --- a/spec/ruby/library/set/proper_subset_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#proper_subset?" do - before :each do - @set = Set[1, 2, 3, 4] - end - - it "returns true if passed a Set that self is a proper subset of" do - Set[].proper_subset?(@set).should be_true - Set[].proper_subset?(Set[1, 2, 3]).should be_true - Set[].proper_subset?(Set["a", :b, ?c]).should be_true - - Set[1, 2, 3].proper_subset?(@set).should be_true - Set[1, 3].proper_subset?(@set).should be_true - Set[1, 2].proper_subset?(@set).should be_true - Set[1].proper_subset?(@set).should be_true - - Set[5].proper_subset?(@set).should be_false - Set[1, 5].proper_subset?(@set).should be_false - Set[nil].proper_subset?(@set).should be_false - Set["test"].proper_subset?(@set).should be_false - - @set.proper_subset?(@set).should be_false - Set[].proper_subset?(Set[]).should be_false - end - - it "raises an ArgumentError when passed a non-Set" do - lambda { Set[].proper_subset?([]) }.should raise_error(ArgumentError) - lambda { Set[].proper_subset?(1) }.should raise_error(ArgumentError) - lambda { Set[].proper_subset?("test") }.should raise_error(ArgumentError) - lambda { Set[].proper_subset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/proper_superset_spec.rb b/spec/ruby/library/set/proper_superset_spec.rb deleted file mode 100644 index cdfd44f32f..0000000000 --- a/spec/ruby/library/set/proper_superset_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#proper_superset?" do - before :each do - @set = Set[1, 2, 3, 4] - end - - it "returns true if passed a Set that self is a proper superset of" do - @set.proper_superset?(Set[]).should be_true - Set[1, 2, 3].proper_superset?(Set[]).should be_true - Set["a", :b, ?c].proper_superset?(Set[]).should be_true - - @set.proper_superset?(Set[1, 2, 3]).should be_true - @set.proper_superset?(Set[1, 3]).should be_true - @set.proper_superset?(Set[1, 2]).should be_true - @set.proper_superset?(Set[1]).should be_true - - @set.proper_superset?(Set[5]).should be_false - @set.proper_superset?(Set[1, 5]).should be_false - @set.proper_superset?(Set[nil]).should be_false - @set.proper_superset?(Set["test"]).should be_false - - @set.proper_superset?(@set).should be_false - Set[].proper_superset?(Set[]).should be_false - end - - it "raises an ArgumentError when passed a non-Set" do - lambda { Set[].proper_superset?([]) }.should raise_error(ArgumentError) - lambda { Set[].proper_superset?(1) }.should raise_error(ArgumentError) - lambda { Set[].proper_superset?("test") }.should raise_error(ArgumentError) - lambda { Set[].proper_superset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/reject_spec.rb b/spec/ruby/library/set/reject_spec.rb deleted file mode 100644 index 9131f960ad..0000000000 --- a/spec/ruby/library/set/reject_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#reject!" do - before :each do - @set = Set["one", "two", "three"] - end - - it "yields every element of self" do - ret = [] - @set.reject! { |x| ret << x } - ret.sort.should == ["one", "two", "three"].sort - end - - it "deletes every element from self for which the passed block returns true" do - @set.reject! { |x| x.size == 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self when self was modified" do - @set.reject! { |x| true }.should equal(@set) - end - - it "returns nil when self was not modified" do - @set.reject! { |x| false }.should be_nil - end - - it "returns an Enumerator when passed no block" do - enum = @set.reject! - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size == 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/replace_spec.rb b/spec/ruby/library/set/replace_spec.rb deleted file mode 100644 index 7511066c9c..0000000000 --- a/spec/ruby/library/set/replace_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#replace" do - before :each do - @set = Set[:a, :b, :c] - end - - it "replaces the contents with other and returns self" do - @set.replace(Set[1, 2, 3]).should == @set - @set.should == Set[1, 2, 3] - end - - it "accepts any enumerable as other" do - @set.replace([1, 2, 3]).should == Set[1, 2, 3] - end -end diff --git a/spec/ruby/library/set/select_spec.rb b/spec/ruby/library/set/select_spec.rb deleted file mode 100644 index b458ffacaa..0000000000 --- a/spec/ruby/library/set/select_spec.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/select' - -describe "Set#select!" do - it_behaves_like :set_select_bang, :select! -end diff --git a/spec/ruby/library/set/shared/add.rb b/spec/ruby/library/set/shared/add.rb deleted file mode 100644 index 9e797f5df9..0000000000 --- a/spec/ruby/library/set/shared/add.rb +++ /dev/null @@ -1,14 +0,0 @@ -describe :set_add, shared: true do - before :each do - @set = Set.new - end - - it "adds the passed Object to self" do - @set.send(@method, "dog") - @set.should include("dog") - end - - it "returns self" do - @set.send(@method, "dog").should equal(@set) - end -end diff --git a/spec/ruby/library/set/shared/collect.rb b/spec/ruby/library/set/shared/collect.rb deleted file mode 100644 index bc58c231be..0000000000 --- a/spec/ruby/library/set/shared/collect.rb +++ /dev/null @@ -1,20 +0,0 @@ -describe :set_collect_bang, shared: true do - before :each do - @set = Set[1, 2, 3, 4, 5] - end - - it "yields each Object in self" do - res = [] - @set.send(@method) { |x| res << x } - res.sort.should == [1, 2, 3, 4, 5].sort - end - - it "returns self" do - @set.send(@method) { |x| x }.should equal(@set) - end - - it "replaces self with the return values of the block" do - @set.send(@method) { |x| x * 2 } - @set.should == Set[2, 4, 6, 8, 10] - end -end diff --git a/spec/ruby/library/set/shared/difference.rb b/spec/ruby/library/set/shared/difference.rb deleted file mode 100644 index 52807709c3..0000000000 --- a/spec/ruby/library/set/shared/difference.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :set_difference, shared: true do - before :each do - @set = Set[:a, :b, :c] - end - - it "returns a new Set containing self's elements excluding the elements in the passed Enumerable" do - @set.send(@method, Set[:a, :b]).should == Set[:c] - @set.send(@method, [:b, :c]).should == Set[:a] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/shared/include.rb b/spec/ruby/library/set/shared/include.rb deleted file mode 100644 index b4d95cde24..0000000000 --- a/spec/ruby/library/set/shared/include.rb +++ /dev/null @@ -1,29 +0,0 @@ -describe :set_include, shared: true do - it "returns true when self contains the passed Object" do - set = Set[:a, :b, :c] - set.send(@method, :a).should be_true - set.send(@method, :e).should be_false - end - - describe "member equality" do - it "is checked using both #hash and #eql?" do - obj = Object.new - obj_another = Object.new - - def obj.hash; 42 end - def obj_another.hash; 42 end - def obj_another.eql?(o) hash == o.hash end - - set = Set["a", "b", "c", obj] - set.send(@method, obj_another).should == true - end - - it "is not checked using #==" do - obj = Object.new - set = Set["a", "b", "c"] - - obj.should_not_receive(:==) - set.send(@method, obj) - end - end -end diff --git a/spec/ruby/library/set/shared/inspect.rb b/spec/ruby/library/set/shared/inspect.rb deleted file mode 100644 index 69fbdd12f6..0000000000 --- a/spec/ruby/library/set/shared/inspect.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe "set_inspect", shared: true do - it "returns a String representation of self" do - Set[].send(@method).should be_kind_of(String) - Set[nil, false, true].send(@method).should be_kind_of(String) - Set[1, 2, 3].send(@method).should be_kind_of(String) - Set["1", "2", "3"].send(@method).should be_kind_of(String) - Set[:a, "b", Set[?c]].send(@method).should be_kind_of(String) - end - - it "correctly handles self-references" do - (set = Set[]) << set - set.send(@method).should be_kind_of(String) - set.send(@method).should include("#<Set: {...}>") - end -end diff --git a/spec/ruby/library/set/shared/intersection.rb b/spec/ruby/library/set/shared/intersection.rb deleted file mode 100644 index ed0db7457d..0000000000 --- a/spec/ruby/library/set/shared/intersection.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :set_intersection, shared: true do - before :each do - @set = Set[:a, :b, :c] - end - - it "returns a new Set containing only elements shared by self and the passed Enumerable" do - @set.send(@method, Set[:b, :c, :d, :e]).should == Set[:b, :c] - @set.send(@method, [:b, :c, :d]).should == Set[:b, :c] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/shared/length.rb b/spec/ruby/library/set/shared/length.rb deleted file mode 100644 index a8fcee9f39..0000000000 --- a/spec/ruby/library/set/shared/length.rb +++ /dev/null @@ -1,6 +0,0 @@ -describe :set_length, shared: true do - it "returns the number of elements in the set" do - set = Set[:a, :b, :c] - set.send(@method).should == 3 - end -end diff --git a/spec/ruby/library/set/shared/select.rb b/spec/ruby/library/set/shared/select.rb deleted file mode 100644 index 2108d398b4..0000000000 --- a/spec/ruby/library/set/shared/select.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe :set_select_bang, shared: true do - before :each do - @set = Set["one", "two", "three"] - end - - it "yields every element of self" do - ret = [] - @set.send(@method) { |x| ret << x } - ret.sort.should == ["one", "two", "three"].sort - end - - it "keeps every element from self for which the passed block returns true" do - @set.send(@method) { |x| x.size != 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self when self was modified" do - @set.send(@method) { false }.should equal(@set) - end - - it "returns nil when self was not modified" do - @set.send(@method) { true }.should be_nil - end - - it "returns an Enumerator when passed no block" do - enum = @set.send(@method) - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size != 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/shared/union.rb b/spec/ruby/library/set/shared/union.rb deleted file mode 100644 index 81920f5687..0000000000 --- a/spec/ruby/library/set/shared/union.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :set_union, shared: true do - before :each do - @set = Set[:a, :b, :c] - end - - it "returns a new Set containing all elements of self and the passed Enumerable" do - @set.send(@method, Set[:b, :d, :e]).should == Set[:a, :b, :c, :d, :e] - @set.send(@method, [:b, :e]).should == Set[:a, :b, :c, :e] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/size_spec.rb b/spec/ruby/library/set/size_spec.rb deleted file mode 100644 index 3c8cb38517..0000000000 --- a/spec/ruby/library/set/size_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/length' -require 'set' - -describe "Set#size" do - it_behaves_like :set_length, :size -end diff --git a/spec/ruby/library/set/sortedset/add_spec.rb b/spec/ruby/library/set/sortedset/add_spec.rb deleted file mode 100644 index 721ac7fac0..0000000000 --- a/spec/ruby/library/set/sortedset/add_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/add' - -describe "SortedSet#add" do - it_behaves_like :sorted_set_add, :add - - it "takes only values which responds <=>" do - obj = mock('no_comparison_operator') - obj.stub!(:respond_to?).with(:<=>).and_return(false) - lambda { SortedSet["hello"].add(obj) }.should raise_error(ArgumentError) - end - - it "raises on incompatible <=> comparison" do - # Use #to_a here as elements are sorted only when needed. - # Therefore the <=> incompatibility is only noticed on sorting. - lambda { SortedSet['1', '2'].add(3).to_a }.should raise_error(ArgumentError) - end -end - -describe "SortedSet#add?" do - before :each do - @set = SortedSet.new - end - - it "adds the passed Object to self" do - @set.add?("cat") - @set.should include("cat") - end - - it "returns self when the Object has not yet been added to self" do - @set.add?("cat").should equal(@set) - end - - it "returns nil when the Object has already been added to self" do - @set.add?("cat") - @set.add?("cat").should be_nil - end -end diff --git a/spec/ruby/library/set/sortedset/append_spec.rb b/spec/ruby/library/set/sortedset/append_spec.rb deleted file mode 100644 index ebcceba962..0000000000 --- a/spec/ruby/library/set/sortedset/append_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/add' - -describe "SortedSet#<<" do - it_behaves_like :sorted_set_add, :<< -end diff --git a/spec/ruby/library/set/sortedset/case_equality_spec.rb b/spec/ruby/library/set/sortedset/case_equality_spec.rb deleted file mode 100644 index 5627917677..0000000000 --- a/spec/ruby/library/set/sortedset/case_equality_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/include' -require 'set' - -ruby_version_is "2.5" do - describe "SortedSet#===" do - it_behaves_like :sorted_set_include, :=== - end -end diff --git a/spec/ruby/library/set/sortedset/classify_spec.rb b/spec/ruby/library/set/sortedset/classify_spec.rb deleted file mode 100644 index 62b26d5d28..0000000000 --- a/spec/ruby/library/set/sortedset/classify_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#classify" do - before :each do - @set = SortedSet["one", "two", "three", "four"] - end - - it "yields each Object in self in sorted order" do - res = [] - @set.classify { |x| res << x } - res.should == ["one", "two", "three", "four"].sort - end - - it "returns an Enumerator when passed no block" do - enum = @set.classify - enum.should be_an_instance_of(Enumerator) - - classified = enum.each { |x| x.length } - classified.should == { 3 => SortedSet["one", "two"], 4 => SortedSet["four"], 5 => SortedSet["three"] } - end - - it "classifies the Objects in self based on the block's return value" do - classified = @set.classify { |x| x.length } - classified.should == { 3 => SortedSet["one", "two"], 4 => SortedSet["four"], 5 => SortedSet["three"] } - end -end diff --git a/spec/ruby/library/set/sortedset/clear_spec.rb b/spec/ruby/library/set/sortedset/clear_spec.rb deleted file mode 100644 index 11b5db2095..0000000000 --- a/spec/ruby/library/set/sortedset/clear_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#clear" do - before :each do - @set = SortedSet["one", "two", "three", "four"] - end - - it "removes all elements from self" do - @set.clear - @set.should be_empty - end - - it "returns self" do - @set.clear.should equal(@set) - end -end diff --git a/spec/ruby/library/set/sortedset/collect_spec.rb b/spec/ruby/library/set/sortedset/collect_spec.rb deleted file mode 100644 index 21ead4fe55..0000000000 --- a/spec/ruby/library/set/sortedset/collect_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/collect' - -describe "SortedSet#collect!" do - it_behaves_like :sorted_set_collect_bang, :collect! -end diff --git a/spec/ruby/library/set/sortedset/constructor_spec.rb b/spec/ruby/library/set/sortedset/constructor_spec.rb deleted file mode 100644 index 953144dbdb..0000000000 --- a/spec/ruby/library/set/sortedset/constructor_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet[]" do - it "returns a new SortedSet populated with the passed Objects" do - set = SortedSet[1, 2, 3] - - set.instance_of?(SortedSet).should be_true - set.size.should eql(3) - - set.should include(1) - set.should include(2) - set.should include(3) - end -end diff --git a/spec/ruby/library/set/sortedset/delete_if_spec.rb b/spec/ruby/library/set/sortedset/delete_if_spec.rb deleted file mode 100644 index 1ff689376a..0000000000 --- a/spec/ruby/library/set/sortedset/delete_if_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#delete_if" do - before :each do - @set = SortedSet["one", "two", "three"] - end - - it "yields each Object in self in sorted order" do - ret = [] - @set.delete_if { |x| ret << x } - ret.should == ["one", "two", "three"].sort - end - - it "deletes every element from self for which the passed block returns true" do - @set.delete_if { |x| x.size == 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self" do - @set.delete_if { |x| x }.should equal(@set) - end - - it "returns an Enumerator when passed no block" do - enum = @set.delete_if - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size == 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/sortedset/delete_spec.rb b/spec/ruby/library/set/sortedset/delete_spec.rb deleted file mode 100644 index 71583c7f13..0000000000 --- a/spec/ruby/library/set/sortedset/delete_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#delete" do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "deletes the passed Object from self" do - @set.delete("a") - @set.should_not include("a") - end - - it "returns self" do - @set.delete("a").should equal(@set) - @set.delete("x").should equal(@set) - end -end - -describe "SortedSet#delete?" do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "deletes the passed Object from self" do - @set.delete?("a") - @set.should_not include("a") - end - - it "returns self when the passed Object is in self" do - @set.delete?("a").should equal(@set) - end - - it "returns nil when the passed Object is not in self" do - @set.delete?("x").should be_nil - end -end diff --git a/spec/ruby/library/set/sortedset/difference_spec.rb b/spec/ruby/library/set/sortedset/difference_spec.rb deleted file mode 100644 index c3d679aff8..0000000000 --- a/spec/ruby/library/set/sortedset/difference_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/difference' - -describe "SortedSet#difference" do - it_behaves_like :sorted_set_difference, :difference -end diff --git a/spec/ruby/library/set/sortedset/divide_spec.rb b/spec/ruby/library/set/sortedset/divide_spec.rb deleted file mode 100644 index 4b2135a8c9..0000000000 --- a/spec/ruby/library/set/sortedset/divide_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#divide" do - it "divides self into a set of subsets based on the blocks return values" do - set = SortedSet["one", "two", "three", "four", "five"].divide { |x| x.length } - set.map { |x| x.to_a }.to_a.sort.should == [["five", "four"], ["one", "two"], ["three"]] - end - - it "yields each Object in self in sorted order" do - ret = [] - SortedSet["one", "two", "three", "four", "five"].divide { |x| ret << x } - ret.should == ["one", "two", "three", "four", "five"].sort - end - - # BUG: Does not raise a LocalJumpError, but a NoMethodError - # - # it "raises a LocalJumpError when not passed a block" do - # lambda { SortedSet[1].divide }.should raise_error(LocalJumpError) - # end -end - -describe "SortedSet#divide when passed a block with an arity of 2" do - it "divides self into a set of subsets based on the blocks return values" do - set = SortedSet[1, 3, 4, 6, 9, 10, 11].divide { |x, y| (x - y).abs == 1 } - set.map { |x| x.to_a }.to_a.sort.should == [[1], [3, 4], [6], [9, 10, 11]] - end - - it "yields each two Objects to the block" do - ret = [] - SortedSet[1, 2].divide { |x, y| ret << [x, y] } - ret.should == [[1, 1], [1, 2], [2, 1], [2, 2]] - end -end diff --git a/spec/ruby/library/set/sortedset/each_spec.rb b/spec/ruby/library/set/sortedset/each_spec.rb deleted file mode 100644 index bcf0d74d1f..0000000000 --- a/spec/ruby/library/set/sortedset/each_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#each" do - before :each do - @set = SortedSet[1, 2, 3] - end - - it "yields each Object in self in sorted order" do - ret = [] - SortedSet["one", "two", "three"].each { |x| ret << x } - ret.should == ["one", "two", "three"].sort - end - - it "returns self" do - @set.each { |x| x }.should equal(@set) - end - - it "returns an Enumerator when not passed a block" do - enum = @set.each - - ret = [] - enum.each { |x| ret << x } - ret.sort.should == [1, 2, 3] - end -end diff --git a/spec/ruby/library/set/sortedset/empty_spec.rb b/spec/ruby/library/set/sortedset/empty_spec.rb deleted file mode 100644 index deb3b567fb..0000000000 --- a/spec/ruby/library/set/sortedset/empty_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#empty?" do - it "returns true if self is empty" do - SortedSet[].empty?.should be_true - SortedSet[1].empty?.should be_false - SortedSet[1,2,3].empty?.should be_false - end -end diff --git a/spec/ruby/library/set/sortedset/eql_spec.rb b/spec/ruby/library/set/sortedset/eql_spec.rb deleted file mode 100644 index b22858a362..0000000000 --- a/spec/ruby/library/set/sortedset/eql_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#eql?" do - it "returns true when the passed argument is a SortedSet and contains the same elements" do - SortedSet[].should eql(SortedSet[]) - SortedSet[1, 2, 3].should eql(SortedSet[1, 2, 3]) - SortedSet[1, 2, 3].should eql(SortedSet[3, 2, 1]) - -# SortedSet["a", :b, ?c].should eql(SortedSet[?c, :b, "a"]) - - SortedSet[1, 2, 3].should_not eql(SortedSet[1.0, 2, 3]) - SortedSet[1, 2, 3].should_not eql(SortedSet[2, 3]) - SortedSet[1, 2, 3].should_not eql(SortedSet[]) - end -end diff --git a/spec/ruby/library/set/sortedset/equal_value_spec.rb b/spec/ruby/library/set/sortedset/equal_value_spec.rb deleted file mode 100644 index cb1b7c9443..0000000000 --- a/spec/ruby/library/set/sortedset/equal_value_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#==" do - it "returns true when the passed Object is a SortedSet and self and the Object contain the same elements" do - SortedSet[].should == SortedSet[] - SortedSet[1, 2, 3].should == SortedSet[1, 2, 3] - SortedSet["1", "2", "3"].should == SortedSet["1", "2", "3"] - - SortedSet[1, 2, 3].should_not == SortedSet[1.0, 2, 3] - SortedSet[1, 2, 3].should_not == [1, 2, 3] - end -end diff --git a/spec/ruby/library/set/sortedset/exclusion_spec.rb b/spec/ruby/library/set/sortedset/exclusion_spec.rb deleted file mode 100644 index 59f7615e83..0000000000 --- a/spec/ruby/library/set/sortedset/exclusion_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#^" do - before :each do - @set = SortedSet[1, 2, 3, 4] - end - - it "returns a new SortedSet containing elements that are not in both self and the passed Enumberable" do - (@set ^ SortedSet[3, 4, 5]).should == SortedSet[1, 2, 5] - (@set ^ [3, 4, 5]).should == SortedSet[1, 2, 5] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set ^ 3 }.should raise_error(ArgumentError) - lambda { @set ^ Object.new }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/filter_spec.rb b/spec/ruby/library/set/sortedset/filter_spec.rb deleted file mode 100644 index cfaa8b2729..0000000000 --- a/spec/ruby/library/set/sortedset/filter_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/select' -require 'set' - -ruby_version_is "2.6" do - describe "SortedSet#filter!" do - it_behaves_like :sorted_set_select_bang, :filter! - end -end diff --git a/spec/ruby/library/set/sortedset/flatten_merge_spec.rb b/spec/ruby/library/set/sortedset/flatten_merge_spec.rb deleted file mode 100644 index 9a8ed13f00..0000000000 --- a/spec/ruby/library/set/sortedset/flatten_merge_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#flatten_merge" do - it "is protected" do - SortedSet.should have_protected_instance_method("flatten_merge") - end -end diff --git a/spec/ruby/library/set/sortedset/flatten_spec.rb b/spec/ruby/library/set/sortedset/flatten_spec.rb deleted file mode 100644 index ca4e4637e6..0000000000 --- a/spec/ruby/library/set/sortedset/flatten_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -# Note: Flatten make little sens on sorted sets, because SortedSets are not (by default) -# comparable. For a SortedSet to be both valid and nested, we need to define a comparison operator: -module SortedSet_FlattenSpecs - class ComparableSortedSet < SortedSet - def <=>(other) - return puts "#{other} vs #{self}" unless other.is_a?(ComparableSortedSet) - to_a <=> other.to_a - end - end -end - -describe "SortedSet#flatten" do - it "returns a copy of self with each included SortedSet flattened" do - klass = SortedSet_FlattenSpecs::ComparableSortedSet - set = klass[klass[1,2], klass[3,4], klass[5,6,7], klass[8]] - flattened_set = set.flatten - - flattened_set.should_not equal(set) - flattened_set.should == klass[1, 2, 3, 4, 5, 6, 7, 8] - end -end - -describe "SortedSet#flatten!" do - it "flattens self" do - klass = SortedSet_FlattenSpecs::ComparableSortedSet - set = klass[klass[1,2], klass[3,4], klass[5,6,7], klass[8]] - set.flatten! - set.should == klass[1, 2, 3, 4, 5, 6, 7, 8] - end - - it "returns self when self was modified" do - klass = SortedSet_FlattenSpecs::ComparableSortedSet - set = klass[klass[1,2], klass[3,4]] - set.flatten!.should equal(set) - end - - it "returns nil when self was not modified" do - set = SortedSet[1, 2, 3, 4] - set.flatten!.should be_nil - end -end diff --git a/spec/ruby/library/set/sortedset/hash_spec.rb b/spec/ruby/library/set/sortedset/hash_spec.rb deleted file mode 100644 index 7833c68a10..0000000000 --- a/spec/ruby/library/set/sortedset/hash_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#hash" do - it "is static" do - SortedSet[].hash.should == SortedSet[].hash - SortedSet[1, 2, 3].hash.should == SortedSet[1, 2, 3].hash - SortedSet["a", "b", "c"].hash.should == SortedSet["c", "b", "a"].hash - - SortedSet[].hash.should_not == SortedSet[1, 2, 3].hash - SortedSet[1, 2, 3].hash.should_not == SortedSet["a", "b", "c"].hash - end -end diff --git a/spec/ruby/library/set/sortedset/include_spec.rb b/spec/ruby/library/set/sortedset/include_spec.rb deleted file mode 100644 index 030a9e146a..0000000000 --- a/spec/ruby/library/set/sortedset/include_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/include' -require 'set' - -describe "SortedSet#include?" do - it_behaves_like :sorted_set_include, :include? -end diff --git a/spec/ruby/library/set/sortedset/initialize_spec.rb b/spec/ruby/library/set/sortedset/initialize_spec.rb deleted file mode 100644 index cdf756f6b8..0000000000 --- a/spec/ruby/library/set/sortedset/initialize_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#initialize" do - it "is private" do - SortedSet.should have_private_instance_method("initialize") - end - - it "adds all elements of the passed Enumerable to self" do - s = SortedSet.new([1, 2, 3]) - s.size.should eql(3) - s.should include(1) - s.should include(2) - s.should include(3) - end - - it "preprocesses all elements by a passed block before adding to self" do - s = SortedSet.new([1, 2, 3]) { |x| x * x } - s.size.should eql(3) - s.should include(1) - s.should include(4) - s.should include(9) - end - - it "raises on incompatible <=> comparison" do - # Use #to_a here as elements are sorted only when needed. - # Therefore the <=> incompatibility is only noticed on sorting. - lambda { SortedSet.new(['00', nil]).to_a }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/inspect_spec.rb b/spec/ruby/library/set/sortedset/inspect_spec.rb deleted file mode 100644 index 7103bee3f5..0000000000 --- a/spec/ruby/library/set/sortedset/inspect_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#inspect" do - it "returns a String representation of self" do - SortedSet[].inspect.should be_kind_of(String) - SortedSet[1, 2, 3].inspect.should be_kind_of(String) - SortedSet["1", "2", "3"].inspect.should be_kind_of(String) - end -end diff --git a/spec/ruby/library/set/sortedset/intersection_spec.rb b/spec/ruby/library/set/sortedset/intersection_spec.rb deleted file mode 100644 index 6ff9c80ce1..0000000000 --- a/spec/ruby/library/set/sortedset/intersection_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/intersection' -require 'set' - -describe "SortedSet#intersection" do - it_behaves_like :sorted_set_intersection, :intersection -end - -describe "SortedSet#&" do - it_behaves_like :sorted_set_intersection, :& -end diff --git a/spec/ruby/library/set/sortedset/keep_if_spec.rb b/spec/ruby/library/set/sortedset/keep_if_spec.rb deleted file mode 100644 index 2235eb3766..0000000000 --- a/spec/ruby/library/set/sortedset/keep_if_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#keep_if" do - before :each do - @set = SortedSet["one", "two", "three"] - end - - it "yields each Object in self in sorted order" do - ret = [] - @set.keep_if { |x| ret << x } - ret.should == ["one", "two", "three"].sort - end - - it "keeps every element from self for which the passed block returns true" do - @set.keep_if { |x| x.size != 3 } - @set.to_a.should == ["three"] - end - - it "returns self" do - @set.keep_if {}.should equal(@set) - end - - it "returns an Enumerator when passed no block" do - enum = @set.keep_if - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size != 3 } - @set.to_a.should == ["three"] - end -end diff --git a/spec/ruby/library/set/sortedset/length_spec.rb b/spec/ruby/library/set/sortedset/length_spec.rb deleted file mode 100644 index 5f138dd6f7..0000000000 --- a/spec/ruby/library/set/sortedset/length_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/length' -require 'set' - -describe "SortedSet#length" do - it_behaves_like :sorted_set_length, :length -end diff --git a/spec/ruby/library/set/sortedset/map_spec.rb b/spec/ruby/library/set/sortedset/map_spec.rb deleted file mode 100644 index 1d7b5954e5..0000000000 --- a/spec/ruby/library/set/sortedset/map_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/collect' - -describe "SortedSet#map!" do - it_behaves_like :sorted_set_collect_bang, :map! -end diff --git a/spec/ruby/library/set/sortedset/member_spec.rb b/spec/ruby/library/set/sortedset/member_spec.rb deleted file mode 100644 index d6005557ab..0000000000 --- a/spec/ruby/library/set/sortedset/member_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/include' -require 'set' - -describe "SortedSet#member?" do - it_behaves_like :sorted_set_include, :member? -end diff --git a/spec/ruby/library/set/sortedset/merge_spec.rb b/spec/ruby/library/set/sortedset/merge_spec.rb deleted file mode 100644 index f98f2c83ce..0000000000 --- a/spec/ruby/library/set/sortedset/merge_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#merge" do - it "adds the elements of the passed Enumerable to self" do - SortedSet["a", "b"].merge(SortedSet["b", "c", "d"]).should == SortedSet["a", "b", "c", "d"] - SortedSet[1, 2].merge([3, 4]).should == SortedSet[1, 2, 3, 4] - end - - it "returns self" do - set = SortedSet[1, 2] - set.merge([3, 4]).should equal(set) - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { SortedSet[1, 2].merge(1) }.should raise_error(ArgumentError) - lambda { SortedSet[1, 2].merge(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/minus_spec.rb b/spec/ruby/library/set/sortedset/minus_spec.rb deleted file mode 100644 index ffb8ee85d1..0000000000 --- a/spec/ruby/library/set/sortedset/minus_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' -require_relative 'shared/difference' - -describe "SortedSet#-" do - it_behaves_like :sorted_set_difference, :- -end diff --git a/spec/ruby/library/set/sortedset/plus_spec.rb b/spec/ruby/library/set/sortedset/plus_spec.rb deleted file mode 100644 index 355c775d7e..0000000000 --- a/spec/ruby/library/set/sortedset/plus_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/union' -require 'set' - -describe "SortedSet#+" do - it_behaves_like :sorted_set_union, :+ -end diff --git a/spec/ruby/library/set/sortedset/pretty_print_cycle_spec.rb b/spec/ruby/library/set/sortedset/pretty_print_cycle_spec.rb deleted file mode 100644 index fe15f1bf7d..0000000000 --- a/spec/ruby/library/set/sortedset/pretty_print_cycle_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#pretty_print_cycle" do - it "passes the 'pretty print' representation of a self-referencing SortedSet to the pretty print writer" do - pp = mock("PrettyPrint") - pp.should_receive(:text).with("#<SortedSet: {...}>") - SortedSet[1, 2, 3].pretty_print_cycle(pp) - end -end diff --git a/spec/ruby/library/set/sortedset/pretty_print_spec.rb b/spec/ruby/library/set/sortedset/pretty_print_spec.rb deleted file mode 100644 index 601ff4d182..0000000000 --- a/spec/ruby/library/set/sortedset/pretty_print_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#pretty_print" do - it "passes the 'pretty print' representation of self to the pretty print writer" do - pp = mock("PrettyPrint") - set = SortedSet[1, 2, 3] - - pp.should_receive(:text).with("#<SortedSet: {") - pp.should_receive(:text).with("}>") - - pp.should_receive(:nest).with(1).and_yield - pp.should_receive(:seplist).with(set) - - set.pretty_print(pp) - end -end diff --git a/spec/ruby/library/set/sortedset/proper_subset_spec.rb b/spec/ruby/library/set/sortedset/proper_subset_spec.rb deleted file mode 100644 index 3b3c2e5c4c..0000000000 --- a/spec/ruby/library/set/sortedset/proper_subset_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#proper_subset?" do - before :each do - @set = SortedSet[1, 2, 3, 4] - end - - it "returns true if passed a SortedSet that self is a proper subset of" do - SortedSet[].proper_subset?(@set).should be_true - SortedSet[].proper_subset?(SortedSet[1, 2, 3]).should be_true - SortedSet[].proper_subset?(SortedSet["a", "b", "c"]).should be_true - - SortedSet[1, 2, 3].proper_subset?(@set).should be_true - SortedSet[1, 3].proper_subset?(@set).should be_true - SortedSet[1, 2].proper_subset?(@set).should be_true - SortedSet[1].proper_subset?(@set).should be_true - - SortedSet[5].proper_subset?(@set).should be_false - SortedSet[1, 5].proper_subset?(@set).should be_false - SortedSet["test"].proper_subset?(@set).should be_false - - @set.proper_subset?(@set).should be_false - SortedSet[].proper_subset?(SortedSet[]).should be_false - end - - it "raises an ArgumentError when passed a non-SortedSet" do - lambda { SortedSet[].proper_subset?([]) }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_subset?(1) }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_subset?("test") }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_subset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/proper_superset_spec.rb b/spec/ruby/library/set/sortedset/proper_superset_spec.rb deleted file mode 100644 index 72ae71e2f1..0000000000 --- a/spec/ruby/library/set/sortedset/proper_superset_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#proper_superset?" do - before :each do - @set = SortedSet[1, 2, 3, 4] - end - - it "returns true if passed a SortedSet that self is a proper superset of" do - @set.proper_superset?(SortedSet[]).should be_true - SortedSet[1, 2, 3].proper_superset?(SortedSet[]).should be_true - SortedSet["a", "b", "c"].proper_superset?(SortedSet[]).should be_true - - @set.proper_superset?(SortedSet[1, 2, 3]).should be_true - @set.proper_superset?(SortedSet[1, 3]).should be_true - @set.proper_superset?(SortedSet[1, 2]).should be_true - @set.proper_superset?(SortedSet[1]).should be_true - - @set.proper_superset?(SortedSet[5]).should be_false - @set.proper_superset?(SortedSet[1, 5]).should be_false - @set.proper_superset?(SortedSet["test"]).should be_false - - @set.proper_superset?(@set).should be_false - SortedSet[].proper_superset?(SortedSet[]).should be_false - end - - it "raises an ArgumentError when passed a non-SortedSet" do - lambda { SortedSet[].proper_superset?([]) }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_superset?(1) }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_superset?("test") }.should raise_error(ArgumentError) - lambda { SortedSet[].proper_superset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/reject_spec.rb b/spec/ruby/library/set/sortedset/reject_spec.rb deleted file mode 100644 index da2a76e7a7..0000000000 --- a/spec/ruby/library/set/sortedset/reject_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#reject!" do - before :each do - @set = SortedSet["one", "two", "three"] - end - - it "yields each Object in self in sorted order" do - res = [] - @set.reject! { |x| res << x } - res.should == ["one", "two", "three"].sort - end - - it "deletes every element from self for which the passed block returns true" do - @set.reject! { |x| x.size == 3 } - @set.size.should eql(1) - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end - - it "returns self when self was modified" do - @set.reject! { |x| true }.should equal(@set) - end - - it "returns nil when self was not modified" do - @set.reject! { |x| false }.should be_nil - end - - it "returns an Enumerator when passed no block" do - enum = @set.reject! - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size == 3 } - - @set.should_not include("one") - @set.should_not include("two") - @set.should include("three") - end -end diff --git a/spec/ruby/library/set/sortedset/replace_spec.rb b/spec/ruby/library/set/sortedset/replace_spec.rb deleted file mode 100644 index 2a7fa73efb..0000000000 --- a/spec/ruby/library/set/sortedset/replace_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#replace" do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "replaces the contents with other and returns self" do - @set.replace(SortedSet[1, 2, 3]).should == @set - @set.should == SortedSet[1, 2, 3] - end - - it "accepts any enumerable as other" do - @set.replace([1, 2, 3]).should == SortedSet[1, 2, 3] - end -end diff --git a/spec/ruby/library/set/sortedset/select_spec.rb b/spec/ruby/library/set/sortedset/select_spec.rb deleted file mode 100644 index 68326cd02c..0000000000 --- a/spec/ruby/library/set/sortedset/select_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/select' -require 'set' - -describe "SortedSet#select!" do - it_behaves_like :sorted_set_select_bang, :select! -end diff --git a/spec/ruby/library/set/sortedset/shared/add.rb b/spec/ruby/library/set/sortedset/shared/add.rb deleted file mode 100644 index 95ef1b090e..0000000000 --- a/spec/ruby/library/set/sortedset/shared/add.rb +++ /dev/null @@ -1,14 +0,0 @@ -describe :sorted_set_add, shared: true do - before :each do - @set = SortedSet.new - end - - it "adds the passed Object to self" do - @set.send(@method, "dog") - @set.should include("dog") - end - - it "returns self" do - @set.send(@method, "dog").should equal(@set) - end -end diff --git a/spec/ruby/library/set/sortedset/shared/collect.rb b/spec/ruby/library/set/sortedset/shared/collect.rb deleted file mode 100644 index e53304d427..0000000000 --- a/spec/ruby/library/set/sortedset/shared/collect.rb +++ /dev/null @@ -1,20 +0,0 @@ -describe :sorted_set_collect_bang, shared: true do - before :each do - @set = SortedSet[1, 2, 3, 4, 5] - end - - it "yields each Object in self in sorted order" do - res = [] - SortedSet["one", "two", "three"].send(@method) { |x| res << x; x } - res.should == ["one", "two", "three"].sort - end - - it "returns self" do - @set.send(@method) { |x| x }.should equal(@set) - end - - it "replaces self with the return values of the block" do - @set.send(@method) { |x| x * 2 } - @set.should == SortedSet[2, 4, 6, 8, 10] - end -end diff --git a/spec/ruby/library/set/sortedset/shared/difference.rb b/spec/ruby/library/set/sortedset/shared/difference.rb deleted file mode 100644 index cf50ff0eb2..0000000000 --- a/spec/ruby/library/set/sortedset/shared/difference.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :sorted_set_difference, shared: true do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "returns a new SortedSet containing self's elements excluding the elements in the passed Enumerable" do - @set.send(@method, SortedSet["a", "b"]).should == SortedSet["c"] - @set.send(@method, ["b", "c"]).should == SortedSet["a"] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/shared/include.rb b/spec/ruby/library/set/sortedset/shared/include.rb deleted file mode 100644 index cd1758819d..0000000000 --- a/spec/ruby/library/set/sortedset/shared/include.rb +++ /dev/null @@ -1,7 +0,0 @@ -describe :sorted_set_include, shared: true do - it "returns true when self contains the passed Object" do - set = SortedSet["a", "b", "c"] - set.send(@method, "a").should be_true - set.send(@method, "e").should be_false - end -end diff --git a/spec/ruby/library/set/sortedset/shared/intersection.rb b/spec/ruby/library/set/sortedset/shared/intersection.rb deleted file mode 100644 index d3cfa96656..0000000000 --- a/spec/ruby/library/set/sortedset/shared/intersection.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :sorted_set_intersection, shared: true do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "returns a new SortedSet containing only elements shared by self and the passed Enumerable" do - @set.send(@method, SortedSet["b", "c", "d", "e"]).should == SortedSet["b", "c"] - @set.send(@method, ["b", "c", "d"]).should == SortedSet["b", "c"] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/shared/length.rb b/spec/ruby/library/set/sortedset/shared/length.rb deleted file mode 100644 index d1dfee1cff..0000000000 --- a/spec/ruby/library/set/sortedset/shared/length.rb +++ /dev/null @@ -1,6 +0,0 @@ -describe :sorted_set_length, shared: true do - it "returns the number of elements in the set" do - set = SortedSet["a", "b", "c"] - set.send(@method).should == 3 - end -end diff --git a/spec/ruby/library/set/sortedset/shared/select.rb b/spec/ruby/library/set/sortedset/shared/select.rb deleted file mode 100644 index e13311eda5..0000000000 --- a/spec/ruby/library/set/sortedset/shared/select.rb +++ /dev/null @@ -1,35 +0,0 @@ -require_relative '../../../../spec_helper' -require 'set' - -describe :sorted_set_select_bang, shared: true do - before :each do - @set = SortedSet["one", "two", "three"] - end - - it "yields each Object in self in sorted order" do - res = [] - @set.send(@method) { |x| res << x } - res.should == ["one", "two", "three"].sort - end - - it "keeps every element from self for which the passed block returns true" do - @set.send(@method) { |x| x.size != 3 } - @set.to_a.should == ["three"] - end - - it "returns self when self was modified" do - @set.send(@method) { false }.should equal(@set) - end - - it "returns nil when self was not modified" do - @set.send(@method) { true }.should be_nil - end - - it "returns an Enumerator when passed no block" do - enum = @set.send(@method) - enum.should be_an_instance_of(Enumerator) - - enum.each { |x| x.size != 3 } - @set.to_a.should == ["three"] - end -end diff --git a/spec/ruby/library/set/sortedset/shared/union.rb b/spec/ruby/library/set/sortedset/shared/union.rb deleted file mode 100644 index 4ff07ef5cc..0000000000 --- a/spec/ruby/library/set/sortedset/shared/union.rb +++ /dev/null @@ -1,15 +0,0 @@ -describe :sorted_set_union, shared: true do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "returns a new SortedSet containing all elements of self and the passed Enumerable" do - @set.send(@method, SortedSet["b", "d", "e"]).should == SortedSet["a", "b", "c", "d", "e"] - @set.send(@method, ["b", "e"]).should == SortedSet["a", "b", "c", "e"] - end - - it "raises an ArgumentError when passed a non-Enumerable" do - lambda { @set.send(@method, 1) }.should raise_error(ArgumentError) - lambda { @set.send(@method, Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/size_spec.rb b/spec/ruby/library/set/sortedset/size_spec.rb deleted file mode 100644 index 13e5085b0c..0000000000 --- a/spec/ruby/library/set/sortedset/size_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/length' -require 'set' - -describe "SortedSet#size" do - it_behaves_like :sorted_set_length, :size -end diff --git a/spec/ruby/library/set/sortedset/subset_spec.rb b/spec/ruby/library/set/sortedset/subset_spec.rb deleted file mode 100644 index cdada2cdfb..0000000000 --- a/spec/ruby/library/set/sortedset/subset_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#subset?" do - before :each do - @set = SortedSet[1, 2, 3, 4] - end - - it "returns true if passed a SortedSet that is equal to self or self is a subset of" do - @set.subset?(@set).should be_true - SortedSet[].subset?(SortedSet[]).should be_true - - SortedSet[].subset?(@set).should be_true - SortedSet[].subset?(SortedSet[1, 2, 3]).should be_true - SortedSet[].subset?(SortedSet["a", "b", "c"]).should be_true - - SortedSet[1, 2, 3].subset?(@set).should be_true - SortedSet[1, 3].subset?(@set).should be_true - SortedSet[1, 2].subset?(@set).should be_true - SortedSet[1].subset?(@set).should be_true - - SortedSet[5].subset?(@set).should be_false - SortedSet[1, 5].subset?(@set).should be_false - SortedSet["test"].subset?(@set).should be_false - end - - it "raises an ArgumentError when passed a non-SortedSet" do - lambda { SortedSet[].subset?([]) }.should raise_error(ArgumentError) - lambda { SortedSet[].subset?(1) }.should raise_error(ArgumentError) - lambda { SortedSet[].subset?("test") }.should raise_error(ArgumentError) - lambda { SortedSet[].subset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/subtract_spec.rb b/spec/ruby/library/set/sortedset/subtract_spec.rb deleted file mode 100644 index 64d66c3688..0000000000 --- a/spec/ruby/library/set/sortedset/subtract_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#subtract" do - before :each do - @set = SortedSet["a", "b", "c"] - end - - it "deletes any elements contained in other and returns self" do - @set.subtract(SortedSet["b", "c"]).should == @set - @set.should == SortedSet["a"] - end - - it "accepts any enumerable as other" do - @set.subtract(["c"]).should == SortedSet["a", "b"] - end -end diff --git a/spec/ruby/library/set/sortedset/superset_spec.rb b/spec/ruby/library/set/sortedset/superset_spec.rb deleted file mode 100644 index 663b179a0c..0000000000 --- a/spec/ruby/library/set/sortedset/superset_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#superset?" do - before :each do - @set = SortedSet[1, 2, 3, 4] - end - - it "returns true if passed a SortedSet that equals self or self is a proper superset of" do - @set.superset?(@set).should be_true - SortedSet[].superset?(SortedSet[]).should be_true - - @set.superset?(SortedSet[]).should be_true - SortedSet[1, 2, 3].superset?(SortedSet[]).should be_true - SortedSet["a", "b", "c"].superset?(SortedSet[]).should be_true - - @set.superset?(SortedSet[1, 2, 3]).should be_true - @set.superset?(SortedSet[1, 3]).should be_true - @set.superset?(SortedSet[1, 2]).should be_true - @set.superset?(SortedSet[1]).should be_true - - @set.superset?(SortedSet[5]).should be_false - @set.superset?(SortedSet[1, 5]).should be_false - @set.superset?(SortedSet["test"]).should be_false - end - - it "raises an ArgumentError when passed a non-SortedSet" do - lambda { SortedSet[].superset?([]) }.should raise_error(ArgumentError) - lambda { SortedSet[].superset?(1) }.should raise_error(ArgumentError) - lambda { SortedSet[].superset?("test") }.should raise_error(ArgumentError) - lambda { SortedSet[].superset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/sortedset/to_a_spec.rb b/spec/ruby/library/set/sortedset/to_a_spec.rb deleted file mode 100644 index ba37d18cdb..0000000000 --- a/spec/ruby/library/set/sortedset/to_a_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../../spec_helper' -require 'set' - -describe "SortedSet#to_a" do - it "returns an array containing elements" do - set = SortedSet.new [1, 2, 3] - set.to_a.should == [1, 2, 3] - end - - it "returns a sorted array containing elements" do - set = SortedSet[2, 3, 1] - set.to_a.should == [1, 2, 3] - - set = SortedSet.new [5, 6, 4, 4] - set.to_a.should == [4, 5, 6] - end -end diff --git a/spec/ruby/library/set/sortedset/union_spec.rb b/spec/ruby/library/set/sortedset/union_spec.rb deleted file mode 100644 index eb77600fee..0000000000 --- a/spec/ruby/library/set/sortedset/union_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../../spec_helper' -require_relative 'shared/union' -require 'set' - -describe "SortedSet#union" do - it_behaves_like :sorted_set_union, :union -end - -describe "SortedSet#|" do - it_behaves_like :sorted_set_union, :| -end diff --git a/spec/ruby/library/set/subset_spec.rb b/spec/ruby/library/set/subset_spec.rb deleted file mode 100644 index e1792ce9b9..0000000000 --- a/spec/ruby/library/set/subset_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#subset?" do - before :each do - @set = Set[1, 2, 3, 4] - end - - it "returns true if passed a Set that is equal to self or self is a subset of" do - @set.subset?(@set).should be_true - Set[].subset?(Set[]).should be_true - - Set[].subset?(@set).should be_true - Set[].subset?(Set[1, 2, 3]).should be_true - Set[].subset?(Set["a", :b, ?c]).should be_true - - Set[1, 2, 3].subset?(@set).should be_true - Set[1, 3].subset?(@set).should be_true - Set[1, 2].subset?(@set).should be_true - Set[1].subset?(@set).should be_true - - Set[5].subset?(@set).should be_false - Set[1, 5].subset?(@set).should be_false - Set[nil].subset?(@set).should be_false - Set["test"].subset?(@set).should be_false - end - - it "raises an ArgumentError when passed a non-Set" do - lambda { Set[].subset?([]) }.should raise_error(ArgumentError) - lambda { Set[].subset?(1) }.should raise_error(ArgumentError) - lambda { Set[].subset?("test") }.should raise_error(ArgumentError) - lambda { Set[].subset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/subtract_spec.rb b/spec/ruby/library/set/subtract_spec.rb deleted file mode 100644 index 56713de8b3..0000000000 --- a/spec/ruby/library/set/subtract_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#subtract" do - before :each do - @set = Set[:a, :b, :c] - end - - it "deletes any elements contained in other and returns self" do - @set.subtract(Set[:b, :c]).should == @set - @set.should == Set[:a] - end - - it "accepts any enumerable as other" do - @set.subtract([:c]).should == Set[:a, :b] - end -end diff --git a/spec/ruby/library/set/superset_spec.rb b/spec/ruby/library/set/superset_spec.rb deleted file mode 100644 index a95fab8a42..0000000000 --- a/spec/ruby/library/set/superset_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#superset?" do - before :each do - @set = Set[1, 2, 3, 4] - end - - it "returns true if passed a Set that equals self or self is a proper superset of" do - @set.superset?(@set).should be_true - Set[].superset?(Set[]).should be_true - - @set.superset?(Set[]).should be_true - Set[1, 2, 3].superset?(Set[]).should be_true - Set["a", :b, ?c].superset?(Set[]).should be_true - - @set.superset?(Set[1, 2, 3]).should be_true - @set.superset?(Set[1, 3]).should be_true - @set.superset?(Set[1, 2]).should be_true - @set.superset?(Set[1]).should be_true - - @set.superset?(Set[5]).should be_false - @set.superset?(Set[1, 5]).should be_false - @set.superset?(Set[nil]).should be_false - @set.superset?(Set["test"]).should be_false - end - - it "raises an ArgumentError when passed a non-Set" do - lambda { Set[].superset?([]) }.should raise_error(ArgumentError) - lambda { Set[].superset?(1) }.should raise_error(ArgumentError) - lambda { Set[].superset?("test") }.should raise_error(ArgumentError) - lambda { Set[].superset?(Object.new) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/set/to_a_spec.rb b/spec/ruby/library/set/to_a_spec.rb deleted file mode 100644 index 689e44f38a..0000000000 --- a/spec/ruby/library/set/to_a_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../../spec_helper' -require 'set' - -describe "Set#to_a" do - it "returns an array containing elements of self" do - Set[1, 2, 3].to_a.sort.should == [1, 2, 3] - end -end diff --git a/spec/ruby/library/set/to_s_spec.rb b/spec/ruby/library/set/to_s_spec.rb deleted file mode 100644 index ca2806d669..0000000000 --- a/spec/ruby/library/set/to_s_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require_relative 'shared/inspect' -require 'set' - -ruby_version_is "2.5" do - describe "Set#to_s" do - it_behaves_like :set_inspect, :to_s - - it "is an alias of inspect" do - set = Set.new - set.method(:to_s).should == set.method(:inspect) - end - end -end diff --git a/spec/ruby/library/set/union_spec.rb b/spec/ruby/library/set/union_spec.rb deleted file mode 100644 index 20fe0ddca3..0000000000 --- a/spec/ruby/library/set/union_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/union' -require 'set' - -describe "Set#union" do - it_behaves_like :set_union, :union -end - -describe "Set#|" do - it_behaves_like :set_union, :| -end diff --git a/spec/ruby/library/shellwords/shellwords_spec.rb b/spec/ruby/library/shellwords/shellwords_spec.rb index b245fe862d..d1b61e0a6e 100644 --- a/spec/ruby/library/shellwords/shellwords_spec.rb +++ b/spec/ruby/library/shellwords/shellwords_spec.rb @@ -1,36 +1,33 @@ require_relative '../../spec_helper' require 'shellwords' -include Shellwords describe "Shellwords#shellwords" do it "honors quoted strings" do - shellwords('a "b b" a').should == ['a', 'b b', 'a'] + Shellwords.shellwords('a "b b" a').should == ['a', 'b b', 'a'] end it "honors escaped double quotes" do - shellwords('a "\"b\" c" d').should == ['a', '"b" c', 'd'] + Shellwords.shellwords('a "\"b\" c" d').should == ['a', '"b" c', 'd'] end it "honors escaped single quotes" do - shellwords("a \"'b' c\" d").should == ['a', "'b' c", 'd'] + Shellwords.shellwords("a \"'b' c\" d").should == ['a', "'b' c", 'd'] end it "honors escaped spaces" do - shellwords('a b\ c d').should == ['a', 'b c', 'd'] + Shellwords.shellwords('a b\ c d').should == ['a', 'b c', 'd'] end it "raises ArgumentError when double quoted strings are misquoted" do - lambda { shellwords('a "b c d e') }.should raise_error(ArgumentError) + -> { Shellwords.shellwords('a "b c d e') }.should.raise(ArgumentError) end it "raises ArgumentError when single quoted strings are misquoted" do - lambda { shellwords("a 'b c d e") }.should raise_error(ArgumentError) + -> { Shellwords.shellwords("a 'b c d e") }.should.raise(ArgumentError) end - ruby_version_is '2.4' do - # https://bugs.ruby-lang.org/issues/10055 - it "matches POSIX sh behavior for backslashes within double quoted strings" do - shellsplit('printf "%s\n"').should == ['printf', '%s\n'] - end + # https://bugs.ruby-lang.org/issues/10055 + it "matches POSIX sh behavior for backslashes within double quoted strings" do + Shellwords.shellsplit('printf "%s\n"').should == ['printf', '%s\n'] end end diff --git a/spec/ruby/library/singleton/allocate_spec.rb b/spec/ruby/library/singleton/allocate_spec.rb index 689ecc57c6..a0094fb32a 100644 --- a/spec/ruby/library/singleton/allocate_spec.rb +++ b/spec/ruby/library/singleton/allocate_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "Singleton.allocate" do it "is a private method" do - lambda { SingletonSpecs::MyClass.allocate }.should raise_error(NoMethodError) + -> { SingletonSpecs::MyClass.allocate }.should.raise(NoMethodError) end end diff --git a/spec/ruby/library/singleton/clone_spec.rb b/spec/ruby/library/singleton/clone_spec.rb index 7392d7ff6e..a7b7b731f5 100644 --- a/spec/ruby/library/singleton/clone_spec.rb +++ b/spec/ruby/library/singleton/clone_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "Singleton#clone" do it "is prevented" do - lambda { SingletonSpecs::MyClass.instance.clone }.should raise_error(TypeError) + -> { SingletonSpecs::MyClass.instance.clone }.should.raise(TypeError) end end diff --git a/spec/ruby/library/singleton/dup_spec.rb b/spec/ruby/library/singleton/dup_spec.rb index c5c02a0357..a0455f37b7 100644 --- a/spec/ruby/library/singleton/dup_spec.rb +++ b/spec/ruby/library/singleton/dup_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "Singleton#dup" do it "is prevented" do - lambda { SingletonSpecs::MyClass.instance.dup }.should raise_error(TypeError) + -> { SingletonSpecs::MyClass.instance.dup }.should.raise(TypeError) end end diff --git a/spec/ruby/library/singleton/instance_spec.rb b/spec/ruby/library/singleton/instance_spec.rb index 1679728d4c..20cac602b5 100644 --- a/spec/ruby/library/singleton/instance_spec.rb +++ b/spec/ruby/library/singleton/instance_spec.rb @@ -3,28 +3,28 @@ require_relative 'fixtures/classes' describe "Singleton.instance" do it "returns an instance of the singleton class" do - SingletonSpecs::MyClass.instance.should be_kind_of(SingletonSpecs::MyClass) + SingletonSpecs::MyClass.instance.should.is_a?(SingletonSpecs::MyClass) end it "returns the same instance for multiple calls to instance" do - SingletonSpecs::MyClass.instance.should equal(SingletonSpecs::MyClass.instance) + SingletonSpecs::MyClass.instance.should.equal?(SingletonSpecs::MyClass.instance) end it "returns an instance of the singleton's subclasses" do - SingletonSpecs::MyClassChild.instance.should be_kind_of(SingletonSpecs::MyClassChild) + SingletonSpecs::MyClassChild.instance.should.is_a?(SingletonSpecs::MyClassChild) end it "returns the same instance for multiple class to instance on subclasses" do - SingletonSpecs::MyClassChild.instance.should equal(SingletonSpecs::MyClassChild.instance) + SingletonSpecs::MyClassChild.instance.should.equal?(SingletonSpecs::MyClassChild.instance) end it "returns an instance of the singleton's clone" do klone = SingletonSpecs::MyClassChild.clone - klone.instance.should be_kind_of(klone) + klone.instance.should.is_a?(klone) end it "returns the same instance for multiple class to instance on clones" do klone = SingletonSpecs::MyClassChild.clone - klone.instance.should equal(klone.instance) + klone.instance.should.equal?(klone.instance) end end diff --git a/spec/ruby/library/singleton/load_spec.rb b/spec/ruby/library/singleton/load_spec.rb index 4c753f9e7a..ab95d14640 100644 --- a/spec/ruby/library/singleton/load_spec.rb +++ b/spec/ruby/library/singleton/load_spec.rb @@ -1,21 +1,20 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' -# TODO: change to a.should be_equal(b) # TODO: write spec for cloning classes and calling private methods # TODO: write spec for private_methods not showing up via extended describe "Singleton._load" do it "returns the singleton instance for anything passed in" do klass = SingletonSpecs::MyClass - klass._load("").should equal(klass.instance) - klass._load("42").should equal(klass.instance) - klass._load(42).should equal(klass.instance) + klass._load("").should.equal?(klass.instance) + klass._load("42").should.equal?(klass.instance) + klass._load(42).should.equal?(klass.instance) end it "returns the singleton instance for anything passed in to subclass" do subklass = SingletonSpecs::MyClassChild - subklass._load("").should equal(subklass.instance) - subklass._load("42").should equal(subklass.instance) - subklass._load(42).should equal(subklass.instance) + subklass._load("").should.equal?(subklass.instance) + subklass._load("42").should.equal?(subklass.instance) + subklass._load(42).should.equal?(subklass.instance) end end diff --git a/spec/ruby/library/singleton/new_spec.rb b/spec/ruby/library/singleton/new_spec.rb index babd50fbc3..6167231a29 100644 --- a/spec/ruby/library/singleton/new_spec.rb +++ b/spec/ruby/library/singleton/new_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "Singleton.new" do it "is a private method" do - lambda { SingletonSpecs::NewSpec.new }.should raise_error(NoMethodError) + -> { SingletonSpecs::NewSpec.new }.should.raise(NoMethodError) end end diff --git a/spec/ruby/library/socket/addrinfo/afamily_spec.rb b/spec/ruby/library/socket/addrinfo/afamily_spec.rb index 7229dab9de..5d075be057 100644 --- a/spec/ruby/library/socket/addrinfo/afamily_spec.rb +++ b/spec/ruby/library/socket/addrinfo/afamily_spec.rb @@ -23,15 +23,13 @@ describe "Addrinfo#afamily" do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end - - it "returns Socket::AF_UNIX" do - @addrinfo.afamily.should == Socket::AF_UNIX - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end + + it "returns Socket::AF_UNIX" do + @addrinfo.afamily.should == Socket::AF_UNIX end end end diff --git a/spec/ruby/library/socket/addrinfo/bind_spec.rb b/spec/ruby/library/socket/addrinfo/bind_spec.rb index 6f78890a4d..cdd187771f 100644 --- a/spec/ruby/library/socket/addrinfo/bind_spec.rb +++ b/spec/ruby/library/socket/addrinfo/bind_spec.rb @@ -13,16 +13,16 @@ describe "Addrinfo#bind" do it "returns a bound socket when no block is given" do @socket = @addrinfo.bind - @socket.should be_kind_of(Socket) - @socket.closed?.should be_false + @socket.should.is_a?(Socket) + @socket.closed?.should == false end it "yields the socket if a block is given" do @addrinfo.bind do |sock| @socket = sock - sock.should be_kind_of(Socket) + sock.should.is_a?(Socket) end - @socket.closed?.should be_true + @socket.closed?.should == true end end diff --git a/spec/ruby/library/socket/addrinfo/canonname_spec.rb b/spec/ruby/library/socket/addrinfo/canonname_spec.rb index a1cc8b3980..efd3147125 100644 --- a/spec/ruby/library/socket/addrinfo/canonname_spec.rb +++ b/spec/ruby/library/socket/addrinfo/canonname_spec.rb @@ -10,7 +10,7 @@ describe "Addrinfo#canonname" do it "returns the canonical name for a host" do canonname = @addrinfos.map { |a| a.canonname }.find { |name| name and name.include?("localhost") } if canonname - canonname.should include("localhost") + canonname.should.include?("localhost") else canonname.should == nil end @@ -20,7 +20,7 @@ describe "Addrinfo#canonname" do it 'returns nil' do addr = Addrinfo.new(Socket.sockaddr_in(0, '127.0.0.1')) - addr.canonname.should be_nil + addr.canonname.should == nil end end diff --git a/spec/ruby/library/socket/addrinfo/connect_from_spec.rb b/spec/ruby/library/socket/addrinfo/connect_from_spec.rb index 55fce2e159..b1f6caa174 100644 --- a/spec/ruby/library/socket/addrinfo/connect_from_spec.rb +++ b/spec/ruby/library/socket/addrinfo/connect_from_spec.rb @@ -17,18 +17,18 @@ describe 'Addrinfo#connect_from' do describe 'using separate arguments' do it 'returns a Socket when no block is given' do @socket = @addr.connect_from(ip_address, 0) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields the Socket when a block is given' do @addr.connect_from(ip_address, 0) do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end it 'treats the last argument as a set of options if it is a Hash' do @socket = @addr.connect_from(ip_address, 0, timeout: 2) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'binds the socket to the local address' do @@ -48,18 +48,18 @@ describe 'Addrinfo#connect_from' do it 'returns a Socket when no block is given' do @socket = @addr.connect_from(@from_addr) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields the Socket when a block is given' do @addr.connect_from(@from_addr) do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end it 'treats the last argument as a set of options if it is a Hash' do @socket = @addr.connect_from(@from_addr, timeout: 2) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'binds the socket to the local address' do diff --git a/spec/ruby/library/socket/addrinfo/connect_spec.rb b/spec/ruby/library/socket/addrinfo/connect_spec.rb index 1c2dc609ca..a8494b5501 100644 --- a/spec/ruby/library/socket/addrinfo/connect_spec.rb +++ b/spec/ruby/library/socket/addrinfo/connect_spec.rb @@ -16,20 +16,20 @@ describe 'Addrinfo#connect' do it 'returns a Socket when no block is given' do addr = Addrinfo.tcp(ip_address, @port) @socket = addr.connect - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields a Socket when a block is given' do addr = Addrinfo.tcp(ip_address, @port) addr.connect do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end it 'accepts a Hash of options' do addr = Addrinfo.tcp(ip_address, @port) @socket = addr.connect(timeout: 2) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end end end diff --git a/spec/ruby/library/socket/addrinfo/connect_to_spec.rb b/spec/ruby/library/socket/addrinfo/connect_to_spec.rb index 69666da19b..2bf49a38e8 100644 --- a/spec/ruby/library/socket/addrinfo/connect_to_spec.rb +++ b/spec/ruby/library/socket/addrinfo/connect_to_spec.rb @@ -17,18 +17,18 @@ describe 'Addrinfo#connect_to' do describe 'using separate arguments' do it 'returns a Socket when no block is given' do @socket = @addr.connect_to(ip_address, @port) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields the Socket when a block is given' do @addr.connect_to(ip_address, @port) do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end it 'treats the last argument as a set of options if it is a Hash' do @socket = @addr.connect_to(ip_address, @port, timeout: 2) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'binds the Addrinfo to the local address' do @@ -48,18 +48,18 @@ describe 'Addrinfo#connect_to' do it 'returns a Socket when no block is given' do @socket = @addr.connect_to(@to_addr) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields the Socket when a block is given' do @addr.connect_to(@to_addr) do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end it 'treats the last argument as a set of options if it is a Hash' do @socket = @addr.connect_to(@to_addr, timeout: 2) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'binds the socket to the local address' do diff --git a/spec/ruby/library/socket/addrinfo/family_addrinfo_spec.rb b/spec/ruby/library/socket/addrinfo/family_addrinfo_spec.rb index d3419daaaf..38834ade91 100644 --- a/spec/ruby/library/socket/addrinfo/family_addrinfo_spec.rb +++ b/spec/ruby/library/socket/addrinfo/family_addrinfo_spec.rb @@ -4,7 +4,7 @@ describe 'Addrinfo#family_addrinfo' do it 'raises ArgumentError if no arguments are given' do addr = Addrinfo.tcp('127.0.0.1', 0) - lambda { addr.family_addrinfo }.should raise_error(ArgumentError) + -> { addr.family_addrinfo }.should.raise(ArgumentError) end describe 'using multiple arguments' do @@ -14,17 +14,17 @@ describe 'Addrinfo#family_addrinfo' do end it 'raises ArgumentError if only 1 argument is given' do - lambda { @source.family_addrinfo('127.0.0.1') }.should raise_error(ArgumentError) + -> { @source.family_addrinfo('127.0.0.1') }.should.raise(ArgumentError) end it 'raises ArgumentError if more than 2 arguments are given' do - lambda { @source.family_addrinfo('127.0.0.1', 0, 666) }.should raise_error(ArgumentError) + -> { @source.family_addrinfo('127.0.0.1', 0, 666) }.should.raise(ArgumentError) end it 'returns an Addrinfo when a host and port are given' do addr = @source.family_addrinfo('127.0.0.1', 0) - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do @@ -50,38 +50,36 @@ describe 'Addrinfo#family_addrinfo' do end end - with_feature :unix_socket do - describe 'with a UNIX Addrinfo' do - before do - @source = Addrinfo.unix('cats') - end + describe 'with a UNIX Addrinfo' do + before do + @source = Addrinfo.unix('cats') + end - it 'raises ArgumentError if more than 1 argument is given' do - lambda { @source.family_addrinfo('foo', 'bar') }.should raise_error(ArgumentError) - end + it 'raises ArgumentError if more than 1 argument is given' do + -> { @source.family_addrinfo('foo', 'bar') }.should.raise(ArgumentError) + end - it 'returns an Addrinfo when a UNIX socket path is given' do - addr = @source.family_addrinfo('dogs') + it 'returns an Addrinfo when a UNIX socket path is given' do + addr = @source.family_addrinfo('dogs') - addr.should be_an_instance_of(Addrinfo) - end + addr.should.instance_of?(Addrinfo) + end - describe 'the returned Addrinfo' do - before do - @addr = @source.family_addrinfo('dogs') - end + describe 'the returned Addrinfo' do + before do + @addr = @source.family_addrinfo('dogs') + end - it 'uses AF_UNIX as the address family' do - @addr.afamily.should == Socket::AF_UNIX - end + it 'uses AF_UNIX as the address family' do + @addr.afamily.should == Socket::AF_UNIX + end - it 'uses PF_UNIX as the protocol family' do - @addr.pfamily.should == Socket::PF_UNIX - end + it 'uses PF_UNIX as the protocol family' do + @addr.pfamily.should == Socket::PF_UNIX + end - it 'uses the given socket path' do - @addr.unix_path.should == 'dogs' - end + it 'uses the given socket path' do + @addr.unix_path.should == 'dogs' end end end @@ -99,17 +97,17 @@ describe 'Addrinfo#family_addrinfo' do it 'raises ArgumentError if more than 1 argument is given' do input = Addrinfo.tcp('127.0.0.2', 0) - lambda { @source.family_addrinfo(input, 666) }.should raise_error(ArgumentError) + -> { @source.family_addrinfo(input, 666) }.should.raise(ArgumentError) end it "raises ArgumentError if the protocol families don't match" do input = Addrinfo.tcp('::1', 0) - lambda { @source.family_addrinfo(input) }.should raise_error(ArgumentError) + -> { @source.family_addrinfo(input) }.should.raise(ArgumentError) end it "raises ArgumentError if the socket types don't match" do input = Addrinfo.udp('127.0.0.1', 0) - lambda { @source.family_addrinfo(input) }.should raise_error(ArgumentError) + -> { @source.family_addrinfo(input) }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/socket/addrinfo/foreach_spec.rb b/spec/ruby/library/socket/addrinfo/foreach_spec.rb index 6ec8fab905..8cbbddb8f0 100644 --- a/spec/ruby/library/socket/addrinfo/foreach_spec.rb +++ b/spec/ruby/library/socket/addrinfo/foreach_spec.rb @@ -3,7 +3,7 @@ require_relative '../spec_helper' describe 'Addrinfo.foreach' do it 'yields Addrinfo instances to the supplied block' do Addrinfo.foreach('127.0.0.1', 80) do |addr| - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) end end end diff --git a/spec/ruby/library/socket/addrinfo/getaddrinfo_spec.rb b/spec/ruby/library/socket/addrinfo/getaddrinfo_spec.rb index 67fad73815..47393ee167 100644 --- a/spec/ruby/library/socket/addrinfo/getaddrinfo_spec.rb +++ b/spec/ruby/library/socket/addrinfo/getaddrinfo_spec.rb @@ -5,8 +5,8 @@ describe 'Addrinfo.getaddrinfo' do it 'returns an Array of Addrinfo instances' do array = Addrinfo.getaddrinfo('127.0.0.1', 80) - array.should be_an_instance_of(Array) - array[0].should be_an_instance_of(Addrinfo) + array.should.instance_of?(Array) + array[0].should.instance_of?(Addrinfo) end SocketSpecs.each_ip_protocol do |family, ip_address| @@ -54,7 +54,7 @@ describe 'Addrinfo.getaddrinfo' do array = Addrinfo.getaddrinfo('127.0.0.1', 80) possible = [Socket::SOCK_STREAM, Socket::SOCK_DGRAM] - possible.should include(array[0].socktype) + possible.should.include?(array[0].socktype) end end @@ -69,23 +69,19 @@ describe 'Addrinfo.getaddrinfo' do array = Addrinfo.getaddrinfo('127.0.0.1', 80) possible = [Socket::IPPROTO_TCP, Socket::IPPROTO_UDP] - possible.should include(array[0].protocol) + possible.should.include?(array[0].protocol) end end - platform_is_not :'solaris2.10' do # i386-solaris - it 'sets a custom socket protocol of the Addrinfo instances' do - array = Addrinfo.getaddrinfo('127.0.0.1', 80, nil, nil, Socket::IPPROTO_UDP) + it 'sets a custom socket protocol of the Addrinfo instances' do + array = Addrinfo.getaddrinfo('127.0.0.1', 80, nil, nil, Socket::IPPROTO_UDP) - array[0].protocol.should == Socket::IPPROTO_UDP - end + array[0].protocol.should == Socket::IPPROTO_UDP end - platform_is_not :solaris do - it 'sets the canonical name when AI_CANONNAME is given as a flag' do - array = Addrinfo.getaddrinfo('localhost', 80, nil, nil, nil, Socket::AI_CANONNAME) + it 'sets the canonical name when AI_CANONNAME is given as a flag' do + array = Addrinfo.getaddrinfo('localhost', 80, nil, nil, nil, Socket::AI_CANONNAME) - array[0].canonname.should be_an_instance_of(String) - end + array[0].canonname.should.instance_of?(String) end end diff --git a/spec/ruby/library/socket/addrinfo/getnameinfo_spec.rb b/spec/ruby/library/socket/addrinfo/getnameinfo_spec.rb index c5284f1c0f..43b5a2000a 100644 --- a/spec/ruby/library/socket/addrinfo/getnameinfo_spec.rb +++ b/spec/ruby/library/socket/addrinfo/getnameinfo_spec.rb @@ -21,7 +21,7 @@ describe 'Addrinfo#getnameinfo' do end platform_is :linux do - with_feature :unix_socket do + platform_is_not :android do describe 'using a UNIX Addrinfo' do before do @addr = Addrinfo.unix('cats') diff --git a/spec/ruby/library/socket/addrinfo/initialize_spec.rb b/spec/ruby/library/socket/addrinfo/initialize_spec.rb index 460fc28d49..f33255e38b 100644 --- a/spec/ruby/library/socket/addrinfo/initialize_spec.rb +++ b/spec/ruby/library/socket/addrinfo/initialize_spec.rb @@ -17,7 +17,7 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 25 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the UNSPEC pfamily" do @addrinfo.pfamily.should == Socket::PF_UNSPEC end @@ -53,11 +53,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 25 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET6 end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET6 end @@ -83,15 +83,15 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 25 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET6 end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET6 end - it "returns the 0 socket type" do + it "returns the specified socket type" do @addrinfo.socktype.should == Socket::SOCK_STREAM end @@ -113,11 +113,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 25 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET6 end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET6 end @@ -147,11 +147,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 46102 end - it "returns the Socket::PF_INET pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET end @@ -198,9 +198,9 @@ describe "Addrinfo#initialize" do describe 'with an invalid IP address' do it 'raises SocketError' do - block = lambda { Addrinfo.new(['AF_INET6', 80, 'hostname', '127.0.0.1']) } + block = -> { Addrinfo.new(['AF_INET6', 80, 'hostname', '127.0.0.1']) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end @@ -217,11 +217,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 46102 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET end @@ -247,11 +247,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 46102 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET end @@ -274,15 +274,17 @@ describe "Addrinfo#initialize" do end end - with_feature :sock_packet do - [:SOCK_SEQPACKET].each do |type| - it "overwrites the socket type #{type}" do - sockaddr = ['AF_INET', 80, 'hostname', '127.0.0.1'] + platform_is_not :android do + with_feature :sock_packet do + [:SOCK_SEQPACKET].each do |type| + it "overwrites the socket type #{type}" do + sockaddr = ['AF_INET', 80, 'hostname', '127.0.0.1'] - value = Socket.const_get(type) - addr = Addrinfo.new(sockaddr, nil, value) + value = Socket.const_get(type) + addr = Addrinfo.new(sockaddr, nil, value) - addr.socktype.should == value + addr.socktype.should == value + end end end end @@ -290,9 +292,9 @@ describe "Addrinfo#initialize" do it "raises SocketError when using SOCK_RDM" do sockaddr = ['AF_INET', 80, 'hostname', '127.0.0.1'] value = Socket::SOCK_RDM - block = lambda { Addrinfo.new(sockaddr, nil, value) } + block = -> { Addrinfo.new(sockaddr, nil, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end @@ -309,11 +311,11 @@ describe "Addrinfo#initialize" do @addrinfo.ip_port.should == 46102 end - it "returns the Socket::UNSPEC pfamily" do + it "returns the specified pfamily" do @addrinfo.pfamily.should == Socket::PF_INET end - it "returns the INET6 afamily" do + it "returns the specified afamily" do @addrinfo.afamily.should == Socket::AF_INET end @@ -333,12 +335,12 @@ describe "Addrinfo#initialize" do @sockaddr = ['AF_INET6', 80, 'hostname', '127.0.0.1'] end - it "raises SocketError when using any Socket constant except except AF_INET(6)/PF_INET(6)" do + it "raises SocketError when using any Socket constant except AF_INET(6)/PF_INET(6)" do Socket.constants.grep(/(^AF_|^PF_)(?!INET)/).each do |constant| value = Socket.const_get(constant) -> { Addrinfo.new(@sockaddr, value) - }.should raise_error(SocketError) + }.should.raise(SocketError) end end end @@ -360,13 +362,13 @@ describe "Addrinfo#initialize" do end end - platform_is_not :windows, :aix, :solaris do + platform_is_not :windows, :aix do (Socket.constants.grep(/^IPPROTO/) - valid).each do |type| it "raises SocketError when using #{type}" do value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, nil, value) } + block = -> { Addrinfo.new(@sockaddr, nil, nil, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end end @@ -388,13 +390,13 @@ describe "Addrinfo#initialize" do end end - platform_is_not :windows, :aix, :solaris do + platform_is_not :windows, :aix do (Socket.constants.grep(/^IPPROTO/) - valid).each do |type| it "raises SocketError when using #{type}" do value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, @socktype, value) } + block = -> { Addrinfo.new(@sockaddr, nil, @socktype, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end end @@ -409,9 +411,9 @@ describe "Addrinfo#initialize" do Socket.constants.grep(/^IPPROTO/).each do |type| it "raises SocketError when using #{type}" do value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, @socktype, value) } + block = -> { Addrinfo.new(@sockaddr, nil, @socktype, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end end @@ -440,36 +442,38 @@ describe "Addrinfo#initialize" do Socket.constants.grep(/^IPPROTO/).each do |type| it "raises SocketError when using #{type}" do value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, @socktype, value) } + block = -> { Addrinfo.new(@sockaddr, nil, @socktype, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end end platform_is :linux do - describe 'and the socket type is set to SOCK_SEQPACKET' do - before do - @socktype = Socket::SOCK_SEQPACKET - end + platform_is_not :android do + describe 'and the socket type is set to SOCK_SEQPACKET' do + before do + @socktype = Socket::SOCK_SEQPACKET + end - valid = [:IPPROTO_IP, :IPPROTO_HOPOPTS] + valid = [:IPPROTO_IP, :IPPROTO_HOPOPTS] - valid.each do |type| - it "overwrites the protocol when using #{type}" do - value = Socket.const_get(type) - addr = Addrinfo.new(@sockaddr, nil, @socktype, value) + valid.each do |type| + it "overwrites the protocol when using #{type}" do + value = Socket.const_get(type) + addr = Addrinfo.new(@sockaddr, nil, @socktype, value) - addr.protocol.should == value + addr.protocol.should == value + end end - end - (Socket.constants.grep(/^IPPROTO/) - valid).each do |type| - it "raises SocketError when using #{type}" do - value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, @socktype, value) } + (Socket.constants.grep(/^IPPROTO/) - valid).each do |type| + it "raises SocketError when using #{type}" do + value = Socket.const_get(type) + block = -> { Addrinfo.new(@sockaddr, nil, @socktype, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) + end end end end @@ -491,13 +495,13 @@ describe "Addrinfo#initialize" do end end - platform_is_not :windows, :aix, :solaris do + platform_is_not :windows, :aix do (Socket.constants.grep(/^IPPROTO/) - valid).each do |type| it "raises SocketError when using #{type}" do value = Socket.const_get(type) - block = lambda { Addrinfo.new(@sockaddr, nil, @socktype, value) } + block = -> { Addrinfo.new(@sockaddr, nil, @socktype, value) } - block.should raise_error(SocketError) + block.should.raise(SocketError) end end end @@ -510,13 +514,13 @@ describe "Addrinfo#initialize" do @sockaddr = Socket.sockaddr_in(80, '127.0.0.1') end - it 'returns an Addrinfo with :PF_INET family' do + it 'returns an Addrinfo with the specified pfamily for :PF_INET' do addr = Addrinfo.new(@sockaddr, :PF_INET) addr.pfamily.should == Socket::PF_INET end - it 'returns an Addrinfo with :INET family' do + it 'returns an Addrinfo with the specified pfamily for :INET' do addr = Addrinfo.new(@sockaddr, :INET) addr.pfamily.should == Socket::PF_INET @@ -540,13 +544,13 @@ describe "Addrinfo#initialize" do @sockaddr = Socket.sockaddr_in(80, '127.0.0.1') end - it 'returns an Addrinfo with "PF_INET" family' do + it 'returns an Addrinfo with the specified pfamily for PF_INET' do addr = Addrinfo.new(@sockaddr, 'PF_INET') addr.pfamily.should == Socket::PF_INET end - it 'returns an Addrinfo with "INET" family' do + it 'returns an Addrinfo with the specified pfamily for INET' do addr = Addrinfo.new(@sockaddr, 'INET') addr.pfamily.should == Socket::PF_INET @@ -565,23 +569,21 @@ describe "Addrinfo#initialize" do end end - with_feature :unix_socket do - describe 'using separate arguments for a Unix socket' do - before do - @sockaddr = Socket.pack_sockaddr_un('socket') - end + describe 'using separate arguments for a Unix socket' do + before do + @sockaddr = Socket.pack_sockaddr_un('socket') + end - it 'returns an Addrinfo with the correct unix path' do - Addrinfo.new(@sockaddr).unix_path.should == 'socket' - end + it 'returns an Addrinfo with the correct unix path' do + Addrinfo.new(@sockaddr).unix_path.should == 'socket' + end - it 'returns an Addrinfo with the correct protocol family' do - Addrinfo.new(@sockaddr).pfamily.should == Socket::PF_UNSPEC - end + it 'returns an Addrinfo with the correct protocol family' do + Addrinfo.new(@sockaddr).pfamily.should == Socket::PF_UNSPEC + end - it 'returns an Addrinfo with the correct address family' do - Addrinfo.new(@sockaddr).afamily.should == Socket::AF_UNIX - end + it 'returns an Addrinfo with the correct address family' do + Addrinfo.new(@sockaddr).afamily.should == Socket::AF_UNIX end end end diff --git a/spec/ruby/library/socket/addrinfo/inspect_sockaddr_spec.rb b/spec/ruby/library/socket/addrinfo/inspect_sockaddr_spec.rb index 70ca4dd4d7..6b18c79469 100644 --- a/spec/ruby/library/socket/addrinfo/inspect_sockaddr_spec.rb +++ b/spec/ruby/library/socket/addrinfo/inspect_sockaddr_spec.rb @@ -32,19 +32,17 @@ describe 'Addrinfo#inspect_sockaddr' do end end - with_feature :unix_socket do - describe 'using a UNIX path' do - it 'returns a String containing the UNIX path' do - addr = Addrinfo.unix('/foo/bar') + describe 'using a UNIX path' do + it 'returns a String containing the UNIX path' do + addr = Addrinfo.unix('/foo/bar') - addr.inspect_sockaddr.should == '/foo/bar' - end + addr.inspect_sockaddr.should == '/foo/bar' + end - it 'returns a String containing the UNIX path when using a relative path' do - addr = Addrinfo.unix('foo') + it 'returns a String containing the UNIX path when using a relative path' do + addr = Addrinfo.unix('foo') - addr.inspect_sockaddr.should == 'UNIX foo' - end + addr.inspect_sockaddr.should == 'UNIX foo' end end end diff --git a/spec/ruby/library/socket/addrinfo/inspect_spec.rb b/spec/ruby/library/socket/addrinfo/inspect_spec.rb index 98e1e83ffa..1442af6162 100644 --- a/spec/ruby/library/socket/addrinfo/inspect_spec.rb +++ b/spec/ruby/library/socket/addrinfo/inspect_spec.rb @@ -41,25 +41,23 @@ describe 'Addrinfo#inspect' do end end - with_feature :unix_socket do - describe 'using a UNIX Addrinfo' do - it 'returns a String' do - addr = Addrinfo.unix('/foo') + describe 'using a UNIX Addrinfo' do + it 'returns a String' do + addr = Addrinfo.unix('/foo') - addr.inspect.should == '#<Addrinfo: /foo SOCK_STREAM>' - end + addr.inspect.should == '#<Addrinfo: /foo SOCK_STREAM>' + end - it 'returns a String when using a relative UNIX path' do - addr = Addrinfo.unix('foo') + it 'returns a String when using a relative UNIX path' do + addr = Addrinfo.unix('foo') - addr.inspect.should == '#<Addrinfo: UNIX foo SOCK_STREAM>' - end + addr.inspect.should == '#<Addrinfo: UNIX foo SOCK_STREAM>' + end - it 'returns a String when using a DGRAM socket' do - addr = Addrinfo.unix('/foo', Socket::SOCK_DGRAM) + it 'returns a String when using a DGRAM socket' do + addr = Addrinfo.unix('/foo', Socket::SOCK_DGRAM) - addr.inspect.should == '#<Addrinfo: /foo SOCK_DGRAM>' - end + addr.inspect.should == '#<Addrinfo: /foo SOCK_DGRAM>' end end end diff --git a/spec/ruby/library/socket/addrinfo/ip_address_spec.rb b/spec/ruby/library/socket/addrinfo/ip_address_spec.rb index 004de37254..9a0ede4eeb 100644 --- a/spec/ruby/library/socket/addrinfo/ip_address_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ip_address_spec.rb @@ -21,15 +21,13 @@ describe "Addrinfo#ip_address" do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "raises an exception" do - lambda { @addrinfo.ip_address }.should raise_error(SocketError) - end + it "raises an exception" do + -> { @addrinfo.ip_address }.should.raise(SocketError) end end @@ -63,23 +61,4 @@ describe "Addrinfo#ip_address" do @ips.include?(addr.ip_address).should == true end end - - # On MRI calling Addrinfo#ip_address with AF_UNSPEC as the address family is - # supposed to raise a SocketError. MRI however doesn't provide a way to - # actually initialize an Addrinfo with AF_UNSPEC, nor does it allow stubbing - # of any methods since Addrinfo doesn't use any Ruby methods for checking the - # IP address. As a result we can only run this test on Rubinius. - with_feature :pure_ruby_addrinfo do - describe 'with a non IPv4 or IPv6 address' do - it 'raises SocketError' do - sockaddr = Socket.sockaddr_in(80, '127.0.0.1') - addr = Addrinfo.new(sockaddr) - - addr.stub!(:ipv4?).and_return(false) - addr.stub!(:ipv6?).and_return(false) - - lambda { addr.ip_address }.should raise_error(SocketError) - end - end - end end diff --git a/spec/ruby/library/socket/addrinfo/ip_port_spec.rb b/spec/ruby/library/socket/addrinfo/ip_port_spec.rb index 6cf9e7a18e..00f74cdd46 100644 --- a/spec/ruby/library/socket/addrinfo/ip_port_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ip_port_spec.rb @@ -21,15 +21,13 @@ describe "Addrinfo#ip_port" do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "raises an exception" do - lambda { @addrinfo.ip_port }.should raise_error(SocketError) - end + it "raises an exception" do + -> { @addrinfo.ip_port }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/addrinfo/ip_spec.rb b/spec/ruby/library/socket/addrinfo/ip_spec.rb index 80e7a62df7..2237eca263 100644 --- a/spec/ruby/library/socket/addrinfo/ip_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ip_spec.rb @@ -8,7 +8,7 @@ describe "Addrinfo#ip?" do end it "returns true" do - @addrinfo.ip?.should be_true + @addrinfo.ip?.should == true end end @@ -18,19 +18,17 @@ describe "Addrinfo#ip?" do end it "returns true" do - @addrinfo.ip?.should be_true + @addrinfo.ip?.should == true end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ip?.should be_false - end + it "returns false" do + @addrinfo.ip?.should == false end end end @@ -38,7 +36,7 @@ end describe 'Addrinfo.ip' do SocketSpecs.each_ip_protocol do |family, ip_address| it 'returns an Addrinfo instance' do - Addrinfo.ip(ip_address).should be_an_instance_of(Addrinfo) + Addrinfo.ip(ip_address).should.instance_of?(Addrinfo) end it 'sets the IP address' do diff --git a/spec/ruby/library/socket/addrinfo/ip_unpack_spec.rb b/spec/ruby/library/socket/addrinfo/ip_unpack_spec.rb index 57ae79a6c8..b48ca062ee 100644 --- a/spec/ruby/library/socket/addrinfo/ip_unpack_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ip_unpack_spec.rb @@ -21,15 +21,13 @@ describe "Addrinfo#ip_unpack" do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "raises an exception" do - lambda { @addrinfo.ip_unpack }.should raise_error(SocketError) - end + it "raises an exception" do + -> { @addrinfo.ip_unpack }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv4_loopback_spec.rb b/spec/ruby/library/socket/addrinfo/ipv4_loopback_spec.rb index f5bab711db..266281ce7a 100644 --- a/spec/ruby/library/socket/addrinfo/ipv4_loopback_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv4_loopback_spec.rb @@ -3,14 +3,14 @@ require_relative '../spec_helper' describe "Addrinfo#ipv4_loopback?" do describe "for an ipv4 socket" do it "returns true for the loopback address" do - Addrinfo.ip('127.0.0.1').ipv4_loopback?.should == true - Addrinfo.ip('127.0.0.2').ipv4_loopback?.should == true - Addrinfo.ip('127.255.0.1').ipv4_loopback?.should == true - Addrinfo.ip('127.255.255.255').ipv4_loopback?.should == true + Addrinfo.ip('127.0.0.1').should.ipv4_loopback? + Addrinfo.ip('127.0.0.2').should.ipv4_loopback? + Addrinfo.ip('127.255.0.1').should.ipv4_loopback? + Addrinfo.ip('127.255.255.255').should.ipv4_loopback? end it "returns false for another address" do - Addrinfo.ip('255.255.255.0').ipv4_loopback?.should be_false + Addrinfo.ip('255.255.255.0').ipv4_loopback?.should == false end end @@ -21,23 +21,21 @@ describe "Addrinfo#ipv4_loopback?" do end it "returns false for the loopback address" do - @loopback.ipv4_loopback?.should be_false + @loopback.ipv4_loopback?.should == false end it "returns false for another address" do - @other.ipv4_loopback?.should be_false + @other.ipv4_loopback?.should == false end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv4_loopback?.should be_false - end + it "returns false" do + @addrinfo.ipv4_loopback?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv4_multicast_spec.rb b/spec/ruby/library/socket/addrinfo/ipv4_multicast_spec.rb index 81a68d3d13..bc8a31dfa8 100644 --- a/spec/ruby/library/socket/addrinfo/ipv4_multicast_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv4_multicast_spec.rb @@ -2,28 +2,26 @@ require_relative '../spec_helper' describe "Addrinfo#ipv4_multicast?" do it 'returns true for a multicast address' do - Addrinfo.ip('224.0.0.0').ipv4_multicast?.should == true - Addrinfo.ip('224.0.0.9').ipv4_multicast?.should == true - Addrinfo.ip('239.255.255.250').ipv4_multicast?.should == true + Addrinfo.ip('224.0.0.0').should.ipv4_multicast? + Addrinfo.ip('224.0.0.9').should.ipv4_multicast? + Addrinfo.ip('239.255.255.250').should.ipv4_multicast? end - it 'returns false for a regular addrss' do - Addrinfo.ip('8.8.8.8').ipv4_multicast?.should == false + it 'returns false for a regular address' do + Addrinfo.ip('8.8.8.8').should_not.ipv4_multicast? end it 'returns false for an IPv6 address' do - Addrinfo.ip('::1').ipv4_multicast?.should == false + Addrinfo.ip('::1').should_not.ipv4_multicast? end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv4_multicast?.should be_false - end + it "returns false" do + @addrinfo.ipv4_multicast?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv4_private_spec.rb b/spec/ruby/library/socket/addrinfo/ipv4_private_spec.rb index 733577609e..8cfbf0a25e 100644 --- a/spec/ruby/library/socket/addrinfo/ipv4_private_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv4_private_spec.rb @@ -8,18 +8,18 @@ describe "Addrinfo#ipv4_private?" do end it "returns true for a private address" do - Addrinfo.ip('10.0.0.0').ipv4_private?.should == true - Addrinfo.ip('10.0.0.5').ipv4_private?.should == true + Addrinfo.ip('10.0.0.0').should.ipv4_private? + Addrinfo.ip('10.0.0.5').should.ipv4_private? - Addrinfo.ip('172.16.0.0').ipv4_private?.should == true - Addrinfo.ip('172.16.0.5').ipv4_private?.should == true + Addrinfo.ip('172.16.0.0').should.ipv4_private? + Addrinfo.ip('172.16.0.5').should.ipv4_private? - Addrinfo.ip('192.168.0.0').ipv4_private?.should == true - Addrinfo.ip('192.168.0.5').ipv4_private?.should == true + Addrinfo.ip('192.168.0.0').should.ipv4_private? + Addrinfo.ip('192.168.0.5').should.ipv4_private? end it "returns false for a public address" do - @other.ipv4_private?.should be_false + @other.ipv4_private?.should == false end end @@ -29,19 +29,17 @@ describe "Addrinfo#ipv4_private?" do end it "returns false" do - @other.ipv4_private?.should be_false + @other.ipv4_private?.should == false end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv4_private?.should be_false - end + it "returns false" do + @addrinfo.ipv4_private?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv4_spec.rb b/spec/ruby/library/socket/addrinfo/ipv4_spec.rb index 7cba8209b6..8fef94a8e8 100644 --- a/spec/ruby/library/socket/addrinfo/ipv4_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv4_spec.rb @@ -7,7 +7,7 @@ describe "Addrinfo#ipv4?" do end it "returns true" do - @addrinfo.ipv4?.should be_true + @addrinfo.ipv4?.should == true end end @@ -17,19 +17,17 @@ describe "Addrinfo#ipv4?" do end it "returns false" do - @addrinfo.ipv4?.should be_false + @addrinfo.ipv4?.should == false end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv4?.should be_false - end + it "returns false" do + @addrinfo.ipv4?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_linklocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_linklocal_spec.rb index 291b4d7d6b..bfef396381 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_linklocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_linklocal_spec.rb @@ -5,19 +5,19 @@ guard -> { SocketSpecs.ipv6_available? } do describe 'Addrinfo#ipv6_linklocal?' do platform_is_not :aix do it 'returns true for a link-local address' do - Addrinfo.ip('fe80::').ipv6_linklocal?.should == true - Addrinfo.ip('fe81::').ipv6_linklocal?.should == true - Addrinfo.ip('fe8f::').ipv6_linklocal?.should == true - Addrinfo.ip('fe80::1').ipv6_linklocal?.should == true + Addrinfo.ip('fe80::').should.ipv6_linklocal? + Addrinfo.ip('fe81::').should.ipv6_linklocal? + Addrinfo.ip('fe8f::').should.ipv6_linklocal? + Addrinfo.ip('fe80::1').should.ipv6_linklocal? end end it 'returns false for a regular address' do - Addrinfo.ip('::1').ipv6_linklocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_linklocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_linklocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_linklocal? end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_loopback_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_loopback_spec.rb index 9ff8f107bf..2e8241e336 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_loopback_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_loopback_spec.rb @@ -8,11 +8,11 @@ describe "Addrinfo#ipv6_loopback?" do end it "returns false for the loopback address" do - @loopback.ipv6_loopback?.should be_false + @loopback.ipv6_loopback?.should == false end it "returns false for another address" do - @other.ipv6_loopback?.should be_false + @other.ipv6_loopback?.should == false end end @@ -23,23 +23,21 @@ describe "Addrinfo#ipv6_loopback?" do end it "returns true for the loopback address" do - @loopback.ipv6_loopback?.should be_true + @loopback.ipv6_loopback?.should == true end it "returns false for another address" do - @other.ipv6_loopback?.should be_false + @other.ipv6_loopback?.should == false end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv6_loopback?.should be_false - end + it "returns false" do + @addrinfo.ipv6_loopback?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_mc_global_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_mc_global_spec.rb index 9c8e4dccb4..01fa0992ba 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_mc_global_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_mc_global_spec.rb @@ -2,19 +2,19 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_mc_global?' do it 'returns true for a multi-cast address in the global scope' do - Addrinfo.ip('ff1e::').ipv6_mc_global?.should == true - Addrinfo.ip('fffe::').ipv6_mc_global?.should == true - Addrinfo.ip('ff0e::').ipv6_mc_global?.should == true - Addrinfo.ip('ff1e::1').ipv6_mc_global?.should == true + Addrinfo.ip('ff1e::').should.ipv6_mc_global? + Addrinfo.ip('fffe::').should.ipv6_mc_global? + Addrinfo.ip('ff0e::').should.ipv6_mc_global? + Addrinfo.ip('ff1e::1').should.ipv6_mc_global? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_mc_global?.should == false - Addrinfo.ip('ff1a::').ipv6_mc_global?.should == false - Addrinfo.ip('ff1f::1').ipv6_mc_global?.should == false + Addrinfo.ip('::1').should_not.ipv6_mc_global? + Addrinfo.ip('ff1a::').should_not.ipv6_mc_global? + Addrinfo.ip('ff1f::1').should_not.ipv6_mc_global? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_mc_global?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_mc_global? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_mc_linklocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_mc_linklocal_spec.rb index dd52a9ad8b..a1298919eb 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_mc_linklocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_mc_linklocal_spec.rb @@ -2,18 +2,18 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_mc_linklocal?' do it 'returns true for a multi-cast link-local address' do - Addrinfo.ip('ff12::').ipv6_mc_linklocal?.should == true - Addrinfo.ip('ff02::').ipv6_mc_linklocal?.should == true - Addrinfo.ip('fff2::').ipv6_mc_linklocal?.should == true - Addrinfo.ip('ff12::1').ipv6_mc_linklocal?.should == true + Addrinfo.ip('ff12::').should.ipv6_mc_linklocal? + Addrinfo.ip('ff02::').should.ipv6_mc_linklocal? + Addrinfo.ip('fff2::').should.ipv6_mc_linklocal? + Addrinfo.ip('ff12::1').should.ipv6_mc_linklocal? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_mc_linklocal?.should == false - Addrinfo.ip('fff1::').ipv6_mc_linklocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_mc_linklocal? + Addrinfo.ip('fff1::').should_not.ipv6_mc_linklocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_mc_linklocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_mc_linklocal? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_mc_nodelocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_mc_nodelocal_spec.rb index b3cf5ffbab..0aee952d88 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_mc_nodelocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_mc_nodelocal_spec.rb @@ -2,17 +2,17 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_mc_nodelocal?' do it 'returns true for a multi-cast node-local address' do - Addrinfo.ip('ff11::').ipv6_mc_nodelocal?.should == true - Addrinfo.ip('ff01::').ipv6_mc_nodelocal?.should == true - Addrinfo.ip('fff1::').ipv6_mc_nodelocal?.should == true - Addrinfo.ip('ff11::1').ipv6_mc_nodelocal?.should == true + Addrinfo.ip('ff11::').should.ipv6_mc_nodelocal? + Addrinfo.ip('ff01::').should.ipv6_mc_nodelocal? + Addrinfo.ip('fff1::').should.ipv6_mc_nodelocal? + Addrinfo.ip('ff11::1').should.ipv6_mc_nodelocal? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_mc_nodelocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_mc_nodelocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_mc_nodelocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_mc_nodelocal? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_mc_orglocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_mc_orglocal_spec.rb index 90653dd49c..2977a98d30 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_mc_orglocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_mc_orglocal_spec.rb @@ -2,17 +2,17 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_mc_orglocal?' do it 'returns true for a multi-cast org-local address' do - Addrinfo.ip('ff18::').ipv6_mc_orglocal?.should == true - Addrinfo.ip('ff08::').ipv6_mc_orglocal?.should == true - Addrinfo.ip('fff8::').ipv6_mc_orglocal?.should == true - Addrinfo.ip('ff18::1').ipv6_mc_orglocal?.should == true + Addrinfo.ip('ff18::').should.ipv6_mc_orglocal? + Addrinfo.ip('ff08::').should.ipv6_mc_orglocal? + Addrinfo.ip('fff8::').should.ipv6_mc_orglocal? + Addrinfo.ip('ff18::1').should.ipv6_mc_orglocal? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_mc_orglocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_mc_orglocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_mc_orglocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_mc_orglocal? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_mc_sitelocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_mc_sitelocal_spec.rb index 686b625e0d..58e5976a40 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_mc_sitelocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_mc_sitelocal_spec.rb @@ -2,17 +2,17 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_mc_sitelocal?' do it 'returns true for a multi-cast site-local address' do - Addrinfo.ip('ff15::').ipv6_mc_sitelocal?.should == true - Addrinfo.ip('ff05::').ipv6_mc_sitelocal?.should == true - Addrinfo.ip('fff5::').ipv6_mc_sitelocal?.should == true - Addrinfo.ip('ff15::1').ipv6_mc_sitelocal?.should == true + Addrinfo.ip('ff15::').should.ipv6_mc_sitelocal? + Addrinfo.ip('ff05::').should.ipv6_mc_sitelocal? + Addrinfo.ip('fff5::').should.ipv6_mc_sitelocal? + Addrinfo.ip('ff15::1').should.ipv6_mc_sitelocal? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_mc_sitelocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_mc_sitelocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_mc_sitelocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_mc_sitelocal? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_multicast_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_multicast_spec.rb index c25322869c..52787e5e53 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_multicast_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_multicast_spec.rb @@ -8,41 +8,39 @@ describe "Addrinfo#ipv6_multicast?" do end it "returns true for a multicast address" do - @multicast.ipv6_multicast?.should be_false + @multicast.ipv6_multicast?.should == false end it "returns false for another address" do - @other.ipv6_multicast?.should be_false + @other.ipv6_multicast?.should == false end end describe "for an ipv6 socket" do it "returns true for a multicast address" do - Addrinfo.ip('ff00::').ipv6_multicast?.should == true - Addrinfo.ip('ff00::1').ipv6_multicast?.should == true - Addrinfo.ip('ff08::1').ipv6_multicast?.should == true - Addrinfo.ip('fff8::1').ipv6_multicast?.should == true - - Addrinfo.ip('ff02::').ipv6_multicast?.should == true - Addrinfo.ip('ff02::1').ipv6_multicast?.should == true - Addrinfo.ip('ff0f::').ipv6_multicast?.should == true + Addrinfo.ip('ff00::').should.ipv6_multicast? + Addrinfo.ip('ff00::1').should.ipv6_multicast? + Addrinfo.ip('ff08::1').should.ipv6_multicast? + Addrinfo.ip('fff8::1').should.ipv6_multicast? + + Addrinfo.ip('ff02::').should.ipv6_multicast? + Addrinfo.ip('ff02::1').should.ipv6_multicast? + Addrinfo.ip('ff0f::').should.ipv6_multicast? end it "returns false for another address" do - Addrinfo.ip('::1').ipv6_multicast?.should == false - Addrinfo.ip('fe80::').ipv6_multicast?.should == false + Addrinfo.ip('::1').should_not.ipv6_multicast? + Addrinfo.ip('fe80::').should_not.ipv6_multicast? end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv6_multicast?.should be_false - end + it "returns false" do + @addrinfo.ipv6_multicast?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_sitelocal_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_sitelocal_spec.rb index dd202a1749..9158eb5809 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_sitelocal_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_sitelocal_spec.rb @@ -5,19 +5,19 @@ guard -> { SocketSpecs.ipv6_available? } do describe 'Addrinfo#ipv6_sitelocal?' do platform_is_not :aix do it 'returns true for a site-local address' do - Addrinfo.ip('feef::').ipv6_sitelocal?.should == true - Addrinfo.ip('fee0::').ipv6_sitelocal?.should == true - Addrinfo.ip('fee2::').ipv6_sitelocal?.should == true - Addrinfo.ip('feef::1').ipv6_sitelocal?.should == true + Addrinfo.ip('feef::').should.ipv6_sitelocal? + Addrinfo.ip('fee0::').should.ipv6_sitelocal? + Addrinfo.ip('fee2::').should.ipv6_sitelocal? + Addrinfo.ip('feef::1').should.ipv6_sitelocal? end end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_sitelocal?.should == false + Addrinfo.ip('::1').should_not.ipv6_sitelocal? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_sitelocal?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_sitelocal? end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_spec.rb index 131e38849c..9fa8e9bd0c 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_spec.rb @@ -7,7 +7,7 @@ describe "Addrinfo#ipv6?" do end it "returns true" do - @addrinfo.ipv6?.should be_false + @addrinfo.ipv6?.should == false end end @@ -17,19 +17,17 @@ describe "Addrinfo#ipv6?" do end it "returns false" do - @addrinfo.ipv6?.should be_true + @addrinfo.ipv6?.should == true end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns false" do - @addrinfo.ipv6?.should be_false - end + it "returns false" do + @addrinfo.ipv6?.should == false end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_to_ipv4_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_to_ipv4_spec.rb index 6dfaf531ae..d1436d4527 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_to_ipv4_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_to_ipv4_spec.rb @@ -6,7 +6,7 @@ guard -> { SocketSpecs.ipv6_available? } do it 'returns an Addrinfo for ::192.168.1.1' do addr = Addrinfo.ip('::192.168.1.1').ipv6_to_ipv4 - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) addr.afamily.should == Socket::AF_INET addr.ip_address.should == '192.168.1.1' @@ -16,7 +16,7 @@ guard -> { SocketSpecs.ipv6_available? } do it 'returns an Addrinfo for ::0.0.1.1' do addr = Addrinfo.ip('::0.0.1.1').ipv6_to_ipv4 - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) addr.afamily.should == Socket::AF_INET addr.ip_address.should == '0.0.1.1' @@ -25,7 +25,7 @@ guard -> { SocketSpecs.ipv6_available? } do it 'returns an Addrinfo for ::0.0.1.0' do addr = Addrinfo.ip('::0.0.1.0').ipv6_to_ipv4 - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) addr.afamily.should == Socket::AF_INET addr.ip_address.should == '0.0.1.0' @@ -34,7 +34,7 @@ guard -> { SocketSpecs.ipv6_available? } do it 'returns an Addrinfo for ::0.1.0.0' do addr = Addrinfo.ip('::0.1.0.0').ipv6_to_ipv4 - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) addr.afamily.should == Socket::AF_INET addr.ip_address.should == '0.1.0.0' @@ -44,27 +44,27 @@ guard -> { SocketSpecs.ipv6_available? } do it 'returns an Addrinfo for ::ffff:192.168.1.1' do addr = Addrinfo.ip('::ffff:192.168.1.1').ipv6_to_ipv4 - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) addr.afamily.should == Socket::AF_INET addr.ip_address.should == '192.168.1.1' end it 'returns nil for ::0.0.0.1' do - Addrinfo.ip('::0.0.0.1').ipv6_to_ipv4.should be_nil + Addrinfo.ip('::0.0.0.1').ipv6_to_ipv4.should == nil end it 'returns nil for a pure IPv6 Addrinfo' do - Addrinfo.ip('::1').ipv6_to_ipv4.should be_nil + Addrinfo.ip('::1').ipv6_to_ipv4.should == nil end it 'returns nil for an IPv4 Addrinfo' do - Addrinfo.ip('192.168.1.1').ipv6_to_ipv4.should be_nil + Addrinfo.ip('192.168.1.1').ipv6_to_ipv4.should == nil end - with_feature :unix_socket do + describe 'for a unix socket' do it 'returns nil for a UNIX Addrinfo' do - Addrinfo.unix('foo').ipv6_to_ipv4.should be_nil + Addrinfo.unix('foo').ipv6_to_ipv4.should == nil end end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_unique_local_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_unique_local_spec.rb index b80a15fcb0..22f0fa3b75 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_unique_local_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_unique_local_spec.rb @@ -2,17 +2,17 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_unique_local?' do it 'returns true for an unique local IPv6 address' do - Addrinfo.ip('fc00::').ipv6_unique_local?.should == true - Addrinfo.ip('fd00::').ipv6_unique_local?.should == true - Addrinfo.ip('fcff::').ipv6_unique_local?.should == true + Addrinfo.ip('fc00::').should.ipv6_unique_local? + Addrinfo.ip('fd00::').should.ipv6_unique_local? + Addrinfo.ip('fcff::').should.ipv6_unique_local? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_unique_local?.should == false - Addrinfo.ip('fe00::').ipv6_unique_local?.should == false + Addrinfo.ip('::1').should_not.ipv6_unique_local? + Addrinfo.ip('fe00::').should_not.ipv6_unique_local? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_unique_local?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_unique_local? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_unspecified_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_unspecified_spec.rb index dd79d57503..d63979ceda 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_unspecified_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_unspecified_spec.rb @@ -2,14 +2,14 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_unspecified?' do it 'returns true for an unspecified IPv6 address' do - Addrinfo.ip('::').ipv6_unspecified?.should == true + Addrinfo.ip('::').should.ipv6_unspecified? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_unspecified?.should == false + Addrinfo.ip('::1').should_not.ipv6_unspecified? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_unspecified?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_unspecified? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_v4compat_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_v4compat_spec.rb index ab8388a21b..21ca85af99 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_v4compat_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_v4compat_spec.rb @@ -2,19 +2,19 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_v4compat?' do it 'returns true for an IPv4 compatible address' do - Addrinfo.ip('::127.0.0.1').ipv6_v4compat?.should == true - Addrinfo.ip('::192.168.1.1').ipv6_v4compat?.should == true + Addrinfo.ip('::127.0.0.1').should.ipv6_v4compat? + Addrinfo.ip('::192.168.1.1').should.ipv6_v4compat? end it 'returns false for an IPv4 mapped address' do - Addrinfo.ip('::ffff:192.168.1.1').ipv6_v4compat?.should == false + Addrinfo.ip('::ffff:192.168.1.1').should_not.ipv6_v4compat? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_v4compat?.should == false + Addrinfo.ip('::1').should_not.ipv6_v4compat? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_v4compat?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_v4compat? end end diff --git a/spec/ruby/library/socket/addrinfo/ipv6_v4mapped_spec.rb b/spec/ruby/library/socket/addrinfo/ipv6_v4mapped_spec.rb index 82b272c165..7dac0e75db 100644 --- a/spec/ruby/library/socket/addrinfo/ipv6_v4mapped_spec.rb +++ b/spec/ruby/library/socket/addrinfo/ipv6_v4mapped_spec.rb @@ -2,19 +2,19 @@ require_relative '../spec_helper' describe 'Addrinfo#ipv6_v4mapped?' do it 'returns true for an IPv4 compatible address' do - Addrinfo.ip('::ffff:192.168.1.1').ipv6_v4mapped?.should == true + Addrinfo.ip('::ffff:192.168.1.1').should.ipv6_v4mapped? end it 'returns false for an IPv4 compatible address' do - Addrinfo.ip('::192.168.1.1').ipv6_v4mapped?.should == false - Addrinfo.ip('::127.0.0.1').ipv6_v4mapped?.should == false + Addrinfo.ip('::192.168.1.1').should_not.ipv6_v4mapped? + Addrinfo.ip('::127.0.0.1').should_not.ipv6_v4mapped? end it 'returns false for a regular IPv6 address' do - Addrinfo.ip('::1').ipv6_v4mapped?.should == false + Addrinfo.ip('::1').should_not.ipv6_v4mapped? end it 'returns false for an IPv4 address' do - Addrinfo.ip('127.0.0.1').ipv6_v4mapped?.should == false + Addrinfo.ip('127.0.0.1').should_not.ipv6_v4mapped? end end diff --git a/spec/ruby/library/socket/addrinfo/listen_spec.rb b/spec/ruby/library/socket/addrinfo/listen_spec.rb index 714a96ed6c..80bcdc7f83 100644 --- a/spec/ruby/library/socket/addrinfo/listen_spec.rb +++ b/spec/ruby/library/socket/addrinfo/listen_spec.rb @@ -13,12 +13,12 @@ describe 'Addrinfo#listen' do it 'returns a Socket when no block is given' do @socket = @addr.listen - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'yields the Socket if a block is given' do @addr.listen do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end @@ -29,6 +29,6 @@ describe 'Addrinfo#listen' do socket = sock end - socket.closed?.should == true + socket.should.closed? end end diff --git a/spec/ruby/library/socket/addrinfo/marshal_dump_spec.rb b/spec/ruby/library/socket/addrinfo/marshal_dump_spec.rb index c4220a6f3e..438b04a99c 100644 --- a/spec/ruby/library/socket/addrinfo/marshal_dump_spec.rb +++ b/spec/ruby/library/socket/addrinfo/marshal_dump_spec.rb @@ -8,7 +8,7 @@ describe 'Addrinfo#marshal_dump' do end it 'returns an Array' do - @addr.marshal_dump.should be_an_instance_of(Array) + @addr.marshal_dump.should.instance_of?(Array) end describe 'the returned Array' do @@ -32,10 +32,8 @@ describe 'Addrinfo#marshal_dump' do @array[3].should == 'SOCK_STREAM' end - platform_is_not :'solaris2.10' do # i386-solaris - it 'includes the protocol as the 5th value' do - @array[4].should == 'IPPROTO_TCP' - end + it 'includes the protocol as the 5th value' do + @array[4].should == 'IPPROTO_TCP' end it 'includes the canonical name as the 6th value' do @@ -44,40 +42,38 @@ describe 'Addrinfo#marshal_dump' do end end - with_feature :unix_socket do - describe 'using a UNIX Addrinfo' do + describe 'using a UNIX Addrinfo' do + before do + @addr = Addrinfo.unix('foo') + end + + it 'returns an Array' do + @addr.marshal_dump.should.instance_of?(Array) + end + + describe 'the returned Array' do before do - @addr = Addrinfo.unix('foo') + @array = @addr.marshal_dump end - it 'returns an Array' do - @addr.marshal_dump.should be_an_instance_of(Array) + it 'includes the address family as the 1st value' do + @array[0].should == 'AF_UNIX' end - describe 'the returned Array' do - before do - @array = @addr.marshal_dump - end - - it 'includes the address family as the 1st value' do - @array[0].should == 'AF_UNIX' - end - - it 'includes the UNIX path as the 2nd value' do - @array[1].should == @addr.unix_path - end + it 'includes the UNIX path as the 2nd value' do + @array[1].should == @addr.unix_path + end - it 'includes the protocol family as the 3rd value' do - @array[2].should == 'PF_UNIX' - end + it 'includes the protocol family as the 3rd value' do + @array[2].should == 'PF_UNIX' + end - it 'includes the socket type as the 4th value' do - @array[3].should == 'SOCK_STREAM' - end + it 'includes the socket type as the 4th value' do + @array[3].should == 'SOCK_STREAM' + end - it 'includes the protocol as the 5th value' do - @array[4].should == 0 - end + it 'includes the protocol as the 5th value' do + @array[4].should == 0 end end end diff --git a/spec/ruby/library/socket/addrinfo/marshal_load_spec.rb b/spec/ruby/library/socket/addrinfo/marshal_load_spec.rb index aa20865224..02cef90115 100644 --- a/spec/ruby/library/socket/addrinfo/marshal_load_spec.rb +++ b/spec/ruby/library/socket/addrinfo/marshal_load_spec.rb @@ -18,18 +18,16 @@ describe 'Addrinfo#marshal_load' do end end - with_feature :unix_socket do - describe 'using a UNIX socket' do - it 'returns a new Addrinfo' do - source = Addrinfo.unix('foo') - addr = Marshal.load(Marshal.dump(source)) + describe 'using a UNIX socket' do + it 'returns a new Addrinfo' do + source = Addrinfo.unix('foo') + addr = Marshal.load(Marshal.dump(source)) - addr.afamily.should == source.afamily - addr.pfamily.should == source.pfamily - addr.socktype.should == source.socktype - addr.protocol.should == source.protocol - addr.unix_path.should == source.unix_path - end + addr.afamily.should == source.afamily + addr.pfamily.should == source.pfamily + addr.socktype.should == source.socktype + addr.protocol.should == source.protocol + addr.unix_path.should == source.unix_path end end end diff --git a/spec/ruby/library/socket/addrinfo/pfamily_spec.rb b/spec/ruby/library/socket/addrinfo/pfamily_spec.rb index 984744a964..da530b7fdc 100644 --- a/spec/ruby/library/socket/addrinfo/pfamily_spec.rb +++ b/spec/ruby/library/socket/addrinfo/pfamily_spec.rb @@ -29,15 +29,13 @@ describe "Addrinfo#pfamily" do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end - - it "returns Socket::PF_UNIX" do - @addrinfo.pfamily.should == Socket::PF_UNIX - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end + + it "returns Socket::PF_UNIX" do + @addrinfo.pfamily.should == Socket::PF_UNIX end end end diff --git a/spec/ruby/library/socket/addrinfo/protocol_spec.rb b/spec/ruby/library/socket/addrinfo/protocol_spec.rb index ea143fc4a8..f6ffc9acf9 100644 --- a/spec/ruby/library/socket/addrinfo/protocol_spec.rb +++ b/spec/ruby/library/socket/addrinfo/protocol_spec.rb @@ -10,15 +10,13 @@ describe "Addrinfo#protocol" do Addrinfo.tcp('::1', 80).protocol.should == Socket::IPPROTO_TCP end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns 0" do - @addrinfo.protocol.should == 0 - end + it "returns 0" do + @addrinfo.protocol.should == 0 end end end diff --git a/spec/ruby/library/socket/addrinfo/shared/to_sockaddr.rb b/spec/ruby/library/socket/addrinfo/shared/to_sockaddr.rb index c32da5986d..70d6bfbbfe 100644 --- a/spec/ruby/library/socket/addrinfo/shared/to_sockaddr.rb +++ b/spec/ruby/library/socket/addrinfo/shared/to_sockaddr.rb @@ -1,5 +1,4 @@ -describe :socket_addrinfo_to_sockaddr, :shared => true do - +describe :socket_addrinfo_to_sockaddr, shared: true do describe "for an ipv4 socket" do before :each do @addrinfo = Addrinfo.tcp("127.0.0.1", 80) @@ -20,15 +19,13 @@ describe :socket_addrinfo_to_sockaddr, :shared => true do end end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns a sockaddr packed structure" do - @addrinfo.send(@method).should == Socket.sockaddr_un('/tmp/sock') - end + it "returns a sockaddr packed structure" do + @addrinfo.send(@method).should == Socket.sockaddr_un('/tmp/sock') end end @@ -47,5 +44,4 @@ describe :socket_addrinfo_to_sockaddr, :shared => true do addr.send(@method).should == Socket.sockaddr_in(0, '') end end - end diff --git a/spec/ruby/library/socket/addrinfo/socktype_spec.rb b/spec/ruby/library/socket/addrinfo/socktype_spec.rb index b994bea140..e5f02cd759 100644 --- a/spec/ruby/library/socket/addrinfo/socktype_spec.rb +++ b/spec/ruby/library/socket/addrinfo/socktype_spec.rb @@ -9,15 +9,13 @@ describe "Addrinfo#socktype" do Addrinfo.tcp('127.0.0.1', 80).socktype.should == Socket::SOCK_STREAM end - with_feature :unix_socket do - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns Socket::SOCK_STREAM" do - @addrinfo.socktype.should == Socket::SOCK_STREAM - end + it "returns Socket::SOCK_STREAM" do + @addrinfo.socktype.should == Socket::SOCK_STREAM end end end diff --git a/spec/ruby/library/socket/addrinfo/tcp_spec.rb b/spec/ruby/library/socket/addrinfo/tcp_spec.rb index c74c9c21c2..0669de16a6 100644 --- a/spec/ruby/library/socket/addrinfo/tcp_spec.rb +++ b/spec/ruby/library/socket/addrinfo/tcp_spec.rb @@ -4,7 +4,7 @@ require_relative '../fixtures/classes' describe 'Addrinfo.tcp' do SocketSpecs.each_ip_protocol do |family, ip_address| it 'returns an Addrinfo instance' do - Addrinfo.tcp(ip_address, 80).should be_an_instance_of(Addrinfo) + Addrinfo.tcp(ip_address, 80).should.instance_of?(Addrinfo) end it 'sets the IP address' do diff --git a/spec/ruby/library/socket/addrinfo/udp_spec.rb b/spec/ruby/library/socket/addrinfo/udp_spec.rb index b05cbf9b0b..51d7f5588e 100644 --- a/spec/ruby/library/socket/addrinfo/udp_spec.rb +++ b/spec/ruby/library/socket/addrinfo/udp_spec.rb @@ -4,7 +4,7 @@ require_relative '../fixtures/classes' describe 'Addrinfo.udp' do SocketSpecs.each_ip_protocol do |family, ip_address| it 'returns an Addrinfo instance' do - Addrinfo.udp(ip_address, 80).should be_an_instance_of(Addrinfo) + Addrinfo.udp(ip_address, 80).should.instance_of?(Addrinfo) end it 'sets the IP address' do @@ -27,10 +27,8 @@ describe 'Addrinfo.udp' do Addrinfo.udp(ip_address, 80).socktype.should == Socket::SOCK_DGRAM end - platform_is_not :solaris do - it 'sets the socket protocol' do - Addrinfo.udp(ip_address, 80).protocol.should == Socket::IPPROTO_UDP - end + it 'sets the socket protocol' do + Addrinfo.udp(ip_address, 80).protocol.should == Socket::IPPROTO_UDP end end end diff --git a/spec/ruby/library/socket/addrinfo/unix_path_spec.rb b/spec/ruby/library/socket/addrinfo/unix_path_spec.rb index 0f25881724..c15075bce3 100644 --- a/spec/ruby/library/socket/addrinfo/unix_path_spec.rb +++ b/spec/ruby/library/socket/addrinfo/unix_path_spec.rb @@ -1,37 +1,35 @@ require_relative '../spec_helper' -with_feature :unix_socket do - describe "Addrinfo#unix_path" do - describe "for an ipv4 socket" do +describe "Addrinfo#unix_path" do + describe "for an ipv4 socket" do - before :each do - @addrinfo = Addrinfo.tcp("127.0.0.1", 80) - end - - it "raises an exception" do - lambda { @addrinfo.unix_path }.should raise_error(SocketError) - end + before :each do + @addrinfo = Addrinfo.tcp("127.0.0.1", 80) + end + it "raises an exception" do + -> { @addrinfo.unix_path }.should.raise(SocketError) end - describe "for an ipv6 socket" do - before :each do - @addrinfo = Addrinfo.tcp("::1", 80) - end + end - it "raises an exception" do - lambda { @addrinfo.unix_path }.should raise_error(SocketError) - end + describe "for an ipv6 socket" do + before :each do + @addrinfo = Addrinfo.tcp("::1", 80) end - describe "for a unix socket" do - before :each do - @addrinfo = Addrinfo.unix("/tmp/sock") - end + it "raises an exception" do + -> { @addrinfo.unix_path }.should.raise(SocketError) + end + end + + describe "for a unix socket" do + before :each do + @addrinfo = Addrinfo.unix("/tmp/sock") + end - it "returns the socket path" do - @addrinfo.unix_path.should == "/tmp/sock" - end + it "returns the socket path" do + @addrinfo.unix_path.should == "/tmp/sock" end end end diff --git a/spec/ruby/library/socket/addrinfo/unix_spec.rb b/spec/ruby/library/socket/addrinfo/unix_spec.rb index 4596ece17e..da65e13efb 100644 --- a/spec/ruby/library/socket/addrinfo/unix_spec.rb +++ b/spec/ruby/library/socket/addrinfo/unix_spec.rb @@ -1,36 +1,34 @@ require_relative '../spec_helper' -with_feature :unix_socket do - describe 'Addrinfo.unix' do - it 'returns an Addrinfo instance' do - Addrinfo.unix('socket').should be_an_instance_of(Addrinfo) - end +describe 'Addrinfo.unix' do + it 'returns an Addrinfo instance' do + Addrinfo.unix('socket').should.instance_of?(Addrinfo) + end - it 'sets the IP address' do - Addrinfo.unix('socket').unix_path.should == 'socket' - end + it 'sets the IP address' do + Addrinfo.unix('socket').unix_path.should == 'socket' + end - it 'sets the address family' do - Addrinfo.unix('socket').afamily.should == Socket::AF_UNIX - end + it 'sets the address family' do + Addrinfo.unix('socket').afamily.should == Socket::AF_UNIX + end - it 'sets the protocol family' do - Addrinfo.unix('socket').pfamily.should == Socket::PF_UNIX - end + it 'sets the protocol family' do + Addrinfo.unix('socket').pfamily.should == Socket::PF_UNIX + end - it 'sets the socket type' do - Addrinfo.unix('socket').socktype.should == Socket::SOCK_STREAM - end + it 'sets the socket type' do + Addrinfo.unix('socket').socktype.should == Socket::SOCK_STREAM + end - it 'sets a custom socket type' do - addr = Addrinfo.unix('socket', Socket::SOCK_DGRAM) + it 'sets a custom socket type' do + addr = Addrinfo.unix('socket', Socket::SOCK_DGRAM) - addr.socktype.should == Socket::SOCK_DGRAM - end + addr.socktype.should == Socket::SOCK_DGRAM + end - it 'sets the socket protocol to 0' do - Addrinfo.unix('socket').protocol.should == 0 - end + it 'sets the socket protocol to 0' do + Addrinfo.unix('socket').protocol.should == 0 end end @@ -42,7 +40,7 @@ describe "Addrinfo#unix?" do end it "returns false" do - @addrinfo.unix?.should be_false + @addrinfo.unix?.should == false end end @@ -53,7 +51,7 @@ describe "Addrinfo#unix?" do end it "returns false" do - @addrinfo.unix?.should be_false + @addrinfo.unix?.should == false end end @@ -64,7 +62,7 @@ describe "Addrinfo#unix?" do end it "returns true" do - @addrinfo.unix?.should be_true + @addrinfo.unix?.should == true end end end diff --git a/spec/ruby/library/socket/ancillarydata/cmsg_is_spec.rb b/spec/ruby/library/socket/ancillarydata/cmsg_is_spec.rb index bf93cd977e..c77f3bdbae 100644 --- a/spec/ruby/library/socket/ancillarydata/cmsg_is_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/cmsg_is_spec.rb @@ -25,8 +25,8 @@ with_feature :ancillary_data do @data.cmsg_is?(:SOCKET, :RIGHTS).should == false end - it 'raises SocketError when comparign with :IPV6 and :RIGHTS' do - lambda { @data.cmsg_is?(:IPV6, :RIGHTS) }.should raise_error(SocketError) + it 'raises SocketError when comparing with :IPV6 and :RIGHTS' do + -> { @data.cmsg_is?(:IPV6, :RIGHTS) }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/ancillarydata/initialize_spec.rb b/spec/ruby/library/socket/ancillarydata/initialize_spec.rb index d4788d0f68..60f5ac7a90 100644 --- a/spec/ruby/library/socket/ancillarydata/initialize_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/initialize_spec.rb @@ -106,34 +106,34 @@ with_feature :ancillary_data do Socket::AncillaryData.new(:INET, :SOCKET, :RIGHTS, '').type.should == Socket::SCM_RIGHTS end - platform_is_not :"solaris2.10", :aix do + platform_is_not :aix do it 'sets the type to SCM_TIMESTAMP when using :TIMESTAMP as the type argument' do Socket::AncillaryData.new(:INET, :SOCKET, :TIMESTAMP, '').type.should == Socket::SCM_TIMESTAMP end end it 'raises TypeError when using a numeric string as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :IGMP, Socket::SCM_RIGHTS.to_s, '') - }.should raise_error(TypeError) + }.should.raise(TypeError) end it 'raises SocketError when using :RECVTTL as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :SOCKET, :RECVTTL, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :MOO as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :SOCKET, :MOO, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :IP_RECVTTL as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :SOCKET, :IP_RECVTTL, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -155,15 +155,15 @@ with_feature :ancillary_data do end it 'raises SocketError when using :RIGHTS as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :IP, :RIGHTS, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :MOO as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :IP, :MOO, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -179,15 +179,15 @@ with_feature :ancillary_data do end it 'raises SocketError when using :RIGHTS as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :IPV6, :RIGHTS, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :MOO as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :IPV6, :MOO, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -205,15 +205,15 @@ with_feature :ancillary_data do end it 'raises SocketError when using :RIGHTS as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :TCP, :RIGHTS, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :MOO as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :TCP, :MOO, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -225,15 +225,15 @@ with_feature :ancillary_data do end it 'raises SocketError when using :RIGHTS as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :UDP, :RIGHTS, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises SocketError when using :MOO as the type argument' do - lambda { + -> { Socket::AncillaryData.new(:INET, :UDP, :MOO, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -243,41 +243,41 @@ with_feature :ancillary_data do end it 'raises SocketError when using :CORK sa the type argument' do - lambda { + -> { Socket::AncillaryData.new(:UNIX, :SOCKET, :CORK, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end describe 'using :AF_UNIX as the family and :IP as the level' do it 'raises SocketError' do - lambda { + -> { Socket::AncillaryData.new(:UNIX, :IP, :RECVTTL, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end describe 'using :AF_UNIX as the family and :IPV6 as the level' do it 'raises SocketError' do - lambda { + -> { Socket::AncillaryData.new(:UNIX, :IPV6, :NEXTHOP, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end describe 'using :AF_UNIX as the family and :TCP as the level' do it 'raises SocketError' do - lambda { + -> { Socket::AncillaryData.new(:UNIX, :TCP, :CORK, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end describe 'using :AF_UNIX as the family and :UDP as the level' do it 'raises SocketError' do - lambda { + -> { Socket::AncillaryData.new(:UNIX, :UDP, :CORK, '') - }.should raise_error(SocketError) + }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/ancillarydata/int_spec.rb b/spec/ruby/library/socket/ancillarydata/int_spec.rb index 0d7c5e3652..10c5dea436 100644 --- a/spec/ruby/library/socket/ancillarydata/int_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/int_spec.rb @@ -7,7 +7,7 @@ with_feature :ancillary_data do end it 'returns a Socket::AncillaryData' do - @data.should be_an_instance_of(Socket::AncillaryData) + @data.should.instance_of?(Socket::AncillaryData) end it 'sets the family to AF_INET' do @@ -37,7 +37,7 @@ with_feature :ancillary_data do it 'raises when the data is not an Integer' do data = Socket::AncillaryData.new(:UNIX, :SOCKET, :RIGHTS, 'ugh') - lambda { data.int }.should raise_error(TypeError) + -> { data.int }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/ancillarydata/ip_pktinfo_spec.rb b/spec/ruby/library/socket/ancillarydata/ip_pktinfo_spec.rb index 809d087161..065bcf1f39 100644 --- a/spec/ruby/library/socket/ancillarydata/ip_pktinfo_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/ip_pktinfo_spec.rb @@ -8,7 +8,7 @@ with_feature :ancillary_data, :pktinfo do end it 'returns a Socket::AncillaryData' do - @data.should be_an_instance_of(Socket::AncillaryData) + @data.should.instance_of?(Socket::AncillaryData) end it 'sets the family to AF_INET' do @@ -32,7 +32,7 @@ with_feature :ancillary_data, :pktinfo do end it 'returns a Socket::AncillaryData' do - @data.should be_an_instance_of(Socket::AncillaryData) + @data.should.instance_of?(Socket::AncillaryData) end it 'sets the family to AF_INET' do @@ -58,7 +58,7 @@ with_feature :ancillary_data, :pktinfo do end it 'returns an Array' do - @data.ip_pktinfo.should be_an_instance_of(Array) + @data.ip_pktinfo.should.instance_of?(Array) end describe 'the returned Array' do @@ -67,15 +67,15 @@ with_feature :ancillary_data, :pktinfo do end it 'stores an Addrinfo at index 0' do - @info[0].should be_an_instance_of(Addrinfo) + @info[0].should.instance_of?(Addrinfo) end it 'stores the ifindex at index 1' do - @info[1].should be_kind_of(Integer) + @info[1].should.is_a?(Integer) end it 'stores an Addrinfo at index 2' do - @info[2].should be_an_instance_of(Addrinfo) + @info[2].should.instance_of?(Addrinfo) end end @@ -89,7 +89,7 @@ with_feature :ancillary_data, :pktinfo do end it 'is not the same object as the input Addrinfo' do - @addr.should_not == @source + @addr.should_not.equal? @source end end @@ -109,7 +109,7 @@ with_feature :ancillary_data, :pktinfo do end it 'is not the same object as the input Addrinfo' do - @addr.should_not == @dest + @addr.should_not.equal? @dest end end end diff --git a/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_addr_spec.rb b/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_addr_spec.rb index f70fe27d6a..7c630218d1 100644 --- a/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_addr_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_addr_spec.rb @@ -5,7 +5,7 @@ with_feature :ancillary_data, :ipv6_pktinfo do it 'returns an Addrinfo' do data = Socket::AncillaryData.ipv6_pktinfo(Addrinfo.ip('::1'), 4) - data.ipv6_pktinfo_addr.should be_an_instance_of(Addrinfo) + data.ipv6_pktinfo_addr.should.instance_of?(Addrinfo) end end end diff --git a/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_spec.rb b/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_spec.rb index dfaa5bf0f5..b5b779c36e 100644 --- a/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_spec.rb @@ -7,7 +7,7 @@ with_feature :ancillary_data, :ipv6_pktinfo do end it 'returns a Socket::AncillaryData' do - @data.should be_an_instance_of(Socket::AncillaryData) + @data.should.instance_of?(Socket::AncillaryData) end it 'sets the family to AF_INET' do @@ -31,7 +31,7 @@ with_feature :ancillary_data, :ipv6_pktinfo do end it 'returns an Array' do - @data.ipv6_pktinfo.should be_an_instance_of(Array) + @data.ipv6_pktinfo.should.instance_of?(Array) end describe 'the returned Array' do @@ -40,11 +40,11 @@ with_feature :ancillary_data, :ipv6_pktinfo do end it 'stores an Addrinfo at index 0' do - @info[0].should be_an_instance_of(Addrinfo) + @info[0].should.instance_of?(Addrinfo) end it 'stores the ifindex at index 1' do - @info[1].should be_kind_of(Integer) + @info[1].should.is_a?(Integer) end end @@ -58,7 +58,7 @@ with_feature :ancillary_data, :ipv6_pktinfo do end it 'is not the same object as the input Addrinfo' do - @addr.should_not == @source + @addr.should_not.equal? @source end end diff --git a/spec/ruby/library/socket/ancillarydata/unix_rights_spec.rb b/spec/ruby/library/socket/ancillarydata/unix_rights_spec.rb index 34d954af81..6dd144ba5a 100644 --- a/spec/ruby/library/socket/ancillarydata/unix_rights_spec.rb +++ b/spec/ruby/library/socket/ancillarydata/unix_rights_spec.rb @@ -26,7 +26,7 @@ with_feature :ancillary_data do describe 'using non IO objects' do it 'raises TypeError' do - lambda { Socket::AncillaryData.unix_rights(10) }.should raise_error(TypeError) + -> { Socket::AncillaryData.unix_rights(10) }.should.raise(TypeError) end end end @@ -41,20 +41,20 @@ with_feature :ancillary_data do it 'returns nil when the data is not a list of file descriptors' do data = Socket::AncillaryData.new(:UNIX, :SOCKET, :RIGHTS, '') - data.unix_rights.should be_nil + data.unix_rights.should == nil end it 'raises TypeError when the level is not SOL_SOCKET' do data = Socket::AncillaryData.new(:INET, :IP, :RECVTTL, '') - lambda { data.unix_rights }.should raise_error(TypeError) + -> { data.unix_rights }.should.raise(TypeError) end - platform_is_not :"solaris2.10", :aix do + platform_is_not :aix do it 'raises TypeError when the type is not SCM_RIGHTS' do data = Socket::AncillaryData.new(:INET, :SOCKET, :TIMESTAMP, '') - lambda { data.unix_rights }.should raise_error(TypeError) + -> { data.unix_rights }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/basicsocket/close_read_spec.rb b/spec/ruby/library/socket/basicsocket/close_read_spec.rb index c989fcaf72..35bec203d7 100644 --- a/spec/ruby/library/socket/basicsocket/close_read_spec.rb +++ b/spec/ruby/library/socket/basicsocket/close_read_spec.rb @@ -12,32 +12,32 @@ describe "Socket::BasicSocket#close_read" do it "closes the reading end of the socket" do @server.close_read - lambda { @server.read }.should raise_error(IOError) + -> { @server.read }.should.raise(IOError) end it 'does not raise when called on a socket already closed for reading' do @server.close_read @server.close_read - lambda { @server.read }.should raise_error(IOError) + -> { @server.read }.should.raise(IOError) end it 'does not fully close the socket' do @server.close_read - @server.closed?.should be_false + @server.closed?.should == false end it "fully closes the socket if it was already closed for writing" do @server.close_write @server.close_read - @server.closed?.should be_true + @server.closed?.should == true end it 'raises IOError when called on a fully closed socket' do @server.close - lambda { @server.close_read }.should raise_error(IOError) + -> { @server.close_read }.should.raise(IOError) end it "returns nil" do - @server.close_read.should be_nil + @server.close_read.should == nil end end diff --git a/spec/ruby/library/socket/basicsocket/close_write_spec.rb b/spec/ruby/library/socket/basicsocket/close_write_spec.rb index f37e0e5074..c1b6d9e9ef 100644 --- a/spec/ruby/library/socket/basicsocket/close_write_spec.rb +++ b/spec/ruby/library/socket/basicsocket/close_write_spec.rb @@ -12,18 +12,18 @@ describe "Socket::BasicSocket#close_write" do it "closes the writing end of the socket" do @server.close_write - lambda { @server.write("foo") }.should raise_error(IOError) + -> { @server.write("foo") }.should.raise(IOError) end it 'does not raise when called on a socket already closed for writing' do @server.close_write @server.close_write - lambda { @server.write("foo") }.should raise_error(IOError) + -> { @server.write("foo") }.should.raise(IOError) end it 'does not fully close the socket' do @server.close_write - @server.closed?.should be_false + @server.closed?.should == false end it "does not prevent reading" do @@ -34,15 +34,15 @@ describe "Socket::BasicSocket#close_write" do it "fully closes the socket if it was already closed for reading" do @server.close_read @server.close_write - @server.closed?.should be_true + @server.closed?.should == true end it 'raises IOError when called on a fully closed socket' do @server.close - lambda { @server.close_write }.should raise_error(IOError) + -> { @server.close_write }.should.raise(IOError) end it "returns nil" do - @server.close_write.should be_nil + @server.close_write.should == nil end end diff --git a/spec/ruby/library/socket/basicsocket/connect_address_spec.rb b/spec/ruby/library/socket/basicsocket/connect_address_spec.rb index 18baac7f17..e330b6e1be 100644 --- a/spec/ruby/library/socket/basicsocket/connect_address_spec.rb +++ b/spec/ruby/library/socket/basicsocket/connect_address_spec.rb @@ -10,7 +10,7 @@ describe 'Socket#connect_address' do it 'raises SocketError' do @sock = Socket.new(:INET, :STREAM) - lambda { @sock.connect_address }.should raise_error(SocketError) + -> { @sock.connect_address }.should.raise(SocketError) end end @@ -25,7 +25,7 @@ describe 'Socket#connect_address' do end it 'returns an Addrinfo' do - @sock.connect_address.should be_an_instance_of(Addrinfo) + @sock.connect_address.should.instance_of?(Addrinfo) end it 'uses 127.0.0.1 as the IP address' do @@ -65,7 +65,7 @@ describe 'Socket#connect_address' do end it 'returns an Addrinfo' do - @sock.connect_address.should be_an_instance_of(Addrinfo) + @sock.connect_address.should.instance_of?(Addrinfo) end it 'uses ::1 as the IP address' do @@ -94,61 +94,59 @@ describe 'Socket#connect_address' do end end - with_feature :unix_socket do - platform_is_not :aix do - describe 'using an unbound UNIX socket' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - @client = UNIXSocket.new(@path) - end - - after do - @client.close - @server.close - rm_r(@path) - end - - it 'raises SocketError' do - lambda { @client.connect_address }.should raise_error(SocketError) - end - end - end - - describe 'using a bound UNIX socket' do + platform_is_not :aix do + describe 'using an unbound UNIX socket' do before do @path = SocketSpecs.socket_path - @sock = UNIXServer.new(@path) + @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) end after do - @sock.close + @client.close + @server.close rm_r(@path) end - it 'returns an Addrinfo' do - @sock.connect_address.should be_an_instance_of(Addrinfo) + it 'raises SocketError' do + -> { @client.connect_address }.should.raise(SocketError) end + end + end - it 'uses the correct socket path' do - @sock.connect_address.unix_path.should == @path - end + describe 'using a bound UNIX socket' do + before do + @path = SocketSpecs.socket_path + @sock = UNIXServer.new(@path) + end - it 'uses AF_UNIX as the address family' do - @sock.connect_address.afamily.should == Socket::AF_UNIX - end + after do + @sock.close + rm_r(@path) + end - it 'uses PF_UNIX as the protocol family' do - @sock.connect_address.pfamily.should == Socket::PF_UNIX - end + it 'returns an Addrinfo' do + @sock.connect_address.should.instance_of?(Addrinfo) + end - it 'uses SOCK_STREAM as the socket type' do - @sock.connect_address.socktype.should == Socket::SOCK_STREAM - end + it 'uses the correct socket path' do + @sock.connect_address.unix_path.should == @path + end - it 'uses 0 as the protocol' do - @sock.connect_address.protocol.should == 0 - end + it 'uses AF_UNIX as the address family' do + @sock.connect_address.afamily.should == Socket::AF_UNIX + end + + it 'uses PF_UNIX as the protocol family' do + @sock.connect_address.pfamily.should == Socket::PF_UNIX + end + + it 'uses SOCK_STREAM as the socket type' do + @sock.connect_address.socktype.should == Socket::SOCK_STREAM + end + + it 'uses 0 as the protocol' do + @sock.connect_address.protocol.should == 0 end end end diff --git a/spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb b/spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb index 85a66275f8..36338bfd59 100644 --- a/spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb +++ b/spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb @@ -16,7 +16,7 @@ describe "BasicSocket.do_not_reverse_lookup" do end it "defaults to true" do - BasicSocket.do_not_reverse_lookup.should be_true + BasicSocket.do_not_reverse_lookup.should == true end it "causes 'peeraddr' to avoid name lookups" do @@ -37,3 +37,67 @@ describe "BasicSocket.do_not_reverse_lookup" do @socket.peeraddr[2].should == "127.0.0.1" end end + +describe :socket_do_not_reverse_lookup, shared: true do + it "inherits from BasicSocket.do_not_reverse_lookup when the socket is created" do + @socket = @method.call + reverse = BasicSocket.do_not_reverse_lookup + @socket.do_not_reverse_lookup.should == reverse + + BasicSocket.do_not_reverse_lookup = !reverse + @socket.do_not_reverse_lookup.should == reverse + end + + it "is true when BasicSocket.do_not_reverse_lookup is true" do + BasicSocket.do_not_reverse_lookup = true + @socket = @method.call + @socket.do_not_reverse_lookup.should == true + end + + it "is false when BasicSocket.do_not_reverse_lookup is false" do + BasicSocket.do_not_reverse_lookup = false + @socket = @method.call + @socket.do_not_reverse_lookup.should == false + end + + it "can be changed with #do_not_reverse_lookup=" do + @socket = @method.call + reverse = @socket.do_not_reverse_lookup + @socket.do_not_reverse_lookup = !reverse + @socket.do_not_reverse_lookup.should == !reverse + end +end + +describe "BasicSocket#do_not_reverse_lookup" do + before :each do + @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + @socket.close if @socket && !@socket.closed? + BasicSocket.do_not_reverse_lookup = @do_not_reverse_lookup + end + + describe "for an TCPSocket.new socket" do + it_behaves_like :socket_do_not_reverse_lookup, -> { + TCPSocket.new('127.0.0.1', @port) + } + end + + describe "for an TCPServer#accept socket" do + before :each do + @client = TCPSocket.new('127.0.0.1', @port) + end + + after :each do + @client.close if @client && !@client.closed? + end + + it_behaves_like :socket_do_not_reverse_lookup, -> { + @server.accept + } + end +end diff --git a/spec/ruby/library/socket/basicsocket/for_fd_spec.rb b/spec/ruby/library/socket/basicsocket/for_fd_spec.rb index 9c9e6a8b55..8d5b71cfa9 100644 --- a/spec/ruby/library/socket/basicsocket/for_fd_spec.rb +++ b/spec/ruby/library/socket/basicsocket/for_fd_spec.rb @@ -15,7 +15,7 @@ describe "BasicSocket.for_fd" do it "return a Socket instance wrapped around the descriptor" do @s2 = TCPServer.for_fd(@server.fileno) @s2.autoclose = false - @s2.should be_kind_of(TCPServer) + @s2.should.is_a?(TCPServer) @s2.fileno.should == @server.fileno end @@ -24,7 +24,7 @@ describe "BasicSocket.for_fd" do socket2 = Socket.for_fd(@socket1.fileno) socket2.autoclose = false - socket2.should be_an_instance_of(Socket) + socket2.should.instance_of?(Socket) socket2.fileno.should == @socket1.fileno end @@ -33,6 +33,6 @@ describe "BasicSocket.for_fd" do socket2 = Socket.for_fd(@socket1.fileno) socket2.autoclose = false - socket2.binmode?.should be_true + socket2.binmode?.should == true end end diff --git a/spec/ruby/library/socket/basicsocket/getpeereid_spec.rb b/spec/ruby/library/socket/basicsocket/getpeereid_spec.rb index 9eeb6d0e0b..b9851bae15 100644 --- a/spec/ruby/library/socket/basicsocket/getpeereid_spec.rb +++ b/spec/ruby/library/socket/basicsocket/getpeereid_spec.rb @@ -2,7 +2,7 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe 'BasicSocket#getpeereid' do - with_feature :unix_socket do + platform_is_not :windows do describe 'using a UNIXSocket' do before do @path = SocketSpecs.socket_path @@ -30,7 +30,7 @@ describe 'BasicSocket#getpeereid' do it 'raises NoMethodError' do @sock = TCPServer.new('127.0.0.1', 0) - lambda { @sock.getpeereid }.should raise_error(NoMethodError) + -> { @sock.getpeereid }.should.raise(NoMethodError) end end end diff --git a/spec/ruby/library/socket/basicsocket/getpeername_spec.rb b/spec/ruby/library/socket/basicsocket/getpeername_spec.rb index 23c73056cd..7e2f6f2e7b 100644 --- a/spec/ruby/library/socket/basicsocket/getpeername_spec.rb +++ b/spec/ruby/library/socket/basicsocket/getpeername_spec.rb @@ -20,6 +20,6 @@ describe "Socket::BasicSocket#getpeername" do end it 'raises Errno::ENOTCONN for a disconnected socket' do - lambda { @server.getpeername }.should raise_error(Errno::ENOTCONN) + -> { @server.getpeername }.should.raise(Errno::ENOTCONN) end end diff --git a/spec/ruby/library/socket/basicsocket/getsockname_spec.rb b/spec/ruby/library/socket/basicsocket/getsockname_spec.rb index a2c5980a9e..a54626647e 100644 --- a/spec/ruby/library/socket/basicsocket/getsockname_spec.rb +++ b/spec/ruby/library/socket/basicsocket/getsockname_spec.rb @@ -3,11 +3,11 @@ require_relative '../fixtures/classes' describe "Socket::BasicSocket#getsockname" do after :each do - @socket.closed?.should be_false + @socket.closed?.should == false @socket.close end - it "returns the sockaddr associacted with the socket" do + it "returns the sockaddr associated with the socket" do @socket = TCPServer.new("127.0.0.1", 0) sockaddr = Socket.unpack_sockaddr_in(@socket.getsockname) sockaddr.should == [@socket.addr[1], "127.0.0.1"] @@ -16,7 +16,7 @@ describe "Socket::BasicSocket#getsockname" do it "works on sockets listening in ipaddr_any" do @socket = TCPServer.new(0) sockaddr = Socket.unpack_sockaddr_in(@socket.getsockname) - ["::", "0.0.0.0", "::ffff:0.0.0.0"].include?(sockaddr[1]).should be_true + ["::", "0.0.0.0", "::ffff:0.0.0.0"].include?(sockaddr[1]).should == true sockaddr[0].should == @socket.addr[1] end diff --git a/spec/ruby/library/socket/basicsocket/getsockopt_spec.rb b/spec/ruby/library/socket/basicsocket/getsockopt_spec.rb index aad21ca535..744297ad02 100644 --- a/spec/ruby/library/socket/basicsocket/getsockopt_spec.rb +++ b/spec/ruby/library/socket/basicsocket/getsockopt_spec.rb @@ -7,7 +7,7 @@ describe "BasicSocket#getsockopt" do end after :each do - @sock.closed?.should be_false + @sock.closed?.should == false @sock.close end @@ -41,13 +41,13 @@ describe "BasicSocket#getsockopt" do end it "raises a SystemCallError with an invalid socket option" do - lambda { @sock.getsockopt Socket::SOL_SOCKET, -1 }.should raise_error(Errno::ENOPROTOOPT) + -> { @sock.getsockopt Socket::SOL_SOCKET, -1 }.should.raise(Errno::ENOPROTOOPT) end it 'returns a Socket::Option using a constant' do opt = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE) - opt.should be_an_instance_of(Socket::Option) + opt.should.instance_of?(Socket::Option) end it 'returns a Socket::Option for a boolean option' do @@ -59,7 +59,7 @@ describe "BasicSocket#getsockopt" do it 'returns a Socket::Option for a numeric option' do opt = @sock.getsockopt(Socket::IPPROTO_IP, Socket::IP_TTL) - opt.int.should be_kind_of(Integer) + opt.int.should.is_a?(Integer) end it 'returns a Socket::Option for a struct option' do @@ -69,7 +69,7 @@ describe "BasicSocket#getsockopt" do end it 'raises Errno::ENOPROTOOPT when requesting an invalid option' do - lambda { @sock.getsockopt(Socket::SOL_SOCKET, -1) }.should raise_error(Errno::ENOPROTOOPT) + -> { @sock.getsockopt(Socket::SOL_SOCKET, -1) }.should.raise(Errno::ENOPROTOOPT) end describe 'using Symbols as arguments' do @@ -171,7 +171,7 @@ describe "BasicSocket#getsockopt" do opt = @sock.getsockopt(Socket::IPPROTO_IP, Socket::IP_TTL).to_s array = opt.unpack('i') - array[0].should be_kind_of(Integer) + array[0].should.is_a?(Integer) array[0].should > 0 end diff --git a/spec/ruby/library/socket/basicsocket/local_address_spec.rb b/spec/ruby/library/socket/basicsocket/local_address_spec.rb new file mode 100644 index 0000000000..0bd60a44cd --- /dev/null +++ b/spec/ruby/library/socket/basicsocket/local_address_spec.rb @@ -0,0 +1,10 @@ +require_relative '../spec_helper' +require_relative '../shared/address' + +describe 'BasicSocket#local_address' do + it_behaves_like :socket_local_remote_address, :local_address, -> socket { + a2 = BasicSocket.for_fd(socket.fileno) + a2.autoclose = false + a2.local_address + } +end diff --git a/spec/ruby/library/socket/basicsocket/read_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/read_nonblock_spec.rb new file mode 100644 index 0000000000..ea5e65da5c --- /dev/null +++ b/spec/ruby/library/socket/basicsocket/read_nonblock_spec.rb @@ -0,0 +1,74 @@ +require_relative '../spec_helper' +require_relative '../fixtures/classes' + +describe "BasicSocket#read_nonblock" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @r = Socket.new(family, :DGRAM) + @w = Socket.new(family, :DGRAM) + + @r.bind(Socket.pack_sockaddr_in(0, ip_address)) + @w.send("aaa", 0, @r.getsockname) + end + + after :each do + @r.close unless @r.closed? + @w.close unless @w.closed? + end + + it "receives data after it's ready" do + IO.select([@r], nil, nil, 2) + @r.read_nonblock(5).should == "aaa" + end + + platform_is_not :windows do + it 'returned data is binary encoded regardless of the external encoding' do + IO.select([@r], nil, nil, 2) + @r.read_nonblock(1).encoding.should == Encoding::BINARY + + @w.send("bbb", 0, @r.getsockname) + @r.set_encoding(Encoding::ISO_8859_1) + IO.select([@r], nil, nil, 2) + buffer = @r.read_nonblock(3) + buffer.should == "bbb" + buffer.encoding.should == Encoding::BINARY + end + end + + it 'replaces the content of the provided buffer without changing its encoding' do + buffer = "initial data".dup.force_encoding(Encoding::UTF_8) + + IO.select([@r], nil, nil, 2) + @r.read_nonblock(3, buffer) + buffer.should == "aaa" + buffer.encoding.should == Encoding::UTF_8 + + @w.send("bbb", 0, @r.getsockname) + @r.set_encoding(Encoding::ISO_8859_1) + IO.select([@r], nil, nil, 2) + @r.read_nonblock(3, buffer) + buffer.should == "bbb" + buffer.encoding.should == Encoding::UTF_8 + end + + platform_is :linux do + it 'does not set the IO in nonblock mode' do + require 'io/nonblock' + @r.nonblock = false + IO.select([@r], nil, nil, 2) + @r.read_nonblock(3).should == "aaa" + @r.should_not.nonblock? + end + end + + platform_is_not :linux, :windows do + it 'sets the IO in nonblock mode' do + require 'io/nonblock' + @r.nonblock = false + IO.select([@r], nil, nil, 2) + @r.read_nonblock(3).should == "aaa" + @r.should.nonblock? + end + end + end +end diff --git a/spec/ruby/library/socket/basicsocket/read_spec.rb b/spec/ruby/library/socket/basicsocket/read_spec.rb new file mode 100644 index 0000000000..ba9de7d5cf --- /dev/null +++ b/spec/ruby/library/socket/basicsocket/read_spec.rb @@ -0,0 +1,47 @@ +require_relative '../spec_helper' +require_relative '../fixtures/classes' + +describe "BasicSocket#read" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @r = Socket.new(family, :DGRAM) + @w = Socket.new(family, :DGRAM) + + @r.bind(Socket.pack_sockaddr_in(0, ip_address)) + @w.send("aaa", 0, @r.getsockname) + end + + after :each do + @r.close unless @r.closed? + @w.close unless @w.closed? + end + + it "receives data after it's ready" do + @r.read(3).should == "aaa" + end + + it 'returned data is binary encoded regardless of the external encoding' do + @r.read(3).encoding.should == Encoding::BINARY + + @w.send("bbb", 0, @r.getsockname) + @r.set_encoding(Encoding::UTF_8) + buffer = @r.read(3) + buffer.should == "bbb" + buffer.encoding.should == Encoding::BINARY + end + + it 'replaces the content of the provided buffer without changing its encoding' do + buffer = "initial data".dup.force_encoding(Encoding::UTF_8) + + @r.read(3, buffer) + buffer.should == "aaa" + buffer.encoding.should == Encoding::UTF_8 + + @w.send("bbb", 0, @r.getsockname) + @r.set_encoding(Encoding::ISO_8859_1) + @r.read(3, buffer) + buffer.should == "bbb" + buffer.encoding.should == Encoding::UTF_8 + end + end +end diff --git a/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb index 1b6027d26c..8aca7d0332 100644 --- a/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb +++ b/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb @@ -16,25 +16,30 @@ describe "Socket::BasicSocket#recv_nonblock" do platform_is_not :windows do describe 'using an unbound socket' do it 'raises an exception extending IO::WaitReadable' do - lambda { @s1.recv_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @s1.recv_nonblock(1) }.should.raise(IO::WaitReadable) end end end it "raises an exception extending IO::WaitReadable if there's no data available" do @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) - lambda { + -> { @s1.recv_nonblock(5) - }.should raise_error(IO::WaitReadable) { |e| + }.should.raise(IO::WaitReadable) { |e| platform_is_not :windows do - e.should be_kind_of(Errno::EAGAIN) + e.should.is_a?(Errno::EAGAIN) end platform_is :windows do - e.should be_kind_of(Errno::EWOULDBLOCK) + e.should.is_a?(Errno::EWOULDBLOCK) end } end + it "returns :wait_readable with exception: false" do + @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) + @s1.recv_nonblock(5, exception: false).should == :wait_readable + end + it "receives data after it's ready" do @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) @s2.send("aaa", 0, @s1.getsockname) @@ -47,9 +52,19 @@ describe "Socket::BasicSocket#recv_nonblock" do @s2.send("data", 0, @s1.getsockname) IO.select([@s1], nil, nil, 2) - buf = "foo" - @s1.recv_nonblock(5, 0, buf) - buf.should == "data" + buffer = +"foo" + @s1.recv_nonblock(5, 0, buffer).should.equal?(buffer) + buffer.should == "data" + end + + it "preserves the encoding of the given buffer" do + @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) + @s2.send("data", 0, @s1.getsockname) + IO.select([@s1], nil, nil, 2) + + buffer = ''.encode(Encoding::ISO_8859_1) + @s1.recv_nonblock(5, 0, buffer) + buffer.encoding.should == Encoding::ISO_8859_1 end it "does not block if there's no data available" do @@ -57,9 +72,71 @@ describe "Socket::BasicSocket#recv_nonblock" do @s2.send("a", 0, @s1.getsockname) IO.select([@s1], nil, nil, 2) @s1.recv_nonblock(1).should == "a" - lambda { + -> { @s1.recv_nonblock(5) - }.should raise_error(IO::WaitReadable) + }.should.raise(IO::WaitReadable) + end + end + + SocketSpecs.each_ip_protocol do |family, ip_address| + describe 'using a connected but not bound socket' do + before do + @server = Socket.new(family, :STREAM) + end + + after do + @server.close + end + + it "raises Errno::ENOTCONN" do + -> { @server.recv_nonblock(1) }.should.raise { |e| + [Errno::ENOTCONN, Errno::EINVAL].should.include?(e.class) + } + -> { @server.recv_nonblock(1, exception: false) }.should.raise { |e| + [Errno::ENOTCONN, Errno::EINVAL].should.include?(e.class) + } + end + end + end +end + +describe "Socket::BasicSocket#recv_nonblock" do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + end + + it "returns nil on a closed stream socket" do + ready = false + + t = Thread.new do + client = @server.accept + + Thread.pass while !ready + begin + client.recv_nonblock(10) + rescue IO::EAGAINWaitReadable + retry + end + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.close + ready = true + + t.value.should == nil + end end end end diff --git a/spec/ruby/library/socket/basicsocket/recv_spec.rb b/spec/ruby/library/socket/basicsocket/recv_spec.rb index a277dc2d97..5c393218bc 100644 --- a/spec/ruby/library/socket/basicsocket/recv_spec.rb +++ b/spec/ruby/library/socket/basicsocket/recv_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require_relative '../spec_helper' require_relative '../fixtures/classes' @@ -22,7 +22,7 @@ describe "BasicSocket#recv" do client.close end Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil + t.status.should_not == nil socket = TCPSocket.new('127.0.0.1', @port) socket.send('hello', 0) @@ -32,28 +32,26 @@ describe "BasicSocket#recv" do ScratchPad.recorded.should == 'hello' end - platform_is_not :solaris do - it "accepts flags to specify unusual receiving behaviour" do - t = Thread.new do - client = @server.accept + it "accepts flags to specify unusual receiving behaviour" do + t = Thread.new do + client = @server.accept - # in-band data (TCP), doesn't receive the flag. - ScratchPad.record client.recv(10) + # in-band data (TCP), doesn't receive the flag. + ScratchPad.record client.recv(10) - # this recv is important (TODO: explain) - client.recv(10) - client.close - end - Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil - - socket = TCPSocket.new('127.0.0.1', @port) - socket.send('helloU', Socket::MSG_OOB) - socket.shutdown(1) - t.join - socket.close - ScratchPad.recorded.should == 'hello' + # this recv is important (TODO: explain) + client.recv(10) + client.close end + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.send('helloU', Socket::MSG_OOB) + socket.shutdown(1) + t.join + socket.close + ScratchPad.recorded.should == 'hello' end it "gets lines delimited with a custom separator" do @@ -66,7 +64,7 @@ describe "BasicSocket#recv" do client.close end Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil + t.status.should_not == nil socket = TCPSocket.new('127.0.0.1', @port) socket.write("firstline\377secondline\377") @@ -81,13 +79,29 @@ describe "BasicSocket#recv" do socket.write("data") client = @server.accept - buf = "foo" + buffer = +"foo" + begin + client.recv(4, 0, buffer).should.equal?(buffer) + ensure + client.close + end + buffer.should == "data" + + socket.close + end + + it "preserves the encoding of the given buffer" do + socket = TCPSocket.new('127.0.0.1', @port) + socket.write("data") + + client = @server.accept + buffer = ''.encode(Encoding::ISO_8859_1) begin - client.recv(4, 0, buf) + client.recv(4, 0, buffer) ensure client.close end - buf.should == "data" + buffer.encoding.should == Encoding::ISO_8859_1 socket.close end @@ -107,7 +121,7 @@ describe 'BasicSocket#recv' do describe 'using an unbound socket' do it 'blocks the caller' do - lambda { @server.recv(4) }.should block_caller + -> { @server.recv(4) }.should block_caller end end @@ -118,7 +132,7 @@ describe 'BasicSocket#recv' do describe 'without any data available' do it 'blocks the caller' do - lambda { @server.recv(4) }.should block_caller + -> { @server.recv(4) }.should block_caller end end @@ -144,7 +158,7 @@ describe 'BasicSocket#recv' do @server.recv(2).should == 'he' - lambda { @server.recv(4) }.should block_caller + -> { @server.recv(4) }.should block_caller end it 'takes a peek at the data when using the MSG_PEEK flag' do @@ -157,3 +171,59 @@ describe 'BasicSocket#recv' do end end end + +describe "BasicSocket#recv" do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + end + + it "returns nil on a closed stream socket" do + t = Thread.new do + client = @server.accept + client.recv(10) + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.close + + t.value.should == nil + end + end + + describe "datagram socket" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @server = UDPSocket.new(family) + @client = UDPSocket.new(family) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns empty String" do + @server.bind(ip_address, 0) + addr = @server.connect_address + @client.connect(addr.ip_address, addr.ip_port) + + @client.send('', 0) + + @server.recv(1).should == "" + end + end + end + end +end diff --git a/spec/ruby/library/socket/basicsocket/recvmsg_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/recvmsg_nonblock_spec.rb index 8f6b75029c..9d77f5df6b 100644 --- a/spec/ruby/library/socket/basicsocket/recvmsg_nonblock_spec.rb +++ b/spec/ruby/library/socket/basicsocket/recvmsg_nonblock_spec.rb @@ -17,7 +17,7 @@ describe 'BasicSocket#recvmsg_nonblock' do platform_is_not :windows do describe 'using an unbound socket' do it 'raises an exception extending IO::WaitReadable' do - lambda { @server.recvmsg_nonblock }.should raise_error(IO::WaitReadable) + -> { @server.recvmsg_nonblock }.should.raise(IO::WaitReadable) end end end @@ -29,7 +29,11 @@ describe 'BasicSocket#recvmsg_nonblock' do describe 'without any data available' do it 'raises an exception extending IO::WaitReadable' do - lambda { @server.recvmsg_nonblock }.should raise_error(IO::WaitReadable) + -> { @server.recvmsg_nonblock }.should.raise(IO::WaitReadable) + end + + it 'returns :wait_readable with exception: false' do + @server.recvmsg_nonblock(exception: false).should == :wait_readable end end @@ -43,7 +47,7 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'returns an Array containing the data, an Addrinfo and the flags' do - @server.recvmsg_nonblock.should be_an_instance_of(Array) + @server.recvmsg_nonblock.should.instance_of?(Array) end describe 'without a maximum message length' do @@ -70,12 +74,12 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'stores an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end platform_is_not :windows do it 'stores the flags at index 2' do - @array[2].should be_kind_of(Integer) + @array[2].should.is_a?(Integer) end end @@ -110,6 +114,21 @@ describe 'BasicSocket#recvmsg_nonblock' do end platform_is_not :windows do + describe 'using a connected but not bound socket' do + before do + @server = Socket.new(family, :STREAM) + end + + after do + @server.close + end + + it "raises Errno::ENOTCONN" do + -> { @server.recvmsg_nonblock }.should.raise(Errno::ENOTCONN) + -> { @server.recvmsg_nonblock(exception: false) }.should.raise(Errno::ENOTCONN) + end + end + describe 'using a connected socket' do before do @client = Socket.new(family, :STREAM) @@ -128,14 +147,14 @@ describe 'BasicSocket#recvmsg_nonblock' do describe 'without any data available' do it 'raises IO::WaitReadable' do - lambda { + -> { socket, _ = @server.accept begin socket.recvmsg_nonblock ensure socket.close end - }.should raise_error(IO::WaitReadable) + }.should.raise(IO::WaitReadable) end end @@ -152,7 +171,7 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'returns an Array containing the data, an Addrinfo and the flags' do - @socket.recvmsg_nonblock.should be_an_instance_of(Array) + @socket.recvmsg_nonblock.should.instance_of?(Array) end describe 'the returned Array' do @@ -165,11 +184,11 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'stores an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end it 'stores the flags at index 2' do - @array[2].should be_kind_of(Integer) + @array[2].should.is_a?(Integer) end describe 'the returned Addrinfo' do @@ -178,7 +197,7 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'raises when receiving the ip_address message' do - lambda { @addr.ip_address }.should raise_error(SocketError) + -> { @addr.ip_address }.should.raise(SocketError) end it 'uses the correct address family' do @@ -194,7 +213,7 @@ describe 'BasicSocket#recvmsg_nonblock' do end it 'raises when receiving the ip_port message' do - lambda { @addr.ip_port }.should raise_error(SocketError) + -> { @addr.ip_port }.should.raise(SocketError) end end end @@ -203,3 +222,46 @@ describe 'BasicSocket#recvmsg_nonblock' do end end end + +describe 'BasicSocket#recvmsg_nonblock' do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + end + + platform_is_not :windows do + it "returns nil on a closed stream socket" do + ready = false + + t = Thread.new do + client = @server.accept + + Thread.pass while !ready + begin + client.recvmsg_nonblock(10) + rescue IO::EAGAINWaitReadable + retry + end + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.close + ready = true + + t.value.should == nil + end + end + end + end +end diff --git a/spec/ruby/library/socket/basicsocket/recvmsg_spec.rb b/spec/ruby/library/socket/basicsocket/recvmsg_spec.rb index 58eb8d0360..eabfb9dd18 100644 --- a/spec/ruby/library/socket/basicsocket/recvmsg_spec.rb +++ b/spec/ruby/library/socket/basicsocket/recvmsg_spec.rb @@ -17,7 +17,7 @@ describe 'BasicSocket#recvmsg' do platform_is_not :windows do describe 'using an unbound socket' do it 'blocks the caller' do - lambda { @server.recvmsg }.should block_caller + -> { @server.recvmsg }.should block_caller end end end @@ -29,7 +29,7 @@ describe 'BasicSocket#recvmsg' do describe 'without any data available' do it 'blocks the caller' do - lambda { @server.recvmsg }.should block_caller + -> { @server.recvmsg }.should block_caller end end @@ -41,7 +41,7 @@ describe 'BasicSocket#recvmsg' do end it 'returns an Array containing the data, an Addrinfo and the flags' do - @server.recvmsg.should be_an_instance_of(Array) + @server.recvmsg.should.instance_of?(Array) end describe 'without a maximum message length' do @@ -66,12 +66,12 @@ describe 'BasicSocket#recvmsg' do end it 'stores an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end platform_is_not :windows do it 'stores the flags at index 2' do - @array[2].should be_kind_of(Integer) + @array[2].should.is_a?(Integer) end end @@ -126,7 +126,7 @@ describe 'BasicSocket#recvmsg' do it 'blocks the caller' do socket, _ = @server.accept begin - lambda { socket.recvmsg }.should block_caller + -> { socket.recvmsg }.should block_caller ensure socket.close end @@ -144,7 +144,7 @@ describe 'BasicSocket#recvmsg' do end it 'returns an Array containing the data, an Addrinfo and the flags' do - @socket.recvmsg.should be_an_instance_of(Array) + @socket.recvmsg.should.instance_of?(Array) end describe 'the returned Array' do @@ -157,11 +157,11 @@ describe 'BasicSocket#recvmsg' do end it 'stores an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end it 'stores the flags at index 2' do - @array[2].should be_kind_of(Integer) + @array[2].should.is_a?(Integer) end describe 'the returned Addrinfo' do @@ -170,7 +170,7 @@ describe 'BasicSocket#recvmsg' do end it 'raises when receiving the ip_address message' do - lambda { @addr.ip_address }.should raise_error(SocketError) + -> { @addr.ip_address }.should.raise(SocketError) end it 'uses the correct address family' do @@ -186,7 +186,7 @@ describe 'BasicSocket#recvmsg' do end it 'raises when receiving the ip_port message' do - lambda { @addr.ip_port }.should raise_error(SocketError) + -> { @addr.ip_port }.should.raise(SocketError) end end end @@ -195,3 +195,63 @@ describe 'BasicSocket#recvmsg' do end end end + +describe 'BasicSocket#recvmsg' do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + end + + platform_is_not :windows do + it "returns nil on a closed stream socket" do + t = Thread.new do + client = @server.accept + client.recvmsg(10) + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.close + + t.value.should == nil + end + end + end + + describe "datagram socket" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @server = UDPSocket.new(family) + @client = UDPSocket.new(family) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns an empty String as received data" do + @server.bind(ip_address, 0) + addr = @server.connect_address + @client.connect(addr.ip_address, addr.ip_port) + + @client.send('', 0) + message = @server.recvmsg(1) + + message.should.is_a? Array + message[0].should == "" + end + end + end + end +end diff --git a/spec/ruby/library/socket/basicsocket/remote_address_spec.rb b/spec/ruby/library/socket/basicsocket/remote_address_spec.rb new file mode 100644 index 0000000000..439bf31592 --- /dev/null +++ b/spec/ruby/library/socket/basicsocket/remote_address_spec.rb @@ -0,0 +1,10 @@ +require_relative '../spec_helper' +require_relative '../shared/address' + +describe 'BasicSocket#remote_address' do + it_behaves_like :socket_local_remote_address, :remote_address, -> socket { + a2 = BasicSocket.for_fd(socket.fileno) + a2.autoclose = false + a2.remote_address + } +end diff --git a/spec/ruby/library/socket/basicsocket/send_spec.rb b/spec/ruby/library/socket/basicsocket/send_spec.rb index c4845fc09e..a2c2ee8de9 100644 --- a/spec/ruby/library/socket/basicsocket/send_spec.rb +++ b/spec/ruby/library/socket/basicsocket/send_spec.rb @@ -9,36 +9,36 @@ describe "BasicSocket#send" do end after :each do - @server.closed?.should be_false - @socket.closed?.should be_false + @server.closed?.should == false + @socket.closed?.should == false @server.close @socket.close end - it "sends a message to another socket and returns the number of bytes sent" do - data = "" - t = Thread.new do - client = @server.accept - loop do - got = client.recv(5) - break if got.empty? - data << got - end - client.close - end - Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil - - @socket.send('hello', 0).should == 5 - @socket.shutdown(1) # indicate, that we are done sending - @socket.recv(10) - - t.join - data.should == 'hello' - end - - platform_is_not :solaris, :windows do + it "sends a message to another socket and returns the number of bytes sent" do + data = +"" + t = Thread.new do + client = @server.accept + loop do + got = client.recv(5) + break if got.nil? || got.empty? + data << got + end + client.close + end + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + @socket.send('hello', 0).should == 5 + @socket.shutdown(1) # indicate, that we are done sending + @socket.recv(10) + + t.join + data.should == 'hello' + end + + platform_is_not :windows do it "accepts flags to specify unusual sending behaviour" do data = nil peek_data = nil @@ -50,7 +50,7 @@ describe "BasicSocket#send" do client.close end Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil + t.status.should_not == nil @socket.send('helloU', Socket::MSG_PEEK | Socket::MSG_OOB).should == 6 @socket.shutdown # indicate, that we are done sending @@ -62,25 +62,25 @@ describe "BasicSocket#send" do end it "accepts a sockaddr as recipient address" do - data = "" - t = Thread.new do - client = @server.accept - loop do - got = client.recv(5) - break if got.empty? - data << got - end - client.close - end - Thread.pass while t.status and t.status != "sleep" - t.status.should_not be_nil - - sockaddr = Socket.pack_sockaddr_in(@port, "127.0.0.1") - @socket.send('hello', 0, sockaddr).should == 5 - @socket.shutdown # indicate, that we are done sending - - t.join - data.should == 'hello' + data = +"" + t = Thread.new do + client = @server.accept + loop do + got = client.recv(5) + break if got.nil? || got.empty? + data << got + end + client.close + end + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + sockaddr = Socket.pack_sockaddr_in(@port, "127.0.0.1") + @socket.send('hello', 0, sockaddr).should == 5 + @socket.shutdown # indicate, that we are done sending + + t.join + data.should == 'hello' end end @@ -99,9 +99,17 @@ describe 'BasicSocket#send' do @server.close end + describe 'with an object implementing #to_str' do + it 'returns the amount of sent bytes' do + data = mock('message') + data.should_receive(:to_str).and_return('hello') + @client.send(data, 0, @server.getsockname).should == 5 + end + end + describe 'without a destination address' do it "raises #{SocketSpecs.dest_addr_req_error}" do - lambda { @client.send('hello', 0) }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { @client.send('hello', 0) }.should.raise(SocketSpecs.dest_addr_req_error) end end @@ -113,7 +121,7 @@ describe 'BasicSocket#send' do it 'does not persist the connection after writing to the socket' do @client.send('hello', 0, @server.getsockname) - lambda { @client.send('hello', 0) }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { @client.send('hello', 0) }.should.raise(SocketSpecs.dest_addr_req_error) end end @@ -161,7 +169,7 @@ describe 'BasicSocket#send' do it 'sends the message to the given address instead' do @client.send('hello', 0, @alt_server.getsockname).should == 5 - lambda { @server.recv(5) }.should block_caller + -> { @server.recv(5) }.should block_caller @alt_server.recv(5).should == 'hello' end diff --git a/spec/ruby/library/socket/basicsocket/sendmsg_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/sendmsg_nonblock_spec.rb index de5e2aa749..4cd6e8bdca 100644 --- a/spec/ruby/library/socket/basicsocket/sendmsg_nonblock_spec.rb +++ b/spec/ruby/library/socket/basicsocket/sendmsg_nonblock_spec.rb @@ -18,7 +18,12 @@ describe 'BasicSocket#sendmsg_nonblock' do describe 'without a destination address' do it "raises #{SocketSpecs.dest_addr_req_error}" do - lambda { @client.sendmsg_nonblock('hello') }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { + @client.sendmsg_nonblock('hello') + }.should.raise(SocketSpecs.dest_addr_req_error) + -> { + @client.sendmsg_nonblock('hello', exception: false) + }.should.raise(SocketSpecs.dest_addr_req_error) end end @@ -70,7 +75,7 @@ describe 'BasicSocket#sendmsg_nonblock' do it 'sends the message to the given address instead' do @client.sendmsg_nonblock('hello', 0, @alt_server.getsockname).should == 5 - lambda { @server.recv(5) }.should block_caller + -> { @server.recv(5) }.should block_caller @alt_server.recv(5).should == 'hello' end end @@ -94,9 +99,18 @@ describe 'BasicSocket#sendmsg_nonblock' do end it 'raises IO::WaitWritable when the underlying buffer is full' do - lambda { + -> { 10.times { @client.sendmsg_nonblock('hello' * 1_000_000) } - }.should raise_error(IO::WaitWritable) + }.should.raise(IO::WaitWritable) + end + + it 'returns :wait_writable when the underlying buffer is full with exception: false' do + ret = nil + 10.times { + ret = @client.sendmsg_nonblock('hello' * 1_000_000, exception: false) + break unless ret.is_a?(Integer) + } + ret.should == :wait_writable end end end diff --git a/spec/ruby/library/socket/basicsocket/sendmsg_spec.rb b/spec/ruby/library/socket/basicsocket/sendmsg_spec.rb index f2c11f443a..dc999b32df 100644 --- a/spec/ruby/library/socket/basicsocket/sendmsg_spec.rb +++ b/spec/ruby/library/socket/basicsocket/sendmsg_spec.rb @@ -19,7 +19,7 @@ describe 'BasicSocket#sendmsg' do platform_is_not :windows do describe 'without a destination address' do it "raises #{SocketSpecs.dest_addr_req_error}" do - lambda { @client.sendmsg('hello') }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { @client.sendmsg('hello') }.should.raise(SocketSpecs.dest_addr_req_error) end end end @@ -74,7 +74,7 @@ describe 'BasicSocket#sendmsg' do it 'sends the message to the given address instead' do @client.sendmsg('hello', 0, @alt_server.getsockname).should == 5 - lambda { @server.recv(5) }.should block_caller + -> { @server.recv(5) }.should block_caller @alt_server.recv(5).should == 'hello' end @@ -101,7 +101,7 @@ describe 'BasicSocket#sendmsg' do it 'blocks when the underlying buffer is full' do # Buffer sizes may differ per platform, so sadly this is the only # reliable way of testing blocking behaviour. - lambda do + -> do 10.times { @client.sendmsg('hello' * 1_000_000) } end.should block_caller end diff --git a/spec/ruby/library/socket/basicsocket/setsockopt_spec.rb b/spec/ruby/library/socket/basicsocket/setsockopt_spec.rb index 1471b03798..e306581aa3 100644 --- a/spec/ruby/library/socket/basicsocket/setsockopt_spec.rb +++ b/spec/ruby/library/socket/basicsocket/setsockopt_spec.rb @@ -38,9 +38,9 @@ describe "BasicSocket#setsockopt" do platform_is_not :windows do it "raises EINVAL if passed wrong linger value" do - lambda do + -> do @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, 0) - end.should raise_error(Errno::EINVAL) + end.should.raise(Errno::EINVAL) end end @@ -70,9 +70,9 @@ describe "BasicSocket#setsockopt" do n.should_not == [0].pack("i") platform_is_not :windows do - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) end @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "blah").should == 0 @@ -80,9 +80,9 @@ describe "BasicSocket#setsockopt" do n.should_not == [0].pack("i") platform_is_not :windows do - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "0") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) end @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "\x00\x00\x00\x00").should == 0 @@ -90,15 +90,15 @@ describe "BasicSocket#setsockopt" do n.should == [0].pack("i") platform_is_not :windows do - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "1") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) end platform_is_not :windows do - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, "\x00\x00\x00") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) end @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, [1].pack('i')).should == 0 @@ -125,9 +125,9 @@ describe "BasicSocket#setsockopt" do n = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF).to_s n.unpack('i')[0].should >= 1 - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, nil).should == 0 - }.should raise_error(TypeError) + }.should.raise(TypeError) @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, 1).should == 0 n = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF).to_s @@ -137,25 +137,25 @@ describe "BasicSocket#setsockopt" do n = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF).to_s n.unpack('i')[0].should >= 2 - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "bla") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "0") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "1") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) - lambda { + -> { @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "\x00\x00\x00") - }.should raise_error(SystemCallError) + }.should.raise(SystemCallError) @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF, "\x00\x00\x01\x00").should == 0 n = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF).to_s @@ -207,7 +207,7 @@ describe "BasicSocket#setsockopt" do onoff, seconds = @sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER).linger seconds.should == 10 # Both results can be produced depending on the OS and value of Socket::SO_LINGER - [true, Socket::SO_LINGER].should include(onoff) + [true, Socket::SO_LINGER].should.include?(onoff) end end end @@ -224,7 +224,7 @@ describe 'BasicSocket#setsockopt' do describe 'using separate arguments with Symbols' do it 'raises TypeError when the first argument is nil' do - lambda { @socket.setsockopt(nil, :REUSEADDR, true) }.should raise_error(TypeError) + -> { @socket.setsockopt(nil, :REUSEADDR, true) }.should.raise(TypeError) end it 'sets a boolean option' do @@ -251,7 +251,7 @@ describe 'BasicSocket#setsockopt' do platform_is_not :windows do it 'raises Errno::EINVAL when setting an invalid option value' do - lambda { @socket.setsockopt(:SOCKET, :OOBINLINE, 'bla') }.should raise_error(Errno::EINVAL) + -> { @socket.setsockopt(:SOCKET, :OOBINLINE, 'bla') }.should.raise(Errno::EINVAL) end end end @@ -305,32 +305,30 @@ describe 'BasicSocket#setsockopt' do it 'raises ArgumentError when passing 2 arguments' do option = Socket::Option.bool(:INET, :SOCKET, :REUSEADDR, true) - lambda { @socket.setsockopt(option, :REUSEADDR) }.should raise_error(ArgumentError) + -> { @socket.setsockopt(option, :REUSEADDR) }.should.raise(ArgumentError) end it 'raises TypeError when passing 3 arguments' do option = Socket::Option.bool(:INET, :SOCKET, :REUSEADDR, true) - lambda { @socket.setsockopt(option, :REUSEADDR, true) }.should raise_error(TypeError) + -> { @socket.setsockopt(option, :REUSEADDR, true) }.should.raise(TypeError) end end end - with_feature :unix_socket do - describe 'using a UNIX socket' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - end + describe 'using a UNIX socket' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end - after do - @server.close - rm_r @path - end + after do + @server.close + rm_r @path + end - it 'sets a boolean option' do - @server.setsockopt(:SOCKET, :REUSEADDR, true) - @server.getsockopt(:SOCKET, :REUSEADDR).bool.should == true - end + it 'sets a boolean option' do + @server.setsockopt(:SOCKET, :REUSEADDR, true) + @server.getsockopt(:SOCKET, :REUSEADDR).bool.should == true end end end diff --git a/spec/ruby/library/socket/basicsocket/shutdown_spec.rb b/spec/ruby/library/socket/basicsocket/shutdown_spec.rb index 87a32ae1dc..c96c62abe1 100644 --- a/spec/ruby/library/socket/basicsocket/shutdown_spec.rb +++ b/spec/ruby/library/socket/basicsocket/shutdown_spec.rb @@ -23,25 +23,25 @@ platform_is_not :windows do # hangs it 'shuts down a socket for reading' do @client.shutdown(Socket::SHUT_RD) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for writing' do @client.shutdown(Socket::SHUT_WR) - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'shuts down a socket for reading and writing' do @client.shutdown(Socket::SHUT_RDWR) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'raises ArgumentError when using an invalid option' do - lambda { @server.shutdown(666) }.should raise_error(ArgumentError) + -> { @server.shutdown(666) }.should.raise(ArgumentError) end end @@ -49,37 +49,37 @@ platform_is_not :windows do # hangs it 'shuts down a socket for reading using :RD' do @client.shutdown(:RD) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for reading using :SHUT_RD' do @client.shutdown(:SHUT_RD) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for writing using :WR' do @client.shutdown(:WR) - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'shuts down a socket for writing using :SHUT_WR' do @client.shutdown(:SHUT_WR) - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'shuts down a socket for reading and writing' do @client.shutdown(:RDWR) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'raises ArgumentError when using an invalid option' do - lambda { @server.shutdown(:Nope) }.should raise_error(SocketError) + -> { @server.shutdown(:Nope) }.should.raise(SocketError) end end @@ -87,29 +87,29 @@ platform_is_not :windows do # hangs it 'shuts down a socket for reading using "RD"' do @client.shutdown('RD') - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for reading using "SHUT_RD"' do @client.shutdown('SHUT_RD') - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for writing using "WR"' do @client.shutdown('WR') - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'shuts down a socket for writing using "SHUT_WR"' do @client.shutdown('SHUT_WR') - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end it 'raises ArgumentError when using an invalid option' do - lambda { @server.shutdown('Nope') }.should raise_error(SocketError) + -> { @server.shutdown('Nope') }.should.raise(SocketError) end end @@ -123,7 +123,7 @@ platform_is_not :windows do # hangs @client.shutdown(@dummy) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for reading using "SHUT_RD"' do @@ -131,7 +131,7 @@ platform_is_not :windows do # hangs @client.shutdown(@dummy) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? end it 'shuts down a socket for reading and writing' do @@ -139,15 +139,15 @@ platform_is_not :windows do # hangs @client.shutdown(@dummy) - @client.recv(1).should be_empty + @client.recv(1).to_s.should.empty? - lambda { @client.write('hello') }.should raise_error(Errno::EPIPE) + -> { @client.write('hello') }.should.raise(Errno::EPIPE) end end describe 'using an object that does not respond to #to_str' do it 'raises TypeError' do - lambda { @server.shutdown(mock(:dummy)) }.should raise_error(TypeError) + -> { @server.shutdown(mock(:dummy)) }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/basicsocket/write_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/write_nonblock_spec.rb new file mode 100644 index 0000000000..523e732959 --- /dev/null +++ b/spec/ruby/library/socket/basicsocket/write_nonblock_spec.rb @@ -0,0 +1,43 @@ +require_relative '../spec_helper' +require_relative '../fixtures/classes' + +describe "BasicSocket#write_nonblock" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @r = Socket.new(family, :DGRAM) + @w = Socket.new(family, :DGRAM) + + @r.bind(Socket.pack_sockaddr_in(0, ip_address)) + @w.connect(@r.getsockname) + end + + after :each do + @r.close unless @r.closed? + @w.close unless @w.closed? + end + + it "sends data" do + @w.write_nonblock("aaa").should == 3 + IO.select([@r], nil, nil, 2) + @r.recv_nonblock(5).should == "aaa" + end + + platform_is :linux do + it 'does not set the IO in nonblock mode' do + require 'io/nonblock' + @w.nonblock = false + @w.write_nonblock("aaa").should == 3 + @w.should_not.nonblock? + end + end + + platform_is_not :linux, :windows do + it 'sets the IO in nonblock mode' do + require 'io/nonblock' + @w.nonblock = false + @w.write_nonblock("aaa").should == 3 + @w.should.nonblock? + end + end + end +end diff --git a/spec/ruby/library/socket/constants/constants_spec.rb b/spec/ruby/library/socket/constants/constants_spec.rb index 710af12828..a936473bb6 100644 --- a/spec/ruby/library/socket/constants/constants_spec.rb +++ b/spec/ruby/library/socket/constants/constants_spec.rb @@ -5,47 +5,47 @@ describe "Socket::Constants" do it "defines socket types" do consts = ["SOCK_DGRAM", "SOCK_RAW", "SOCK_RDM", "SOCK_SEQPACKET", "SOCK_STREAM"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end it "defines protocol families" do consts = ["PF_INET6", "PF_INET", "PF_UNIX", "PF_UNSPEC"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end platform_is_not :aix do it "defines PF_IPX protocol" do - Socket::Constants.should have_constant("PF_IPX") + Socket::Constants.should.const_defined?("PF_IPX", false) end end it "defines address families" do consts = ["AF_INET6", "AF_INET", "AF_UNIX", "AF_UNSPEC"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end platform_is_not :aix do it "defines AF_IPX address" do - Socket::Constants.should have_constant("AF_IPX") + Socket::Constants.should.const_defined?("AF_IPX", false) end end it "defines send/receive options" do consts = ["MSG_DONTROUTE", "MSG_OOB", "MSG_PEEK"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end it "defines socket level options" do consts = ["SOL_SOCKET"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end @@ -53,7 +53,7 @@ describe "Socket::Constants" do consts = ["SO_BROADCAST", "SO_DEBUG", "SO_DONTROUTE", "SO_ERROR", "SO_KEEPALIVE", "SO_LINGER", "SO_OOBINLINE", "SO_RCVBUF", "SO_REUSEADDR", "SO_SNDBUF", "SO_TYPE"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end @@ -64,15 +64,15 @@ describe "Socket::Constants" do consts += ["IP_DEFAULT_MULTICAST_LOOP", "IP_DEFAULT_MULTICAST_TTL"] end consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end - platform_is_not :solaris, :windows, :aix do + platform_is_not :windows, :aix, :android do it "defines multicast options" do consts = ["IP_MAX_MEMBERSHIPS"] consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end end @@ -83,13 +83,13 @@ describe "Socket::Constants" do consts << "TCP_MAXSEG" end consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end platform_is_not :windows do it 'defines SCM options' do - Socket::Constants.should have_constant('SCM_RIGHTS') + Socket::Constants.should.const_defined?('SCM_RIGHTS', false) end it 'defines error options' do @@ -101,7 +101,7 @@ describe "Socket::Constants" do end consts.each do |c| - Socket::Constants.should have_constant(c) + Socket::Constants.should.const_defined?(c, false) end end end diff --git a/spec/ruby/library/socket/fixtures/classes.rb b/spec/ruby/library/socket/fixtures/classes.rb index b73fd0fa4c..786629d2ef 100644 --- a/spec/ruby/library/socket/fixtures/classes.rb +++ b/spec/ruby/library/socket/fixtures/classes.rb @@ -34,10 +34,12 @@ module SocketSpecs def self.socket_path path = tmp("unix.sock", false) - # Check for too long unix socket path (max 108 bytes including \0 => 107) + # Check for too long unix socket path (max 104 bytes on macOS) # Note that Linux accepts not null-terminated paths but the man page advises against it. - if path.bytesize > 107 - path = "/tmp/unix_server_spec.socket" + if path.bytesize > 104 + # rm_r in spec/mspec/lib/mspec/helpers/fs.rb fails against + # "/tmp/unix_server_spec.socket" + skip "too long unix socket path: #{path}" end rm_socket(path) path @@ -71,25 +73,12 @@ module SocketSpecs end end - def self.loop_with_timeout(timeout = 5) - require 'timeout' - time = Time.now + def self.loop_with_timeout(timeout = TIME_TOLERANCE) + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) - loop do - if Time.now - time >= timeout - raise TimeoutError, "Did not succeed within #{timeout} seconds" - end - - sleep 0.01 # necessary on OSX; don't know why - yield - end - end - - def self.wait_until_success(timeout = 5) - loop_with_timeout(timeout) do - begin - return yield - rescue + while yield == :retry + if Process.clock_gettime(Process::CLOCK_MONOTONIC) - start >= timeout + raise RuntimeError, "Did not succeed within #{timeout} seconds" end end end @@ -124,7 +113,7 @@ module SocketSpecs begin data = socket.recv(1024) - return if data.empty? + return if data.nil? || data.empty? log "SpecTCPServer received: #{data.inspect}" return if data == "QUIT" @@ -145,4 +134,33 @@ module SocketSpecs @logger.puts message if @logger end end + + # We need to find a free port for Socket.tcp_server_loop and Socket.udp_server_loop, + # and the only reliable way to do that is to pass 0 as the port, but then we need to + # find out which one was chosen and the API doesn't let us find what it is. So we + # intercept one of the public API methods called by these methods. + class ServerLoopPortFinder < Socket + def self.tcp_server_sockets(*args) + super(*args) { |sockets| + @port = sockets.first.local_address.ip_port + yield(sockets) + } + end + + def self.udp_server_sockets(*args, &block) + super(*args) { |sockets| + @port = sockets.first.local_address.ip_port + yield(sockets) + } + end + + def self.cleanup + @port = nil + end + + def self.port + sleep 0.001 until @port + @port + end + end end diff --git a/spec/ruby/library/socket/ipsocket/addr_spec.rb b/spec/ruby/library/socket/ipsocket/addr_spec.rb index 07f4cb20c9..eb16a8efdf 100644 --- a/spec/ruby/library/socket/ipsocket/addr_spec.rb +++ b/spec/ruby/library/socket/ipsocket/addr_spec.rb @@ -17,7 +17,7 @@ describe "Socket::IPSocket#addr" do BasicSocket.do_not_reverse_lookup = false addrinfo = @socket.addr addrinfo[0].should == "AF_INET" - addrinfo[1].should be_kind_of(Integer) + addrinfo[1].should.is_a?(Integer) addrinfo[2].should == SocketSpecs.hostname addrinfo[3].should == "127.0.0.1" end @@ -27,7 +27,7 @@ describe "Socket::IPSocket#addr" do BasicSocket.do_not_reverse_lookup = true addrinfo = @socket.addr addrinfo[0].should == "AF_INET" - addrinfo[1].should be_kind_of(Integer) + addrinfo[1].should.is_a?(Integer) addrinfo[2].should == "127.0.0.1" addrinfo[3].should == "127.0.0.1" end @@ -35,7 +35,7 @@ describe "Socket::IPSocket#addr" do it "returns an address in the array if passed false" do addrinfo = @socket.addr(false) addrinfo[0].should == "AF_INET" - addrinfo[1].should be_kind_of(Integer) + addrinfo[1].should.is_a?(Integer) addrinfo[2].should == "127.0.0.1" addrinfo[3].should == "127.0.0.1" end @@ -81,7 +81,7 @@ describe 'Socket::IPSocket#addr' do describe 'using :cats as the argument' do it 'raises ArgumentError' do - lambda { @server.addr(:cats) }.should raise_error(ArgumentError) + -> { @server.addr(:cats) }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/socket/ipsocket/getaddress_spec.rb b/spec/ruby/library/socket/ipsocket/getaddress_spec.rb index 2ee35af5b5..d302cd6a8a 100644 --- a/spec/ruby/library/socket/ipsocket/getaddress_spec.rb +++ b/spec/ruby/library/socket/ipsocket/getaddress_spec.rb @@ -2,7 +2,6 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "Socket::IPSocket#getaddress" do - it "returns the IP address of hostname" do addr_local = IPSocket.getaddress(SocketSpecs.hostname) ["127.0.0.1", "::1"].include?(addr_local).should == true @@ -14,14 +13,16 @@ describe "Socket::IPSocket#getaddress" do IPSocket.getaddress('::1').should == '::1' end + it 'returns IPv4 compatible IPv6 addresses' do + IPSocket.getaddress('::ffff:192.168.1.1').should == '::ffff:192.168.1.1' + end + # There is no way to make this fail-proof on all machines, because # DNS servers like opendns return A records for ANY host, including # traditionally invalidly named ones. - quarantine! do - it "raises an error on unknown hostnames" do - lambda { - IPSocket.getaddress("rubyspecdoesntexist.fallingsnow.net") - }.should raise_error(SocketError) - end + it "raises an error on unknown hostnames" do + -> { + IPSocket.getaddress("rubyspecdoesntexist.ruby-lang.org") + }.should.raise(SocketError) end end diff --git a/spec/ruby/library/socket/ipsocket/inspect_spec.rb b/spec/ruby/library/socket/ipsocket/inspect_spec.rb new file mode 100644 index 0000000000..85780a16f6 --- /dev/null +++ b/spec/ruby/library/socket/ipsocket/inspect_spec.rb @@ -0,0 +1,24 @@ +require_relative '../spec_helper' + +describe 'IPSocket#inspect' do + it "returns a String with the fd, family, address and port for TCPSocket" do + @server = TCPServer.new("127.0.0.1", 0) + @socket = TCPSocket.new("127.0.0.1", @server.addr[1]) + port = @socket.addr[1] + + @socket.inspect.should == "#<TCPSocket:fd #{@socket.fileno}, AF_INET, 127.0.0.1, #{port}>" + ensure + @socket&.close + @server&.close + end + + it 'returns a String with the fd, family, address and port for UDPSocket' do + @socket = UDPSocket.new + @socket.bind('127.0.0.1', 0) + port = @socket.addr[1] + + @socket.inspect.should == "#<UDPSocket:fd #{@socket.fileno}, AF_INET, 127.0.0.1, #{port}>" + ensure + @socket&.close + end +end diff --git a/spec/ruby/library/socket/ipsocket/peeraddr_spec.rb b/spec/ruby/library/socket/ipsocket/peeraddr_spec.rb index 26aa61d1c4..b79222000a 100644 --- a/spec/ruby/library/socket/ipsocket/peeraddr_spec.rb +++ b/spec/ruby/library/socket/ipsocket/peeraddr_spec.rb @@ -16,9 +16,9 @@ describe "Socket::IPSocket#peeraddr" do end it "raises error if socket is not connected" do - lambda { + -> { @server.peeraddr - }.should raise_error(Errno::ENOTCONN) + }.should.raise(Errno::ENOTCONN) end it "returns an array of information on the peer" do @@ -92,7 +92,7 @@ describe 'Socket::IPSocket#peeraddr' do describe 'using :cats as the argument' do it 'raises ArgumentError' do - lambda { @client.peeraddr(:cats) }.should raise_error(ArgumentError) + -> { @client.peeraddr(:cats) }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/socket/ipsocket/recvfrom_spec.rb b/spec/ruby/library/socket/ipsocket/recvfrom_spec.rb index 3bcb7b8f02..7af0078be1 100644 --- a/spec/ruby/library/socket/ipsocket/recvfrom_spec.rb +++ b/spec/ruby/library/socket/ipsocket/recvfrom_spec.rb @@ -64,11 +64,71 @@ describe "Socket::IPSocket#recvfrom" do data.size.should == 2 data.first.should == "hel" - # This does not apply to every platform, dependant on recvfrom(2) + # This does not apply to every platform, dependent on recvfrom(2) # data.last.should == nil end end +describe "Socket::IPSocket#recvfrom" do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new("127.0.0.1", 0) + port = @server.addr[1] + @client = TCPSocket.new("127.0.0.1", port) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns nil on a closed stream socket" do + t = Thread.new do + client = @server.accept + message = client.recvfrom(10) + message + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + @client.close + + t.value.should == nil + end + end + + describe "datagram socket" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @server = UDPSocket.new(family) + @client = UDPSocket.new(family) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns an empty String as received data" do + @server.bind(ip_address, 0) + addr = @server.connect_address + @client.connect(addr.ip_address, addr.ip_port) + + @client.send('', 0) + message = @server.recvfrom(1) + + message.should.is_a? Array + message[0].should == "" + end + end + end + end +end + describe 'Socket::IPSocket#recvfrom' do SocketSpecs.each_ip_protocol do |family, ip_address, family_name| before do diff --git a/spec/ruby/library/socket/option/bool_spec.rb b/spec/ruby/library/socket/option/bool_spec.rb index c4f8a277ba..9992e842b3 100644 --- a/spec/ruby/library/socket/option/bool_spec.rb +++ b/spec/ruby/library/socket/option/bool_spec.rb @@ -4,7 +4,7 @@ require_relative '../fixtures/classes' describe "Socket::Option.bool" do it "creates a new Socket::Option" do so = Socket::Option.bool(:INET, :SOCKET, :KEEPALIVE, true) - so.should be_an_instance_of(Socket::Option) + so.should.instance_of?(Socket::Option) so.family.should == Socket::AF_INET so.level.should == Socket::SOL_SOCKET so.optname.should == Socket::SO_KEEPALIVE @@ -21,7 +21,7 @@ describe "Socket::Option#bool" do platform_is_not :windows do it 'raises TypeError when called on a non boolean option' do opt = Socket::Option.linger(1, 4) - lambda { opt.bool }.should raise_error(TypeError) + -> { opt.bool }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/option/initialize_spec.rb b/spec/ruby/library/socket/option/initialize_spec.rb index 0d4621b71e..5af274f332 100644 --- a/spec/ruby/library/socket/option/initialize_spec.rb +++ b/spec/ruby/library/socket/option/initialize_spec.rb @@ -10,7 +10,7 @@ describe 'Socket::Option#initialize' do opt = Socket::Option .new(Socket::AF_INET, Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, @bool) - opt.should be_an_instance_of(Socket::Option) + opt.should.instance_of?(Socket::Option) opt.family.should == Socket::AF_INET opt.level.should == Socket::SOL_SOCKET @@ -23,7 +23,7 @@ describe 'Socket::Option#initialize' do it 'returns a Socket::Option' do opt = Socket::Option.new(:INET, :SOCKET, :KEEPALIVE, @bool) - opt.should be_an_instance_of(Socket::Option) + opt.should.instance_of?(Socket::Option) opt.family.should == Socket::AF_INET opt.level.should == Socket::SOL_SOCKET @@ -32,21 +32,21 @@ describe 'Socket::Option#initialize' do end it 'raises when using an invalid address family' do - lambda { + -> { Socket::Option.new(:INET2, :SOCKET, :KEEPALIVE, @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises when using an invalid level' do - lambda { + -> { Socket::Option.new(:INET, :CATS, :KEEPALIVE, @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises when using an invalid option name' do - lambda { + -> { Socket::Option.new(:INET, :SOCKET, :CATS, @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end end @@ -54,7 +54,7 @@ describe 'Socket::Option#initialize' do it 'returns a Socket::Option' do opt = Socket::Option.new('INET', 'SOCKET', 'KEEPALIVE', @bool) - opt.should be_an_instance_of(Socket::Option) + opt.should.instance_of?(Socket::Option) opt.family.should == Socket::AF_INET opt.level.should == Socket::SOL_SOCKET @@ -63,21 +63,21 @@ describe 'Socket::Option#initialize' do end it 'raises when using an invalid address family' do - lambda { + -> { Socket::Option.new('INET2', 'SOCKET', 'KEEPALIVE', @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises when using an invalid level' do - lambda { + -> { Socket::Option.new('INET', 'CATS', 'KEEPALIVE', @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end it 'raises when using an invalid option name' do - lambda { + -> { Socket::Option.new('INET', 'SOCKET', 'CATS', @bool) - }.should raise_error(SocketError) + }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/option/int_spec.rb b/spec/ruby/library/socket/option/int_spec.rb index 5c67ec26d8..0cd341f88a 100644 --- a/spec/ruby/library/socket/option/int_spec.rb +++ b/spec/ruby/library/socket/option/int_spec.rb @@ -4,7 +4,7 @@ require_relative '../fixtures/classes' describe "Socket::Option.int" do it "creates a new Socket::Option" do so = Socket::Option.int(:INET, :SOCKET, :KEEPALIVE, 5) - so.should be_an_instance_of(Socket::Option) + so.should.instance_of?(Socket::Option) so.family.should == Socket::Constants::AF_INET so.level.should == Socket::Constants::SOL_SOCKET so.optname.should == Socket::Constants::SO_KEEPALIVE @@ -14,7 +14,7 @@ describe "Socket::Option.int" do it 'returns a Socket::Option' do opt = Socket::Option.int(:INET, :IP, :TTL, 4) - opt.should be_an_instance_of(Socket::Option) + opt.should.instance_of?(Socket::Option) opt.family.should == Socket::AF_INET opt.level.should == Socket::IPPROTO_IP @@ -37,7 +37,7 @@ describe "Socket::Option#int" do platform_is_not :windows do it 'raises TypeError when called on a non integer option' do opt = Socket::Option.linger(1, 4) - lambda { opt.int }.should raise_error(TypeError) + -> { opt.int }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/option/linger_spec.rb b/spec/ruby/library/socket/option/linger_spec.rb index 94467ebf71..87c5e0982e 100644 --- a/spec/ruby/library/socket/option/linger_spec.rb +++ b/spec/ruby/library/socket/option/linger_spec.rb @@ -9,7 +9,7 @@ end describe "Socket::Option.linger" do it "creates a new Socket::Option for SO_LINGER" do so = Socket::Option.linger(1, 10) - so.should be_an_instance_of(Socket::Option) + so.should.instance_of?(Socket::Option) so.family.should == Socket::Constants::AF_UNSPEC so.level.should == Socket::Constants::SOL_SOCKET @@ -31,46 +31,46 @@ describe "Socket::Option#linger" do it "returns linger option" do so = Socket::Option.linger(0, 5) ary = so.linger - ary[0].should be_false + ary[0].should == false ary[1].should == 5 so = Socket::Option.linger(false, 4) ary = so.linger - ary[0].should be_false + ary[0].should == false ary[1].should == 4 so = Socket::Option.linger(1, 10) ary = so.linger - ary[0].should be_true + ary[0].should == true ary[1].should == 10 so = Socket::Option.linger(true, 9) ary = so.linger - ary[0].should be_true + ary[0].should == true ary[1].should == 9 end it "raises TypeError if not a SO_LINGER" do so = Socket::Option.int(:AF_UNSPEC, :SOL_SOCKET, :KEEPALIVE, 1) - lambda { so.linger }.should raise_error(TypeError) + -> { so.linger }.should.raise(TypeError) end it 'raises TypeError when called on a non SOL_SOCKET/SO_LINGER option' do opt = Socket::Option.int(:INET, :IP, :TTL, 4) - lambda { opt.linger }.should raise_error(TypeError) + -> { opt.linger }.should.raise(TypeError) end platform_is_not :windows do it "raises TypeError if option has not good size" do so = Socket::Option.int(:AF_UNSPEC, :SOL_SOCKET, :LINGER, 1) - lambda { so.linger }.should raise_error(TypeError) + -> { so.linger }.should.raise(TypeError) end end it 'raises TypeError when called on a non linger option' do opt = Socket::Option.new(:INET, :SOCKET, :LINGER, '') - lambda { opt.linger }.should raise_error(TypeError) + -> { opt.linger }.should.raise(TypeError) end end diff --git a/spec/ruby/library/socket/option/new_spec.rb b/spec/ruby/library/socket/option/new_spec.rb index f3b7b31c91..3721d63ee5 100644 --- a/spec/ruby/library/socket/option/new_spec.rb +++ b/spec/ruby/library/socket/option/new_spec.rb @@ -22,14 +22,14 @@ describe "Socket::Option.new" do end it "should raise error on unknown family" do - lambda { Socket::Option.new(:INET4, :SOCKET, :KEEPALIVE, [0].pack('i')) }.should raise_error(SocketError) + -> { Socket::Option.new(:INET4, :SOCKET, :KEEPALIVE, [0].pack('i')) }.should.raise(SocketError) end it "should raise error on unknown level" do - lambda { Socket::Option.new(:INET, :ROCKET, :KEEPALIVE, [0].pack('i')) }.should raise_error(SocketError) + -> { Socket::Option.new(:INET, :ROCKET, :KEEPALIVE, [0].pack('i')) }.should.raise(SocketError) end it "should raise error on unknown option name" do - lambda { Socket::Option.new(:INET, :SOCKET, :ALIVE, [0].pack('i')) }.should raise_error(SocketError) + -> { Socket::Option.new(:INET, :SOCKET, :ALIVE, [0].pack('i')) }.should.raise(SocketError) end end diff --git a/spec/ruby/library/socket/shared/address.rb b/spec/ruby/library/socket/shared/address.rb new file mode 100644 index 0000000000..c64602df2f --- /dev/null +++ b/spec/ruby/library/socket/shared/address.rb @@ -0,0 +1,259 @@ +require_relative '../fixtures/classes' + +describe :socket_local_remote_address, shared: true do + describe 'using TCPSocket' do + before :each do + @s = TCPServer.new('127.0.0.1', 0) + @a = TCPSocket.new('127.0.0.1', @s.addr[1]) + @b = @s.accept + @addr = @object.call(@a) + end + + after :each do + [@b, @a, @s].each(&:close) + end + + it 'uses AF_INET as the address family' do + @addr.afamily.should == Socket::AF_INET + end + + it 'uses PF_INET as the protocol family' do + @addr.pfamily.should == Socket::PF_INET + end + + it 'uses SOCK_STREAM as the socket type' do + @addr.socktype.should == Socket::SOCK_STREAM + end + + it 'uses the correct IP address' do + @addr.ip_address.should == '127.0.0.1' + end + + it 'uses the correct port' do + if @method == :local_address + @addr.ip_port.should != @s.addr[1] + else + @addr.ip_port.should == @s.addr[1] + end + end + + it 'equals address of peer socket' do + if @method == :local_address + @addr.to_s.should == @b.remote_address.to_s + else + @addr.to_s.should == @b.local_address.to_s + end + end + + it 'returns an Addrinfo' do + @addr.should.instance_of?(Addrinfo) + end + + it 'uses 0 as the protocol' do + @addr.protocol.should == 0 + end + + it 'can be used to connect to the server' do + skip if @method == :local_address + b = @addr.connect + begin + b.remote_address.to_s.should == @addr.to_s + ensure + b.close + end + end + end + + guard -> { SocketSpecs.ipv6_available? } do + describe 'using IPv6' do + before :each do + @s = TCPServer.new('::1', 0) + @a = TCPSocket.new('::1', @s.addr[1]) + @b = @s.accept + @addr = @object.call(@a) + end + + after :each do + [@b, @a, @s].each(&:close) + end + + it 'uses AF_INET6 as the address family' do + @addr.afamily.should == Socket::AF_INET6 + end + + it 'uses PF_INET6 as the protocol family' do + @addr.pfamily.should == Socket::PF_INET6 + end + + it 'uses SOCK_STREAM as the socket type' do + @addr.socktype.should == Socket::SOCK_STREAM + end + + it 'uses the correct IP address' do + @addr.ip_address.should == '::1' + end + + it 'uses the correct port' do + if @method == :local_address + @addr.ip_port.should != @s.addr[1] + else + @addr.ip_port.should == @s.addr[1] + end + end + + it 'equals address of peer socket' do + if @method == :local_address + @addr.to_s.should == @b.remote_address.to_s + else + @addr.to_s.should == @b.local_address.to_s + end + end + + it 'returns an Addrinfo' do + @addr.should.instance_of?(Addrinfo) + end + + it 'uses 0 as the protocol' do + @addr.protocol.should == 0 + end + + it 'can be used to connect to the server' do + skip if @method == :local_address + b = @addr.connect + begin + b.remote_address.to_s.should == @addr.to_s + ensure + b.close + end + end + end + end + + describe 'using UNIXSocket' do + before :each do + @path = SocketSpecs.socket_path + @s = UNIXServer.new(@path) + @a = UNIXSocket.new(@path) + @b = @s.accept + @addr = @object.call(@a) + end + + after :each do + [@b, @a, @s].each(&:close) + rm_r(@path) + end + + it 'uses AF_UNIX as the address family' do + @addr.afamily.should == Socket::AF_UNIX + end + + it 'uses PF_UNIX as the protocol family' do + @addr.pfamily.should == Socket::PF_UNIX + end + + it 'uses SOCK_STREAM as the socket type' do + @addr.socktype.should == Socket::SOCK_STREAM + end + + it 'uses the correct socket path' do + if @method == :local_address + @addr.unix_path.should == "" + else + @addr.unix_path.should == @path + end + end + + platform_is_not :windows do + it 'equals address of peer socket' do + if @method == :local_address + @addr.to_s.should == @b.remote_address.to_s + else + @addr.to_s.should == @b.local_address.to_s + end + end + end + + guard -> { platform_is :windows and ruby_bug "#21702", ""..."4.2" } do + it 'equals address of peer socket' do + if @method == :local_address + @addr.to_s.should == @b.remote_address.to_s + else + @addr.to_s.should == @b.local_address.to_s + end + end + end + + it 'returns an Addrinfo' do + @addr.should.instance_of?(Addrinfo) + end + + it 'uses 0 as the protocol' do + @addr.protocol.should == 0 + end + + it 'can be used to connect to the server' do + skip if @method == :local_address + b = @addr.connect + begin + b.remote_address.to_s.should == @addr.to_s + ensure + b.close + end + end + end + + describe 'using UDPSocket' do + before :each do + @s = UDPSocket.new + @s.bind("127.0.0.1", 0) + @a = UDPSocket.new + @a.connect("127.0.0.1", @s.addr[1]) + @addr = @object.call(@a) + end + + after :each do + [@a, @s].each(&:close) + end + + it 'uses the correct address family' do + @addr.afamily.should == Socket::AF_INET + end + + it 'uses the correct protocol family' do + @addr.pfamily.should == Socket::PF_INET + end + + it 'uses SOCK_DGRAM as the socket type' do + @addr.socktype.should == Socket::SOCK_DGRAM + end + + it 'uses the correct IP address' do + @addr.ip_address.should == '127.0.0.1' + end + + it 'uses the correct port' do + if @method == :local_address + @addr.ip_port.should != @s.addr[1] + else + @addr.ip_port.should == @s.addr[1] + end + end + + it 'returns an Addrinfo' do + @addr.should.instance_of?(Addrinfo) + end + + it 'uses 0 as the protocol' do + @addr.protocol.should == 0 + end + + it 'can be used to connect to the peer' do + b = @addr.connect + begin + b.remote_address.to_s.should == @addr.to_s + ensure + b.close + end + end + end +end diff --git a/spec/ruby/library/socket/shared/pack_sockaddr.rb b/spec/ruby/library/socket/shared/pack_sockaddr.rb index 40b0d8d59e..db6f39612d 100644 --- a/spec/ruby/library/socket/shared/pack_sockaddr.rb +++ b/spec/ruby/library/socket/shared/pack_sockaddr.rb @@ -17,65 +17,58 @@ describe :socket_pack_sockaddr_in, shared: true do sockaddr_in = Socket.public_send(@method, nil, '127.0.0.1') Socket.unpack_sockaddr_in(sockaddr_in).should == [0, '127.0.0.1'] + + sockaddr_in = Socket.public_send(@method, 80, Socket::INADDR_ANY) + Socket.unpack_sockaddr_in(sockaddr_in).should == [80, '0.0.0.0'] + end + + it 'resolves the service name to a port' do + sockaddr_in = Socket.public_send(@method, 'http', '127.0.0.1') + Socket.unpack_sockaddr_in(sockaddr_in).should == [80, '127.0.0.1'] end describe 'using an IPv4 address' do it 'returns a String of 16 bytes' do str = Socket.public_send(@method, 80, '127.0.0.1') - str.should be_an_instance_of(String) + str.should.instance_of?(String) str.bytesize.should == 16 end end - platform_is_not :solaris do - describe 'using an IPv6 address' do - it 'returns a String of 28 bytes' do - str = Socket.public_send(@method, 80, '::1') - - str.should be_an_instance_of(String) - str.bytesize.should == 28 - end - end - end - - platform_is :solaris do - describe 'using an IPv6 address' do - it 'returns a String of 32 bytes' do - str = Socket.public_send(@method, 80, '::1') + describe 'using an IPv6 address' do + it 'returns a String of 28 bytes' do + str = Socket.public_send(@method, 80, '::1') - str.should be_an_instance_of(String) - str.bytesize.should == 32 - end + str.should.instance_of?(String) + str.bytesize.should == 28 end end end describe :socket_pack_sockaddr_un, shared: true do - with_feature :unix_socket do - it 'should be idempotent' do - bytes = Socket.public_send(@method, '/tmp/foo').bytes - bytes[2..9].should == [47, 116, 109, 112, 47, 102, 111, 111] - bytes[10..-1].all?(&:zero?).should == true - end + it 'should be idempotent' do + bytes = Socket.public_send(@method, '/tmp/foo').bytes + bytes[2..9].should == [47, 116, 109, 112, 47, 102, 111, 111] + bytes[10..-1].all?(&:zero?).should == true + end - it "packs and unpacks" do - sockaddr_un = Socket.public_send(@method, '/tmp/s') - Socket.unpack_sockaddr_un(sockaddr_un).should == '/tmp/s' - end + it "packs and unpacks" do + sockaddr_un = Socket.public_send(@method, '/tmp/s') + Socket.unpack_sockaddr_un(sockaddr_un).should == '/tmp/s' + end - it "handles correctly paths with multibyte chars" do - sockaddr_un = Socket.public_send(@method, '/home/вася/sock') - path = Socket.unpack_sockaddr_un(sockaddr_un).encode('UTF-8', 'UTF-8') - path.should == '/home/вася/sock' - end + it "handles correctly paths with multibyte chars" do + sockaddr_un = Socket.public_send(@method, '/home/вася/sock') + path = Socket.unpack_sockaddr_un(sockaddr_un).encode('UTF-8', 'UTF-8') + path.should == '/home/вася/sock' end platform_is :linux do it 'returns a String of 110 bytes' do str = Socket.public_send(@method, '/tmp/test.sock') - str.should be_an_instance_of(String) + str.should.instance_of?(String) str.bytesize.should == 110 end end @@ -84,16 +77,16 @@ describe :socket_pack_sockaddr_un, shared: true do it 'returns a String of 106 bytes' do str = Socket.public_send(@method, '/tmp/test.sock') - str.should be_an_instance_of(String) + str.should.instance_of?(String) str.bytesize.should == 106 end end - platform_is_not :windows, :aix do + platform_is_not :aix do it "raises ArgumentError for paths that are too long" do # AIX doesn't raise error long_path = 'a' * 110 - lambda { Socket.public_send(@method, long_path) }.should raise_error(ArgumentError) + -> { Socket.public_send(@method, long_path) }.should.raise(ArgumentError) end end end diff --git a/spec/ruby/library/socket/shared/partially_closable_sockets.rb b/spec/ruby/library/socket/shared/partially_closable_sockets.rb index 1bdff08bf6..b1c2ebabe1 100644 --- a/spec/ruby/library/socket/shared/partially_closable_sockets.rb +++ b/spec/ruby/library/socket/shared/partially_closable_sockets.rb @@ -1,4 +1,4 @@ -describe "partially closable sockets", shared: true do +describe :partially_closable_sockets, shared: true do it "if the write end is closed then the other side can read past EOF without blocking" do @s1.write("foo") @s1.close_write diff --git a/spec/ruby/library/socket/shared/socketpair.rb b/spec/ruby/library/socket/shared/socketpair.rb index 08db2e59b8..7fcd4d6b46 100644 --- a/spec/ruby/library/socket/shared/socketpair.rb +++ b/spec/ruby/library/socket/shared/socketpair.rb @@ -12,8 +12,8 @@ describe :socket_socketpair, shared: true do begin s1, s2 = Socket.public_send(@method, :UNIX, :STREAM) - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) ensure s1.close s2.close @@ -24,8 +24,8 @@ describe :socket_socketpair, shared: true do it 'returns two Socket objects' do s1, s2 = Socket.public_send(@method, Socket::AF_UNIX, Socket::SOCK_STREAM) - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) s1.close s2.close end @@ -35,18 +35,18 @@ describe :socket_socketpair, shared: true do it 'returns two Socket objects' do s1, s2 = Socket.public_send(@method, :UNIX, :STREAM) - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) s1.close s2.close end it 'raises SocketError for an unknown address family' do - lambda { Socket.public_send(@method, :CATS, :STREAM) }.should raise_error(SocketError) + -> { Socket.public_send(@method, :CATS, :STREAM) }.should.raise(SocketError) end it 'raises SocketError for an unknown socket type' do - lambda { Socket.public_send(@method, :UNIX, :CATS) }.should raise_error(SocketError) + -> { Socket.public_send(@method, :UNIX, :CATS) }.should.raise(SocketError) end end @@ -54,18 +54,18 @@ describe :socket_socketpair, shared: true do it 'returns two Socket objects' do s1, s2 = Socket.public_send(@method, 'UNIX', 'STREAM') - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) s1.close s2.close end it 'raises SocketError for an unknown address family' do - lambda { Socket.public_send(@method, 'CATS', 'STREAM') }.should raise_error(SocketError) + -> { Socket.public_send(@method, 'CATS', 'STREAM') }.should.raise(SocketError) end it 'raises SocketError for an unknown socket type' do - lambda { Socket.public_send(@method, 'UNIX', 'CATS') }.should raise_error(SocketError) + -> { Socket.public_send(@method, 'UNIX', 'CATS') }.should.raise(SocketError) end end @@ -79,8 +79,8 @@ describe :socket_socketpair, shared: true do s1, s2 = Socket.public_send(@method, family, type) - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) s1.close s2.close end @@ -92,7 +92,7 @@ describe :socket_socketpair, shared: true do family.stub!(:to_str).and_return(Socket::AF_UNIX) type.stub!(:to_str).and_return(Socket::SOCK_STREAM) - lambda { Socket.public_send(@method, family, type) }.should raise_error(TypeError) + -> { Socket.public_send(@method, family, type) }.should.raise(TypeError) end it 'raises SocketError for an unknown address family' do @@ -102,7 +102,7 @@ describe :socket_socketpair, shared: true do family.stub!(:to_str).and_return('CATS') type.stub!(:to_str).and_return('STREAM') - lambda { Socket.public_send(@method, family, type) }.should raise_error(SocketError) + -> { Socket.public_send(@method, family, type) }.should.raise(SocketError) end it 'raises SocketError for an unknown socket type' do @@ -112,14 +112,14 @@ describe :socket_socketpair, shared: true do family.stub!(:to_str).and_return('UNIX') type.stub!(:to_str).and_return('CATS') - lambda { Socket.public_send(@method, family, type) }.should raise_error(SocketError) + -> { Socket.public_send(@method, family, type) }.should.raise(SocketError) end end it 'accepts a custom protocol as an Integer as the 3rd argument' do s1, s2 = Socket.public_send(@method, :UNIX, :STREAM, Socket::IPPROTO_IP) - s1.should be_an_instance_of(Socket) - s2.should be_an_instance_of(Socket) + s1.should.instance_of?(Socket) + s2.should.instance_of?(Socket) s1.close s2.close end diff --git a/spec/ruby/library/socket/socket/accept_loop_spec.rb b/spec/ruby/library/socket/socket/accept_loop_spec.rb index 88bd1c556c..6c65b192ed 100644 --- a/spec/ruby/library/socket/socket/accept_loop_spec.rb +++ b/spec/ruby/library/socket/socket/accept_loop_spec.rb @@ -16,8 +16,12 @@ describe 'Socket.accept_loop' do describe 'using an Array of Sockets' do describe 'without any available connections' do - it 'blocks the caller' do - lambda { Socket.accept_loop([@server]) }.should block_caller + # FIXME windows randomly hangs here forever + # https://ci.appveyor.com/project/ruby/ruby/builds/20817932/job/dor2ipny7ru4erpa + platform_is_not :windows do + it 'blocks the caller' do + -> { Socket.accept_loop([@server]) }.should block_caller + end end end @@ -37,8 +41,8 @@ describe 'Socket.accept_loop' do end begin - conn.should be_an_instance_of(Socket) - addr.should be_an_instance_of(Addrinfo) + conn.should.instance_of?(Socket) + addr.should.instance_of?(Addrinfo) ensure conn.close end @@ -49,7 +53,7 @@ describe 'Socket.accept_loop' do describe 'using separate Socket arguments' do describe 'without any available connections' do it 'blocks the caller' do - lambda { Socket.accept_loop(@server) }.should block_caller + -> { Socket.accept_loop(@server) }.should block_caller end end @@ -69,8 +73,8 @@ describe 'Socket.accept_loop' do end begin - conn.should be_an_instance_of(Socket) - addr.should be_an_instance_of(Addrinfo) + conn.should.instance_of?(Socket) + addr.should.instance_of?(Addrinfo) ensure conn.close end diff --git a/spec/ruby/library/socket/socket/accept_nonblock_spec.rb b/spec/ruby/library/socket/socket/accept_nonblock_spec.rb index 7ad32fa16e..09cdbaa7b4 100644 --- a/spec/ruby/library/socket/socket/accept_nonblock_spec.rb +++ b/spec/ruby/library/socket/socket/accept_nonblock_spec.rb @@ -15,14 +15,14 @@ describe "Socket#accept_nonblock" do end it "raises IO::WaitReadable if the connection is not accepted yet" do - lambda { + -> { @socket.accept_nonblock - }.should raise_error(IO::WaitReadable) { |e| + }.should.raise(IO::WaitReadable) { |e| platform_is_not :windows do - e.should be_kind_of(Errno::EAGAIN) + e.should.is_a?(Errno::EAGAIN) end platform_is :windows do - e.should be_kind_of(Errno::EWOULDBLOCK) + e.should.is_a?(Errno::EWOULDBLOCK) end } end @@ -45,7 +45,8 @@ describe 'Socket#accept_nonblock' do describe 'using an unbound socket' do it 'raises Errno::EINVAL' do - lambda { @server.accept_nonblock }.should raise_error(Errno::EINVAL) + -> { @server.accept_nonblock }.should.raise(Errno::EINVAL) + -> { @server.accept_nonblock(exception: false) }.should.raise(Errno::EINVAL) end end @@ -55,7 +56,8 @@ describe 'Socket#accept_nonblock' do end it 'raises Errno::EINVAL' do - lambda { @server.accept_nonblock }.should raise_error(Errno::EINVAL) + -> { @server.accept_nonblock }.should.raise(Errno::EINVAL) + -> { @server.accept_nonblock(exception: false) }.should.raise(Errno::EINVAL) end end @@ -63,7 +65,8 @@ describe 'Socket#accept_nonblock' do it 'raises IOError' do @server.close - lambda { @server.accept_nonblock }.should raise_error(IOError) + -> { @server.accept_nonblock }.should.raise(IOError) + -> { @server.accept_nonblock(exception: false) }.should.raise(IOError) end end @@ -75,7 +78,7 @@ describe 'Socket#accept_nonblock' do describe 'without a connected client' do it 'raises IO::WaitReadable' do - lambda { @server.accept_nonblock }.should raise_error(IO::WaitReadable) + -> { @server.accept_nonblock }.should.raise(IO::WaitReadable) end end @@ -86,8 +89,6 @@ describe 'Socket#accept_nonblock' do @client = Socket.new(family, :STREAM, 0) @client.connect(addr) - - platform_is(:darwin, :freebsd) { IO.select([@server]) } end after do @@ -96,14 +97,16 @@ describe 'Socket#accept_nonblock' do end it 'returns an Array containing a Socket and an Addrinfo' do + IO.select([@server]) @socket, addrinfo = @server.accept_nonblock - @socket.should be_an_instance_of(Socket) - addrinfo.should be_an_instance_of(Addrinfo) + @socket.should.instance_of?(Socket) + addrinfo.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do before do + IO.select([@server]) @socket, @addr = @server.accept_nonblock end diff --git a/spec/ruby/library/socket/socket/accept_spec.rb b/spec/ruby/library/socket/socket/accept_spec.rb index a0778caa23..fca727ab08 100644 --- a/spec/ruby/library/socket/socket/accept_spec.rb +++ b/spec/ruby/library/socket/socket/accept_spec.rb @@ -15,7 +15,7 @@ describe 'Socket#accept' do platform_is :linux do # hangs on other platforms describe 'using an unbound socket' do it 'raises Errno::EINVAL' do - lambda { @server.accept }.should raise_error(Errno::EINVAL) + -> { @server.accept }.should.raise(Errno::EINVAL) end end @@ -25,7 +25,7 @@ describe 'Socket#accept' do end it 'raises Errno::EINVAL' do - lambda { @server.accept }.should raise_error(Errno::EINVAL) + -> { @server.accept }.should.raise(Errno::EINVAL) end end end @@ -34,7 +34,7 @@ describe 'Socket#accept' do it 'raises IOError' do @server.close - lambda { @server.accept }.should raise_error(IOError) + -> { @server.accept }.should.raise(IOError) end end @@ -56,10 +56,9 @@ describe 'Socket#accept' do client.connect(@server_addr) - thread.join(5) value = thread.value begin - value.should be_an_instance_of(Array) + value.should.instance_of?(Array) ensure client.close value[0].close @@ -83,8 +82,8 @@ describe 'Socket#accept' do it 'returns an Array containing a Socket and an Addrinfo' do @socket, addrinfo = @server.accept - @socket.should be_an_instance_of(Socket) - addrinfo.should be_an_instance_of(Addrinfo) + @socket.should.instance_of?(Socket) + addrinfo.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/socket/bind_spec.rb b/spec/ruby/library/socket/socket/bind_spec.rb index 338b19bbfc..164df92205 100644 --- a/spec/ruby/library/socket/socket/bind_spec.rb +++ b/spec/ruby/library/socket/socket/bind_spec.rb @@ -8,12 +8,12 @@ describe "Socket#bind on SOCK_DGRAM socket" do end after :each do - @sock.closed?.should be_false + @sock.closed?.should == false @sock.close end it "binds to a port" do - lambda { @sock.bind(@sockaddr) }.should_not raise_error + -> { @sock.bind(@sockaddr) }.should_not.raise end it "returns 0 if successful" do @@ -23,19 +23,20 @@ describe "Socket#bind on SOCK_DGRAM socket" do it "raises Errno::EINVAL when already bound" do @sock.bind(@sockaddr) - lambda { @sock.bind(@sockaddr) }.should raise_error(Errno::EINVAL) + -> { @sock.bind(@sockaddr) }.should.raise(Errno::EINVAL) end it "raises Errno::EADDRNOTAVAIL when the specified sockaddr is not available from the local machine" do sockaddr1 = Socket.pack_sockaddr_in(0, "4.3.2.1") - lambda { @sock.bind(sockaddr1) }.should raise_error(Errno::EADDRNOTAVAIL) + -> { @sock.bind(sockaddr1) }.should.raise(Errno::EADDRNOTAVAIL) end platform_is_not :windows, :cygwin do as_user do + break if File.read('/proc/sys/net/ipv4/ip_unprivileged_port_start').to_i <= 1 rescue nil it "raises Errno::EACCES when the current user does not have permission to bind" do sockaddr1 = Socket.pack_sockaddr_in(1, "127.0.0.1") - lambda { @sock.bind(sockaddr1) }.should raise_error(Errno::EACCES) + -> { @sock.bind(sockaddr1) }.should.raise(Errno::EACCES) end end end @@ -49,12 +50,12 @@ describe "Socket#bind on SOCK_STREAM socket" do end after :each do - @sock.closed?.should be_false + @sock.closed?.should == false @sock.close end it "binds to a port" do - lambda { @sock.bind(@sockaddr) }.should_not raise_error + -> { @sock.bind(@sockaddr) }.should_not.raise end it "returns 0 if successful" do @@ -64,19 +65,20 @@ describe "Socket#bind on SOCK_STREAM socket" do it "raises Errno::EINVAL when already bound" do @sock.bind(@sockaddr) - lambda { @sock.bind(@sockaddr) }.should raise_error(Errno::EINVAL) + -> { @sock.bind(@sockaddr) }.should.raise(Errno::EINVAL) end it "raises Errno::EADDRNOTAVAIL when the specified sockaddr is not available from the local machine" do sockaddr1 = Socket.pack_sockaddr_in(0, "4.3.2.1") - lambda { @sock.bind(sockaddr1) }.should raise_error(Errno::EADDRNOTAVAIL) + -> { @sock.bind(sockaddr1) }.should.raise(Errno::EADDRNOTAVAIL) end platform_is_not :windows, :cygwin do as_user do + break if File.read('/proc/sys/net/ipv4/ip_unprivileged_port_start').to_i <= 1 rescue nil it "raises Errno::EACCES when the current user does not have permission to bind" do sockaddr1 = Socket.pack_sockaddr_in(1, "127.0.0.1") - lambda { @sock.bind(sockaddr1) }.should raise_error(Errno::EACCES) + -> { @sock.bind(sockaddr1) }.should.raise(Errno::EACCES) end end end @@ -101,21 +103,25 @@ describe 'Socket#bind' do it 'raises Errno::EINVAL when binding to an already bound port' do @socket.bind(@sockaddr) - lambda { @socket.bind(@sockaddr) }.should raise_error(Errno::EINVAL) + -> { @socket.bind(@sockaddr) }.should.raise(Errno::EINVAL) end it 'raises Errno::EADDRNOTAVAIL when the specified sockaddr is not available' do ip = family == Socket::AF_INET ? '4.3.2.1' : '::2' sockaddr1 = Socket.sockaddr_in(0, ip) - lambda { @socket.bind(sockaddr1) }.should raise_error(Errno::EADDRNOTAVAIL) + -> { @socket.bind(sockaddr1) }.should.raise(Errno::EADDRNOTAVAIL) end platform_is_not :windows do - it 'raises Errno::EACCES when the user is not allowed to bind to the port' do - sockaddr1 = Socket.pack_sockaddr_in(1, ip_address) + as_user do + break if File.read('/proc/sys/net/ipv4/ip_unprivileged_port_start').to_i <= 1 rescue nil - lambda { @socket.bind(sockaddr1); }.should raise_error(Errno::EACCES) + it 'raises Errno::EACCES when the user is not allowed to bind to the port' do + sockaddr1 = Socket.pack_sockaddr_in(1, ip_address) + + -> { @socket.bind(sockaddr1) }.should.raise(Errno::EACCES) + end end end end @@ -132,7 +138,7 @@ describe 'Socket#bind' do it 'binds to an Addrinfo' do @socket.bind(@addr).should == 0 - @socket.local_address.should be_an_instance_of(Addrinfo) + @socket.local_address.should.instance_of?(Addrinfo) end it 'uses a new Addrinfo for the local address' do diff --git a/spec/ruby/library/socket/socket/connect_nonblock_spec.rb b/spec/ruby/library/socket/socket/connect_nonblock_spec.rb index 0012b5ada7..dac24e3e5b 100644 --- a/spec/ruby/library/socket/socket/connect_nonblock_spec.rb +++ b/spec/ruby/library/socket/socket/connect_nonblock_spec.rb @@ -16,52 +16,50 @@ describe "Socket#connect_nonblock" do @thread.join if @thread end - platform_is_not :solaris do - it "connects the socket to the remote side" do - port = nil - accept = false - @thread = Thread.new do - server = TCPServer.new(@hostname, 0) - port = server.addr[1] - Thread.pass until accept - conn = server.accept - conn << "hello!" - conn.close - server.close - end + it "connects the socket to the remote side" do + port = nil + accept = false + @thread = Thread.new do + server = TCPServer.new(@hostname, 0) + port = server.addr[1] + Thread.pass until accept + conn = server.accept + conn << "hello!" + conn.close + server.close + end - Thread.pass until port + Thread.pass until port - addr = Socket.sockaddr_in(port, @hostname) - begin - @socket.connect_nonblock(addr) - rescue Errno::EINPROGRESS - end - - accept = true - IO.select nil, [@socket] + addr = Socket.sockaddr_in(port, @hostname) + begin + @socket.connect_nonblock(addr) + rescue Errno::EINPROGRESS + end - begin - @socket.connect_nonblock(addr) - rescue Errno::EISCONN - # Not all OS's use this errno, so we trap and ignore it - end + accept = true + IO.select nil, [@socket] - @socket.read(6).should == "hello!" + begin + @socket.connect_nonblock(addr) + rescue Errno::EISCONN + # Not all OS's use this errno, so we trap and ignore it end + + @socket.read(6).should == "hello!" end - platform_is_not :freebsd, :solaris, :aix do + platform_is_not :freebsd, :aix do it "raises Errno::EINPROGRESS when the connect would block" do - lambda do + -> do @socket.connect_nonblock(@addr) - end.should raise_error(Errno::EINPROGRESS) + end.should.raise(Errno::EINPROGRESS) end it "raises Errno::EINPROGRESS with IO::WaitWritable mixed in when the connect would block" do - lambda do + -> do @socket.connect_nonblock(@addr) - end.should raise_error(IO::WaitWritable) + end.should.raise(IO::WaitWritable) end it "returns :wait_writable in exceptionless mode when the connect would block" do @@ -95,29 +93,53 @@ describe 'Socket#connect_nonblock' do end it 'raises TypeError when passed an Integer' do - lambda { @client.connect_nonblock(666) }.should raise_error(TypeError) + -> { @client.connect_nonblock(666) }.should.raise(TypeError) end end - platform_is_not :freebsd, :solaris do - describe 'using a STREAM socket' do - before do - @server = Socket.new(family, :STREAM) - @client = Socket.new(family, :STREAM) - @sockaddr = Socket.sockaddr_in(0, ip_address) + describe 'using a STREAM socket' do + before do + @server = Socket.new(family, :STREAM) + @client = Socket.new(family, :STREAM) + @sockaddr = Socket.sockaddr_in(0, ip_address) + end + + after do + @client.close + @server.close + end + + platform_is_not :windows do + it 'raises Errno::EISCONN when already connected' do + @server.listen(1) + @client.connect(@server.connect_address).should == 0 + + -> { + @client.connect_nonblock(@server.connect_address) + + # A second call needed if non-blocking sockets become default + # XXX honestly I don't expect any real code to care about this spec + # as it's too implementation-dependent and checking for connect() + # errors is futile anyways because of TOCTOU + @client.connect_nonblock(@server.connect_address) + }.should.raise(Errno::EISCONN) end - after do - @client.close - @server.close + it 'returns 0 when already connected in exceptionless mode' do + @server.listen(1) + @client.connect(@server.connect_address).should == 0 + + @client.connect_nonblock(@server.connect_address, exception: false).should == 0 end + end + platform_is_not :freebsd do it 'raises IO:EINPROGRESSWaitWritable when the connection would block' do @server.bind(@sockaddr) - lambda { - @client.connect_nonblock(@server.getsockname) - }.should raise_error(IO::EINPROGRESSWaitWritable) + -> { + @client.connect_nonblock(@server.connect_address) + }.should.raise(IO::EINPROGRESSWaitWritable) end end end diff --git a/spec/ruby/library/socket/socket/connect_spec.rb b/spec/ruby/library/socket/socket/connect_spec.rb index e26bf39cbb..c928b66c53 100644 --- a/spec/ruby/library/socket/socket/connect_spec.rb +++ b/spec/ruby/library/socket/socket/connect_spec.rb @@ -32,9 +32,15 @@ describe 'Socket#connect' do @client.connect(@server.getsockname).should == 0 - lambda { + -> { @client.connect(@server.getsockname) - }.should raise_error(Errno::EISCONN) + + # A second call needed if non-blocking sockets become default + # XXX honestly I don't expect any real code to care about this spec + # as it's too implementation-dependent and checking for connect() + # errors is futile anyways because of TOCTOU + @client.connect(@server.getsockname) + }.should.raise(Errno::EISCONN) end platform_is_not :darwin do @@ -47,4 +53,26 @@ describe 'Socket#connect' do end end end + + ruby_version_is "3.4" do + it "fails with timeout" do + # TEST-NET-1 IP address are reserved for documentation and example purposes. + address = Socket.pack_sockaddr_in(1, "192.0.2.1") + + client = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM) + client.timeout = 0 + + -> { + begin + client.connect(address) + rescue Errno::ECONNREFUSED + skip "Outgoing packets may be filtered" + rescue Errno::ENETUNREACH + skip "Off line" + end + }.should.raise(IO::TimeoutError) + ensure + client.close + end + end end diff --git a/spec/ruby/library/socket/socket/getaddrinfo_spec.rb b/spec/ruby/library/socket/socket/getaddrinfo_spec.rb index e0eff3cef4..7e5bdc9b25 100644 --- a/spec/ruby/library/socket/socket/getaddrinfo_spec.rb +++ b/spec/ruby/library/socket/socket/getaddrinfo_spec.rb @@ -11,7 +11,7 @@ describe "Socket.getaddrinfo" do BasicSocket.do_not_reverse_lookup = @do_not_reverse_lookup end - platform_is_not :solaris, :windows do + platform_is_not :windows do it "gets the address information" do expected = [] # The check for AP_INET6's class is needed because ipaddr.rb adds @@ -43,7 +43,7 @@ describe "Socket.getaddrinfo" do addrinfo.each do |a| case a.last when Socket::IPPROTO_UDP, Socket::IPPROTO_TCP - expected.should include(a) + expected.should.include?(a) else # don't check this. It's some weird protocol we don't know about # so we can't spec it. @@ -90,7 +90,7 @@ describe "Socket.getaddrinfo" do ["AF_INET6", 9, "::", "::", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP], ["AF_INET6", 9, "0:0:0:0:0:0:0:0", "0:0:0:0:0:0:0:0", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP] ] - res.each { |a| expected.should include(a) } + res.each { |a| expected.should.include?(a) } end it "accepts empty addresses for IPv6 non-passive sockets" do @@ -104,7 +104,15 @@ describe "Socket.getaddrinfo" do ["AF_INET6", 9, "::1", "::1", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP], ["AF_INET6", 9, "0:0:0:0:0:0:0:1", "0:0:0:0:0:0:0:1", Socket::AF_INET6, Socket::SOCK_STREAM, Socket::IPPROTO_TCP] ] - res.each { |a| expected.should include(a) } + res.each { |a| expected.should.include?(a) } + end + + it "raises ResolutionError when fails to resolve address" do + -> { + Socket.getaddrinfo("www.kame.net", 80, "AF_UNIX") + }.should.raise(Socket::ResolutionError) { |e| + [Socket::EAI_FAMILY, Socket::EAI_FAIL].should.include?(e.error_code) + } end end end @@ -112,7 +120,7 @@ end describe 'Socket.getaddrinfo' do describe 'without global reverse lookups' do it 'returns an Array' do - Socket.getaddrinfo(nil, 'ftp').should be_an_instance_of(Array) + Socket.getaddrinfo(nil, 'ftp').should.instance_of?(Array) end it 'accepts an Integer as the address family' do @@ -123,8 +131,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '127.0.0.1' array[3].should == '127.0.0.1' array[4].should == Socket::AF_INET - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts an Integer as the address family using IPv6' do @@ -135,8 +143,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '::1' array[3].should == '::1' array[4].should == Socket::AF_INET6 - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts a Symbol as the address family' do @@ -147,8 +155,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '127.0.0.1' array[3].should == '127.0.0.1' array[4].should == Socket::AF_INET - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts a Symbol as the address family using IPv6' do @@ -159,8 +167,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '::1' array[3].should == '::1' array[4].should == Socket::AF_INET6 - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts a String as the address family' do @@ -171,8 +179,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '127.0.0.1' array[3].should == '127.0.0.1' array[4].should == Socket::AF_INET - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts a String as the address family using IPv6' do @@ -183,8 +191,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '::1' array[3].should == '::1' array[4].should == Socket::AF_INET6 - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts an object responding to #to_str as the host' do @@ -199,8 +207,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '127.0.0.1' array[3].should == '127.0.0.1' array[4].should == Socket::AF_INET - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts an object responding to #to_str as the address family' do @@ -215,8 +223,8 @@ describe 'Socket.getaddrinfo' do array[2].should == '127.0.0.1' array[3].should == '127.0.0.1' array[4].should == Socket::AF_INET - array[5].should be_kind_of(Integer) - array[6].should be_kind_of(Integer) + array[5].should.is_a?(Integer) + array[6].should.is_a?(Integer) end it 'accepts an Integer as the socket type' do @@ -229,7 +237,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end it 'accepts a Symbol as the socket type' do @@ -242,7 +250,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end it 'accepts a String as the socket type' do @@ -255,7 +263,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end it 'accepts an object responding to #to_str as the socket type' do @@ -272,7 +280,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end platform_is_not :windows do @@ -286,7 +294,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_DGRAM, ] - [0, Socket::IPPROTO_UDP].should include(proto) + [0, Socket::IPPROTO_UDP].should.include?(proto) end end @@ -301,7 +309,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end it 'performs a reverse lookup when the reverse_lookup argument is true' do @@ -311,7 +319,7 @@ describe 'Socket.getaddrinfo' do addr[0].should == 'AF_INET' addr[1].should == 21 - addr[2].should be_an_instance_of(String) + addr[2].should.instance_of?(String) addr[2].should_not == addr[3] addr[3].should == '127.0.0.1' @@ -324,7 +332,7 @@ describe 'Socket.getaddrinfo' do addr[0].should == 'AF_INET' addr[1].should == 21 - addr[2].should be_an_instance_of(String) + addr[2].should.instance_of?(String) addr[2].should_not == addr[3] addr[3].should == '127.0.0.1' @@ -341,7 +349,7 @@ describe 'Socket.getaddrinfo' do Socket::AF_INET, Socket::SOCK_STREAM, ] - [0, Socket::IPPROTO_TCP].should include(proto) + [0, Socket::IPPROTO_TCP].should.include?(proto) end end @@ -364,7 +372,7 @@ describe 'Socket.getaddrinfo' do # We don't have control over this value and there's no way to test this # without relying on Socket.getaddrinfo()'s own behaviour (meaning this # test would faily any way of the method was not implemented correctly). - addr[2].should be_an_instance_of(String) + addr[2].should.instance_of?(String) addr[2].should_not == addr[3] addr[3].should == '127.0.0.1' diff --git a/spec/ruby/library/socket/socket/gethostbyaddr_spec.rb b/spec/ruby/library/socket/socket/gethostbyaddr_spec.rb index 639a318132..bf6d63dbe9 100644 --- a/spec/ruby/library/socket/socket/gethostbyaddr_spec.rb +++ b/spec/ruby/library/socket/socket/gethostbyaddr_spec.rb @@ -10,26 +10,23 @@ describe 'Socket.gethostbyaddr' do describe 'without an explicit address family' do it 'returns an Array' do - Socket.gethostbyaddr(@addr).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr) }.should.instance_of?(Array) end describe 'the returned Array' do before do - @array = Socket.gethostbyaddr(@addr) + @array = suppress_warning { Socket.gethostbyaddr(@addr) } end - # RubyCI Solaris 11x defines 127.0.0.1 as unstable11x - platform_is_not :"solaris2.11" do - it 'includes the hostname as the first value' do - @array[0].should == SocketSpecs.hostname_reverse_lookup - end + it 'includes the hostname as the first value' do + @array[0].should == SocketSpecs.hostname_reverse_lookup end it 'includes the aliases as the 2nd value' do - @array[1].should be_an_instance_of(Array) + @array[1].should.instance_of?(Array) @array[1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end @@ -41,7 +38,7 @@ describe 'Socket.gethostbyaddr' do @array[3].should == @addr @array[4..-1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end end @@ -49,15 +46,15 @@ describe 'Socket.gethostbyaddr' do describe 'with an explicit address family' do it 'returns an Array when using an Integer as the address family' do - Socket.gethostbyaddr(@addr, Socket::AF_INET).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr, Socket::AF_INET) }.should.instance_of?(Array) end it 'returns an Array when using a Symbol as the address family' do - Socket.gethostbyaddr(@addr, :INET).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr, :INET) }.should.instance_of?(Array) end it 'raises SocketError when the address is not supported by the family' do - lambda { Socket.gethostbyaddr(@addr, :INET6) }.should raise_error(SocketError) + -> { suppress_warning { Socket.gethostbyaddr(@addr, :INET6) } }.should.raise(SocketError) end end end @@ -70,12 +67,12 @@ describe 'Socket.gethostbyaddr' do describe 'without an explicit address family' do it 'returns an Array' do - Socket.gethostbyaddr(@addr).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr) }.should.instance_of?(Array) end describe 'the returned Array' do before do - @array = Socket.gethostbyaddr(@addr) + @array = suppress_warning { Socket.gethostbyaddr(@addr) } end it 'includes the hostname as the first value' do @@ -83,10 +80,10 @@ describe 'Socket.gethostbyaddr' do end it 'includes the aliases as the 2nd value' do - @array[1].should be_an_instance_of(Array) + @array[1].should.instance_of?(Array) @array[1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end @@ -95,10 +92,10 @@ describe 'Socket.gethostbyaddr' do end it 'includes all address strings as the remaining values' do - @array[3].should be_an_instance_of(String) + @array[3].should.instance_of?(String) @array[4..-1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end end @@ -106,16 +103,16 @@ describe 'Socket.gethostbyaddr' do describe 'with an explicit address family' do it 'returns an Array when using an Integer as the address family' do - Socket.gethostbyaddr(@addr, Socket::AF_INET6).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr, Socket::AF_INET6) }.should.instance_of?(Array) end it 'returns an Array when using a Symbol as the address family' do - Socket.gethostbyaddr(@addr, :INET6).should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyaddr(@addr, :INET6) }.should.instance_of?(Array) end - platform_is_not :windows do + platform_is_not :windows, :wsl do it 'raises SocketError when the address is not supported by the family' do - lambda { Socket.gethostbyaddr(@addr, :INET) }.should raise_error(SocketError) + -> { suppress_warning { Socket.gethostbyaddr(@addr, :INET) } }.should.raise(SocketError) end end end diff --git a/spec/ruby/library/socket/socket/gethostbyname_spec.rb b/spec/ruby/library/socket/socket/gethostbyname_spec.rb index 9367030e25..326fe26094 100644 --- a/spec/ruby/library/socket/socket/gethostbyname_spec.rb +++ b/spec/ruby/library/socket/socket/gethostbyname_spec.rb @@ -1,27 +1,27 @@ -# -*- encoding: binary -*- +# encoding: binary require_relative '../spec_helper' require_relative '../fixtures/classes' -describe "Socket#gethostbyname" do +describe "Socket.gethostbyname" do it "returns broadcast address info for '<broadcast>'" do - addr = Socket.gethostbyname('<broadcast>'); - addr.should == ["255.255.255.255", [], 2, "\377\377\377\377"] + addr = suppress_warning { Socket.gethostbyname('<broadcast>') } + addr.should == ["255.255.255.255", [], 2, "\xFF\xFF\xFF\xFF"] end it "returns broadcast address info for '<any>'" do - addr = Socket.gethostbyname('<any>'); - addr.should == ["0.0.0.0", [], 2, "\000\000\000\000"] + addr = suppress_warning { Socket.gethostbyname('<any>') } + addr.should == ["0.0.0.0", [], 2, "\x00\x00\x00\x00"] end end describe 'Socket.gethostbyname' do it 'returns an Array' do - Socket.gethostbyname('127.0.0.1').should be_an_instance_of(Array) + suppress_warning { Socket.gethostbyname('127.0.0.1') }.should.instance_of?(Array) end describe 'the returned Array' do before do - @array = Socket.gethostbyname('127.0.0.1') + @array = suppress_warning { Socket.gethostbyname('127.0.0.1') } end it 'includes the hostname as the first value' do @@ -29,10 +29,10 @@ describe 'Socket.gethostbyname' do end it 'includes the aliases as the 2nd value' do - @array[1].should be_an_instance_of(Array) + @array[1].should.instance_of?(Array) @array[1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end @@ -43,10 +43,10 @@ describe 'Socket.gethostbyname' do end it 'includes the address strings as the remaining values' do - @array[3].should be_an_instance_of(String) + @array[3].should.instance_of?(String) @array[4..-1].each do |val| - val.should be_an_instance_of(String) + val.should.instance_of?(String) end end end @@ -54,7 +54,7 @@ describe 'Socket.gethostbyname' do describe 'using <broadcast> as the input address' do describe 'the returned Array' do before do - @addr = Socket.gethostbyname('<broadcast>') + @addr = suppress_warning { Socket.gethostbyname('<broadcast>') } end it 'includes the broadcast address as the first value' do @@ -74,7 +74,7 @@ describe 'Socket.gethostbyname' do describe 'using <any> as the input address' do describe 'the returned Array' do before do - @addr = Socket.gethostbyname('<any>') + @addr = suppress_warning { Socket.gethostbyname('<any>') } end it 'includes the wildcard address as the first value' do @@ -94,7 +94,7 @@ describe 'Socket.gethostbyname' do describe 'using an IPv4 address' do describe 'the returned Array' do before do - @addr = Socket.gethostbyname('127.0.0.1') + @addr = suppress_warning { Socket.gethostbyname('127.0.0.1') } end it 'includes the IP address as the first value' do @@ -115,7 +115,7 @@ describe 'Socket.gethostbyname' do describe 'using an IPv6 address' do describe 'the returned Array' do before do - @addr = Socket.gethostbyname('::1') + @addr = suppress_warning { Socket.gethostbyname('::1') } end it 'includes the IP address as the first value' do diff --git a/spec/ruby/library/socket/socket/gethostname_spec.rb b/spec/ruby/library/socket/socket/gethostname_spec.rb index 4b79747b27..dfca7cf5cd 100644 --- a/spec/ruby/library/socket/socket/gethostname_spec.rb +++ b/spec/ruby/library/socket/socket/gethostname_spec.rb @@ -2,7 +2,17 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "Socket.gethostname" do + def system_hostname + if platform_is_not :windows + # `uname -n` is the most portable way to get the hostname, as it is a POSIX standard: + `uname -n`.strip + else + # Windows does not have uname, so we use hostname instead: + `hostname`.strip + end + end + it "returns the host name" do - Socket.gethostname.should == `hostname`.strip + Socket.gethostname.should == system_hostname end end diff --git a/spec/ruby/library/socket/socket/getifaddrs_spec.rb b/spec/ruby/library/socket/socket/getifaddrs_spec.rb index 7df542abe6..1b326605c8 100644 --- a/spec/ruby/library/socket/socket/getifaddrs_spec.rb +++ b/spec/ruby/library/socket/socket/getifaddrs_spec.rb @@ -1,23 +1,23 @@ require_relative '../spec_helper' -platform_is_not :aix, :"solaris2.10" do +platform_is_not :aix do describe 'Socket.getifaddrs' do before do @ifaddrs = Socket.getifaddrs end it 'returns an Array' do - @ifaddrs.should be_an_instance_of(Array) + @ifaddrs.should.instance_of?(Array) end describe 'the returned Array' do it 'should not be empty' do - @ifaddrs.should_not be_empty + @ifaddrs.should_not.empty? end it 'contains instances of Socket::Ifaddr' do @ifaddrs.each do |ifaddr| - ifaddr.should be_an_instance_of(Socket::Ifaddr) + ifaddr.should.instance_of?(Socket::Ifaddr) end end end @@ -25,19 +25,19 @@ describe 'Socket.getifaddrs' do describe 'each returned Socket::Ifaddr' do it 'has an interface index' do @ifaddrs.each do |ifaddr| - ifaddr.ifindex.should be_kind_of(Integer) + ifaddr.ifindex.should.is_a?(Integer) end end it 'has an interface name' do @ifaddrs.each do |ifaddr| - ifaddr.name.should be_an_instance_of(String) + ifaddr.name.should.instance_of?(String) end end it 'has a set of flags' do @ifaddrs.each do |ifaddr| - ifaddr.flags.should be_kind_of(Integer) + ifaddr.flags.should.is_a?(Integer) end end end @@ -49,17 +49,17 @@ describe 'Socket.getifaddrs' do it 'is an Addrinfo' do @addrs.all? do |addr| - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) true - end.should be_true + end.should == true end it 'has an address family' do @addrs.all? do |addr| - addr.afamily.should be_kind_of(Integer) + addr.afamily.should.is_a?(Integer) addr.afamily.should_not == Socket::AF_UNSPEC true - end.should be_true + end.should == true end end @@ -71,17 +71,17 @@ describe 'Socket.getifaddrs' do it 'is an Addrinfo' do @addrs.all? do |addr| - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) true - end.should be_true + end.should == true end it 'has an address family' do @addrs.all? do |addr| - addr.afamily.should be_kind_of(Integer) + addr.afamily.should.is_a?(Integer) addr.afamily.should_not == Socket::AF_UNSPEC true - end.should be_true + end.should == true end end @@ -92,24 +92,24 @@ describe 'Socket.getifaddrs' do it 'is an Addrinfo' do @addrs.all? do |addr| - addr.should be_an_instance_of(Addrinfo) + addr.should.instance_of?(Addrinfo) true - end.should be_true + end.should == true end it 'has an address family' do @addrs.all? do |addr| - addr.afamily.should be_kind_of(Integer) + addr.afamily.should.is_a?(Integer) addr.afamily.should_not == Socket::AF_UNSPEC true - end.should be_true + end.should == true end it 'has an IP address' do @addrs.all? do |addr| - addr.ip_address.should be_an_instance_of(String) + addr.ip_address.should.instance_of?(String) true - end.should be_true + end.should == true end end end diff --git a/spec/ruby/library/socket/socket/getnameinfo_spec.rb b/spec/ruby/library/socket/socket/getnameinfo_spec.rb index fbbbcb53c5..d0b77004de 100644 --- a/spec/ruby/library/socket/socket/getnameinfo_spec.rb +++ b/spec/ruby/library/socket/socket/getnameinfo_spec.rb @@ -60,6 +60,14 @@ describe "Socket.getnameinfo" do name_info = Socket.getnameinfo ["AF_INET", 9, 'foo', '127.0.0.1'] name_info[1].should == 'discard' end + + it "raises ResolutionError when fails to resolve address" do + -> { + Socket.getnameinfo(["AF_UNIX", 80, "0.0.0.0"]) + }.should.raise(Socket::ResolutionError) { |e| + [Socket::EAI_FAMILY, Socket::EAI_FAIL].should.include?(e.error_code) + } + end end describe 'Socket.getnameinfo' do @@ -69,8 +77,8 @@ describe 'Socket.getnameinfo' do end it 'raises SocketError or TypeError when using an invalid String' do - lambda { Socket.getnameinfo('cats') }.should raise_error(Exception) { |e| - [SocketError, TypeError].should include(e.class) + -> { Socket.getnameinfo('cats') }.should.raise(Exception) { |e| + (e.is_a?(SocketError) || e.is_a?(TypeError)).should == true } end @@ -102,7 +110,7 @@ describe 'Socket.getnameinfo' do end it 'raises ArgumentError when using an invalid Array' do - lambda { Socket.getnameinfo([family_name]) }.should raise_error(ArgumentError) + -> { Socket.getnameinfo([family_name]) }.should.raise(ArgumentError) end platform_is_not :windows do @@ -122,7 +130,7 @@ describe 'Socket.getnameinfo' do describe 'without custom flags' do it 'returns an Array containing the hostname and service name' do array = Socket.getnameinfo(@addr) - array.should be_an_instance_of(Array) + array.should.instance_of?(Array) array[0].should == @hostname array[1].should == 'ftp' end @@ -131,7 +139,7 @@ describe 'Socket.getnameinfo' do addr = [family_name, 21, ip_address, nil] array = Socket.getnameinfo(addr) - array.should be_an_instance_of(Array) + array.should.instance_of?(Array) array[0].should == @hostname array[1].should == 'ftp' end diff --git a/spec/ruby/library/socket/socket/getservbyname_spec.rb b/spec/ruby/library/socket/socket/getservbyname_spec.rb index 9479b26228..4a88444fff 100644 --- a/spec/ruby/library/socket/socket/getservbyname_spec.rb +++ b/spec/ruby/library/socket/socket/getservbyname_spec.rb @@ -27,6 +27,6 @@ describe "Socket#getservbyname" do end it "raises a SocketError when the service or port is invalid" do - lambda { Socket.getservbyname('invalid') }.should raise_error(SocketError) + -> { Socket.getservbyname('invalid') }.should.raise(SocketError) end end diff --git a/spec/ruby/library/socket/socket/getservbyport_spec.rb b/spec/ruby/library/socket/socket/getservbyport_spec.rb index 9be2ac527e..7e4b75fa52 100644 --- a/spec/ruby/library/socket/socket/getservbyport_spec.rb +++ b/spec/ruby/library/socket/socket/getservbyport_spec.rb @@ -18,6 +18,6 @@ describe 'Socket.getservbyport' do end it 'raises SocketError for an unknown port number' do - lambda { Socket.getservbyport(0) }.should raise_error(SocketError) + -> { Socket.getservbyport(0) }.should.raise(SocketError) end end diff --git a/spec/ruby/library/socket/socket/initialize_spec.rb b/spec/ruby/library/socket/socket/initialize_spec.rb index 2343c6e289..a8fb1c61fa 100644 --- a/spec/ruby/library/socket/socket/initialize_spec.rb +++ b/spec/ruby/library/socket/socket/initialize_spec.rb @@ -13,7 +13,7 @@ describe 'Socket#initialize' do it 'returns a Socket' do @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end end @@ -21,7 +21,7 @@ describe 'Socket#initialize' do it 'returns a Socket' do @socket = Socket.new(:INET, :STREAM) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end end @@ -29,7 +29,7 @@ describe 'Socket#initialize' do it 'returns a Socket' do @socket = Socket.new('INET', 'STREAM') - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end end @@ -43,7 +43,7 @@ describe 'Socket#initialize' do @socket = Socket.new(family, type) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'raises TypeError when the #to_str method does not return a String' do @@ -53,7 +53,7 @@ describe 'Socket#initialize' do family.stub!(:to_str).and_return(Socket::AF_INET) type.stub!(:to_str).and_return(Socket::SOCK_STREAM) - lambda { Socket.new(family, type) }.should raise_error(TypeError) + -> { Socket.new(family, type) }.should.raise(TypeError) end end @@ -61,11 +61,11 @@ describe 'Socket#initialize' do it 'returns a Socket when using an Integer' do @socket = Socket.new(:INET, :STREAM, Socket::IPPROTO_TCP) - @socket.should be_an_instance_of(Socket) + @socket.should.instance_of?(Socket) end it 'raises TypeError when using a Symbol' do - lambda { Socket.new(:INET, :STREAM, :TCP) }.should raise_error(TypeError) + -> { Socket.new(:INET, :STREAM, :TCP) }.should.raise(TypeError) end end @@ -82,6 +82,6 @@ describe 'Socket#initialize' do it "sets the socket to binary mode" do @socket = Socket.new(:INET, :STREAM) - @socket.binmode?.should be_true + @socket.binmode?.should == true end end diff --git a/spec/ruby/library/socket/socket/ip_address_list_spec.rb b/spec/ruby/library/socket/socket/ip_address_list_spec.rb index f97c2d7f85..2c4e008af1 100644 --- a/spec/ruby/library/socket/socket/ip_address_list_spec.rb +++ b/spec/ruby/library/socket/socket/ip_address_list_spec.rb @@ -2,7 +2,7 @@ require_relative '../spec_helper' describe 'Socket.ip_address_list' do it 'returns an Array' do - Socket.ip_address_list.should be_an_instance_of(Array) + Socket.ip_address_list.should.instance_of?(Array) end describe 'the returned Array' do @@ -11,12 +11,12 @@ describe 'Socket.ip_address_list' do end it 'is not empty' do - @array.should_not be_empty + @array.should_not.empty? end it 'contains Addrinfo objects' do @array.each do |klass| - klass.should be_an_instance_of(Addrinfo) + klass.should.instance_of?(Addrinfo) end end end @@ -28,8 +28,8 @@ describe 'Socket.ip_address_list' do it 'has a non-empty IP address' do @array.each do |addr| - addr.ip_address.should be_an_instance_of(String) - addr.ip_address.should_not be_empty + addr.ip_address.should.instance_of?(String) + addr.ip_address.should_not.empty? end end diff --git a/spec/ruby/library/socket/socket/listen_spec.rb b/spec/ruby/library/socket/socket/listen_spec.rb index d0f9c70c4e..7986a0225c 100644 --- a/spec/ruby/library/socket/socket/listen_spec.rb +++ b/spec/ruby/library/socket/socket/listen_spec.rb @@ -7,7 +7,7 @@ describe "Socket#listen" do end after :each do - @socket.closed?.should be_false + @socket.closed?.should == false @socket.close end @@ -34,8 +34,10 @@ describe 'Socket#listen' do @server.close end - it 'raises Errno::EOPNOTSUPP' do - lambda { @server.listen(1) }.should raise_error(Errno::EOPNOTSUPP) + it 'raises Errno::EOPNOTSUPP or Errno::EACCES' do + -> { @server.listen(1) }.should.raise { |e| + [Errno::EOPNOTSUPP, Errno::EACCES].should.include?(e.class) + } end end @@ -57,7 +59,7 @@ describe 'Socket#listen' do end it "raises when the given argument can't be coerced to an Integer" do - lambda { @server.listen('cats') }.should raise_error(TypeError) + -> { @server.listen('cats') }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/socket/local_address_spec.rb b/spec/ruby/library/socket/socket/local_address_spec.rb index 3687f93a0c..86b053fc3e 100644 --- a/spec/ruby/library/socket/socket/local_address_spec.rb +++ b/spec/ruby/library/socket/socket/local_address_spec.rb @@ -10,7 +10,7 @@ describe 'Socket#local_address' do end it 'returns an Addrinfo' do - @sock.local_address.should be_an_instance_of(Addrinfo) + @sock.local_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/socket/new_spec.rb b/spec/ruby/library/socket/socket/new_spec.rb deleted file mode 100644 index b2ec607f6a..0000000000 --- a/spec/ruby/library/socket/socket/new_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../spec_helper' -require_relative '../fixtures/classes' diff --git a/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb b/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb index 63d4724453..ef2a2d4ba9 100644 --- a/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb +++ b/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb @@ -2,6 +2,6 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' require_relative '../shared/pack_sockaddr' -describe "Socket#pack_sockaddr_in" do +describe "Socket.pack_sockaddr_in" do it_behaves_like :socket_pack_sockaddr_in, :pack_sockaddr_in end diff --git a/spec/ruby/library/socket/socket/pair_spec.rb b/spec/ruby/library/socket/socket/pair_spec.rb index 292eacd38d..8dd470a95e 100644 --- a/spec/ruby/library/socket/socket/pair_spec.rb +++ b/spec/ruby/library/socket/socket/pair_spec.rb @@ -2,6 +2,6 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' require_relative '../shared/socketpair' -describe "Socket#pair" do +describe "Socket.pair" do it_behaves_like :socket_socketpair, :pair end diff --git a/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb b/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb index c1239ae637..ab29435a1d 100644 --- a/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb +++ b/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb @@ -16,7 +16,7 @@ describe 'Socket#recvfrom_nonblock' do platform_is_not :windows do describe 'using an unbound socket' do it 'raises IO::WaitReadable' do - lambda { @server.recvfrom_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @server.recvfrom_nonblock(1) }.should.raise(IO::WaitReadable) end end end @@ -29,33 +29,56 @@ describe 'Socket#recvfrom_nonblock' do describe 'without any data available' do it 'raises IO::WaitReadable' do - lambda { @server.recvfrom_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @server.recvfrom_nonblock(1) }.should.raise(IO::WaitReadable) + end + + it 'returns :wait_readable with exception: false' do + @server.recvfrom_nonblock(1, exception: false).should == :wait_readable end end describe 'with data available' do before do @client.write('hello') - - platform_is(:darwin, :freebsd) { IO.select([@server]) } end platform_is_not :windows do it 'returns an Array containing the data and an Addrinfo' do + IO.select([@server]) ret = @server.recvfrom_nonblock(1) - ret.should be_an_instance_of(Array) + ret.should.instance_of?(Array) ret.length.should == 2 end end + it "allows an output buffer as third argument" do + @client.write('hello') + + IO.select([@server]) + buffer = +'' + message, = @server.recvfrom_nonblock(5, 0, buffer) + + message.should.equal?(buffer) + buffer.should == 'hello' + end + + it "preserves the encoding of the given buffer" do + @client.write('hello') + + IO.select([@server]) + buffer = ''.encode(Encoding::ISO_8859_1) + @server.recvfrom_nonblock(5, 0, buffer) + + buffer.encoding.should == Encoding::ISO_8859_1 + end + describe 'the returned data' do it 'is the same as the sent data' do 5.times do @client.write('hello') - platform_is(:darwin, :freebsd) { IO.select([@server]) } - + IO.select([@server]) msg, _ = @server.recvfrom_nonblock(5) msg.should == 'hello' @@ -66,6 +89,7 @@ describe 'Socket#recvfrom_nonblock' do platform_is_not :windows do describe 'the returned Array' do before do + IO.select([@server]) @array = @server.recvfrom_nonblock(1) end @@ -74,12 +98,13 @@ describe 'Socket#recvfrom_nonblock' do end it 'contains an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end end describe 'the returned Addrinfo' do before do + IO.select([@server]) @addr = @server.recvfrom_nonblock(1)[1] end @@ -112,3 +137,52 @@ describe 'Socket#recvfrom_nonblock' do end end end + +describe 'Socket#recvfrom_nonblock' do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = Socket.new Socket::AF_INET, :STREAM, 0 + @sockaddr = Socket.sockaddr_in(0, "127.0.0.1") + @server.bind(@sockaddr) + @server.listen(1) + + server_ip = @server.local_address.ip_port + @server_addr = Socket.sockaddr_in(server_ip, "127.0.0.1") + + @client = Socket.new(Socket::AF_INET, :STREAM, 0) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns nil on a closed stream socket" do + ready = false + + t = Thread.new do + client, _ = @server.accept + + Thread.pass while !ready + begin + client.recvfrom_nonblock(10) + rescue IO::EAGAINWaitReadable + retry + end + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + @client.connect(@server_addr) + @client.close + ready = true + + t.value.should == nil + end + end + end +end diff --git a/spec/ruby/library/socket/socket/recvfrom_spec.rb b/spec/ruby/library/socket/socket/recvfrom_spec.rb index 7f0714511c..0f319fc47c 100644 --- a/spec/ruby/library/socket/socket/recvfrom_spec.rb +++ b/spec/ruby/library/socket/socket/recvfrom_spec.rb @@ -15,7 +15,7 @@ describe 'Socket#recvfrom' do describe 'using an unbound socket' do it 'blocks the caller' do - lambda { @server.recvfrom(1) }.should block_caller + -> { @server.recvfrom(1) }.should block_caller end end @@ -27,7 +27,7 @@ describe 'Socket#recvfrom' do describe 'without any data available' do it 'blocks the caller' do - lambda { @server.recvfrom(1) }.should block_caller + -> { @server.recvfrom(1) }.should block_caller end end @@ -39,7 +39,7 @@ describe 'Socket#recvfrom' do it 'returns an Array containing the data and an Addrinfo' do ret = @server.recvfrom(1) - ret.should be_an_instance_of(Array) + ret.should.instance_of?(Array) ret.length.should == 2 end @@ -53,7 +53,7 @@ describe 'Socket#recvfrom' do end it 'contains an Addrinfo at index 1' do - @array[1].should be_an_instance_of(Addrinfo) + @array[1].should.instance_of?(Addrinfo) end end @@ -90,3 +90,68 @@ describe 'Socket#recvfrom' do end end end + +describe 'Socket#recvfrom' do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = Socket.new Socket::AF_INET, :STREAM, 0 + sockaddr = Socket.sockaddr_in(0, "127.0.0.1") + @server.bind(sockaddr) + @server.listen(1) + + server_ip = @server.local_address.ip_port + @server_addr = Socket.sockaddr_in(server_ip, "127.0.0.1") + + @client = Socket.new(Socket::AF_INET, :STREAM, 0) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns nil on a closed stream socket" do + t = Thread.new do + client, _ = @server.accept + client.recvfrom(10) + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + @client.connect(@server_addr) + @client.close + + t.value.should == nil + end + end + + describe "datagram socket" do + SocketSpecs.each_ip_protocol do |family, ip_address| + before :each do + @server = Socket.new(family, :DGRAM) + @client = Socket.new(family, :DGRAM) + end + + after :each do + @server.close unless @server.closed? + @client.close unless @client.closed? + end + + it "returns an empty String as received data" do + @server.bind(Socket.sockaddr_in(0, ip_address)) + @client.connect(@server.getsockname) + + @client.send('', 0) + message = @server.recvfrom(1) + + message.should.is_a? Array + message[0].should == "" + end + end + end + end +end diff --git a/spec/ruby/library/socket/socket/remote_address_spec.rb b/spec/ruby/library/socket/socket/remote_address_spec.rb index 24d60d7f58..f72ec50ed7 100644 --- a/spec/ruby/library/socket/socket/remote_address_spec.rb +++ b/spec/ruby/library/socket/socket/remote_address_spec.rb @@ -22,7 +22,7 @@ describe 'Socket#remote_address' do end it 'returns an Addrinfo' do - @client.remote_address.should be_an_instance_of(Addrinfo) + @client.remote_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/socket/socketpair_spec.rb b/spec/ruby/library/socket/socket/socketpair_spec.rb index 5b8311124e..551c376d49 100644 --- a/spec/ruby/library/socket/socket/socketpair_spec.rb +++ b/spec/ruby/library/socket/socket/socketpair_spec.rb @@ -2,6 +2,6 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' require_relative '../shared/socketpair' -describe "Socket#socketpair" do +describe "Socket.socketpair" do it_behaves_like :socket_socketpair, :socketpair end diff --git a/spec/ruby/library/socket/socket/sysaccept_spec.rb b/spec/ruby/library/socket/socket/sysaccept_spec.rb index f039096707..3e7078f745 100644 --- a/spec/ruby/library/socket/socket/sysaccept_spec.rb +++ b/spec/ruby/library/socket/socket/sysaccept_spec.rb @@ -15,7 +15,7 @@ describe 'Socket#sysaccept' do platform_is :linux do # hangs on other platforms describe 'using an unbound socket' do it 'raises Errno::EINVAL' do - lambda { @server.sysaccept }.should raise_error(Errno::EINVAL) + -> { @server.sysaccept }.should.raise(Errno::EINVAL) end end @@ -25,7 +25,7 @@ describe 'Socket#sysaccept' do end it 'raises Errno::EINVAL' do - lambda { @server.sysaccept }.should raise_error(Errno::EINVAL) + -> { @server.sysaccept }.should.raise(Errno::EINVAL) end end end @@ -59,9 +59,7 @@ describe 'Socket#sysaccept' do @client.connect(@server_addr) - thread.join(5) - - thread.value.should be_an_instance_of(Array) + thread.value.should.instance_of?(Array) end end @@ -78,8 +76,8 @@ describe 'Socket#sysaccept' do it 'returns an Array containing an Integer and an Addrinfo' do @fd, addrinfo = @server.sysaccept - @fd.should be_kind_of(Integer) - addrinfo.should be_an_instance_of(Addrinfo) + @fd.should.is_a?(Integer) + addrinfo.should.instance_of?(Addrinfo) end it 'returns a new file descriptor' do diff --git a/spec/ruby/library/socket/socket/tcp_server_loop_spec.rb b/spec/ruby/library/socket/socket/tcp_server_loop_spec.rb index 617e3d445c..4e39d01d72 100644 --- a/spec/ruby/library/socket/socket/tcp_server_loop_spec.rb +++ b/spec/ruby/library/socket/socket/tcp_server_loop_spec.rb @@ -4,14 +4,14 @@ require_relative '../fixtures/classes' describe 'Socket.tcp_server_loop' do describe 'when no connections are available' do it 'blocks the caller' do - lambda { Socket.tcp_server_loop('127.0.0.1', 0) }.should block_caller + -> { Socket.tcp_server_loop('127.0.0.1', 0) }.should block_caller end end describe 'when a connection is available' do before do @client = Socket.new(:INET, :STREAM) - @port = 9998 + SocketSpecs::ServerLoopPortFinder.cleanup end after do @@ -23,7 +23,7 @@ describe 'Socket.tcp_server_loop' do @sock, addr = nil thread = Thread.new do - Socket.tcp_server_loop('127.0.0.1', @port) do |socket, addrinfo| + SocketSpecs::ServerLoopPortFinder.tcp_server_loop('127.0.0.1', 0) do |socket, addrinfo| @sock = socket addr = addrinfo @@ -31,17 +31,24 @@ describe 'Socket.tcp_server_loop' do end end - SocketSpecs.wait_until_success do - @client.connect(Socket.sockaddr_in(@port, '127.0.0.1')) + port = SocketSpecs::ServerLoopPortFinder.port + + SocketSpecs.loop_with_timeout do + begin + @client.connect(Socket.sockaddr_in(port, '127.0.0.1')) + rescue SystemCallError + sleep 0.01 + :retry + end end # At this point the connection has been set up but the thread may not yet # have returned, thus we'll need to wait a little longer for it to # complete. - thread.join(2) + thread.join - @sock.should be_an_instance_of(Socket) - addr.should be_an_instance_of(Addrinfo) + @sock.should.instance_of?(Socket) + addr.should.instance_of?(Addrinfo) end end end diff --git a/spec/ruby/library/socket/socket/tcp_server_sockets_spec.rb b/spec/ruby/library/socket/socket/tcp_server_sockets_spec.rb index 10c030a8ce..b6cdb3c583 100644 --- a/spec/ruby/library/socket/socket/tcp_server_sockets_spec.rb +++ b/spec/ruby/library/socket/socket/tcp_server_sockets_spec.rb @@ -13,16 +13,16 @@ describe 'Socket.tcp_server_sockets' do it 'returns an Array of Socket objects' do @sockets = Socket.tcp_server_sockets(0) - @sockets.should be_an_instance_of(Array) - @sockets[0].should be_an_instance_of(Socket) + @sockets.should.instance_of?(Array) + @sockets[0].should.instance_of?(Socket) end end describe 'with a block' do it 'yields the sockets to the supplied block' do Socket.tcp_server_sockets(0) do |sockets| - sockets.should be_an_instance_of(Array) - sockets[0].should be_an_instance_of(Socket) + sockets.should.instance_of?(Array) + sockets[0].should.instance_of?(Socket) end end @@ -32,7 +32,7 @@ describe 'Socket.tcp_server_sockets' do Socket.tcp_server_sockets(0) { |socks| sockets = socks } sockets.each do |socket| - socket.closed?.should == true + socket.should.closed? end end end diff --git a/spec/ruby/library/socket/socket/tcp_spec.rb b/spec/ruby/library/socket/socket/tcp_spec.rb index 29f166ffc5..cc3c9381c7 100644 --- a/spec/ruby/library/socket/socket/tcp_spec.rb +++ b/spec/ruby/library/socket/socket/tcp_spec.rb @@ -22,12 +22,12 @@ describe 'Socket.tcp' do it 'returns a Socket when no block is given' do @client = Socket.tcp(@host, @port) - @client.should be_an_instance_of(Socket) + @client.should.instance_of?(Socket) end it 'yields the Socket when a block is given' do Socket.tcp(@host, @port) do |socket| - socket.should be_an_instance_of(Socket) + socket.should.instance_of?(Socket) end end @@ -36,7 +36,7 @@ describe 'Socket.tcp' do @socket = socket end - @socket.closed?.should == true + @socket.should.closed? end it 'binds to a local address and port when specified' do @@ -49,22 +49,40 @@ describe 'Socket.tcp' do end it 'raises ArgumentError when 6 arguments are provided' do - lambda { + -> { Socket.tcp(@host, @port, @host, 0, {:connect_timeout => 1}, 10) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it 'connects to the server' do @client = Socket.tcp(@host, @port) - @client.write('hello') - connection, _ = @server.accept - begin connection.recv(5).should == 'hello' ensure connection.close end end + + ruby_version_is "4.0" do + it 'connects to the server when passed open_timeout argument' do + @client = Socket.tcp(@host, @port, open_timeout: 60) + @client.write('open_timeout') + connection, _ = @server.accept + begin + connection.recv(12).should == 'open_timeout' + ensure + connection.close + end + end + + it 'raises Errno::ETIMEDOUT with :open_timeout when no server is listening on the given address' do + -> { + Socket.tcp("192.0.2.1", 80, open_timeout: 0) + }.should.raise(Errno::ETIMEDOUT) + rescue Errno::ENETUNREACH + skip "all network interfaces down" + end + end end diff --git a/spec/ruby/library/socket/socket/udp_server_loop_on_spec.rb b/spec/ruby/library/socket/socket/udp_server_loop_on_spec.rb index 1cb82d72be..9197509f1f 100644 --- a/spec/ruby/library/socket/socket/udp_server_loop_on_spec.rb +++ b/spec/ruby/library/socket/socket/udp_server_loop_on_spec.rb @@ -13,7 +13,7 @@ describe 'Socket.udp_server_loop_on' do describe 'when no connections are available' do it 'blocks the caller' do - lambda { Socket.udp_server_loop_on([@server]) }.should block_caller + -> { Socket.udp_server_loop_on([@server]) }.should block_caller end end @@ -41,7 +41,7 @@ describe 'Socket.udp_server_loop_on' do end msg.should == 'hello' - src.should be_an_instance_of(Socket::UDPSource) + src.should.instance_of?(Socket::UDPSource) end end end diff --git a/spec/ruby/library/socket/socket/udp_server_loop_spec.rb b/spec/ruby/library/socket/socket/udp_server_loop_spec.rb index 95f73a5c35..d44d522c20 100644 --- a/spec/ruby/library/socket/socket/udp_server_loop_spec.rb +++ b/spec/ruby/library/socket/socket/udp_server_loop_spec.rb @@ -4,14 +4,14 @@ require_relative '../fixtures/classes' describe 'Socket.udp_server_loop' do describe 'when no connections are available' do it 'blocks the caller' do - lambda { Socket.udp_server_loop('127.0.0.1', 0) }.should block_caller + -> { Socket.udp_server_loop('127.0.0.1', 0) }.should block_caller end end describe 'when a connection is available' do before do @client = Socket.new(:INET, :DGRAM) - @port = 9997 + SocketSpecs::ServerLoopPortFinder.cleanup end after do @@ -21,8 +21,8 @@ describe 'Socket.udp_server_loop' do it 'yields the message and a Socket::UDPSource' do msg, src = nil - Thread.new do - Socket.udp_server_loop('127.0.0.1', @port) do |message, source| + thread = Thread.new do + SocketSpecs::ServerLoopPortFinder.udp_server_loop('127.0.0.1', 0) do |message, source| msg = message src = source @@ -30,18 +30,30 @@ describe 'Socket.udp_server_loop' do end end + port = SocketSpecs::ServerLoopPortFinder.port + # Because this will return even if the server is up and running (it's UDP # after all) we'll have to write and wait until "msg" is set. - @client.connect(Socket.sockaddr_in(@port, '127.0.0.1')) + @client.connect(Socket.sockaddr_in(port, '127.0.0.1')) SocketSpecs.loop_with_timeout do - SocketSpecs.wait_until_success { @client.write('hello') } - - break if msg + begin + @client.write('hello') + rescue SystemCallError + sleep 0.01 + :retry + else + unless msg + sleep 0.001 + :retry + end + end end + thread.join + msg.should == 'hello' - src.should be_an_instance_of(Socket::UDPSource) + src.should.instance_of?(Socket::UDPSource) end end end diff --git a/spec/ruby/library/socket/socket/udp_server_recv_spec.rb b/spec/ruby/library/socket/socket/udp_server_recv_spec.rb index f7165dd25d..34e2280558 100644 --- a/spec/ruby/library/socket/socket/udp_server_recv_spec.rb +++ b/spec/ruby/library/socket/socket/udp_server_recv_spec.rb @@ -15,24 +15,21 @@ describe 'Socket.udp_server_recv' do end it 'yields the message and a Socket::UDPSource' do - msg = nil - src = nil + msg = :unset + src = :unset @client.write('hello') - # FreeBSD sockets are not instanteous over loopback and - # will EAGAIN on recv. - platform_is :darwin, :freebsd do - IO.select([@server]) - end + readable, _, _ = IO.select([@server]) + readable.size.should == 1 - Socket.udp_server_recv([@server]) do |message, source| + Socket.udp_server_recv(readable) do |message, source| msg = message src = source break end msg.should == 'hello' - src.should be_an_instance_of(Socket::UDPSource) + src.should.instance_of?(Socket::UDPSource) end end diff --git a/spec/ruby/library/socket/socket/udp_server_sockets_spec.rb b/spec/ruby/library/socket/socket/udp_server_sockets_spec.rb index 3aeb472dda..cb357977d6 100644 --- a/spec/ruby/library/socket/socket/udp_server_sockets_spec.rb +++ b/spec/ruby/library/socket/socket/udp_server_sockets_spec.rb @@ -13,16 +13,16 @@ describe 'Socket.udp_server_sockets' do it 'returns an Array of Socket objects' do @sockets = Socket.udp_server_sockets(0) - @sockets.should be_an_instance_of(Array) - @sockets[0].should be_an_instance_of(Socket) + @sockets.should.instance_of?(Array) + @sockets[0].should.instance_of?(Socket) end end describe 'with a block' do it 'yields the sockets to the supplied block' do Socket.udp_server_sockets(0) do |sockets| - sockets.should be_an_instance_of(Array) - sockets[0].should be_an_instance_of(Socket) + sockets.should.instance_of?(Array) + sockets[0].should.instance_of?(Socket) end end @@ -32,7 +32,7 @@ describe 'Socket.udp_server_sockets' do Socket.udp_server_sockets(0) { |socks| sockets = socks } sockets.each do |socket| - socket.closed?.should == true + socket.should.closed? end end end diff --git a/spec/ruby/library/socket/socket/unix_server_loop_spec.rb b/spec/ruby/library/socket/socket/unix_server_loop_spec.rb index 52c535cd45..9d35a995bc 100644 --- a/spec/ruby/library/socket/socket/unix_server_loop_spec.rb +++ b/spec/ruby/library/socket/socket/unix_server_loop_spec.rb @@ -1,51 +1,56 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'Socket.unix_server_loop' do +describe 'Socket.unix_server_loop' do + before do + @path = SocketSpecs.socket_path + end + + after do + rm_r(@path) if File.file?(@path) + end + + describe 'when no connections are available' do + it 'blocks the caller' do + -> { Socket.unix_server_loop(@path) }.should block_caller + end + end + + describe 'when a connection is available' do before do - @path = SocketSpecs.socket_path + @client = nil end after do - rm_r(@path) if File.file?(@path) + @sock.close if @sock + @client.close if @client end - describe 'when no connections are available' do - it 'blocks the caller' do - lambda { Socket.unix_server_loop(@path) }.should block_caller - end - end + it 'yields a Socket and an Addrinfo' do + @sock, addr = nil - describe 'when a connection is available' do - before do - @client = nil - end + thread = Thread.new do + Socket.unix_server_loop(@path) do |socket, addrinfo| + @sock = socket + addr = addrinfo - after do - @sock.close if @sock - @client.close if @client + break + end end - it 'yields a Socket and an Addrinfo' do - @sock, addr = nil - - thread = Thread.new do - Socket.unix_server_loop(@path) do |socket, addrinfo| - @sock = socket - addr = addrinfo - - break - end + SocketSpecs.loop_with_timeout do + begin + @client = Socket.unix(@path) + rescue SystemCallError + sleep 0.01 + :retry end + end - @client = SocketSpecs.wait_until_success { Socket.unix(@path) } - - thread.join(2) + thread.join - @sock.should be_an_instance_of(Socket) - addr.should be_an_instance_of(Addrinfo) - end + @sock.should.instance_of?(Socket) + addr.should.instance_of?(Addrinfo) end end end diff --git a/spec/ruby/library/socket/socket/unix_server_socket_spec.rb b/spec/ruby/library/socket/socket/unix_server_socket_spec.rb index fc357740fa..da9671bf8c 100644 --- a/spec/ruby/library/socket/socket/unix_server_socket_spec.rb +++ b/spec/ruby/library/socket/socket/unix_server_socket_spec.rb @@ -1,48 +1,46 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'Socket.unix_server_socket' do +describe 'Socket.unix_server_socket' do + before do + @path = SocketSpecs.socket_path + end + + after do + rm_r(@path) + end + + describe 'when no block is given' do before do - @path = SocketSpecs.socket_path + @socket = nil end after do - rm_r(@path) + @socket.close end - describe 'when no block is given' do - before do - @socket = nil - end - - after do - @socket.close - end + it 'returns a Socket' do + @socket = Socket.unix_server_socket(@path) - it 'returns a Socket' do - @socket = Socket.unix_server_socket(@path) - - @socket.should be_an_instance_of(Socket) - end + @socket.should.instance_of?(Socket) end + end - describe 'when a block is given' do - it 'yields a Socket' do - Socket.unix_server_socket(@path) do |sock| - sock.should be_an_instance_of(Socket) - end + describe 'when a block is given' do + it 'yields a Socket' do + Socket.unix_server_socket(@path) do |sock| + sock.should.instance_of?(Socket) end + end - it 'closes the Socket when the block returns' do - socket = nil - - Socket.unix_server_socket(@path) do |sock| - socket = sock - end + it 'closes the Socket when the block returns' do + socket = nil - socket.should be_an_instance_of(Socket) + Socket.unix_server_socket(@path) do |sock| + socket = sock end + + socket.should.instance_of?(Socket) end end end diff --git a/spec/ruby/library/socket/socket/unix_spec.rb b/spec/ruby/library/socket/socket/unix_spec.rb index add54a097d..87f4938871 100644 --- a/spec/ruby/library/socket/socket/unix_spec.rb +++ b/spec/ruby/library/socket/socket/unix_spec.rb @@ -1,45 +1,43 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'Socket.unix' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - @socket = nil - end +describe 'Socket.unix' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + @socket = nil + end - after do - @server.close - @socket.close if @socket + after do + @server.close + @socket.close if @socket - rm_r(@path) - end + rm_r(@path) + end - describe 'when no block is given' do - it 'returns a Socket' do - @socket = Socket.unix(@path) + describe 'when no block is given' do + it 'returns a Socket' do + @socket = Socket.unix(@path) - @socket.should be_an_instance_of(Socket) - end + @socket.should.instance_of?(Socket) end + end - describe 'when a block is given' do - it 'yields a Socket' do - Socket.unix(@path) do |sock| - sock.should be_an_instance_of(Socket) - end + describe 'when a block is given' do + it 'yields a Socket' do + Socket.unix(@path) do |sock| + sock.should.instance_of?(Socket) end + end - it 'closes the Socket when the block returns' do - socket = nil - - Socket.unix(@path) do |sock| - socket = sock - end + it 'closes the Socket when the block returns' do + socket = nil - socket.closed?.should == true + Socket.unix(@path) do |sock| + socket = sock end + + socket.should.closed? end end end diff --git a/spec/ruby/library/socket/socket/unpack_sockaddr_in_spec.rb b/spec/ruby/library/socket/socket/unpack_sockaddr_in_spec.rb index 579ae307df..35d46b0fd0 100644 --- a/spec/ruby/library/socket/socket/unpack_sockaddr_in_spec.rb +++ b/spec/ruby/library/socket/socket/unpack_sockaddr_in_spec.rb @@ -32,15 +32,13 @@ describe "Socket.unpack_sockaddr_in" do end end - with_feature :unix_socket do - it "raises an ArgumentError when the sin_family is not AF_INET" do - sockaddr = Socket.sockaddr_un '/tmp/x' - lambda { Socket.unpack_sockaddr_in sockaddr }.should raise_error(ArgumentError) - end + it "raises an ArgumentError when the sin_family is not AF_INET" do + sockaddr = Socket.sockaddr_un '/tmp/x' + -> { Socket.unpack_sockaddr_in sockaddr }.should.raise(ArgumentError) + end - it "raises an ArgumentError when passed addrinfo is not AF_INET/AF_INET6" do - addrinfo = Addrinfo.unix('/tmp/sock') - lambda { Socket.unpack_sockaddr_in(addrinfo) }.should raise_error(ArgumentError) - end + it "raises an ArgumentError when passed addrinfo is not AF_INET/AF_INET6" do + addrinfo = Addrinfo.unix('/tmp/sock') + -> { Socket.unpack_sockaddr_in(addrinfo) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/socket/socket/unpack_sockaddr_un_spec.rb b/spec/ruby/library/socket/socket/unpack_sockaddr_un_spec.rb index 39e33c90e9..85a941cfc2 100644 --- a/spec/ruby/library/socket/socket/unpack_sockaddr_un_spec.rb +++ b/spec/ruby/library/socket/socket/unpack_sockaddr_un_spec.rb @@ -1,26 +1,24 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'Socket.unpack_sockaddr_un' do - it 'decodes sockaddr to unix path' do - sockaddr = Socket.sockaddr_un('/tmp/sock') - Socket.unpack_sockaddr_un(sockaddr).should == '/tmp/sock' - end +describe 'Socket.unpack_sockaddr_un' do + it 'decodes sockaddr to unix path' do + sockaddr = Socket.sockaddr_un('/tmp/sock') + Socket.unpack_sockaddr_un(sockaddr).should == '/tmp/sock' + end - it 'returns unix path from a passed Addrinfo' do - addrinfo = Addrinfo.unix('/tmp/sock') - Socket.unpack_sockaddr_un(addrinfo).should == '/tmp/sock' - end + it 'returns unix path from a passed Addrinfo' do + addrinfo = Addrinfo.unix('/tmp/sock') + Socket.unpack_sockaddr_un(addrinfo).should == '/tmp/sock' + end - it 'raises an ArgumentError when the sin_family is not AF_UNIX' do - sockaddr = Socket.sockaddr_in(0, '127.0.0.1') - lambda { Socket.unpack_sockaddr_un(sockaddr) }.should raise_error(ArgumentError) - end + it 'raises an ArgumentError when the sa_family is not AF_UNIX' do + sockaddr = Socket.sockaddr_in(0, '127.0.0.1') + -> { Socket.unpack_sockaddr_un(sockaddr) }.should.raise(ArgumentError) + end - it 'raises an ArgumentError when passed addrinfo is not AF_UNIX' do - addrinfo = Addrinfo.tcp('127.0.0.1', 0) - lambda { Socket.unpack_sockaddr_un(addrinfo) }.should raise_error(ArgumentError) - end + it 'raises an ArgumentError when passed addrinfo is not AF_UNIX' do + addrinfo = Addrinfo.tcp('127.0.0.1', 0) + -> { Socket.unpack_sockaddr_un(addrinfo) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/socket/spec_helper.rb b/spec/ruby/library/socket/spec_helper.rb index 8976937ac7..86f3a61086 100644 --- a/spec/ruby/library/socket/spec_helper.rb +++ b/spec/ruby/library/socket/spec_helper.rb @@ -1,17 +1,14 @@ require_relative '../../spec_helper' require 'socket' -if %w[rbx truffleruby].include?(RUBY_ENGINE) - MSpec.enable_feature :pure_ruby_addrinfo -end - -MSpec.enable_feature :sock_packet if Socket.const_defined?(:SOCK_PACKET) -MSpec.enable_feature :unix_socket unless PlatformGuard.windows? -MSpec.enable_feature :udp_cork if Socket.const_defined?(:UDP_CORK) -MSpec.enable_feature :tcp_cork if Socket.const_defined?(:TCP_CORK) -MSpec.enable_feature :pktinfo if Socket.const_defined?(:IP_PKTINFO) -MSpec.enable_feature :ipv6_pktinfo if Socket.const_defined?(:IPV6_PKTINFO) -MSpec.enable_feature :ip_mtu if Socket.const_defined?(:IP_MTU) -MSpec.enable_feature :ipv6_nexthop if Socket.const_defined?(:IPV6_NEXTHOP) -MSpec.enable_feature :tcp_info if Socket.const_defined?(:TCP_INFO) -MSpec.enable_feature :ancillary_data if Socket.const_defined?(:AncillaryData) +# We force enable all features on Linux because anyway Linux implements all these features, +# and we want a constant number of spec examples across Ruby implementations, even if they don't define these constants. +MSpec.enable_feature :sock_packet if platform_is(:linux) || Socket.const_defined?(:SOCK_PACKET) +MSpec.enable_feature :udp_cork if platform_is(:linux) || Socket.const_defined?(:UDP_CORK) +MSpec.enable_feature :tcp_cork if platform_is(:linux) || Socket.const_defined?(:TCP_CORK) +MSpec.enable_feature :pktinfo if platform_is(:linux) || Socket.const_defined?(:IP_PKTINFO) +MSpec.enable_feature :ipv6_pktinfo if platform_is(:linux) || Socket.const_defined?(:IPV6_PKTINFO) +MSpec.enable_feature :ip_mtu if platform_is(:linux) || Socket.const_defined?(:IP_MTU) +MSpec.enable_feature :ipv6_nexthop if platform_is(:linux) || Socket.const_defined?(:IPV6_NEXTHOP) +MSpec.enable_feature :tcp_info if platform_is(:linux) || Socket.const_defined?(:TCP_INFO) +MSpec.enable_feature :ancillary_data if platform_is(:linux) || Socket.const_defined?(:AncillaryData) diff --git a/spec/ruby/library/socket/tcpserver/accept_nonblock_spec.rb b/spec/ruby/library/socket/tcpserver/accept_nonblock_spec.rb index 27d6a0d08e..ac08fe37c6 100644 --- a/spec/ruby/library/socket/tcpserver/accept_nonblock_spec.rb +++ b/spec/ruby/library/socket/tcpserver/accept_nonblock_spec.rb @@ -13,19 +13,19 @@ describe "Socket::TCPServer.accept_nonblock" do it "accepts non blocking connections" do @server.listen(5) - lambda { + -> { @server.accept_nonblock - }.should raise_error(IO::WaitReadable) + }.should.raise(IO::WaitReadable) c = TCPSocket.new("127.0.0.1", @port) - sleep 0.1 + IO.select([@server]) s = @server.accept_nonblock port, address = Socket.unpack_sockaddr_in(s.getsockname) port.should == @port address.should == "127.0.0.1" - s.should be_kind_of(TCPSocket) + s.should.is_a?(TCPSocket) c.close s.close @@ -33,12 +33,12 @@ describe "Socket::TCPServer.accept_nonblock" do it "raises an IOError if the socket is closed" do @server.close - lambda { @server.accept }.should raise_error(IOError) + -> { @server.accept }.should.raise(IOError) end describe 'without a connected client' do it 'raises error' do - lambda { @server.accept_nonblock }.should raise_error(IO::WaitReadable) + -> { @server.accept_nonblock }.should.raise(IO::WaitReadable) end it 'returns :wait_readable in exceptionless mode' do @@ -59,7 +59,7 @@ describe 'TCPServer#accept_nonblock' do describe 'without a connected client' do it 'raises IO::WaitReadable' do - lambda { @server.accept_nonblock }.should raise_error(IO::WaitReadable) + -> { @server.accept_nonblock }.should.raise(IO::WaitReadable) end end @@ -75,8 +75,9 @@ describe 'TCPServer#accept_nonblock' do end it 'returns a TCPSocket' do + IO.select([@server]) @socket = @server.accept_nonblock - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) end end end diff --git a/spec/ruby/library/socket/tcpserver/accept_spec.rb b/spec/ruby/library/socket/tcpserver/accept_spec.rb index f0ef9cc727..f2aa0bf8e1 100644 --- a/spec/ruby/library/socket/tcpserver/accept_spec.rb +++ b/spec/ruby/library/socket/tcpserver/accept_spec.rb @@ -15,7 +15,7 @@ describe "TCPServer#accept" do data = nil t = Thread.new do client = @server.accept - client.should be_kind_of(TCPSocket) + client.should.is_a?(TCPSocket) data = client.read(5) client << "goodbye" client.close @@ -50,7 +50,7 @@ describe "TCPServer#accept" do t = Thread.new { -> { @server.accept - }.should raise_error(Exception, "interrupted") + }.should.raise(Exception, "interrupted") } Thread.pass while t.status and t.status != "sleep" @@ -58,9 +58,29 @@ describe "TCPServer#accept" do t.join end + it "is automatically retried when interrupted by SIGVTALRM" do + t = Thread.new do + client = @server.accept + value = client.read(2) + client.close + value + end + + Thread.pass while t.status and t.status != "sleep" + # Thread#backtrace uses SIGVTALRM on TruffleRuby and potentially other implementations. + # Sending a signal to a thread is not possible with Ruby APIs. + t.backtrace.join("\n").should =~ /in [`'](?:TCPServer#)?accept'/ + + socket = TCPSocket.new('127.0.0.1', @port) + socket.write("OK") + socket.close + + t.value.should == "OK" + end + it "raises an IOError if the socket is closed" do @server.close - lambda { @server.accept }.should raise_error(IOError) + -> { @server.accept }.should.raise(IOError) end end @@ -76,7 +96,7 @@ describe 'TCPServer#accept' do describe 'without a connected client' do it 'blocks the caller' do - lambda { @server.accept }.should block_caller + -> { @server.accept }.should block_caller end end @@ -92,7 +112,20 @@ describe 'TCPServer#accept' do it 'returns a TCPSocket' do @socket = @server.accept - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) + end + + platform_is_not :windows do + it "returns a TCPSocket which is set to nonblocking" do + require 'io/nonblock' + @socket = @server.accept + @socket.should.nonblock? + end + end + + it "returns a TCPSocket which is set to close on exec" do + @socket = @server.accept + @socket.should.close_on_exec? end end end diff --git a/spec/ruby/library/socket/tcpserver/gets_spec.rb b/spec/ruby/library/socket/tcpserver/gets_spec.rb index 936295dce2..72a72fa2dc 100644 --- a/spec/ruby/library/socket/tcpserver/gets_spec.rb +++ b/spec/ruby/library/socket/tcpserver/gets_spec.rb @@ -11,6 +11,6 @@ describe "TCPServer#gets" do end it "raises Errno::ENOTCONN on gets" do - lambda { @server.gets }.should raise_error(Errno::ENOTCONN) + -> { @server.gets }.should.raise(Errno::ENOTCONN) end end diff --git a/spec/ruby/library/socket/tcpserver/initialize_spec.rb b/spec/ruby/library/socket/tcpserver/initialize_spec.rb index 412bdbfb9d..517b014edc 100644 --- a/spec/ruby/library/socket/tcpserver/initialize_spec.rb +++ b/spec/ruby/library/socket/tcpserver/initialize_spec.rb @@ -12,7 +12,7 @@ describe 'TCPServer#initialize' do end it 'sets the port to the given argument' do - @server.local_address.ip_port.should be_kind_of(Integer) + @server.local_address.ip_port.should.is_a?(Integer) @server.local_address.ip_port.should > 0 end @@ -24,7 +24,7 @@ describe 'TCPServer#initialize' do end it "sets the socket to binmode" do - @server.binmode?.should be_true + @server.binmode?.should == true end end @@ -38,7 +38,7 @@ describe 'TCPServer#initialize' do end it 'sets the port to the given argument' do - @server.local_address.ip_port.should be_kind_of(Integer) + @server.local_address.ip_port.should.is_a?(Integer) @server.local_address.ip_port.should > 0 end @@ -52,7 +52,7 @@ describe 'TCPServer#initialize' do describe 'with a single String argument containing a non numeric value' do it 'raises SocketError' do - lambda { TCPServer.new('cats') }.should raise_error(SocketError) + -> { TCPServer.new('cats') }.should.raise(SocketError) end end @@ -67,7 +67,7 @@ describe 'TCPServer#initialize' do end it 'sets the port to the given port argument' do - @server.local_address.ip_port.should be_kind_of(Integer) + @server.local_address.ip_port.should.is_a?(Integer) @server.local_address.ip_port.should > 0 end @@ -90,7 +90,7 @@ describe 'TCPServer#initialize' do end it 'sets the port to the given port argument' do - @server.local_address.ip_port.should be_kind_of(Integer) + @server.local_address.ip_port.should.is_a?(Integer) @server.local_address.ip_port.should > 0 end diff --git a/spec/ruby/library/socket/tcpserver/listen_spec.rb b/spec/ruby/library/socket/tcpserver/listen_spec.rb index e266decd61..5b046ef6f7 100644 --- a/spec/ruby/library/socket/tcpserver/listen_spec.rb +++ b/spec/ruby/library/socket/tcpserver/listen_spec.rb @@ -16,7 +16,7 @@ describe 'TCPServer#listen' do end it "raises when the given argument can't be coerced to an Integer" do - lambda { @server.listen('cats') }.should raise_error(TypeError) + -> { @server.listen('cats') }.should.raise(TypeError) end end end diff --git a/spec/ruby/library/socket/tcpserver/new_spec.rb b/spec/ruby/library/socket/tcpserver/new_spec.rb index 4717b95a2c..70b8d4352e 100644 --- a/spec/ruby/library/socket/tcpserver/new_spec.rb +++ b/spec/ruby/library/socket/tcpserver/new_spec.rb @@ -10,7 +10,7 @@ describe "TCPServer.new" do @server = TCPServer.new('127.0.0.1', 0) addr = @server.addr addr[0].should == 'AF_INET' - addr[1].should be_kind_of(Integer) + addr[1].should.is_a?(Integer) # on some platforms (Mac), MRI # returns comma at the end. addr[2].should =~ /^#{SocketSpecs.hostname}\b/ @@ -20,7 +20,7 @@ describe "TCPServer.new" do it "binds to localhost and a port with either IPv4 or IPv6" do @server = TCPServer.new(SocketSpecs.hostname, 0) addr = @server.addr - addr[1].should be_kind_of(Integer) + addr[1].should.is_a?(Integer) if addr[0] == 'AF_INET' addr[2].should =~ /^#{SocketSpecs.hostname}\b/ addr[3].should == '127.0.0.1' @@ -34,36 +34,77 @@ describe "TCPServer.new" do @server = TCPServer.new('', 0) addr = @server.addr addr[0].should == 'AF_INET' - addr[1].should be_kind_of(Integer) + addr[1].should.is_a?(Integer) addr[2].should == '0.0.0.0' addr[3].should == '0.0.0.0' end it "binds to INADDR_ANY if the hostname is empty and the port is a string" do - @server = TCPServer.new('', 0) + @server = TCPServer.new('', '0') + addr = @server.addr + addr[0].should == 'AF_INET' + addr[1].should.is_a?(Integer) + addr[2].should == '0.0.0.0' + addr[3].should == '0.0.0.0' + end + + it "binds to a port if the port is explicitly nil" do + @server = TCPServer.new('', nil) + addr = @server.addr + addr[0].should == 'AF_INET' + addr[1].should.is_a?(Integer) + addr[2].should == '0.0.0.0' + addr[3].should == '0.0.0.0' + end + + it "binds to a port if the port is an empty string" do + @server = TCPServer.new('', '') addr = @server.addr addr[0].should == 'AF_INET' - addr[1].should be_kind_of(Integer) + addr[1].should.is_a?(Integer) addr[2].should == '0.0.0.0' addr[3].should == '0.0.0.0' end it "coerces port to string, then determines port from that number or service name" do - lambda { TCPServer.new(SocketSpecs.hostname, Object.new) }.should raise_error(TypeError) + -> { TCPServer.new(SocketSpecs.hostname, Object.new) }.should.raise(TypeError) port = Object.new port.should_receive(:to_str).and_return("0") @server = TCPServer.new(SocketSpecs.hostname, port) addr = @server.addr - addr[1].should be_kind_of(Integer) + addr[1].should.is_a?(Integer) # TODO: This should also accept strings like 'https', but I don't know how to # pick such a service port that will be able to reliably bind... end + it "has a single argument form and treats it as a port number" do + @server = TCPServer.new(0) + addr = @server.addr + addr[1].should.is_a?(Integer) + end + + it "coerces port to a string when it is the only argument" do + -> { TCPServer.new(Object.new) }.should.raise(TypeError) + + port = Object.new + port.should_receive(:to_str).and_return("0") + + @server = TCPServer.new(port) + addr = @server.addr + addr[1].should.is_a?(Integer) + end + + it "does not use the given block and warns to use TCPServer::open" do + -> { + @server = TCPServer.new(0) { raise } + }.should complain(/warning: TCPServer::new\(\) does not take block; use TCPServer::open\(\) instead/) + end + it "raises Errno::EADDRNOTAVAIL when the address is unknown" do - lambda { TCPServer.new("1.2.3.4", 0) }.should raise_error(Errno::EADDRNOTAVAIL) + -> { TCPServer.new("1.2.3.4", 0) }.should.raise(Errno::EADDRNOTAVAIL) end # There is no way to make this fail-proof on all machines, because @@ -71,17 +112,17 @@ describe "TCPServer.new" do # traditionally invalidly named ones. quarantine! do it "raises a SocketError when the host is unknown" do - lambda { + -> { TCPServer.new("--notavalidname", 0) - }.should raise_error(SocketError) + }.should.raise(SocketError) end end it "raises Errno::EADDRINUSE when address is already in use" do @server = TCPServer.new('127.0.0.1', 0) - lambda { + -> { @server = TCPServer.new('127.0.0.1', @server.addr[1]) - }.should raise_error(Errno::EADDRINUSE) + }.should.raise(Errno::EADDRINUSE) end platform_is_not :windows, :aix do diff --git a/spec/ruby/library/socket/tcpserver/sysaccept_spec.rb b/spec/ruby/library/socket/tcpserver/sysaccept_spec.rb index 5543b67755..ed23bced23 100644 --- a/spec/ruby/library/socket/tcpserver/sysaccept_spec.rb +++ b/spec/ruby/library/socket/tcpserver/sysaccept_spec.rb @@ -12,7 +12,7 @@ describe "TCPServer#sysaccept" do end it 'blocks if no connections' do - lambda { @server.sysaccept }.should block_caller + -> { @server.sysaccept }.should block_caller end it 'returns file descriptor of an accepted connection' do @@ -21,7 +21,7 @@ describe "TCPServer#sysaccept" do fd = @server.sysaccept - fd.should be_kind_of(Integer) + fd.should.is_a?(Integer) ensure sock.close if sock && !sock.closed? IO.for_fd(fd).close if fd @@ -41,7 +41,7 @@ describe 'TCPServer#sysaccept' do describe 'without a connected client' do it 'blocks the caller' do - lambda { @server.sysaccept }.should block_caller + -> { @server.sysaccept }.should block_caller end end @@ -58,7 +58,7 @@ describe 'TCPServer#sysaccept' do it 'returns a new file descriptor as an Integer' do @fd = @server.sysaccept - @fd.should be_kind_of(Integer) + @fd.should.is_a?(Integer) @fd.should_not == @client.fileno end end diff --git a/spec/ruby/library/socket/tcpsocket/gethostbyname_spec.rb b/spec/ruby/library/socket/tcpsocket/gethostbyname_spec.rb index 703abff81c..c6fe007827 100644 --- a/spec/ruby/library/socket/tcpsocket/gethostbyname_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/gethostbyname_spec.rb @@ -2,13 +2,15 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' # TODO: verify these for windows -describe "TCPSocket#gethostbyname" do +describe "TCPSocket.gethostbyname" do before :each do - @host_info = TCPSocket.gethostbyname(SocketSpecs.hostname) + suppress_warning do + @host_info = TCPSocket.gethostbyname(SocketSpecs.hostname) + end end it "returns an array elements of information on the hostname" do - @host_info.should be_kind_of(Array) + @host_info.should.is_a?(Array) end platform_is_not :windows do @@ -18,12 +20,12 @@ describe "TCPSocket#gethostbyname" do it "returns the address type as the third value" do address_type = @host_info[2] - [Socket::AF_INET, Socket::AF_INET6].include?(address_type).should be_true + [Socket::AF_INET, Socket::AF_INET6].include?(address_type).should == true end it "returns the IP address as the fourth value" do ip = @host_info[3] - ["127.0.0.1", "::1"].include?(ip).should be_true + ["127.0.0.1", "::1"].include?(ip).should == true end end @@ -46,19 +48,23 @@ describe "TCPSocket#gethostbyname" do end it "returns any aliases to the address as second value" do - @host_info[1].should be_kind_of(Array) + @host_info[1].should.is_a?(Array) end end -describe 'TCPSocket#gethostbyname' do +describe 'TCPSocket.gethostbyname' do it 'returns an Array' do - TCPSocket.gethostbyname('127.0.0.1').should be_an_instance_of(Array) + suppress_warning do + TCPSocket.gethostbyname('127.0.0.1').should.instance_of?(Array) + end end describe 'using a hostname' do describe 'the returned Array' do before do - @array = TCPSocket.gethostbyname('127.0.0.1') + suppress_warning do + @array = TCPSocket.gethostbyname('127.0.0.1') + end end it 'includes the canonical name as the 1st value' do @@ -66,11 +72,11 @@ describe 'TCPSocket#gethostbyname' do end it 'includes an array of alternative hostnames as the 2nd value' do - @array[1].should be_an_instance_of(Array) + @array[1].should.instance_of?(Array) end it 'includes the address family as the 3rd value' do - @array[2].should be_kind_of(Integer) + @array[2].should.is_a?(Integer) end it 'includes the IP addresses as all the remaining values' do @@ -88,7 +94,9 @@ describe 'TCPSocket#gethostbyname' do SocketSpecs.each_ip_protocol do |family, ip_address| describe 'the returned Array' do before do - @array = TCPSocket.gethostbyname(ip_address) + suppress_warning do + @array = TCPSocket.gethostbyname(ip_address) + end end it 'includes the IP address as the 1st value' do diff --git a/spec/ruby/library/socket/tcpsocket/initialize_spec.rb b/spec/ruby/library/socket/tcpsocket/initialize_spec.rb index a3593f0d5f..a33d0b16ba 100644 --- a/spec/ruby/library/socket/tcpsocket/initialize_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/initialize_spec.rb @@ -1,11 +1,37 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' +require_relative 'shared/new' + +describe 'TCPSocket#initialize' do + it_behaves_like :tcpsocket_new, :new + + describe "with a running server" do + before :each do + @server = SocketSpecs::SpecTCPServer.new + @hostname = @server.hostname + end + + after :each do + if @socket + @socket.write "QUIT" + @socket.close + end + @server.shutdown + end + + it "does not use the given block and warns to use TCPSocket::open" do + -> { + @socket = TCPSocket.new(@hostname, @server.port, nil) { raise } + }.should complain(/warning: TCPSocket::new\(\) does not take block; use TCPSocket::open\(\) instead/) + end + end +end describe 'TCPSocket#initialize' do SocketSpecs.each_ip_protocol do |family, ip_address| describe 'when no server is listening on the given address' do it 'raises Errno::ECONNREFUSED' do - lambda { TCPSocket.new(ip_address, 666) }.should raise_error(Errno::ECONNREFUSED) + -> { TCPSocket.new(ip_address, 666) }.should.raise(Errno::ECONNREFUSED) end end @@ -22,21 +48,21 @@ describe 'TCPSocket#initialize' do it 'returns a TCPSocket when using an Integer as the port' do @client = TCPSocket.new(ip_address, @port) - @client.should be_an_instance_of(TCPSocket) + @client.should.instance_of?(TCPSocket) end it 'returns a TCPSocket when using a String as the port' do @client = TCPSocket.new(ip_address, @port.to_s) - @client.should be_an_instance_of(TCPSocket) + @client.should.instance_of?(TCPSocket) end it 'raises SocketError when the port number is a non numeric String' do - lambda { TCPSocket.new(ip_address, 'cats') }.should raise_error(SocketError) + -> { TCPSocket.new(ip_address, 'cats') }.should.raise(SocketError) end it 'set the socket to binmode' do @client = TCPSocket.new(ip_address, @port) - @client.binmode?.should be_true + @client.binmode?.should == true end it 'connects to the right address' do @@ -46,6 +72,19 @@ describe 'TCPSocket#initialize' do @client.remote_address.ip_port.should == @server.local_address.ip_port end + platform_is_not :windows do + it "creates a socket which is set to nonblocking" do + require 'io/nonblock' + @client = TCPSocket.new(ip_address, @port) + @client.should.nonblock? + end + end + + it "creates a socket which is set to close on exec" do + @client = TCPSocket.new(ip_address, @port) + @client.should.close_on_exec? + end + describe 'using a local address and service' do it 'binds the client socket to the local address and service' do @client = TCPSocket.new(ip_address, @port, ip_address, 0) diff --git a/spec/ruby/library/socket/tcpsocket/local_address_spec.rb b/spec/ruby/library/socket/tcpsocket/local_address_spec.rb index ce66d5ff8f..5dcf741f29 100644 --- a/spec/ruby/library/socket/tcpsocket/local_address_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/local_address_spec.rb @@ -23,7 +23,7 @@ describe 'TCPSocket#local_address' do end it 'returns an Addrinfo' do - @sock.local_address.should be_an_instance_of(Addrinfo) + @sock.local_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/tcpsocket/new_spec.rb b/spec/ruby/library/socket/tcpsocket/new_spec.rb deleted file mode 100644 index 4924468be7..0000000000 --- a/spec/ruby/library/socket/tcpsocket/new_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require_relative 'shared/new' - -describe "TCPSocket.new" do - it_behaves_like :tcpsocket_new, :new -end diff --git a/spec/ruby/library/socket/tcpsocket/open_spec.rb b/spec/ruby/library/socket/tcpsocket/open_spec.rb index 31b630a23b..0c0b579064 100644 --- a/spec/ruby/library/socket/tcpsocket/open_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/open_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" require_relative 'shared/new' describe "TCPSocket.open" do diff --git a/spec/ruby/library/socket/tcpsocket/partially_closable_spec.rb b/spec/ruby/library/socket/tcpsocket/partially_closable_spec.rb index a381627a39..d365ecd335 100644 --- a/spec/ruby/library/socket/tcpsocket/partially_closable_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/partially_closable_spec.rb @@ -16,6 +16,6 @@ describe "TCPSocket partial closability" do @s2.close end - it_should_behave_like "partially closable sockets" + it_should_behave_like :partially_closable_sockets end diff --git a/spec/ruby/library/socket/tcpsocket/recv_nonblock_spec.rb b/spec/ruby/library/socket/tcpsocket/recv_nonblock_spec.rb index bfd815c658..6ce5a41b58 100644 --- a/spec/ruby/library/socket/tcpsocket/recv_nonblock_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/recv_nonblock_spec.rb @@ -27,6 +27,20 @@ describe "TCPSocket#recv_nonblock" do @socket.recv_nonblock(50).should == "TCPSocket#recv_nonblock" end + it 'writes the read to a buffer from the socket' do + @socket = TCPSocket.new @hostname, @server.port + @socket.write "TCPSocket#recv_nonblock" + + # Wait for the server to echo. This spec is testing the return + # value, not the non-blocking behavior. + # + # TODO: Figure out a good way to test non-blocking. + IO.select([@socket]) + buffer = "".b + @socket.recv_nonblock(50, 0, buffer) + buffer.should == 'TCPSocket#recv_nonblock' + end + it 'returns :wait_readable in exceptionless mode' do @socket = TCPSocket.new @hostname, @server.port @socket.recv_nonblock(50, exception: false).should == :wait_readable diff --git a/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb b/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb index eb9dabc075..085d57b3f9 100644 --- a/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb +++ b/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb @@ -23,7 +23,7 @@ describe 'TCPSocket#remote_address' do end it 'returns an Addrinfo' do - @sock.remote_address.should be_an_instance_of(Addrinfo) + @sock.remote_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/tcpsocket/shared/new.rb b/spec/ruby/library/socket/tcpsocket/shared/new.rb index d0358923c9..9c15dced4f 100644 --- a/spec/ruby/library/socket/tcpsocket/shared/new.rb +++ b/spec/ruby/library/socket/tcpsocket/shared/new.rb @@ -3,17 +3,35 @@ require_relative '../../fixtures/classes' describe :tcpsocket_new, shared: true do it "requires a hostname and a port as arguments" do - lambda { TCPSocket.send(@method) }.should raise_error(ArgumentError) + -> { TCPSocket.send(@method) }.should.raise(ArgumentError) end it "refuses the connection when there is no server to connect to" do - lambda do + -> do TCPSocket.send(@method, SocketSpecs.hostname, SocketSpecs.reserved_unused_port) - end.should raise_error(SystemCallError) {|e| - [Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL].should include(e.class) + end.should.raise(SystemCallError) {|e| + [Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL].should.include?(e.class) } end + it 'raises IO::TimeoutError with :connect_timeout when no server is listening on the given address' do + -> { + TCPSocket.send(@method, "192.0.2.1", 80, connect_timeout: 0) + }.should.raise(IO::TimeoutError) + rescue Errno::ENETUNREACH + skip "all network interfaces down" + end + + ruby_version_is "4.0" do + it 'raises IO::TimeoutError with :open_timeout when no server is listening on the given address' do + -> { + TCPSocket.send(@method, "192.0.2.1", 80, open_timeout: 0) + }.should.raise(IO::TimeoutError) + rescue Errno::ENETUNREACH + skip "all network interfaces down" + end + end + describe "with a running server" do before :each do @server = SocketSpecs::SpecTCPServer.new @@ -30,34 +48,43 @@ describe :tcpsocket_new, shared: true do it "silently ignores 'nil' as the third parameter" do @socket = TCPSocket.send(@method, @hostname, @server.port, nil) - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) end it "connects to a listening server with host and port" do @socket = TCPSocket.send(@method, @hostname, @server.port) - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) end it "connects to a server when passed local_host argument" do @socket = TCPSocket.send(@method, @hostname, @server.port, @hostname) - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) end it "connects to a server when passed local_host and local_port arguments" do - server = TCPServer.new(SocketSpecs.hostname, 0) + retries = 0 + max_retries = 3 + begin - available_port = server.addr[1] - ensure - server.close + retries += 1 + server = TCPServer.new(SocketSpecs.hostname, 0) + begin + available_port = server.addr[1] + ensure + server.close + end + @socket = TCPSocket.send(@method, @hostname, @server.port, + @hostname, available_port) + rescue Errno::EADDRINUSE + raise if retries >= max_retries + retry end - @socket = TCPSocket.send(@method, @hostname, @server.port, - @hostname, available_port) - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) end it "has an address once it has connected to a listening server" do @socket = TCPSocket.send(@method, @hostname, @server.port) - @socket.should be_an_instance_of(TCPSocket) + @socket.should.instance_of?(TCPSocket) # TODO: Figure out how to abstract this. You can get AF_INET # from 'Socket.getaddrinfo(hostname, nil)[0][3]' but socket.addr @@ -72,8 +99,20 @@ describe :tcpsocket_new, shared: true do @socket.addr[3].should == SocketSpecs.addr(:ipv6) end - @socket.addr[1].should be_kind_of(Integer) + @socket.addr[1].should.is_a?(Integer) @socket.addr[2].should =~ /^#{@hostname}/ end + + it "connects to a server when passed connect_timeout argument" do + @socket = TCPSocket.send(@method, @hostname, @server.port, connect_timeout: 1) + @socket.should.instance_of?(TCPSocket) + end + + ruby_version_is "4.0" do + it "connects to a server when passed open_timeout argument" do + @socket = TCPSocket.send(@method, @hostname, @server.port, open_timeout: 1) + @socket.should.instance_of?(TCPSocket) + end + end end end diff --git a/spec/ruby/library/socket/udpsocket/bind_spec.rb b/spec/ruby/library/socket/udpsocket/bind_spec.rb index 4dbdb285f6..974e701e71 100644 --- a/spec/ruby/library/socket/udpsocket/bind_spec.rb +++ b/spec/ruby/library/socket/udpsocket/bind_spec.rb @@ -12,15 +12,15 @@ describe "UDPSocket#bind" do it "binds the socket to a port" do @socket.bind(SocketSpecs.hostname, 0) - @socket.addr[1].should be_kind_of(Integer) + @socket.addr[1].should.is_a?(Integer) end it "raises Errno::EINVAL when already bound" do @socket.bind(SocketSpecs.hostname, 0) - lambda { + -> { @socket.bind(SocketSpecs.hostname, @socket.addr[1]) - }.should raise_error(Errno::EINVAL) + }.should.raise(Errno::EINVAL) end it "receives a hostname and a port" do diff --git a/spec/ruby/library/socket/udpsocket/initialize_spec.rb b/spec/ruby/library/socket/udpsocket/initialize_spec.rb index 06f7b5ef1c..c040187400 100644 --- a/spec/ruby/library/socket/udpsocket/initialize_spec.rb +++ b/spec/ruby/library/socket/udpsocket/initialize_spec.rb @@ -7,30 +7,47 @@ describe 'UDPSocket#initialize' do it 'initializes a new UDPSocket' do @socket = UDPSocket.new - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'initializes a new UDPSocket using an Integer' do @socket = UDPSocket.new(Socket::AF_INET) - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'initializes a new UDPSocket using a Symbol' do @socket = UDPSocket.new(:INET) - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'initializes a new UDPSocket using a String' do @socket = UDPSocket.new('INET') - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'sets the socket to binmode' do @socket = UDPSocket.new(:INET) - @socket.binmode?.should be_true + @socket.binmode?.should == true end - it 'raises Errno::EAFNOSUPPORT when given an invalid address family' do - lambda { UDPSocket.new(666) }.should raise_error(Errno::EAFNOSUPPORT) + platform_is_not :windows do + it 'sets the socket to nonblock' do + require 'io/nonblock' + @socket = UDPSocket.new(:INET) + @socket.should.nonblock? + end + end + + it 'sets the socket to close on exec' do + @socket = UDPSocket.new(:INET) + @socket.should.close_on_exec? + end + + it 'raises Errno::EAFNOSUPPORT or Errno::EPROTONOSUPPORT when given an invalid address family' do + -> { + UDPSocket.new(666) + }.should.raise(SystemCallError) { |e| + [Errno::EAFNOSUPPORT, Errno::EPROTONOSUPPORT].should.include?(e.class) + } end end diff --git a/spec/ruby/library/socket/udpsocket/inspect_spec.rb b/spec/ruby/library/socket/udpsocket/inspect_spec.rb deleted file mode 100644 index 201e8b3fc6..0000000000 --- a/spec/ruby/library/socket/udpsocket/inspect_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../spec_helper' - -describe 'UDPSocket#inspect' do - before do - @socket = UDPSocket.new - @socket.bind('127.0.0.1', 0) - end - - after do - @socket.close - end - - ruby_version_is ""..."2.5" do - it 'returns a String with the fd' do - @socket.inspect.should == "#<UDPSocket:fd #{@socket.fileno}>" - end - end - - ruby_version_is "2.5" do - it 'returns a String with the fd, family, address and port' do - port = @socket.addr[1] - @socket.inspect.should == "#<UDPSocket:fd #{@socket.fileno}, AF_INET, 127.0.0.1, #{port}>" - end - end -end diff --git a/spec/ruby/library/socket/udpsocket/local_address_spec.rb b/spec/ruby/library/socket/udpsocket/local_address_spec.rb index 92e4cc10c7..868d2f537e 100644 --- a/spec/ruby/library/socket/udpsocket/local_address_spec.rb +++ b/spec/ruby/library/socket/udpsocket/local_address_spec.rb @@ -28,7 +28,7 @@ describe 'UDPSocket#local_address' do end it 'returns an Addrinfo' do - @sock.local_address.should be_an_instance_of(Addrinfo) + @sock.local_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/udpsocket/new_spec.rb b/spec/ruby/library/socket/udpsocket/new_spec.rb index 157ff138be..aff111927c 100644 --- a/spec/ruby/library/socket/udpsocket/new_spec.rb +++ b/spec/ruby/library/socket/udpsocket/new_spec.rb @@ -8,27 +8,33 @@ describe 'UDPSocket.new' do it 'without arguments' do @socket = UDPSocket.new - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'using Integer argument' do @socket = UDPSocket.new(Socket::AF_INET) - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'using Symbol argument' do @socket = UDPSocket.new(:INET) - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) end it 'using String argument' do @socket = UDPSocket.new('INET') - @socket.should be_an_instance_of(UDPSocket) + @socket.should.instance_of?(UDPSocket) + end + + it "does not use the given block and warns to use UDPSocket::open" do + -> { + @socket = UDPSocket.new { raise } + }.should complain(/warning: UDPSocket::new\(\) does not take block; use UDPSocket::open\(\) instead/) end it 'raises Errno::EAFNOSUPPORT or Errno::EPROTONOSUPPORT if unsupported family passed' do - lambda { UDPSocket.new(-1) }.should raise_error(SystemCallError) { |e| - [Errno::EAFNOSUPPORT, Errno::EPROTONOSUPPORT].should include(e.class) + -> { UDPSocket.new(-1) }.should.raise(SystemCallError) { |e| + [Errno::EAFNOSUPPORT, Errno::EPROTONOSUPPORT].should.include?(e.class) } end end diff --git a/spec/ruby/library/socket/udpsocket/open_spec.rb b/spec/ruby/library/socket/udpsocket/open_spec.rb index e4dbb2ee2a..7c77855372 100644 --- a/spec/ruby/library/socket/udpsocket/open_spec.rb +++ b/spec/ruby/library/socket/udpsocket/open_spec.rb @@ -8,6 +8,6 @@ describe "UDPSocket.open" do it "allows calls to open without arguments" do @socket = UDPSocket.open - @socket.should be_kind_of(UDPSocket) + @socket.should.is_a?(UDPSocket) end end diff --git a/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb b/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb index 015109a052..460cf2c9a2 100644 --- a/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb +++ b/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb @@ -16,7 +16,7 @@ describe 'UDPSocket#recvfrom_nonblock' do platform_is_not :windows do describe 'using an unbound socket' do it 'raises IO::WaitReadable' do - lambda { @server.recvfrom_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @server.recvfrom_nonblock(1) }.should.raise(IO::WaitReadable) end end end @@ -32,7 +32,11 @@ describe 'UDPSocket#recvfrom_nonblock' do describe 'without any data available' do it 'raises IO::WaitReadable' do - lambda { @server.recvfrom_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @server.recvfrom_nonblock(1) }.should.raise(IO::WaitReadable) + end + + it 'returns :wait_readable with exception: false' do + @server.recvfrom_nonblock(1, exception: false).should == :wait_readable end end @@ -40,16 +44,32 @@ describe 'UDPSocket#recvfrom_nonblock' do describe 'with data available' do before do @client.write('hello') - - platform_is(:darwin, :freebsd) { IO.select([@server]) } end it 'returns an Array containing the data and an Array' do - @server.recvfrom_nonblock(1).should be_an_instance_of(Array) + IO.select([@server]) + @server.recvfrom_nonblock(1).should.instance_of?(Array) + end + + it 'writes the data to the buffer when one is present' do + buffer = "".b + IO.select([@server]) + @server.recvfrom_nonblock(1, 0, buffer) + buffer.should == 'h' + end + + it "preserves the encoding of the given buffer" do + buffer = ''.encode(Encoding::ISO_8859_1) + IO.select([@server]) + message, = @server.recvfrom_nonblock(1, 0, buffer) + + message.should.equal?(buffer) + buffer.encoding.should == Encoding::ISO_8859_1 end describe 'the returned Array' do before do + IO.select([@server]) @array = @server.recvfrom_nonblock(1) end @@ -58,12 +78,13 @@ describe 'UDPSocket#recvfrom_nonblock' do end it 'contains an Array at index 1' do - @array[1].should be_an_instance_of(Array) + @array[1].should.instance_of?(Array) end end describe 'the returned address Array' do before do + IO.select([@server]) @addr = @server.recvfrom_nonblock(1)[1] end diff --git a/spec/ruby/library/socket/udpsocket/remote_address_spec.rb b/spec/ruby/library/socket/udpsocket/remote_address_spec.rb index 94889ce560..d1310200fc 100644 --- a/spec/ruby/library/socket/udpsocket/remote_address_spec.rb +++ b/spec/ruby/library/socket/udpsocket/remote_address_spec.rb @@ -28,7 +28,7 @@ describe 'UDPSocket#remote_address' do end it 'returns an Addrinfo' do - @sock.remote_address.should be_an_instance_of(Addrinfo) + @sock.remote_address.should.instance_of?(Addrinfo) end describe 'the returned Addrinfo' do diff --git a/spec/ruby/library/socket/udpsocket/send_spec.rb b/spec/ruby/library/socket/udpsocket/send_spec.rb index 431129723e..63f5b0dcc6 100644 --- a/spec/ruby/library/socket/udpsocket/send_spec.rb +++ b/spec/ruby/library/socket/udpsocket/send_spec.rb @@ -34,7 +34,7 @@ describe "UDPSocket#send" do @msg[0].should == "ad hoc" @msg[1][0].should == "AF_INET" - @msg[1][1].should be_kind_of(Integer) + @msg[1][1].should.is_a?(Integer) @msg[1][3].should == "127.0.0.1" end @@ -46,7 +46,7 @@ describe "UDPSocket#send" do @msg[0].should == "ad hoc" @msg[1][0].should == "AF_INET" - @msg[1][1].should be_kind_of(Integer) + @msg[1][1].should.is_a?(Integer) @msg[1][3].should == "127.0.0.1" end @@ -59,16 +59,16 @@ describe "UDPSocket#send" do @msg[0].should == "connection-based" @msg[1][0].should == "AF_INET" - @msg[1][1].should be_kind_of(Integer) + @msg[1][1].should.is_a?(Integer) @msg[1][3].should == "127.0.0.1" end - it "raises EMSGSIZE if data is too too big" do + it "raises EMSGSIZE if data is too big" do @socket = UDPSocket.open begin - lambda do + -> do @socket.send('1' * 100_000, 0, SocketSpecs.hostname, @port.to_s) - end.should raise_error(Errno::EMSGSIZE) + end.should.raise(Errno::EMSGSIZE) ensure @socket.send("ad hoc", 0, SocketSpecs.hostname, @port) @socket.close @@ -96,7 +96,7 @@ describe 'UDPSocket#send' do describe 'using a disconnected socket' do describe 'without a destination address' do it "raises #{SocketSpecs.dest_addr_req_error}" do - lambda { @client.send('hello', 0) }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { @client.send('hello', 0) }.should.raise(SocketSpecs.dest_addr_req_error) end end @@ -108,7 +108,7 @@ describe 'UDPSocket#send' do it 'does not persist the connection after sending data' do @client.send('hello', 0, @addr.ip_address, @addr.ip_port) - lambda { @client.send('hello', 0) }.should raise_error(SocketSpecs.dest_addr_req_error) + -> { @client.send('hello', 0) }.should.raise(SocketSpecs.dest_addr_req_error) end end @@ -144,7 +144,7 @@ describe 'UDPSocket#send' do it 'sends the data to the given address instead' do @client.send('hello', 0, @alt_server.getsockname).should == 5 - lambda { @server.recv(5) }.should block_caller + -> { @server.recv(5) }.should block_caller @alt_server.recv(5).should == 'hello' end diff --git a/spec/ruby/library/socket/udpsocket/write_spec.rb b/spec/ruby/library/socket/udpsocket/write_spec.rb index e960de1baf..d41ee078d8 100644 --- a/spec/ruby/library/socket/udpsocket/write_spec.rb +++ b/spec/ruby/library/socket/udpsocket/write_spec.rb @@ -10,9 +10,9 @@ describe "UDPSocket#write" do s2 = UDPSocket.new s2.connect(host, s1.addr[1]) - lambda do + -> do s2.write('1' * 100_000) - end.should raise_error(Errno::EMSGSIZE) + end.should.raise(Errno::EMSGSIZE) ensure s1.close if s1 && !s1.closed? s2.close if s2 && !s2.closed? diff --git a/spec/ruby/library/socket/unixserver/accept_nonblock_spec.rb b/spec/ruby/library/socket/unixserver/accept_nonblock_spec.rb index 3ebe38a090..531d851658 100644 --- a/spec/ruby/library/socket/unixserver/accept_nonblock_spec.rb +++ b/spec/ruby/library/socket/unixserver/accept_nonblock_spec.rb @@ -2,89 +2,84 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXServer#accept_nonblock" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @client = UNIXSocket.open(@path) - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @client = UNIXSocket.open(@path) + @socket = @server.accept_nonblock + @client.send("foobar", 0) + end - @socket = @server.accept_nonblock - @client.send("foobar", 0) - end + after :each do + @socket.close + @client.close + @server.close + SocketSpecs.rm_socket @path + end - after :each do - @socket.close - @client.close - @server.close - SocketSpecs.rm_socket @path - end + it "accepts a connection in a non-blocking way" do + data = @socket.recvfrom(6).first + data.should == "foobar" + end - it "accepts a connection in a non-blocking way" do - data = @socket.recvfrom(6).first - data.should == "foobar" - end + it "returns a UNIXSocket" do + @socket.should.is_a?(UNIXSocket) + end - it "returns a UNIXSocket" do - @socket.should be_kind_of(UNIXSocket) - end + it 'returns :wait_readable in exceptionless mode' do + @server.accept_nonblock(exception: false).should == :wait_readable + end +end + +describe 'UNIXServer#accept_nonblock' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end - it 'returns :wait_readable in exceptionless mode' do - @server.accept_nonblock(exception: false).should == :wait_readable + after do + @server.close + rm_r(@path) + end + + describe 'without a client' do + it 'raises IO::WaitReadable' do + -> { @server.accept_nonblock }.should.raise(IO::WaitReadable) end end -end -with_feature :unix_socket do - describe 'UNIXServer#accept_nonblock' do + describe 'with a client' do before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) end after do - @server.close - rm_r(@path) + @client.close + @socket.close if @socket end - describe 'without a client' do - it 'raises IO::WaitReadable' do - lambda { @server.accept_nonblock }.should raise_error(IO::WaitReadable) + describe 'without any data' do + it 'returns a UNIXSocket' do + @socket = @server.accept_nonblock + @socket.should.instance_of?(UNIXSocket) end end - describe 'with a client' do + describe 'with data available' do before do - @client = UNIXSocket.new(@path) - end - - after do - @client.close - @socket.close if @socket + @client.write('hello') end - describe 'without any data' do - it 'returns a UNIXSocket' do - @socket = @server.accept_nonblock - @socket.should be_an_instance_of(UNIXSocket) - end + it 'returns a UNIXSocket' do + @socket = @server.accept_nonblock + @socket.should.instance_of?(UNIXSocket) end - describe 'with data available' do - before do - @client.write('hello') - end - - it 'returns a UNIXSocket' do + describe 'the returned UNIXSocket' do + it 'can read the data written' do @socket = @server.accept_nonblock - @socket.should be_an_instance_of(UNIXSocket) - end - - describe 'the returned UNIXSocket' do - it 'can read the data written' do - @socket = @server.accept_nonblock - @socket.recv(5).should == 'hello' - end + @socket.recv(5).should == 'hello' end end end diff --git a/spec/ruby/library/socket/unixserver/accept_spec.rb b/spec/ruby/library/socket/unixserver/accept_spec.rb index a1570f7013..8f3ea50966 100644 --- a/spec/ruby/library/socket/unixserver/accept_spec.rb +++ b/spec/ruby/library/socket/unixserver/accept_spec.rb @@ -1,115 +1,124 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -platform_is_not :windows do - describe "UNIXServer#accept" do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - end +describe "UNIXServer#accept" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + end - after :each do - @server.close if @server - SocketSpecs.rm_socket @path - end + after :each do + @server.close if @server + SocketSpecs.rm_socket @path + end - it "accepts what is written by the client" do - client = UNIXSocket.open(@path) + it "accepts what is written by the client" do + client = UNIXSocket.open(@path) - client.send('hello', 0) + client.send('hello', 0) - sock = @server.accept - begin - data, info = sock.recvfrom(5) + sock = @server.accept + begin + data, info = sock.recvfrom(5) - data.should == 'hello' - info.should_not be_empty - ensure - sock.close - client.close - end + data.should == 'hello' + info.should_not.empty? + ensure + sock.close + client.close end + end - it "can be interrupted by Thread#kill" do - t = Thread.new { - @server.accept - } - Thread.pass while t.status and t.status != "sleep" - - # kill thread, ensure it dies in a reasonable amount of time - t.kill - a = 0 - while t.alive? and a < 5000 - sleep 0.001 - a += 1 - end - a.should < 5000 + it "can be interrupted by Thread#kill" do + t = Thread.new { + @server.accept + } + Thread.pass while t.status and t.status != "sleep" + + # kill thread, ensure it dies in a reasonable amount of time + t.kill + a = 0 + while t.alive? and a < 5000 + sleep 0.001 + a += 1 end + a.should < 5000 + end - it "can be interrupted by Thread#raise" do - t = Thread.new { - -> { - @server.accept - }.should raise_error(Exception, "interrupted") - } + it "can be interrupted by Thread#raise" do + t = Thread.new { + -> { + @server.accept + }.should.raise(Exception, "interrupted") + } - Thread.pass while t.status and t.status != "sleep" - t.raise Exception, "interrupted" - t.join - end + Thread.pass while t.status and t.status != "sleep" + t.raise Exception, "interrupted" + t.join end end -with_feature :unix_socket do - describe 'UNIXServer#accept' do +describe 'UNIXServer#accept' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end + + after do + @server.close + rm_r(@path) + end + + describe 'without a client' do + it 'blocks the calling thread' do + -> { @server.accept }.should block_caller + end + end + + describe 'with a client' do before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) end after do - @server.close - rm_r(@path) + @client.close + @socket.close if @socket end - describe 'without a client' do - it 'blocks the calling thread' do - lambda { @server.accept }.should block_caller + describe 'without any data' do + it 'returns a UNIXSocket' do + @socket = @server.accept + @socket.should.instance_of?(UNIXSocket) end end - describe 'with a client' do + describe 'with data available' do before do - @client = UNIXSocket.new(@path) + @client.write('hello') end - after do - @client.close - @socket.close if @socket + it 'returns a UNIXSocket' do + @socket = @server.accept + @socket.should.instance_of?(UNIXSocket) end - describe 'without any data' do - it 'returns a UNIXSocket' do + describe 'the returned UNIXSocket' do + it 'can read the data written' do @socket = @server.accept - @socket.should be_an_instance_of(UNIXSocket) + @socket.recv(5).should == 'hello' end - end - describe 'with data available' do - before do - @client.write('hello') + platform_is_not :windows do + it "is set to nonblocking" do + require 'io/nonblock' + @socket = @server.accept + @socket.should.nonblock? + end end - it 'returns a UNIXSocket' do + it "is set to close on exec" do @socket = @server.accept - @socket.should be_an_instance_of(UNIXSocket) - end - - describe 'the returned UNIXSocket' do - it 'can read the data written' do - @socket = @server.accept - @socket.recv(5).should == 'hello' - end + @socket.should.close_on_exec? end end end diff --git a/spec/ruby/library/socket/unixserver/for_fd_spec.rb b/spec/ruby/library/socket/unixserver/for_fd_spec.rb index 4f3816ad37..be1c2df4d7 100644 --- a/spec/ruby/library/socket/unixserver/for_fd_spec.rb +++ b/spec/ruby/library/socket/unixserver/for_fd_spec.rb @@ -1,23 +1,21 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -platform_is_not :windows do - describe "UNIXServer#for_fd" do - before :each do - @unix_path = SocketSpecs.socket_path - @unix = UNIXServer.new(@unix_path) - end +describe "UNIXServer.for_fd" do + before :each do + @unix_path = SocketSpecs.socket_path + @unix = UNIXServer.new(@unix_path) + end - after :each do - @unix.close if @unix - SocketSpecs.rm_socket @unix_path - end + after :each do + @unix.close if @unix + SocketSpecs.rm_socket @unix_path + end - it "can calculate the path" do - b = UNIXServer.for_fd(@unix.fileno) - b.autoclose = false + it "can calculate the path" do + b = UNIXServer.for_fd(@unix.fileno) + b.autoclose = false - b.path.should == @unix_path - end + b.path.should == @unix_path end end diff --git a/spec/ruby/library/socket/unixserver/initialize_spec.rb b/spec/ruby/library/socket/unixserver/initialize_spec.rb index cb186ceb76..ca1dd301f0 100644 --- a/spec/ruby/library/socket/unixserver/initialize_spec.rb +++ b/spec/ruby/library/socket/unixserver/initialize_spec.rb @@ -1,28 +1,26 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXServer#initialize' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - end +describe 'UNIXServer#initialize' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end - after do - @server.close if @server - rm_r @path - end + after do + @server.close if @server + rm_r @path + end - it 'returns a new UNIXServer' do - @server.should be_an_instance_of(UNIXServer) - end + it 'returns a new UNIXServer' do + @server.should.instance_of?(UNIXServer) + end - it 'sets the socket to binmode' do - @server.binmode?.should be_true - end + it 'sets the socket to binmode' do + @server.binmode?.should == true + end - it 'raises Errno::EADDRINUSE when the socket is already in use' do - lambda { UNIXServer.new(@path) }.should raise_error(Errno::EADDRINUSE) - end + it 'raises Errno::EADDRINUSE when the socket is already in use' do + -> { UNIXServer.new(@path) }.should.raise(Errno::EADDRINUSE) end end diff --git a/spec/ruby/library/socket/unixserver/listen_spec.rb b/spec/ruby/library/socket/unixserver/listen_spec.rb index b90b3bbb09..7938d648c4 100644 --- a/spec/ruby/library/socket/unixserver/listen_spec.rb +++ b/spec/ruby/library/socket/unixserver/listen_spec.rb @@ -1,21 +1,19 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXServer#listen' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - end +describe 'UNIXServer#listen' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end - after do - @server.close + after do + @server.close - rm_r(@path) - end + rm_r(@path) + end - it 'returns 0' do - @server.listen(1).should == 0 - end + it 'returns 0' do + @server.listen(1).should == 0 end end diff --git a/spec/ruby/library/socket/unixserver/new_spec.rb b/spec/ruby/library/socket/unixserver/new_spec.rb index f831f40bc6..7d0c7bf76e 100644 --- a/spec/ruby/library/socket/unixserver/new_spec.rb +++ b/spec/ruby/library/socket/unixserver/new_spec.rb @@ -3,4 +3,10 @@ require_relative 'shared/new' describe "UNIXServer.new" do it_behaves_like :unixserver_new, :new + + it "does not use the given block and warns to use UNIXServer::open" do + -> { + @server = UNIXServer.new(@path) { raise } + }.should complain(/warning: UNIXServer::new\(\) does not take block; use UNIXServer::open\(\) instead/) + end end diff --git a/spec/ruby/library/socket/unixserver/open_spec.rb b/spec/ruby/library/socket/unixserver/open_spec.rb index f2506d9f6f..c49df802d0 100644 --- a/spec/ruby/library/socket/unixserver/open_spec.rb +++ b/spec/ruby/library/socket/unixserver/open_spec.rb @@ -5,22 +5,20 @@ require_relative 'shared/new' describe "UNIXServer.open" do it_behaves_like :unixserver_new, :open - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - end + before :each do + @path = SocketSpecs.socket_path + end - after :each do - @server.close if @server - @server = nil - SocketSpecs.rm_socket @path - end + after :each do + @server.close if @server + @server = nil + SocketSpecs.rm_socket @path + end - it "yields the new UNIXServer object to the block, if given" do - UNIXServer.open(@path) do |unix| - unix.path.should == @path - unix.addr.should == ["AF_UNIX", @path] - end + it "yields the new UNIXServer object to the block, if given" do + UNIXServer.open(@path) do |unix| + unix.path.should == @path + unix.addr.should == ["AF_UNIX", @path] end end end diff --git a/spec/ruby/library/socket/unixserver/shared/new.rb b/spec/ruby/library/socket/unixserver/shared/new.rb index 35395826c9..b537f2a871 100644 --- a/spec/ruby/library/socket/unixserver/shared/new.rb +++ b/spec/ruby/library/socket/unixserver/shared/new.rb @@ -2,21 +2,19 @@ require_relative '../../spec_helper' require_relative '../../fixtures/classes' describe :unixserver_new, shared: true do - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - end + before :each do + @path = SocketSpecs.socket_path + end - after :each do - @server.close if @server - @server = nil - SocketSpecs.rm_socket @path - end + after :each do + @server.close if @server + @server = nil + SocketSpecs.rm_socket @path + end - it "creates a new UNIXServer" do - @server = UNIXServer.send(@method, @path) - @server.path.should == @path - @server.addr.should == ["AF_UNIX", @path] - end + it "creates a new UNIXServer" do + @server = UNIXServer.send(@method, @path) + @server.path.should == @path + @server.addr.should == ["AF_UNIX", @path] end end diff --git a/spec/ruby/library/socket/unixserver/sysaccept_spec.rb b/spec/ruby/library/socket/unixserver/sysaccept_spec.rb index 65a35c91a9..5970c01114 100644 --- a/spec/ruby/library/socket/unixserver/sysaccept_spec.rb +++ b/spec/ruby/library/socket/unixserver/sysaccept_spec.rb @@ -1,51 +1,49 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXServer#sysaccept' do +describe 'UNIXServer#sysaccept' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + end + + after do + @server.close + + rm_r(@path) + end + + describe 'without a client' do + it 'blocks the calling thread' do + -> { @server.sysaccept }.should block_caller + end + end + + describe 'with a client' do before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) end after do - @server.close - - rm_r(@path) + Socket.for_fd(@fd).close if @fd + @client.close end - describe 'without a client' do - it 'blocks the calling thread' do - lambda { @server.sysaccept }.should block_caller + describe 'without any data' do + it 'returns an Integer' do + @fd = @server.sysaccept + @fd.should.is_a?(Integer) end end - describe 'with a client' do + describe 'with data available' do before do - @client = UNIXSocket.new(@path) - end - - after do - Socket.for_fd(@fd).close if @fd - @client.close + @client.write('hello') end - describe 'without any data' do - it 'returns an Integer' do - @fd = @server.sysaccept - @fd.should be_kind_of(Integer) - end - end - - describe 'with data available' do - before do - @client.write('hello') - end - - it 'returns an Integer' do - @fd = @server.sysaccept - @fd.should be_kind_of(Integer) - end + it 'returns an Integer' do + @fd = @server.sysaccept + @fd.should.is_a?(Integer) end end end diff --git a/spec/ruby/library/socket/unixsocket/addr_spec.rb b/spec/ruby/library/socket/unixsocket/addr_spec.rb index e8431bea16..b3ae2af5d8 100644 --- a/spec/ruby/library/socket/unixsocket/addr_spec.rb +++ b/spec/ruby/library/socket/unixsocket/addr_spec.rb @@ -2,35 +2,32 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXSocket#addr" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @client = UNIXSocket.open(@path) + end - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @client = UNIXSocket.open(@path) - end - - after :each do - @client.close - @server.close - SocketSpecs.rm_socket @path - end + after :each do + @client.close + @server.close + SocketSpecs.rm_socket @path + end - it "returns an array" do - @client.addr.should be_kind_of(Array) - end + it "returns an array" do + @client.addr.should.is_a?(Array) + end - it "returns the address family of this socket in an array" do - @client.addr[0].should == "AF_UNIX" - @server.addr[0].should == "AF_UNIX" - end + it "returns the address family of this socket in an array" do + @client.addr[0].should == "AF_UNIX" + @server.addr[0].should == "AF_UNIX" + end - it "returns the path of the socket in an array if it's a server" do - @server.addr[1].should == @path - end + it "returns the path of the socket in an array if it's a server" do + @server.addr[1].should == @path + end - it "returns an empty string for path if it's a client" do - @client.addr[1].should == "" - end + it "returns an empty string for path if it's a client" do + @client.addr[1].should == "" end end diff --git a/spec/ruby/library/socket/unixsocket/initialize_spec.rb b/spec/ruby/library/socket/unixsocket/initialize_spec.rb index a6217d404f..ac30b93de0 100644 --- a/spec/ruby/library/socket/unixsocket/initialize_spec.rb +++ b/spec/ruby/library/socket/unixsocket/initialize_spec.rb @@ -1,38 +1,56 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXSocket#initialize' do - describe 'using a non existing path' do +describe 'UNIXSocket#initialize' do + describe 'using a non existing path' do + platform_is_not :windows do it 'raises Errno::ENOENT' do - lambda { UNIXSocket.new(SocketSpecs.socket_path) }.should raise_error(Errno::ENOENT) + -> { UNIXSocket.new(SocketSpecs.socket_path) }.should.raise(Errno::ENOENT) end end - describe 'using an existing socket path' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - @socket = UNIXSocket.new(@path) + platform_is :windows do + # Why, Windows, why? + it 'raises Errno::ECONNREFUSED' do + -> { UNIXSocket.new(SocketSpecs.socket_path) }.should.raise(Errno::ECONNREFUSED) end + end + end - after do - @socket.close - @server.close - rm_r(@path) - end + describe 'using an existing socket path' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + @socket = UNIXSocket.new(@path) + end - it 'returns a new UNIXSocket' do - @socket.should be_an_instance_of(UNIXSocket) - end + after do + @socket.close + @server.close + rm_r(@path) + end - it 'sets the socket path to an empty String' do - @socket.path.should == '' - end + it 'returns a new UNIXSocket' do + @socket.should.instance_of?(UNIXSocket) + end + + it 'sets the socket path to an empty String' do + @socket.path.should == '' + end - it 'sets the socket to binmode' do - @socket.binmode?.should be_true + it 'sets the socket to binmode' do + @socket.binmode?.should == true + end + + platform_is_not :windows do + it 'sets the socket to nonblock' do + require 'io/nonblock' + @socket.should.nonblock? end end + + it 'sets the socket to close on exec' do + @socket.should.close_on_exec? + end end end diff --git a/spec/ruby/library/socket/unixsocket/inspect_spec.rb b/spec/ruby/library/socket/unixsocket/inspect_spec.rb index d2e3cabbd3..77bb521069 100644 --- a/spec/ruby/library/socket/unixsocket/inspect_spec.rb +++ b/spec/ruby/library/socket/unixsocket/inspect_spec.rb @@ -2,16 +2,14 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXSocket#inspect" do - platform_is_not :windows do - it "returns sockets fd for unnamed sockets" do - begin - s1, s2 = UNIXSocket.socketpair - s1.inspect.should == "#<UNIXSocket:fd #{s1.fileno}>" - s2.inspect.should == "#<UNIXSocket:fd #{s2.fileno}>" - ensure - s1.close - s2.close - end + it "returns sockets fd for unnamed sockets" do + begin + s1, s2 = UNIXSocket.socketpair + s1.inspect.should == "#<UNIXSocket:fd #{s1.fileno}>" + s2.inspect.should == "#<UNIXSocket:fd #{s2.fileno}>" + ensure + s1.close + s2.close end end end diff --git a/spec/ruby/library/socket/unixsocket/local_address_spec.rb b/spec/ruby/library/socket/unixsocket/local_address_spec.rb index 56b3ccc557..fc504698c3 100644 --- a/spec/ruby/library/socket/unixsocket/local_address_spec.rb +++ b/spec/ruby/library/socket/unixsocket/local_address_spec.rb @@ -1,49 +1,92 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXSocket#local_address' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - @client = UNIXSocket.new(@path) +describe 'UNIXSocket#local_address' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) + end + + after do + @client.close + @server.close + + rm_r(@path) + end + + it 'returns an Addrinfo' do + @client.local_address.should.instance_of?(Addrinfo) + end + + describe 'the returned Addrinfo' do + platform_is_not :aix do + it 'uses AF_UNIX as the address family' do + @client.local_address.afamily.should == Socket::AF_UNIX + end + + it 'uses PF_UNIX as the protocol family' do + @client.local_address.pfamily.should == Socket::PF_UNIX + end end - after do - @client.close - @server.close + it 'uses SOCK_STREAM as the socket type' do + @client.local_address.socktype.should == Socket::SOCK_STREAM + end - rm_r(@path) + platform_is_not :aix do + it 'uses an empty socket path' do + @client.local_address.unix_path.should == '' + end end - it 'returns an Addrinfo' do - @client.local_address.should be_an_instance_of(Addrinfo) + it 'uses 0 as the protocol' do + @client.local_address.protocol.should == 0 + end + end +end + +describe 'UNIXSocket#local_address with a UNIX socket pair' do + before :each do + @sock, @sock2 = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM) + end + + after :each do + @sock.close + @sock2.close + end + + it 'returns an Addrinfo' do + @sock.local_address.should.instance_of?(Addrinfo) + end + + describe 'the returned Addrinfo' do + it 'uses AF_UNIX as the address family' do + @sock.local_address.afamily.should == Socket::AF_UNIX end - describe 'the returned Addrinfo' do - platform_is_not :aix do - it 'uses AF_UNIX as the address family' do - @client.local_address.afamily.should == Socket::AF_UNIX - end + it 'uses PF_UNIX as the protocol family' do + @sock.local_address.pfamily.should == Socket::PF_UNIX + end - it 'uses PF_UNIX as the protocol family' do - @client.local_address.pfamily.should == Socket::PF_UNIX - end - end + it 'uses SOCK_STREAM as the socket type' do + @sock.local_address.socktype.should == Socket::SOCK_STREAM + end - it 'uses SOCK_STREAM as the socket type' do - @client.local_address.socktype.should == Socket::SOCK_STREAM - end + it 'raises SocketError for #ip_address' do + -> { + @sock.local_address.ip_address + }.should.raise(SocketError, "need IPv4 or IPv6 address") + end - platform_is_not :aix do - it 'uses an empty socket path' do - @client.local_address.unix_path.should == '' - end - end + it 'raises SocketError for #ip_port' do + -> { + @sock.local_address.ip_port + }.should.raise(SocketError, "need IPv4 or IPv6 address") + end - it 'uses 0 as the protocol' do - @client.local_address.protocol.should == 0 - end + it 'uses 0 as the protocol' do + @sock.local_address.protocol.should == 0 end end end diff --git a/spec/ruby/library/socket/unixsocket/new_spec.rb b/spec/ruby/library/socket/unixsocket/new_spec.rb index 05a6b3eda2..fea2c1e2b7 100644 --- a/spec/ruby/library/socket/unixsocket/new_spec.rb +++ b/spec/ruby/library/socket/unixsocket/new_spec.rb @@ -3,4 +3,10 @@ require_relative 'shared/new' describe "UNIXSocket.new" do it_behaves_like :unixsocket_new, :new + + it "does not use the given block and warns to use UNIXSocket::open" do + -> { + @client = UNIXSocket.new(@path) { raise } + }.should complain(/warning: UNIXSocket::new\(\) does not take block; use UNIXSocket::open\(\) instead/) + end end diff --git a/spec/ruby/library/socket/unixsocket/open_spec.rb b/spec/ruby/library/socket/unixsocket/open_spec.rb index ad5048fedd..b5e8c6c23a 100644 --- a/spec/ruby/library/socket/unixsocket/open_spec.rb +++ b/spec/ruby/library/socket/unixsocket/open_spec.rb @@ -7,22 +7,20 @@ describe "UNIXSocket.open" do end describe "UNIXSocket.open" do - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - end + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + end - after :each do - @server.close - SocketSpecs.rm_socket @path - end + after :each do + @server.close + SocketSpecs.rm_socket @path + end - it "opens a unix socket on the specified file and yields it to the block" do - UNIXSocket.open(@path) do |client| - client.addr[0].should == "AF_UNIX" - client.closed?.should == false - end + it "opens a unix socket on the specified file and yields it to the block" do + UNIXSocket.open(@path) do |client| + client.addr[0].should == "AF_UNIX" + client.should_not.closed? end end end diff --git a/spec/ruby/library/socket/unixsocket/pair_spec.rb b/spec/ruby/library/socket/unixsocket/pair_spec.rb index 845ff76ecc..9690142668 100644 --- a/spec/ruby/library/socket/unixsocket/pair_spec.rb +++ b/spec/ruby/library/socket/unixsocket/pair_spec.rb @@ -1,39 +1,18 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' require_relative '../shared/partially_closable_sockets' +require_relative 'shared/pair' -describe "UNIXSocket#pair" do - platform_is_not :windows do +describe "UNIXSocket.pair" do + it_should_behave_like :unixsocket_pair + it_should_behave_like :partially_closable_sockets - it_should_behave_like "partially closable sockets" - - before :each do - @s1, @s2 = UNIXSocket.pair - end - - after :each do - @s1.close - @s2.close - end - - it "returns a pair of connected sockets" do - @s1.puts "foo" - @s2.gets.should == "foo\n" - end - - it "returns sockets with no name" do - @s1.path.should == @s2.path - @s1.path.should == "" - end - - it "returns sockets with no address" do - @s1.addr.should == ["AF_UNIX", ""] - @s2.addr.should == ["AF_UNIX", ""] - end + before :each do + @s1, @s2 = UNIXSocket.pair + end - it "returns sockets with no peeraddr" do - @s1.peeraddr.should == ["AF_UNIX", ""] - @s2.peeraddr.should == ["AF_UNIX", ""] - end + after :each do + @s1.close + @s2.close end end diff --git a/spec/ruby/library/socket/unixsocket/partially_closable_spec.rb b/spec/ruby/library/socket/unixsocket/partially_closable_spec.rb index 78a64fe6be..108a6c3063 100644 --- a/spec/ruby/library/socket/unixsocket/partially_closable_spec.rb +++ b/spec/ruby/library/socket/unixsocket/partially_closable_spec.rb @@ -2,24 +2,20 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' require_relative '../shared/partially_closable_sockets' -platform_is_not :windows do - describe "UNIXSocket partial closability" do - - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @s1 = UNIXSocket.new(@path) - @s2 = @server.accept - end - - after :each do - @server.close - @s1.close - @s2.close - SocketSpecs.rm_socket @path - end - - it_should_behave_like "partially closable sockets" +describe "UNIXSocket partial closability" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @s1 = UNIXSocket.new(@path) + @s2 = @server.accept + end + after :each do + @server.close + @s1.close + @s2.close + SocketSpecs.rm_socket @path end + + it_should_behave_like :partially_closable_sockets end diff --git a/spec/ruby/library/socket/unixsocket/path_spec.rb b/spec/ruby/library/socket/unixsocket/path_spec.rb index 317ffc0975..ffe7e4bea2 100644 --- a/spec/ruby/library/socket/unixsocket/path_spec.rb +++ b/spec/ruby/library/socket/unixsocket/path_spec.rb @@ -2,27 +2,23 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXSocket#path" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @client = UNIXSocket.open(@path) + end - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @client = UNIXSocket.open(@path) - end - - after :each do - @client.close - @server.close - SocketSpecs.rm_socket @path - end - - it "returns the path of the socket if it's a server" do - @server.path.should == @path - end + after :each do + @client.close + @server.close + SocketSpecs.rm_socket @path + end - it "returns an empty string for path if it's a client" do - @client.path.should == "" - end + it "returns the path of the socket if it's a server" do + @server.path.should == @path end + it "returns an empty string for path if it's a client" do + @client.path.should == "" + end end diff --git a/spec/ruby/library/socket/unixsocket/peeraddr_spec.rb b/spec/ruby/library/socket/unixsocket/peeraddr_spec.rb index ec57b40970..b586b1fcbb 100644 --- a/spec/ruby/library/socket/unixsocket/peeraddr_spec.rb +++ b/spec/ruby/library/socket/unixsocket/peeraddr_spec.rb @@ -2,29 +2,25 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXSocket#peeraddr" do + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @client = UNIXSocket.open(@path) + end - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @client = UNIXSocket.open(@path) - end - - after :each do - @client.close - @server.close - SocketSpecs.rm_socket @path - end - - it "returns the address familly and path of the server end of the connection" do - @client.peeraddr.should == ["AF_UNIX", @path] - end + after :each do + @client.close + @server.close + SocketSpecs.rm_socket @path + end - it "raises an error in server sockets" do - lambda { - @server.peeraddr - }.should raise_error(Errno::ENOTCONN) - end + it "returns the address family and path of the server end of the connection" do + @client.peeraddr.should == ["AF_UNIX", @path] end + it "raises an error in server sockets" do + -> { + @server.peeraddr + }.should.raise(Errno::ENOTCONN) + end end diff --git a/spec/ruby/library/socket/unixsocket/recv_io_spec.rb b/spec/ruby/library/socket/unixsocket/recv_io_spec.rb index 533f02a0fa..ac9d892375 100644 --- a/spec/ruby/library/socket/unixsocket/recv_io_spec.rb +++ b/spec/ruby/library/socket/unixsocket/recv_io_spec.rb @@ -1,9 +1,8 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -describe "UNIXSocket#recv_io" do - - platform_is_not :windows do +platform_is_not :windows do + describe "UNIXSocket#recv_io" do before :each do @path = SocketSpecs.socket_path @server = UNIXServer.open(@path) @@ -38,12 +37,10 @@ describe "UNIXSocket#recv_io" do @socket = @server.accept @io = @socket.recv_io(File) - @io.should be_an_instance_of(File) + @io.should.instance_of?(File) end end -end -with_feature :unix_socket do describe 'UNIXSocket#recv_io' do before do @file = File.open('/dev/null', 'w') @@ -62,7 +59,7 @@ with_feature :unix_socket do @client.send_io(@file) @io = @server.recv_io - @io.should be_an_instance_of(IO) + @io.should.instance_of?(IO) end end @@ -71,7 +68,7 @@ with_feature :unix_socket do @client.send_io(@file) @io = @server.recv_io(File) - @io.should be_an_instance_of(File) + @io.should.instance_of?(File) end end @@ -80,7 +77,7 @@ with_feature :unix_socket do @client.send_io(@file) @io = @server.recv_io(File, File::WRONLY) - @io.should be_an_instance_of(File) + @io.should.instance_of?(File) end end end diff --git a/spec/ruby/library/socket/unixsocket/recvfrom_spec.rb b/spec/ruby/library/socket/unixsocket/recvfrom_spec.rb index 3e2eb69885..9ae3777961 100644 --- a/spec/ruby/library/socket/unixsocket/recvfrom_spec.rb +++ b/spec/ruby/library/socket/unixsocket/recvfrom_spec.rb @@ -2,35 +2,104 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' describe "UNIXSocket#recvfrom" do - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - @client = UNIXSocket.open(@path) + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + @client = UNIXSocket.open(@path) + end + + after :each do + @client.close + @server.close + SocketSpecs.rm_socket @path + end + + it "receives len bytes from sock, returning an array containing sent data as first element" do + @client.send("foobar", 0) + sock = @server.accept + sock.recvfrom(6).first.should == "foobar" + sock.close + end + + context "when called on a server's socket" do + platform_is_not :windows do + it "returns an array containing basic information on the client as second element" do + @client.send("foobar", 0) + sock = @server.accept + data = sock.recvfrom(6) + data.last.should == ["AF_UNIX", ""] + sock.close + end end - after :each do - @client.close - @server.close - SocketSpecs.rm_socket @path + guard -> { platform_is :windows and ruby_bug "#21702", ""..."4.2" } do + it "returns an array containing basic information on the client as second element" do + @client.send("foobar", 0) + sock = @server.accept + data = sock.recvfrom(6) + data.last.should == ["AF_UNIX", ""] + sock.close + end end + end - it "receives len bytes from sock" do - @client.send("foobar", 0) - sock = @server.accept - sock.recvfrom(6).first.should == "foobar" - sock.close + context "when called on a client's socket" do + platform_is :linux do + it "returns an array containing server's address as second element" do + @client.send("", 0) + sock = @server.accept + sock.send("barfoo", 0) + @client.recvfrom(6).last.should == ["AF_UNIX", @server.local_address.unix_path] + sock.close + end end - it "returns an array with data and information on the sender" do - @client.send("foobar", 0) - sock = @server.accept - data = sock.recvfrom(6) - data.first.should == "foobar" - data.last.should == ["AF_UNIX", ""] - sock.close + guard -> { platform_is :windows and ruby_bug "#21702", ""..."4.2" } do + it "returns an array containing server's address as second element" do + @client.send("", 0) + sock = @server.accept + sock.send("barfoo", 0) + # This may not be correct, depends on what underlying recvfrom actually returns. + @client.recvfrom(6).last.should == ["AF_UNIX", @server.local_address.unix_path] + sock.close + end end + platform_is :darwin do + it "returns an array containing basic information on the server as second element" do + @client.send("", 0) + sock = @server.accept + sock.send("barfoo", 0) + @client.recvfrom(6).last.should == ["AF_UNIX", ""] + sock.close + end + end + end + + it "allows an output buffer as third argument" do + buffer = +'' + + @client.send("foobar", 0) + sock = @server.accept + message, = sock.recvfrom(6, 0, buffer) + sock.close + + message.should.equal?(buffer) + buffer.should == "foobar" + end + + it "preserves the encoding of the given buffer" do + buffer = ''.encode(Encoding::ISO_8859_1) + + @client.send("foobar", 0) + sock = @server.accept + sock.recvfrom(6, 0, buffer) + sock.close + + buffer.encoding.should == Encoding::ISO_8859_1 + end + + platform_is_not :windows do it "uses different message options" do @client.send("foobar", Socket::MSG_PEEK) sock = @server.accept @@ -44,30 +113,37 @@ describe "UNIXSocket#recvfrom" do end end +describe 'UNIXSocket#recvfrom' do + describe 'using a socket pair' do + before do + @client, @server = UNIXSocket.socketpair + @client.write('hello') + end -with_feature :unix_socket do - describe 'UNIXSocket#recvfrom' do - describe 'using a socket pair' do - before do - @client, @server = UNIXSocket.socketpair - @client.write('hello') - end + after do + @client.close + @server.close + end - after do - @client.close - @server.close + platform_is_not :windows do + it 'returns an Array containing the data and address information' do + @server.recvfrom(5).should == ['hello', ['AF_UNIX', '']] end + end + guard -> { platform_is :windows and ruby_bug "#21702", ""..."4.2" } do it 'returns an Array containing the data and address information' do @server.recvfrom(5).should == ['hello', ['AF_UNIX', '']] end end + end + platform_is_not :windows do # These specs are taken from the rdoc examples on UNIXSocket#recvfrom. describe 'using a UNIX socket constructed using UNIXSocket.for_fd' do before do @path1 = SocketSpecs.socket_path - @path2 = SocketSpecs.socket_path + '2' + @path2 = SocketSpecs.socket_path.chop + '2' rm_r(@path2) @client_raw = Socket.new(:UNIX, :DGRAM) diff --git a/spec/ruby/library/socket/unixsocket/remote_address_spec.rb b/spec/ruby/library/socket/unixsocket/remote_address_spec.rb index 0b416254d0..d2303a6587 100644 --- a/spec/ruby/library/socket/unixsocket/remote_address_spec.rb +++ b/spec/ruby/library/socket/unixsocket/remote_address_spec.rb @@ -1,45 +1,43 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -with_feature :unix_socket do - describe 'UNIXSocket#remote_address' do - before do - @path = SocketSpecs.socket_path - @server = UNIXServer.new(@path) - @client = UNIXSocket.new(@path) - end +describe 'UNIXSocket#remote_address' do + before do + @path = SocketSpecs.socket_path + @server = UNIXServer.new(@path) + @client = UNIXSocket.new(@path) + end - after do - @client.close - @server.close + after do + @client.close + @server.close - rm_r(@path) - end + rm_r(@path) + end - it 'returns an Addrinfo' do - @client.remote_address.should be_an_instance_of(Addrinfo) - end + it 'returns an Addrinfo' do + @client.remote_address.should.instance_of?(Addrinfo) + end - describe 'the returned Addrinfo' do - it 'uses AF_UNIX as the address family' do - @client.remote_address.afamily.should == Socket::AF_UNIX - end + describe 'the returned Addrinfo' do + it 'uses AF_UNIX as the address family' do + @client.remote_address.afamily.should == Socket::AF_UNIX + end - it 'uses PF_UNIX as the protocol family' do - @client.remote_address.pfamily.should == Socket::PF_UNIX - end + it 'uses PF_UNIX as the protocol family' do + @client.remote_address.pfamily.should == Socket::PF_UNIX + end - it 'uses SOCK_STREAM as the socket type' do - @client.remote_address.socktype.should == Socket::SOCK_STREAM - end + it 'uses SOCK_STREAM as the socket type' do + @client.remote_address.socktype.should == Socket::SOCK_STREAM + end - it 'uses the correct socket path' do - @client.remote_address.unix_path.should == @path - end + it 'uses the correct socket path' do + @client.remote_address.unix_path.should == @path + end - it 'uses 0 as the protocol' do - @client.remote_address.protocol.should == 0 - end + it 'uses 0 as the protocol' do + @client.remote_address.protocol.should == 0 end end end diff --git a/spec/ruby/library/socket/unixsocket/send_io_spec.rb b/spec/ruby/library/socket/unixsocket/send_io_spec.rb index a2a7d26539..0063fc7d3f 100644 --- a/spec/ruby/library/socket/unixsocket/send_io_spec.rb +++ b/spec/ruby/library/socket/unixsocket/send_io_spec.rb @@ -1,9 +1,8 @@ require_relative '../spec_helper' require_relative '../fixtures/classes' -describe "UNIXSocket#send_io" do - - platform_is_not :windows do +platform_is_not :windows do + describe "UNIXSocket#send_io" do before :each do @path = SocketSpecs.socket_path @server = UNIXServer.open(@path) @@ -32,9 +31,7 @@ describe "UNIXSocket#send_io" do @io.read.should == File.read(@send_io_path) end end -end -with_feature :unix_socket do describe 'UNIXSocket#send_io' do before do @file = File.open('/dev/null', 'w') @@ -52,7 +49,7 @@ with_feature :unix_socket do @client.send_io(@file) @io = @server.recv_io - @io.should be_an_instance_of(IO) + @io.should.instance_of?(IO) end end end diff --git a/spec/ruby/library/socket/unixsocket/shared/new.rb b/spec/ruby/library/socket/unixsocket/shared/new.rb index 76a4e1701e..f075b03c5e 100644 --- a/spec/ruby/library/socket/unixsocket/shared/new.rb +++ b/spec/ruby/library/socket/unixsocket/shared/new.rb @@ -2,23 +2,21 @@ require_relative '../../spec_helper' require_relative '../../fixtures/classes' describe :unixsocket_new, shared: true do - platform_is_not :windows do - before :each do - @path = SocketSpecs.socket_path - @server = UNIXServer.open(@path) - end + before :each do + @path = SocketSpecs.socket_path + @server = UNIXServer.open(@path) + end - after :each do - @client.close if @client - @server.close - SocketSpecs.rm_socket @path - end + after :each do + @client.close if @client + @server.close + SocketSpecs.rm_socket @path + end - it "opens a unix socket on the specified file" do - @client = UNIXSocket.send(@method, @path) + it "opens a unix socket on the specified file" do + @client = UNIXSocket.send(@method, @path) - @client.addr[0].should == "AF_UNIX" - @client.closed?.should == false - end + @client.addr[0].should == "AF_UNIX" + @client.should_not.closed? end end diff --git a/spec/ruby/library/socket/unixsocket/shared/pair.rb b/spec/ruby/library/socket/unixsocket/shared/pair.rb new file mode 100644 index 0000000000..49b6a6a413 --- /dev/null +++ b/spec/ruby/library/socket/unixsocket/shared/pair.rb @@ -0,0 +1,47 @@ +require_relative '../../spec_helper' +require_relative '../../fixtures/classes' + +describe :unixsocket_pair, shared: true do + it "returns two UNIXSockets" do + @s1.should.instance_of?(UNIXSocket) + @s2.should.instance_of?(UNIXSocket) + end + + it "returns a pair of connected sockets" do + @s1.puts "foo" + @s2.gets.should == "foo\n" + end + + platform_is_not :windows do + it "sets the socket paths to empty Strings" do + @s1.path.should == "" + @s2.path.should == "" + end + + it "sets the socket addresses to empty Strings" do + @s1.addr.should == ["AF_UNIX", ""] + @s2.addr.should == ["AF_UNIX", ""] + end + + it "sets the socket peer addresses to empty Strings" do + @s1.peeraddr.should == ["AF_UNIX", ""] + @s2.peeraddr.should == ["AF_UNIX", ""] + end + end + + platform_is :windows do + it "emulates unnamed sockets with a temporary file with a path" do + @s1.addr.should == ["AF_UNIX", @s1.path] + @s2.peeraddr.should == ["AF_UNIX", @s1.path] + end + + it "sets the peer address of first socket to an empty string" do + @s1.peeraddr.should == ["AF_UNIX", ""] + end + + it "sets the address and path of second socket to an empty string" do + @s2.addr.should == ["AF_UNIX", ""] + @s2.path.should == "" + end + end +end diff --git a/spec/ruby/library/socket/unixsocket/socketpair_spec.rb b/spec/ruby/library/socket/unixsocket/socketpair_spec.rb index 3e9646f76b..c61fc00be4 100644 --- a/spec/ruby/library/socket/unixsocket/socketpair_spec.rb +++ b/spec/ruby/library/socket/unixsocket/socketpair_spec.rb @@ -1,40 +1,18 @@ require_relative '../spec_helper' +require_relative '../fixtures/classes' +require_relative '../shared/partially_closable_sockets' +require_relative 'shared/pair' -with_feature :unix_socket do - describe 'UNIXSocket.socketpair' do - before do - @s1, @s2 = UNIXSocket.socketpair - end +describe "UNIXSocket.socketpair" do + it_should_behave_like :unixsocket_pair + it_should_behave_like :partially_closable_sockets - after do - @s1.close - @s2.close - end - - it 'returns two UNIXSockets' do - @s1.should be_an_instance_of(UNIXSocket) - @s2.should be_an_instance_of(UNIXSocket) - end - - it 'connects the sockets to each other' do - @s1.write('hello') - - @s2.recv(5).should == 'hello' - end - - it 'sets the socket paths to empty Strings' do - @s1.path.should == '' - @s2.path.should == '' - end - - it 'sets the socket addresses to empty Strings' do - @s1.addr.should == ['AF_UNIX', ''] - @s2.addr.should == ['AF_UNIX', ''] - end + before :each do + @s1, @s2 = UNIXSocket.socketpair + end - it 'sets the socket peer addresses to empty Strings' do - @s1.peeraddr.should == ['AF_UNIX', ''] - @s2.peeraddr.should == ['AF_UNIX', ''] - end + after :each do + @s1.close + @s2.close end end diff --git a/spec/ruby/library/stringio/append_spec.rb b/spec/ruby/library/stringio/append_spec.rb index 08500bc520..c21ba00508 100644 --- a/spec/ruby/library/stringio/append_spec.rb +++ b/spec/ruby/library/stringio/append_spec.rb @@ -3,11 +3,11 @@ require_relative 'fixtures/classes' describe "StringIO#<< when passed [Object]" do before :each do - @io = StringIO.new("example") + @io = StringIO.new(+"example") end it "returns self" do - (@io << "just testing").should equal(@io) + (@io << "just testing").should.equal?(@io) end it "writes the passed argument onto self" do @@ -29,19 +29,9 @@ describe "StringIO#<< when passed [Object]" do @io.string.should == "example\000\000\000\000\000\000\000\000just testing" end - it "taints self's String when the passed argument is tainted" do - (@io << "test".taint) - @io.string.tainted?.should be_true - end - - it "does not taint self when the passed argument is tainted" do - (@io << "test".taint) - @io.tainted?.should be_false - end - it "updates self's position" do @io << "test" - @io.pos.should eql(4) + @io.pos.should.eql?(4) end it "tries to convert the passed argument to a String using #to_s" do @@ -54,18 +44,18 @@ end describe "StringIO#<< when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io << "test" }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io << "test" }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io << "test" }.should raise_error(IOError) + -> { io << "test" }.should.raise(IOError) end end describe "StringIO#<< when in append mode" do before :each do - @io = StringIO.new("example", "a") + @io = StringIO.new(+"example", "a") end it "appends the passed argument to the end of self, ignoring current position" do @@ -79,6 +69,6 @@ describe "StringIO#<< when in append mode" do it "correctly updates self's position" do @io << ", testing" - @io.pos.should eql(16) + @io.pos.should.eql?(16) end end diff --git a/spec/ruby/library/stringio/binmode_spec.rb b/spec/ruby/library/stringio/binmode_spec.rb index 5d9a8c41df..bc7ccda0a2 100644 --- a/spec/ruby/library/stringio/binmode_spec.rb +++ b/spec/ruby/library/stringio/binmode_spec.rb @@ -3,7 +3,21 @@ require_relative 'fixtures/classes' describe "StringIO#binmode" do it "returns self" do - io = StringIO.new("example") - io.binmode.should equal(io) + io = StringIO.new(+"example") + io.binmode.should.equal?(io) + end + + it "changes external encoding to BINARY" do + io = StringIO.new + io.external_encoding.should == Encoding.find('external') + io.binmode + io.external_encoding.should == Encoding::BINARY + end + + it "does not set internal encoding" do + io = StringIO.new + io.internal_encoding.should == nil + io.binmode + io.internal_encoding.should == nil end end diff --git a/spec/ruby/library/stringio/bytes_spec.rb b/spec/ruby/library/stringio/bytes_spec.rb deleted file mode 100644 index 692fba997f..0000000000 --- a/spec/ruby/library/stringio/bytes_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require 'stringio' -require_relative 'shared/each_byte' - -describe "StringIO#bytes" do - it_behaves_like :stringio_each_byte, :bytes -end - -describe "StringIO#bytes when self is not readable" do - it_behaves_like :stringio_each_byte_not_readable, :bytes -end diff --git a/spec/ruby/library/stringio/chars_spec.rb b/spec/ruby/library/stringio/chars_spec.rb deleted file mode 100644 index 7dc55d4b37..0000000000 --- a/spec/ruby/library/stringio/chars_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require 'stringio' -require_relative 'shared/each_char' - -describe "StringIO#chars" do - it_behaves_like :stringio_each_char, :chars -end - -describe "StringIO#chars when self is not readable" do - it_behaves_like :stringio_each_char_not_readable, :chars -end diff --git a/spec/ruby/library/stringio/close_read_spec.rb b/spec/ruby/library/stringio/close_read_spec.rb index 05d6c9f7d2..dd46a927be 100644 --- a/spec/ruby/library/stringio/close_read_spec.rb +++ b/spec/ruby/library/stringio/close_read_spec.rb @@ -3,16 +3,16 @@ require_relative 'fixtures/classes' describe "StringIO#close_read" do before :each do - @io = StringIO.new("example") + @io = StringIO.new(+"example") end it "returns nil" do - @io.close_read.should be_nil + @io.close_read.should == nil end it "prevents further reading" do @io.close_read - lambda { @io.read(1) }.should raise_error(IOError) + -> { @io.read(1) }.should.raise(IOError) end it "allows further writing" do @@ -21,8 +21,8 @@ describe "StringIO#close_read" do end it "raises an IOError when in write-only mode" do - io = StringIO.new("example", "w") - lambda { io.close_read }.should raise_error(IOError) + io = StringIO.new(+"example", "w") + -> { io.close_read }.should.raise(IOError) io = StringIO.new("example") io.close_read diff --git a/spec/ruby/library/stringio/close_spec.rb b/spec/ruby/library/stringio/close_spec.rb index a5a931aff1..6febd14a26 100644 --- a/spec/ruby/library/stringio/close_spec.rb +++ b/spec/ruby/library/stringio/close_spec.rb @@ -7,17 +7,17 @@ describe "StringIO#close" do end it "returns nil" do - @io.close.should be_nil + @io.close.should == nil end it "prevents further reading and/or writing" do @io.close - lambda { @io.read(1) }.should raise_error(IOError) - lambda { @io.write('x') }.should raise_error(IOError) + -> { @io.read(1) }.should.raise(IOError) + -> { @io.write('x') }.should.raise(IOError) end it "does not raise anything when self was already closed" do @io.close - lambda { @io.close }.should_not raise_error(IOError) + -> { @io.close }.should_not.raise(IOError) end end diff --git a/spec/ruby/library/stringio/close_write_spec.rb b/spec/ruby/library/stringio/close_write_spec.rb index 8a7ac12581..b74b996166 100644 --- a/spec/ruby/library/stringio/close_write_spec.rb +++ b/spec/ruby/library/stringio/close_write_spec.rb @@ -3,16 +3,16 @@ require_relative 'fixtures/classes' describe "StringIO#close_write" do before :each do - @io = StringIO.new("example") + @io = StringIO.new(+"example") end it "returns nil" do - @io.close_write.should be_nil + @io.close_write.should == nil end it "prevents further writing" do @io.close_write - lambda { @io.write('x') }.should raise_error(IOError) + -> { @io.write('x') }.should.raise(IOError) end it "allows further reading" do @@ -21,10 +21,10 @@ describe "StringIO#close_write" do end it "raises an IOError when in read-only mode" do - io = StringIO.new("example", "r") - lambda { io.close_write }.should raise_error(IOError) + io = StringIO.new(+"example", "r") + -> { io.close_write }.should.raise(IOError) - io = StringIO.new("example") + io = StringIO.new(+"example") io.close_write io.close_write.should == nil end diff --git a/spec/ruby/library/stringio/closed_read_spec.rb b/spec/ruby/library/stringio/closed_read_spec.rb index cb4267ac98..2e3813b1bc 100644 --- a/spec/ruby/library/stringio/closed_read_spec.rb +++ b/spec/ruby/library/stringio/closed_read_spec.rb @@ -3,10 +3,10 @@ require_relative 'fixtures/classes' describe "StringIO#closed_read?" do it "returns true if self is not readable" do - io = StringIO.new("example", "r+") + io = StringIO.new(+"example", "r+") io.close_write - io.closed_read?.should be_false + io.closed_read?.should == false io.close_read - io.closed_read?.should be_true + io.closed_read?.should == true end end diff --git a/spec/ruby/library/stringio/closed_spec.rb b/spec/ruby/library/stringio/closed_spec.rb index ca8a2232a8..647fe445da 100644 --- a/spec/ruby/library/stringio/closed_spec.rb +++ b/spec/ruby/library/stringio/closed_spec.rb @@ -3,14 +3,14 @@ require_relative 'fixtures/classes' describe "StringIO#closed?" do it "returns true if self is completely closed" do - io = StringIO.new("example", "r+") + io = StringIO.new(+"example", "r+") io.close_read - io.closed?.should be_false + io.closed?.should == false io.close_write - io.closed?.should be_true + io.closed?.should == true - io = StringIO.new("example", "r+") + io = StringIO.new(+"example", "r+") io.close - io.closed?.should be_true + io.closed?.should == true end end diff --git a/spec/ruby/library/stringio/closed_write_spec.rb b/spec/ruby/library/stringio/closed_write_spec.rb index 5c111affd8..339691cd82 100644 --- a/spec/ruby/library/stringio/closed_write_spec.rb +++ b/spec/ruby/library/stringio/closed_write_spec.rb @@ -3,10 +3,10 @@ require_relative 'fixtures/classes' describe "StringIO#closed_write?" do it "returns true if self is not writable" do - io = StringIO.new("example", "r+") + io = StringIO.new(+"example", "r+") io.close_read - io.closed_write?.should be_false + io.closed_write?.should == false io.close_write - io.closed_write?.should be_true + io.closed_write?.should == true end end diff --git a/spec/ruby/library/stringio/codepoints_spec.rb b/spec/ruby/library/stringio/codepoints_spec.rb deleted file mode 100644 index cc2e5d1b5d..0000000000 --- a/spec/ruby/library/stringio/codepoints_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -# -*- encoding: utf-8 -*- -require_relative '../../spec_helper' -require_relative 'fixtures/classes' -require_relative 'shared/codepoints' - -# See redmine #1667 -describe "StringIO#codepoints" do - it_behaves_like :stringio_codepoints, :codepoints -end diff --git a/spec/ruby/library/stringio/each_char_spec.rb b/spec/ruby/library/stringio/each_char_spec.rb index 7305162ee6..14b2f09a17 100644 --- a/spec/ruby/library/stringio/each_char_spec.rb +++ b/spec/ruby/library/stringio/each_char_spec.rb @@ -7,5 +7,5 @@ describe "StringIO#each_char" do end describe "StringIO#each_char when self is not readable" do - it_behaves_like :stringio_each_char_not_readable, :chars + it_behaves_like :stringio_each_char_not_readable, :each_char end diff --git a/spec/ruby/library/stringio/each_codepoint_spec.rb b/spec/ruby/library/stringio/each_codepoint_spec.rb index 85aa34d9d8..f18de22aad 100644 --- a/spec/ruby/library/stringio/each_codepoint_spec.rb +++ b/spec/ruby/library/stringio/each_codepoint_spec.rb @@ -5,5 +5,5 @@ require_relative 'shared/codepoints' # See redmine #1667 describe "StringIO#each_codepoint" do - it_behaves_like :stringio_codepoints, :codepoints + it_behaves_like :stringio_codepoints, :each_codepoint end diff --git a/spec/ruby/library/stringio/each_line_spec.rb b/spec/ruby/library/stringio/each_line_spec.rb index f6eae02690..4ac0db7c45 100644 --- a/spec/ruby/library/stringio/each_line_spec.rb +++ b/spec/ruby/library/stringio/each_line_spec.rb @@ -14,8 +14,14 @@ describe "StringIO#each_line when self is not readable" do it_behaves_like :stringio_each_not_readable, :each_line end -ruby_version_is "2.4" do - describe "StringIO#each_line when passed chomp" do - it_behaves_like :stringio_each_chomp, :each_line - end +describe "StringIO#each_line when passed chomp" do + it_behaves_like :stringio_each_chomp, :each_line +end + +describe "StringIO#each_line when passed limit" do + it_behaves_like :stringio_each_limit, :each_line +end + +describe "StringIO#each when passed separator and limit" do + it_behaves_like :stringio_each_separator_and_limit, :each_line end diff --git a/spec/ruby/library/stringio/each_spec.rb b/spec/ruby/library/stringio/each_spec.rb index 4ecaba3dad..7eb322f3ff 100644 --- a/spec/ruby/library/stringio/each_spec.rb +++ b/spec/ruby/library/stringio/each_spec.rb @@ -14,8 +14,18 @@ describe "StringIO#each when self is not readable" do it_behaves_like :stringio_each_not_readable, :each end -ruby_version_is "2.4" do - describe "StringIO#each when passed chomp" do - it_behaves_like :stringio_each_chomp, :each - end +describe "StringIO#each when passed chomp" do + it_behaves_like :stringio_each_chomp, :each +end + +describe "StringIO#each when passed chomp" do + it_behaves_like :stringio_each_separator_and_chomp, :each +end + +describe "StringIO#each when passed limit" do + it_behaves_like :stringio_each_limit, :each +end + +describe "StringIO#each when passed separator and limit" do + it_behaves_like :stringio_each_separator_and_limit, :each end diff --git a/spec/ruby/library/stringio/fcntl_spec.rb b/spec/ruby/library/stringio/fcntl_spec.rb index e4133c0d06..6108130db7 100644 --- a/spec/ruby/library/stringio/fcntl_spec.rb +++ b/spec/ruby/library/stringio/fcntl_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "StringIO#fcntl" do it "raises a NotImplementedError" do - lambda { StringIO.new("boom").fcntl }.should raise_error(NotImplementedError) + -> { StringIO.new("boom").fcntl }.should.raise(NotImplementedError) end end diff --git a/spec/ruby/library/stringio/fileno_spec.rb b/spec/ruby/library/stringio/fileno_spec.rb index eea03a5af3..f5d1e83776 100644 --- a/spec/ruby/library/stringio/fileno_spec.rb +++ b/spec/ruby/library/stringio/fileno_spec.rb @@ -1,9 +1,8 @@ require_relative '../../spec_helper' -require_relative 'fixtures/classes' -require_relative 'shared/each' +require 'stringio' describe "StringIO#fileno" do it "returns nil" do - StringIO.new("nuffin").fileno.should be_nil + StringIO.new("nuffin").fileno.should == nil end end diff --git a/spec/ruby/library/stringio/fixtures/classes.rb b/spec/ruby/library/stringio/fixtures/classes.rb index bb8dc354cc..832c5457d7 100644 --- a/spec/ruby/library/stringio/fixtures/classes.rb +++ b/spec/ruby/library/stringio/fixtures/classes.rb @@ -4,12 +4,12 @@ class StringSubclass < String; end module StringIOSpecs def self.build - str = <<-EOS + str = <<-EOS each peach pear plum - EOS + EOS StringIO.new(str) end end diff --git a/spec/ruby/library/stringio/flush_spec.rb b/spec/ruby/library/stringio/flush_spec.rb index 17a16dfdd5..48be44773c 100644 --- a/spec/ruby/library/stringio/flush_spec.rb +++ b/spec/ruby/library/stringio/flush_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#flush" do it "returns self" do - io = StringIO.new("flush") - io.flush.should equal(io) + io = StringIO.new(+"flush") + io.flush.should.equal?(io) end end diff --git a/spec/ruby/library/stringio/fsync_spec.rb b/spec/ruby/library/stringio/fsync_spec.rb index 8fb2b59a24..30fae15c8e 100644 --- a/spec/ruby/library/stringio/fsync_spec.rb +++ b/spec/ruby/library/stringio/fsync_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#fsync" do it "returns zero" do - io = StringIO.new("fsync") - io.fsync.should eql(0) + io = StringIO.new(+"fsync") + io.fsync.should.eql?(0) end end diff --git a/spec/ruby/library/stringio/getch_spec.rb b/spec/ruby/library/stringio/getch_spec.rb index 06670a178c..113b4971bf 100644 --- a/spec/ruby/library/stringio/getch_spec.rb +++ b/spec/ruby/library/stringio/getch_spec.rb @@ -17,15 +17,13 @@ describe "StringIO#getch" do io.getch.should == ?a end - with_feature :encoding do - it "increments #pos by the byte size of the character in multibyte strings" do - io = StringIO.new("föóbar") - - io.getch; io.pos.should == 1 # "f" has byte size 1 - io.getch; io.pos.should == 3 # "ö" has byte size 2 - io.getch; io.pos.should == 5 # "ó" has byte size 2 - io.getch; io.pos.should == 6 # "b" has byte size 1 - end + it "increments #pos by the byte size of the character in multibyte strings" do + io = StringIO.new("föóbar") + + io.getch; io.pos.should == 1 # "f" has byte size 1 + io.getch; io.pos.should == 3 # "ö" has byte size 2 + io.getch; io.pos.should == 5 # "ó" has byte size 2 + io.getch; io.pos.should == 6 # "b" has byte size 1 end it "returns nil at the end of the string" do diff --git a/spec/ruby/library/stringio/getpass_spec.rb b/spec/ruby/library/stringio/getpass_spec.rb new file mode 100644 index 0000000000..60fc64f0c5 --- /dev/null +++ b/spec/ruby/library/stringio/getpass_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../spec_helper' +require 'stringio' + +# This method is added by io/console on require. +describe "StringIO#getpass" do + require 'io/console' + + it "is defined by io/console" do + StringIO.new("example").should.respond_to?(:getpass) + end +end diff --git a/spec/ruby/library/stringio/gets_spec.rb b/spec/ruby/library/stringio/gets_spec.rb index 7fe00d8d19..5dc572fba5 100644 --- a/spec/ruby/library/stringio/gets_spec.rb +++ b/spec/ruby/library/stringio/gets_spec.rb @@ -1,247 +1,61 @@ require_relative '../../spec_helper' require "stringio" +require_relative "shared/gets" -describe "StringIO#gets when passed [separator]" do - before :each do - @io = StringIO.new("this>is>an>example") - end - - it "returns the data read till the next occurrence of the passed separator" do - @io.gets(">").should == "this>" - @io.gets(">").should == "is>" - @io.gets(">").should == "an>" - @io.gets(">").should == "example" - end - - it "sets $_ to the read content" do - @io.gets(">") - $_.should == "this>" - @io.gets(">") - $_.should == "is>" - @io.gets(">") - $_.should == "an>" - @io.gets(">") - $_.should == "example" - @io.gets(">") - $_.should be_nil - end - - it "accepts string as separator" do - @io.gets("is>") - $_.should == "this>" - @io.gets("an>") - $_.should == "is>an>" - @io.gets("example") - $_.should == "example" - @io.gets("ple") - $_.should be_nil - end - - it "updates self's lineno by one" do - @io.gets(">") - @io.lineno.should eql(1) - - @io.gets(">") - @io.lineno.should eql(2) - - @io.gets(">") - @io.lineno.should eql(3) - end - - it "returns the next paragraph when the passed separator is an empty String" do - io = StringIO.new("this is\n\nan example") - io.gets("").should == "this is\n\n" - io.gets("").should == "an example" - end - - it "returns the remaining content starting at the current position when passed nil" do - io = StringIO.new("this is\n\nan example") - io.pos = 5 - io.gets(nil).should == "is\n\nan example" - end +describe "StringIO#gets" do + describe "when passed [separator]" do + it_behaves_like :stringio_gets_separator, :gets - it "tries to convert the passed separator to a String using #to_str" do - obj = mock('to_str') - obj.should_receive(:to_str).and_return(">") - @io.gets(obj).should == "this>" - end -end - -describe "StringIO#gets when passed no argument" do - before :each do - @io = StringIO.new("this is\nan example\nfor StringIO#gets") - end + it "returns nil if self is at the end" do + @io = StringIO.new("this>is>an>example") - it "returns the data read till the next occurrence of $/ or till eof" do - @io.gets.should == "this is\n" - - begin - old_sep, $/ = $/, " " - @io.gets.should == "an " - @io.gets.should == "example\nfor " - @io.gets.should == "StringIO#gets" - ensure - $/ = old_sep + @io.pos = 36 + @io.gets(">").should == nil + @io.gets(">").should == nil end end - it "sets $_ to the read content" do - @io.gets - $_.should == "this is\n" - @io.gets - $_.should == "an example\n" - @io.gets - $_.should == "for StringIO#gets" - @io.gets - $_.should be_nil - end - - it "updates self's position" do - @io.gets - @io.pos.should eql(8) + describe "when passed [limit]" do + it_behaves_like :stringio_gets_limit, :gets - @io.gets - @io.pos.should eql(19) + it "returns nil if self is at the end" do + @io = StringIO.new("this>is>an>example") - @io.gets - @io.pos.should eql(36) - end - - it "updates self's lineno" do - @io.gets - @io.lineno.should eql(1) - - @io.gets - @io.lineno.should eql(2) - - @io.gets - @io.lineno.should eql(3) - end - - it "returns nil if self is at the end" do - @io.pos = 36 - @io.gets.should be_nil - @io.gets.should be_nil - end -end - -describe "StringIO#gets when passed [limit]" do - before :each do - @io = StringIO.new("this>is>an>example") - end - - it "returns the data read until the limit is met" do - @io.gets(4).should == "this" - @io.gets(3).should == ">is" - @io.gets(5).should == ">an>e" - @io.gets(6).should == "xample" - end - - it "sets $_ to the read content" do - @io.gets(4) - $_.should == "this" - @io.gets(3) - $_.should == ">is" - @io.gets(5) - $_.should == ">an>e" - @io.gets(6) - $_.should == "xample" - @io.gets(3) - $_.should be_nil - end - - it "updates self's lineno by one" do - @io.gets(3) - @io.lineno.should eql(1) - - @io.gets(3) - @io.lineno.should eql(2) - - @io.gets(3) - @io.lineno.should eql(3) - end - - it "tries to convert the passed limit to an Integer using #to_int" do - obj = mock('to_int') - obj.should_receive(:to_int).and_return(4) - @io.gets(obj).should == "this" - end - - it "returns a blank string when passed a limit of 0" do - @io.gets(0).should == "" - end -end - -describe "StringIO#gets when passed [separator] and [limit]" do - before :each do - @io = StringIO.new("this>is>an>example") - end - - it "returns the data read until the limit is consumed or the separator is met" do - @io.gets('>', 8).should == "this>" - @io.gets('>', 2).should == "is" - @io.gets('>', 10).should == ">" - @io.gets('>', 6).should == "an>" - @io.gets('>', 5).should == "examp" - end - - it "sets $_ to the read content" do - @io.gets('>', 8) - $_.should == "this>" - @io.gets('>', 2) - $_.should == "is" - @io.gets('>', 10) - $_.should == ">" - @io.gets('>', 6) - $_.should == "an>" - @io.gets('>', 5) - $_.should == "examp" + @io.pos = 36 + @io.gets(3).should == nil + @io.gets(3).should == nil + end end - it "updates self's lineno by one" do - @io.gets('>', 3) - @io.lineno.should eql(1) + describe "when passed [separator] and [limit]" do + it_behaves_like :stringio_gets_separator_and_limit, :gets - @io.gets('>', 3) - @io.lineno.should eql(2) + it "returns nil if self is at the end" do + @io = StringIO.new("this>is>an>example") - @io.gets('>', 3) - @io.lineno.should eql(3) + @io.pos = 36 + @io.gets(">", 3).should == nil + @io.gets(">", 3).should == nil + end end - it "tries to convert the passed separator to a String using #to_str" do - obj = mock('to_str') - obj.should_receive(:to_str).and_return('>') - @io.gets(obj, 5).should == "this>" - end + describe "when passed no argument" do + it_behaves_like :stringio_gets_no_argument, :gets - it "does not raise TypeError if passed separator is nil" do - @io.gets(nil, 5).should == "this>" - end + it "returns nil if self is at the end" do + @io = StringIO.new("this>is>an>example") - it "tries to convert the passed limit to an Integer using #to_int" do - obj = mock('to_int') - obj.should_receive(:to_int).and_return(5) - @io.gets('>', obj).should == "this>" + @io.pos = 36 + @io.gets.should == nil + @io.gets.should == nil + end end -end -describe "StringIO#gets when in write-only mode" do - it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.gets }.should raise_error(IOError) - - io = StringIO.new("xyz") - io.close_read - lambda { io.gets }.should raise_error(IOError) + describe "when passed [chomp]" do + it_behaves_like :stringio_gets_chomp, :gets end -end -ruby_version_is "2.4" do - describe "StringIO#gets when passed [chomp]" do - it "returns the data read without a trailing newline character" do - io = StringIO.new("this>is>an>example\n") - io.gets(chomp: true).should == "this>is>an>example" - end + describe "when in write-only mode" do + it_behaves_like :stringio_gets_write_only, :gets end end diff --git a/spec/ruby/library/stringio/initialize_spec.rb b/spec/ruby/library/stringio/initialize_spec.rb index bbb11b8f31..413e0aacc0 100644 --- a/spec/ruby/library/stringio/initialize_spec.rb +++ b/spec/ruby/library/stringio/initialize_spec.rb @@ -8,127 +8,147 @@ describe "StringIO#initialize when passed [Object, mode]" do it "uses the passed Object as the StringIO backend" do @io.send(:initialize, str = "example", "r") - @io.string.should equal(str) + @io.string.should.equal?(str) end it "sets the mode based on the passed mode" do io = StringIO.allocate - io.send(:initialize, "example", "r") - io.closed_read?.should be_false - io.closed_write?.should be_true + io.send(:initialize, +"example", "r") + io.closed_read?.should == false + io.closed_write?.should == true io = StringIO.allocate - io.send(:initialize, "example", "rb") - io.closed_read?.should be_false - io.closed_write?.should be_true + io.send(:initialize, +"example", "rb") + io.closed_read?.should == false + io.closed_write?.should == true io = StringIO.allocate - io.send(:initialize, "example", "r+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "r+") + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "rb+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "rb+") + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "w") - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", "w") + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "wb") - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", "wb") + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "w+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "w+") + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "wb+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "wb+") + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "a") - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", "a") + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "ab") - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", "ab") + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "a+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "a+") + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", "ab+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", "ab+") + io.closed_read?.should == false + io.closed_write?.should == false end it "allows passing the mode as an Integer" do io = StringIO.allocate - io.send(:initialize, "example", IO::RDONLY) - io.closed_read?.should be_false - io.closed_write?.should be_true + io.send(:initialize, +"example", IO::RDONLY) + io.closed_read?.should == false + io.closed_write?.should == true io = StringIO.allocate - io.send(:initialize, "example", IO::RDWR) - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::RDWR) + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", IO::WRONLY) - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::WRONLY) + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", IO::WRONLY | IO::TRUNC) - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::WRONLY | IO::TRUNC) + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", IO::RDWR | IO::TRUNC) - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::RDWR | IO::TRUNC) + io.closed_read?.should == false + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", IO::WRONLY | IO::APPEND) - io.closed_read?.should be_true - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::WRONLY | IO::APPEND) + io.closed_read?.should == true + io.closed_write?.should == false io = StringIO.allocate - io.send(:initialize, "example", IO::RDWR | IO::APPEND) - io.closed_read?.should be_false - io.closed_write?.should be_false + io.send(:initialize, +"example", IO::RDWR | IO::APPEND) + io.closed_read?.should == false + io.closed_write?.should == false end - it "raises a #{frozen_error_class} when passed a frozen String in truncate mode as StringIO backend" do + it "raises a FrozenError when passed a frozen String in truncate mode as StringIO backend" do io = StringIO.allocate - lambda { io.send(:initialize, "example".freeze, IO::TRUNC) }.should raise_error(frozen_error_class) + -> { io.send(:initialize, "example".freeze, IO::TRUNC) }.should.raise(FrozenError) end it "tries to convert the passed mode to a String using #to_str" do obj = mock('to_str') obj.should_receive(:to_str).and_return("r") - @io.send(:initialize, "example", obj) + @io.send(:initialize, +"example", obj) - @io.closed_read?.should be_false - @io.closed_write?.should be_true + @io.closed_read?.should == false + @io.closed_write?.should == true end it "raises an Errno::EACCES error when passed a frozen string with a write-mode" do (str = "example").freeze - lambda { @io.send(:initialize, str, "r+") }.should raise_error(Errno::EACCES) - lambda { @io.send(:initialize, str, "w") }.should raise_error(Errno::EACCES) - lambda { @io.send(:initialize, str, "a") }.should raise_error(Errno::EACCES) + -> { @io.send(:initialize, str, "r+") }.should.raise(Errno::EACCES) + -> { @io.send(:initialize, str, "w") }.should.raise(Errno::EACCES) + -> { @io.send(:initialize, str, "a") }.should.raise(Errno::EACCES) + end + + it "truncates all the content if passed w mode" do + io = StringIO.allocate + source = +"example".encode(Encoding::ISO_8859_1); + + io.send(:initialize, source, "w") + + io.string.should.empty? + io.string.encoding.should == Encoding::ISO_8859_1 + end + + it "truncates all the content if passed IO::TRUNC mode" do + io = StringIO.allocate + source = +"example".encode(Encoding::ISO_8859_1); + + io.send(:initialize, source, IO::TRUNC) + + io.string.should.empty? + io.string.encoding.should == Encoding::ISO_8859_1 end end @@ -139,13 +159,19 @@ describe "StringIO#initialize when passed [Object]" do it "uses the passed Object as the StringIO backend" do @io.send(:initialize, str = "example") - @io.string.should equal(str) + @io.string.should.equal?(str) end - it "sets the mode to read-write" do - @io.send(:initialize, "example") - @io.closed_read?.should be_false - @io.closed_write?.should be_false + it "sets the mode to read-write if the string is mutable" do + @io.send(:initialize, +"example") + @io.closed_read?.should == false + @io.closed_write?.should == false + end + + it "sets the mode to read if the string is frozen" do + @io.send(:initialize, -"example") + @io.closed_read?.should == false + @io.closed_write?.should == true end it "tries to convert the passed Object to a String using #to_str" do @@ -158,8 +184,93 @@ describe "StringIO#initialize when passed [Object]" do it "automatically sets the mode to read-only when passed a frozen string" do (str = "example").freeze @io.send(:initialize, str) - @io.closed_read?.should be_false - @io.closed_write?.should be_true + @io.closed_read?.should == false + @io.closed_write?.should == true + end +end + +# NOTE: Synchronise with core/io/new_spec.rb (core/io/shared/new.rb) +describe "StringIO#initialize when passed keyword arguments" do + it "sets the mode based on the passed :mode option" do + io = StringIO.new("example", mode: "r") + io.closed_read?.should == false + io.closed_write?.should == true + end + + it "accepts a mode argument set to nil with a valid :mode option" do + @io = StringIO.new(+'', nil, mode: "w") + @io.write("foo").should == 3 + end + + it "accepts a mode argument with a :mode option set to nil" do + @io = StringIO.new(+'', "w", mode: nil) + @io.write("foo").should == 3 + end + + it "sets binmode from :binmode option" do + @io = StringIO.new(+'', 'w', binmode: true) + @io.external_encoding.to_s.should == "ASCII-8BIT" # #binmode? isn't implemented in StringIO + end + + it "does not set binmode from false :binmode" do + @io = StringIO.new(+'', 'w', binmode: false) + @io.external_encoding.to_s.should == "UTF-8" # #binmode? isn't implemented in StringIO + end +end + +# NOTE: Synchronise with core/io/new_spec.rb (core/io/shared/new.rb) +describe "StringIO#initialize when passed keyword arguments and error happens" do + it "raises an error if passed encodings two ways" do + -> { + @io = StringIO.new(+'', 'w:ISO-8859-1', encoding: 'ISO-8859-1') + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', 'w:ISO-8859-1', external_encoding: 'ISO-8859-1') + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', 'w:ISO-8859-1:UTF-8', internal_encoding: 'ISO-8859-1') + }.should.raise(ArgumentError) + end + + it "raises an error if passed matching binary/text mode two ways" do + -> { + @io = StringIO.new(+'', "wb", binmode: true) + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', "wt", textmode: true) + }.should.raise(ArgumentError) + + -> { + @io = StringIO.new(+'', "wb", textmode: false) + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', "wt", binmode: false) + }.should.raise(ArgumentError) + end + + it "raises an error if passed conflicting binary/text mode two ways" do + -> { + @io = StringIO.new(+'', "wb", binmode: false) + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', "wt", textmode: false) + }.should.raise(ArgumentError) + + -> { + @io = StringIO.new(+'', "wb", textmode: true) + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', "wt", binmode: true) + }.should.raise(ArgumentError) + end + + it "raises an error when trying to set both binmode and textmode" do + -> { + @io = StringIO.new(+'', "w", textmode: true, binmode: true) + }.should.raise(ArgumentError) + -> { + @io = StringIO.new(+'', File::Constants::WRONLY, textmode: true, binmode: true) + }.should.raise(ArgumentError) end end @@ -169,13 +280,13 @@ describe "StringIO#initialize when passed no arguments" do end it "is private" do - StringIO.should have_private_instance_method(:initialize) + StringIO.private_instance_methods(false).should.include?(:initialize) end it "sets the mode to read-write" do - @io.send(:initialize, "example") - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.send(:initialize) + @io.closed_read?.should == false + @io.closed_write?.should == false end it "uses an empty String as the StringIO backend" do @@ -183,3 +294,35 @@ describe "StringIO#initialize when passed no arguments" do @io.string.should == "" end end + +describe "StringIO#initialize sets" do + before :each do + @external = Encoding.default_external + @internal = Encoding.default_internal + Encoding.default_external = Encoding::ISO_8859_2 + Encoding.default_internal = Encoding::ISO_8859_2 + end + + after :each do + Encoding.default_external = @external + Encoding.default_internal = @internal + end + + it "the encoding to Encoding.default_external when passed no arguments" do + io = StringIO.new + io.external_encoding.should == Encoding::ISO_8859_2 + io.string.encoding.should == Encoding::ISO_8859_2 + end + + it "the encoding to the encoding of the String when passed a String" do + s = ''.dup.force_encoding(Encoding::EUC_JP) + io = StringIO.new(s) + io.string.encoding.should == Encoding::EUC_JP + end + + it "the #external_encoding to the encoding of the String when passed a String" do + s = ''.dup.force_encoding(Encoding::EUC_JP) + io = StringIO.new(s) + io.external_encoding.should == Encoding::EUC_JP + end +end diff --git a/spec/ruby/library/stringio/inspect_spec.rb b/spec/ruby/library/stringio/inspect_spec.rb new file mode 100644 index 0000000000..962d858e48 --- /dev/null +++ b/spec/ruby/library/stringio/inspect_spec.rb @@ -0,0 +1,19 @@ +require_relative '../../spec_helper' +require "stringio" + +describe "StringIO#inspect" do + it "returns the same as #to_s" do + io = StringIO.new("example") + io.inspect.should == io.to_s + end + + it "does not include the contents" do + io = StringIO.new("contents") + io.inspect.should_not.include?("contents") + end + + it "uses the regular Object#inspect without any instance variable" do + io = StringIO.new("example") + io.inspect.should =~ /\A#<StringIO:0x\h+>\z/ + end +end diff --git a/spec/ruby/library/stringio/lineno_spec.rb b/spec/ruby/library/stringio/lineno_spec.rb index c620a1a686..a96dc05927 100644 --- a/spec/ruby/library/stringio/lineno_spec.rb +++ b/spec/ruby/library/stringio/lineno_spec.rb @@ -10,7 +10,7 @@ describe "StringIO#lineno" do @io.gets @io.gets @io.gets - @io.lineno.should eql(3) + @io.lineno.should.eql?(3) end end @@ -21,10 +21,10 @@ describe "StringIO#lineno=" do it "sets the current line number, but has no impact on the position" do @io.lineno = 3 - @io.pos.should eql(0) + @io.pos.should.eql?(0) @io.gets.should == "this\n" - @io.lineno.should eql(4) - @io.pos.should eql(5) + @io.lineno.should.eql?(4) + @io.pos.should.eql?(5) end end diff --git a/spec/ruby/library/stringio/lines_spec.rb b/spec/ruby/library/stringio/lines_spec.rb deleted file mode 100644 index dd5773f5a3..0000000000 --- a/spec/ruby/library/stringio/lines_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require_relative '../../spec_helper' -require 'stringio' -require_relative 'shared/each' - -describe "StringIO#lines when passed a separator" do - it_behaves_like :stringio_each_separator, :lines -end - -describe "StringIO#lines when passed no arguments" do - it_behaves_like :stringio_each_no_arguments, :lines -end - -describe "StringIO#lines when self is not readable" do - it_behaves_like :stringio_each_not_readable, :lines -end - -ruby_version_is "2.4" do - describe "StringIO#lines when passed chomp" do - it_behaves_like :stringio_each_chomp, :lines - end -end diff --git a/spec/ruby/library/stringio/new_spec.rb b/spec/ruby/library/stringio/new_spec.rb new file mode 100644 index 0000000000..ec4b32aa11 --- /dev/null +++ b/spec/ruby/library/stringio/new_spec.rb @@ -0,0 +1,10 @@ +require_relative '../../spec_helper' +require 'stringio' + +describe "StringIO.new" do + it "does not use the given block and warns to use StringIO::open" do + -> { + StringIO.new { raise } + }.should complain(/warning: StringIO::new\(\) does not take block; use StringIO::open\(\) instead/) + end +end diff --git a/spec/ruby/library/stringio/open_spec.rb b/spec/ruby/library/stringio/open_spec.rb index f8f3feabee..23c7b34e09 100644 --- a/spec/ruby/library/stringio/open_spec.rb +++ b/spec/ruby/library/stringio/open_spec.rb @@ -4,173 +4,177 @@ require 'stringio' describe "StringIO.open when passed [Object, mode]" do it "uses the passed Object as the StringIO backend" do io = StringIO.open(str = "example", "r") - io.string.should equal(str) + io.string.should.equal?(str) end it "returns the blocks return value when yielding" do - ret = StringIO.open("example", "r") { :test } - ret.should equal(:test) + ret = StringIO.open(+"example", "r") { :test } + ret.should.equal?(:test) end it "yields self to the passed block" do io = nil - StringIO.open("example", "r") { |strio| io = strio } - io.should be_kind_of(StringIO) + StringIO.open(+"example", "r") { |strio| io = strio } + io.should.is_a?(StringIO) end it "closes self after yielding" do io = nil - StringIO.open("example", "r") { |strio| io = strio } - io.closed?.should be_true + StringIO.open(+"example", "r") { |strio| io = strio } + io.closed?.should == true end it "even closes self when an exception is raised while yielding" do io = nil begin - StringIO.open("example", "r") do |strio| + StringIO.open(+"example", "r") do |strio| io = strio raise "Error" end rescue end - io.closed?.should be_true + io.closed?.should == true end it "sets self's string to nil after yielding" do io = nil - StringIO.open("example", "r") { |strio| io = strio } - io.string.should be_nil + StringIO.open(+"example", "r") { |strio| io = strio } + io.string.should == nil end it "even sets self's string to nil when an exception is raised while yielding" do io = nil begin - StringIO.open("example", "r") do |strio| + StringIO.open(+"example", "r") do |strio| io = strio raise "Error" end rescue end - io.string.should be_nil + io.string.should == nil end it "sets the mode based on the passed mode" do - io = StringIO.open("example", "r") - io.closed_read?.should be_false - io.closed_write?.should be_true + io = StringIO.open(+"example", "r") + io.closed_read?.should == false + io.closed_write?.should == true - io = StringIO.open("example", "rb") - io.closed_read?.should be_false - io.closed_write?.should be_true + io = StringIO.open(+"example", "rb") + io.closed_read?.should == false + io.closed_write?.should == true - io = StringIO.open("example", "r+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "r+") + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", "rb+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "rb+") + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", "w") - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", "w") + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", "wb") - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", "wb") + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", "w+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "w+") + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", "wb+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "wb+") + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", "a") - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", "a") + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", "ab") - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", "ab") + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", "a+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "a+") + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", "ab+") - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", "ab+") + io.closed_read?.should == false + io.closed_write?.should == false end it "allows passing the mode as an Integer" do - io = StringIO.open("example", IO::RDONLY) - io.closed_read?.should be_false - io.closed_write?.should be_true + io = StringIO.open(+"example", IO::RDONLY) + io.closed_read?.should == false + io.closed_write?.should == true - io = StringIO.open("example", IO::RDWR) - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::RDWR) + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", IO::WRONLY) - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::WRONLY) + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", IO::WRONLY | IO::TRUNC) - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::WRONLY | IO::TRUNC) + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", IO::RDWR | IO::TRUNC) - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::RDWR | IO::TRUNC) + io.closed_read?.should == false + io.closed_write?.should == false - io = StringIO.open("example", IO::WRONLY | IO::APPEND) - io.closed_read?.should be_true - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::WRONLY | IO::APPEND) + io.closed_read?.should == true + io.closed_write?.should == false - io = StringIO.open("example", IO::RDWR | IO::APPEND) - io.closed_read?.should be_false - io.closed_write?.should be_false + io = StringIO.open(+"example", IO::RDWR | IO::APPEND) + io.closed_read?.should == false + io.closed_write?.should == false end - it "raises a #{frozen_error_class} when passed a frozen String in truncate mode as StringIO backend" do - lambda { StringIO.open("example".freeze, IO::TRUNC) }.should raise_error(frozen_error_class) + it "raises a FrozenError when passed a frozen String in truncate mode as StringIO backend" do + -> { StringIO.open("example".freeze, IO::TRUNC) }.should.raise(FrozenError) end it "tries to convert the passed mode to a String using #to_str" do obj = mock('to_str') obj.should_receive(:to_str).and_return("r") - io = StringIO.open("example", obj) + io = StringIO.open(+"example", obj) - io.closed_read?.should be_false - io.closed_write?.should be_true + io.closed_read?.should == false + io.closed_write?.should == true end it "raises an Errno::EACCES error when passed a frozen string with a write-mode" do (str = "example").freeze - lambda { StringIO.open(str, "r+") }.should raise_error(Errno::EACCES) - lambda { StringIO.open(str, "w") }.should raise_error(Errno::EACCES) - lambda { StringIO.open(str, "a") }.should raise_error(Errno::EACCES) + -> { StringIO.open(str, "r+") }.should.raise(Errno::EACCES) + -> { StringIO.open(str, "w") }.should.raise(Errno::EACCES) + -> { StringIO.open(str, "a") }.should.raise(Errno::EACCES) end end describe "StringIO.open when passed [Object]" do it "uses the passed Object as the StringIO backend" do io = StringIO.open(str = "example") - io.string.should equal(str) + io.string.should.equal?(str) end it "yields self to the passed block" do io = nil - ret = StringIO.open("example") { |strio| io = strio } - io.should equal(ret) + ret = StringIO.open(+"example") { |strio| io = strio } + io.should.equal?(ret) end - it "sets the mode to read-write" do - io = StringIO.open("example") - io.closed_read?.should be_false - io.closed_write?.should be_false + it "sets the mode to read-write (r+)" do + io = StringIO.open(+"example") + io.closed_read?.should == false + io.closed_write?.should == false + + io = StringIO.new(+"example") + io.printf("%d", 123) + io.string.should == "123mple" end it "tries to convert the passed Object to a String using #to_str" do @@ -183,8 +187,8 @@ describe "StringIO.open when passed [Object]" do it "automatically sets the mode to read-only when passed a frozen string" do (str = "example").freeze io = StringIO.open(str) - io.closed_read?.should be_false - io.closed_write?.should be_true + io.closed_read?.should == false + io.closed_write?.should == true end end @@ -192,13 +196,17 @@ describe "StringIO.open when passed no arguments" do it "yields self to the passed block" do io = nil ret = StringIO.open { |strio| io = strio } - io.should equal(ret) + io.should.equal?(ret) end - it "sets the mode to read-write" do + it "sets the mode to read-write (r+)" do io = StringIO.open - io.closed_read?.should be_false - io.closed_write?.should be_false + io.closed_read?.should == false + io.closed_write?.should == false + + io = StringIO.new(+"example") + io.printf("%d", 123) + io.string.should == "123mple" end it "uses an empty String as the StringIO backend" do diff --git a/spec/ruby/library/stringio/path_spec.rb b/spec/ruby/library/stringio/path_spec.rb index 5439cf4b53..dcb77b1df8 100644 --- a/spec/ruby/library/stringio/path_spec.rb +++ b/spec/ruby/library/stringio/path_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "StringIO#path" do it "is not defined" do - lambda { StringIO.new("path").path }.should raise_error(NoMethodError) + -> { StringIO.new("path").path }.should.raise(NoMethodError) end end diff --git a/spec/ruby/library/stringio/pid_spec.rb b/spec/ruby/library/stringio/pid_spec.rb index 08f2d7ab1a..7a729fbe41 100644 --- a/spec/ruby/library/stringio/pid_spec.rb +++ b/spec/ruby/library/stringio/pid_spec.rb @@ -3,6 +3,6 @@ require_relative 'fixtures/classes' describe "StringIO#pid" do it "returns nil" do - StringIO.new("pid").pid.should be_nil + StringIO.new("pid").pid.should == nil end end diff --git a/spec/ruby/library/stringio/pos_spec.rb b/spec/ruby/library/stringio/pos_spec.rb index 8d99294f31..ba640f8c18 100644 --- a/spec/ruby/library/stringio/pos_spec.rb +++ b/spec/ruby/library/stringio/pos_spec.rb @@ -17,7 +17,7 @@ describe "StringIO#pos=" do end it "raises an EINVAL if given a negative argument" do - lambda { @io.pos = -10 }.should raise_error(Errno::EINVAL) + -> { @io.pos = -10 }.should.raise(Errno::EINVAL) end it "updates the current byte offset after reaching EOF" do diff --git a/spec/ruby/library/stringio/print_spec.rb b/spec/ruby/library/stringio/print_spec.rb index 144a219509..48728e5f14 100644 --- a/spec/ruby/library/stringio/print_spec.rb +++ b/spec/ruby/library/stringio/print_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#print" do before :each do - @io = StringIO.new('example') + @io = StringIO.new(+'example') end it "prints $_ when passed no arguments" do @@ -29,7 +29,7 @@ describe "StringIO#print" do end it "returns nil" do - @io.print(1, 2, 3).should be_nil + @io.print(1, 2, 3).should == nil end it "pads self with \\000 when the current position is after the end" do @@ -39,39 +39,41 @@ describe "StringIO#print" do end it "honors the output record separator global" do - old_rs, $\ = $\, 'x' + old_rs = $\ + suppress_warning {$\ = 'x'} begin @io.print(5, 6, 7, 8) @io.string.should == '5678xle' ensure - $\ = old_rs + suppress_warning {$\ = old_rs} end end it "updates the current position" do @io.print(1, 2, 3) - @io.pos.should eql(3) + @io.pos.should.eql?(3) @io.print(1, 2, 3) - @io.pos.should eql(6) + @io.pos.should.eql?(6) end it "correctly updates the current position when honoring the output record separator global" do - old_rs, $\ = $\, 'x' + old_rs = $\ + suppress_warning {$\ = 'x'} begin @io.print(5, 6, 7, 8) - @io.pos.should eql(5) + @io.pos.should.eql?(5) ensure - $\ = old_rs + suppress_warning {$\ = old_rs} end end end describe "StringIO#print when in append mode" do before :each do - @io = StringIO.new("example", "a") + @io = StringIO.new(+"example", "a") end it "appends the passed argument to the end of self" do @@ -84,17 +86,17 @@ describe "StringIO#print when in append mode" do it "correctly updates self's position" do @io.print(", testing") - @io.pos.should eql(16) + @io.pos.should.eql?(16) end end describe "StringIO#print when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.print("test") }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.print("test") }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.print("test") }.should raise_error(IOError) + -> { io.print("test") }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/printf_spec.rb b/spec/ruby/library/stringio/printf_spec.rb index 3978896621..ae7e0af729 100644 --- a/spec/ruby/library/stringio/printf_spec.rb +++ b/spec/ruby/library/stringio/printf_spec.rb @@ -4,17 +4,17 @@ require_relative '../../core/kernel/shared/sprintf' describe "StringIO#printf" do before :each do - @io = StringIO.new('example') + @io = StringIO.new() end it "returns nil" do - @io.printf("%d %04x", 123, 123).should be_nil + @io.printf("%d %04x", 123, 123).should == nil end it "pads self with \\000 when the current position is after the end" do - @io.pos = 10 + @io.pos = 3 @io.printf("%d", 123) - @io.string.should == "example\000\000\000123" + @io.string.should == "\000\000\000123" end it "performs format conversion" do @@ -24,24 +24,45 @@ describe "StringIO#printf" do it "updates the current position" do @io.printf("%d %04x", 123, 123) - @io.pos.should eql(8) + @io.pos.should.eql?(8) @io.printf("%d %04x", 123, 123) - @io.pos.should eql(16) + @io.pos.should.eql?(16) end describe "formatting" do - it_behaves_like :kernel_sprintf, -> (format, *args) { - io = StringIO.new + it_behaves_like :kernel_sprintf, -> format, *args { + io = StringIO.new(+"") io.printf(format, *args) io.string } end end +describe "StringIO#printf when in read-write mode" do + before :each do + @io = StringIO.new(+"example", "r+") + end + + it "starts from the beginning" do + @io.printf("%s", "abcdefghijk") + @io.string.should == "abcdefghijk" + end + + it "does not truncate existing string" do + @io.printf("%s", "abc") + @io.string.should == "abcmple" + end + + it "correctly updates self's position" do + @io.printf("%s", "abc") + @io.pos.should.eql?(3) + end +end + describe "StringIO#printf when in append mode" do before :each do - @io = StringIO.new("example", "a") + @io = StringIO.new(+"example", "a") end it "appends the passed argument to the end of self" do @@ -54,17 +75,17 @@ describe "StringIO#printf when in append mode" do it "correctly updates self's position" do @io.printf("%d %04x", 123, 123) - @io.pos.should eql(15) + @io.pos.should.eql?(15) end end describe "StringIO#printf when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.printf("test") }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.printf("test") }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.printf("test") }.should raise_error(IOError) + -> { io.printf("test") }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/putc_spec.rb b/spec/ruby/library/stringio/putc_spec.rb index eae5481d6e..742f8623eb 100644 --- a/spec/ruby/library/stringio/putc_spec.rb +++ b/spec/ruby/library/stringio/putc_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#putc when passed [String]" do before :each do - @io = StringIO.new('example') + @io = StringIO.new(+'example') end it "overwrites the character at the current position" do @@ -22,7 +22,7 @@ describe "StringIO#putc when passed [String]" do it "returns the passed String" do str = "test" - @io.putc(str).should equal(str) + @io.putc(str).should.equal?(str) end it "correctly updates the current position" do @@ -35,11 +35,26 @@ describe "StringIO#putc when passed [String]" do @io.putc("t") @io.pos.should == 3 end + + it "handles concurrent writes correctly" do + @io = StringIO.new + n = 8 + go = false + threads = n.times.map { |i| + Thread.new { + Thread.pass until go + @io.putc i.to_s + } + } + go = true + threads.each(&:join) + @io.string.size.should == n + end end describe "StringIO#putc when passed [Object]" do before :each do - @io = StringIO.new('example') + @io = StringIO.new(+'example') end it "it writes the passed Integer % 256 to self" do @@ -64,13 +79,13 @@ describe "StringIO#putc when passed [Object]" do end it "raises a TypeError when the passed argument can't be coerced to Integer" do - lambda { @io.putc(Object.new) }.should raise_error(TypeError) + -> { @io.putc(Object.new) }.should.raise(TypeError) end end describe "StringIO#putc when in append mode" do it "appends to the end of self" do - io = StringIO.new("test", "a") + io = StringIO.new(+"test", "a") io.putc(?t) io.string.should == "testt" end @@ -78,11 +93,11 @@ end describe "StringIO#putc when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.putc(?a) }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.putc(?a) }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.putc("t") }.should raise_error(IOError) + -> { io.putc("t") }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/puts_spec.rb b/spec/ruby/library/stringio/puts_spec.rb index 396d9f25f4..ebe74d4a45 100644 --- a/spec/ruby/library/stringio/puts_spec.rb +++ b/spec/ruby/library/stringio/puts_spec.rb @@ -30,11 +30,12 @@ describe "StringIO#puts when passed an Array" do it "does not honor the global output record separator $\\" do begin - old_rs, $\ = $\, "test" + old_rs = $\ + suppress_warning {$\ = "test"} @io.puts([1, 2, 3, 4]) @io.string.should == "1\n2\n3\n4\n" ensure - $\ = old_rs + suppress_warning {$\ = old_rs} end end @@ -51,6 +52,14 @@ describe "StringIO#puts when passed an Array" do @io.puts([obj]) @io.string.should == "to_s\n" end + + it "returns general object info if :to_s does not return a string" do + object = mock('hola') + object.should_receive(:to_s).and_return(false) + + @io.puts(object).should == nil + @io.string.should == object.inspect.split(" ")[0] + ">\n" + end end describe "StringIO#puts when passed 1 or more objects" do @@ -60,11 +69,12 @@ describe "StringIO#puts when passed 1 or more objects" do it "does not honor the global output record separator $\\" do begin - old_rs, $\ = $\, "test" + old_rs = $\ + suppress_warning {$\ = "test"} @io.puts(1, 2, 3, 4) @io.string.should == "1\n2\n3\n4\n" ensure - $\ = old_rs + suppress_warning {$\ = old_rs} end end @@ -91,6 +101,20 @@ describe "StringIO#puts when passed 1 or more objects" do @io.puts '' @io.string.should == "\n" end + + it "handles concurrent writes correctly" do + n = 8 + go = false + threads = n.times.map { |i| + Thread.new { + Thread.pass until go + @io.puts i + } + } + go = true + threads.each(&:join) + @io.string.size.should == n.times.map { |i| "#{i}\n" }.join.size + end end describe "StringIO#puts when passed no arguments" do @@ -99,7 +123,7 @@ describe "StringIO#puts when passed no arguments" do end it "returns nil" do - @io.puts.should be_nil + @io.puts.should == nil end it "prints a newline" do @@ -109,18 +133,19 @@ describe "StringIO#puts when passed no arguments" do it "does not honor the global output record separator $\\" do begin - old_rs, $\ = $\, "test" + old_rs = $\ + suppress_warning {$\ = "test"} @io.puts @io.string.should == "\n" ensure - $\ = old_rs + suppress_warning {$\ = old_rs} end end end describe "StringIO#puts when in append mode" do before :each do - @io = StringIO.new("example", "a") + @io = StringIO.new(+"example", "a") end it "appends the passed argument to the end of self" do @@ -133,24 +158,24 @@ describe "StringIO#puts when in append mode" do it "correctly updates self's position" do @io.puts(", testing") - @io.pos.should eql(17) + @io.pos.should.eql?(17) end end describe "StringIO#puts when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.puts }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.puts }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.puts }.should raise_error(IOError) + -> { io.puts }.should.raise(IOError) end end describe "StringIO#puts when passed an encoded string" do it "stores the bytes unmodified" do - io = StringIO.new("") + io = StringIO.new(+"") io.puts "\x00\x01\x02" io.puts "æåø" diff --git a/spec/ruby/library/stringio/read_nonblock_spec.rb b/spec/ruby/library/stringio/read_nonblock_spec.rb index 7a79eef3c5..38ae7541ca 100644 --- a/spec/ruby/library/stringio/read_nonblock_spec.rb +++ b/spec/ruby/library/stringio/read_nonblock_spec.rb @@ -5,10 +5,21 @@ require_relative 'shared/sysread' describe "StringIO#read_nonblock when passed length, buffer" do it_behaves_like :stringio_read, :read_nonblock + + it "accepts :exception option" do + io = StringIO.new("example") + io.read_nonblock(3, buffer = +"", exception: true) + buffer.should == "exa" + end end describe "StringIO#read_nonblock when passed length" do it_behaves_like :stringio_read_length, :read_nonblock + + it "accepts :exception option" do + io = StringIO.new("example") + io.read_nonblock(3, exception: true).should == "exa" + end end describe "StringIO#read_nonblock when passed nil" do @@ -26,4 +37,17 @@ describe "StringIO#read_nonblock" do stringio.read_nonblock(3, exception: false).should == 'foo' end + context "when exception option is set to false" do + context "when the end is reached" do + it "returns nil" do + stringio = StringIO.new(+'') + stringio << "hello" + stringio.rewind + + stringio.read_nonblock(5).should == "hello" + stringio.read_nonblock(5, exception: false).should == nil + end + end + end + end diff --git a/spec/ruby/library/stringio/read_spec.rb b/spec/ruby/library/stringio/read_spec.rb index 52ab3dcf47..9a2086a682 100644 --- a/spec/ruby/library/stringio/read_spec.rb +++ b/spec/ruby/library/stringio/read_spec.rb @@ -39,7 +39,7 @@ describe "StringIO#read when passed [length]" do it "returns nil when self's position is at the end" do @io.pos = 7 - @io.read(10).should be_nil + @io.read(10).should == nil end it "returns an empty String when length is 0" do @@ -53,10 +53,10 @@ describe "StringIO#read when passed length and a buffer" do end it "reads [length] characters into the buffer" do - buf = "foo" + buf = +"foo" result = @io.read(10, buf) buf.should == "abcdefghij" - result.should equal(buf) + result.should.equal?(buf) end end diff --git a/spec/ruby/library/stringio/readline_spec.rb b/spec/ruby/library/stringio/readline_spec.rb index fc1e75b67e..3f026080e2 100644 --- a/spec/ruby/library/stringio/readline_spec.rb +++ b/spec/ruby/library/stringio/readline_spec.rb @@ -1,131 +1,58 @@ require_relative '../../spec_helper' +require "stringio" require_relative 'fixtures/classes' +require_relative "shared/gets" +describe "StringIO#readline" do + describe "when passed [separator]" do + it_behaves_like :stringio_gets_separator, :readline -describe "StringIO#readline when passed [separator]" do - before :each do - @io = StringIO.new("this>is>an>example") - end - - it "returns the data read till the next occurrence of the passed separator" do - @io.readline(">").should == "this>" - @io.readline(">").should == "is>" - @io.readline(">").should == "an>" - @io.readline(">").should == "example" - end - - it "sets $_ to the read content" do - @io.readline(">") - $_.should == "this>" - @io.readline(">") - $_.should == "is>" - @io.readline(">") - $_.should == "an>" - @io.readline(">") - $_.should == "example" - end - - it "updates self's lineno by one" do - @io.readline(">") - @io.lineno.should eql(1) - - @io.readline(">") - @io.lineno.should eql(2) - - @io.readline(">") - @io.lineno.should eql(3) - end - - it "returns the next paragraph when the passed separator is an empty String" do - io = StringIO.new("this is\n\nan example") - io.readline("").should == "this is\n\n" - io.readline("").should == "an example" - end - - it "returns the remaining content starting at the current position when passed nil" do - io = StringIO.new("this is\n\nan example") - io.pos = 5 - io.readline(nil).should == "is\n\nan example" - end + it "raises an IOError if self is at the end" do + @io = StringIO.new("this>is>an>example") - it "tries to convert the passed separator to a String using #to_str" do - obj = mock('to_str') - obj.should_receive(:to_str).and_return(">") - @io.readline(obj).should == "this>" + @io.pos = 36 + -> { @io.readline(">") }.should.raise(IOError) + end end -end -describe "StringIO#readline when passed no argument" do - before :each do - @io = StringIO.new("this is\nan example\nfor StringIO#readline") - end + describe "when passed [limit]" do + it_behaves_like :stringio_gets_limit, :readline - it "returns the data read till the next occurrence of $/ or till eof" do - @io.readline.should == "this is\n" + it "raises an IOError if self is at the end" do + @io = StringIO.new("this>is>an>example") - begin - old_sep, $/ = $/, " " - @io.readline.should == "an " - @io.readline.should == "example\nfor " - @io.readline.should == "StringIO#readline" - ensure - $/ = old_sep + @io.pos = 36 + -> { @io.readline(3) }.should.raise(IOError) end end - it "sets $_ to the read content" do - @io.readline - $_.should == "this is\n" - @io.readline - $_.should == "an example\n" - @io.readline - $_.should == "for StringIO#readline" - end + describe "when passed [separator] and [limit]" do + it_behaves_like :stringio_gets_separator_and_limit, :readline - it "updates self's position" do - @io.readline - @io.pos.should eql(8) + it "raises an IOError if self is at the end" do + @io = StringIO.new("this>is>an>example") - @io.readline - @io.pos.should eql(19) - - @io.readline - @io.pos.should eql(40) + @io.pos = 36 + -> { @io.readline(">", 3) }.should.raise(IOError) + end end - it "updates self's lineno" do - @io.readline - @io.lineno.should eql(1) + describe "when passed no argument" do + it_behaves_like :stringio_gets_no_argument, :readline - @io.readline - @io.lineno.should eql(2) + it "raises an IOError if self is at the end" do + @io = StringIO.new("this>is>an>example") - @io.readline - @io.lineno.should eql(3) - end - - it "raises an IOError if self is at the end" do - @io.pos = 40 - lambda { @io.readline }.should raise_error(IOError) + @io.pos = 36 + -> { @io.readline }.should.raise(IOError) + end end -end -describe "StringIO#readline when in write-only mode" do - it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.readline }.should raise_error(IOError) - - io = StringIO.new("xyz") - io.close_read - lambda { io.readline }.should raise_error(IOError) + describe "when passed [chomp]" do + it_behaves_like :stringio_gets_chomp, :readline end -end -ruby_version_is "2.4" do - describe "StringIO#readline when passed [chomp]" do - it "returns the data read without a trailing newline character" do - io = StringIO.new("this>is>an>example\n") - io.readline(chomp: true).should == "this>is>an>example" - end + describe "when in write-only mode" do + it_behaves_like :stringio_gets_write_only, :readline end end diff --git a/spec/ruby/library/stringio/readlines_spec.rb b/spec/ruby/library/stringio/readlines_spec.rb index c15f81b846..821a8169e7 100644 --- a/spec/ruby/library/stringio/readlines_spec.rb +++ b/spec/ruby/library/stringio/readlines_spec.rb @@ -12,12 +12,12 @@ describe "StringIO#readlines when passed [separator]" do it "updates self's position based on the number of read bytes" do @io.readlines(">") - @io.pos.should eql(18) + @io.pos.should.eql?(18) end it "updates self's lineno based on the number of read lines" do @io.readlines(">") - @io.lineno.should eql(4) + @io.lineno.should.eql?(4) end it "does not change $_" do @@ -51,21 +51,22 @@ describe "StringIO#readlines when passed no argument" do it "returns an Array containing lines based on $/" do begin - old_sep, $/ = $/, " " + old_sep = $/; + suppress_warning {$/ = " "} @io.readlines.should == ["this ", "is\nan ", "example\nfor ", "StringIO#readlines"] ensure - $/ = old_sep + suppress_warning {$/ = old_sep} end end it "updates self's position based on the number of read bytes" do @io.readlines - @io.pos.should eql(41) + @io.pos.should.eql?(41) end it "updates self's lineno based on the number of read lines" do @io.readlines - @io.lineno.should eql(3) + @io.lineno.should.eql?(3) end it "does not change $_" do @@ -82,20 +83,36 @@ end describe "StringIO#readlines when in write-only mode" do it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.readlines }.should raise_error(IOError) + io = StringIO.new(+"xyz", "w") + -> { io.readlines }.should.raise(IOError) io = StringIO.new("xyz") io.close_read - lambda { io.readlines }.should raise_error(IOError) + -> { io.readlines }.should.raise(IOError) end end -ruby_version_is "2.4" do - describe "StringIO#readlines when passed [chomp]" do - it "returns the data read without a trailing newline character" do - io = StringIO.new("this>is\nan>example\r\n") - io.readlines(chomp: true).should == ["this>is", "an>example"] - end +describe "StringIO#readlines when passed [chomp]" do + it "returns the data read without a trailing newline character" do + io = StringIO.new("this>is\nan>example\r\n") + io.readlines(chomp: true).should == ["this>is", "an>example"] + end +end + +describe "StringIO#readlines when passed [limit]" do + before :each do + @io = StringIO.new("a b c d e\n1 2 3 4 5") + end + + it "returns the data read until the limit is met" do + @io.readlines(4).should == ["a b ", "c d ", "e\n", "1 2 ", "3 4 ", "5"] + end + + it "raises ArgumentError when limit is 0" do + -> { @io.readlines(0) }.should.raise(ArgumentError) + end + + it "ignores it when the limit is negative" do + @io.readlines(-4).should == ["a b c d e\n", "1 2 3 4 5"] end end diff --git a/spec/ruby/library/stringio/readpartial_spec.rb b/spec/ruby/library/stringio/readpartial_spec.rb index 54e2f47004..e05d9bded4 100644 --- a/spec/ruby/library/stringio/readpartial_spec.rb +++ b/spec/ruby/library/stringio/readpartial_spec.rb @@ -3,20 +3,14 @@ require_relative 'fixtures/classes' describe "StringIO#readpartial" do before :each do - @string = StringIO.new('Stop, look, listen') + @string = StringIO.new(+'Stop, look, listen') end after :each do @string.close unless @string.closed? end - it "raises IOError on closed stream" do - @string.close - lambda { @string.readpartial(10) }.should raise_error(IOError) - end - it "reads at most the specified number of bytes" do - # buffered read @string.read(1).should == 'S' # return only specified number, not the whole buffer @@ -30,6 +24,14 @@ describe "StringIO#readpartial" do @string.readpartial(3).should == ", l" end + it "reads after ungetc with multibyte characters in the buffer" do + @string = StringIO.new(+"∂φ/∂x = gaîté") + c = @string.getc + @string.ungetc(c) + @string.readpartial(3).should == "\xE2\x88\x82".b + @string.readpartial(3).should == "\xCF\x86/".b + end + it "reads after ungetc without data in the buffer" do @string = StringIO.new @string.write("f").should == 1 @@ -48,33 +50,53 @@ describe "StringIO#readpartial" do end it "discards the existing buffer content upon successful read" do - buffer = "existing" + buffer = +"existing" @string.readpartial(11, buffer) buffer.should == "Stop, look," end it "raises EOFError on EOF" do @string.readpartial(18).should == 'Stop, look, listen' - lambda { @string.readpartial(10) }.should raise_error(EOFError) + -> { @string.readpartial(10) }.should.raise(EOFError) end it "discards the existing buffer content upon error" do - buffer = 'hello' + buffer = +'hello' @string.readpartial(100) - lambda { @string.readpartial(1, buffer) }.should raise_error(EOFError) - buffer.should be_empty + -> { @string.readpartial(1, buffer) }.should.raise(EOFError) + buffer.should.empty? end it "raises IOError if the stream is closed" do @string.close - lambda { @string.readpartial(1) }.should raise_error(IOError) + -> { @string.readpartial(1) }.should.raise(IOError, "not opened for reading") end it "raises ArgumentError if the negative argument is provided" do - lambda { @string.readpartial(-1) }.should raise_error(ArgumentError) + -> { @string.readpartial(-1) }.should.raise(ArgumentError, "negative length -1 given") end it "immediately returns an empty string if the length argument is 0" do @string.readpartial(0).should == "" end + + it "raises IOError if the stream is closed and the length argument is 0" do + @string.close + -> { @string.readpartial(0) }.should.raise(IOError, "not opened for reading") + end + + it "clears and returns the given buffer if the length argument is 0" do + buffer = +"existing content" + @string.readpartial(0, buffer).should == buffer + buffer.should == "" + end + + version_is StringIO::VERSION, "3.1.2" do # ruby_version_is "3.4" + it "preserves the encoding of the given buffer" do + buffer = ''.encode(Encoding::ISO_8859_1) + @string.readpartial(10, buffer) + + buffer.encoding.should == Encoding::ISO_8859_1 + end + end end diff --git a/spec/ruby/library/stringio/reopen_spec.rb b/spec/ruby/library/stringio/reopen_spec.rb index 51aff43ba2..3d4ae3a698 100644 --- a/spec/ruby/library/stringio/reopen_spec.rb +++ b/spec/ruby/library/stringio/reopen_spec.rb @@ -8,48 +8,39 @@ describe "StringIO#reopen when passed [Object, Integer]" do it "reopens self with the passed Object in the passed mode" do @io.reopen("reopened", IO::RDONLY) - @io.closed_read?.should be_false - @io.closed_write?.should be_true + @io.closed_read?.should == false + @io.closed_write?.should == true @io.string.should == "reopened" - @io.reopen("reopened, twice", IO::WRONLY) - @io.closed_read?.should be_true - @io.closed_write?.should be_false + @io.reopen(+"reopened, twice", IO::WRONLY) + @io.closed_read?.should == true + @io.closed_write?.should == false @io.string.should == "reopened, twice" - @io.reopen("reopened, another time", IO::RDWR) - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.reopen(+"reopened, another time", IO::RDWR) + @io.closed_read?.should == false + @io.closed_write?.should == false @io.string.should == "reopened, another time" end - # NOTE: WEIRD! - it "does not taint self when the passed Object was tainted" do - @io.reopen("reopened".taint, IO::RDONLY) - @io.tainted?.should be_false - - @io.reopen("reopened".taint, IO::WRONLY) - @io.tainted?.should be_false - end - it "tries to convert the passed Object to a String using #to_str" do obj = mock("to_str") - obj.should_receive(:to_str).and_return("to_str") + obj.should_receive(:to_str).and_return(+"to_str") @io.reopen(obj, IO::RDWR) @io.string.should == "to_str" end it "raises a TypeError when the passed Object can't be converted to a String" do - lambda { @io.reopen(Object.new, IO::RDWR) }.should raise_error(TypeError) + -> { @io.reopen(Object.new, IO::RDWR) }.should.raise(TypeError) end it "raises an Errno::EACCES when trying to reopen self with a frozen String in write-mode" do - lambda { @io.reopen("burn".freeze, IO::WRONLY) }.should raise_error(Errno::EACCES) - lambda { @io.reopen("burn".freeze, IO::WRONLY | IO::APPEND) }.should raise_error(Errno::EACCES) + -> { @io.reopen("burn".freeze, IO::WRONLY) }.should.raise(Errno::EACCES) + -> { @io.reopen("burn".freeze, IO::WRONLY | IO::APPEND) }.should.raise(Errno::EACCES) end - it "raises a #{frozen_error_class} when trying to reopen self with a frozen String in truncate-mode" do - lambda { @io.reopen("burn".freeze, IO::RDONLY | IO::TRUNC) }.should raise_error(frozen_error_class) + it "raises a FrozenError when trying to reopen self with a frozen String in truncate-mode" do + -> { @io.reopen("burn".freeze, IO::RDONLY | IO::TRUNC) }.should.raise(FrozenError) end it "does not raise IOError when passed a frozen String in read-mode" do @@ -65,40 +56,31 @@ describe "StringIO#reopen when passed [Object, Object]" do it "reopens self with the passed Object in the passed mode" do @io.reopen("reopened", "r") - @io.closed_read?.should be_false - @io.closed_write?.should be_true + @io.closed_read?.should == false + @io.closed_write?.should == true @io.string.should == "reopened" - @io.reopen("reopened, twice", "r+") - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.reopen(+"reopened, twice", "r+") + @io.closed_read?.should == false + @io.closed_write?.should == false @io.string.should == "reopened, twice" - @io.reopen("reopened, another", "w+") - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.reopen(+"reopened, another", "w+") + @io.closed_read?.should == false + @io.closed_write?.should == false @io.string.should == "" - @io.reopen("reopened, another time", "r+") - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.reopen(+"reopened, another time", "r+") + @io.closed_read?.should == false + @io.closed_write?.should == false @io.string.should == "reopened, another time" end it "truncates the passed String when opened in truncate mode" do - @io.reopen(str = "reopened", "w") + @io.reopen(str = +"reopened", "w") str.should == "" end - # NOTE: WEIRD! - it "does not taint self when the passed Object was tainted" do - @io.reopen("reopened".taint, "r") - @io.tainted?.should be_false - - @io.reopen("reopened".taint, "w") - @io.tainted?.should be_false - end - it "tries to convert the passed Object to a String using #to_str" do obj = mock("to_str") obj.should_receive(:to_str).and_return("to_str") @@ -107,35 +89,35 @@ describe "StringIO#reopen when passed [Object, Object]" do end it "raises a TypeError when the passed Object can't be converted to a String using #to_str" do - lambda { @io.reopen(Object.new, "r") }.should raise_error(TypeError) + -> { @io.reopen(Object.new, "r") }.should.raise(TypeError) end it "resets self's position to 0" do @io.read(5) - @io.reopen("reopened") - @io.pos.should eql(0) + @io.reopen(+"reopened") + @io.pos.should.eql?(0) end it "resets self's line number to 0" do @io.gets - @io.reopen("reopened") - @io.lineno.should eql(0) + @io.reopen(+"reopened") + @io.lineno.should.eql?(0) end it "tries to convert the passed mode Object to an Integer using #to_str" do obj = mock("to_str") obj.should_receive(:to_str).and_return("r") @io.reopen("reopened", obj) - @io.closed_read?.should be_false - @io.closed_write?.should be_true + @io.closed_read?.should == false + @io.closed_write?.should == true @io.string.should == "reopened" end it "raises an Errno::EACCES error when trying to reopen self with a frozen String in write-mode" do - lambda { @io.reopen("burn".freeze, 'w') }.should raise_error(Errno::EACCES) - lambda { @io.reopen("burn".freeze, 'w+') }.should raise_error(Errno::EACCES) - lambda { @io.reopen("burn".freeze, 'a') }.should raise_error(Errno::EACCES) - lambda { @io.reopen("burn".freeze, "r+") }.should raise_error(Errno::EACCES) + -> { @io.reopen("burn".freeze, 'w') }.should.raise(Errno::EACCES) + -> { @io.reopen("burn".freeze, 'w+') }.should.raise(Errno::EACCES) + -> { @io.reopen("burn".freeze, 'a') }.should.raise(Errno::EACCES) + -> { @io.reopen("burn".freeze, "r+") }.should.raise(Errno::EACCES) end it "does not raise IOError if a frozen string is passed in read mode" do @@ -152,30 +134,24 @@ describe "StringIO#reopen when passed [String]" do it "reopens self with the passed String in read-write mode" do @io.close - @io.reopen("reopened") + @io.reopen(+"reopened") - @io.closed_write?.should be_false - @io.closed_read?.should be_false + @io.closed_write?.should == false + @io.closed_read?.should == false @io.string.should == "reopened" end - # NOTE: WEIRD! - it "does not taint self when the passed Object was tainted" do - @io.reopen("reopened".taint) - @io.tainted?.should be_false - end - it "resets self's position to 0" do @io.read(5) - @io.reopen("reopened") - @io.pos.should eql(0) + @io.reopen(+"reopened") + @io.pos.should.eql?(0) end it "resets self's line number to 0" do @io.gets - @io.reopen("reopened") - @io.lineno.should eql(0) + @io.reopen(+"reopened") + @io.lineno.should.eql?(0) end end @@ -185,27 +161,21 @@ describe "StringIO#reopen when passed [Object]" do end it "raises a TypeError when passed an Object that can't be converted to a StringIO" do - lambda { @io.reopen(Object.new) }.should raise_error(TypeError) + -> { @io.reopen(Object.new) }.should.raise(TypeError) end it "does not try to convert the passed Object to a String using #to_str" do obj = mock("not to_str") obj.should_not_receive(:to_str) - lambda { @io.reopen(obj) }.should raise_error(TypeError) + -> { @io.reopen(obj) }.should.raise(TypeError) end it "tries to convert the passed Object to a StringIO using #to_strio" do obj = mock("to_strio") - obj.should_receive(:to_strio).and_return(StringIO.new("to_strio")) + obj.should_receive(:to_strio).and_return(StringIO.new(+"to_strio")) @io.reopen(obj) @io.string.should == "to_strio" end - - # NOTE: WEIRD! - it "taints self when the passed Object was tainted" do - @io.reopen(StringIO.new("reopened").taint) - @io.tainted?.should be_true - end end describe "StringIO#reopen when passed no arguments" do @@ -216,20 +186,20 @@ describe "StringIO#reopen when passed no arguments" do it "resets self's mode to read-write" do @io.close @io.reopen - @io.closed_read?.should be_false - @io.closed_write?.should be_false + @io.closed_read?.should == false + @io.closed_write?.should == false end it "resets self's position to 0" do @io.read(5) @io.reopen - @io.pos.should eql(0) + @io.pos.should.eql?(0) end it "resets self's line number to 0" do @io.gets @io.reopen - @io.lineno.should eql(0) + @io.lineno.should.eql?(0) end end @@ -238,47 +208,40 @@ end # for details. describe "StringIO#reopen" do before :each do - @io = StringIO.new('hello','a') + @io = StringIO.new(+'hello', 'a') end # TODO: find out if this is really a bug it "reopens a stream when given a String argument" do - @io.reopen('goodbye').should == @io + @io.reopen(+'goodbye').should == @io @io.string.should == 'goodbye' @io << 'x' @io.string.should == 'xoodbye' end it "reopens a stream in append mode when flagged as such" do - @io.reopen('goodbye', 'a').should == @io + @io.reopen(+'goodbye', 'a').should == @io @io.string.should == 'goodbye' @io << 'x' @io.string.should == 'goodbyex' end it "reopens and truncate when reopened in write mode" do - @io.reopen('goodbye', 'wb').should == @io + @io.reopen(+'goodbye', 'wb').should == @io @io.string.should == '' @io << 'x' @io.string.should == 'x' end it "truncates the given string, not a copy" do - str = 'goodbye' + str = +'goodbye' @io.reopen(str, 'w') @io.string.should == '' str.should == '' end - it "taints self if the provided StringIO argument is tainted" do - new_io = StringIO.new("tainted") - new_io.taint - @io.reopen(new_io) - @io.tainted?.should == true - end - it "does not truncate the content even when the StringIO argument is in the truncate mode" do - orig_io = StringIO.new("Original StringIO", IO::RDWR|IO::TRUNC) + orig_io = StringIO.new(+"Original StringIO", IO::RDWR|IO::TRUNC) orig_io.write("BLAH") # make sure the content is not empty @io.reopen(orig_io) diff --git a/spec/ruby/library/stringio/rewind_spec.rb b/spec/ruby/library/stringio/rewind_spec.rb index 5f885ecf81..8c48709d89 100644 --- a/spec/ruby/library/stringio/rewind_spec.rb +++ b/spec/ruby/library/stringio/rewind_spec.rb @@ -9,7 +9,7 @@ describe "StringIO#rewind" do end it "returns 0" do - @io.rewind.should eql(0) + @io.rewind.should.eql?(0) end it "resets the position" do diff --git a/spec/ruby/library/stringio/seek_spec.rb b/spec/ruby/library/stringio/seek_spec.rb index b963b77eef..9043e0338f 100644 --- a/spec/ruby/library/stringio/seek_spec.rb +++ b/spec/ruby/library/stringio/seek_spec.rb @@ -9,18 +9,18 @@ describe "StringIO#seek" do it "seeks from the current position when whence is IO::SEEK_CUR" do @io.pos = 1 @io.seek(1, IO::SEEK_CUR) - @io.pos.should eql(2) + @io.pos.should.eql?(2) @io.seek(-1, IO::SEEK_CUR) - @io.pos.should eql(1) + @io.pos.should.eql?(1) end it "seeks from the end of self when whence is IO::SEEK_END" do @io.seek(3, IO::SEEK_END) - @io.pos.should eql(11) # Outside of the StringIO's content + @io.pos.should.eql?(11) # Outside of the StringIO's content @io.seek(-2, IO::SEEK_END) - @io.pos.should eql(6) + @io.pos.should.eql?(6) end it "seeks to an absolute position when whence is IO::SEEK_SET" do @@ -33,25 +33,25 @@ describe "StringIO#seek" do end it "raises an Errno::EINVAL error on negative amounts when whence is IO::SEEK_SET" do - lambda { @io.seek(-5, IO::SEEK_SET) }.should raise_error(Errno::EINVAL) + -> { @io.seek(-5, IO::SEEK_SET) }.should.raise(Errno::EINVAL) end it "raises an Errno::EINVAL error on incorrect whence argument" do - lambda { @io.seek(0, 3) }.should raise_error(Errno::EINVAL) - lambda { @io.seek(0, -1) }.should raise_error(Errno::EINVAL) - lambda { @io.seek(0, 2**16) }.should raise_error(Errno::EINVAL) - lambda { @io.seek(0, -2**16) }.should raise_error(Errno::EINVAL) + -> { @io.seek(0, 3) }.should.raise(Errno::EINVAL) + -> { @io.seek(0, -1) }.should.raise(Errno::EINVAL) + -> { @io.seek(0, 2**16) }.should.raise(Errno::EINVAL) + -> { @io.seek(0, -2**16) }.should.raise(Errno::EINVAL) end it "tries to convert the passed Object to a String using #to_int" do obj = mock("to_int") obj.should_receive(:to_int).and_return(2) @io.seek(obj) - @io.pos.should eql(2) + @io.pos.should.eql?(2) end it "raises a TypeError when the passed Object can't be converted to an Integer" do - lambda { @io.seek(Object.new) }.should raise_error(TypeError) + -> { @io.seek(Object.new) }.should.raise(TypeError) end end @@ -62,6 +62,6 @@ describe "StringIO#seek when self is closed" do end it "raises an IOError" do - lambda { @io.seek(5) }.should raise_error(IOError) + -> { @io.seek(5) }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/set_encoding_by_bom_spec.rb b/spec/ruby/library/stringio/set_encoding_by_bom_spec.rb new file mode 100644 index 0000000000..b4583a7ad7 --- /dev/null +++ b/spec/ruby/library/stringio/set_encoding_by_bom_spec.rb @@ -0,0 +1,237 @@ +require 'stringio' +require_relative '../../spec_helper' + +# Should be synced with specs for IO#set_encoding_by_bom +describe "StringIO#set_encoding_by_bom" do + it "returns nil if not readable" do + io = StringIO.new("".b, "wb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + end + + it "returns the result encoding if found BOM UTF-8 sequence" do + io = StringIO.new("\u{FEFF}".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_8 + io.external_encoding.should == Encoding::UTF_8 + io.read.b.should == "".b + + io = StringIO.new("\u{FEFF}abc".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_8 + io.external_encoding.should == Encoding::UTF_8 + io.read.b.should == "abc".b + end + + it "returns the result encoding if found BOM UTF_16LE sequence" do + io = StringIO.new("\xFF\xFE".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16LE + io.external_encoding.should == Encoding::UTF_16LE + io.read.b.should == "".b + + io = StringIO.new("\xFF\xFEabc".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16LE + io.external_encoding.should == Encoding::UTF_16LE + io.read.b.should == "abc".b + end + + it "returns the result encoding if found BOM UTF_16BE sequence" do + io = StringIO.new("\xFE\xFF".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16BE + io.external_encoding.should == Encoding::UTF_16BE + io.read.b.should == "".b + + io = StringIO.new("\xFE\xFFabc".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16BE + io.external_encoding.should == Encoding::UTF_16BE + io.read.b.should == "abc".b + end + + it "returns the result encoding if found BOM UTF_32LE sequence" do + io = StringIO.new("\xFF\xFE\x00\x00".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_32LE + io.external_encoding.should == Encoding::UTF_32LE + io.read.b.should == "".b + + io = StringIO.new("\xFF\xFE\x00\x00abc".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_32LE + io.external_encoding.should == Encoding::UTF_32LE + io.read.b.should == "abc".b + end + + it "returns the result encoding if found BOM UTF_32BE sequence" do + io = StringIO.new("\x00\x00\xFE\xFF".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_32BE + io.external_encoding.should == Encoding::UTF_32BE + io.read.b.should == "".b + + io = StringIO.new("\x00\x00\xFE\xFFabc".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_32BE + io.external_encoding.should == Encoding::UTF_32BE + io.read.b.should == "abc".b + end + + it "returns nil if io is empty" do + io = StringIO.new("".b, "rb") + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + end + + it "returns nil if UTF-8 BOM sequence is incomplete" do + io = StringIO.new("\xEF".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xEF".b + + io = StringIO.new("\xEFa".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xEFa".b + + io = StringIO.new("\xEF\xBB".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xEF\xBB".b + + io = StringIO.new("\xEF\xBBa".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xEF\xBBa".b + end + + it "returns nil if UTF-16BE BOM sequence is incomplete" do + io = StringIO.new("\xFE".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xFE".b + + io = StringIO.new("\xFEa".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xFEa".b + end + + it "returns nil if UTF-16LE/UTF-32LE BOM sequence is incomplete" do + io = StringIO.new("\xFF".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xFF".b + + io = StringIO.new("\xFFa".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\xFFa".b + end + + it "returns UTF-16LE if UTF-32LE BOM sequence is incomplete" do + io = StringIO.new("\xFF\xFE".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16LE + io.external_encoding.should == Encoding::UTF_16LE + io.read.b.should == "".b + + io = StringIO.new("\xFF\xFE\x00".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16LE + io.external_encoding.should == Encoding::UTF_16LE + io.read.b.should == "\x00".b + + io = StringIO.new("\xFF\xFE\x00a".b, "rb") + + io.set_encoding_by_bom.should == Encoding::UTF_16LE + io.external_encoding.should == Encoding::UTF_16LE + io.read.b.should == "\x00a".b + end + + it "returns nil if UTF-32BE BOM sequence is incomplete" do + io = StringIO.new("\x00".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00".b + + io = StringIO.new("\x00a".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00a".b + + io = StringIO.new("\x00\x00".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00\x00".b + + io = StringIO.new("\x00\x00a".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00\x00a".b + + io = StringIO.new("\x00\x00\xFE".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00\x00\xFE".b + + io = StringIO.new("\x00\x00\xFEa".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read.b.should == "\x00\x00\xFEa".b + end + + it "returns nil if found BOM sequence not provided" do + io = StringIO.new("abc".b, "rb") + + io.set_encoding_by_bom.should == nil + io.external_encoding.should == Encoding::ASCII_8BIT + io.read(3).should == "abc".b + end + + it "does not raise exception if io not in binary mode" do + io = StringIO.new("", 'r') + io.set_encoding_by_bom.should == nil + end + + it "does not raise exception if encoding already set" do + io = StringIO.new("".b, "rb") + io.set_encoding("utf-8") + io.set_encoding_by_bom.should == nil + end + + it "does not raise exception if encoding conversion is already set" do + io = StringIO.new("".b, "rb") + io.set_encoding(Encoding::UTF_8, Encoding::UTF_16BE) + + io.set_encoding_by_bom.should == nil + end + + it "raises FrozenError when io is frozen" do + io = StringIO.new() + io.freeze + -> { io.set_encoding_by_bom }.should.raise(FrozenError) + end + + it "does not raise FrozenError when initial string is frozen" do + io = StringIO.new("".freeze) + io.set_encoding_by_bom.should == nil + end +end diff --git a/spec/ruby/library/stringio/set_encoding_spec.rb b/spec/ruby/library/stringio/set_encoding_spec.rb index 17aa7df23e..19ca0875bf 100644 --- a/spec/ruby/library/stringio/set_encoding_spec.rb +++ b/spec/ruby/library/stringio/set_encoding_spec.rb @@ -2,9 +2,27 @@ require 'stringio' require_relative '../../spec_helper' describe "StringIO#set_encoding" do - it "sets the encoding of the underlying String" do - io = StringIO.new + it "sets the encoding of the underlying String if the String is not frozen" do + str = "".encode(Encoding::US_ASCII) + + io = StringIO.new(str) io.set_encoding Encoding::UTF_8 io.string.encoding.should == Encoding::UTF_8 end + + it "does not set the encoding of the underlying String if the String is frozen" do + str = "".encode(Encoding::US_ASCII).freeze + + io = StringIO.new(str) + io.set_encoding Encoding::UTF_8 + io.string.encoding.should == Encoding::US_ASCII + end + + it "accepts a String" do + str = "".encode(Encoding::US_ASCII) + io = StringIO.new(str) + io.set_encoding("ASCII-8BIT") + io.external_encoding.should == Encoding::BINARY + str.encoding.should == Encoding::BINARY + end end diff --git a/spec/ruby/library/stringio/shared/codepoints.rb b/spec/ruby/library/stringio/shared/codepoints.rb index c8ca03329f..e35a02ccb4 100644 --- a/spec/ruby/library/stringio/shared/codepoints.rb +++ b/spec/ruby/library/stringio/shared/codepoints.rb @@ -6,7 +6,7 @@ describe :stringio_codepoints, shared: true do end it "returns an Enumerator" do - @enum.should be_an_instance_of(Enumerator) + @enum.should.instance_of?(Enumerator) end it "yields each codepoint code in turn" do @@ -20,15 +20,15 @@ describe :stringio_codepoints, shared: true do it "raises an error if reading invalid sequence" do @io.pos = 1 # inside of a multibyte sequence - lambda { @enum.first }.should raise_error(ArgumentError) + -> { @enum.first }.should.raise(ArgumentError) end it "raises an IOError if not readable" do @io.close_read - lambda { @enum.to_a }.should raise_error(IOError) + -> { @enum.to_a }.should.raise(IOError) - io = StringIO.new("xyz", "w") - lambda { io.send(@method).to_a }.should raise_error(IOError) + io = StringIO.new(+"xyz", "w") + -> { io.send(@method).to_a }.should.raise(IOError) end @@ -39,7 +39,7 @@ describe :stringio_codepoints, shared: true do end it "returns self" do - @io.send(@method) {|l| l }.should equal(@io) + @io.send(@method) {|l| l }.should.equal?(@io) end end diff --git a/spec/ruby/library/stringio/shared/each.rb b/spec/ruby/library/stringio/shared/each.rb index 55ed27c1c7..04e40b6b2a 100644 --- a/spec/ruby/library/stringio/shared/each.rb +++ b/spec/ruby/library/stringio/shared/each.rb @@ -16,7 +16,7 @@ describe :stringio_each_separator, shared: true do end it "returns self" do - @io.send(@method) {|l| l }.should equal(@io) + @io.send(@method) {|l| l }.should.equal?(@io) end it "tries to convert the passed separator to a String using #to_str" do @@ -36,11 +36,11 @@ describe :stringio_each_separator, shared: true do seen.should == ["2 1 2 1 2"] end - it "yields each paragraph when passed an empty String as separator" do + it "yields each paragraph with all separation characters when passed an empty String as separator" do seen = [] io = StringIO.new("para1\n\npara2\n\n\npara3") io.send(@method, "") {|s| seen << s} - seen.should == ["para1\n\n", "para2\n\n", "para3"] + seen.should == ["para1\n\n", "para2\n\n\n", "para3"] end end @@ -71,21 +71,22 @@ describe :stringio_each_no_arguments, shared: true do it "uses $/ as the default line separator" do seen = [] begin - old_rs, $/ = $/, " " + old_rs = $/ + suppress_warning {$/ = " "} @io.send(@method) {|s| seen << s } - seen.should eql(["a ", "b ", "c ", "d ", "e\n1 ", "2 ", "3 ", "4 ", "5"]) + seen.should.eql?(["a ", "b ", "c ", "d ", "e\n1 ", "2 ", "3 ", "4 ", "5"]) ensure - $/ = old_rs + suppress_warning {$/ = old_rs} end end it "returns self" do - @io.send(@method) {|l| l }.should equal(@io) + @io.send(@method) {|l| l }.should.equal?(@io) end it "returns an Enumerator when passed no block" do enum = @io.send(@method) - enum.instance_of?(Enumerator).should be_true + enum.instance_of?(Enumerator).should == true seen = [] enum.each { |b| seen << b } @@ -95,12 +96,12 @@ end describe :stringio_each_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("a b c d e", "w") - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + io = StringIO.new(+"a b c d e", "w") + -> { io.send(@method) { |b| b } }.should.raise(IOError) io = StringIO.new("a b c d e") io.close_read - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + -> { io.send(@method) { |b| b } }.should.raise(IOError) end end @@ -111,4 +112,98 @@ describe :stringio_each_chomp, shared: true do io.send(@method, chomp: true) {|s| seen << s } seen.should == ["a b \rc d e", "1 2 3 4 5", "the end"] end + + it "returns each line with removed newline characters when called without block" do + seen = [] + io = StringIO.new("a b \rc d e\n1 2 3 4 5\r\nthe end") + enum = io.send(@method, chomp: true) + enum.each {|s| seen << s } + seen.should == ["a b \rc d e", "1 2 3 4 5", "the end"] + end +end + +describe :stringio_each_separator_and_chomp, shared: true do + it "yields each line with removed separator to the passed block" do + seen = [] + io = StringIO.new("a b \nc d e|1 2 3 4 5\n|the end") + io.send(@method, "|", chomp: true) {|s| seen << s } + seen.should == ["a b \nc d e", "1 2 3 4 5\n", "the end"] + end + + it "returns each line with removed separator when called without block" do + seen = [] + io = StringIO.new("a b \nc d e|1 2 3 4 5\n|the end") + enum = io.send(@method, "|", chomp: true) + enum.each {|s| seen << s } + seen.should == ["a b \nc d e", "1 2 3 4 5\n", "the end"] + end +end + +describe :stringio_each_limit, shared: true do + before :each do + @io = StringIO.new("a b c d e\n1 2 3 4 5") + end + + it "returns the data read until the limit is met" do + seen = [] + @io.send(@method, 4) { |s| seen << s } + seen.should == ["a b ", "c d ", "e\n", "1 2 ", "3 4 ", "5"] + end +end + +describe :stringio_each_separator_and_limit, shared: true do + before :each do + @io = StringIO.new("this>is>an>example") + end + + it "returns the data read until the limit is consumed or the separator is met" do + @io.send(@method, '>', 8) { |s| break s }.should == "this>" + @io.send(@method, '>', 2) { |s| break s }.should == "is" + @io.send(@method, '>', 10) { |s| break s }.should == ">" + @io.send(@method, '>', 6) { |s| break s }.should == "an>" + @io.send(@method, '>', 5) { |s| break s }.should == "examp" + end + + it "truncates the multi-character separator at the end to meet the limit" do + @io.send(@method, "is>an", 7) { |s| break s }.should == "this>is" + end + + it "does not change $_" do + $_ = "test" + @io.send(@method, '>', 8) { |s| s } + $_.should == "test" + end + + it "updates self's lineno by one" do + @io.send(@method, '>', 3) { |s| break s } + @io.lineno.should.eql?(1) + + @io.send(@method, '>', 3) { |s| break s } + @io.lineno.should.eql?(2) + + @io.send(@method, '>', 3) { |s| break s } + @io.lineno.should.eql?(3) + end + + it "tries to convert the passed separator to a String using #to_str" do # TODO + obj = mock('to_str') + obj.should_receive(:to_str).and_return('>') + + seen = [] + @io.send(@method, obj, 5) { |s| seen << s } + seen.should == ["this>", "is>", "an>", "examp", "le"] + end + + it "does not raise TypeError if passed separator is nil" do + @io.send(@method, nil, 5) { |s| break s }.should == "this>" + end + + it "tries to convert the passed limit to an Integer using #to_int" do # TODO + obj = mock('to_int') + obj.should_receive(:to_int).and_return(5) + + seen = [] + @io.send(@method, '>', obj) { |s| seen << s } + seen.should == ["this>", "is>", "an>", "examp", "le"] + end end diff --git a/spec/ruby/library/stringio/shared/each_byte.rb b/spec/ruby/library/stringio/shared/each_byte.rb index 1dc48ee437..b3939c26de 100644 --- a/spec/ruby/library/stringio/shared/each_byte.rb +++ b/spec/ruby/library/stringio/shared/each_byte.rb @@ -19,16 +19,16 @@ describe :stringio_each_byte, shared: true do @io.pos = 1000 seen = nil @io.send(@method) { |b| seen = b } - seen.should be_nil + seen.should == nil end it "returns self" do - @io.send(@method) {}.should equal(@io) + @io.send(@method) {}.should.equal?(@io) end it "returns an Enumerator when passed no block" do enum = @io.send(@method) - enum.instance_of?(Enumerator).should be_true + enum.instance_of?(Enumerator).should == true seen = [] enum.each { |b| seen << b } @@ -38,11 +38,11 @@ end describe :stringio_each_byte_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + io = StringIO.new(+"xyz", "w") + -> { io.send(@method) { |b| b } }.should.raise(IOError) io = StringIO.new("xyz") io.close_read - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + -> { io.send(@method) { |b| b } }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/shared/each_char.rb b/spec/ruby/library/stringio/shared/each_char.rb index 35efdcb749..4215a9952b 100644 --- a/spec/ruby/library/stringio/shared/each_char.rb +++ b/spec/ruby/library/stringio/shared/each_char.rb @@ -11,12 +11,12 @@ describe :stringio_each_char, shared: true do end it "returns self" do - @io.send(@method) {}.should equal(@io) + @io.send(@method) {}.should.equal?(@io) end it "returns an Enumerator when passed no block" do enum = @io.send(@method) - enum.instance_of?(Enumerator).should be_true + enum.instance_of?(Enumerator).should == true seen = [] enum.each { |c| seen << c } @@ -26,11 +26,11 @@ end describe :stringio_each_char_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + io = StringIO.new(+"xyz", "w") + -> { io.send(@method) { |b| b } }.should.raise(IOError) io = StringIO.new("xyz") io.close_read - lambda { io.send(@method) { |b| b } }.should raise_error(IOError) + -> { io.send(@method) { |b| b } }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/shared/eof.rb b/spec/ruby/library/stringio/shared/eof.rb index e0368a2892..a9489581fc 100644 --- a/spec/ruby/library/stringio/shared/eof.rb +++ b/spec/ruby/library/stringio/shared/eof.rb @@ -5,20 +5,20 @@ describe :stringio_eof, shared: true do it "returns true when self's position is greater than or equal to self's size" do @io.pos = 3 - @io.send(@method).should be_true + @io.send(@method).should == true @io.pos = 6 - @io.send(@method).should be_true + @io.send(@method).should == true end it "returns false when self's position is less than self's size" do @io.pos = 0 - @io.send(@method).should be_false + @io.send(@method).should == false @io.pos = 1 - @io.send(@method).should be_false + @io.send(@method).should == false @io.pos = 2 - @io.send(@method).should be_false + @io.send(@method).should == false end end diff --git a/spec/ruby/library/stringio/shared/getc.rb b/spec/ruby/library/stringio/shared/getc.rb index 3e064f9c1e..a146b2d4cf 100644 --- a/spec/ruby/library/stringio/shared/getc.rb +++ b/spec/ruby/library/stringio/shared/getc.rb @@ -5,39 +5,39 @@ describe :stringio_getc, shared: true do it "increases self's position by one" do @io.send(@method) - @io.pos.should eql(1) + @io.pos.should.eql?(1) @io.send(@method) - @io.pos.should eql(2) + @io.pos.should.eql?(2) @io.send(@method) - @io.pos.should eql(3) + @io.pos.should.eql?(3) end it "returns nil when called at the end of self" do @io.pos = 7 - @io.send(@method).should be_nil - @io.send(@method).should be_nil - @io.send(@method).should be_nil + @io.send(@method).should == nil + @io.send(@method).should == nil + @io.send(@method).should == nil end it "does not increase self's position when called at the end of file" do @io.pos = 7 @io.send(@method) - @io.pos.should eql(7) + @io.pos.should.eql?(7) @io.send(@method) - @io.pos.should eql(7) + @io.pos.should.eql?(7) end end describe :stringio_getc_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("xyz", "w") - lambda { io.send(@method) }.should raise_error(IOError) + io = StringIO.new(+"xyz", "w") + -> { io.send(@method) }.should.raise(IOError) io = StringIO.new("xyz") io.close_read - lambda { io.send(@method) }.should raise_error(IOError) + -> { io.send(@method) }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/shared/gets.rb b/spec/ruby/library/stringio/shared/gets.rb new file mode 100644 index 0000000000..16039b18ef --- /dev/null +++ b/spec/ruby/library/stringio/shared/gets.rb @@ -0,0 +1,249 @@ +describe :stringio_gets_separator, shared: true do + describe "when passed [separator]" do + before :each do + @io = StringIO.new("this>is>an>example") + end + + it "returns the data read till the next occurrence of the passed separator" do + @io.send(@method, ">").should == "this>" + @io.send(@method, ">").should == "is>" + @io.send(@method, ">").should == "an>" + @io.send(@method, ">").should == "example" + end + + it "sets $_ to the read content" do + @io.send(@method, ">") + $_.should == "this>" + @io.send(@method, ">") + $_.should == "is>" + @io.send(@method, ">") + $_.should == "an>" + @io.send(@method, ">") + $_.should == "example" + end + + it "accepts string as separator" do + @io.send(@method, "is>") + $_.should == "this>" + @io.send(@method, "an>") + $_.should == "is>an>" + @io.send(@method, "example") + $_.should == "example" + end + + it "updates self's lineno by one" do + @io.send(@method, ">") + @io.lineno.should.eql?(1) + + @io.send(@method, ">") + @io.lineno.should.eql?(2) + + @io.send(@method, ">") + @io.lineno.should.eql?(3) + end + + it "returns the next paragraph when the passed separator is an empty String" do + io = StringIO.new("this is\n\nan example") + io.send(@method, "").should == "this is\n\n" + io.send(@method, "").should == "an example" + end + + it "returns the remaining content starting at the current position when passed nil" do + io = StringIO.new("this is\n\nan example") + io.pos = 5 + io.send(@method, nil).should == "is\n\nan example" + end + + it "tries to convert the passed separator to a String using #to_str" do + obj = mock('to_str') + obj.should_receive(:to_str).and_return(">") + @io.send(@method, obj).should == "this>" + end + end +end + +describe :stringio_gets_limit, shared: true do + describe "when passed [limit]" do + before :each do + @io = StringIO.new("this>is>an>example") + end + + it "returns the data read until the limit is met" do + @io.send(@method, 4).should == "this" + @io.send(@method, 3).should == ">is" + @io.send(@method, 5).should == ">an>e" + @io.send(@method, 6).should == "xample" + end + + it "sets $_ to the read content" do + @io.send(@method, 4) + $_.should == "this" + @io.send(@method, 3) + $_.should == ">is" + @io.send(@method, 5) + $_.should == ">an>e" + @io.send(@method, 6) + $_.should == "xample" + end + + it "updates self's lineno by one" do + @io.send(@method, 3) + @io.lineno.should.eql?(1) + + @io.send(@method, 3) + @io.lineno.should.eql?(2) + + @io.send(@method, 3) + @io.lineno.should.eql?(3) + end + + it "tries to convert the passed limit to an Integer using #to_int" do + obj = mock('to_int') + obj.should_receive(:to_int).and_return(4) + @io.send(@method, obj).should == "this" + end + + it "returns a blank string when passed a limit of 0" do + @io.send(@method, 0).should == "" + end + + it "ignores it when passed a negative limit" do + @io.send(@method, -4).should == "this>is>an>example" + end + end +end + +describe :stringio_gets_separator_and_limit, shared: true do + describe "when passed [separator] and [limit]" do + before :each do + @io = StringIO.new("this>is>an>example") + end + + it "returns the data read until the limit is consumed or the separator is met" do + @io.send(@method, '>', 8).should == "this>" + @io.send(@method, '>', 2).should == "is" + @io.send(@method, '>', 10).should == ">" + @io.send(@method, '>', 6).should == "an>" + @io.send(@method, '>', 5).should == "examp" + end + + it "truncates the multi-character separator at the end to meet the limit" do + @io.send(@method, "is>an", 7).should == "this>is" + end + + it "sets $_ to the read content" do + @io.send(@method, '>', 8) + $_.should == "this>" + @io.send(@method, '>', 2) + $_.should == "is" + @io.send(@method, '>', 10) + $_.should == ">" + @io.send(@method, '>', 6) + $_.should == "an>" + @io.send(@method, '>', 5) + $_.should == "examp" + end + + it "updates self's lineno by one" do + @io.send(@method, '>', 3) + @io.lineno.should.eql?(1) + + @io.send(@method, '>', 3) + @io.lineno.should.eql?(2) + + @io.send(@method, '>', 3) + @io.lineno.should.eql?(3) + end + + it "tries to convert the passed separator to a String using #to_str" do + obj = mock('to_str') + obj.should_receive(:to_str).and_return('>') + @io.send(@method, obj, 5).should == "this>" + end + + it "does not raise TypeError if passed separator is nil" do + @io.send(@method, nil, 5).should == "this>" + end + + it "tries to convert the passed limit to an Integer using #to_int" do + obj = mock('to_int') + obj.should_receive(:to_int).and_return(5) + @io.send(@method, '>', obj).should == "this>" + end + end +end + +describe :stringio_gets_no_argument, shared: true do + describe "when passed no argument" do + before :each do + @io = StringIO.new("this is\nan example\nfor StringIO#gets") + end + + it "returns the data read till the next occurrence of $/ or till eof" do + @io.send(@method).should == "this is\n" + + begin + old_sep = $/ + suppress_warning {$/ = " "} + @io.send(@method).should == "an " + @io.send(@method).should == "example\nfor " + @io.send(@method).should == "StringIO#gets" + ensure + suppress_warning {$/ = old_sep} + end + end + + it "sets $_ to the read content" do + @io.send(@method) + $_.should == "this is\n" + @io.send(@method) + $_.should == "an example\n" + @io.send(@method) + $_.should == "for StringIO#gets" + end + + it "updates self's position" do + @io.send(@method) + @io.pos.should.eql?(8) + + @io.send(@method) + @io.pos.should.eql?(19) + + @io.send(@method) + @io.pos.should.eql?(36) + end + + it "updates self's lineno" do + @io.send(@method) + @io.lineno.should.eql?(1) + + @io.send(@method) + @io.lineno.should.eql?(2) + + @io.send(@method) + @io.lineno.should.eql?(3) + end + end +end + +describe :stringio_gets_chomp, shared: true do + describe "when passed [chomp]" do + it "returns the data read without a trailing newline character" do + io = StringIO.new("this>is>an>example\n") + io.send(@method, chomp: true).should == "this>is>an>example" + end + end +end + +describe :stringio_gets_write_only, shared: true do + describe "when in write-only mode" do + it "raises an IOError" do + io = StringIO.new(+"xyz", "w") + -> { io.send(@method) }.should.raise(IOError) + + io = StringIO.new("xyz") + io.close_read + -> { io.send(@method) }.should.raise(IOError) + end + end +end diff --git a/spec/ruby/library/stringio/shared/isatty.rb b/spec/ruby/library/stringio/shared/isatty.rb index 3da5999953..2b92e8d656 100644 --- a/spec/ruby/library/stringio/shared/isatty.rb +++ b/spec/ruby/library/stringio/shared/isatty.rb @@ -1,5 +1,5 @@ describe :stringio_isatty, shared: true do it "returns false" do - StringIO.new('tty').send(@method).should be_false + StringIO.new("tty").send(@method).should == false end end diff --git a/spec/ruby/library/stringio/shared/read.rb b/spec/ruby/library/stringio/shared/read.rb index 604bf880e5..6e04e75dba 100644 --- a/spec/ruby/library/stringio/shared/read.rb +++ b/spec/ruby/library/stringio/shared/read.rb @@ -5,30 +5,48 @@ describe :stringio_read, shared: true do it "returns the passed buffer String" do # Note: Rubinius bug: - # @io.send(@method, 7, buffer = "").should equal(buffer) - ret = @io.send(@method, 7, buffer = "") - ret.should equal(buffer) + # @io.send(@method, 7, buffer = +"").should.equal?(buffer) + ret = @io.send(@method, 7, buffer = +"") + ret.should.equal?(buffer) end it "reads length bytes and writes them to the buffer String" do - @io.send(@method, 7, buffer = "") + @io.send(@method, 7, buffer = +"").should.equal?(buffer) buffer.should == "example" end + guard -> { StringIO::VERSION < "3.1.2" } do + it "does not preserve the encoding of the given buffer" do + buffer = ''.encode(Encoding::ISO_8859_1) + @io.send(@method, 7, buffer) + + buffer.encoding.should_not == Encoding::ISO_8859_1 + end + end + + guard -> { StringIO::VERSION >= "3.1.2" } do + it "preserves the encoding of the given buffer" do + buffer = ''.encode(Encoding::ISO_8859_1) + @io.send(@method, 7, buffer) + + buffer.encoding.should == Encoding::ISO_8859_1 + end + end + it "tries to convert the passed buffer Object to a String using #to_str" do obj = mock("to_str") - obj.should_receive(:to_str).and_return(buffer = "") + obj.should_receive(:to_str).and_return(buffer = +"") @io.send(@method, 7, obj) buffer.should == "example" end it "raises a TypeError when the passed buffer Object can't be converted to a String" do - lambda { @io.send(@method, 7, Object.new) }.should raise_error(TypeError) + -> { @io.send(@method, 7, Object.new) }.should.raise(TypeError) end - it "raises a #{frozen_error_class} error when passed a frozen String as buffer" do - lambda { @io.send(@method, 7, "".freeze) }.should raise_error(frozen_error_class) + it "raises a FrozenError error when passed a frozen String as buffer" do + -> { @io.send(@method, 7, "".freeze) }.should.raise(FrozenError) end end @@ -48,10 +66,10 @@ describe :stringio_read_length, shared: true do it "correctly updates the position" do @io.send(@method, 3) - @io.pos.should eql(3) + @io.pos.should.eql?(3) @io.send(@method, 999) - @io.pos.should eql(7) + @io.pos.should.eql?(7) end it "tries to convert the passed length to an Integer using #to_int" do @@ -61,21 +79,21 @@ describe :stringio_read_length, shared: true do end it "raises a TypeError when the passed length can't be converted to an Integer" do - lambda { @io.send(@method, Object.new) }.should raise_error(TypeError) + -> { @io.send(@method, Object.new) }.should.raise(TypeError) end it "raises a TypeError when the passed length is negative" do - lambda { @io.send(@method, -2) }.should raise_error(ArgumentError) + -> { @io.send(@method, -2) }.should.raise(ArgumentError) end it "returns a binary String" do - @io.send(@method, 4).encoding.should == Encoding::ASCII_8BIT + @io.send(@method, 4).encoding.should == Encoding::BINARY end end describe :stringio_read_no_arguments, shared: true do before :each do - @io = StringIO.new("example") + @io = StringIO.new(+"example") end it "reads the whole content starting from the current position" do @@ -87,7 +105,13 @@ describe :stringio_read_no_arguments, shared: true do it "correctly updates the current position" do @io.send(@method) - @io.pos.should eql(7) + @io.pos.should.eql?(7) + end + + it "correctly update the current position in bytes when multi-byte characters are used" do + @io.print("example\u03A3") # Overwrite the original string with 8 characters containing 9 bytes. + @io.send(@method) + @io.pos.should.eql?(9) end end @@ -105,17 +129,17 @@ describe :stringio_read_nil, shared: true do it "updates the current position" do @io.send(@method, nil) - @io.pos.should eql(7) + @io.pos.should.eql?(7) end end describe :stringio_read_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("test", "w") - lambda { io.send(@method) }.should raise_error(IOError) + io = StringIO.new(+"test", "w") + -> { io.send(@method) }.should.raise(IOError) io = StringIO.new("test") io.close_read - lambda { io.send(@method) }.should raise_error(IOError) + -> { io.send(@method) }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/shared/readchar.rb b/spec/ruby/library/stringio/shared/readchar.rb index 19194f0680..5ac28e0743 100644 --- a/spec/ruby/library/stringio/shared/readchar.rb +++ b/spec/ruby/library/stringio/shared/readchar.rb @@ -13,17 +13,17 @@ describe :stringio_readchar, shared: true do it "raises an EOFError when self is at the end" do @io.pos = 7 - lambda { @io.send(@method) }.should raise_error(EOFError) + -> { @io.send(@method) }.should.raise(EOFError) end end describe :stringio_readchar_not_readable, shared: true do it "raises an IOError" do - io = StringIO.new("a b c d e", "w") - lambda { io.send(@method) }.should raise_error(IOError) + io = StringIO.new(+"a b c d e", "w") + -> { io.send(@method) }.should.raise(IOError) io = StringIO.new("a b c d e") io.close_read - lambda { io.send(@method) }.should raise_error(IOError) + -> { io.send(@method) }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/shared/sysread.rb b/spec/ruby/library/stringio/shared/sysread.rb index 9800b2339b..bc448d3379 100644 --- a/spec/ruby/library/stringio/shared/sysread.rb +++ b/spec/ruby/library/stringio/shared/sysread.rb @@ -1,4 +1,4 @@ -describe :stringio_sysread_length, :shared => true do +describe :stringio_sysread_length, shared: true do before :each do @io = StringIO.new("example") end @@ -10,6 +10,6 @@ describe :stringio_sysread_length, :shared => true do it "raises an EOFError when passed length > 0 and no data remains" do @io.read.should == "example" - lambda { @io.sysread(1) }.should raise_error(EOFError) + -> { @io.send(@method, 1) }.should.raise(EOFError) end end diff --git a/spec/ruby/library/stringio/shared/write.rb b/spec/ruby/library/stringio/shared/write.rb index bcb548bbd0..b6bffe7f12 100644 --- a/spec/ruby/library/stringio/shared/write.rb +++ b/spec/ruby/library/stringio/shared/write.rb @@ -1,6 +1,6 @@ describe :stringio_write, shared: true do before :each do - @io = StringIO.new('12345') + @io = StringIO.new(+'12345') end it "tries to convert the passed Object to a String using #to_s" do @@ -13,7 +13,7 @@ end describe :stringio_write_string, shared: true do before :each do - @io = StringIO.new('12345') + @io = StringIO.new(+'12345') end # TODO: RDoc says that #write appends at the current position. @@ -42,34 +42,82 @@ describe :stringio_write_string, shared: true do it "updates self's position" do @io.send(@method, 'test') - @io.pos.should eql(4) + @io.pos.should.eql?(4) end - it "taints self's String when the passed argument is tainted" do - @io.send(@method, "test".taint) - @io.string.tainted?.should be_true + it "handles concurrent writes correctly" do + @io = StringIO.new + n = 8 + go = false + threads = n.times.map { |i| + Thread.new { + Thread.pass until go + @io.write i.to_s + } + } + go = true + threads.each(&:join) + @io.string.size.should == n.times.map(&:to_s).join.size end - it "does not taint self when the passed argument is tainted" do - @io.send(@method, "test".taint) - @io.tainted?.should be_false + it "handles writing non-ASCII UTF-8 after seek" do + @io.binmode + @io << "\x80" + @io.pos = 0 + @io << "\x81" + @io.string.should == "\x812345".b + end + + it "handles writing with position < buffer size" do + @io.pos = 2 + @io.write "abc" + @io.string.should == "12abc" + + @io.pos = 2 + @io.write "de" + @io.string.should == "12dec" + + @io.pos = 2 + @io.write "fghi" + @io.string.should == "12fghi" + end + + it "transcodes the given string when the external encoding is set and neither is BINARY" do + utf8_str = "hello" + io = StringIO.new.set_encoding(Encoding::UTF_16BE) + io.external_encoding.should == Encoding::UTF_16BE + + io.send(@method, utf8_str) + + expected = [0, 104, 0, 101, 0, 108, 0, 108, 0, 111] # UTF-16BE bytes for "hello" + io.string.bytes.should == expected + end + + it "does not transcode the given string when the external encoding is set and the string encoding is BINARY" do + str = "été_".b + io = StringIO.new.set_encoding(Encoding::UTF_16BE) + io.external_encoding.should == Encoding::UTF_16BE + + io.send(@method, str) + + io.string.bytes.should == str.bytes end end describe :stringio_write_not_writable, shared: true do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.send(@method, "test") }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.send(@method, "test") }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.send(@method, "test") }.should raise_error(IOError) + -> { io.send(@method, "test") }.should.raise(IOError) end end describe :stringio_write_append, shared: true do before :each do - @io = StringIO.new("example", "a") + @io = StringIO.new(+"example", "a") end it "appends the passed argument to the end of self" do @@ -82,6 +130,6 @@ describe :stringio_write_append, shared: true do it "correctly updates self's position" do @io.send(@method, ", testing") - @io.pos.should eql(16) + @io.pos.should.eql?(16) end end diff --git a/spec/ruby/library/stringio/string_spec.rb b/spec/ruby/library/stringio/string_spec.rb index 384986c161..3b27243da9 100644 --- a/spec/ruby/library/stringio/string_spec.rb +++ b/spec/ruby/library/stringio/string_spec.rb @@ -4,7 +4,7 @@ require_relative 'fixtures/classes' describe "StringIO#string" do it "returns the underlying string" do io = StringIO.new(str = "hello") - io.string.should equal(str) + io.string.should.equal?(str) end end @@ -15,25 +15,25 @@ describe "StringIO#string=" do it "returns the passed String" do str = "test" - (@io.string = str).should equal(str) + (@io.string = str).should.equal?(str) end it "changes the underlying string" do str = "hello" @io.string = str - @io.string.should equal(str) + @io.string.should.equal?(str) end it "resets the position" do @io.pos = 1 @io.string = "other" - @io.pos.should eql(0) + @io.pos.should.eql?(0) end it "resets the line number" do @io.lineno = 1 @io.string = "other" - @io.lineno.should eql(0) + @io.lineno.should.eql?(0) end it "tries to convert the passed Object to a String using #to_str" do @@ -45,6 +45,6 @@ describe "StringIO#string=" do end it "raises a TypeError when the passed Object can't be converted to an Integer" do - lambda { @io.seek(Object.new) }.should raise_error(TypeError) + -> { @io.seek(Object.new) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/stringio/stringio_spec.rb b/spec/ruby/library/stringio/stringio_spec.rb index 5ef42b3390..dee0364ab0 100644 --- a/spec/ruby/library/stringio/stringio_spec.rb +++ b/spec/ruby/library/stringio/stringio_spec.rb @@ -3,6 +3,6 @@ require "stringio" describe "StringIO" do it "includes the Enumerable module" do - StringIO.should include(Enumerable) + StringIO.should.include?(Enumerable) end end diff --git a/spec/ruby/library/stringio/sync_spec.rb b/spec/ruby/library/stringio/sync_spec.rb index e717a5697b..d7d1209047 100644 --- a/spec/ruby/library/stringio/sync_spec.rb +++ b/spec/ruby/library/stringio/sync_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#sync" do it "returns true" do - StringIO.new('').sync.should be_true + StringIO.new('').sync.should == true end end @@ -14,6 +14,6 @@ describe "StringIO#sync=" do it "does not change 'sync' status" do @io.sync = false - @io.sync.should be_true + @io.sync.should == true end end diff --git a/spec/ruby/library/stringio/sysread_spec.rb b/spec/ruby/library/stringio/sysread_spec.rb index ee69801444..1403dab5cb 100644 --- a/spec/ruby/library/stringio/sysread_spec.rb +++ b/spec/ruby/library/stringio/sysread_spec.rb @@ -1,6 +1,7 @@ require_relative '../../spec_helper' require "stringio" require_relative 'shared/read' +require_relative 'shared/sysread' describe "StringIO#sysread when passed length, buffer" do it_behaves_like :stringio_read, :sysread @@ -32,6 +33,10 @@ describe "StringIO#sysread when passed nil" do end end +describe "StringIO#sysread when passed length" do + it_behaves_like :stringio_sysread_length, :sysread +end + describe "StringIO#sysread when passed [length]" do before :each do @io = StringIO.new("example") @@ -39,7 +44,7 @@ describe "StringIO#sysread when passed [length]" do it "raises an EOFError when self's position is at the end" do @io.pos = 7 - lambda { @io.sysread(10) }.should raise_error(EOFError) + -> { @io.sysread(10) }.should.raise(EOFError) end it "returns an empty String when length is 0" do diff --git a/spec/ruby/library/stringio/truncate_spec.rb b/spec/ruby/library/stringio/truncate_spec.rb index d0d61af70a..7205261141 100644 --- a/spec/ruby/library/stringio/truncate_spec.rb +++ b/spec/ruby/library/stringio/truncate_spec.rb @@ -3,13 +3,11 @@ require "stringio" describe "StringIO#truncate when passed [length]" do before :each do - @io = StringIO.new('123456789') + @io = StringIO.new(+'123456789') end - # TODO: Report to Ruby-Core: The RDoc says it always returns 0 - it "returns the passed length" do - @io.truncate(4).should eql(4) - @io.truncate(10).should eql(10) + it "returns an Integer" do + @io.truncate(4).should.is_a?(Integer) end it "truncated the underlying string down to the passed length" do @@ -18,15 +16,15 @@ describe "StringIO#truncate when passed [length]" do end it "does not create a copy of the underlying string" do - io = StringIO.new(str = "123456789") + io = StringIO.new(str = +"123456789") io.truncate(4) - io.string.should equal(str) + io.string.should.equal?(str) end it "does not change the position" do @io.pos = 7 @io.truncate(4) - @io.pos.should eql(7) + @io.pos.should.eql?(7) end it "can grow a string to a larger size, padding it with \\000" do @@ -35,8 +33,8 @@ describe "StringIO#truncate when passed [length]" do end it "raises an Errno::EINVAL when the passed length is negative" do - lambda { @io.truncate(-1) }.should raise_error(Errno::EINVAL) - lambda { @io.truncate(-10) }.should raise_error(Errno::EINVAL) + -> { @io.truncate(-1) }.should.raise(Errno::EINVAL) + -> { @io.truncate(-10) }.should.raise(Errno::EINVAL) end it "tries to convert the passed length to an Integer using #to_int" do @@ -47,24 +45,18 @@ describe "StringIO#truncate when passed [length]" do @io.string.should == "1234" end - it "returns the passed length Object, NOT the result of #to_int" do - obj = mock("to_int") - obj.should_receive(:to_int).and_return(4) - @io.truncate(obj).should equal(obj) - end - it "raises a TypeError when the passed length can't be converted to an Integer" do - lambda { @io.truncate(Object.new) }.should raise_error(TypeError) + -> { @io.truncate(Object.new) }.should.raise(TypeError) end end describe "StringIO#truncate when self is not writable" do it "raises an IOError" do - io = StringIO.new("test", "r") - lambda { io.truncate(2) }.should raise_error(IOError) + io = StringIO.new(+"test", "r") + -> { io.truncate(2) }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.close_write - lambda { io.truncate(2) }.should raise_error(IOError) + -> { io.truncate(2) }.should.raise(IOError) end end diff --git a/spec/ruby/library/stringio/ungetbyte_spec.rb b/spec/ruby/library/stringio/ungetbyte_spec.rb index 701463e621..87b27b837e 100644 --- a/spec/ruby/library/stringio/ungetbyte_spec.rb +++ b/spec/ruby/library/stringio/ungetbyte_spec.rb @@ -1,6 +1,42 @@ +# frozen_string_literal: false require_relative '../../spec_helper' require 'stringio' describe "StringIO#ungetbyte" do - it "needs to be reviewed for spec completeness" + it "ungets a single byte from a string starting with a single byte character" do + str = 'This is a simple string.' + io = StringIO.new("#{str}") + c = io.getc + c.should == 'T' + io.ungetbyte(83) + io.string.should == 'Shis is a simple string.' + end + + it "ungets a single byte from a string in the middle of a multibyte character" do + str = "\u01a9" + io = StringIO.new(str) + b = io.getbyte + b.should == 0xc6 # First byte of UTF-8 encoding of \u01a9 + io.ungetbyte(0xce) # First byte of UTF-8 encoding of \u03a9 + io.string.should == "\u03a9" + end + + it "constrains the value of a numeric argument to a single byte" do + str = 'This is a simple string.' + io = StringIO.new("#{str}") + c = io.getc + c.should == 'T' + io.ungetbyte(83 | 0xff00) + io.string.should == 'Shis is a simple string.' + end + + it "ungets the bytes of a string if given a string as an argument" do + str = "\u01a9" + io = StringIO.new(str) + b = io.getbyte + b.should == 0xc6 # First byte of UTF-8 encoding of \u01a9 + io.ungetbyte("\u01a9") + io.string.bytes.should == [198, 169, 169] + end + end diff --git a/spec/ruby/library/stringio/ungetc_spec.rb b/spec/ruby/library/stringio/ungetc_spec.rb index 8a9205f390..8753ac9666 100644 --- a/spec/ruby/library/stringio/ungetc_spec.rb +++ b/spec/ruby/library/stringio/ungetc_spec.rb @@ -3,7 +3,7 @@ require_relative 'fixtures/classes' describe "StringIO#ungetc when passed [char]" do before :each do - @io = StringIO.new('1234') + @io = StringIO.new(+'1234') end it "writes the passed char before the current position" do @@ -14,13 +14,13 @@ describe "StringIO#ungetc when passed [char]" do it "returns nil" do @io.pos = 1 - @io.ungetc(?A).should be_nil + @io.ungetc(?A).should == nil end it "decreases the current position by one" do @io.pos = 2 @io.ungetc(?A) - @io.pos.should eql(1) + @io.pos.should.eql?(1) end it "pads with \\000 when the current position is after the end" do @@ -39,20 +39,20 @@ describe "StringIO#ungetc when passed [char]" do end it "raises a TypeError when the passed length can't be converted to an Integer or String" do - lambda { @io.ungetc(Object.new) }.should raise_error(TypeError) + -> { @io.ungetc(Object.new) }.should.raise(TypeError) end end describe "StringIO#ungetc when self is not readable" do it "raises an IOError" do - io = StringIO.new("test", "w") + io = StringIO.new(+"test", "w") io.pos = 1 - lambda { io.ungetc(?A) }.should raise_error(IOError) + -> { io.ungetc(?A) }.should.raise(IOError) - io = StringIO.new("test") + io = StringIO.new(+"test") io.pos = 1 io.close_read - lambda { io.ungetc(?A) }.should raise_error(IOError) + -> { io.ungetc(?A) }.should.raise(IOError) end end @@ -60,13 +60,13 @@ end # # describe "StringIO#ungetc when self is not writable" do # it "raises an IOError" do -# io = StringIO.new("test", "r") +# io = StringIO.new(+"test", "r") # io.pos = 1 -# lambda { io.ungetc(?A) }.should raise_error(IOError) +# lambda { io.ungetc(?A) }.should.raise(IOError) # -# io = StringIO.new("test") +# io = StringIO.new(+"test") # io.pos = 1 # io.close_write -# lambda { io.ungetc(?A) }.should raise_error(IOError) +# lambda { io.ungetc(?A) }.should.raise(IOError) # end # end diff --git a/spec/ruby/library/stringio/write_nonblock_spec.rb b/spec/ruby/library/stringio/write_nonblock_spec.rb index 4f4c5039fe..b48ef6698a 100644 --- a/spec/ruby/library/stringio/write_nonblock_spec.rb +++ b/spec/ruby/library/stringio/write_nonblock_spec.rb @@ -8,6 +8,12 @@ end describe "StringIO#write_nonblock when passed [String]" do it_behaves_like :stringio_write_string, :write_nonblock + + it "accepts :exception option" do + io = StringIO.new(+"12345", "a") + io.write_nonblock("67890", exception: true) + io.string.should == "1234567890" + end end describe "StringIO#write_nonblock when self is not writable" do diff --git a/spec/ruby/library/stringscanner/append_spec.rb b/spec/ruby/library/stringscanner/append_spec.rb index 378c62e2b1..fef5dcf2bd 100644 --- a/spec/ruby/library/stringscanner/append_spec.rb +++ b/spec/ruby/library/stringscanner/append_spec.rb @@ -6,6 +6,6 @@ describe "StringScanner#<<" do it_behaves_like :strscan_concat, :<< end -describe "StringScanner#<< when passed a Fixnum" do +describe "StringScanner#<< when passed an Integer" do it_behaves_like :strscan_concat_fixnum, :<< end diff --git a/spec/ruby/library/stringscanner/captures_spec.rb b/spec/ruby/library/stringscanner/captures_spec.rb new file mode 100644 index 0000000000..bdfb0e0cc5 --- /dev/null +++ b/spec/ruby/library/stringscanner/captures_spec.rb @@ -0,0 +1,36 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#captures" do + before do + @s = StringScanner.new('Fri Dec 12 1975 14:39') + end + + it "returns the array of captured values of the most recent matching" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.captures.should == ["Fri", "Dec", "12"] + end + + it "returns nil if the last match fails" do + @s.scan(/nope/) + @s.captures.should == nil + end + + it "returns nil if there is no any match done" do + @s.captures.should == nil + end + + version_is StringScanner::Version, ""..."3.0.8" do # ruby_version_is ""..."3.3.3" + it "returns '' for an optional capturing group if it doesn't match" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\s+)?/) + @s.captures.should == ["Fri", "Dec", ""] + end + end + + version_is StringScanner::Version, "3.0.8" do # ruby_version_is "3.3.3" + it "returns nil for an optional capturing group if it doesn't match" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\s+)?/) + @s.captures.should == ["Fri", "Dec", nil] + end + end +end diff --git a/spec/ruby/library/stringscanner/charpos_spec.rb b/spec/ruby/library/stringscanner/charpos_spec.rb new file mode 100644 index 0000000000..9aa5b00dd9 --- /dev/null +++ b/spec/ruby/library/stringscanner/charpos_spec.rb @@ -0,0 +1,18 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#charpos" do + it "returns character index corresponding to the current position" do + s = StringScanner.new("abc") + + s.scan_until(/b/) + s.charpos.should == 2 + end + + it "is multi-byte character sensitive" do + s = StringScanner.new("abcädeföghi") + + s.scan_until(/ö/) + s.charpos.should == 8 + end +end diff --git a/spec/ruby/library/stringscanner/check_spec.rb b/spec/ruby/library/stringscanner/check_spec.rb index c7f788f0b3..232158b09e 100644 --- a/spec/ruby/library/stringscanner/check_spec.rb +++ b/spec/ruby/library/stringscanner/check_spec.rb @@ -13,4 +13,81 @@ describe "StringScanner#check" do @s.check(/is/).should == nil @s.matched.should == nil end + + it "treats String as the pattern itself" do + @s.check("This").should == "This" + @s.matched.should == "This" + @s.pos.should == 0 + @s.check(/is/).should == nil + @s.matched.should == nil + end + + describe "#[] successive call with a capture group name" do + context "when #check was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.check(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.check(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end + + context "when #check was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.check("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "raises IndexError when matching succeeded" do + @s.check("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.check("2008") + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.check("This") + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.check("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.check("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/check_until_spec.rb b/spec/ruby/library/stringscanner/check_until_spec.rb index e92ae5a2e9..b4ef35d9f7 100644 --- a/spec/ruby/library/stringscanner/check_until_spec.rb +++ b/spec/ruby/library/stringscanner/check_until_spec.rb @@ -2,14 +2,128 @@ require_relative '../../spec_helper' require 'strscan' describe "StringScanner#check_until" do - before :each do + before do @s = StringScanner.new("This is a test") end - it "returns the same value of scan_until, but don't advances the scan pointer" do + it "returns the same value of #scan_until, but don't advances the scan pointer" do @s.check_until(/a/).should == "This is a" @s.pos.should == 0 - @s.matched.should == "a" @s.check_until(/test/).should == "This is a test" end + + it "sets the last match result" do + @s.check_until(/a/) + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" + end + + version_is StringScanner::Version, ""..."3.1.1" do # ruby_version_is ""..."3.4" + it "raises TypeError if given a String" do + -> { + @s.check_until('T') + }.should.raise(TypeError, 'wrong argument type String (expected Regexp)') + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + it "searches a substring in the rest part of a string if given a String" do + @s.check_until("a").should == "This is a" + @s.pos.should == 0 + end + + # https://github.com/ruby/strscan/issues/131 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.1" + it "sets the last match result if given a String" do + @s.check_until("a") + + @s.pre_match.should == "" + @s.matched.should == "This is a" + @s.post_match.should == " test" + end + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "sets the last match result if given a String" do + @s.check_until("a") + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" + end + end + end + + describe "#[] successive call with a capture group name" do + context "when #check_until was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.check_until(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.check_until(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + context "when #check_until was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.check_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + @s.check_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.check_until("2008") + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.check_until("This") + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.check_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.check_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/clear_spec.rb b/spec/ruby/library/stringscanner/clear_spec.rb deleted file mode 100644 index 70c60f7039..0000000000 --- a/spec/ruby/library/stringscanner/clear_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/terminate' -require 'strscan' - -describe "StringScanner#clear" do - it_behaves_like :strscan_terminate, :clear - - it "warns in verbose mode that the method is obsolete" do - s = StringScanner.new("abc") - lambda { - $VERBOSE = true - s.clear - }.should complain(/clear.*obsolete.*terminate/) - - lambda { - $VERBOSE = false - s.clear - }.should_not complain - end -end diff --git a/spec/ruby/library/stringscanner/concat_spec.rb b/spec/ruby/library/stringscanner/concat_spec.rb index 17a699dd2e..4f790e2505 100644 --- a/spec/ruby/library/stringscanner/concat_spec.rb +++ b/spec/ruby/library/stringscanner/concat_spec.rb @@ -6,6 +6,6 @@ describe "StringScanner#concat" do it_behaves_like :strscan_concat, :concat end -describe "StringScanner#concat when passed a Fixnum" do +describe "StringScanner#concat when passed an Integer" do it_behaves_like :strscan_concat_fixnum, :concat end diff --git a/spec/ruby/library/stringscanner/dup_spec.rb b/spec/ruby/library/stringscanner/dup_spec.rb index 3b426f138e..0118964526 100644 --- a/spec/ruby/library/stringscanner/dup_spec.rb +++ b/spec/ruby/library/stringscanner/dup_spec.rb @@ -12,10 +12,10 @@ describe "StringScanner#dup" do s.string.should == @string end - it "copies the passed StringSCanner's position to self" do + it "copies the passed StringScanner's position to self" do @orig_s.pos = 5 s = @orig_s.dup - s.pos.should eql(5) + s.pos.should.eql?(5) end it "copies previous match state" do @@ -34,6 +34,6 @@ describe "StringScanner#dup" do it "copies the passed StringScanner scan pointer to self" do @orig_s.terminate s = @orig_s.dup - s.eos?.should be_true + s.eos?.should == true end end diff --git a/spec/ruby/library/stringscanner/element_reference_spec.rb b/spec/ruby/library/stringscanner/element_reference_spec.rb index c3fab16bbc..bcd48ede61 100644 --- a/spec/ruby/library/stringscanner/element_reference_spec.rb +++ b/spec/ruby/library/stringscanner/element_reference_spec.rb @@ -7,7 +7,8 @@ describe "StringScanner#[]" do end it "returns nil if there is no current match" do - @s[0].should be_nil + @s[0].should == nil + @s[:wday].should == nil end it "returns the n-th subgroup in the most recent match" do @@ -34,18 +35,24 @@ describe "StringScanner#[]" do it "raises a TypeError if the given index is nil" do @s.scan(/(\w+) (\w+) (\d+) /) - lambda { @s[nil]}.should raise_error(TypeError) + -> { @s[nil]}.should.raise(TypeError) end it "raises a TypeError when a Range is as argument" do @s.scan(/(\w+) (\w+) (\d+) /) - lambda { @s[0..2]}.should raise_error(TypeError) + -> { @s[0..2]}.should.raise(TypeError) end - it "raises a IndexError when there's no named capture" do + it "raises a IndexError when there's no any named capture group in the regexp" do @s.scan(/(\w+) (\w+) (\d+) /) - lambda { @s["wday"]}.should raise_error(IndexError) - lambda { @s[:wday]}.should raise_error(IndexError) + -> { @s["wday"]}.should.raise(IndexError) + -> { @s[:wday]}.should.raise(IndexError) + end + + it "raises a IndexError when given a not existing capture group name" do + @s.scan(/(?<a>\w+) (?<b>\w+) (?<c>\d+) /) + -> { @s["wday"]}.should.raise(IndexError) + -> { @s[:wday]}.should.raise(IndexError) end it "returns named capture" do diff --git a/spec/ruby/library/stringscanner/empty_spec.rb b/spec/ruby/library/stringscanner/empty_spec.rb deleted file mode 100644 index bba51364c8..0000000000 --- a/spec/ruby/library/stringscanner/empty_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/eos' -require 'strscan' - -describe "StringScanner#empty?" do - it_behaves_like :strscan_eos, :empty? - - it "warns in verbose mode that the method is obsolete" do - s = StringScanner.new("abc") - lambda { - $VERBOSE = true - s.empty? - }.should complain(/empty?.*obsolete.*eos?/) - - lambda { - $VERBOSE = false - s.empty? - }.should_not complain - end -end diff --git a/spec/ruby/library/stringscanner/eos_spec.rb b/spec/ruby/library/stringscanner/eos_spec.rb index b58ee1e473..03c2804e5b 100644 --- a/spec/ruby/library/stringscanner/eos_spec.rb +++ b/spec/ruby/library/stringscanner/eos_spec.rb @@ -1,7 +1,20 @@ require_relative '../../spec_helper' -require_relative 'shared/eos' require 'strscan' describe "StringScanner#eos?" do - it_behaves_like :strscan_eos, :eos? + before :each do + @s = StringScanner.new("This is a test") + end + + it "returns true if the scan pointer is at the end of the string" do + @s.terminate + @s.should.eos? + + s = StringScanner.new('') + s.should.eos? + end + + it "returns false if the scan pointer is not at the end of the string" do + @s.should_not.eos? + end end diff --git a/spec/ruby/library/stringscanner/exist_spec.rb b/spec/ruby/library/stringscanner/exist_spec.rb index beafadc07b..2207622366 100644 --- a/spec/ruby/library/stringscanner/exist_spec.rb +++ b/spec/ruby/library/stringscanner/exist_spec.rb @@ -2,11 +2,11 @@ require_relative '../../spec_helper' require 'strscan' describe "StringScanner#exist?" do - before :each do + before do @s = StringScanner.new("This is a test") end - it "returns the index of the first occurrence of the given pattern" do + it "returns distance in bytes between the current position and the end of the matched substring" do @s.exist?(/s/).should == 4 @s.scan(/This is/) @s.exist?(/s/).should == 6 @@ -21,4 +21,99 @@ describe "StringScanner#exist?" do @s.scan(/This is/) @s.exist?(/i/).should == nil end + + it "does not modify the current position" do + @s.pos.should == 0 + @s.exist?(/s/).should == 4 + @s.pos.should == 0 + end + + version_is StringScanner::Version, ""..."3.1.1" do # ruby_version_is ""..."3.4" + it "raises TypeError if given a String" do + -> { + @s.exist?('T') + }.should.raise(TypeError, 'wrong argument type String (expected Regexp)') + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + it "searches a substring in the rest part of a string if given a String" do + @s.exist?('a').should == 9 + end + + it "returns nil if the pattern isn't found in the string" do + @s.exist?("S").should == nil + end + end + + describe "#[] successive call with a capture group name" do + context "when #exist? was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.exist?(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + context "when #exist? was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.exist?("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + @s.exist?("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.exist?("2008") + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.exist?("This") + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.exist?("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.exist?("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/fixed_anchor_spec.rb b/spec/ruby/library/stringscanner/fixed_anchor_spec.rb new file mode 100644 index 0000000000..ce0b714fa8 --- /dev/null +++ b/spec/ruby/library/stringscanner/fixed_anchor_spec.rb @@ -0,0 +1,17 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#fixed_anchor?" do + it "returns whether the fixed-anchor property is set" do + s = StringScanner.new("foo", fixed_anchor: true) + s.should.fixed_anchor? + + s = StringScanner.new("foo", fixed_anchor: false) + s.should_not.fixed_anchor? + end + + it "is set to false by default" do + s = StringScanner.new("foo") + s.should_not.fixed_anchor? + end +end diff --git a/spec/ruby/library/stringscanner/get_byte_spec.rb b/spec/ruby/library/stringscanner/get_byte_spec.rb index 29e2f557de..b989b73883 100644 --- a/spec/ruby/library/stringscanner/get_byte_spec.rb +++ b/spec/ruby/library/stringscanner/get_byte_spec.rb @@ -1,7 +1,84 @@ +# encoding: binary require_relative '../../spec_helper' -require_relative 'shared/get_byte' require 'strscan' describe "StringScanner#get_byte" do - it_behaves_like :strscan_get_byte, :get_byte + it "scans one byte and returns it" do + s = StringScanner.new('abc5.') + s.get_byte.should == 'a' + s.get_byte.should == 'b' + s.get_byte.should == 'c' + s.get_byte.should == '5' + s.get_byte.should == '.' + end + + it "is not multi-byte character sensitive" do + s = StringScanner.new("\244\242") + s.get_byte.should == "\244" + s.get_byte.should == "\242" + end + + it "returns nil at the end of the string" do + # empty string case + s = StringScanner.new('') + s.get_byte.should == nil + s.get_byte.should == nil + + # non-empty string case + s = StringScanner.new('a') + s.get_byte # skip one + s.get_byte.should == nil + end + + describe "#[] successive call with a capture group name" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil" do + s = StringScanner.new("This is a test") + s.get_byte + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError" do + s = StringScanner.new("This is a test") + s.get_byte + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + + it "returns a matching character when given Integer index" do + s = StringScanner.new("This is a test") + s.get_byte + s[0].should == "T" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("This is a test") + s.exist?(/(?<a>This)/) + s.should.matched? + s[:a].should == "This" + + s.get_byte + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("This is a test") + s.exist?(/(?<a>This)/) + s.should.matched? + s[:a].should == "This" + + s.get_byte + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + end end diff --git a/spec/ruby/library/stringscanner/getbyte_spec.rb b/spec/ruby/library/stringscanner/getbyte_spec.rb deleted file mode 100644 index a71c5ee781..0000000000 --- a/spec/ruby/library/stringscanner/getbyte_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/get_byte' -require_relative 'shared/extract_range' -require 'strscan' - -describe "StringScanner#getbyte" do - it_behaves_like :strscan_get_byte, :getbyte - - it "warns in verbose mode that the method is obsolete" do - s = StringScanner.new("abc") - lambda { - $VERBOSE = true - s.getbyte - }.should complain(/getbyte.*obsolete.*get_byte/) - - lambda { - $VERBOSE = false - s.getbyte - }.should_not complain - end - - it_behaves_like :extract_range, :getbyte -end diff --git a/spec/ruby/library/stringscanner/getch_spec.rb b/spec/ruby/library/stringscanner/getch_spec.rb index a6be0d4221..cd41b4336a 100644 --- a/spec/ruby/library/stringscanner/getch_spec.rb +++ b/spec/ruby/library/stringscanner/getch_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require_relative '../../spec_helper' require_relative 'shared/extract_range' require 'strscan' @@ -11,9 +11,16 @@ describe "StringScanner#getch" do s.getch.should == "c" end + it "scans newlines too" do + s = StringScanner.new("a\nc") + s.getch.should == "a" + s.getch.should == "\n" + s.getch.should == "c" + end + it "is multi-byte character sensitive" do # Japanese hiragana "A" in EUC-JP - src = "\244\242".force_encoding("euc-jp") + src = "\244\242".dup.force_encoding("euc-jp") s = StringScanner.new(src) s.getch.should == src @@ -31,5 +38,59 @@ describe "StringScanner#getch" do s.getch.should == nil end + describe "#[] successive call with a capture group name" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil" do + s = StringScanner.new("This is a test") + s.getch + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError" do + s = StringScanner.new("This is a test") + s.getch + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + + it "returns a matching character when given Integer index" do + s = StringScanner.new("This is a test") + s.getch + s[0].should == "T" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("This is a test") + + s.exist?(/(?<a>This)/) + s.should.matched? + s[:a].should == "This" + + s.getch + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("This is a test") + + s.exist?(/(?<a>This)/) + s.should.matched? + s[:a].should == "This" + + s.getch + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + end + it_behaves_like :extract_range, :getch end diff --git a/spec/ruby/library/stringscanner/initialize_spec.rb b/spec/ruby/library/stringscanner/initialize_spec.rb index 07f71572ce..fdab4d381c 100644 --- a/spec/ruby/library/stringscanner/initialize_spec.rb +++ b/spec/ruby/library/stringscanner/initialize_spec.rb @@ -7,13 +7,12 @@ describe "StringScanner#initialize" do end it "is a private method" do - StringScanner.should have_private_instance_method(:initialize) + StringScanner.private_instance_methods(false).should.include?(:initialize) end it "returns an instance of StringScanner" do - @s.should be_kind_of(StringScanner) - @s.tainted?.should be_false - @s.eos?.should be_false + @s.should.is_a?(StringScanner) + @s.eos?.should == false end it "converts the argument into a string using #to_str" do @@ -25,4 +24,9 @@ describe "StringScanner#initialize" do scan = StringScanner.new(m) scan.string.should == s end + + it "accepts a fixed_anchor keyword argument" do + s = StringScanner.new("foo", fixed_anchor: true) + s.should.fixed_anchor? + end end diff --git a/spec/ruby/library/stringscanner/inspect_spec.rb b/spec/ruby/library/stringscanner/inspect_spec.rb index ff6b97eb91..570d0b7b10 100644 --- a/spec/ruby/library/stringscanner/inspect_spec.rb +++ b/spec/ruby/library/stringscanner/inspect_spec.rb @@ -7,7 +7,7 @@ describe "StringScanner#inspect" do end it "returns a String object" do - @s.inspect.should be_kind_of(String) + @s.inspect.should.is_a?(String) end it "returns a string that represents the StringScanner object" do diff --git a/spec/ruby/library/stringscanner/match_spec.rb b/spec/ruby/library/stringscanner/match_spec.rb index ec59680914..c2bc49324b 100644 --- a/spec/ruby/library/stringscanner/match_spec.rb +++ b/spec/ruby/library/stringscanner/match_spec.rb @@ -17,6 +17,15 @@ describe "StringScanner#match?" do @s.match?(/\s+/).should == nil end + it "sets the last match result" do + @s.pos = 8 + @s.match?(/a/) + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" + end + it "effects pre_match" do @s.scan(/\w+/) @s.scan(/\s/) @@ -25,4 +34,18 @@ describe "StringScanner#match?" do @s.match?(/\w+/) @s.pre_match.should == "This " end + + describe "#[] successive call with a capture group name" do + it "returns matched substring when matching succeeded" do + @s.match?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.match?(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end end diff --git a/spec/ruby/library/stringscanner/matched_size_spec.rb b/spec/ruby/library/stringscanner/matched_size_spec.rb index a36bd3aafe..d9c338a07e 100644 --- a/spec/ruby/library/stringscanner/matched_size_spec.rb +++ b/spec/ruby/library/stringscanner/matched_size_spec.rb @@ -1,7 +1,24 @@ require_relative '../../spec_helper' -require_relative 'shared/matched_size' require 'strscan' describe "StringScanner#matched_size" do - it_behaves_like :strscan_matched_size, :matched_size + before :each do + @s = StringScanner.new("This is a test") + end + + it "returns the size of the most recent match" do + @s.check(/This/) + @s.matched_size.should == 4 + @s.matched_size.should == 4 + @s.scan(//) + @s.matched_size.should == 0 + end + + it "returns nil if there was no recent match" do + @s.matched_size.should == nil + @s.check(/\d+/) + @s.matched_size.should == nil + @s.terminate + @s.matched_size.should == nil + end end diff --git a/spec/ruby/library/stringscanner/matched_spec.rb b/spec/ruby/library/stringscanner/matched_spec.rb index c020bd3eae..95b57574c5 100644 --- a/spec/ruby/library/stringscanner/matched_spec.rb +++ b/spec/ruby/library/stringscanner/matched_spec.rb @@ -31,11 +31,11 @@ describe "StringScanner#matched?" do it "returns true if the last match was successful" do @s.match?(/\w+/) - @s.matched?.should be_true + @s.matched?.should == true end it "returns false if there's no match" do @s.match?(/\d+/) - @s.matched?.should be_false + @s.matched?.should == false end end diff --git a/spec/ruby/library/stringscanner/must_C_version_spec.rb b/spec/ruby/library/stringscanner/must_C_version_spec.rb index fcc5b596f6..9d6edfe7b6 100644 --- a/spec/ruby/library/stringscanner/must_C_version_spec.rb +++ b/spec/ruby/library/stringscanner/must_C_version_spec.rb @@ -3,6 +3,6 @@ require 'strscan' describe "StringScanner.must_C_version" do it "returns self" do - StringScanner.must_C_version.should == StringScanner + StringScanner.must_C_version.should == StringScanner end end diff --git a/spec/ruby/library/stringscanner/named_captures_spec.rb b/spec/ruby/library/stringscanner/named_captures_spec.rb new file mode 100644 index 0000000000..927784a6c4 --- /dev/null +++ b/spec/ruby/library/stringscanner/named_captures_spec.rb @@ -0,0 +1,28 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#named_captures" do + before do + @s = StringScanner.new('Fri Dec 12 1975 14:39') + end + + it "returns a hash of names and matched substrings for named capturing groups in a regular expression of the most recent matching" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.named_captures.should == {"wday" => "Fri", "month" => "Dec", "day" => "12"} + end + + it "returns {} if there are no named capturing groups" do + @s.exist?(/(\w+) (\w+) (\d+)/) + @s.named_captures.should == {} + end + + # https://github.com/ruby/strscan/issues/132 fixed in strscan v3.0.7 + it "returns {} if there is no any matching done" do + @s.named_captures.should == {} + end + + it "returns nil for an optional named capturing group if it doesn't match" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\s+)?/) + @s.named_captures.should == {"wday" => "Fri", "month" => "Dec", "day" => nil} + end +end diff --git a/spec/ruby/library/stringscanner/peek_byte_spec.rb b/spec/ruby/library/stringscanner/peek_byte_spec.rb new file mode 100644 index 0000000000..88ef4a2b7c --- /dev/null +++ b/spec/ruby/library/stringscanner/peek_byte_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../spec_helper' +require 'strscan' + +version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + describe "StringScanner#peek_byte" do + it "returns a byte at the current position as an Integer" do + s = StringScanner.new('This is a test') + s.peek_byte.should == 84 + end + + it "returns nil at the end of the string" do + s = StringScanner.new('a') + s.getch # skip one + s.pos.should == 1 + s.peek_byte.should == nil + end + + it "is not multi-byte character sensitive" do + s = StringScanner.new("∂") # "∂".bytes => [226, 136, 130] + s.peek_byte.should == 226 + s.pos = 1 + s.peek_byte.should == 136 + s.pos = 2 + s.peek_byte.should == 130 + end + + it "doesn't change current position" do + s = StringScanner.new('This is a test') + + s.pos.should == 0 + s.peek_byte.should == 84 + s.pos.should == 0 + end + end +end diff --git a/spec/ruby/library/stringscanner/peek_spec.rb b/spec/ruby/library/stringscanner/peek_spec.rb index cbb5630ff9..5b54c6be0b 100644 --- a/spec/ruby/library/stringscanner/peek_spec.rb +++ b/spec/ruby/library/stringscanner/peek_spec.rb @@ -1,7 +1,42 @@ require_relative '../../spec_helper' -require_relative 'shared/peek' require 'strscan' describe "StringScanner#peek" do - it_behaves_like :strscan_peek, :peek + before :each do + @s = StringScanner.new('This is a test') + end + + it "returns at most the specified number of bytes from the current position" do + @s.peek(4).should == "This" + @s.pos.should == 0 + @s.pos = 5 + @s.peek(2).should == "is" + @s.peek(1000).should == "is a test" + + s = StringScanner.new("été") + s.peek(2).should == "é" + end + + it "returns an empty string when the passed argument is zero" do + @s.peek(0).should == "" + end + + it "raises a ArgumentError when the passed argument is negative" do + -> { @s.peek(-2) }.should.raise(ArgumentError) + end + + it "raises a RangeError when the passed argument is a Bignum" do + -> { @s.peek(bignum_value) }.should.raise(RangeError) + end + + it "returns an instance of String when passed a String subclass" do + cls = Class.new(String) + sub = cls.new("abc") + + s = StringScanner.new(sub) + + ch = s.peek(1) + ch.should_not.is_a?(cls) + ch.should.instance_of?(String) + end end diff --git a/spec/ruby/library/stringscanner/peep_spec.rb b/spec/ruby/library/stringscanner/peep_spec.rb deleted file mode 100644 index 887522a8ae..0000000000 --- a/spec/ruby/library/stringscanner/peep_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/peek' -require 'strscan' - -describe "StringScanner#peep" do - it_behaves_like :strscan_peek, :peep - - it "warns in verbose mode that the method is obsolete" do - s = StringScanner.new("abc") - lambda { - $VERBOSE = true - s.peep(1) - }.should complain(/peep.*obsolete.*peek/) - - lambda { - $VERBOSE = false - s.peep(1) - }.should_not complain - end -end diff --git a/spec/ruby/library/stringscanner/rest_size_spec.rb b/spec/ruby/library/stringscanner/rest_size_spec.rb index e62e3a8f8c..65d3b50e08 100644 --- a/spec/ruby/library/stringscanner/rest_size_spec.rb +++ b/spec/ruby/library/stringscanner/rest_size_spec.rb @@ -1,7 +1,30 @@ require_relative '../../spec_helper' -require_relative 'shared/rest_size' require 'strscan' describe "StringScanner#rest_size" do - it_behaves_like :strscan_rest_size, :rest_size + before :each do + @s = StringScanner.new('This is a test') + end + + it "returns the length of the rest of the string" do + @s.rest_size.should == 14 + @s.scan(/This/) + @s.rest_size.should == 10 + @s.terminate + @s.rest_size.should == 0 + end + + it "is equivalent to rest.bytesize" do + @s.scan(/This/) + @s.rest_size.should == @s.rest.bytesize + + s = StringScanner.new('été') + s.rest_size.should == 5 + s.scan(/./) + s.rest_size.should == 3 + s.scan(/./) + s.rest_size.should == 2 + s.scan(/./) + s.rest_size.should == 0 + end end diff --git a/spec/ruby/library/stringscanner/rest_spec.rb b/spec/ruby/library/stringscanner/rest_spec.rb index 67072f880d..40f073058c 100644 --- a/spec/ruby/library/stringscanner/rest_spec.rb +++ b/spec/ruby/library/stringscanner/rest_spec.rb @@ -32,14 +32,14 @@ describe "StringScanner#rest?" do end it "returns true if there is more data in the string" do - @s.rest?.should be_true + @s.rest?.should == true @s.scan(/This/) - @s.rest?.should be_true + @s.rest?.should == true end it "returns false if there is no more data in the string" do @s.terminate - @s.rest?.should be_false + @s.rest?.should == false end it "is the opposite of eos?" do diff --git a/spec/ruby/library/stringscanner/restsize_spec.rb b/spec/ruby/library/stringscanner/restsize_spec.rb deleted file mode 100644 index 87edf35ad6..0000000000 --- a/spec/ruby/library/stringscanner/restsize_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'shared/rest_size' -require 'strscan' - -describe "StringScanner#restsize" do - it_behaves_like :strscan_rest_size, :restsize - - it "warns in verbose mode that the method is obsolete" do - s = StringScanner.new("abc") - lambda { - $VERBOSE = true - s.restsize - }.should complain(/restsize.*obsolete.*rest_size/) - - lambda { - $VERBOSE = false - s.restsize - }.should_not complain - end -end diff --git a/spec/ruby/library/stringscanner/scan_byte_spec.rb b/spec/ruby/library/stringscanner/scan_byte_spec.rb new file mode 100644 index 0000000000..8fd77270e4 --- /dev/null +++ b/spec/ruby/library/stringscanner/scan_byte_spec.rb @@ -0,0 +1,98 @@ +require_relative '../../spec_helper' +require 'strscan' + +version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + describe "StringScanner#scan_byte" do + it "scans one byte and returns it as on Integer" do + s = StringScanner.new('abc') # "abc".bytes => [97, 98, 99] + s.scan_byte.should == 97 + s.scan_byte.should == 98 + s.scan_byte.should == 99 + end + + it "is not multi-byte character sensitive" do + s = StringScanner.new("あ") # "あ".bytes => [227, 129, 130] + s.scan_byte.should == 227 + s.scan_byte.should == 129 + s.scan_byte.should == 130 + end + + it "returns nil at the end of the string" do + s = StringScanner.new('a') + s.scan_byte # skip one + s.scan_byte.should == nil + s.pos.should == 1 + end + + it "changes current position" do + s = StringScanner.new('abc') + s.pos.should == 0 + s.scan_byte + s.pos.should == 1 + end + + it "sets the last match result" do + s = StringScanner.new('abc') + s.pos = 1 + s.scan_byte + + s.pre_match.should == "a" + s.matched.should == "b" + s.post_match.should == "c" + end + + describe "#[] successive call with a capture group name" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil" do + s = StringScanner.new("abc") + s.scan_byte + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError" do + s = StringScanner.new("abc") + s.scan_byte + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + + it "returns a matching character when given Integer index" do + s = StringScanner.new("This is a test") + s.scan_byte + s[0].should == "T" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("abc") + + s.exist?(/(?<a>a)/) + s.should.matched? + s[:a].should == "a" + + s.scan_byte + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("abc") + + s.exist?(/(?<a>a)/) + s.should.matched? + s[:a].should == "a" + + s.scan_byte + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + end + end +end diff --git a/spec/ruby/library/stringscanner/scan_full_spec.rb b/spec/ruby/library/stringscanner/scan_full_spec.rb index ed34d7d3f6..7633c17860 100644 --- a/spec/ruby/library/stringscanner/scan_full_spec.rb +++ b/spec/ruby/library/stringscanner/scan_full_spec.rb @@ -27,4 +27,18 @@ describe "StringScanner#scan_full" do @s.scan_full(/This/, true, true).should == "This" @s.pos.should == 4 end + + describe "#[] successive call with a capture group name" do + it "returns matched substring when matching succeeded" do + @s.scan_full(/(?<a>This)/, false, false) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.scan_full(/(?<a>2008)/, false, false) + @s.should_not.matched? + @s[:a].should == nil + end + end end diff --git a/spec/ruby/library/stringscanner/scan_integer_spec.rb b/spec/ruby/library/stringscanner/scan_integer_spec.rb new file mode 100644 index 0000000000..d83149344a --- /dev/null +++ b/spec/ruby/library/stringscanner/scan_integer_spec.rb @@ -0,0 +1,157 @@ +require_relative '../../spec_helper' +require 'strscan' + +version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + describe "StringScanner#scan_integer" do + it "returns the matched Integer literal starting from the current position" do + s = StringScanner.new("42") + s.scan_integer.should == 42 + end + + it "returns nil when no Integer literal matched starting from the current position" do + s = StringScanner.new("a42") + s.scan_integer.should == nil + end + + it "supports a sign +/-" do + StringScanner.new("+42").scan_integer.should == 42 + StringScanner.new("-42").scan_integer.should == -42 + end + + it "changes the current position" do + s = StringScanner.new("42abc") + s.scan_integer + s.pos.should == 2 + end + + # https://github.com/ruby/strscan/issues/130 + ruby_bug "", "3.4"..."4.0" do # introduced in strscan v3.1.1 + it "sets the last match result" do + s = StringScanner.new("42abc") + s.scan_integer + + s.should.matched? + s.matched.should == "42" + s.pre_match.should == "" + s.post_match.should == "abc" + s.matched_size.should == 2 + end + end + + it "raises Encoding::CompatibilityError when a scanned string not is ASCII-compatible encoding" do + string = "42".encode(Encoding::UTF_16BE) + s = StringScanner.new(string) + + -> { + s.scan_integer + }.should.raise(Encoding::CompatibilityError, /ASCII incompatible encoding: UTF-16BE|incompatible encoding regexp match/) + end + + context "given base" do + it "supports base: 10" do + s = StringScanner.new("42") + s.scan_integer(base: 10).should == 42 + end + + it "supports base: 16" do + StringScanner.new("0xff").scan_integer(base: 16).should == 0xff + StringScanner.new("-0xff").scan_integer(base: 16).should == -0xff + StringScanner.new("0xFF").scan_integer(base: 16).should == 0xff + StringScanner.new("-0xFF").scan_integer(base: 16).should == -0xff + StringScanner.new("ff").scan_integer(base: 16).should == 0xff + StringScanner.new("-ff").scan_integer(base: 16).should == -0xff + end + + it "raises ArgumentError when passed not supported base" do + -> { + StringScanner.new("42").scan_integer(base: 5) + }.should.raise(ArgumentError, "Unsupported integer base: 5, expected 10 or 16") + end + + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "does not match '0x' prefix on its own" do + StringScanner.new("0x").scan_integer(base: 16).should == nil + StringScanner.new("-0x").scan_integer(base: 16).should == nil + StringScanner.new("+0x").scan_integer(base: 16).should == nil + end + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "matches '0' in a '0x' that is followed by non-hex characters" do + StringScanner.new("0x!@#").scan_integer(base: 16).should == 0 + StringScanner.new("-0x!@#").scan_integer(base: 16).should == 0 + StringScanner.new("+0x!@#").scan_integer(base: 16).should == 0 + end + + it "matches '0' in a '0x' located in the end of a string" do + StringScanner.new("0x").scan_integer(base: 16).should == 0 + StringScanner.new("-0x").scan_integer(base: 16).should == 0 + StringScanner.new("+0x").scan_integer(base: 16).should == 0 + end + end + end + end + + describe "#[] successive call with a capture group name" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil substring when matching succeeded" do + s = StringScanner.new("42") + s.scan_integer + s.should.matched? + s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + s = StringScanner.new("42") + s.scan_integer + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + s = StringScanner.new("a42") + s.scan_integer + s.should_not.matched? + s[:a].should == nil + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "returns a matching substring when given Integer index" do + s = StringScanner.new("42") + s.scan_integer + s[0].should == "42" + end + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "does not ignore the previous matching with Regexp" do + s = StringScanner.new("42") + + s.exist?(/(?<a>42)/) + s.should.matched? + s[:a].should == "42" + + s.scan_integer + s.should.matched? + s[:a].should == "42" + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "ignores the previous matching with Regexp" do + s = StringScanner.new("42") + + s.exist?(/(?<a>42)/) + s.should.matched? + s[:a].should == "42" + + s.scan_integer + s.should.matched? + -> { s[:a] }.should.raise(IndexError) + end + end + end +end diff --git a/spec/ruby/library/stringscanner/scan_spec.rb b/spec/ruby/library/stringscanner/scan_spec.rb index 23de7f07cb..ee8a9eb103 100644 --- a/spec/ruby/library/stringscanner/scan_spec.rb +++ b/spec/ruby/library/stringscanner/scan_spec.rb @@ -15,29 +15,87 @@ describe "StringScanner#scan" do it "treats ^ as matching from the beginning of the current position" do @s.scan(/\w+/).should == "This" - @s.scan(/^\d/).should be_nil + @s.scan(/^\d/).should == nil @s.scan(/^\s/).should == " " end + it "treats ^ as matching from the beginning of the current position when it's not the first character in the regexp" do + @s.scan(/\w+/).should == "This" + @s.scan(/( is not|^ is a)/).should == " is a" + end + + it "treats \\A as matching from the beginning of the current position" do + @s.scan(/\w+/).should == "This" + @s.scan(/\A\d/).should == nil + @s.scan(/\A\s/).should == " " + end + + it "treats \\A as matching from the beginning of the current position when it's not the first character in the regexp" do + @s.scan(/\w+/).should == "This" + @s.scan(/( is not|\A is a)/).should == " is a" + end + it "returns nil if there's no match" do @s.scan(/\d/).should == nil end it "returns nil when there is no more to scan" do @s.scan(/[\w\s]+/).should == "This is a test" - @s.scan(/\w+/).should be_nil + @s.scan(/\w+/).should == nil end it "returns an empty string when the pattern matches empty" do @s.scan(/.*/).should == "This is a test" @s.scan(/.*/).should == "" - @s.scan(/./).should be_nil + @s.scan(/./).should == nil + end + + it "treats String as the pattern itself" do + @s.scan("this").should == nil + @s.scan("This").should == "This" + end + + it "raises a TypeError if pattern isn't a Regexp nor String" do + -> { @s.scan(5) }.should.raise(TypeError) + -> { @s.scan(:test) }.should.raise(TypeError) + -> { @s.scan(mock('x')) }.should.raise(TypeError) + end + + describe "#[] successive call with a capture group name" do + it "returns matched substring when matching succeeded" do + @s.scan(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.scan(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end +end + +describe "StringScanner#scan with fixed_anchor: true" do + before :each do + @s = StringScanner.new("This\nis\na\ntest", fixed_anchor: true) + end + + it "returns the matched string" do + @s.scan(/\w+/).should == "This" + @s.scan(/.../m).should == "\nis" + @s.scan(//).should == "" + @s.scan(/\s+/).should == "\n" + end + + it "treats ^ as matching from the beginning of line" do + @s.scan(/\w+\n/).should == "This\n" + @s.scan(/^\w/).should == "i" + @s.scan(/^\w/).should == nil end - it "raises a TypeError if pattern isn't a Regexp" do - lambda { @s.scan("aoeu") }.should raise_error(TypeError) - lambda { @s.scan(5) }.should raise_error(TypeError) - lambda { @s.scan(:test) }.should raise_error(TypeError) - lambda { @s.scan(mock('x')) }.should raise_error(TypeError) + it "treats \\A as matching from the beginning of string" do + @s.scan(/\A\w/).should == "T" + @s.scan(/\A\w/).should == nil end end diff --git a/spec/ruby/library/stringscanner/scan_until_spec.rb b/spec/ruby/library/stringscanner/scan_until_spec.rb index 94239db50e..df83f3916a 100644 --- a/spec/ruby/library/stringscanner/scan_until_spec.rb +++ b/spec/ruby/library/stringscanner/scan_until_spec.rb @@ -2,14 +2,20 @@ require_relative '../../spec_helper' require 'strscan' describe "StringScanner#scan_until" do - before :each do + before do @s = StringScanner.new("This is a test") end it "returns the substring up to and including the end of the match" do - @s.scan_until(/a/).should == "This is a" - @s.pre_match.should == "This is " - @s.post_match.should == " test" + @s.scan_until(/a/).should == "This is a" + end + + it "sets the last match result" do + @s.scan_until(/a/) + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" end it "returns nil if there's no match" do @@ -20,4 +26,110 @@ describe "StringScanner#scan_until" do @s.scan(/T/) @s.scan_until(/^h/).should == "h" end + + version_is StringScanner::Version, ""..."3.1.1" do # ruby_version_is ""..."3.4" + it "raises TypeError if given a String" do + -> { + @s.scan_until('T') + }.should.raise(TypeError, 'wrong argument type String (expected Regexp)') + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + it "searches a substring in the rest part of a string if given a String" do + @s.scan_until("a").should == "This is a" + end + + # https://github.com/ruby/strscan/issues/131 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.1" + it "sets the last match result if given a String" do + @s.scan_until("a") + + @s.pre_match.should == "" + @s.matched.should == "This is a" + @s.post_match.should == " test" + end + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "sets the last match result if given a String" do + @s.scan_until("a") + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" + end + end + end + + describe "#[] successive call with a capture group name" do + context "when #scan_until was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.scan_until(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.scan_until(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + context "when #scan_until was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.scan_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + @s.scan_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.scan_until("2008") + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.scan_until("This") + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.scan_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.scan_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/search_full_spec.rb b/spec/ruby/library/stringscanner/search_full_spec.rb index da9067e012..656884f46b 100644 --- a/spec/ruby/library/stringscanner/search_full_spec.rb +++ b/spec/ruby/library/stringscanner/search_full_spec.rb @@ -2,7 +2,7 @@ require_relative '../../spec_helper' require 'strscan' describe "StringScanner#search_full" do - before :each do + before do @s = StringScanner.new("This is a test") end @@ -27,4 +27,107 @@ describe "StringScanner#search_full" do @s.search_full(/This/, true, true).should == "This" @s.pos.should == 4 end + + it "sets the last match result" do + @s.search_full(/is a/, false, false) + + @s.pre_match.should == "This " + @s.matched.should == "is a" + @s.post_match.should == " test" + end + + version_is StringScanner::Version, ""..."3.1.1" do # ruby_version_is ""..."3.4" + it "raises TypeError if given a String" do + -> { + @s.search_full('T', true, true) + }.should.raise(TypeError, 'wrong argument type String (expected Regexp)') + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + it "searches a substring in the rest part of a string if given a String" do + @s.search_full("is a", false, false).should == 9 + end + + # https://github.com/ruby/strscan/issues/131 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.1" + it "sets the last match result if given a String" do + @s.search_full("is a", false, false) + + @s.pre_match.should == "" + @s.matched.should == "This is a" + @s.post_match.should == " test" + end + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "sets the last match result if given a String" do + @s.search_full("is a", false, false) + + @s.pre_match.should == "This " + @s.matched.should == "is a" + @s.post_match.should == " test" + end + end + end + + describe "#[] successive call with a capture group name" do + context "when #search_full was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.search_full(/(?<a>This)/, false, false) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.search_full(/(?<a>2008)/, false, false) + @s.should_not.matched? + @s[:a].should == nil + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + context "when #search_full was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.search_full("This", false, false) + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + @s.search_full("This", false, false) + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.search_full("2008", false, false) + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.search_full("This", false, false) + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.search_full("This", false, false) + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/shared/bol.rb b/spec/ruby/library/stringscanner/shared/bol.rb index ebcdd7938f..ec5c2051b5 100644 --- a/spec/ruby/library/stringscanner/shared/bol.rb +++ b/spec/ruby/library/stringscanner/shared/bol.rb @@ -1,25 +1,25 @@ describe :strscan_bol, shared: true do it "returns true if the scan pointer is at the beginning of the line, false otherwise" do s = StringScanner.new("This is a test") - s.send(@method).should be_true + s.send(@method).should == true s.scan(/This/) - s.send(@method).should be_false + s.send(@method).should == false s.terminate - s.send(@method).should be_false + s.send(@method).should == false s = StringScanner.new("hello\nworld") - s.bol?.should be_true + s.bol?.should == true s.scan(/\w+/) - s.bol?.should be_false + s.bol?.should == false s.scan(/\n/) - s.bol?.should be_true + s.bol?.should == true s.unscan - s.bol?.should be_false + s.bol?.should == false end it "returns true if the scan pointer is at the end of the line of an empty string." do s = StringScanner.new('') s.terminate - s.send(@method).should be_true + s.send(@method).should == true end end diff --git a/spec/ruby/library/stringscanner/shared/concat.rb b/spec/ruby/library/stringscanner/shared/concat.rb index 28788d3ff1..8138b0f8dc 100644 --- a/spec/ruby/library/stringscanner/shared/concat.rb +++ b/spec/ruby/library/stringscanner/shared/concat.rb @@ -1,30 +1,30 @@ describe :strscan_concat, shared: true do it "concatenates the given argument to self and returns self" do - s = StringScanner.new("hello ") + s = StringScanner.new(+"hello ") s.send(@method, 'world').should == s s.string.should == "hello world" - s.eos?.should be_false + s.eos?.should == false end it "raises a TypeError if the given argument can't be converted to a String" do - lambda { StringScanner.new('hello').send(@method, :world) }.should raise_error(TypeError) - lambda { StringScanner.new('hello').send(@method, mock('x')) }.should raise_error(TypeError) + -> { StringScanner.new('hello').send(@method, :world) }.should.raise(TypeError) + -> { StringScanner.new('hello').send(@method, mock('x')) }.should.raise(TypeError) end end describe :strscan_concat_fixnum, shared: true do it "raises a TypeError" do a = StringScanner.new("hello world") - lambda { a.send(@method, 333) }.should raise_error(TypeError) + -> { a.send(@method, 333) }.should.raise(TypeError) b = StringScanner.new("") - lambda { b.send(@method, (256 * 3 + 64)) }.should raise_error(TypeError) - lambda { b.send(@method, -200) }.should raise_error(TypeError) + -> { b.send(@method, (256 * 3 + 64)) }.should.raise(TypeError) + -> { b.send(@method, -200) }.should.raise(TypeError) end it "doesn't call to_int on the argument" do x = mock('x') x.should_not_receive(:to_int) - lambda { "".send(@method, x) }.should raise_error(TypeError) + -> { StringScanner.new("").send(@method, x) }.should.raise(TypeError) end end diff --git a/spec/ruby/library/stringscanner/shared/eos.rb b/spec/ruby/library/stringscanner/shared/eos.rb deleted file mode 100644 index ea04c764a2..0000000000 --- a/spec/ruby/library/stringscanner/shared/eos.rb +++ /dev/null @@ -1,17 +0,0 @@ -describe :strscan_eos, shared: true do - before :each do - @s = StringScanner.new("This is a test") - end - - it "returns true if the scan pointer is at the end of the string" do - @s.terminate - @s.send(@method).should be_true - - s = StringScanner.new('') - s.send(@method).should be_true - end - - it "returns false if the scan pointer is not at the end of the string" do - @s.send(@method).should be_false - end -end diff --git a/spec/ruby/library/stringscanner/shared/extract_range.rb b/spec/ruby/library/stringscanner/shared/extract_range.rb index 7e98540b1a..c64cc41fa7 100644 --- a/spec/ruby/library/stringscanner/shared/extract_range.rb +++ b/spec/ruby/library/stringscanner/shared/extract_range.rb @@ -5,18 +5,7 @@ describe :extract_range, shared: true do s = StringScanner.new(sub) ch = s.send(@method) - ch.should_not be_kind_of(cls) - ch.should be_an_instance_of(String) - end - - it "taints the returned String if the input was tainted" do - str = 'abc' - str.taint - - s = StringScanner.new(str) - - s.send(@method).tainted?.should be_true - s.send(@method).tainted?.should be_true - s.send(@method).tainted?.should be_true + ch.should_not.is_a?(cls) + ch.should.instance_of?(String) end end diff --git a/spec/ruby/library/stringscanner/shared/extract_range_matched.rb b/spec/ruby/library/stringscanner/shared/extract_range_matched.rb index fe695e8ac1..8a6349bec1 100644 --- a/spec/ruby/library/stringscanner/shared/extract_range_matched.rb +++ b/spec/ruby/library/stringscanner/shared/extract_range_matched.rb @@ -7,16 +7,7 @@ describe :extract_range_matched, shared: true do s.scan(/\w{1}/) ch = s.send(@method) - ch.should_not be_kind_of(cls) - ch.should be_an_instance_of(String) - end - - it "taints the returned String if the input was tainted" do - str = 'abc' - str.taint - - s = StringScanner.new(str) - s.scan(/\w{1}/) - s.send(@method).tainted?.should be_true + ch.should_not.is_a?(cls) + ch.should.instance_of?(String) end end diff --git a/spec/ruby/library/stringscanner/shared/get_byte.rb b/spec/ruby/library/stringscanner/shared/get_byte.rb deleted file mode 100644 index 763ab6f4a4..0000000000 --- a/spec/ruby/library/stringscanner/shared/get_byte.rb +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: binary -*- -describe :strscan_get_byte, shared: true do - it "scans one byte and returns it" do - s = StringScanner.new('abc5.') - s.send(@method).should == 'a' - s.send(@method).should == 'b' - s.send(@method).should == 'c' - s.send(@method).should == '5' - s.send(@method).should == '.' - end - - it "is not multi-byte character sensitive" do - s = StringScanner.new("\244\242") - s.send(@method).should == "\244" - s.send(@method).should == "\242" - end - - it "returns nil at the end of the string" do - # empty string case - s = StringScanner.new('') - s.send(@method).should == nil - s.send(@method).should == nil - - # non-empty string case - s = StringScanner.new('a') - s.send(@method) # skip one - s.send(@method).should == nil - end -end diff --git a/spec/ruby/library/stringscanner/shared/matched_size.rb b/spec/ruby/library/stringscanner/shared/matched_size.rb deleted file mode 100644 index 92174733f7..0000000000 --- a/spec/ruby/library/stringscanner/shared/matched_size.rb +++ /dev/null @@ -1,21 +0,0 @@ -describe :strscan_matched_size, shared: true do - before :each do - @s = StringScanner.new("This is a test") - end - - it "returns the size of the most recent match" do - @s.check(/This/) - @s.send(@method).should == 4 - @s.send(@method).should == 4 - @s.scan(//) - @s.send(@method).should == 0 - end - - it "returns nil if there was no recent match" do - @s.send(@method).should == nil - @s.check(/\d+/) - @s.send(@method).should == nil - @s.terminate - @s.send(@method).should == nil - end -end diff --git a/spec/ruby/library/stringscanner/shared/peek.rb b/spec/ruby/library/stringscanner/shared/peek.rb deleted file mode 100644 index 418ebb6536..0000000000 --- a/spec/ruby/library/stringscanner/shared/peek.rb +++ /dev/null @@ -1,47 +0,0 @@ -describe :strscan_peek, shared: true do - before :each do - @s = StringScanner.new('This is a test') - end - - it "returns at most the specified number of bytes from the current position" do - @s.send(@method, 4).should == "This" - @s.pos.should == 0 - @s.pos = 5 - @s.send(@method, 2).should == "is" - @s.send(@method, 1000).should == "is a test" - - s = StringScanner.new("été") - s.send(@method, 2).should == "é" - end - - it "returns an empty string when the passed argument is zero" do - @s.send(@method, 0).should == "" - end - - it "raises a ArgumentError when the passed argument is negative" do - lambda { @s.send(@method, -2) }.should raise_error(ArgumentError) - end - - it "raises a RangeError when the passed argument is a Bignum" do - lambda { @s.send(@method, bignum_value) }.should raise_error(RangeError) - end - - it "returns an instance of String when passed a String subclass" do - cls = Class.new(String) - sub = cls.new("abc") - - s = StringScanner.new(sub) - - ch = s.send(@method, 1) - ch.should_not be_kind_of(cls) - ch.should be_an_instance_of(String) - end - - it "taints the returned String if the input was tainted" do - str = 'abc' - str.taint - - s = StringScanner.new(str) - s.send(@method, 1).tainted?.should be_true - end -end diff --git a/spec/ruby/library/stringscanner/shared/pos.rb b/spec/ruby/library/stringscanner/shared/pos.rb index 80ded17b0f..91f80fdf08 100644 --- a/spec/ruby/library/stringscanner/shared/pos.rb +++ b/spec/ruby/library/stringscanner/shared/pos.rb @@ -22,6 +22,13 @@ describe :strscan_pos, shared: true do @s.terminate @s.send(@method).should == @s.string.length end + + it "is not multi-byte character sensitive" do + s = StringScanner.new("abcädeföghi") + + s.scan_until(/ö/) + s.pos.should == 10 + end end describe :strscan_pos_set, shared: true do @@ -41,12 +48,12 @@ describe :strscan_pos_set, shared: true do end it "raises a RangeError if position too far backward" do - lambda { + -> { @s.send(@method, -20) - }.should raise_error(RangeError) + }.should.raise(RangeError) end it "raises a RangeError when the passed argument is out of range" do - lambda { @s.send(@method, 20) }.should raise_error(RangeError) + -> { @s.send(@method, 20) }.should.raise(RangeError) end end diff --git a/spec/ruby/library/stringscanner/shared/rest_size.rb b/spec/ruby/library/stringscanner/shared/rest_size.rb deleted file mode 100644 index 4c4f49e45c..0000000000 --- a/spec/ruby/library/stringscanner/shared/rest_size.rb +++ /dev/null @@ -1,18 +0,0 @@ -describe :strscan_rest_size, shared: true do - before :each do - @s = StringScanner.new('This is a test') - end - - it "returns the length of the rest of the string" do - @s.send(@method).should == 14 - @s.scan(/This/) - @s.send(@method).should == 10 - @s.terminate - @s.send(@method).should == 0 - end - - it "is equivalent to rest.size" do - @s.scan(/This/) - @s.send(@method).should == @s.rest.size - end -end diff --git a/spec/ruby/library/stringscanner/shared/terminate.rb b/spec/ruby/library/stringscanner/shared/terminate.rb deleted file mode 100644 index bf41d097e2..0000000000 --- a/spec/ruby/library/stringscanner/shared/terminate.rb +++ /dev/null @@ -1,8 +0,0 @@ -describe :strscan_terminate, shared: true do - it "set the scan pointer to the end of the string and clear matching data." do - s = StringScanner.new('This is a test') - s.send(@method) - s.bol?.should be_false - s.eos?.should be_true - end -end diff --git a/spec/ruby/library/stringscanner/size_spec.rb b/spec/ruby/library/stringscanner/size_spec.rb new file mode 100644 index 0000000000..3e475489e3 --- /dev/null +++ b/spec/ruby/library/stringscanner/size_spec.rb @@ -0,0 +1,17 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#size" do + before :each do + @s = StringScanner.new("This is a test") + end + + it "returns the number of captures groups of the last match" do + @s.scan(/(.)(.)(.)/) + @s.size.should == 4 + end + + it "returns nil if there is no last match" do + @s.size.should == nil + end +end diff --git a/spec/ruby/library/stringscanner/skip_spec.rb b/spec/ruby/library/stringscanner/skip_spec.rb index 473361782c..2b955b3172 100644 --- a/spec/ruby/library/stringscanner/skip_spec.rb +++ b/spec/ruby/library/stringscanner/skip_spec.rb @@ -15,4 +15,18 @@ describe "StringScanner#skip" do @s.skip(/\s+/).should == nil @s.skip(/\d+/).should == nil end + + describe "#[] successive call with a capture group name" do + it "returns matched substring when matching succeeded" do + @s.skip(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.skip(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end end diff --git a/spec/ruby/library/stringscanner/skip_until_spec.rb b/spec/ruby/library/stringscanner/skip_until_spec.rb index 73eb91b8ad..508db285ba 100644 --- a/spec/ruby/library/stringscanner/skip_until_spec.rb +++ b/spec/ruby/library/stringscanner/skip_until_spec.rb @@ -2,17 +2,131 @@ require_relative '../../spec_helper' require 'strscan' describe "StringScanner#skip_until" do - before :each do + before do @s = StringScanner.new("This is a test") end it "returns the number of bytes advanced and advances the scan pointer until pattern is matched and consumed" do @s.skip_until(/a/).should == 9 @s.pos.should == 9 + end + + it "sets the last match result" do + @s.skip_until(/a/) + + @s.pre_match.should == "This is " @s.matched.should == "a" + @s.post_match.should == " test" end it "returns nil if no match was found" do @s.skip_until(/d+/).should == nil end + + version_is StringScanner::Version, ""..."3.1.1" do # ruby_version_is ""..."3.4" + it "raises TypeError if given a String" do + -> { + @s.skip_until('T') + }.should.raise(TypeError, 'wrong argument type String (expected Regexp)') + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + it "searches a substring in the rest part of a string if given a String" do + @s.skip_until("a").should == 9 + @s.pos.should == 9 + end + + # https://github.com/ruby/strscan/issues/131 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.1" + it "sets the last match result if given a String" do + @s.skip_until("a") + + @s.pre_match.should == "" + @s.matched.should == "This is a" + @s.post_match.should == " test" + end + end + + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "sets the last match result if given a String" do + @s.skip_until("a") + + @s.pre_match.should == "This is " + @s.matched.should == "a" + @s.post_match.should == " test" + end + end + end + + describe "#[] successive call with a capture group name" do + context "when #scan_until was called with a Regexp pattern" do + it "returns matched substring when matching succeeded" do + @s.skip_until(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + end + + it "returns nil when matching failed" do + @s.skip_until(/(?<a>2008)/) + @s.should_not.matched? + @s[:a].should == nil + end + end + + version_is StringScanner::Version, "3.1.1" do # ruby_version_is "3.4" + context "when #skip_until was called with a String pattern" do + # https://github.com/ruby/strscan/issues/139 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "returns nil when matching succeeded" do + @s.skip_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4.3" + it "raises IndexError when matching succeeded" do + @s.skip_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + + it "returns nil when matching failed" do + @s.skip_until("2008") + @s.should_not.matched? + @s[:a].should == nil + end + + it "returns a matching substring when given Integer index" do + @s.skip_until("This") + @s[0].should == "This" + end + + # https://github.com/ruby/strscan/issues/135 + version_is StringScanner::Version, "3.1.1"..."3.1.3" do # ruby_version_is "3.4.0"..."3.4.3" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.skip_until("This") + @s.should.matched? + @s[:a].should == nil + end + end + version_is StringScanner::Version, "3.1.3" do # ruby_version_is "3.4" + it "ignores the previous matching with Regexp" do + @s.exist?(/(?<a>This)/) + @s.should.matched? + @s[:a].should == "This" + + @s.skip_until("This") + @s.should.matched? + -> { @s[:a] }.should.raise(IndexError) + end + end + end + end + end end diff --git a/spec/ruby/library/stringscanner/string_spec.rb b/spec/ruby/library/stringscanner/string_spec.rb index 28e2f0ed37..6cbbff4822 100644 --- a/spec/ruby/library/stringscanner/string_spec.rb +++ b/spec/ruby/library/stringscanner/string_spec.rb @@ -3,7 +3,7 @@ require 'strscan' describe "StringScanner#string" do before :each do - @string = "This is a test" + @string = +"This is a test" @s = StringScanner.new(@string) end @@ -14,7 +14,7 @@ describe "StringScanner#string" do end it "returns the identical object passed in" do - @s.string.equal?(@string).should be_true + @s.string.equal?(@string).should == true end end diff --git a/spec/ruby/library/stringscanner/terminate_spec.rb b/spec/ruby/library/stringscanner/terminate_spec.rb index 249023f1ab..3cff5c010c 100644 --- a/spec/ruby/library/stringscanner/terminate_spec.rb +++ b/spec/ruby/library/stringscanner/terminate_spec.rb @@ -1,7 +1,11 @@ require_relative '../../spec_helper' -require_relative 'shared/terminate' require 'strscan' describe "StringScanner#terminate" do - it_behaves_like :strscan_terminate, :terminate + it "set the scan pointer to the end of the string and clear matching data." do + s = StringScanner.new('This is a test') + s.terminate + s.should_not.bol? + s.should.eos? + end end diff --git a/spec/ruby/library/stringscanner/unscan_spec.rb b/spec/ruby/library/stringscanner/unscan_spec.rb index ea5e6f4ef4..f738778273 100644 --- a/spec/ruby/library/stringscanner/unscan_spec.rb +++ b/spec/ruby/library/stringscanner/unscan_spec.rb @@ -21,8 +21,8 @@ describe "StringScanner#unscan" do @s.pos.should == pos end - it "raises a ScanError when the previous match had failed" do - lambda { @s.unscan }.should raise_error(ScanError) - lambda { @s.scan(/\d/); @s.unscan }.should raise_error(ScanError) + it "raises a StringScanner::Error when the previous match had failed" do + -> { @s.unscan }.should.raise(StringScanner::Error) + -> { @s.scan(/\d/); @s.unscan }.should.raise(StringScanner::Error) end end diff --git a/spec/ruby/library/stringscanner/values_at_spec.rb b/spec/ruby/library/stringscanner/values_at_spec.rb new file mode 100644 index 0000000000..b00cce0ffa --- /dev/null +++ b/spec/ruby/library/stringscanner/values_at_spec.rb @@ -0,0 +1,68 @@ +require_relative '../../spec_helper' +require 'strscan' + +describe "StringScanner#captures" do + before do + @s = StringScanner.new('Fri Dec 12 1975 14:39') + end + + context "when passed a list of Integers" do + it "returns an array containing each value given by one of integers" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at(0, 1, 2, 3).should == ["Fri Dec 12", "Fri", "Dec", "12"] + end + + it "returns nil value for any integer that is out of range" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at(4).should == [nil] + @s.values_at(-5).should == [nil] + end + end + + context "when passed names" do + it 'slices captures with the given names' do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at(:wday, :month, :day).should == ["Fri", "Dec", "12"] + end + + it 'slices captures with the given String names' do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at("wday", "month", "day").should == ["Fri", "Dec", "12"] + end + + it "raises IndexError when given unknown name" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + + -> { + @s.values_at("foo") + }.should.raise(IndexError, "undefined group name reference: foo") + end + end + + it 'supports mixing of names and indices' do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at(1, "wday", 2, "month", 3, "day").should == ["Fri", "Fri", "Dec", "Dec", "12", "12"] + end + + it "returns a new empty Array if no arguments given" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + @s.values_at().should == [] + end + + it "fails when passed arguments of unsupported types" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\d+)/) + + -> { + @s.values_at([]) + }.should.raise(TypeError, "no implicit conversion of Array into Integer") + end + + it "returns nil if the most recent matching fails" do + @s.exist?(/(?<wday>\w+) (?<month>\w+) (?<day>\s+)/) + @s.values_at(1, 2, 3).should == nil + end + + it "returns nil if there is no any matching done" do + @s.values_at(1, 2, 3).should == nil + end +end diff --git a/spec/ruby/library/syslog/close_spec.rb b/spec/ruby/library/syslog/close_spec.rb index b1591045e3..713ef701d2 100644 --- a/spec/ruby/library/syslog/close_spec.rb +++ b/spec/ruby/library/syslog/close_spec.rb @@ -7,37 +7,37 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "closes the log" do - Syslog.opened?.should be_false + Syslog.opened?.should == false Syslog.open - Syslog.opened?.should be_true + Syslog.opened?.should == true Syslog.close - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "raises a RuntimeError if the log's already closed" do - lambda { Syslog.close }.should raise_error(RuntimeError) + -> { Syslog.close }.should.raise(RuntimeError) end it "it does not work inside blocks" do - lambda { + -> { Syslog.open { |s| s.close } - }.should raise_error(RuntimeError) - Syslog.opened?.should == false + }.should.raise(RuntimeError) + Syslog.should_not.opened? end it "sets the identity to nil" do Syslog.open("rubyspec") Syslog.ident.should == "rubyspec" Syslog.close - Syslog.ident.should be_nil + Syslog.ident.should == nil end it "sets the options to nil" do diff --git a/spec/ruby/library/syslog/constants_spec.rb b/spec/ruby/library/syslog/constants_spec.rb index 2b9524c53d..a6ac355ddd 100644 --- a/spec/ruby/library/syslog/constants_spec.rb +++ b/spec/ruby/library/syslog/constants_spec.rb @@ -4,7 +4,7 @@ platform_is_not :windows do require 'syslog' describe "Syslog::Constants" do - platform_is_not :windows, :solaris, :aix do + platform_is_not :windows, :aix do before :all do @constants = %w(LOG_AUTHPRIV LOG_USER LOG_LOCAL2 LOG_NOTICE LOG_NDELAY LOG_SYSLOG LOG_ALERT LOG_FTP LOG_LOCAL5 LOG_ERR LOG_AUTH @@ -17,7 +17,7 @@ platform_is_not :windows do it "includes the Syslog constants" do @constants.each do |c| - Syslog::Constants.should have_constant(c) + Syslog::Constants.should.const_defined?(c, true) end end end diff --git a/spec/ruby/library/syslog/facility_spec.rb b/spec/ruby/library/syslog/facility_spec.rb index 550ca70b11..79a685c201 100644 --- a/spec/ruby/library/syslog/facility_spec.rb +++ b/spec/ruby/library/syslog/facility_spec.rb @@ -7,11 +7,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns the logging facility" do @@ -21,7 +21,7 @@ platform_is_not :windows do end it "returns nil if the log is closed" do - Syslog.opened?.should be_false + Syslog.opened?.should == false Syslog.facility.should == nil end diff --git a/spec/ruby/library/syslog/ident_spec.rb b/spec/ruby/library/syslog/ident_spec.rb index e8345ebb49..80302a42b8 100644 --- a/spec/ruby/library/syslog/ident_spec.rb +++ b/spec/ruby/library/syslog/ident_spec.rb @@ -7,11 +7,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns the logging identity" do @@ -21,7 +21,7 @@ platform_is_not :windows do end it "returns nil if the log is closed" do - Syslog.opened?.should == false + Syslog.should_not.opened? Syslog.ident.should == nil end diff --git a/spec/ruby/library/syslog/inspect_spec.rb b/spec/ruby/library/syslog/inspect_spec.rb index f45231f8e3..6407423fd3 100644 --- a/spec/ruby/library/syslog/inspect_spec.rb +++ b/spec/ruby/library/syslog/inspect_spec.rb @@ -7,11 +7,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns a string a closed log" do diff --git a/spec/ruby/library/syslog/log_spec.rb b/spec/ruby/library/syslog/log_spec.rb index f92f69ea92..1650283371 100644 --- a/spec/ruby/library/syslog/log_spec.rb +++ b/spec/ruby/library/syslog/log_spec.rb @@ -4,52 +4,52 @@ platform_is_not :windows do require 'syslog' describe "Syslog.log" do - platform_is_not :windows, :darwin, :solaris, :aix do + platform_is_not :windows, :darwin, :aix, :android do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "receives a priority as first argument" do - lambda { + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do |s| s.log(Syslog::LOG_ALERT, "Hello") s.log(Syslog::LOG_CRIT, "World") end - }.should output_to_fd("rubyspec: Hello\nrubyspec: World\n", $stderr) + }.should output_to_fd(/\Arubyspec(?::| \d+ - -) Hello\nrubyspec(?::| \d+ - -) World\n\z/, $stderr) end - it "accepts undefined priorites" do - lambda { + it "accepts undefined priorities" do + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do |s| s.log(1337, "Hello") end # use a regex since it'll output unknown facility/priority messages - }.should output_to_fd(/rubyspec: Hello/, $stderr) + }.should output_to_fd(/rubyspec(?::| \d+ - -) Hello\n\z/, $stderr) end it "fails with TypeError on nil log messages" do Syslog.open do |s| - lambda { s.log(1, nil) }.should raise_error(TypeError) + -> { s.log(1, nil) }.should.raise(TypeError) end end it "fails if the log is closed" do - lambda { + -> { Syslog.log(Syslog::LOG_ALERT, "test") - }.should raise_error(RuntimeError) + }.should.raise(RuntimeError) end it "accepts printf parameters" do - lambda { + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do |s| s.log(Syslog::LOG_ALERT, "%s x %d", "chunky bacon", 2) end - }.should output_to_fd("rubyspec: chunky bacon x 2\n", $stderr) + }.should output_to_fd(/rubyspec(?::| \d+ - -) chunky bacon x 2\n\z/, $stderr) end end end diff --git a/spec/ruby/library/syslog/mask_spec.rb b/spec/ruby/library/syslog/mask_spec.rb index 8caa5e69b8..23cca6fa8d 100644 --- a/spec/ruby/library/syslog/mask_spec.rb +++ b/spec/ruby/library/syslog/mask_spec.rb @@ -7,11 +7,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false # make sure we return the mask to the default value Syslog.open { |s| s.mask = 255 } end @@ -32,7 +32,7 @@ platform_is_not :windows do end it "returns nil if the log is closed" do - Syslog.opened?.should == false + Syslog.should_not.opened? Syslog.mask.should == nil end @@ -74,11 +74,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false # make sure we return the mask to the default value Syslog.open { |s| s.mask = 255 } end @@ -91,7 +91,7 @@ platform_is_not :windows do end it "raises an error if the log is closed" do - lambda { Syslog.mask = 1337 }.should raise_error(RuntimeError) + -> { Syslog.mask = 1337 }.should.raise(RuntimeError) end it "only accepts numbers" do @@ -103,8 +103,8 @@ platform_is_not :windows do Syslog.mask = 3.1416 Syslog.mask.should == 3 - lambda { Syslog.mask = "oh hai" }.should raise_error(TypeError) - lambda { Syslog.mask = "43" }.should raise_error(TypeError) + -> { Syslog.mask = "oh hai" }.should.raise(TypeError) + -> { Syslog.mask = "43" }.should.raise(TypeError) end end diff --git a/spec/ruby/library/syslog/open_spec.rb b/spec/ruby/library/syslog/open_spec.rb index 641d0979cd..73e3780d78 100644 --- a/spec/ruby/library/syslog/open_spec.rb +++ b/spec/ruby/library/syslog/open_spec.rb @@ -8,11 +8,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns the module" do @@ -69,18 +69,18 @@ platform_is_not :windows do it "closes the log if after it receives a block" do Syslog.open{ } - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "raises an error if the log is opened" do Syslog.open - lambda { + -> { Syslog.open - }.should raise_error(RuntimeError, /syslog already open/) - lambda { + }.should.raise(RuntimeError, /syslog already open/) + -> { Syslog.close Syslog.open - }.should_not raise_error + }.should_not.raise Syslog.close end end diff --git a/spec/ruby/library/syslog/opened_spec.rb b/spec/ruby/library/syslog/opened_spec.rb index 94432e65a4..ad4311d15a 100644 --- a/spec/ruby/library/syslog/opened_spec.rb +++ b/spec/ruby/library/syslog/opened_spec.rb @@ -7,32 +7,32 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns true if the log is opened" do Syslog.open - Syslog.opened?.should be_true + Syslog.opened?.should == true Syslog.close end it "returns false otherwise" do - Syslog.opened?.should be_false + Syslog.opened?.should == false Syslog.open Syslog.close - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "works inside a block" do Syslog.open do |s| - s.opened?.should be_true - Syslog.opened?.should be_true + s.opened?.should == true + Syslog.opened?.should == true end - Syslog.opened?.should be_false + Syslog.opened?.should == false end end end diff --git a/spec/ruby/library/syslog/options_spec.rb b/spec/ruby/library/syslog/options_spec.rb index 83ba43503e..2035272f70 100644 --- a/spec/ruby/library/syslog/options_spec.rb +++ b/spec/ruby/library/syslog/options_spec.rb @@ -7,11 +7,11 @@ platform_is_not :windows do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns the logging options" do @@ -21,7 +21,7 @@ platform_is_not :windows do end it "returns nil when the log is closed" do - Syslog.opened?.should be_false + Syslog.opened?.should == false Syslog.options.should == nil end diff --git a/spec/ruby/library/syslog/shared/log.rb b/spec/ruby/library/syslog/shared/log.rb index 6d0d3a3c23..98ce4f54b2 100644 --- a/spec/ruby/library/syslog/shared/log.rb +++ b/spec/ruby/library/syslog/shared/log.rb @@ -1,40 +1,39 @@ describe :syslog_log, shared: true do - platform_is_not :windows, :darwin, :solaris, :aix do + platform_is_not :windows, :darwin, :aix, :android do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "logs a message" do - lambda { + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do Syslog.send(@method, "Hello") end - }.should output_to_fd("rubyspec: Hello\n", $stderr) + }.should output_to_fd(/\Arubyspec(?::| \d+ - -) Hello\n\z/, $stderr) end it "accepts sprintf arguments" do - lambda { + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do Syslog.send(@method, "Hello %s", "world") Syslog.send(@method, "%d dogs", 2) end - }.should output_to_fd("rubyspec: Hello world\nrubyspec: 2 dogs\n", $stderr) + }.should output_to_fd(/\Arubyspec(?::| \d+ - -) Hello world\nrubyspec(?::| \d+ - -) 2 dogs\n\z/, $stderr) end it "works as an alias for Syslog.log" do level = Syslog.const_get "LOG_#{@method.to_s.upcase}" - response = "rubyspec: Hello\n" - lambda { + -> { Syslog.open("rubyspec", Syslog::LOG_PERROR) do Syslog.send(@method, "Hello") Syslog.log(level, "Hello") end # make sure the same thing is written to $stderr. - }.should output_to_fd(response * 2, $stderr) + }.should output_to_fd(/\A(?:rubyspec(?::| \d+ - -) Hello\n){2}\z/, $stderr) end end end diff --git a/spec/ruby/library/syslog/shared/reopen.rb b/spec/ruby/library/syslog/shared/reopen.rb index fd30ab824a..f04408e807 100644 --- a/spec/ruby/library/syslog/shared/reopen.rb +++ b/spec/ruby/library/syslog/shared/reopen.rb @@ -1,22 +1,22 @@ describe :syslog_reopen, shared: true do platform_is_not :windows do before :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end after :each do - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "reopens the log" do Syslog.open - lambda { Syslog.send(@method)}.should_not raise_error - Syslog.opened?.should be_true + -> { Syslog.send(@method)}.should_not.raise + Syslog.opened?.should == true Syslog.close end it "fails with RuntimeError if the log is closed" do - lambda { Syslog.send(@method)}.should raise_error(RuntimeError) + -> { Syslog.send(@method)}.should.raise(RuntimeError) end it "receives the same parameters as Syslog.open" do @@ -26,9 +26,9 @@ describe :syslog_reopen, shared: true do s.ident.should == "rubyspec" s.options.should == 3 s.facility.should == Syslog::LOG_USER - s.opened?.should be_true + s.opened?.should == true end - Syslog.opened?.should be_false + Syslog.opened?.should == false end it "returns the module" do diff --git a/spec/ruby/library/tempfile/_close_spec.rb b/spec/ruby/library/tempfile/_close_spec.rb index c08f425b6f..344b08dc17 100644 --- a/spec/ruby/library/tempfile/_close_spec.rb +++ b/spec/ruby/library/tempfile/_close_spec.rb @@ -11,11 +11,11 @@ describe "Tempfile#_close" do end it "is protected" do - Tempfile.should have_protected_instance_method(:_close) + Tempfile.protected_instance_methods(false).should.include?(:_close) end it "closes self" do @tempfile.send(:_close) - @tempfile.closed?.should be_true + @tempfile.closed?.should == true end end diff --git a/spec/ruby/library/tempfile/callback_spec.rb b/spec/ruby/library/tempfile/callback_spec.rb deleted file mode 100644 index c0b1518326..0000000000 --- a/spec/ruby/library/tempfile/callback_spec.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative '../../spec_helper' -require 'tempfile' - -describe "Tempfile.callback" do - it "needs to be reviewed for spec completeness" -end diff --git a/spec/ruby/library/tempfile/close_spec.rb b/spec/ruby/library/tempfile/close_spec.rb index 6cd55beecf..7e95ae1d7e 100644 --- a/spec/ruby/library/tempfile/close_spec.rb +++ b/spec/ruby/library/tempfile/close_spec.rb @@ -12,13 +12,13 @@ describe "Tempfile#close when passed no argument or [false]" do it "closes self" do @tempfile.close - @tempfile.closed?.should be_true + @tempfile.closed?.should == true end it "does not unlink self" do path = @tempfile.path @tempfile.close - File.exist?(path).should be_true + File.should.exist?(path) end end @@ -29,13 +29,13 @@ describe "Tempfile#close when passed [true]" do it "closes self" do @tempfile.close(true) - @tempfile.closed?.should be_true + @tempfile.closed?.should == true end it "unlinks self" do path = @tempfile.path @tempfile.close(true) - File.exist?(path).should be_false + File.should_not.exist?(path) end end @@ -46,12 +46,12 @@ describe "Tempfile#close!" do it "closes self" do @tempfile.close! - @tempfile.closed?.should be_true + @tempfile.closed?.should == true end it "unlinks self" do path = @tempfile.path @tempfile.close! - File.exist?(path).should be_false + File.should_not.exist?(path) end end diff --git a/spec/ruby/library/tempfile/create_spec.rb b/spec/ruby/library/tempfile/create_spec.rb new file mode 100644 index 0000000000..be6d21e218 --- /dev/null +++ b/spec/ruby/library/tempfile/create_spec.rb @@ -0,0 +1,176 @@ +require_relative '../../spec_helper' +require 'tempfile' + +describe "Tempfile.create" do + after :each do + if @tempfile + @tempfile.close + File.unlink(@tempfile.path) if File.file?(@tempfile.path) + end + end + + it "returns a new, open regular File instance placed in tmpdir" do + @tempfile = Tempfile.create + # Unlike Tempfile.open this returns a true File, + # but `.should.instance_of?(File)` would be true either way. + @tempfile.instance_of?(File).should == true + + @tempfile.should_not.closed? + File.file?(@tempfile.path).should == true + + @tempfile.path.should.start_with?(Dir.tmpdir) + @tempfile.path.should_not == "#{Dir.tmpdir}/" + end + + it "returns file in w+ mode" do + @tempfile = Tempfile.create + @tempfile << "Test!\nMore test!" + @tempfile.rewind + @tempfile.read.should == "Test!\nMore test!" + + # Not "a+" mode, which would write at the end of the file. + @tempfile.rewind + @tempfile.print "Trust" + @tempfile.rewind + @tempfile.read.should == "Trust\nMore test!" + end + + platform_is_not :windows do + it "returns a private, readable and writable file" do + @tempfile = Tempfile.create + stat = @tempfile.stat + stat.should.readable? + stat.should.writable? + stat.should_not.executable? + stat.should_not.world_readable? + stat.should_not.world_writable? + end + end + + platform_is :windows do + it "returns a public, readable and writable file" do + @tempfile = Tempfile.create + stat = @tempfile.stat + stat.should.readable? + stat.should.writable? + stat.should_not.executable? + stat.should.world_readable? + stat.should.world_writable? + end + end + + context "when called with a block" do + it "returns the value of the block" do + value = Tempfile.create do |tempfile| + tempfile << "Test!" + "return" + end + value.should == "return" + end + + it "closes and unlinks file after block execution" do + Tempfile.create do |tempfile| + @tempfile = tempfile + @tempfile.should_not.closed? + File.exist?(@tempfile.path).should == true + end + + @tempfile.should.closed? + File.exist?(@tempfile.path).should == false + end + end + + context "when called with a single positional argument" do + it "uses a String as a prefix for the filename" do + @tempfile = Tempfile.create("create_spec") + @tempfile.path.should.start_with?("#{Dir.tmpdir}/create_spec") + @tempfile.path.should_not == "#{Dir.tmpdir}/create_spec" + end + + it "uses an array of one String as a prefix for the filename" do + @tempfile = Tempfile.create(["create_spec"]) + @tempfile.path.should.start_with?("#{Dir.tmpdir}/create_spec") + @tempfile.path.should_not == "#{Dir.tmpdir}/create_spec" + end + + it "uses an array of two Strings as a prefix and suffix for the filename" do + @tempfile = Tempfile.create(["create_spec", ".temp"]) + @tempfile.path.should.start_with?("#{Dir.tmpdir}/create_spec") + @tempfile.path.should.end_with?(".temp") + end + + it "ignores excessive array elements after the first two" do + @tempfile = Tempfile.create(["create_spec", ".temp", :".txt"]) + @tempfile.path.should.start_with?("#{Dir.tmpdir}/create_spec") + @tempfile.path.should.end_with?(".temp") + end + + it "raises ArgumentError if passed something else than a String or an array of Strings" do + -> { Tempfile.create(:create_spec) }.should.raise(ArgumentError, "unexpected prefix: :create_spec") + -> { Tempfile.create([:create_spec]) }.should.raise(ArgumentError, "unexpected prefix: :create_spec") + -> { Tempfile.create(["create_spec", :temp]) }.should.raise(ArgumentError, "unexpected suffix: :temp") + end + end + + context "when called with a second positional argument" do + it "uses it as a directory for the tempfile" do + @tempfile = Tempfile.create("create_spec", "./") + @tempfile.path.should.start_with?("./create_spec") + end + + it "raises TypeError if argument can not be converted to a String" do + -> { Tempfile.create("create_spec", :temp) }.should.raise(TypeError, "no implicit conversion of Symbol into String") + end + end + + context "when called with a mode option" do + it "ORs it with the default mode, forcing it to be readable and writable" do + @tempfile = Tempfile.create(mode: File::RDONLY) + @tempfile.puts "test" + @tempfile.rewind + @tempfile.read.should == "test\n" + end + + it "raises NoMethodError if passed a String mode" do + -> { Tempfile.create(mode: "wb") }.should.raise(NoMethodError, /undefined method ['`]|' for .+String/) + end + end + + ruby_version_is "3.4" do + context "when called with anonymous: true" do + it "returns an already unlinked File without a proper path" do + @tempfile = Tempfile.create(anonymous: true) + @tempfile.should_not.closed? + @tempfile.path.should == "#{Dir.tmpdir}/" + File.file?(@tempfile.path).should == false + end + + it "unlinks file before calling the block" do + Tempfile.create(anonymous: true) do |tempfile| + @tempfile = tempfile + @tempfile.should_not.closed? + @tempfile.path.should == "#{Dir.tmpdir}/" + File.file?(@tempfile.path).should == false + end + @tempfile.should.closed? + end + end + + context "when called with anonymous: false" do + it "returns a usual File with a path" do + @tempfile = Tempfile.create(anonymous: false) + @tempfile.should_not.closed? + @tempfile.path.should.start_with?(Dir.tmpdir) + File.file?(@tempfile.path).should == true + end + end + end + + context "when called with other options" do + it "passes them along to File.open" do + @tempfile = Tempfile.create(encoding: "IBM037:IBM037", binmode: true) + @tempfile.external_encoding.should == Encoding.find("IBM037") + @tempfile.binmode?.should == true + end + end +end diff --git a/spec/ruby/library/tempfile/initialize_spec.rb b/spec/ruby/library/tempfile/initialize_spec.rb index a3614971a1..0e882a3f0c 100644 --- a/spec/ruby/library/tempfile/initialize_spec.rb +++ b/spec/ruby/library/tempfile/initialize_spec.rb @@ -12,7 +12,7 @@ describe "Tempfile#initialize" do it "opens a new tempfile with the passed name in the passed directory" do @tempfile.send(:initialize, "basename", tmp("")) - File.exist?(@tempfile.path).should be_true + File.should.exist?(@tempfile.path) tmpdir = tmp("") path = @tempfile.path @@ -24,11 +24,11 @@ describe "Tempfile#initialize" do end path[0, tmpdir.length].should == tmpdir - path.should include("basename") + path.should.include?("basename") end platform_is_not :windows do - it "sets the permisssions on the tempfile to 0600" do + it "sets the permissions on the tempfile to 0600" do @tempfile.send(:initialize, "basename", tmp("")) File.stat(@tempfile.path).mode.should == 0100600 end @@ -38,4 +38,9 @@ describe "Tempfile#initialize" do @tempfile.send(:initialize, ['shiftjis', 'yml'], encoding: 'SHIFT_JIS') @tempfile.external_encoding.should == Encoding::Shift_JIS end + + it "does not try to modify the arguments" do + @tempfile.send(:initialize, ['frozen'.freeze, 'txt'.freeze], encoding: Encoding::IBM437) + @tempfile.external_encoding.should == Encoding::IBM437 + end end diff --git a/spec/ruby/library/tempfile/open_spec.rb b/spec/ruby/library/tempfile/open_spec.rb index 062d1a3fc2..0993a2c5ee 100644 --- a/spec/ruby/library/tempfile/open_spec.rb +++ b/spec/ruby/library/tempfile/open_spec.rb @@ -14,7 +14,7 @@ describe "Tempfile#open" do it "reopens self" do @tempfile.close @tempfile.open - @tempfile.closed?.should be_false + @tempfile.closed?.should == false end it "reopens self in read and write mode and does not truncate" do @@ -33,14 +33,30 @@ describe "Tempfile.open" do it "returns a new, open Tempfile instance" do @tempfile = Tempfile.open("specs") - # Delegation messes up .should be_an_instance_of(Tempfile) - @tempfile.instance_of?(Tempfile).should be_true + # Delegation messes up .should.instance_of?(Tempfile) + @tempfile.instance_of?(Tempfile).should == true end it "is passed an array [base, suffix] as first argument" do Tempfile.open(["specs", ".tt"]) { |tempfile| @tempfile = tempfile } @tempfile.path.should =~ /specs.*\.tt$/ end + + it "passes the third argument (options) to open" do + Tempfile.open("specs", Dir.tmpdir, encoding: "IBM037:IBM037", binmode: true) do |tempfile| + @tempfile = tempfile + tempfile.external_encoding.should == Encoding.find("IBM037") + tempfile.binmode?.should == true + end + end + + it "uses a blank string for basename when passed no arguments" do + Tempfile.open() do |tempfile| + @tempfile = tempfile + tempfile.closed?.should == false + end + @tempfile.should_not == nil + end end describe "Tempfile.open when passed a block" do @@ -58,9 +74,9 @@ describe "Tempfile.open when passed a block" do @tempfile = tempfile ScratchPad.record :yielded - # Delegation messes up .should be_an_instance_of(Tempfile) - tempfile.instance_of?(Tempfile).should be_true - tempfile.closed?.should be_false + # Delegation messes up .should.instance_of?(Tempfile) + tempfile.instance_of?(Tempfile).should == true + tempfile.closed?.should == false end ScratchPad.recorded.should == :yielded @@ -76,6 +92,6 @@ describe "Tempfile.open when passed a block" do it "closes the yielded Tempfile after the block" do Tempfile.open("specs") { |tempfile| @tempfile = tempfile } - @tempfile.closed?.should be_true + @tempfile.closed?.should == true end end diff --git a/spec/ruby/library/tempfile/path_spec.rb b/spec/ruby/library/tempfile/path_spec.rb index 07f75b3e10..be56bd87c8 100644 --- a/spec/ruby/library/tempfile/path_spec.rb +++ b/spec/ruby/library/tempfile/path_spec.rb @@ -21,6 +21,6 @@ describe "Tempfile#path" do end path[0, tmpdir.length].should == tmpdir - path.should include("specs") + path.should.include?("specs") end end diff --git a/spec/ruby/library/tempfile/shared/length.rb b/spec/ruby/library/tempfile/shared/length.rb index 4d18d1f385..1a89ff7b4d 100644 --- a/spec/ruby/library/tempfile/shared/length.rb +++ b/spec/ruby/library/tempfile/shared/length.rb @@ -8,14 +8,14 @@ describe :tempfile_length, shared: true do end it "returns the size of self" do - @tempfile.send(@method).should eql(0) + @tempfile.send(@method).should.eql?(0) @tempfile.print("Test!") - @tempfile.send(@method).should eql(5) + @tempfile.send(@method).should.eql?(5) end it "returns the size of self even if self is closed" do @tempfile.print("Test!") @tempfile.close - @tempfile.send(@method).should eql(5) + @tempfile.send(@method).should.eql?(5) end end diff --git a/spec/ruby/library/tempfile/shared/unlink.rb b/spec/ruby/library/tempfile/shared/unlink.rb index 2b575fd391..e821228d70 100644 --- a/spec/ruby/library/tempfile/shared/unlink.rb +++ b/spec/ruby/library/tempfile/shared/unlink.rb @@ -7,6 +7,6 @@ describe :tempfile_unlink, shared: true do @tempfile.close path = @tempfile.path @tempfile.send(@method) - File.exist?(path).should be_false + File.should_not.exist?(path) end end diff --git a/spec/ruby/library/thread/exclusive_spec.rb b/spec/ruby/library/thread/exclusive_spec.rb deleted file mode 100644 index 2be2346761..0000000000 --- a/spec/ruby/library/thread/exclusive_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../spec_helper' -require 'thread' - -describe "Thread.exclusive" do - before :each do - ScratchPad.clear - end - - it "returns the result of yielding" do - Thread.exclusive { :result }.should == :result - end -end diff --git a/spec/ruby/library/thread/queue/append_spec.rb b/spec/ruby/library/thread/queue/append_spec.rb deleted file mode 100644 index 09b9fc0cfa..0000000000 --- a/spec/ruby/library/thread/queue/append_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' - -describe "Thread::Queue#<<" do - it_behaves_like :queue_enq, :<<, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/clear_spec.rb b/spec/ruby/library/thread/queue/clear_spec.rb deleted file mode 100644 index f4ec45add6..0000000000 --- a/spec/ruby/library/thread/queue/clear_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/clear' - -describe "Thread::Queue#clear" do - it_behaves_like :queue_clear, :clear, -> { Queue.new } - - # TODO: test for atomicity of Queue#clear -end diff --git a/spec/ruby/library/thread/queue/close_spec.rb b/spec/ruby/library/thread/queue/close_spec.rb deleted file mode 100644 index 32bc0a32d7..0000000000 --- a/spec/ruby/library/thread/queue/close_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/close' - -describe "Queue#close" do - it_behaves_like :queue_close, :close, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/closed_spec.rb b/spec/ruby/library/thread/queue/closed_spec.rb deleted file mode 100644 index df3596b14b..0000000000 --- a/spec/ruby/library/thread/queue/closed_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/closed' - -describe "Queue#closed?" do - it_behaves_like :queue_closed?, :closed?, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/deq_spec.rb b/spec/ruby/library/thread/queue/deq_spec.rb deleted file mode 100644 index 176dc3620e..0000000000 --- a/spec/ruby/library/thread/queue/deq_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::Queue#deq" do - it_behaves_like :queue_deq, :deq, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/empty_spec.rb b/spec/ruby/library/thread/queue/empty_spec.rb deleted file mode 100644 index 6854d31155..0000000000 --- a/spec/ruby/library/thread/queue/empty_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/empty' - -describe "Thread::Queue#empty?" do - it_behaves_like :queue_empty?, :empty?, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/enq_spec.rb b/spec/ruby/library/thread/queue/enq_spec.rb deleted file mode 100644 index 01d3a48738..0000000000 --- a/spec/ruby/library/thread/queue/enq_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' - -describe "Thread::Queue#enq" do - it_behaves_like :queue_enq, :enq, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/length_spec.rb b/spec/ruby/library/thread/queue/length_spec.rb deleted file mode 100644 index 7b0a3ccccd..0000000000 --- a/spec/ruby/library/thread/queue/length_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/length' - -describe "Thread::Queue#length" do - it_behaves_like :queue_length, :length, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/num_waiting_spec.rb b/spec/ruby/library/thread/queue/num_waiting_spec.rb deleted file mode 100644 index dcb6d6fb72..0000000000 --- a/spec/ruby/library/thread/queue/num_waiting_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/num_waiting' - -describe "Thread::Queue#num_waiting" do - it_behaves_like :queue_num_waiting, :num_waiting, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/pop_spec.rb b/spec/ruby/library/thread/queue/pop_spec.rb deleted file mode 100644 index ab4f44d6d4..0000000000 --- a/spec/ruby/library/thread/queue/pop_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::Queue#pop" do - it_behaves_like :queue_deq, :pop, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/push_spec.rb b/spec/ruby/library/thread/queue/push_spec.rb deleted file mode 100644 index 670a2095e3..0000000000 --- a/spec/ruby/library/thread/queue/push_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' - -describe "Thread::Queue#push" do - it_behaves_like :queue_enq, :push, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/shift_spec.rb b/spec/ruby/library/thread/queue/shift_spec.rb deleted file mode 100644 index fc3f6e9b0c..0000000000 --- a/spec/ruby/library/thread/queue/shift_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::Queue#shift" do - it_behaves_like :queue_deq, :shift, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue/size_spec.rb b/spec/ruby/library/thread/queue/size_spec.rb deleted file mode 100644 index 00c3d19f32..0000000000 --- a/spec/ruby/library/thread/queue/size_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/length' - -describe "Thread::Queue#size" do - it_behaves_like :queue_length, :size, -> { Queue.new } -end diff --git a/spec/ruby/library/thread/queue_spec.rb b/spec/ruby/library/thread/queue_spec.rb new file mode 100644 index 0000000000..b6c4fef08f --- /dev/null +++ b/spec/ruby/library/thread/queue_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' + +describe "Thread::Queue" do + it "is the same class as ::Queue" do + Thread.should.const_defined?(:Queue, false) + Thread::Queue.should.equal? ::Queue + end +end diff --git a/spec/ruby/library/thread/shared/queue/clear.rb b/spec/ruby/library/thread/shared/queue/clear.rb deleted file mode 100644 index 59ea37d615..0000000000 --- a/spec/ruby/library/thread/shared/queue/clear.rb +++ /dev/null @@ -1,10 +0,0 @@ -describe :queue_clear, shared: true do - it "removes all objects from the queue" do - queue = @object.call - queue << Object.new - queue << 1 - queue.empty?.should be_false - queue.clear - queue.empty?.should be_true - end -end diff --git a/spec/ruby/library/thread/shared/queue/close.rb b/spec/ruby/library/thread/shared/queue/close.rb deleted file mode 100644 index 4457f3ae8b..0000000000 --- a/spec/ruby/library/thread/shared/queue/close.rb +++ /dev/null @@ -1,26 +0,0 @@ -describe :queue_close, shared: true do - it "closes the queue and returns nil for further #pop" do - q = @object.call - q << 1 - q.close - q.pop.should == 1 - q.pop.should == nil - q.pop.should == nil - end - - it "prevents further #push" do - q = @object.call - q.close - lambda { - q << 1 - }.should raise_error(ClosedQueueError) - end - - it "may be called multiple times" do - q = @object.call - q.close - q.closed?.should be_true - q.close # no effect - q.closed?.should be_true - end -end diff --git a/spec/ruby/library/thread/shared/queue/closed.rb b/spec/ruby/library/thread/shared/queue/closed.rb deleted file mode 100644 index b3cea0c524..0000000000 --- a/spec/ruby/library/thread/shared/queue/closed.rb +++ /dev/null @@ -1,12 +0,0 @@ -describe :queue_closed?, shared: true do - it "returns false initially" do - queue = @object.call - queue.closed?.should be_false - end - - it "returns true when the queue is closed" do - queue = @object.call - queue.close - queue.closed?.should be_true - end -end diff --git a/spec/ruby/library/thread/shared/queue/deque.rb b/spec/ruby/library/thread/shared/queue/deque.rb deleted file mode 100644 index 1b06dffa2c..0000000000 --- a/spec/ruby/library/thread/shared/queue/deque.rb +++ /dev/null @@ -1,37 +0,0 @@ -describe :queue_deq, shared: true do - it "removes an item from the Queue" do - q = @object.call - q << Object.new - q.size.should == 1 - q.send(@method) - q.size.should == 0 - end - - it "returns items in the order they were added" do - q = @object.call - q << 1 - q << 2 - q.send(@method).should == 1 - q.send(@method).should == 2 - end - - it "blocks the thread until there are items in the queue" do - q = @object.call - v = 0 - - th = Thread.new do - q.send(@method) - v = 1 - end - - v.should == 0 - q << Object.new - th.join - v.should == 1 - end - - it "raises a ThreadError if Queue is empty" do - q = @object.call - lambda { q.send(@method,true) }.should raise_error(ThreadError) - end -end diff --git a/spec/ruby/library/thread/shared/queue/empty.rb b/spec/ruby/library/thread/shared/queue/empty.rb deleted file mode 100644 index 4acd831d48..0000000000 --- a/spec/ruby/library/thread/shared/queue/empty.rb +++ /dev/null @@ -1,12 +0,0 @@ -describe :queue_empty?, shared: true do - it "returns true on an empty Queue" do - queue = @object.call - queue.empty?.should be_true - end - - it "returns false when Queue is not empty" do - queue = @object.call - queue << Object.new - queue.empty?.should be_false - end -end diff --git a/spec/ruby/library/thread/shared/queue/enque.rb b/spec/ruby/library/thread/shared/queue/enque.rb deleted file mode 100644 index 36b98d3a07..0000000000 --- a/spec/ruby/library/thread/shared/queue/enque.rb +++ /dev/null @@ -1,10 +0,0 @@ -describe :queue_enq, shared: true do - it "adds an element to the Queue" do - q = @object.call - q.size.should == 0 - q.send(@method, Object.new) - q.size.should == 1 - q.send(@method, Object.new) - q.size.should == 2 - end -end diff --git a/spec/ruby/library/thread/shared/queue/length.rb b/spec/ruby/library/thread/shared/queue/length.rb deleted file mode 100644 index a0143a4e19..0000000000 --- a/spec/ruby/library/thread/shared/queue/length.rb +++ /dev/null @@ -1,9 +0,0 @@ -describe :queue_length, shared: true do - it "returns the number of elements" do - q = @object.call - q.send(@method).should == 0 - q << Object.new - q << Object.new - q.send(@method).should == 2 - end -end diff --git a/spec/ruby/library/thread/shared/queue/num_waiting.rb b/spec/ruby/library/thread/shared/queue/num_waiting.rb deleted file mode 100644 index b054951e45..0000000000 --- a/spec/ruby/library/thread/shared/queue/num_waiting.rb +++ /dev/null @@ -1,16 +0,0 @@ -describe :queue_num_waiting, shared: true do - it "reports the number of threads waiting on the queue" do - q = @object.call - threads = [] - - 5.times do |i| - q.num_waiting.should == i - t = Thread.new { q.deq } - Thread.pass until q.num_waiting == i+1 - threads << t - end - - threads.each { q.enq Object.new } - threads.each {|t| t.join } - end -end diff --git a/spec/ruby/library/thread/sizedqueue/append_spec.rb b/spec/ruby/library/thread/sizedqueue/append_spec.rb deleted file mode 100644 index daf65178de..0000000000 --- a/spec/ruby/library/thread/sizedqueue/append_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' -require_relative 'shared/enque' - -describe "Thread::SizedQueue#<<" do - it_behaves_like :queue_enq, :<<, -> { SizedQueue.new(10) } -end - -describe "Thread::SizedQueue#<<" do - it_behaves_like :sizedqueue_enq, :<< -end diff --git a/spec/ruby/library/thread/sizedqueue/clear_spec.rb b/spec/ruby/library/thread/sizedqueue/clear_spec.rb deleted file mode 100644 index 86e16f275e..0000000000 --- a/spec/ruby/library/thread/sizedqueue/clear_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/clear' - -describe "Thread::SizedQueue#clear" do - it_behaves_like :queue_clear, :clear, -> { SizedQueue.new(10) } - - # TODO: test for atomicity of Queue#clear -end diff --git a/spec/ruby/library/thread/sizedqueue/close_spec.rb b/spec/ruby/library/thread/sizedqueue/close_spec.rb deleted file mode 100644 index 3222772f61..0000000000 --- a/spec/ruby/library/thread/sizedqueue/close_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/close' - -describe "SizedQueue#close" do - it_behaves_like :queue_close, :close, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/closed_spec.rb b/spec/ruby/library/thread/sizedqueue/closed_spec.rb deleted file mode 100644 index 9e41b89640..0000000000 --- a/spec/ruby/library/thread/sizedqueue/closed_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/closed' - -describe "SizedQueue#closed?" do - it_behaves_like :queue_closed?, :closed?, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/deq_spec.rb b/spec/ruby/library/thread/sizedqueue/deq_spec.rb deleted file mode 100644 index 0ed42cba91..0000000000 --- a/spec/ruby/library/thread/sizedqueue/deq_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::SizedQueue#deq" do - it_behaves_like :queue_deq, :deq, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/empty_spec.rb b/spec/ruby/library/thread/sizedqueue/empty_spec.rb deleted file mode 100644 index d44ea405d5..0000000000 --- a/spec/ruby/library/thread/sizedqueue/empty_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/empty' - -describe "Thread::SizedQueue#empty?" do - it_behaves_like :queue_empty?, :empty?, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/enq_spec.rb b/spec/ruby/library/thread/sizedqueue/enq_spec.rb deleted file mode 100644 index b81fd2b225..0000000000 --- a/spec/ruby/library/thread/sizedqueue/enq_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' -require_relative 'shared/enque' - -describe "Thread::SizedQueue#enq" do - it_behaves_like :queue_enq, :enq, -> { SizedQueue.new(10) } -end - -describe "Thread::SizedQueue#enq" do - it_behaves_like :sizedqueue_enq, :enq -end diff --git a/spec/ruby/library/thread/sizedqueue/length_spec.rb b/spec/ruby/library/thread/sizedqueue/length_spec.rb deleted file mode 100644 index e15db85f82..0000000000 --- a/spec/ruby/library/thread/sizedqueue/length_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/length' - -describe "Thread::SizedQueue#length" do - it_behaves_like :queue_length, :length, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/max_spec.rb b/spec/ruby/library/thread/sizedqueue/max_spec.rb deleted file mode 100644 index 75b1957e86..0000000000 --- a/spec/ruby/library/thread/sizedqueue/max_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' - -describe "Thread::SizedQueue#max" do - before :each do - @sized_queue = SizedQueue.new(5) - end - - it "returns the size of the queue" do - @sized_queue.max.should == 5 - end -end - -describe "Thread::SizedQueue#max=" do - before :each do - @sized_queue = SizedQueue.new(5) - end - - it "sets the size of the queue" do - @sized_queue.max.should == 5 - @sized_queue.max = 10 - @sized_queue.max.should == 10 - end - - it "does not remove items already in the queue beyond the maximum" do - @sized_queue.enq 1 - @sized_queue.enq 2 - @sized_queue.enq 3 - @sized_queue.max = 2 - (@sized_queue.size > @sized_queue.max).should be_true - @sized_queue.deq.should == 1 - @sized_queue.deq.should == 2 - @sized_queue.deq.should == 3 - end - - it "raises a TypeError when given a non-numeric value" do - lambda { @sized_queue.max = "foo" }.should raise_error(TypeError) - lambda { @sized_queue.max = Object.new }.should raise_error(TypeError) - end - - it "raises an argument error when set to zero" do - @sized_queue.max.should == 5 - lambda { @sized_queue.max = 0 }.should raise_error(ArgumentError) - @sized_queue.max.should == 5 - end - - it "raises an argument error when set to a negative number" do - @sized_queue.max.should == 5 - lambda { @sized_queue.max = -1 }.should raise_error(ArgumentError) - @sized_queue.max.should == 5 - end -end diff --git a/spec/ruby/library/thread/sizedqueue/new_spec.rb b/spec/ruby/library/thread/sizedqueue/new_spec.rb deleted file mode 100644 index 364e10f694..0000000000 --- a/spec/ruby/library/thread/sizedqueue/new_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' - -describe "Thread::SizedQueue#new" do - it "returns a new SizedQueue" do - SizedQueue.new(1).should be_kind_of(SizedQueue) - end - - it "raises a TypeError when the given argument is not Numeric" do - lambda { SizedQueue.new("foo") }.should raise_error(TypeError) - lambda { SizedQueue.new(Object.new) }.should raise_error(TypeError) - end - - it "raises an argument error when no argument is given" do - lambda { SizedQueue.new }.should raise_error(ArgumentError) - end - - it "raises an argument error when the given argument is zero" do - lambda { SizedQueue.new(0) }.should raise_error(ArgumentError) - end - - it "raises an argument error when the given argument is negative" do - lambda { SizedQueue.new(-1) }.should raise_error(ArgumentError) - end -end diff --git a/spec/ruby/library/thread/sizedqueue/num_waiting_spec.rb b/spec/ruby/library/thread/sizedqueue/num_waiting_spec.rb deleted file mode 100644 index 7c5243250d..0000000000 --- a/spec/ruby/library/thread/sizedqueue/num_waiting_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/num_waiting' - -describe "Thread::SizedQueue#num_waiting" do - it_behaves_like :queue_num_waiting, :num_waiting, -> { SizedQueue.new(10) } - - it "reports the number of threads waiting to push" do - q = SizedQueue.new(1) - q.push(1) - t = Thread.new { q.push(2) } - sleep 0.05 until t.stop? - q.num_waiting.should == 1 - - q.pop - t.join - end -end diff --git a/spec/ruby/library/thread/sizedqueue/pop_spec.rb b/spec/ruby/library/thread/sizedqueue/pop_spec.rb deleted file mode 100644 index 21508bd26b..0000000000 --- a/spec/ruby/library/thread/sizedqueue/pop_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::SizedQueue#pop" do - it_behaves_like :queue_deq, :pop, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/push_spec.rb b/spec/ruby/library/thread/sizedqueue/push_spec.rb deleted file mode 100644 index aefe6eb28a..0000000000 --- a/spec/ruby/library/thread/sizedqueue/push_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/enque' -require_relative 'shared/enque' - -describe "Thread::SizedQueue#push" do - it_behaves_like :queue_enq, :push, -> { SizedQueue.new(10) } -end - -describe "Thread::SizedQueue#push" do - it_behaves_like :sizedqueue_enq, :push -end diff --git a/spec/ruby/library/thread/sizedqueue/shared/enque.rb b/spec/ruby/library/thread/sizedqueue/shared/enque.rb deleted file mode 100644 index 627f8bd745..0000000000 --- a/spec/ruby/library/thread/sizedqueue/shared/enque.rb +++ /dev/null @@ -1,34 +0,0 @@ -describe :sizedqueue_enq, shared: true do - it "blocks if queued elements exceed size" do - q = SizedQueue.new(1) - - q.size.should == 0 - q.send(@method, :first_element) - q.size.should == 1 - - blocked_thread = Thread.new { q.send(@method, :second_element) } - sleep 0.01 until blocked_thread.stop? - - q.size.should == 1 - q.pop.should == :first_element - - blocked_thread.join - q.size.should == 1 - q.pop.should == :second_element - q.size.should == 0 - end - - it "raises a ThreadError if queued elements exceed size when not blocking" do - q = SizedQueue.new(2) - - non_blocking = true - add_to_queue = lambda { q.send(@method, Object.new, non_blocking) } - - q.size.should == 0 - add_to_queue.call - q.size.should == 1 - add_to_queue.call - q.size.should == 2 - add_to_queue.should raise_error(ThreadError) - end -end diff --git a/spec/ruby/library/thread/sizedqueue/shift_spec.rb b/spec/ruby/library/thread/sizedqueue/shift_spec.rb deleted file mode 100644 index 6c2adfce9d..0000000000 --- a/spec/ruby/library/thread/sizedqueue/shift_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/deque' - -describe "Thread::SizedQueue#shift" do - it_behaves_like :queue_deq, :shift, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue/size_spec.rb b/spec/ruby/library/thread/sizedqueue/size_spec.rb deleted file mode 100644 index 1bacef1eb1..0000000000 --- a/spec/ruby/library/thread/sizedqueue/size_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require_relative '../../../spec_helper' -require 'thread' -require_relative '../shared/queue/length' - -describe "Thread::SizedQueue#size" do - it_behaves_like :queue_length, :size, -> { SizedQueue.new(10) } -end diff --git a/spec/ruby/library/thread/sizedqueue_spec.rb b/spec/ruby/library/thread/sizedqueue_spec.rb new file mode 100644 index 0000000000..ffa66bcd35 --- /dev/null +++ b/spec/ruby/library/thread/sizedqueue_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' + +describe "Thread::SizedQueue" do + it "is the same class as ::SizedQueue" do + Thread.should.const_defined?(:SizedQueue, false) + Thread::SizedQueue.should.equal? ::SizedQueue + end +end diff --git a/spec/ruby/library/time/iso8601_spec.rb b/spec/ruby/library/time/iso8601_spec.rb index 4a9eb45613..ab35ab25d6 100644 --- a/spec/ruby/library/time/iso8601_spec.rb +++ b/spec/ruby/library/time/iso8601_spec.rb @@ -2,6 +2,6 @@ require_relative '../../spec_helper' require_relative 'shared/xmlschema' require 'time' -describe "Time.xmlschema" do - it_behaves_like :time_xmlschema, :iso8601 +describe "Time.iso8601" do + it_behaves_like :time_library_xmlschema, :iso8601 end diff --git a/spec/ruby/library/time/shared/rfc2822.rb b/spec/ruby/library/time/shared/rfc2822.rb index b7bf0fb5f5..49ef76db47 100644 --- a/spec/ruby/library/time/shared/rfc2822.rb +++ b/spec/ruby/library/time/shared/rfc2822.rb @@ -1,33 +1,33 @@ describe :time_rfc2822, shared: true do it "parses RFC-822 strings" do t1 = (Time.utc(1976, 8, 26, 14, 30) + 4 * 3600) - t2 = Time.rfc2822("26 Aug 76 14:30 EDT") + t2 = Time.send(@method, "26 Aug 76 14:30 EDT") t1.should == t2 t3 = Time.utc(1976, 8, 27, 9, 32) + 7 * 3600 - t4 = Time.rfc2822("27 Aug 76 09:32 PDT") + t4 = Time.send(@method, "27 Aug 76 09:32 PDT") t3.should == t4 end it "parses RFC-2822 strings" do t1 = Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600 - t2 = Time.rfc2822("Fri, 21 Nov 1997 09:55:06 -0600") + t2 = Time.send(@method, "Fri, 21 Nov 1997 09:55:06 -0600") t1.should == t2 t3 = Time.utc(2003, 7, 1, 10, 52, 37) - 2 * 3600 - t4 = Time.rfc2822("Tue, 1 Jul 2003 10:52:37 +0200") + t4 = Time.send(@method, "Tue, 1 Jul 2003 10:52:37 +0200") t3.should == t4 t5 = Time.utc(1997, 11, 21, 10, 1, 10) + 6 * 3600 - t6 = Time.rfc2822("Fri, 21 Nov 1997 10:01:10 -0600") + t6 = Time.send(@method, "Fri, 21 Nov 1997 10:01:10 -0600") t5.should == t6 t7 = Time.utc(1997, 11, 21, 11, 0, 0) + 6 * 3600 - t8 = Time.rfc2822("Fri, 21 Nov 1997 11:00:00 -0600") + t8 = Time.send(@method, "Fri, 21 Nov 1997 11:00:00 -0600") t7.should == t8 t9 = Time.utc(1997, 11, 24, 14, 22, 1) + 8 * 3600 - t10 = Time.rfc2822("Mon, 24 Nov 1997 14:22:01 -0800") + t10 = Time.send(@method, "Mon, 24 Nov 1997 14:22:01 -0800") t9.should == t10 begin @@ -36,11 +36,11 @@ describe :time_rfc2822, shared: true do # ignore else t11 = Time.utc(1969, 2, 13, 23, 32, 54) + 3 * 3600 + 30 * 60 - t12 = Time.rfc2822("Thu, 13 Feb 1969 23:32:54 -0330") + t12 = Time.send(@method, "Thu, 13 Feb 1969 23:32:54 -0330") t11.should == t12 t13 = Time.utc(1969, 2, 13, 23, 32, 0) + 3 * 3600 + 30 * 60 - t14 = Time.rfc2822(" Thu, + t14 = Time.send(@method, " Thu, 13 Feb 1969 @@ -50,16 +50,16 @@ describe :time_rfc2822, shared: true do end t15 = Time.utc(1997, 11, 21, 9, 55, 6) - t16 = Time.rfc2822("21 Nov 97 09:55:06 GMT") + t16 = Time.send(@method, "21 Nov 97 09:55:06 GMT") t15.should == t16 t17 = Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600 - t18 = Time.rfc2822("Fri, 21 Nov 1997 09 : 55 : 06 -0600") + t18 = Time.send(@method, "Fri, 21 Nov 1997 09 : 55 : 06 -0600") t17.should == t18 - lambda { + -> { # inner comment is not supported. - Time.rfc2822("Fri, 21 Nov 1997 09(comment): 55 : 06 -0600") - }.should raise_error(ArgumentError) + Time.send(@method, "Fri, 21 Nov 1997 09(comment): 55 : 06 -0600") + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/time/shared/xmlschema.rb b/spec/ruby/library/time/shared/xmlschema.rb index 44d33cda7e..0002886ca5 100644 --- a/spec/ruby/library/time/shared/xmlschema.rb +++ b/spec/ruby/library/time/shared/xmlschema.rb @@ -1,24 +1,24 @@ -describe :time_xmlschema, shared: true do +describe :time_library_xmlschema, shared: true do it "parses ISO-8601 strings" do t = Time.utc(1985, 4, 12, 23, 20, 50, 520000) s = "1985-04-12T23:20:50.52Z" - t.should == Time.xmlschema(s) - #s.should == t.xmlschema(2) + t.should == Time.send(@method, s) + #s.should == t.send(@method, 2) t = Time.utc(1996, 12, 20, 0, 39, 57) s = "1996-12-19T16:39:57-08:00" - t.should == Time.xmlschema(s) + t.should == Time.send(@method, s) # There is no way to generate time string with arbitrary timezone. s = "1996-12-20T00:39:57Z" - t.should == Time.xmlschema(s) - #assert_equal(s, t.xmlschema) + t.should == Time.send(@method, s) + #assert_equal(s, t.send(@method)) t = Time.utc(1990, 12, 31, 23, 59, 60) s = "1990-12-31T23:59:60Z" - t.should == Time.xmlschema(s) + t.should == Time.send(@method, s) # leap second is representable only if timezone file has it. s = "1990-12-31T15:59:60-08:00" - t.should == Time.xmlschema(s) + t.should == Time.send(@method, s) begin Time.at(-1) @@ -27,27 +27,27 @@ describe :time_xmlschema, shared: true do else t = Time.utc(1937, 1, 1, 11, 40, 27, 870000) s = "1937-01-01T12:00:27.87+00:20" - t.should == Time.xmlschema(s) + t.should == Time.send(@method, s) end # more - # (Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600).should == Time.xmlschema("1999-05-31T13:20:00-05:00") - # (Time.local(2000, 1, 20, 12, 0, 0)).should == Time.xmlschema("2000-01-20T12:00:00") - # (Time.utc(2000, 1, 20, 12, 0, 0)).should == Time.xmlschema("2000-01-20T12:00:00Z") - # (Time.utc(2000, 1, 20, 12, 0, 0) - 12 * 3600).should == Time.xmlschema("2000-01-20T12:00:00+12:00") - # (Time.utc(2000, 1, 20, 12, 0, 0) + 13 * 3600).should == Time.xmlschema("2000-01-20T12:00:00-13:00") - # (Time.utc(2000, 3, 4, 23, 0, 0) - 3 * 3600).should == Time.xmlschema("2000-03-04T23:00:00+03:00") - # (Time.utc(2000, 3, 4, 20, 0, 0)).should == Time.xmlschema("2000-03-04T20:00:00Z") - # (Time.local(2000, 1, 15, 0, 0, 0)).should == Time.xmlschema("2000-01-15T00:00:00") - # (Time.local(2000, 2, 15, 0, 0, 0)).should == Time.xmlschema("2000-02-15T00:00:00") - # (Time.local(2000, 1, 15, 12, 0, 0)).should == Time.xmlschema("2000-01-15T12:00:00") - # (Time.utc(2000, 1, 16, 12, 0, 0)).should == Time.xmlschema("2000-01-16T12:00:00Z") - # (Time.local(2000, 1, 1, 12, 0, 0)).should == Time.xmlschema("2000-01-01T12:00:00") - # (Time.utc(1999, 12, 31, 23, 0, 0)).should == Time.xmlschema("1999-12-31T23:00:00Z") - # (Time.local(2000, 1, 16, 12, 0, 0)).should == Time.xmlschema("2000-01-16T12:00:00") - # (Time.local(2000, 1, 16, 0, 0, 0)).should == Time.xmlschema("2000-01-16T00:00:00") - # (Time.utc(2000, 1, 12, 12, 13, 14)).should == Time.xmlschema("2000-01-12T12:13:14Z") - # (Time.utc(2001, 4, 17, 19, 23, 17, 300000)).should == Time.xmlschema("2001-04-17T19:23:17.3Z") + # (Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600).should == Time.send(@method, "1999-05-31T13:20:00-05:00") + # (Time.local(2000, 1, 20, 12, 0, 0)).should == Time.send(@method, "2000-01-20T12:00:00") + # (Time.utc(2000, 1, 20, 12, 0, 0)).should == Time.send(@method, "2000-01-20T12:00:00Z") + # (Time.utc(2000, 1, 20, 12, 0, 0) - 12 * 3600).should == Time.send(@method, "2000-01-20T12:00:00+12:00") + # (Time.utc(2000, 1, 20, 12, 0, 0) + 13 * 3600).should == Time.send(@method, "2000-01-20T12:00:00-13:00") + # (Time.utc(2000, 3, 4, 23, 0, 0) - 3 * 3600).should == Time.send(@method, "2000-03-04T23:00:00+03:00") + # (Time.utc(2000, 3, 4, 20, 0, 0)).should == Time.send(@method, "2000-03-04T20:00:00Z") + # (Time.local(2000, 1, 15, 0, 0, 0)).should == Time.send(@method, "2000-01-15T00:00:00") + # (Time.local(2000, 2, 15, 0, 0, 0)).should == Time.send(@method, "2000-02-15T00:00:00") + # (Time.local(2000, 1, 15, 12, 0, 0)).should == Time.send(@method, "2000-01-15T12:00:00") + # (Time.utc(2000, 1, 16, 12, 0, 0)).should == Time.send(@method, "2000-01-16T12:00:00Z") + # (Time.local(2000, 1, 1, 12, 0, 0)).should == Time.send(@method, "2000-01-01T12:00:00") + # (Time.utc(1999, 12, 31, 23, 0, 0)).should == Time.send(@method, "1999-12-31T23:00:00Z") + # (Time.local(2000, 1, 16, 12, 0, 0)).should == Time.send(@method, "2000-01-16T12:00:00") + # (Time.local(2000, 1, 16, 0, 0, 0)).should == Time.send(@method, "2000-01-16T00:00:00") + # (Time.utc(2000, 1, 12, 12, 13, 14)).should == Time.send(@method, "2000-01-12T12:13:14Z") + # (Time.utc(2001, 4, 17, 19, 23, 17, 300000)).should == Time.send(@method, "2001-04-17T19:23:17.3Z") end end diff --git a/spec/ruby/library/time/to_date_spec.rb b/spec/ruby/library/time/to_date_spec.rb deleted file mode 100644 index baeafe0847..0000000000 --- a/spec/ruby/library/time/to_date_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ - -require_relative '../../spec_helper' -require 'time' - -describe "Time#to_date" do - it "yields accurate julian date for ambiguous pre-Gregorian reform value" do - Time.utc(1582, 10, 4).to_date.jd.should == Date::ITALY - 11 # 2299150j - end - - it "yields accurate julian date for Julian-Gregorian gap value" do - Time.utc(1582, 10, 14).to_date.jd.should == Date::ITALY - 1 # 2299160j - end - - it "yields accurate julian date for post-Gregorian reform value" do - Time.utc(1582, 10, 15).to_date.jd.should == Date::ITALY # 2299161j - end - - it "yields same julian day regardless of UTC time value" do - Time.utc(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY - Time.utc(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY - end - - it "yields same julian day regardless of local time or zone" do - - with_timezone("Pacific/Pago_Pago", -11) do - Time.local(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY - Time.local(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY - end - - with_timezone("Asia/Kamchatka", +12) do - Time.local(1582, 10, 15, 00, 00, 00).to_date.jd.should == Date::ITALY - Time.local(1582, 10, 15, 23, 59, 59).to_date.jd.should == Date::ITALY - end - - end - - it "yields date with default Calendar reform day" do - Time.utc(1582, 10, 4).to_date.start.should == Date::ITALY - Time.utc(1582, 10, 14).to_date.start.should == Date::ITALY - Time.utc(1582, 10, 15).to_date.start.should == Date::ITALY - end -end diff --git a/spec/ruby/library/time/to_datetime_spec.rb b/spec/ruby/library/time/to_datetime_spec.rb deleted file mode 100644 index 0e37a61108..0000000000 --- a/spec/ruby/library/time/to_datetime_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../spec_helper' -require 'time' - -describe "Time#to_datetime" do - it "returns a DateTime representing the same instant" do - time = Time.utc(3, 12, 31, 23, 58, 59) - datetime = time.to_datetime - datetime.year.should == 3 - datetime.month.should == 12 - datetime.day.should == 31 - datetime.hour.should == 23 - datetime.min.should == 58 - datetime.sec.should == 59 - end - - it "roundtrips" do - time = Time.utc(3, 12, 31, 23, 58, 59) - datetime = time.to_datetime - datetime.to_time.utc.should == time - end - - it "yields a DateTime with the default Calendar reform day" do - Time.utc(1582, 10, 4, 1, 2, 3).to_datetime.start.should == Date::ITALY - Time.utc(1582, 10, 14, 1, 2, 3).to_datetime.start.should == Date::ITALY - Time.utc(1582, 10, 15, 1, 2, 3).to_datetime.start.should == Date::ITALY - end -end diff --git a/spec/ruby/library/time/to_time_spec.rb b/spec/ruby/library/time/to_time_spec.rb index 5602915551..d2b89cb112 100644 --- a/spec/ruby/library/time/to_time_spec.rb +++ b/spec/ruby/library/time/to_time_spec.rb @@ -1,17 +1,15 @@ require_relative '../../spec_helper' require 'time' -ruby_version_is "2.4" do - describe "Time#to_time" do - it "returns itself in the same timezone" do - time = Time.new(2012, 2, 21, 10, 11, 12) +describe "Time#to_time" do + it "returns itself in the same timezone" do + time = Time.new(2012, 2, 21, 10, 11, 12) - with_timezone("America/Regina") do - time.to_time.should equal time - end - - time2 = Time.utc(2012, 2, 21, 10, 11, 12) - time2.to_time.should equal time2 + with_timezone("America/Regina") do + time.to_time.should.equal? time end + + time2 = Time.utc(2012, 2, 21, 10, 11, 12) + time2.to_time.should.equal? time2 end end diff --git a/spec/ruby/library/time/xmlschema_spec.rb b/spec/ruby/library/time/xmlschema_spec.rb index 4279311199..ff3c864a02 100644 --- a/spec/ruby/library/time/xmlschema_spec.rb +++ b/spec/ruby/library/time/xmlschema_spec.rb @@ -3,5 +3,5 @@ require_relative 'shared/xmlschema' require 'time' describe "Time.xmlschema" do - it_behaves_like :time_xmlschema, :xmlschema + it_behaves_like :time_library_xmlschema, :xmlschema end diff --git a/spec/ruby/library/timeout/error_spec.rb b/spec/ruby/library/timeout/error_spec.rb index 6c236e5128..2c28236e29 100644 --- a/spec/ruby/library/timeout/error_spec.rb +++ b/spec/ruby/library/timeout/error_spec.rb @@ -3,6 +3,6 @@ require 'timeout' describe "Timeout::Error" do it "is a subclass of RuntimeError" do - RuntimeError.should be_ancestor_of(Timeout::Error) + Timeout::Error.ancestors.should.include?(RuntimeError) end end diff --git a/spec/ruby/library/timeout/timeout_spec.rb b/spec/ruby/library/timeout/timeout_spec.rb index 5297de2823..9ae70bf600 100644 --- a/spec/ruby/library/timeout/timeout_spec.rb +++ b/spec/ruby/library/timeout/timeout_spec.rb @@ -3,30 +3,35 @@ require 'timeout' describe "Timeout.timeout" do it "raises Timeout::Error when it times out with no specified error type" do - lambda { + -> { Timeout.timeout(1) do - sleep 3 + sleep end - }.should raise_error(Timeout::Error) + }.should.raise(Timeout::Error) end it "raises specified error type when it times out" do - lambda do + -> do Timeout.timeout(1, StandardError) do - sleep 3 + sleep end - end.should raise_error(StandardError) + end.should.raise(StandardError) end - it "does not wait too long" do - before_time = Time.now - lambda do - Timeout.timeout(1, StandardError) do - sleep 3 + it "raises specified error type with specified message when it times out" do + -> do + Timeout.timeout(1, StandardError, "foobar") do + sleep end - end.should raise_error(StandardError) + end.should.raise(StandardError, "foobar") + end - (Time.now - before_time).should be_close(1.0, 0.5) + it "raises specified error type with a default message when it times out if message is nil" do + -> do + Timeout.timeout(1, StandardError, nil) do + sleep + end + end.should.raise(StandardError, "execution expired") end it "returns back the last value in the block" do @@ -34,4 +39,12 @@ describe "Timeout.timeout" do 42 end.should == 42 end + + ruby_version_is "3.4" do + it "raises an ArgumentError when provided with a negative duration" do + -> { + Timeout.timeout(-1) + }.should.raise(ArgumentError, "Timeout sec must be a non-negative number") + end + end end diff --git a/spec/ruby/library/tmpdir/dir/mktmpdir_spec.rb b/spec/ruby/library/tmpdir/dir/mktmpdir_spec.rb index 6f56f60425..edc4795efb 100644 --- a/spec/ruby/library/tmpdir/dir/mktmpdir_spec.rb +++ b/spec/ruby/library/tmpdir/dir/mktmpdir_spec.rb @@ -16,8 +16,8 @@ describe "Dir.mktmpdir when passed no arguments" do it "creates a new writable directory in the path provided by Dir.tmpdir" do Dir.should_receive(:tmpdir).and_return(tmp("")) @tmpdir = Dir.mktmpdir - File.directory?(@tmpdir).should be_true - File.writable?(@tmpdir).should be_true + File.directory?(@tmpdir).should == true + File.writable?(@tmpdir).should == true end end @@ -39,17 +39,17 @@ describe "Dir.mktmpdir when passed a block" do Dir.mktmpdir do |path| @tmpdir = path called = true - path.start_with?(@real_tmp_root).should be_true + path.should.start_with?(@real_tmp_root) end - called.should be_true + called.should == true end it "creates the tmp-dir before yielding" do Dir.should_receive(:tmpdir).and_return(tmp("")) Dir.mktmpdir do |path| @tmpdir = path - File.directory?(path).should be_true - File.writable?(path).should be_true + File.directory?(path).should == true + File.writable?(path).should == true end end @@ -67,7 +67,7 @@ describe "Dir.mktmpdir when passed a block" do @tmpdir = path :test end - result.should equal(:test) + result.should.equal?(:test) end end @@ -99,7 +99,7 @@ describe "Dir.mktmpdir when passed [Array]" do Dir.rmdir @tmpdir if File.directory? @tmpdir end - it "uses the first element of the passed Array as a prefix and the scond element as a suffix to the tmp-directory" do + it "uses the first element of the passed Array as a prefix and the second element as a suffix to the tmp-directory" do prefix = "before" suffix = "after" @@ -110,8 +110,8 @@ end describe "Dir.mktmpdir when passed [Object]" do it "raises an ArgumentError" do - lambda { Dir.mktmpdir(Object.new) }.should raise_error(ArgumentError) - lambda { Dir.mktmpdir(:symbol) }.should raise_error(ArgumentError) - lambda { Dir.mktmpdir(10) }.should raise_error(ArgumentError) + -> { Dir.mktmpdir(Object.new) }.should.raise(ArgumentError) + -> { Dir.mktmpdir(:symbol) }.should.raise(ArgumentError) + -> { Dir.mktmpdir(10) }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/tmpdir/dir/tmpdir_spec.rb b/spec/ruby/library/tmpdir/dir/tmpdir_spec.rb index f4ab5e40b8..330f04458f 100644 --- a/spec/ruby/library/tmpdir/dir/tmpdir_spec.rb +++ b/spec/ruby/library/tmpdir/dir/tmpdir_spec.rb @@ -4,7 +4,7 @@ require "tmpdir" describe "Dir.tmpdir" do it "returns the path to a writable and readable directory" do dir = Dir.tmpdir - File.directory?(dir).should be_true - File.writable?(dir).should be_true + File.directory?(dir).should == true + File.writable?(dir).should == true end end diff --git a/spec/ruby/library/uri/generic/host_spec.rb b/spec/ruby/library/uri/generic/host_spec.rb index f2076d2bc1..4a5a162512 100644 --- a/spec/ruby/library/uri/generic/host_spec.rb +++ b/spec/ruby/library/uri/generic/host_spec.rb @@ -2,7 +2,10 @@ require_relative '../../../spec_helper' require 'uri' describe "URI::Generic#host" do - it "needs to be reviewed for spec completeness" + # https://hackerone.com/reports/156615 + it "returns empty string when host is empty" do + URI.parse('http:////foo.com').host.should == '' + end end describe "URI::Generic#host=" do diff --git a/spec/ruby/library/uri/generic/to_s_spec.rb b/spec/ruby/library/uri/generic/to_s_spec.rb index 8c90d7645b..c436ee3c03 100644 --- a/spec/ruby/library/uri/generic/to_s_spec.rb +++ b/spec/ruby/library/uri/generic/to_s_spec.rb @@ -2,5 +2,8 @@ require_relative '../../../spec_helper' require 'uri' describe "URI::Generic#to_s" do - it "needs to be reviewed for spec completeness" + # https://hackerone.com/reports/156615 + it "preserves / characters when host is empty" do + URI('http:///foo.com').to_s.should == 'http:///foo.com' + end end diff --git a/spec/ruby/library/uri/join_spec.rb b/spec/ruby/library/uri/join_spec.rb index 6033ecf44c..1777303360 100644 --- a/spec/ruby/library/uri/join_spec.rb +++ b/spec/ruby/library/uri/join_spec.rb @@ -21,9 +21,9 @@ describe "URI.join" do end it "raises an error if given no argument" do - lambda { + -> { URI.join - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "doesn't create redundant '/'s" do diff --git a/spec/ruby/library/uri/mailto/build_spec.rb b/spec/ruby/library/uri/mailto/build_spec.rb index 80af931c8c..081707b1cf 100644 --- a/spec/ruby/library/uri/mailto/build_spec.rb +++ b/spec/ruby/library/uri/mailto/build_spec.rb @@ -84,15 +84,9 @@ describe "URI::Mailto.build" do end bad.each do |x| - lambda { URI::MailTo.build(x) }.should raise_error(URI::InvalidComponentError) + -> { URI::MailTo.build(x) }.should.raise(URI::InvalidComponentError) end ok.flatten.join("\0").should == ok_all end end - - - -describe "URI::MailTo.build" do - it "needs to be reviewed for spec completeness" -end diff --git a/spec/ruby/library/uri/parse_spec.rb b/spec/ruby/library/uri/parse_spec.rb index e9ec59b490..f0373fbf5e 100644 --- a/spec/ruby/library/uri/parse_spec.rb +++ b/spec/ruby/library/uri/parse_spec.rb @@ -4,7 +4,7 @@ require_relative 'fixtures/classes' describe "URI.parse" do it "returns a URI::HTTP object when parsing an HTTP URI" do - URI.parse("http://www.example.com/").should be_kind_of(URI::HTTP) + URI.parse("http://www.example.com/").should.is_a?(URI::HTTP) end it "populates the components of a parsed URI::HTTP, setting the port to 80 by default" do @@ -47,7 +47,7 @@ describe "URI.parse" do end it "returns a URI::HTTPS object when parsing an HTTPS URI" do - URI.parse("https://important-intern-net.net").should be_kind_of(URI::HTTPS) + URI.parse("https://important-intern-net.net").should.is_a?(URI::HTTPS) end it "sets the port of a parsed https URI to 443 by default" do @@ -57,7 +57,7 @@ describe "URI.parse" do it "populates the components of a parsed URI::FTP object" do # generic, empty password. url = URI.parse("ftp://anonymous@ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.bz2;type=i") - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: "anonymous", @@ -69,7 +69,7 @@ describe "URI.parse" do # multidomain, no user or password url = URI.parse('ftp://ftp.is.co.za/rfc/rfc1808.txt') - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: nil, @@ -81,7 +81,7 @@ describe "URI.parse" do # empty user url = URI.parse('ftp://:pass@localhost/') - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: ":pass", @@ -97,7 +97,7 @@ describe "URI.parse" do #taken from http://www.faqs.org/rfcs/rfc2255.html 'cause I don't really know what an LDAP url looks like ldap_uris = %w{ ldap:///o=University%20of%20Michigan,c=US ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Babs%20Jensen) ldap://ldap.itd.umich.edu/c=GB?objectClass?one ldap://ldap.question.com/o=Question%3f,c=US?mail ldap://ldap.netscape.com/o=Babsco,c=US??(int=%5c00%5c00%5c00%5c04) ldap:///??sub??bindname=cn=Manager%2co=Foo ldap:///??sub??!bindname=cn=Manager%2co=Foo } ldap_uris.each do |ldap_uri| - URI.parse(ldap_uri).should be_kind_of(URI::LDAP) + URI.parse(ldap_uri).should.is_a?(URI::LDAP) end end @@ -115,7 +115,7 @@ describe "URI.parse" do end it "returns a URI::MailTo object when passed a mailto URI" do - URI.parse("mailto:spam@mailinator.com").should be_kind_of(URI::MailTo) + URI.parse("mailto:spam@mailinator.com").should.is_a?(URI::MailTo) end it "populates the components of a parsed URI::MailTo object" do @@ -145,7 +145,7 @@ describe "URI.parse" do # gopher gopher = URI.parse('gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles') - gopher.should be_kind_of(URI::Generic) + gopher.should.is_a?(URI::Generic) URISpec.components(gopher).should == { scheme: "gopher", @@ -161,7 +161,7 @@ describe "URI.parse" do # news news = URI.parse('news:comp.infosystems.www.servers.unix') - news.should be_kind_of(URI::Generic) + news.should.is_a?(URI::Generic) URISpec.components(news).should == { scheme: "news", userinfo: nil, @@ -176,7 +176,7 @@ describe "URI.parse" do # telnet telnet = URI.parse('telnet://melvyl.ucop.edu/') - telnet.should be_kind_of(URI::Generic) + telnet.should.is_a?(URI::Generic) URISpec.components(telnet).should == { scheme: "telnet", userinfo: nil, @@ -191,9 +191,9 @@ describe "URI.parse" do # files file_l = URI.parse('file:///foo/bar.txt') - file_l.should be_kind_of(URI::Generic) + file_l.should.is_a?(URI::Generic) file = URI.parse('file:/foo/bar.txt') - file.should be_kind_of(URI::Generic) + file.should.is_a?(URI::Generic) end it "doesn't raise errors on URIs which has underscore in reg_name" do diff --git a/spec/ruby/library/uri/plus_spec.rb b/spec/ruby/library/uri/plus_spec.rb index 146cfddf90..51fb5e3750 100644 --- a/spec/ruby/library/uri/plus_spec.rb +++ b/spec/ruby/library/uri/plus_spec.rb @@ -31,12 +31,12 @@ describe "URI#+" do (URI.parse('http://a/b/c/../../../') + ".").should == URI("http://a/") end - it "doesn't conconicalize the path when adding to the empty string" do + it "doesn't canonicalize the path when adding to the empty string" do (URI.parse('http://a/b/c/../') + "").should == URI("http://a/b/c/../") end it "raises a URI::BadURIError when adding two relative URIs" do - lambda {URI.parse('a/b/c') + "d"}.should raise_error(URI::BadURIError) + -> {URI.parse('a/b/c') + "d"}.should.raise(URI::BadURIError) end #Todo: make more BDD? @@ -47,403 +47,403 @@ describe "URI#+" do # http://a/b/c/d;p?q # g:h = g:h url = @base_url.merge('g:h') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g:h' url = @base_url.route_to('g:h') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g:h' # http://a/b/c/d;p?q # g = http://a/b/c/g url = @base_url.merge('g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g' url = @base_url.route_to('http://a/b/c/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g' # http://a/b/c/d;p?q # ./g = http://a/b/c/g url = @base_url.merge('./g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g' url = @base_url.route_to('http://a/b/c/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == './g' # ok url.to_s.should == 'g' # http://a/b/c/d;p?q # g/ = http://a/b/c/g/ url = @base_url.merge('g/') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g/' url = @base_url.route_to('http://a/b/c/g/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g/' # http://a/b/c/d;p?q # /g = http://a/g url = @base_url.merge('/g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '/g' # ok url.to_s.should == '../../g' # http://a/b/c/d;p?q # //g = http://g url = @base_url.merge('//g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://g' url = @base_url.route_to('http://g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '//g' # http://a/b/c/d;p?q # ?y = http://a/b/c/?y url = @base_url.merge('?y') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/d;p?y' url = @base_url.route_to('http://a/b/c/?y') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '?y' # http://a/b/c/d;p?q # g?y = http://a/b/c/g?y url = @base_url.merge('g?y') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g?y' url = @base_url.route_to('http://a/b/c/g?y') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g?y' # http://a/b/c/d;p?q # #s = (current document)#s url = @base_url.merge('#s') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == @base_url.to_s + '#s' url = @base_url.route_to(@base_url.to_s + '#s') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '#s' # http://a/b/c/d;p?q # g#s = http://a/b/c/g#s url = @base_url.merge('g#s') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g#s' url = @base_url.route_to('http://a/b/c/g#s') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g#s' # http://a/b/c/d;p?q # g?y#s = http://a/b/c/g?y#s url = @base_url.merge('g?y#s') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g?y#s' url = @base_url.route_to('http://a/b/c/g?y#s') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g?y#s' # http://a/b/c/d;p?q # ;x = http://a/b/c/;x url = @base_url.merge(';x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/;x' url = @base_url.route_to('http://a/b/c/;x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == ';x' # http://a/b/c/d;p?q # g;x = http://a/b/c/g;x url = @base_url.merge('g;x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g;x' url = @base_url.route_to('http://a/b/c/g;x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g;x' # http://a/b/c/d;p?q # g;x?y#s = http://a/b/c/g;x?y#s url = @base_url.merge('g;x?y#s') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g;x?y#s' url = @base_url.route_to('http://a/b/c/g;x?y#s') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g;x?y#s' # http://a/b/c/d;p?q # . = http://a/b/c/ url = @base_url.merge('.') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/' url = @base_url.route_to('http://a/b/c/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '.' # ok url.to_s.should == './' # http://a/b/c/d;p?q # ./ = http://a/b/c/ url = @base_url.merge('./') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/' url = @base_url.route_to('http://a/b/c/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == './' # http://a/b/c/d;p?q # .. = http://a/b/ url = @base_url.merge('..') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/' url = @base_url.route_to('http://a/b/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '..' # ok url.to_s.should == '../' # http://a/b/c/d;p?q # ../ = http://a/b/ url = @base_url.merge('../') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/' url = @base_url.route_to('http://a/b/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '../' # http://a/b/c/d;p?q # ../g = http://a/b/g url = @base_url.merge('../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/g' url = @base_url.route_to('http://a/b/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '../g' # http://a/b/c/d;p?q # ../.. = http://a/ url = @base_url.merge('../..') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/' url = @base_url.route_to('http://a/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '../..' # ok url.to_s.should == '../../' # http://a/b/c/d;p?q # ../../ = http://a/ url = @base_url.merge('../../') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/' url = @base_url.route_to('http://a/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '../../' # http://a/b/c/d;p?q # ../../g = http://a/g url = @base_url.merge('../../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '../../g' # http://a/b/c/d;p?q # <> = (current document) url = @base_url.merge('') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/d;p?q' url = @base_url.route_to('http://a/b/c/d;p?q') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '' # http://a/b/c/d;p?q # /./g = http://a/./g url = @base_url.merge('/./g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/./g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '/./g' # http://a/b/c/d;p?q # /../g = http://a/../g url = @base_url.merge('/../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/../g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '/../g' # http://a/b/c/d;p?q # g. = http://a/b/c/g. url = @base_url.merge('g.') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g.' url = @base_url.route_to('http://a/b/c/g.') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g.' # http://a/b/c/d;p?q # .g = http://a/b/c/.g url = @base_url.merge('.g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/.g' url = @base_url.route_to('http://a/b/c/.g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '.g' # http://a/b/c/d;p?q # g.. = http://a/b/c/g.. url = @base_url.merge('g..') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g..' url = @base_url.route_to('http://a/b/c/g..') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g..' # http://a/b/c/d;p?q # ..g = http://a/b/c/..g url = @base_url.merge('..g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/..g' url = @base_url.route_to('http://a/b/c/..g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == '..g' # http://a/b/c/d;p?q # ../../../g = http://a/../g url = @base_url.merge('../../../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/../g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '../../../g' # ok? yes, it confuses you url.to_s.should == '/../g' # and it is clearly # http://a/b/c/d;p?q # ../../../../g = http://a/../../g url = @base_url.merge('../../../../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/g' url = @base_url.route_to('http://a/../../g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == '../../../../g' # ok? yes, it confuses you url.to_s.should == '/../../g' # and it is clearly # http://a/b/c/d;p?q # ./../g = http://a/b/g url = @base_url.merge('./../g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/g' url = @base_url.route_to('http://a/b/g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == './../g' # ok url.to_s.should == '../g' # http://a/b/c/d;p?q # ./g/. = http://a/b/c/g/ url = @base_url.merge('./g/.') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g/' url = @base_url.route_to('http://a/b/c/g/') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == './g/.' # ok url.to_s.should == 'g/' # http://a/b/c/d;p?q # g/./h = http://a/b/c/g/h url = @base_url.merge('g/./h') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g/h' url = @base_url.route_to('http://a/b/c/g/h') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == 'g/./h' # ok url.to_s.should == 'g/h' # http://a/b/c/d;p?q # g/../h = http://a/b/c/h url = @base_url.merge('g/../h') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/h' url = @base_url.route_to('http://a/b/c/h') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == 'g/../h' # ok url.to_s.should == 'h' # http://a/b/c/d;p?q # g;x=1/./y = http://a/b/c/g;x=1/y url = @base_url.merge('g;x=1/./y') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g;x=1/y' url = @base_url.route_to('http://a/b/c/g;x=1/y') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == 'g;x=1/./y' # ok url.to_s.should == 'g;x=1/y' # http://a/b/c/d;p?q # g;x=1/../y = http://a/b/c/y url = @base_url.merge('g;x=1/../y') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/y' url = @base_url.route_to('http://a/b/c/y') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should_not == 'g;x=1/../y' # ok url.to_s.should == 'y' # http://a/b/c/d;p?q # g?y/./x = http://a/b/c/g?y/./x url = @base_url.merge('g?y/./x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g?y/./x' url = @base_url.route_to('http://a/b/c/g?y/./x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g?y/./x' # http://a/b/c/d;p?q # g?y/../x = http://a/b/c/g?y/../x url = @base_url.merge('g?y/../x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g?y/../x' url = @base_url.route_to('http://a/b/c/g?y/../x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g?y/../x' # http://a/b/c/d;p?q # g#s/./x = http://a/b/c/g#s/./x url = @base_url.merge('g#s/./x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g#s/./x' url = @base_url.route_to('http://a/b/c/g#s/./x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g#s/./x' # http://a/b/c/d;p?q # g#s/../x = http://a/b/c/g#s/../x url = @base_url.merge('g#s/../x') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http://a/b/c/g#s/../x' url = @base_url.route_to('http://a/b/c/g#s/../x') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'g#s/../x' # http://a/b/c/d;p?q # http:g = http:g ; for validating parsers # | http://a/b/c/g ; for backwards compatibility url = @base_url.merge('http:g') - url.should be_kind_of(URI::HTTP) + url.should.is_a?(URI::HTTP) url.to_s.should == 'http:g' url = @base_url.route_to('http:g') - url.should be_kind_of(URI::Generic) + url.should.is_a?(URI::Generic) url.to_s.should == 'http:g' end end diff --git a/spec/ruby/library/uri/select_spec.rb b/spec/ruby/library/uri/select_spec.rb index 6e8c68cf40..27591f69f2 100644 --- a/spec/ruby/library/uri/select_spec.rb +++ b/spec/ruby/library/uri/select_spec.rb @@ -15,17 +15,13 @@ describe "URI#select" do end it "raises an ArgumentError if a component is requested that isn't valid under the given scheme" do - [ - lambda {URI("mailto:spam@mailinator.com").select(:path)}, - lambda {URI("http://blog.blag.web").select(:typecode)}, - ].each do |select_lambda| - select_lambda.should raise_error(ArgumentError) - end + -> { URI("mailto:spam@mailinator.com").select(:path) }.should.raise(ArgumentError) + -> { URI("http://blog.blag.web").select(:typecode) }.should.raise(ArgumentError) end it "raises an ArgumentError if given strings rather than symbols" do - lambda { + -> { URI("http://host:8080/path/").select("scheme","host","port",'path') - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end end diff --git a/spec/ruby/library/uri/set_component_spec.rb b/spec/ruby/library/uri/set_component_spec.rb index 71ed6af278..15f1ed1f87 100644 --- a/spec/ruby/library/uri/set_component_spec.rb +++ b/spec/ruby/library/uri/set_component_spec.rb @@ -6,40 +6,42 @@ describe "URI#select" do it "conforms to the MatzRuby tests" do uri = URI.parse('http://foo:bar@baz') (uri.user = 'oof').should == 'oof' - uri.to_s.should == 'http://oof:bar@baz' - (uri.password = 'rab').should == 'rab' - uri.to_s.should == 'http://oof:rab@baz' - (uri.userinfo = 'foo').should == 'foo' - uri.to_s.should == 'http://foo:rab@baz' - (uri.userinfo = ['foo', 'bar']).should == ['foo', 'bar'] - uri.to_s.should == 'http://foo:bar@baz' - (uri.userinfo = ['foo']).should == ['foo'] - uri.to_s.should == 'http://foo:bar@baz' - (uri.host = 'zab').should == 'zab' - uri.to_s.should == 'http://foo:bar@zab' - (uri.port = 8080).should == 8080 - uri.to_s.should == 'http://foo:bar@zab:8080' - (uri.path = '/').should == '/' - uri.to_s.should == 'http://foo:bar@zab:8080/' - (uri.query = 'a=1').should == 'a=1' - uri.to_s.should == 'http://foo:bar@zab:8080/?a=1' - (uri.fragment = 'b123').should == 'b123' - uri.to_s.should == 'http://foo:bar@zab:8080/?a=1#b123' + version_is(URI::VERSION, "1.0.4") do + uri.to_s.should == 'http://oof@baz' + (uri.password = 'rab').should == 'rab' + uri.to_s.should == 'http://oof:rab@baz' + (uri.userinfo = 'foo').should == 'foo' + uri.to_s.should == 'http://foo@baz' + (uri.userinfo = ['foo', 'bar']).should == ['foo', 'bar'] + uri.to_s.should == 'http://foo:bar@baz' + (uri.userinfo = ['foo']).should == ['foo'] + uri.to_s.should == 'http://foo@baz' + (uri.host = 'zab').should == 'zab' + uri.to_s.should == 'http://zab' + (uri.port = 8080).should == 8080 + uri.to_s.should == 'http://zab:8080' + (uri.path = '/').should == '/' + uri.to_s.should == 'http://zab:8080/' + (uri.query = 'a=1').should == 'a=1' + uri.to_s.should == 'http://zab:8080/?a=1' + (uri.fragment = 'b123').should == 'b123' + uri.to_s.should == 'http://zab:8080/?a=1#b123' + end uri = URI.parse('http://example.com') - lambda { uri.password = 'bar' }.should raise_error(URI::InvalidURIError) + -> { uri.password = 'bar' }.should.raise(URI::InvalidURIError) uri.userinfo = 'foo:bar' uri.to_s.should == 'http://foo:bar@example.com' - lambda { uri.registry = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.opaque = 'bar' }.should raise_error(URI::InvalidURIError) + -> { uri.registry = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.opaque = 'bar' }.should.raise(URI::InvalidURIError) uri = URI.parse('mailto:foo@example.com') - lambda { uri.user = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.password = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.userinfo = ['bar', 'baz'] }.should raise_error(URI::InvalidURIError) - lambda { uri.host = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.port = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.path = 'bar' }.should raise_error(URI::InvalidURIError) - lambda { uri.query = 'bar' }.should raise_error(URI::InvalidURIError) + -> { uri.user = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.password = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.userinfo = ['bar', 'baz'] }.should.raise(URI::InvalidURIError) + -> { uri.host = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.port = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.path = 'bar' }.should.raise(URI::InvalidURIError) + -> { uri.query = 'bar' }.should.raise(URI::InvalidURIError) end end diff --git a/spec/ruby/library/uri/shared/eql.rb b/spec/ruby/library/uri/shared/eql.rb index 2cc960d39a..978c4aae05 100644 --- a/spec/ruby/library/uri/shared/eql.rb +++ b/spec/ruby/library/uri/shared/eql.rb @@ -3,7 +3,7 @@ describe :uri_eql, shared: true do URISpec::NORMALIZED_FORMS.each do |form| normal_uri = URI(form[:normalized]) form[:different].each do |other| - URI(other).send(@method, normal_uri).should be_false + URI(other).send(@method, normal_uri).should == false end end end @@ -11,7 +11,7 @@ end describe :uri_eql_against_other_types, shared: true do it "returns false for when compared to non-uri objects" do - URI("http://example.com/").send(@method, "http://example.com/").should be_false - URI("http://example.com/").send(@method, nil).should be_false + URI("http://example.com/").send(@method, "http://example.com/").should == false + URI("http://example.com/").send(@method, nil).should == false end end diff --git a/spec/ruby/library/uri/shared/join.rb b/spec/ruby/library/uri/shared/join.rb index ff85b57a80..b1f5f1c72b 100644 --- a/spec/ruby/library/uri/shared/join.rb +++ b/spec/ruby/library/uri/shared/join.rb @@ -18,9 +18,9 @@ describe :uri_join, shared: true do end it "raises an error if given no argument" do - lambda { + -> { @object.join - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "doesn't create redundant '/'s" do diff --git a/spec/ruby/library/uri/shared/parse.rb b/spec/ruby/library/uri/shared/parse.rb index 5ecbffcaf2..7ec7179526 100644 --- a/spec/ruby/library/uri/shared/parse.rb +++ b/spec/ruby/library/uri/shared/parse.rb @@ -1,6 +1,6 @@ describe :uri_parse, shared: true do it "returns a URI::HTTP object when parsing an HTTP URI" do - @object.parse("http://www.example.com/").should be_kind_of(URI::HTTP) + @object.parse("http://www.example.com/").should.is_a?(URI::HTTP) end it "populates the components of a parsed URI::HTTP, setting the port to 80 by default" do @@ -43,7 +43,7 @@ describe :uri_parse, shared: true do end it "returns a URI::HTTPS object when parsing an HTTPS URI" do - @object.parse("https://important-intern-net.net").should be_kind_of(URI::HTTPS) + @object.parse("https://important-intern-net.net").should.is_a?(URI::HTTPS) end it "sets the port of a parsed https URI to 443 by default" do @@ -53,7 +53,7 @@ describe :uri_parse, shared: true do it "populates the components of a parsed URI::FTP object" do # generic, empty password. url = @object.parse("ftp://anonymous@ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.bz2;type=i") - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: "anonymous", @@ -65,7 +65,7 @@ describe :uri_parse, shared: true do # multidomain, no user or password url = @object.parse('ftp://ftp.is.co.za/rfc/rfc1808.txt') - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: nil, @@ -77,7 +77,7 @@ describe :uri_parse, shared: true do # empty user url = @object.parse('ftp://:pass@localhost/') - url.should be_kind_of(URI::FTP) + url.should.is_a?(URI::FTP) URISpec.components(url).should == { scheme: "ftp", userinfo: ":pass", @@ -93,7 +93,7 @@ describe :uri_parse, shared: true do #taken from http://www.faqs.org/rfcs/rfc2255.html 'cause I don't really know what an LDAP url looks like ldap_uris = %w{ ldap:///o=University%20of%20Michigan,c=US ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Babs%20Jensen) ldap://ldap.itd.umich.edu/c=GB?objectClass?one ldap://ldap.question.com/o=Question%3f,c=US?mail ldap://ldap.netscape.com/o=Babsco,c=US??(int=%5c00%5c00%5c00%5c04) ldap:///??sub??bindname=cn=Manager%2co=Foo ldap:///??sub??!bindname=cn=Manager%2co=Foo } ldap_uris.each do |ldap_uri| - @object.parse(ldap_uri).should be_kind_of(URI::LDAP) + @object.parse(ldap_uri).should.is_a?(URI::LDAP) end end @@ -111,7 +111,7 @@ describe :uri_parse, shared: true do end it "returns a URI::MailTo object when passed a mailto URI" do - @object.parse("mailto:spam@mailinator.com").should be_kind_of(URI::MailTo) + @object.parse("mailto:spam@mailinator.com").should.is_a?(URI::MailTo) end it "populates the components of a parsed URI::MailTo object" do @@ -141,7 +141,7 @@ describe :uri_parse, shared: true do # gopher gopher = @object.parse('gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles') - gopher.should be_kind_of(URI::Generic) + gopher.should.is_a?(URI::Generic) URISpec.components(gopher).should == { scheme: "gopher", @@ -157,7 +157,7 @@ describe :uri_parse, shared: true do # news news = @object.parse('news:comp.infosystems.www.servers.unix') - news.should be_kind_of(URI::Generic) + news.should.is_a?(URI::Generic) URISpec.components(news).should == { scheme: "news", userinfo: nil, @@ -172,7 +172,7 @@ describe :uri_parse, shared: true do # telnet telnet = @object.parse('telnet://melvyl.ucop.edu/') - telnet.should be_kind_of(URI::Generic) + telnet.should.is_a?(URI::Generic) URISpec.components(telnet).should == { scheme: "telnet", userinfo: nil, @@ -187,13 +187,20 @@ describe :uri_parse, shared: true do # files file_l = @object.parse('file:///foo/bar.txt') - file_l.should be_kind_of(URI::Generic) + file_l.should.is_a?(URI::Generic) file = @object.parse('file:/foo/bar.txt') - file.should be_kind_of(URI::Generic) + file.should.is_a?(URI::Generic) end - it "raises errors on malformed URIs" do - lambda { @object.parse('http://a_b:80/') }.should raise_error(URI::InvalidURIError) - lambda { @object.parse('http://a_b/') }.should raise_error(URI::InvalidURIError) + if URI::DEFAULT_PARSER == URI::RFC2396_Parser + it "raises errors on malformed URIs" do + -> { @object.parse('http://a_b:80/') }.should.raise(URI::InvalidURIError) + -> { @object.parse('http://a_b/') }.should.raise(URI::InvalidURIError) + end + elsif URI::DEFAULT_PARSER == URI::RFC3986_Parser + it "does not raise errors on URIs contained underscore" do + -> { @object.parse('http://a_b:80/') }.should_not.raise(URI::InvalidURIError) + -> { @object.parse('http://a_b/') }.should_not.raise(URI::InvalidURIError) + end end end diff --git a/spec/ruby/library/uri/uri_spec.rb b/spec/ruby/library/uri/uri_spec.rb index 93ba07a207..eab4e7176c 100644 --- a/spec/ruby/library/uri/uri_spec.rb +++ b/spec/ruby/library/uri/uri_spec.rb @@ -19,11 +19,11 @@ describe "the URI method" do it "returns the argument if it is a URI object" do result = URI.parse("http://ruby-lang.org") - URI(result).should equal(result) + URI(result).should.equal?(result) end #apparently this was a concern? imported from MRI tests it "does not add a URI method to Object instances" do - lambda {Object.new.URI("http://ruby-lang.org/")}.should raise_error(NoMethodError) + -> {Object.new.URI("http://ruby-lang.org/")}.should.raise(NoMethodError) end end diff --git a/spec/ruby/library/weakref/__getobj___spec.rb b/spec/ruby/library/weakref/__getobj___spec.rb index 4ed0bc6afb..fa507384c2 100644 --- a/spec/ruby/library/weakref/__getobj___spec.rb +++ b/spec/ruby/library/weakref/__getobj___spec.rb @@ -5,13 +5,13 @@ describe "WeakRef#__getobj__" do it "returns the object if it is reachable" do obj = Object.new ref = WeakRef.new(obj) - ref.__getobj__.should equal(obj) + ref.__getobj__.should.equal?(obj) end it "raises WeakRef::RefError if the object is no longer reachable" do ref = WeakRefSpec.make_dead_weakref - lambda { + -> { ref.__getobj__ - }.should raise_error(WeakRef::RefError) + }.should.raise(WeakRef::RefError) end end diff --git a/spec/ruby/library/weakref/allocate_spec.rb b/spec/ruby/library/weakref/allocate_spec.rb index 76e81c4e5e..0438d093c4 100644 --- a/spec/ruby/library/weakref/allocate_spec.rb +++ b/spec/ruby/library/weakref/allocate_spec.rb @@ -3,6 +3,6 @@ require 'weakref' describe "WeakRef#allocate" do it "assigns nil as the reference" do - lambda { WeakRef.allocate.__getobj__ }.should raise_error(WeakRef::RefError) + -> { WeakRef.allocate.__getobj__ }.should.raise(WeakRef::RefError) end end diff --git a/spec/ruby/library/weakref/fixtures/classes.rb b/spec/ruby/library/weakref/fixtures/classes.rb index 560c58b041..041afab14d 100644 --- a/spec/ruby/library/weakref/fixtures/classes.rb +++ b/spec/ruby/library/weakref/fixtures/classes.rb @@ -13,9 +13,11 @@ class WeakRefSpec def self.make_dead_weakref weaks = [] weak = nil - 10_000.times do + 1000.times do weaks << make_weakref - GC.start + end + + 1000.times do GC.start break if weak = weaks.find { |w| !w.weakref_alive? } end diff --git a/spec/ruby/library/weakref/send_spec.rb b/spec/ruby/library/weakref/send_spec.rb index 079958ac88..da8660066f 100644 --- a/spec/ruby/library/weakref/send_spec.rb +++ b/spec/ruby/library/weakref/send_spec.rb @@ -27,11 +27,11 @@ describe "WeakRef#__send__" do it "delegates to protected methods of the weakly-referenced object" do wr = WeakRef.new(WeakRefSpecs) - lambda { wr.protected_method }.should raise_error(NameError) + -> { wr.protected_method }.should.raise(NameError) end it "does not delegate to private methods of the weakly-referenced object" do wr = WeakRef.new(WeakRefSpecs) - lambda { wr.private_method }.should raise_error(NameError) + -> { wr.private_method }.should.raise(NameError) end end diff --git a/spec/ruby/library/weakref/weakref_alive_spec.rb b/spec/ruby/library/weakref/weakref_alive_spec.rb index 5bd7c3166b..1b12ffbbec 100644 --- a/spec/ruby/library/weakref/weakref_alive_spec.rb +++ b/spec/ruby/library/weakref/weakref_alive_spec.rb @@ -8,8 +8,8 @@ describe "WeakRef#weakref_alive?" do ref.weakref_alive?.should == true end - it "returns a falsey value if the object is no longer reachable" do + it "returns a falsy value if the object is no longer reachable" do ref = WeakRefSpec.make_dead_weakref - [false, nil].should include(ref.weakref_alive?) + [false, nil].should.include?(ref.weakref_alive?) end end diff --git a/spec/ruby/library/win32ole/fixtures/classes.rb b/spec/ruby/library/win32ole/fixtures/classes.rb index 139aa1225c..5a16fcca45 100644 --- a/spec/ruby/library/win32ole/fixtures/classes.rb +++ b/spec/ruby/library/win32ole/fixtures/classes.rb @@ -1,13 +1,25 @@ require 'win32ole' +# win32ole deprecated constants like WIN32OLE_TYPELIB in Ruby 3.4 +# but only added the replacements like WIN32OLE::TypeLib in Ruby 3.4. +# So we use the new-style constants in specs to avoid deprecation warnings +# and we define the new-style constants as the old ones if they don't exist yet. +WIN32OLE::TypeLib ||= WIN32OLE_TYPELIB +WIN32OLE::RuntimeError ||= WIN32OLERuntimeError +WIN32OLE::Method ||= WIN32OLE_METHOD +WIN32OLE::Type ||= WIN32OLE_TYPE +WIN32OLE::Event ||= WIN32OLE_EVENT +WIN32OLE::Param ||= WIN32OLE_PARAM + module WIN32OLESpecs - MSXML_AVAILABLE = !!WIN32OLE_TYPELIB.typelibs.find { |t| t.name.start_with?('Microsoft XML') } + MSXML_AVAILABLE = WIN32OLE::TypeLib.typelibs.any? { |t| t.name.start_with?('Microsoft XML') } + SYSTEM_MONITOR_CONTROL_AVAILABLE = WIN32OLE::TypeLib.typelibs.any? { |t| t.name.start_with?('System Monitor Control') } def self.new_ole(name) tries = 0 begin WIN32OLE.new(name) - rescue WIN32OLERuntimeError => e + rescue WIN32OLE::RuntimeError => e if tries < 3 tries += 1 $stderr.puts "WIN32OLESpecs#new_ole retry (#{tries}): #{e.class}: #{e.message}" diff --git a/spec/ruby/library/win32ole/win32ole/_getproperty_spec.rb b/spec/ruby/library/win32ole/win32ole/_getproperty_spec.rb index 940eebfb91..52cb978bea 100644 --- a/spec/ruby/library/win32ole/win32ole/_getproperty_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/_getproperty_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' diff --git a/spec/ruby/library/win32ole/win32ole/_invoke_spec.rb b/spec/ruby/library/win32ole/win32ole/_invoke_spec.rb index 9809f89e7c..747121aeba 100644 --- a/spec/ruby/library/win32ole/win32ole/_invoke_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/_invoke_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,9 +8,9 @@ platform_is :windows do end it "raises ArgumentError if insufficient number of arguments are given" do - lambda { @shell._invoke() }.should raise_error ArgumentError - lambda { @shell._invoke(0) }.should raise_error ArgumentError - lambda { @shell._invoke(0, []) }.should raise_error ArgumentError + -> { @shell._invoke() }.should.raise ArgumentError + -> { @shell._invoke(0) }.should.raise ArgumentError + -> { @shell._invoke(0, []) }.should.raise ArgumentError end it "dispatches the method bound to a specific ID" do diff --git a/spec/ruby/library/win32ole/win32ole/codepage_spec.rb b/spec/ruby/library/win32ole/win32ole/codepage_spec.rb index 4e0cf5ca55..07e93646ac 100644 --- a/spec/ruby/library/win32ole/win32ole/codepage_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/codepage_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' diff --git a/spec/ruby/library/win32ole/win32ole/connect_spec.rb b/spec/ruby/library/win32ole/win32ole/connect_spec.rb index 590ef7688c..3a1caf85d3 100644 --- a/spec/ruby/library/win32ole/win32ole/connect_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/connect_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' describe "WIN32OLE.connect" do it "creates WIN32OLE object given valid argument" do obj = WIN32OLE.connect("winmgmts:") - obj.should be_kind_of WIN32OLE + obj.should.is_a? WIN32OLE end it "raises TypeError when given invalid argument" do - lambda { WIN32OLE.connect 1 }.should raise_error TypeError + -> { WIN32OLE.connect 1 }.should.raise TypeError end end diff --git a/spec/ruby/library/win32ole/win32ole/const_load_spec.rb b/spec/ruby/library/win32ole/win32ole/const_load_spec.rb index cacc7a2b22..b0ba023536 100644 --- a/spec/ruby/library/win32ole/win32ole/const_load_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/const_load_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,9 +8,9 @@ platform_is :windows do end it "loads constant SsfWINDOWS into WIN32OLE namespace" do - WIN32OLE.const_defined?(:SsfWINDOWS).should be_false + WIN32OLE.const_defined?(:SsfWINDOWS).should == false WIN32OLE.const_load @win32ole - WIN32OLE.const_defined?(:SsfWINDOWS).should be_true + WIN32OLE.const_defined?(:SsfWINDOWS).should == true end end @@ -22,9 +23,9 @@ platform_is :windows do it "loads constants into given namespace" do module WIN32OLE_RUBYSPEC; end - WIN32OLE_RUBYSPEC.const_defined?(:SsfWINDOWS).should be_false + WIN32OLE_RUBYSPEC.const_defined?(:SsfWINDOWS).should == false WIN32OLE.const_load @win32ole, WIN32OLE_RUBYSPEC - WIN32OLE_RUBYSPEC.const_defined?(:SsfWINDOWS).should be_true + WIN32OLE_RUBYSPEC.const_defined?(:SsfWINDOWS).should == true end end diff --git a/spec/ruby/library/win32ole/win32ole/constants_spec.rb b/spec/ruby/library/win32ole/win32ole/constants_spec.rb index 978b7ade92..8533741440 100644 --- a/spec/ruby/library/win32ole/win32ole/constants_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/constants_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' diff --git a/spec/ruby/library/win32ole/win32ole/create_guid_spec.rb b/spec/ruby/library/win32ole/win32ole/create_guid_spec.rb index 2e18b6ab11..8aa853df9e 100644 --- a/spec/ruby/library/win32ole/win32ole/create_guid_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/create_guid_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' diff --git a/spec/ruby/library/win32ole/win32ole/invoke_spec.rb b/spec/ruby/library/win32ole/win32ole/invoke_spec.rb index 08a5156e05..d6ff7fade3 100644 --- a/spec/ruby/library/win32ole/win32ole/invoke_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/invoke_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' diff --git a/spec/ruby/library/win32ole/win32ole/locale_spec.rb b/spec/ruby/library/win32ole/win32ole/locale_spec.rb index a0376ce123..390c41d1a2 100644 --- a/spec/ruby/library/win32ole/win32ole/locale_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/locale_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -12,14 +13,14 @@ platform_is :windows do begin begin WIN32OLE.locale = 1041 - rescue WIN32OLERuntimeError + rescue WIN32OLE::RuntimeError STDERR.puts("\n#{__FILE__}:#{__LINE__}:#{self.class.name}.test_s_locale_set is skipped(Japanese locale is not installed)") return end WIN32OLE.locale.should == 1041 WIN32OLE.locale = WIN32OLE::LOCALE_SYSTEM_DEFAULT - lambda { WIN32OLE.locale = 111 }.should raise_error WIN32OLERuntimeError + -> { WIN32OLE.locale = 111 }.should.raise WIN32OLE::RuntimeError WIN32OLE.locale.should == WIN32OLE::LOCALE_SYSTEM_DEFAULT ensure WIN32OLE.locale.should == WIN32OLE::LOCALE_SYSTEM_DEFAULT diff --git a/spec/ruby/library/win32ole/win32ole/new_spec.rb b/spec/ruby/library/win32ole/win32ole/new_spec.rb index cb45488288..4f54c724d9 100644 --- a/spec/ruby/library/win32ole/win32ole/new_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/new_spec.rb @@ -1,23 +1,24 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' describe "WIN32OLESpecs.new_ole" do it "creates a WIN32OLE object from OLE server name" do shell = WIN32OLESpecs.new_ole 'Shell.Application' - shell.should be_kind_of WIN32OLE + shell.should.is_a? WIN32OLE end it "creates a WIN32OLE object from valid CLSID" do shell = WIN32OLESpecs.new_ole("{13709620-C279-11CE-A49E-444553540000}") - shell.should be_kind_of WIN32OLE + shell.should.is_a? WIN32OLE end it "raises TypeError if argument cannot be converted to String" do - lambda { WIN32OLESpecs.new_ole(42) }.should raise_error( TypeError ) + -> { WIN32OLESpecs.new_ole(42) }.should.raise( TypeError ) end - it "raises WIN32OLERuntimeError if invalid string is given" do - lambda { WIN32OLESpecs.new_ole('foo') }.should raise_error( WIN32OLERuntimeError ) + it "raises WIN32OLE::RuntimeError if invalid string is given" do + -> { WIN32OLE.new('foo') }.should.raise( WIN32OLE::RuntimeError ) end end diff --git a/spec/ruby/library/win32ole/win32ole/ole_func_methods_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_func_methods_spec.rb index 5488c4fd29..33e3e23b1b 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_func_methods_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_func_methods_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,15 +8,15 @@ platform_is :windows do end it "raises ArgumentError if argument is given" do - lambda { @dict.ole_func_methods(1) }.should raise_error ArgumentError + -> { @dict.ole_func_methods(1) }.should.raise ArgumentError end - it "returns an array of WIN32OLE_METHODs" do - @dict.ole_func_methods.all? { |m| m.kind_of? WIN32OLE_METHOD }.should be_true + it "returns an array of WIN32OLE::Methods" do + @dict.ole_func_methods.all? { |m| m.kind_of? WIN32OLE::Method }.should == true end it "contains a 'AddRef' method for Scripting Dictionary" do - @dict.ole_func_methods.map { |m| m.name }.include?('AddRef').should be_true + @dict.ole_func_methods.map { |m| m.name }.include?('AddRef').should == true end end end diff --git a/spec/ruby/library/win32ole/win32ole/ole_get_methods_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_get_methods_spec.rb index a991624a23..168a225d58 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_get_methods_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_get_methods_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,8 +8,8 @@ platform_is :windows do @win32ole = WIN32OLESpecs.new_ole('Shell.Application') end - it "returns an array of WIN32OLE_METHOD objects" do - @win32ole.ole_get_methods.all? {|m| m.kind_of? WIN32OLE_METHOD}.should be_true + it "returns an array of WIN32OLE::Method objects" do + @win32ole.ole_get_methods.all? {|m| m.kind_of? WIN32OLE::Method}.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole/ole_method_help_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_method_help_spec.rb index 8a26d79a20..9cb3f9e6cf 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_method_help_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_method_help_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' require_relative 'shared/ole_method' diff --git a/spec/ruby/library/win32ole/win32ole/ole_method_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_method_spec.rb index f82a212f5d..e48ff8d905 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_method_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_method_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' require_relative 'shared/ole_method' diff --git a/spec/ruby/library/win32ole/win32ole/ole_methods_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_methods_spec.rb index b2baac265e..5152deeaf4 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_methods_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_methods_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,15 +8,15 @@ platform_is :windows do end it "raises ArgumentError if argument is given" do - lambda { @dict.ole_methods(1) }.should raise_error ArgumentError + -> { @dict.ole_methods(1) }.should.raise ArgumentError end - it "returns an array of WIN32OLE_METHODs" do - @dict.ole_methods.all? { |m| m.kind_of? WIN32OLE_METHOD }.should be_true + it "returns an array of WIN32OLE::Methods" do + @dict.ole_methods.all? { |m| m.kind_of? WIN32OLE::Method }.should == true end it "contains a 'AddRef' method for Scripting Dictionary" do - @dict.ole_methods.map { |m| m.name }.include?('AddRef').should be_true + @dict.ole_methods.map { |m| m.name }.include?('AddRef').should == true end end end diff --git a/spec/ruby/library/win32ole/win32ole/ole_obj_help_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_obj_help_spec.rb index 2d31aac9eb..1478804b55 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_obj_help_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_obj_help_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -8,11 +9,11 @@ platform_is :windows do end it "raises ArgumentError if argument is given" do - lambda { @dict.ole_obj_help(1) }.should raise_error ArgumentError + -> { @dict.ole_obj_help(1) }.should.raise ArgumentError end - it "returns an instance of WIN32OLE_TYPE" do - @dict.ole_obj_help.kind_of?(WIN32OLE_TYPE).should be_true + it "returns an instance of WIN32OLE::Type" do + @dict.ole_obj_help.kind_of?(WIN32OLE::Type).should == true end end end diff --git a/spec/ruby/library/win32ole/win32ole/ole_put_methods_spec.rb b/spec/ruby/library/win32ole/win32ole/ole_put_methods_spec.rb index 45af41c6c2..b03a5d4b06 100644 --- a/spec/ruby/library/win32ole/win32ole/ole_put_methods_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/ole_put_methods_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' @@ -7,15 +8,15 @@ platform_is :windows do end it "raises ArgumentError if argument is given" do - lambda { @dict.ole_put_methods(1) }.should raise_error ArgumentError + -> { @dict.ole_put_methods(1) }.should.raise ArgumentError end - it "returns an array of WIN32OLE_METHODs" do - @dict.ole_put_methods.all? { |m| m.kind_of? WIN32OLE_METHOD }.should be_true + it "returns an array of WIN32OLE::Methods" do + @dict.ole_put_methods.all? { |m| m.kind_of? WIN32OLE::Method }.should == true end it "contains a 'Key' method for Scripting Dictionary" do - @dict.ole_put_methods.map { |m| m.name }.include?('Key').should be_true + @dict.ole_put_methods.map { |m| m.name }.include?('Key').should == true end end end diff --git a/spec/ruby/library/win32ole/win32ole/setproperty_spec.rb b/spec/ruby/library/win32ole/win32ole/setproperty_spec.rb index 7409823f20..bacdee63da 100644 --- a/spec/ruby/library/win32ole/win32ole/setproperty_spec.rb +++ b/spec/ruby/library/win32ole/win32ole/setproperty_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' require_relative 'shared/setproperty' diff --git a/spec/ruby/library/win32ole/win32ole/shared/ole_method.rb b/spec/ruby/library/win32ole/win32ole/shared/ole_method.rb index 26566a0b14..9e4b7e7c20 100644 --- a/spec/ruby/library/win32ole/win32ole/shared/ole_method.rb +++ b/spec/ruby/library/win32ole/win32ole/shared/ole_method.rb @@ -7,12 +7,12 @@ platform_is :windows do end it "raises ArgumentError if no argument is given" do - lambda { @dict.send(@method) }.should raise_error ArgumentError + -> { @dict.send(@method) }.should.raise ArgumentError end - it "returns the WIN32OLE_METHOD 'Add' if given 'Add'" do + it "returns the WIN32OLE::Method 'Add' if given 'Add'" do result = @dict.send(@method, "Add") - result.kind_of?(WIN32OLE_METHOD).should be_true + result.kind_of?(WIN32OLE::Method).should == true result.name.should == 'Add' end end diff --git a/spec/ruby/library/win32ole/win32ole/shared/setproperty.rb b/spec/ruby/library/win32ole/win32ole/shared/setproperty.rb index b850d21933..de3ad7b286 100644 --- a/spec/ruby/library/win32ole/win32ole/shared/setproperty.rb +++ b/spec/ruby/library/win32ole/win32ole/shared/setproperty.rb @@ -7,7 +7,7 @@ platform_is :windows do end it "raises ArgumentError if no argument is given" do - lambda { @dict.send(@method) }.should raise_error ArgumentError + -> { @dict.send(@method) }.should.raise ArgumentError end it "sets key to newkey and returns nil" do diff --git a/spec/ruby/library/win32ole/win32ole_event/new_spec.rb b/spec/ruby/library/win32ole/win32ole_event/new_spec.rb index 4ce11a716b..d09c38b78d 100644 --- a/spec/ruby/library/win32ole/win32ole_event/new_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_event/new_spec.rb @@ -1,8 +1,9 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' guard -> { WIN32OLESpecs::MSXML_AVAILABLE } do - describe "WIN32OLE_EVENT.new" do + describe "WIN32OLE::Event.new" do before :all do @xml_dom = WIN32OLESpecs.new_ole('MSXML.DOMDocument') end @@ -12,21 +13,21 @@ platform_is :windows do end it "raises TypeError given invalid argument" do - lambda { WIN32OLE_EVENT.new "A" }.should raise_error TypeError + -> { WIN32OLE::Event.new "A" }.should.raise TypeError end it "raises RuntimeError if event does not exist" do - lambda { WIN32OLE_EVENT.new(@xml_dom, 'A') }.should raise_error RuntimeError + -> { WIN32OLE::Event.new(@xml_dom, 'A') }.should.raise RuntimeError end it "raises RuntimeError if OLE object has no events" do dict = WIN32OLESpecs.new_ole('Scripting.Dictionary') - lambda { WIN32OLE_EVENT.new(dict) }.should raise_error RuntimeError + -> { WIN32OLE::Event.new(dict) }.should.raise RuntimeError end - it "creates WIN32OLE_EVENT object" do - ev = WIN32OLE_EVENT.new(@xml_dom) - ev.should be_kind_of WIN32OLE_EVENT + it "creates WIN32OLE::Event object" do + ev = WIN32OLE::Event.new(@xml_dom) + ev.should.is_a? WIN32OLE::Event end end end diff --git a/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb b/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb index feb26b0637..acc7d2d6b6 100644 --- a/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require_relative '../fixtures/classes' guard -> { WIN32OLESpecs::MSXML_AVAILABLE } do @@ -14,7 +15,7 @@ platform_is :windows do @event_spec_alt = "spec_alt" end - describe "WIN32OLE_EVENT#on_event" do + describe "WIN32OLE::Event#on_event" do before :all do @fn_xml = File.absolute_path "../fixtures/event.xml", __dir__ end @@ -22,7 +23,7 @@ platform_is :windows do before :each do @xml_dom = WIN32OLESpecs.new_ole 'MSXML.DOMDocument' @xml_dom.async = true - @ev = WIN32OLE_EVENT.new @xml_dom + @ev = WIN32OLE::Event.new @xml_dom @event_global = '' @event_specific = '' @event_spec_alt = '' @@ -36,21 +37,21 @@ platform_is :windows do it "sets global event handler properly, and the handler is invoked by event loop" do @ev.on_event { |*args| handler_global(*args) } @xml_dom.loadXML "<program><name>Ruby</name><version>trunk</version></program>" - WIN32OLE_EVENT.message_loop + WIN32OLE::Event.message_loop @event_global.should =~ /onreadystatechange/ end it "accepts a String argument and the handler is invoked by event loop" do @ev.on_event("onreadystatechange") { |*args| @event = 'foo' } @xml_dom.loadXML "<program><name>Ruby</name><version>trunk</version></program>" - WIN32OLE_EVENT.message_loop + WIN32OLE::Event.message_loop @event.should =~ /foo/ end it "accepts a Symbol argument and the handler is invoked by event loop" do @ev.on_event(:onreadystatechange) { |*args| @event = 'bar' } @xml_dom.loadXML "<program><name>Ruby</name><version>trunk</version></program>" - WIN32OLE_EVENT.message_loop + WIN32OLE::Event.message_loop @event.should =~ /bar/ end @@ -59,7 +60,7 @@ platform_is :windows do @ev.on_event("onreadystatechange") { |*args| handler_specific(*args) } @ev.on_event("onreadystatechange") { |*args| handler_spec_alt(*args) } @xml_dom.load @fn_xml - WIN32OLE_EVENT.message_loop + WIN32OLE::Event.message_loop @event_global.should == 'ondataavailable' @event_global.should_not =~ /onreadystatechange/ @event_specific.should == '' diff --git a/spec/ruby/library/win32ole/win32ole_method/dispid_spec.rb b/spec/ruby/library/win32ole/win32ole_method/dispid_spec.rb index 840cdf72b8..43084eb943 100644 --- a/spec/ruby/library/win32ole/win32ole_method/dispid_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/dispid_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#dispid" do + describe "WIN32OLE::Method#dispid" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m = WIN32OLE_METHOD.new(ole_type, "namespace") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m = WIN32OLE::Method.new(ole_type, "namespace") end it "raises ArgumentError if argument is given" do - lambda { @m.dispid(0) }.should raise_error ArgumentError + -> { @m.dispid(0) }.should.raise ArgumentError end it "returns expected dispatch ID for Shell's 'namespace' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/event_interface_spec.rb b/spec/ruby/library/win32ole/win32ole_method/event_interface_spec.rb index 9d3ca2b8e4..1d00fb9696 100644 --- a/spec/ruby/library/win32ole/win32ole_method/event_interface_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/event_interface_spec.rb @@ -1,26 +1,29 @@ +require_relative "../../../spec_helper" platform_is :windows do - require 'win32ole' + require_relative '../fixtures/classes' + guard -> { WIN32OLESpecs::SYSTEM_MONITOR_CONTROL_AVAILABLE } do - describe "WIN32OLE_METHOD#event_interface" do - before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Internet Controls", "WebBrowser") - @navigate_method = WIN32OLE_METHOD.new(ole_type, "NavigateComplete") - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @namespace_method = WIN32OLE_METHOD.new(ole_type, "namespace") - end + describe "WIN32OLE::Method#event_interface" do + before :each do + ole_type = WIN32OLE::Type.new("System Monitor Control", "SystemMonitor") + @on_dbl_click_method = WIN32OLE::Method.new(ole_type, "OnDblClick") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @namespace_method = WIN32OLE::Method.new(ole_type, "namespace") + end - it "raises ArgumentError if argument is given" do - lambda { @navigate_method.event_interface(1) }.should raise_error ArgumentError - end + it "raises ArgumentError if argument is given" do + -> { @on_dbl_click_method.event_interface(1) }.should.raise ArgumentError + end - it "returns expected string for browser's 'NavigateComplete' method" do - @navigate_method.event_interface.should == "DWebBrowserEvents" - end + it "returns expected string for System Monitor Control's 'OnDblClick' method" do + @on_dbl_click_method.event_interface.should == "DISystemMonitorEvents" + end - it "returns nil if method has no event interface" do - @namespace_method.event_interface.should be_nil - end + it "returns nil if method has no event interface" do + @namespace_method.event_interface.should == nil + end + end end end diff --git a/spec/ruby/library/win32ole/win32ole_method/event_spec.rb b/spec/ruby/library/win32ole/win32ole_method/event_spec.rb index 25435438aa..fd611519cb 100644 --- a/spec/ruby/library/win32ole/win32ole_method/event_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/event_spec.rb @@ -1,20 +1,23 @@ +require_relative "../../../spec_helper" platform_is :windows do - require 'win32ole' + require_relative '../fixtures/classes' + guard -> { WIN32OLESpecs::SYSTEM_MONITOR_CONTROL_AVAILABLE } do - describe "WIN32OLE_METHOD#event?" do - before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Internet Controls", "WebBrowser") - @navigate_method = WIN32OLE_METHOD.new(ole_type, "NavigateComplete") - end + describe "WIN32OLE::Method#event?" do + before :each do + ole_type = WIN32OLE::Type.new("System Monitor Control", "SystemMonitor") + @on_dbl_click_method = WIN32OLE::Method.new(ole_type, "OnDblClick") + end - it "raises ArgumentError if argument is given" do - lambda { @navigate_method.event?(1) }.should raise_error ArgumentError - end + it "raises ArgumentError if argument is given" do + -> { @on_dbl_click_method.event?(1) }.should.raise ArgumentError + end - it "returns true for browser's 'NavigateComplete' method" do - @navigate_method.event?.should be_true - end + it "returns true for System Monitor Control's 'OnDblClick' method" do + @on_dbl_click_method.event?.should == true + end + end end end diff --git a/spec/ruby/library/win32ole/win32ole_method/helpcontext_spec.rb b/spec/ruby/library/win32ole/win32ole_method/helpcontext_spec.rb index c0e66a7a18..88164bcd1f 100644 --- a/spec/ruby/library/win32ole/win32ole_method/helpcontext_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/helpcontext_spec.rb @@ -1,20 +1,21 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#helpcontext" do + describe "WIN32OLE::Method#helpcontext" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Internet Controls", "WebBrowser") - @navigate_method = WIN32OLE_METHOD.new(ole_type, "NavigateComplete") - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + @get_file_version = WIN32OLE::Method.new(ole_type, "GetFileVersion") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @navigate_method.helpcontext(1) }.should raise_error ArgumentError + -> { @get_file_version.helpcontext(1) }.should.raise ArgumentError end - it "returns expected value for browser's 'NavigateComplete' method" do - @navigate_method.helpcontext.should == 0 + it "returns expected value for FileSystemObject's 'GetFileVersion' method" do + @get_file_version.helpcontext.should == 0 end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/helpfile_spec.rb b/spec/ruby/library/win32ole/win32ole_method/helpfile_spec.rb index 72cc4da16b..314f58c062 100644 --- a/spec/ruby/library/win32ole/win32ole_method/helpfile_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/helpfile_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#helpfile" do + describe "WIN32OLE::Method#helpfile" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.helpfile(1) }.should raise_error ArgumentError + -> { @m_file_name.helpfile(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'File' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/helpstring_spec.rb b/spec/ruby/library/win32ole/win32ole_method/helpstring_spec.rb index 60105d0aa2..2a93acdb37 100644 --- a/spec/ruby/library/win32ole/win32ole_method/helpstring_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/helpstring_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#helpstring" do + describe "WIN32OLE::Method#helpstring" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.helpstring(1) }.should raise_error ArgumentError + -> { @m_file_name.helpstring(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'File' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/invkind_spec.rb b/spec/ruby/library/win32ole/win32ole_method/invkind_spec.rb index cf0a74bbce..16e5412a36 100644 --- a/spec/ruby/library/win32ole/win32ole_method/invkind_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/invkind_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#invkind" do + describe "WIN32OLE::Method#invkind" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.invkind(1) }.should raise_error ArgumentError + -> { @m_file_name.invkind(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/invoke_kind_spec.rb b/spec/ruby/library/win32ole/win32ole_method/invoke_kind_spec.rb index 4d2af8fb0c..312860a9c5 100644 --- a/spec/ruby/library/win32ole/win32ole_method/invoke_kind_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/invoke_kind_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#invoke_kind" do + describe "WIN32OLE::Method#invoke_kind" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.invoke_kind(1) }.should raise_error ArgumentError + -> { @m_file_name.invoke_kind(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/name_spec.rb b/spec/ruby/library/win32ole/win32ole_method/name_spec.rb index cd5404fc54..6e2e233a62 100644 --- a/spec/ruby/library/win32ole/win32ole_method/name_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/name_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#name" do + describe "WIN32OLE::Method#name" do it_behaves_like :win32ole_method_name, :name end diff --git a/spec/ruby/library/win32ole/win32ole_method/new_spec.rb b/spec/ruby/library/win32ole/win32ole_method/new_spec.rb index f904107c6c..d805d80128 100644 --- a/spec/ruby/library/win32ole/win32ole_method/new_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/new_spec.rb @@ -1,31 +1,32 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD.new" do + describe "WIN32OLE::Method.new" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end it "raises TypeError when given non-strings" do - lambda { WIN32OLE_METHOD.new(1, 2) }.should raise_error TypeError + -> { WIN32OLE::Method.new(1, 2) }.should.raise TypeError end it "raises ArgumentError if only 1 argument is given" do - lambda { WIN32OLE_METHOD.new("hello") }.should raise_error ArgumentError - lambda { WIN32OLE_METHOD.new(@ole_type) }.should raise_error ArgumentError + -> { WIN32OLE::Method.new("hello") }.should.raise ArgumentError + -> { WIN32OLE::Method.new(@ole_type) }.should.raise ArgumentError end - it "returns a valid WIN32OLE_METHOD object" do - WIN32OLE_METHOD.new(@ole_type, "Open").should be_kind_of WIN32OLE_METHOD - WIN32OLE_METHOD.new(@ole_type, "open").should be_kind_of WIN32OLE_METHOD + it "returns a valid WIN32OLE::Method object" do + WIN32OLE::Method.new(@ole_type, "Open").should.is_a? WIN32OLE::Method + WIN32OLE::Method.new(@ole_type, "open").should.is_a? WIN32OLE::Method end - it "raises WIN32OLERuntimeError if the method does not exist" do - lambda { WIN32OLE_METHOD.new(@ole_type, "NonexistentMethod") }.should raise_error WIN32OLERuntimeError + it "raises WIN32OLE::RuntimeError if the method does not exist" do + -> { WIN32OLE::Method.new(@ole_type, "NonexistentMethod") }.should.raise WIN32OLE::RuntimeError end it "raises TypeError if second argument is not a String" do - lambda { WIN32OLE_METHOD.new(@ole_type, 5) }.should raise_error TypeError + -> { WIN32OLE::Method.new(@ole_type, 5) }.should.raise TypeError end end diff --git a/spec/ruby/library/win32ole/win32ole_method/offset_vtbl_spec.rb b/spec/ruby/library/win32ole/win32ole_method/offset_vtbl_spec.rb index f94e48c051..7c7e49ff3a 100644 --- a/spec/ruby/library/win32ole/win32ole_method/offset_vtbl_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/offset_vtbl_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#offset_vtbl" do + describe "WIN32OLE::Method#offset_vtbl" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.offset_vtbl(1) }.should raise_error ArgumentError + -> { @m_file_name.offset_vtbl(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/params_spec.rb b/spec/ruby/library/win32ole/win32ole_method/params_spec.rb index 08c7f04bdd..40a543fa55 100644 --- a/spec/ruby/library/win32ole/win32ole_method/params_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/params_spec.rb @@ -1,25 +1,26 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#params" do + describe "WIN32OLE::Method#params" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.params(1) }.should raise_error ArgumentError + -> { @m_file_name.params(1) }.should.raise ArgumentError end it "returns empty array for Scripting Runtime's 'name' method" do - @m_file_name.params.should be_kind_of Array - @m_file_name.params.should be_empty + @m_file_name.params.should.is_a? Array + @m_file_name.params.should.empty? end - it "returns 4-element array of WIN32OLE_PARAM for Shell's 'BrowseForFolder' method" do - @m_browse_for_folder.params.all? { |p| p.kind_of? WIN32OLE_PARAM }.should be_true + it "returns 4-element array of WIN32OLE::Param for Shell's 'BrowseForFolder' method" do + @m_browse_for_folder.params.all? { |p| p.kind_of? WIN32OLE::Param }.should == true @m_browse_for_folder.params.size == 4 end diff --git a/spec/ruby/library/win32ole/win32ole_method/return_type_detail_spec.rb b/spec/ruby/library/win32ole/win32ole_method/return_type_detail_spec.rb index b8f2bbe084..6d46c705c6 100644 --- a/spec/ruby/library/win32ole/win32ole_method/return_type_detail_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/return_type_detail_spec.rb @@ -1,18 +1,19 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#return_type_detail" do + describe "WIN32OLE::Method#return_type_detail" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_browse_for_folder.return_type_detail(1) }.should raise_error ArgumentError + -> { @m_browse_for_folder.return_type_detail(1) }.should.raise ArgumentError end it "returns expected value for Shell Control's 'BrowseForFolder' method" do - @m_browse_for_folder.return_type_detail.should be_kind_of Array + @m_browse_for_folder.return_type_detail.should.is_a? Array @m_browse_for_folder.return_type_detail.should == ['PTR', 'USERDEFINED', 'Folder'] end diff --git a/spec/ruby/library/win32ole/win32ole_method/return_type_spec.rb b/spec/ruby/library/win32ole/win32ole_method/return_type_spec.rb index b68481fe59..5afaf202f2 100644 --- a/spec/ruby/library/win32ole/win32ole_method/return_type_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/return_type_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#return_type" do + describe "WIN32OLE::Method#return_type" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.return_type(1) }.should raise_error ArgumentError + -> { @m_file_name.return_type(1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/return_vtype_spec.rb b/spec/ruby/library/win32ole/win32ole_method/return_vtype_spec.rb index f236de01f9..882b5eaf43 100644 --- a/spec/ruby/library/win32ole/win32ole_method/return_vtype_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/return_vtype_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#return_vtype" do + describe "WIN32OLE::Method#return_vtype" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_browse_for_folder.return_vtype(1) }.should raise_error ArgumentError + -> { @m_browse_for_folder.return_vtype(1) }.should.raise ArgumentError end it "returns expected value for Shell Control's 'BrowseForFolder' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/shared/name.rb b/spec/ruby/library/win32ole/win32ole_method/shared/name.rb index 2be6478a6e..ef63999836 100644 --- a/spec/ruby/library/win32ole/win32ole_method/shared/name.rb +++ b/spec/ruby/library/win32ole/win32ole_method/shared/name.rb @@ -3,12 +3,12 @@ platform_is :windows do describe :win32ole_method_name, shared: true do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "File") - @m_file_name = WIN32OLE_METHOD.new(ole_type, "name") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "File") + @m_file_name = WIN32OLE::Method.new(ole_type, "name") end it "raises ArgumentError if argument is given" do - lambda { @m_file_name.send(@method, 1) }.should raise_error ArgumentError + -> { @m_file_name.send(@method, 1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/size_opt_params_spec.rb b/spec/ruby/library/win32ole/win32ole_method/size_opt_params_spec.rb index a63c50474c..e03a97c6c0 100644 --- a/spec/ruby/library/win32ole/win32ole_method/size_opt_params_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/size_opt_params_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#size_opt_params" do + describe "WIN32OLE::Method#size_opt_params" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_browse_for_folder.size_opt_params(1) }.should raise_error ArgumentError + -> { @m_browse_for_folder.size_opt_params(1) }.should.raise ArgumentError end it "returns expected value for Shell Control's 'BrowseForFolder' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/size_params_spec.rb b/spec/ruby/library/win32ole/win32ole_method/size_params_spec.rb index fe93d5bc66..f64f77af46 100644 --- a/spec/ruby/library/win32ole/win32ole_method/size_params_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/size_params_spec.rb @@ -1,14 +1,15 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#size_params" do + describe "WIN32OLE::Method#size_params" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_browse_for_folder.size_params(1) }.should raise_error ArgumentError + -> { @m_browse_for_folder.size_params(1) }.should.raise ArgumentError end it "returns expected value for Shell Control's 'BrowseForFolder' method" do diff --git a/spec/ruby/library/win32ole/win32ole_method/to_s_spec.rb b/spec/ruby/library/win32ole/win32ole_method/to_s_spec.rb index ecb3c08038..cdcc4525b1 100644 --- a/spec/ruby/library/win32ole/win32ole_method/to_s_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/to_s_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#name" do + describe "WIN32OLE::Method#name" do it_behaves_like :win32ole_method_name, :to_s end diff --git a/spec/ruby/library/win32ole/win32ole_method/visible_spec.rb b/spec/ruby/library/win32ole/win32ole_method/visible_spec.rb index b49fac6066..a04ac6570b 100644 --- a/spec/ruby/library/win32ole/win32ole_method/visible_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_method/visible_spec.rb @@ -1,18 +1,19 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_METHOD#visible?" do + describe "WIN32OLE::Method#visible?" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - @m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + @m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") end it "raises ArgumentError if argument is given" do - lambda { @m_browse_for_folder.visible?(1) }.should raise_error ArgumentError + -> { @m_browse_for_folder.visible?(1) }.should.raise ArgumentError end it "returns true for Shell Control's 'BrowseForFolder' method" do - @m_browse_for_folder.visible?.should be_true + @m_browse_for_folder.visible?.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_param/default_spec.rb b/spec/ruby/library/win32ole/win32ole_param/default_spec.rb index 7a1337ec7c..dded6833d4 100644 --- a/spec/ruby/library/win32ole/win32ole_param/default_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/default_spec.rb @@ -1,24 +1,25 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#default" do + describe "WIN32OLE::Param#default" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - m_browse_for_folder = WIN32OLE_METHOD.new(ole_type, "BrowseForFolder") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + m_browse_for_folder = WIN32OLE::Method.new(ole_type, "BrowseForFolder") @params = m_browse_for_folder.params - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type, "CopyFile") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @params[0].default(1) }.should raise_error ArgumentError + -> { @params[0].default(1) }.should.raise ArgumentError end - it "returns nil for each of WIN32OLE_PARAM for Shell's 'BrowseForFolder' method" do + it "returns nil for each of WIN32OLE::Param for Shell's 'BrowseForFolder' method" do @params.each do |p| - p.default.should be_nil + p.default.should == nil end end diff --git a/spec/ruby/library/win32ole/win32ole_param/input_spec.rb b/spec/ruby/library/win32ole/win32ole_param/input_spec.rb index bdf4bccc79..46dc305d2b 100644 --- a/spec/ruby/library/win32ole/win32ole_param/input_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/input_spec.rb @@ -1,19 +1,20 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#input?" do + describe "WIN32OLE::Param#input?" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type, "CopyFile") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.input?(1) }.should raise_error ArgumentError + -> { @param_overwritefiles.input?(1) }.should.raise ArgumentError end it "returns true for 3rd parameter of FileSystemObject's 'CopyFile' method" do - @param_overwritefiles.input?.should == true + @param_overwritefiles.should.input? end end diff --git a/spec/ruby/library/win32ole/win32ole_param/name_spec.rb b/spec/ruby/library/win32ole/win32ole_param/name_spec.rb index 0c20c24720..2c3474ffb3 100644 --- a/spec/ruby/library/win32ole/win32ole_param/name_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/name_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#name" do + describe "WIN32OLE::Param#name" do it_behaves_like :win32ole_param_name, :name end diff --git a/spec/ruby/library/win32ole/win32ole_param/ole_type_detail_spec.rb b/spec/ruby/library/win32ole/win32ole_param/ole_type_detail_spec.rb index 3ba51c02f1..bd25ec325a 100644 --- a/spec/ruby/library/win32ole/win32ole_param/ole_type_detail_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/ole_type_detail_spec.rb @@ -1,15 +1,16 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#ole_type_detail" do + describe "WIN32OLE::Param#ole_type_detail" do before :each do - ole_type_detail = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type_detail, "CopyFile") + ole_type_detail = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type_detail, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.ole_type_detail(1) }.should raise_error ArgumentError + -> { @param_overwritefiles.ole_type_detail(1) }.should.raise ArgumentError end it "returns ['BOOL'] for 3rd parameter of FileSystemObject's 'CopyFile' method" do diff --git a/spec/ruby/library/win32ole/win32ole_param/ole_type_spec.rb b/spec/ruby/library/win32ole/win32ole_param/ole_type_spec.rb index 52bee2c9b8..3f0c279316 100644 --- a/spec/ruby/library/win32ole/win32ole_param/ole_type_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/ole_type_spec.rb @@ -1,15 +1,16 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#ole_type" do + describe "WIN32OLE::Param#ole_type" do before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type, "CopyFile") + ole_type = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.ole_type(1) }.should raise_error ArgumentError + -> { @param_overwritefiles.ole_type(1) }.should.raise ArgumentError end it "returns 'BOOL' for 3rd parameter of FileSystemObject's 'CopyFile' method" do diff --git a/spec/ruby/library/win32ole/win32ole_param/optional_spec.rb b/spec/ruby/library/win32ole/win32ole_param/optional_spec.rb index 2476df8641..ca676e0950 100644 --- a/spec/ruby/library/win32ole/win32ole_param/optional_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/optional_spec.rb @@ -1,19 +1,20 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#optional?" do + describe "WIN32OLE::Param#optional?" do before :each do - ole_type_detail = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type_detail, "CopyFile") + ole_type_detail = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type_detail, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.optional?(1) }.should raise_error ArgumentError + -> { @param_overwritefiles.optional?(1) }.should.raise ArgumentError end it "returns true for 3rd parameter of FileSystemObject's 'CopyFile' method" do - @param_overwritefiles.optional?.should be_true + @param_overwritefiles.optional?.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_param/retval_spec.rb b/spec/ruby/library/win32ole/win32ole_param/retval_spec.rb index 90946c0774..f25b1e7e14 100644 --- a/spec/ruby/library/win32ole/win32ole_param/retval_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/retval_spec.rb @@ -1,19 +1,20 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#retval?" do + describe "WIN32OLE::Param#retval?" do before :each do - ole_type_detail = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type_detail, "CopyFile") + ole_type_detail = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type_detail, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.retval?(1) }.should raise_error ArgumentError + -> { @param_overwritefiles.retval?(1) }.should.raise ArgumentError end it "returns false for 3rd parameter of FileSystemObject's 'CopyFile' method" do - @param_overwritefiles.retval?.should be_false + @param_overwritefiles.retval?.should == false end end diff --git a/spec/ruby/library/win32ole/win32ole_param/shared/name.rb b/spec/ruby/library/win32ole/win32ole_param/shared/name.rb index b7892d92fb..1f6cbea7a0 100644 --- a/spec/ruby/library/win32ole/win32ole_param/shared/name.rb +++ b/spec/ruby/library/win32ole/win32ole_param/shared/name.rb @@ -3,13 +3,13 @@ platform_is :windows do describe :win32ole_param_name, shared: true do before :each do - ole_type_detail = WIN32OLE_TYPE.new("Microsoft Scripting Runtime", "FileSystemObject") - m_copyfile = WIN32OLE_METHOD.new(ole_type_detail, "CopyFile") + ole_type_detail = WIN32OLE::Type.new("Microsoft Scripting Runtime", "FileSystemObject") + m_copyfile = WIN32OLE::Method.new(ole_type_detail, "CopyFile") @param_overwritefiles = m_copyfile.params[2] end it "raises ArgumentError if argument is given" do - lambda { @param_overwritefiles.send(@method, 1) }.should raise_error ArgumentError + -> { @param_overwritefiles.send(@method, 1) }.should.raise ArgumentError end it "returns expected value for Scripting Runtime's 'name' method" do diff --git a/spec/ruby/library/win32ole/win32ole_param/to_s_spec.rb b/spec/ruby/library/win32ole/win32ole_param/to_s_spec.rb index 5b4b4c1c80..c59f426692 100644 --- a/spec/ruby/library/win32ole/win32ole_param/to_s_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_param/to_s_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_PARAM#to_s" do + describe "WIN32OLE::Param#to_s" do it_behaves_like :win32ole_param_name, :to_s end diff --git a/spec/ruby/library/win32ole/win32ole_type/guid_spec.rb b/spec/ruby/library/win32ole/win32ole_type/guid_spec.rb index 25907c8e32..e574a945ad 100644 --- a/spec/ruby/library/win32ole/win32ole_type/guid_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/guid_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#guid for Shell Controls" do + describe "WIN32OLE::Type#guid for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do diff --git a/spec/ruby/library/win32ole/win32ole_type/helpcontext_spec.rb b/spec/ruby/library/win32ole/win32ole_type/helpcontext_spec.rb index d436835188..7b605a038b 100644 --- a/spec/ruby/library/win32ole/win32ole_type/helpcontext_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/helpcontext_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#helpcontext for Shell Controls" do + describe "WIN32OLE::Type#helpcontext for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an Integer" do - @ole_type.helpcontext.should be_kind_of Integer + @ole_type.helpcontext.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_type/helpfile_spec.rb b/spec/ruby/library/win32ole/win32ole_type/helpfile_spec.rb index 01e6945138..43a979882a 100644 --- a/spec/ruby/library/win32ole/win32ole_type/helpfile_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/helpfile_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#helpfile for Shell Controls" do + describe "WIN32OLE::Type#helpfile for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an empty string" do - @ole_type.helpfile.should be_empty + @ole_type.helpfile.should.empty? end end diff --git a/spec/ruby/library/win32ole/win32ole_type/helpstring_spec.rb b/spec/ruby/library/win32ole/win32ole_type/helpstring_spec.rb index 3bd2cbe5dd..940475b25e 100644 --- a/spec/ruby/library/win32ole/win32ole_type/helpstring_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/helpstring_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#helpstring for Shell Controls" do + describe "WIN32OLE::Type#helpstring for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do diff --git a/spec/ruby/library/win32ole/win32ole_type/major_version_spec.rb b/spec/ruby/library/win32ole/win32ole_type/major_version_spec.rb index 7dae16617d..66fdbc9ab0 100644 --- a/spec/ruby/library/win32ole/win32ole_type/major_version_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/major_version_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#major_version for Shell Controls" do + describe "WIN32OLE::Type#major_version for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an Integer" do - @ole_type.major_version.should be_kind_of Integer + @ole_type.major_version.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_type/minor_version_spec.rb b/spec/ruby/library/win32ole/win32ole_type/minor_version_spec.rb index ff412dd100..afb5086565 100644 --- a/spec/ruby/library/win32ole/win32ole_type/minor_version_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/minor_version_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#minor_version for Shell Controls" do + describe "WIN32OLE::Type#minor_version for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an Integer" do - @ole_type.minor_version.should be_kind_of Integer + @ole_type.minor_version.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_type/name_spec.rb b/spec/ruby/library/win32ole/win32ole_type/name_spec.rb index b7a28c553a..4cc3426872 100644 --- a/spec/ruby/library/win32ole/win32ole_type/name_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/name_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#name" do + describe "WIN32OLE::Type#name" do it_behaves_like :win32ole_type_name, :name end diff --git a/spec/ruby/library/win32ole/win32ole_type/new_spec.rb b/spec/ruby/library/win32ole/win32ole_type/new_spec.rb index 9443a64c75..9d92177a4b 100644 --- a/spec/ruby/library/win32ole/win32ole_type/new_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/new_spec.rb @@ -1,36 +1,40 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE.new" do + describe "WIN32OLE::Type.new" do it "raises ArgumentError with no argument" do - lambda { WIN32OLE_TYPE.new }.should raise_error ArgumentError + -> { WIN32OLE::Type.new }.should.raise ArgumentError end it "raises ArgumentError with invalid string" do - lambda { WIN32OLE_TYPE.new("foo") }.should raise_error ArgumentError + -> { WIN32OLE::Type.new("foo") }.should.raise ArgumentError end it "raises TypeError if second argument is not a String" do - lambda { WIN32OLE_TYPE.new(1,2) }.should raise_error TypeError - lambda { WIN32OLE_TYPE.new('Microsoft Shell Controls And Automation',2) }. - should raise_error TypeError + -> { WIN32OLE::Type.new(1,2) }.should.raise TypeError + -> { + WIN32OLE::Type.new('Microsoft Shell Controls And Automation',2) + }.should.raise TypeError end - it "raise WIN32OLERuntimeError if OLE object specified is not found" do - lambda { WIN32OLE_TYPE.new('Microsoft Shell Controls And Automation','foo') }. - should raise_error WIN32OLERuntimeError - lambda { WIN32OLE_TYPE.new('Microsoft Shell Controls And Automation','Application') }. - should raise_error WIN32OLERuntimeError + it "raise WIN32OLE::RuntimeError if OLE object specified is not found" do + -> { + WIN32OLE::Type.new('Microsoft Shell Controls And Automation','foo') + }.should.raise WIN32OLE::RuntimeError + -> { + WIN32OLE::Type.new('Microsoft Shell Controls And Automation','Application') + }.should.raise WIN32OLE::RuntimeError end - it "creates WIN32OLE_TYPE object from name and valid type" do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") - ole_type.should be_kind_of WIN32OLE_TYPE + it "creates WIN32OLE::Type object from name and valid type" do + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") + ole_type.should.is_a? WIN32OLE::Type end - it "creates WIN32OLE_TYPE object from CLSID and valid type" do - ole_type2 = WIN32OLE_TYPE.new("{13709620-C279-11CE-A49E-444553540000}", "Shell") - ole_type2.should be_kind_of WIN32OLE_TYPE + it "creates WIN32OLE::Type object from CLSID and valid type" do + ole_type2 = WIN32OLE::Type.new("{13709620-C279-11CE-A49E-444553540000}", "Shell") + ole_type2.should.is_a? WIN32OLE::Type end end diff --git a/spec/ruby/library/win32ole/win32ole_type/ole_classes_spec.rb b/spec/ruby/library/win32ole/win32ole_type/ole_classes_spec.rb index 0ce0fc98a4..7db08dc900 100644 --- a/spec/ruby/library/win32ole/win32ole_type/ole_classes_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/ole_classes_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE.ole_classes for Shell Controls" do + describe "WIN32OLE::Type.ole_classes for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns array of WIN32OLE_TYPEs" do - WIN32OLE_TYPE.ole_classes("Microsoft Shell Controls And Automation").all? {|e| e.kind_of? WIN32OLE_TYPE }.should be_true + WIN32OLE::Type.ole_classes("Microsoft Shell Controls And Automation").all? {|e| e.kind_of? WIN32OLE::Type }.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_type/ole_methods_spec.rb b/spec/ruby/library/win32ole/win32ole_type/ole_methods_spec.rb index 9265549d20..bdf668e53b 100644 --- a/spec/ruby/library/win32ole/win32ole_type/ole_methods_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/ole_methods_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#ole_methods for Shell Controls" do + describe "WIN32OLE::Type#ole_methods for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an Integer" do - @ole_type.ole_methods.all? { |m| m.kind_of? WIN32OLE_METHOD }.should be_true + @ole_type.ole_methods.all? { |m| m.kind_of? WIN32OLE::Method }.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_type/ole_type_spec.rb b/spec/ruby/library/win32ole/win32ole_type/ole_type_spec.rb index 2bc19aa85e..49c1902f8c 100644 --- a/spec/ruby/library/win32ole/win32ole_type/ole_type_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/ole_type_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#ole_type for Shell Controls" do + describe "WIN32OLE::Type#ole_type for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do diff --git a/spec/ruby/library/win32ole/win32ole_type/progid_spec.rb b/spec/ruby/library/win32ole/win32ole_type/progid_spec.rb index f0d80ba39e..9a700426d9 100644 --- a/spec/ruby/library/win32ole/win32ole_type/progid_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/progid_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#progid for Shell Controls" do + describe "WIN32OLE::Type#progid for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do diff --git a/spec/ruby/library/win32ole/win32ole_type/progids_spec.rb b/spec/ruby/library/win32ole/win32ole_type/progids_spec.rb index 0cdd3514e3..cbb9247da1 100644 --- a/spec/ruby/library/win32ole/win32ole_type/progids_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/progids_spec.rb @@ -1,13 +1,14 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE.progids" do + describe "WIN32OLE::Type.progids" do it "raises ArgumentError if an argument is given" do - lambda { WIN32OLE_TYPE.progids(1) }.should raise_error ArgumentError + -> { WIN32OLE::Type.progids(1) }.should.raise ArgumentError end it "returns an array containing 'Shell.Explorer'" do - WIN32OLE_TYPE.progids().include?('Shell.Explorer').should be_true + WIN32OLE::Type.progids().include?('Shell.Explorer').should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_type/shared/name.rb b/spec/ruby/library/win32ole/win32ole_type/shared/name.rb index 6484ef0ef8..707149a5bb 100644 --- a/spec/ruby/library/win32ole/win32ole_type/shared/name.rb +++ b/spec/ruby/library/win32ole/win32ole_type/shared/name.rb @@ -3,11 +3,11 @@ platform_is :windows do describe :win32ole_type_name, shared: true do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") end it "raises ArgumentError if argument is given" do - lambda { @ole_type.send(@method, 1) }.should raise_error ArgumentError + -> { @ole_type.send(@method, 1) }.should.raise ArgumentError end it "returns a String" do diff --git a/spec/ruby/library/win32ole/win32ole_type/src_type_spec.rb b/spec/ruby/library/win32ole/win32ole_type/src_type_spec.rb index 71e304d80a..9f0893b750 100644 --- a/spec/ruby/library/win32ole/win32ole_type/src_type_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/src_type_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#src_type for Shell Controls" do + describe "WIN32OLE::Type#src_type for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns nil" do - @ole_type.src_type.should be_nil + @ole_type.src_type.should == nil end end diff --git a/spec/ruby/library/win32ole/win32ole_type/to_s_spec.rb b/spec/ruby/library/win32ole/win32ole_type/to_s_spec.rb index b713990ed2..03a0344fdb 100644 --- a/spec/ruby/library/win32ole/win32ole_type/to_s_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/to_s_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#to_s" do + describe "WIN32OLE::Type#to_s" do it_behaves_like :win32ole_type_name, :to_s end diff --git a/spec/ruby/library/win32ole/win32ole_type/typekind_spec.rb b/spec/ruby/library/win32ole/win32ole_type/typekind_spec.rb index 35f3562721..1051627025 100644 --- a/spec/ruby/library/win32ole/win32ole_type/typekind_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/typekind_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#typekind for Shell Controls" do + describe "WIN32OLE::Type#typekind for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns an Integer" do - @ole_type.typekind.should be_kind_of Integer + @ole_type.typekind.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_type/typelibs_spec.rb b/spec/ruby/library/win32ole/win32ole_type/typelibs_spec.rb index 3a28c0496c..36400d75f2 100644 --- a/spec/ruby/library/win32ole/win32ole_type/typelibs_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/typelibs_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE.typelibs for Shell Controls" do + describe "WIN32OLE::Type.typelibs for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,11 +12,11 @@ platform_is :windows do end it "raises ArgumentError if any argument is give" do - lambda { WIN32OLE_TYPE.typelibs(1) }.should raise_error ArgumentError + -> { WIN32OLE::Type.typelibs(1) }.should.raise ArgumentError end it "returns array of type libraries" do - WIN32OLE_TYPE.typelibs().include?("Microsoft Shell Controls And Automation").should be_true + WIN32OLE::Type.typelibs().include?("Microsoft Shell Controls And Automation").should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_type/variables_spec.rb b/spec/ruby/library/win32ole/win32ole_type/variables_spec.rb index fbf3dd0341..b1a407523c 100644 --- a/spec/ruby/library/win32ole/win32ole_type/variables_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/variables_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#variables for Shell Controls" do + describe "WIN32OLE::Type#variables for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do diff --git a/spec/ruby/library/win32ole/win32ole_type/visible_spec.rb b/spec/ruby/library/win32ole/win32ole_type/visible_spec.rb index 403b2b843b..bca9159d53 100644 --- a/spec/ruby/library/win32ole/win32ole_type/visible_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_type/visible_spec.rb @@ -1,9 +1,10 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' - describe "WIN32OLE_TYPE#visible? for Shell Controls" do + describe "WIN32OLE::Type#visible? for Shell Controls" do before :each do - @ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell") + @ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "Shell") end after :each do @@ -11,7 +12,7 @@ platform_is :windows do end it "returns true" do - @ole_type.visible?.should be_true + @ole_type.visible?.should == true end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/name_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/name_spec.rb index 8bac1a9891..dd9bfa594f 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/name_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/name_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do diff --git a/spec/ruby/library/win32ole/win32ole_variable/ole_type_detail_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/ole_type_detail_spec.rb index dab4edabaa..a9232d2b28 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/ole_type_detail_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/ole_type_detail_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -5,13 +6,13 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns a nonempty Array" do - @var.ole_type_detail.should be_kind_of Array - @var.ole_type_detail.should_not be_empty + @var.ole_type_detail.should.is_a? Array + @var.ole_type_detail.should_not.empty? end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/ole_type_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/ole_type_spec.rb index d08acc9bde..f28cbfd37a 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/ole_type_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/ole_type_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -5,12 +6,12 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns a String" do - @var.ole_type.should be_kind_of String + @var.ole_type.should.is_a? String end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/shared/name.rb b/spec/ruby/library/win32ole/win32ole_variable/shared/name.rb index 033e830fac..d079066616 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/shared/name.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/shared/name.rb @@ -5,12 +5,12 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns a String" do - @var.send(@method).should be_kind_of String + @var.send(@method).should.is_a? String end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/to_s_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/to_s_spec.rb index 000ac14d7e..d4cab8e924 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/to_s_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/to_s_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" require_relative 'shared/name' platform_is :windows do diff --git a/spec/ruby/library/win32ole/win32ole_variable/value_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/value_spec.rb index c15f64c2c5..33066e40ef 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/value_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/value_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -5,13 +6,13 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end - it "returns a Integer" do + it "returns an Integer" do # according to doc, this could return nil - @var.value.should be_kind_of Integer + @var.value.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/variable_kind_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/variable_kind_spec.rb index 4cca7f8874..2cf1d7f1f2 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/variable_kind_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/variable_kind_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -5,12 +6,12 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns a String" do - @var.variable_kind.should be_kind_of String + @var.variable_kind.should.is_a? String @var.variable_kind.should == 'CONSTANT' end diff --git a/spec/ruby/library/win32ole/win32ole_variable/varkind_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/varkind_spec.rb index 56cd1c337a..04ccb8d46f 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/varkind_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/varkind_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -6,12 +7,12 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns an Integer" do - @var.varkind.should be_kind_of Integer + @var.varkind.should.is_a? Integer end end diff --git a/spec/ruby/library/win32ole/win32ole_variable/visible_spec.rb b/spec/ruby/library/win32ole/win32ole_variable/visible_spec.rb index 7f7a557b57..939468122c 100644 --- a/spec/ruby/library/win32ole/win32ole_variable/visible_spec.rb +++ b/spec/ruby/library/win32ole/win32ole_variable/visible_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" platform_is :windows do require 'win32ole' @@ -5,12 +6,12 @@ platform_is :windows do # not sure how WIN32OLE_VARIABLE objects are supposed to be generated # WIN32OLE_VARIABLE.new even seg faults in some cases before :each do - ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") + ole_type = WIN32OLE::Type.new("Microsoft Shell Controls And Automation", "ShellSpecialFolderConstants") @var = ole_type.variables[0] end it "returns a String" do - @var.visible?.should be_true + @var.visible?.should == true end end diff --git a/spec/ruby/library/yaml/add_builtin_type_spec.rb b/spec/ruby/library/yaml/add_builtin_type_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/add_builtin_type_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/add_domain_type_spec.rb b/spec/ruby/library/yaml/add_domain_type_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/add_domain_type_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/add_private_type_spec.rb b/spec/ruby/library/yaml/add_private_type_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/add_private_type_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/add_ruby_type_spec.rb b/spec/ruby/library/yaml/add_ruby_type_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/add_ruby_type_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/detect_implicit_spec.rb b/spec/ruby/library/yaml/detect_implicit_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/detect_implicit_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/dump_spec.rb b/spec/ruby/library/yaml/dump_spec.rb index 5af794b7f8..97b665d6a5 100644 --- a/spec/ruby/library/yaml/dump_spec.rb +++ b/spec/ruby/library/yaml/dump_spec.rb @@ -1,17 +1,21 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' -# TODO: WTF is this using a global? +require 'yaml' + describe "YAML.dump" do + before :each do + @test_file = tmp("yaml_test_file") + end + after :each do - rm_r $test_file + rm_r @test_file end it "converts an object to YAML and write result to io when io provided" do - File.open($test_file, 'w' ) do |io| + File.open(@test_file, 'w' ) do |io| YAML.dump( ['badger', 'elephant', 'tiger'], io ) end - YAML.load_file($test_file).should == ['badger', 'elephant', 'tiger'] + YAML.load_file(@test_file).should == ['badger', 'elephant', 'tiger'] end it "returns a string containing dumped YAML when no io provided" do @@ -35,9 +39,18 @@ describe "YAML.dump" do end it "dumps an OpenStruct" do - require "ostruct" + begin + require "ostruct" + rescue LoadError + skip "OpenStruct is not available" + end os = OpenStruct.new("age" => 20, "name" => "John") - YAML.dump(os).should match_yaml("--- !ruby/object:OpenStruct\ntable:\n :age: 20\n :name: John\n") + yaml_dump = YAML.dump(os) + + [ + "--- !ruby/object:OpenStruct\nage: 20\nname: John\n", + "--- !ruby/object:OpenStruct\ntable:\n :age: 20\n :name: John\n", + ].should.include?(yaml_dump) end it "dumps a File without any state" do diff --git a/spec/ruby/library/yaml/dump_stream_spec.rb b/spec/ruby/library/yaml/dump_stream_spec.rb index 9d30fef819..f0578fa800 100644 --- a/spec/ruby/library/yaml/dump_stream_spec.rb +++ b/spec/ruby/library/yaml/dump_stream_spec.rb @@ -1,5 +1,6 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' + +require 'yaml' describe "YAML.dump_stream" do it "returns a YAML stream containing the objects passed" do diff --git a/spec/ruby/library/yaml/each_node_spec.rb b/spec/ruby/library/yaml/each_node_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/each_node_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/emitter_spec.rb b/spec/ruby/library/yaml/emitter_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/emitter_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/fixtures/common.rb b/spec/ruby/library/yaml/fixtures/common.rb deleted file mode 100644 index 1d868806f1..0000000000 --- a/spec/ruby/library/yaml/fixtures/common.rb +++ /dev/null @@ -1,10 +0,0 @@ -begin - require 'syck' -rescue LoadError - # do nothing -end - -require 'yaml' - -$test_file = tmp("yaml_test_file") -$test_parse_file = File.dirname(__FILE__) + "/test_yaml.yml" diff --git a/spec/ruby/library/yaml/fixtures/example_class.rb b/spec/ruby/library/yaml/fixtures/example_class.rb index 751435a305..8259870799 100644 --- a/spec/ruby/library/yaml/fixtures/example_class.rb +++ b/spec/ruby/library/yaml/fixtures/example_class.rb @@ -1,5 +1,7 @@ -class FooBar - def initialize(name) - @name = name +module YAMLSpecs + class Example + def initialize(name) + @name = name + end end end diff --git a/spec/ruby/library/yaml/fixtures/strings.rb b/spec/ruby/library/yaml/fixtures/strings.rb index 6f66dc3659..f478f89823 100644 --- a/spec/ruby/library/yaml/fixtures/strings.rb +++ b/spec/ruby/library/yaml/fixtures/strings.rb @@ -1,36 +1,26 @@ -$complex_key_1 = <<EOY - ? # PLAY SCHEDULE - - Detroit Tigers - - Chicago Cubs - : - - 2001-07-23 +module YAMLSpecs + COMPLEX_KEY_1 = <<~EOY + ? # PLAY SCHEDULE + - Detroit Tigers + - Chicago Cubs + : + - 2001-07-23 - ? [ New York Yankees, - Atlanta Braves ] - : [ 2001-07-02, 2001-08-12, - 2001-08-14 ] -EOY + ? [ New York Yankees, + Atlanta Braves ] + : [ 2001-07-02, 2001-08-12, + 2001-08-14 ] + EOY -$to_yaml_hash = -<<EOY -- - avg: 0.278 - hr: 65 - name: Mark McGwire -- - avg: 0.288 - hr: 63 - name: Sammy Sosa -EOY + MULTIDOCUMENT = <<~EOY + --- + - Mark McGwire + - Sammy Sosa + - Ken Griffey -$multidocument = <<EOY ---- -- Mark McGwire -- Sammy Sosa -- Ken Griffey - -# Team ranking ---- -- Chicago Cubs -- St Louis Cardinals -EOY + # Team ranking + --- + - Chicago Cubs + - St Louis Cardinals + EOY +end diff --git a/spec/ruby/library/yaml/generic_parser_spec.rb b/spec/ruby/library/yaml/generic_parser_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/generic_parser_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/load_documents_spec.rb b/spec/ruby/library/yaml/load_documents_spec.rb deleted file mode 100644 index 27edbcaa86..0000000000 --- a/spec/ruby/library/yaml/load_documents_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' -require_relative 'fixtures/strings' -require_relative 'shared/each_document' - -ruby_version_is ''...'2.5' do - describe "YAML.load_documents" do - it_behaves_like :yaml_each_document, :load_documents - end -end diff --git a/spec/ruby/library/yaml/load_file_spec.rb b/spec/ruby/library/yaml/load_file_spec.rb index 2363c08120..4941d0485b 100644 --- a/spec/ruby/library/yaml/load_file_spec.rb +++ b/spec/ruby/library/yaml/load_file_spec.rb @@ -1,13 +1,18 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' + +require 'yaml' describe "YAML.load_file" do + before :each do + @test_file = tmp("yaml_test_file") + end + after :each do - rm_r $test_file + rm_r @test_file end it "returns a hash" do - File.open($test_file,'w' ){|io| YAML.dump( {"bar"=>2, "car"=>1}, io ) } - YAML.load_file($test_file).should == {"bar"=>2, "car"=>1} + File.open(@test_file,'w' ){|io| YAML.dump( {"bar"=>2, "car"=>1}, io ) } + YAML.load_file(@test_file).should == {"bar"=>2, "car"=>1} end end diff --git a/spec/ruby/library/yaml/load_spec.rb b/spec/ruby/library/yaml/load_spec.rb index 1e16bed4e6..56700a85f9 100644 --- a/spec/ruby/library/yaml/load_spec.rb +++ b/spec/ruby/library/yaml/load_spec.rb @@ -1,137 +1,10 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' -require_relative 'fixtures/strings' +require_relative 'shared/load' describe "YAML.load" do - after :each do - rm_r $test_file - end - - it "returns a document from current io stream when io provided" do - File.open($test_file, 'w') do |io| - YAML.dump( ['badger', 'elephant', 'tiger'], io ) - end - File.open($test_file) { |yf| YAML.load( yf ) }.should == ['badger', 'elephant', 'tiger'] - end - - it "loads strings" do - strings = ["str", - " str", - "'str'", - "str", - " str", - "'str'", - "\"str\"", - "\n str", - "--- str", - "---\nstr", - "--- \nstr", - "--- \n str", - "--- 'str'" - ] - strings.each do |str| - YAML.load(str).should == "str" - end - end - - it "loads strings with chars from non-base Unicode plane" do - # We add these strings as bytes and force the encoding for safety - # as bugs in parsing unicode characters can obscure bugs in this - # area. - - yaml_and_strings = { - # "--- 🌵" => "🌵" - [45, 45, 45, 32, 240, 159, 140, 181] => - [240, 159, 140, 181], - # "--- 🌵 and some text" => "🌵 and some text" - [45, 45, 45, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] => - [240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116], - # "--- Some text 🌵 and some text" => "Some text 🌵 and some text" - [45, 45, 45, 32, 83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] => - [83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] - } - yaml_and_strings.each do |yaml, str| - YAML.load(yaml.pack("C*").force_encoding("UTF-8")).should == str.pack("C*").force_encoding("UTF-8") - end - end - - it "fails on invalid keys" do - if YAML.to_s == "Psych" - error = Psych::SyntaxError - else - error = ArgumentError - end - lambda { YAML.load("key1: value\ninvalid_key") }.should raise_error(error) - end - - it "accepts symbols" do - YAML.load( "--- :locked" ).should == :locked - end - - it "accepts numbers" do - YAML.load("47").should == 47 - YAML.load("-1").should == -1 - end - - it "accepts collections" do - expected = ["a", "b", "c"] - YAML.load("--- \n- a\n- b\n- c\n").should == expected - YAML.load("--- [a, b, c]").should == expected - YAML.load("[a, b, c]").should == expected - end - - it "parses start markers" do - YAML.load("---\n").should == nil - YAML.load("--- ---\n").should == "---" - YAML.load("--- abc").should == "abc" - end - - it "works with block sequence shortcuts" do - block_seq = "- - - one\n - two\n - three" - YAML.load(block_seq).should == [[["one", "two", "three"]]] - end - - it "works on complex keys" do - require 'date' - expected = { - [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ], - [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), - Date.new( 2001, 8, 12 ), - Date.new( 2001, 8, 14 ) ] - } - YAML.load($complex_key_1).should == expected - end - - it "loads a symbol key that contains spaces" do - string = ":user name: This is the user name." - expected = { :"user name" => "This is the user name."} - YAML.load(string).should == expected - end - - describe "with iso8601 timestamp" do - it "computes the microseconds" do - [ [YAML.load("2011-03-22t23:32:11.2233+01:00"), 223300], - [YAML.load("2011-03-22t23:32:11.0099+01:00"), 9900], - [YAML.load("2011-03-22t23:32:11.000076+01:00"), 76] - ].should be_computed_by(:usec) - end - - it "rounds values smaller than 1 usec to 0 " do - YAML.load("2011-03-22t23:32:11.000000342222+01:00").usec.should == 0 - end - end - - it "loads an OpenStruct" do - require "ostruct" - os = OpenStruct.new("age" => 20, "name" => "John") - loaded = YAML.load("--- !ruby/object:OpenStruct\ntable:\n :age: 20\n :name: John\n") - loaded.should == os - end + it_behaves_like :yaml_load_safe, :load - it "loads a File but raise an error when used as it is uninitialized" do - loaded = YAML.load("--- !ruby/object:File {}\n") - lambda { - loaded.read(1) - }.should raise_error(IOError) + guard -> { Psych::VERSION < "4.0.0" } do + it_behaves_like :yaml_load_unsafe, :load end end diff --git a/spec/ruby/library/yaml/load_stream_spec.rb b/spec/ruby/library/yaml/load_stream_spec.rb index 689653c8cd..31bc862f5e 100644 --- a/spec/ruby/library/yaml/load_stream_spec.rb +++ b/spec/ruby/library/yaml/load_stream_spec.rb @@ -1,8 +1,9 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' require_relative 'fixtures/strings' require_relative 'shared/each_document' +require 'yaml' + describe "YAML.load_stream" do it_behaves_like :yaml_each_document, :load_stream end diff --git a/spec/ruby/library/yaml/object_maker_spec.rb b/spec/ruby/library/yaml/object_maker_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/object_maker_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/parse_documents_spec.rb b/spec/ruby/library/yaml/parse_documents_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/parse_documents_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/parse_file_spec.rb b/spec/ruby/library/yaml/parse_file_spec.rb index 8d307c5daf..a29377f163 100644 --- a/spec/ruby/library/yaml/parse_file_spec.rb +++ b/spec/ruby/library/yaml/parse_file_spec.rb @@ -1,10 +1,10 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' -describe "YAML#parse_file" do - quarantine! do - it "returns a YAML::Syck::Map object after parsing a YAML file" do - YAML.parse_file($test_parse_file).should be_kind_of(YAML::Syck::Map) - end +require 'yaml' + +describe "YAML.parse_file" do + it "returns a YAML::Syck::Map object after parsing a YAML file" do + test_parse_file = fixture __FILE__, "test_yaml.yml" + YAML.parse_file(test_parse_file).should.is_a?(Psych::Nodes::Document) end end diff --git a/spec/ruby/library/yaml/parse_spec.rb b/spec/ruby/library/yaml/parse_spec.rb index d5dbfdcee2..832cd99d03 100644 --- a/spec/ruby/library/yaml/parse_spec.rb +++ b/spec/ruby/library/yaml/parse_spec.rb @@ -1,13 +1,14 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' -describe "YAML#parse with an empty string" do +require 'yaml' + +describe "YAML.parse with an empty string" do it "returns false" do - YAML.parse('').should be_false + YAML.parse('').should == false end end -describe "YAML#parse" do +describe "YAML.parse" do before :each do @string_yaml = "foo".to_yaml end diff --git a/spec/ruby/library/yaml/parser_spec.rb b/spec/ruby/library/yaml/parser_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/parser_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/quick_emit_spec.rb b/spec/ruby/library/yaml/quick_emit_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/quick_emit_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/read_type_class_spec.rb b/spec/ruby/library/yaml/read_type_class_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/read_type_class_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/shared/each_document.rb b/spec/ruby/library/yaml/shared/each_document.rb index 999123dc2a..6f00aee297 100644 --- a/spec/ruby/library/yaml/shared/each_document.rb +++ b/spec/ruby/library/yaml/shared/each_document.rb @@ -1,7 +1,7 @@ describe :yaml_each_document, shared: true do it "calls the block on each successive document" do documents = [] - YAML.send(@method, $multidocument) do |doc| + YAML.send(@method, YAMLSpecs::MULTIDOCUMENT) do |doc| documents << doc end documents.should == [["Mark McGwire", "Sammy Sosa", "Ken Griffey"], @@ -9,7 +9,8 @@ describe :yaml_each_document, shared: true do end it "works on files" do - File.open($test_parse_file, "r") do |file| + test_parse_file = fixture __FILE__, "test_yaml.yml" + File.open(test_parse_file, "r") do |file| YAML.send(@method, file) do |doc| doc.should == {"project"=>{"name"=>"RubySpec"}} end diff --git a/spec/ruby/library/yaml/shared/load.rb b/spec/ruby/library/yaml/shared/load.rb new file mode 100644 index 0000000000..7e5669f2d0 --- /dev/null +++ b/spec/ruby/library/yaml/shared/load.rb @@ -0,0 +1,142 @@ +require_relative '../fixtures/strings' + +require 'yaml' + +describe :yaml_load_safe, shared: true do + it "returns a document from current io stream when io provided" do + @test_file = tmp("yaml_test_file") + File.open(@test_file, 'w') do |io| + YAML.dump( ['badger', 'elephant', 'tiger'], io ) + end + File.open(@test_file) { |yf| YAML.send(@method, yf ) }.should == ['badger', 'elephant', 'tiger'] + ensure + rm_r @test_file + end + + it "loads strings" do + strings = ["str", + " str", + "'str'", + "str", + " str", + "'str'", + "\"str\"", + "\n str", + "--- str", + "---\nstr", + "--- \nstr", + "--- \n str", + "--- 'str'" + ] + strings.each do |str| + YAML.send(@method, str).should == "str" + end + end + + it "loads strings with chars from non-base Unicode plane" do + # We add these strings as bytes and force the encoding for safety + # as bugs in parsing unicode characters can obscure bugs in this + # area. + + yaml_and_strings = { + # "--- 🌵" => "🌵" + [45, 45, 45, 32, 240, 159, 140, 181] => + [240, 159, 140, 181], + # "--- 🌵 and some text" => "🌵 and some text" + [45, 45, 45, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] => + [240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116], + # "--- Some text 🌵 and some text" => "Some text 🌵 and some text" + [45, 45, 45, 32, 83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] => + [83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] + } + yaml_and_strings.each do |yaml, str| + YAML.send(@method, yaml.pack("C*").force_encoding("UTF-8")).should == str.pack("C*").force_encoding("UTF-8") + end + end + + it "fails on invalid keys" do + if YAML.to_s == "Psych" + error = Psych::SyntaxError + else + error = ArgumentError + end + -> { YAML.send(@method, "key1: value\ninvalid_key") }.should.raise(error) + end + + it "accepts symbols" do + YAML.send(@method, "--- :locked" ).should == :locked + end + + it "accepts numbers" do + YAML.send(@method, "47").should == 47 + YAML.send(@method, "-1").should == -1 + end + + it "accepts collections" do + expected = ["a", "b", "c"] + YAML.send(@method, "--- \n- a\n- b\n- c\n").should == expected + YAML.send(@method, "--- [a, b, c]").should == expected + YAML.send(@method, "[a, b, c]").should == expected + end + + it "parses start markers" do + YAML.send(@method, "---\n").should == nil + YAML.send(@method, "--- ---\n").should == "---" + YAML.send(@method, "--- abc").should == "abc" + end + + it "works with block sequence shortcuts" do + block_seq = "- - - one\n - two\n - three" + YAML.send(@method, block_seq).should == [[["one", "two", "three"]]] + end + + it "loads a symbol key that contains spaces" do + string = ":user name: This is the user name." + expected = { :"user name" => "This is the user name."} + YAML.send(@method, string).should == expected + end +end + +describe :yaml_load_unsafe, shared: true do + it "works on complex keys" do + require 'date' + expected = { + [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ], + [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), + Date.new( 2001, 8, 12 ), + Date.new( 2001, 8, 14 ) ] + } + YAML.send(@method, YAMLSpecs::COMPLEX_KEY_1).should == expected + end + + describe "with iso8601 timestamp" do + it "computes the microseconds" do + [ [YAML.send(@method, "2011-03-22t23:32:11.2233+01:00"), 223300], + [YAML.send(@method, "2011-03-22t23:32:11.0099+01:00"), 9900], + [YAML.send(@method, "2011-03-22t23:32:11.000076+01:00"), 76] + ].should be_computed_by(:usec) + end + + it "rounds values smaller than 1 usec to 0" do + YAML.send(@method, "2011-03-22t23:32:11.000000342222+01:00").usec.should == 0 + end + end + + it "loads an OpenStruct" do + begin + require "ostruct" + rescue LoadError + skip "OpenStruct is not available" + end + os = OpenStruct.new("age" => 20, "name" => "John") + loaded = YAML.send(@method, "--- !ruby/object:OpenStruct\ntable:\n :age: 20\n :name: John\n") + loaded.should == os + end + + it "loads a File but raise an error when used as it is uninitialized" do + loaded = YAML.send(@method, "--- !ruby/object:File {}\n") + -> { + loaded.read(1) + }.should.raise(IOError) + end +end diff --git a/spec/ruby/library/yaml/tagurize_spec.rb b/spec/ruby/library/yaml/tagurize_spec.rb deleted file mode 100644 index cc1b757ce9..0000000000 --- a/spec/ruby/library/yaml/tagurize_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' - -ruby_version_is ''...'2.5' do - describe "YAML.tagurize" do - it "converts a type_id to a taguri" do - YAML.tagurize('wtf').should == "tag:yaml.org,2002:wtf" - YAML.tagurize(1).should == 1 - end - end -end diff --git a/spec/ruby/library/yaml/to_yaml_spec.rb b/spec/ruby/library/yaml/to_yaml_spec.rb index 9713657a26..328ab25552 100644 --- a/spec/ruby/library/yaml/to_yaml_spec.rb +++ b/spec/ruby/library/yaml/to_yaml_spec.rb @@ -1,7 +1,8 @@ require_relative '../../spec_helper' -require_relative 'fixtures/common' require_relative 'fixtures/example_class' +require 'yaml' + describe "Object#to_yaml" do it "returns the YAML representation of an Array object" do @@ -12,37 +13,44 @@ describe "Object#to_yaml" do { "a" => "b"}.to_yaml.should match_yaml("--- \na: b\n") end + it "returns the YAML representation of an object" do + YAMLSpecs::Example.new("baz").to_yaml.should match_yaml("--- !ruby/object:YAMLSpecs::Example\nname: baz\n") + end + it "returns the YAML representation of a Class object" do - FooBar.new("baz").to_yaml.should match_yaml("--- !ruby/object:FooBar\nname: baz\n") + YAMLSpecs::Example.to_yaml.should match_yaml("--- !ruby/class 'YAMLSpecs::Example'\n") + end + it "returns the YAML representation of a Module object" do + Enumerable.to_yaml.should match_yaml("--- !ruby/module 'Enumerable'\n") end it "returns the YAML representation of a Date object" do require 'date' - Date.parse('1997/12/30').to_yaml.should match_yaml("--- 1997-12-30\n") + Date.new(1997, 12, 30).to_yaml.should match_yaml("--- 1997-12-30\n") end it "returns the YAML representation of a FalseClass" do false_klass = false - false_klass.should be_kind_of(FalseClass) + false_klass.should.is_a?(FalseClass) false_klass.to_yaml.should match_yaml("--- false\n") end it "returns the YAML representation of a Float object" do float = 1.2 - float.should be_kind_of(Float) + float.should.is_a?(Float) float.to_yaml.should match_yaml("--- 1.2\n") end it "returns the YAML representation of an Integer object" do int = 20 - int.should be_kind_of(Integer) + int.should.is_a?(Integer) int.to_yaml.should match_yaml("--- 20\n") end it "returns the YAML representation of a NilClass object" do nil_klass = nil - nil_klass.should be_kind_of(NilClass) + nil_klass.should.is_a?(NilClass) nil_klass.to_yaml.should match_yaml("--- \n") end @@ -57,6 +65,13 @@ describe "Object#to_yaml" do it "returns the YAML representation of a Struct object" do Person = Struct.new(:name, :gender) Person.new("Jane", "female").to_yaml.should match_yaml("--- !ruby/struct:Person\nname: Jane\ngender: female\n") + ensure + Object.send(:remove_const, :Person) + end + + it "returns the YAML representation of an unnamed Struct object" do + person = Struct.new(:name, :gender) + person.new("Jane", "female").to_yaml.should match_yaml("--- !ruby/struct\nname: Jane\ngender: female\n") end it "returns the YAML representation of a Symbol object" do @@ -69,20 +84,20 @@ describe "Object#to_yaml" do it "returns the YAML representation of a TrueClass" do true_klass = true - true_klass.should be_kind_of(TrueClass) + true_klass.should.is_a?(TrueClass) true_klass.to_yaml.should match_yaml("--- true\n") end it "returns the YAML representation of a Error object" do - StandardError.new("foobar").to_yaml.should match_yaml("--- !ruby/exception:StandardError\nmessage: foobar\n") + StandardError.new("foobar").to_yaml.should match_yaml("--- !ruby/exception:StandardError\nmessage: foobar\nbacktrace: \n") end it "returns the YAML representation for Range objects" do yaml = Range.new(1,3).to_yaml - yaml.include?("!ruby/range").should be_true - yaml.include?("begin: 1").should be_true - yaml.include?("end: 3").should be_true - yaml.include?("excl: false").should be_true + yaml.include?("!ruby/range").should == true + yaml.include?("begin: 1").should == true + yaml.include?("end: 3").should == true + yaml.include?("excl: false").should == true end it "returns the YAML representation of numeric constants" do diff --git a/spec/ruby/library/yaml/transfer_spec.rb b/spec/ruby/library/yaml/transfer_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/transfer_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/try_implicit_spec.rb b/spec/ruby/library/yaml/try_implicit_spec.rb deleted file mode 100644 index 44c820940f..0000000000 --- a/spec/ruby/library/yaml/try_implicit_spec.rb +++ /dev/null @@ -1,2 +0,0 @@ -require_relative '../../spec_helper' -require_relative 'fixtures/common' diff --git a/spec/ruby/library/yaml/unsafe_load_spec.rb b/spec/ruby/library/yaml/unsafe_load_spec.rb new file mode 100644 index 0000000000..385cd2a6e2 --- /dev/null +++ b/spec/ruby/library/yaml/unsafe_load_spec.rb @@ -0,0 +1,9 @@ +require_relative '../../spec_helper' +require_relative 'shared/load' + +guard -> { Psych::VERSION >= "4.0.0" } do + describe "YAML.unsafe_load" do + it_behaves_like :yaml_load_safe, :unsafe_load + it_behaves_like :yaml_load_unsafe, :unsafe_load + end +end diff --git a/spec/ruby/library/zlib/adler32_spec.rb b/spec/ruby/library/zlib/adler32_spec.rb index 1da12aece0..887c22d059 100644 --- a/spec/ruby/library/zlib/adler32_spec.rb +++ b/spec/ruby/library/zlib/adler32_spec.rb @@ -19,10 +19,10 @@ describe "Zlib.adler32" do Zlib.adler32(test_string, 1).should == 66391324 Zlib.adler32(test_string, 2**8).should == 701435419 Zlib.adler32(test_string, 2**16).should == 63966491 - lambda { Zlib.adler32(test_string, 2**128) }.should raise_error(RangeError) + -> { Zlib.adler32(test_string, 2**128) }.should.raise(RangeError) end - it "calculates the Adler checksum for string and initial Adler value for Bignums" do + it "calculates the Adler checksum for string and initial Adler value for Integers" do test_string = "This is a test string! How exciting!%?" Zlib.adler32(test_string, 2**30).should == 1137642779 end diff --git a/spec/ruby/library/zlib/crc32_spec.rb b/spec/ruby/library/zlib/crc32_spec.rb index 02f95fd92c..b94b5c627c 100644 --- a/spec/ruby/library/zlib/crc32_spec.rb +++ b/spec/ruby/library/zlib/crc32_spec.rb @@ -26,10 +26,10 @@ describe "Zlib.crc32" do Zlib.crc32(test_string, 2**16).should == 1932511220 Zlib.crc32("p", ~305419896).should == 4046865307 Zlib.crc32("p", -305419897).should == 4046865307 - lambda { Zlib.crc32(test_string, 2**128) }.should raise_error(RangeError) + -> { Zlib.crc32(test_string, 2**128) }.should.raise(RangeError) end - it "calculates the CRC checksum for string and initial CRC value for Bignums" do + it "calculates the CRC checksum for string and initial CRC value for Integers" do test_string = "This is a test string! How exciting!%?" # Zlib.crc32(test_string, -2**30).should == 277228695 Zlib.crc32(test_string, 2**30).should == 46597132 diff --git a/spec/ruby/library/zlib/crc_table_spec.rb b/spec/ruby/library/zlib/crc_table_spec.rb index f7fc2749fa..de8876086b 100644 --- a/spec/ruby/library/zlib/crc_table_spec.rb +++ b/spec/ruby/library/zlib/crc_table_spec.rb @@ -2,74 +2,79 @@ require_relative '../../spec_helper' require "zlib" describe "Zlib.crc_table" do - - it "returns the same value as zlib's get_crc_table()" do - Zlib.crc_table.should == [ - 0, 1996959894, 3993919788, 2567524794, - 124634137, 1886057615, 3915621685, 2657392035, - 249268274, 2044508324, 3772115230, 2547177864, - 162941995, 2125561021, 3887607047, 2428444049, - 498536548, 1789927666, 4089016648, 2227061214, - 450548861, 1843258603, 4107580753, 2211677639, - 325883990, 1684777152, 4251122042, 2321926636, - 335633487, 1661365465, 4195302755, 2366115317, - 997073096, 1281953886, 3579855332, 2724688242, - 1006888145, 1258607687, 3524101629, 2768942443, - 901097722, 1119000684, 3686517206, 2898065728, - 853044451, 1172266101, 3705015759, 2882616665, - 651767980, 1373503546, 3369554304, 3218104598, - 565507253, 1454621731, 3485111705, 3099436303, - 671266974, 1594198024, 3322730930, 2970347812, - 795835527, 1483230225, 3244367275, 3060149565, - 1994146192, 31158534, 2563907772, 4023717930, - 1907459465, 112637215, 2680153253, 3904427059, - 2013776290, 251722036, 2517215374, 3775830040, - 2137656763, 141376813, 2439277719, 3865271297, - 1802195444, 476864866, 2238001368, 4066508878, - 1812370925, 453092731, 2181625025, 4111451223, - 1706088902, 314042704, 2344532202, 4240017532, - 1658658271, 366619977, 2362670323, 4224994405, - 1303535960, 984961486, 2747007092, 3569037538, - 1256170817, 1037604311, 2765210733, 3554079995, - 1131014506, 879679996, 2909243462, 3663771856, - 1141124467, 855842277, 2852801631, 3708648649, - 1342533948, 654459306, 3188396048, 3373015174, - 1466479909, 544179635, 3110523913, 3462522015, - 1591671054, 702138776, 2966460450, 3352799412, - 1504918807, 783551873, 3082640443, 3233442989, - 3988292384, 2596254646, 62317068, 1957810842, - 3939845945, 2647816111, 81470997, 1943803523, - 3814918930, 2489596804, 225274430, 2053790376, - 3826175755, 2466906013, 167816743, 2097651377, - 4027552580, 2265490386, 503444072, 1762050814, - 4150417245, 2154129355, 426522225, 1852507879, - 4275313526, 2312317920, 282753626, 1742555852, - 4189708143, 2394877945, 397917763, 1622183637, - 3604390888, 2714866558, 953729732, 1340076626, - 3518719985, 2797360999, 1068828381, 1219638859, - 3624741850, 2936675148, 906185462, 1090812512, - 3747672003, 2825379669, 829329135, 1181335161, - 3412177804, 3160834842, 628085408, 1382605366, - 3423369109, 3138078467, 570562233, 1426400815, - 3317316542, 2998733608, 733239954, 1555261956, - 3268935591, 3050360625, 752459403, 1541320221, - 2607071920, 3965973030, 1969922972, 40735498, - 2617837225, 3943577151, 1913087877, 83908371, - 2512341634, 3803740692, 2075208622, 213261112, - 2463272603, 3855990285, 2094854071, 198958881, - 2262029012, 4057260610, 1759359992, 534414190, - 2176718541, 4139329115, 1873836001, 414664567, - 2282248934, 4279200368, 1711684554, 285281116, - 2405801727, 4167216745, 1634467795, 376229701, - 2685067896, 3608007406, 1308918612, 956543938, - 2808555105, 3495958263, 1231636301, 1047427035, - 2932959818, 3654703836, 1088359270, 936918000, - 2847714899, 3736837829, 1202900863, 817233897, - 3183342108, 3401237130, 1404277552, 615818150, - 3134207493, 3453421203, 1423857449, 601450431, - 3009837614, 3294710456, 1567103746, 711928724, - 3020668471, 3272380065, 1510334235, 755167117, - ] + # This spec fails when zlib.h and libz.so are not from the same version. + # In older zlib (< 1.2.7 it seems), get_crc_table() is stored as u64[], + # but in newer zlib, get_crc_table() is stored as u32[]. + # Technically, there is ABI breakage between those zlib versions, + # but get_crc_table() is an "undocumented function" according to zlib.h. + guard -> { ENV["RUBY_SPEC_TEST_ZLIB_CRC_TABLE"] != "false" } do + it "returns the same value as zlib's get_crc_table()" do + Zlib.crc_table.should == [ + 0, 1996959894, 3993919788, 2567524794, + 124634137, 1886057615, 3915621685, 2657392035, + 249268274, 2044508324, 3772115230, 2547177864, + 162941995, 2125561021, 3887607047, 2428444049, + 498536548, 1789927666, 4089016648, 2227061214, + 450548861, 1843258603, 4107580753, 2211677639, + 325883990, 1684777152, 4251122042, 2321926636, + 335633487, 1661365465, 4195302755, 2366115317, + 997073096, 1281953886, 3579855332, 2724688242, + 1006888145, 1258607687, 3524101629, 2768942443, + 901097722, 1119000684, 3686517206, 2898065728, + 853044451, 1172266101, 3705015759, 2882616665, + 651767980, 1373503546, 3369554304, 3218104598, + 565507253, 1454621731, 3485111705, 3099436303, + 671266974, 1594198024, 3322730930, 2970347812, + 795835527, 1483230225, 3244367275, 3060149565, + 1994146192, 31158534, 2563907772, 4023717930, + 1907459465, 112637215, 2680153253, 3904427059, + 2013776290, 251722036, 2517215374, 3775830040, + 2137656763, 141376813, 2439277719, 3865271297, + 1802195444, 476864866, 2238001368, 4066508878, + 1812370925, 453092731, 2181625025, 4111451223, + 1706088902, 314042704, 2344532202, 4240017532, + 1658658271, 366619977, 2362670323, 4224994405, + 1303535960, 984961486, 2747007092, 3569037538, + 1256170817, 1037604311, 2765210733, 3554079995, + 1131014506, 879679996, 2909243462, 3663771856, + 1141124467, 855842277, 2852801631, 3708648649, + 1342533948, 654459306, 3188396048, 3373015174, + 1466479909, 544179635, 3110523913, 3462522015, + 1591671054, 702138776, 2966460450, 3352799412, + 1504918807, 783551873, 3082640443, 3233442989, + 3988292384, 2596254646, 62317068, 1957810842, + 3939845945, 2647816111, 81470997, 1943803523, + 3814918930, 2489596804, 225274430, 2053790376, + 3826175755, 2466906013, 167816743, 2097651377, + 4027552580, 2265490386, 503444072, 1762050814, + 4150417245, 2154129355, 426522225, 1852507879, + 4275313526, 2312317920, 282753626, 1742555852, + 4189708143, 2394877945, 397917763, 1622183637, + 3604390888, 2714866558, 953729732, 1340076626, + 3518719985, 2797360999, 1068828381, 1219638859, + 3624741850, 2936675148, 906185462, 1090812512, + 3747672003, 2825379669, 829329135, 1181335161, + 3412177804, 3160834842, 628085408, 1382605366, + 3423369109, 3138078467, 570562233, 1426400815, + 3317316542, 2998733608, 733239954, 1555261956, + 3268935591, 3050360625, 752459403, 1541320221, + 2607071920, 3965973030, 1969922972, 40735498, + 2617837225, 3943577151, 1913087877, 83908371, + 2512341634, 3803740692, 2075208622, 213261112, + 2463272603, 3855990285, 2094854071, 198958881, + 2262029012, 4057260610, 1759359992, 534414190, + 2176718541, 4139329115, 1873836001, 414664567, + 2282248934, 4279200368, 1711684554, 285281116, + 2405801727, 4167216745, 1634467795, 376229701, + 2685067896, 3608007406, 1308918612, 956543938, + 2808555105, 3495958263, 1231636301, 1047427035, + 2932959818, 3654703836, 1088359270, 936918000, + 2847714899, 3736837829, 1202900863, 817233897, + 3183342108, 3401237130, 1404277552, 615818150, + 3134207493, 3453421203, 1423857449, 601450431, + 3009837614, 3294710456, 1567103746, 711928724, + 3020668471, 3272380065, 1510334235, 755167117, + ] + end end - end diff --git a/spec/ruby/library/zlib/deflate/append_spec.rb b/spec/ruby/library/zlib/deflate/append_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/deflate/append_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/deflate/deflate_spec.rb b/spec/ruby/library/zlib/deflate/deflate_spec.rb index 828880f8d8..e16e6ad0ef 100644 --- a/spec/ruby/library/zlib/deflate/deflate_spec.rb +++ b/spec/ruby/library/zlib/deflate/deflate_spec.rb @@ -23,7 +23,7 @@ describe "Zlib::Deflate.deflate" do it "deflates chunked data" do random_generator = Random.new(0) - deflated = '' + deflated = +'' Zlib::Deflate.deflate(random_generator.bytes(20000)) do |chunk| deflated << chunk @@ -58,6 +58,11 @@ describe "Zlib::Deflate#deflate" do Array.new(31, 0) + [24, 128, 0, 0, 1]).pack('C*') end + + it "has a binary encoding" do + @deflator.deflate("").encoding.should == Encoding::BINARY + @deflator.finish.encoding.should == Encoding::BINARY + end end describe "Zlib::Deflate#deflate" do @@ -65,7 +70,7 @@ describe "Zlib::Deflate#deflate" do before :each do @deflator = Zlib::Deflate.new @random_generator = Random.new(0) - @original = '' + @original = +'' @chunks = [] end diff --git a/spec/ruby/library/zlib/deflate/flush_spec.rb b/spec/ruby/library/zlib/deflate/flush_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/deflate/flush_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/deflate/new_spec.rb b/spec/ruby/library/zlib/deflate/new_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/deflate/new_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/deflate/params_spec.rb b/spec/ruby/library/zlib/deflate/params_spec.rb index 0b1cca8c8a..0242653528 100644 --- a/spec/ruby/library/zlib/deflate/params_spec.rb +++ b/spec/ruby/library/zlib/deflate/params_spec.rb @@ -3,7 +3,7 @@ require 'zlib' describe "Zlib::Deflate#params" do it "changes the deflate parameters" do - data = 'abcdefghijklm' + data = +'abcdefghijklm' d = Zlib::Deflate.new Zlib::NO_COMPRESSION, Zlib::MAX_WBITS, Zlib::DEF_MEM_LEVEL, Zlib::DEFAULT_STRATEGY diff --git a/spec/ruby/library/zlib/deflate_spec.rb b/spec/ruby/library/zlib/deflate_spec.rb index 01538dd4e6..6eeaa164c5 100644 --- a/spec/ruby/library/zlib/deflate_spec.rb +++ b/spec/ruby/library/zlib/deflate_spec.rb @@ -1,7 +1,7 @@ require_relative '../../spec_helper' require "zlib" -describe "Zlib#deflate" do +describe "Zlib.deflate" do it "deflates some data" do Zlib.deflate("1" * 10).should == [120, 156, 51, 52, 132, 1, 0, 10, 145, 1, 235].pack('C*') end diff --git a/spec/ruby/library/zlib/gunzip_spec.rb b/spec/ruby/library/zlib/gunzip_spec.rb new file mode 100644 index 0000000000..2417fed57c --- /dev/null +++ b/spec/ruby/library/zlib/gunzip_spec.rb @@ -0,0 +1,14 @@ +require_relative '../../spec_helper' +require 'zlib' + +describe "Zlib.gunzip" do + before :each do + @data = '12345abcde' + @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, + 76, 74, 78, 73, 5, 0, 157, 5, 0, 36, 10, 0, 0, 0].pack('C*') + end + + it "decodes the given gzipped string" do + Zlib.gunzip(@zip).should == @data + end +end diff --git a/spec/ruby/library/zlib/gzip_spec.rb b/spec/ruby/library/zlib/gzip_spec.rb new file mode 100644 index 0000000000..35694264f0 --- /dev/null +++ b/spec/ruby/library/zlib/gzip_spec.rb @@ -0,0 +1,15 @@ +require_relative '../../spec_helper' +require 'zlib' + +describe "Zlib.gzip" do + before :each do + @data = '12345abcde' + @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, + 76, 74, 78, 73, 5, 0, 157, 5, 0, 36, 10, 0, 0, 0].pack('C*') + end + + it "gzips the given string" do + # skip gzip header for now + Zlib.gzip(@data)[10..-1].should == @zip[10..-1] + end +end diff --git a/spec/ruby/library/zlib/gzipfile/close_spec.rb b/spec/ruby/library/zlib/gzipfile/close_spec.rb index 27eb34cdd9..07bafac961 100644 --- a/spec/ruby/library/zlib/gzipfile/close_spec.rb +++ b/spec/ruby/library/zlib/gzipfile/close_spec.rb @@ -8,12 +8,10 @@ describe "Zlib::GzipFile#close" do Zlib::GzipWriter.wrap io do |gzio| gzio.close - gzio.closed?.should == true + gzio.should.closed? - lambda { gzio.orig_name }.should \ - raise_error(Zlib::GzipFile::Error, 'closed gzip stream') - lambda { gzio.comment }.should \ - raise_error(Zlib::GzipFile::Error, 'closed gzip stream') + -> { gzio.orig_name }.should.raise(Zlib::GzipFile::Error, 'closed gzip stream') + -> { gzio.comment }.should.raise(Zlib::GzipFile::Error, 'closed gzip stream') end io.string[10..-1].should == ([3] + Array.new(9,0)).pack('C*') diff --git a/spec/ruby/library/zlib/gzipfile/closed_spec.rb b/spec/ruby/library/zlib/gzipfile/closed_spec.rb index b885add485..726f391b41 100644 --- a/spec/ruby/library/zlib/gzipfile/closed_spec.rb +++ b/spec/ruby/library/zlib/gzipfile/closed_spec.rb @@ -6,11 +6,11 @@ describe "Zlib::GzipFile#closed?" do it "returns the closed status" do io = StringIO.new Zlib::GzipWriter.wrap io do |gzio| - gzio.closed?.should == false + gzio.should_not.closed? gzio.close - gzio.closed?.should == true + gzio.should.closed? end end end diff --git a/spec/ruby/library/zlib/gzipfile/comment_spec.rb b/spec/ruby/library/zlib/gzipfile/comment_spec.rb index 7493f74f1c..845224df98 100644 --- a/spec/ruby/library/zlib/gzipfile/comment_spec.rb +++ b/spec/ruby/library/zlib/gzipfile/comment_spec.rb @@ -19,8 +19,7 @@ describe "Zlib::GzipFile#comment" do Zlib::GzipWriter.wrap @io do |gzio| gzio.close - lambda { gzio.comment }.should \ - raise_error(Zlib::GzipFile::Error, 'closed gzip stream') + -> { gzio.comment }.should.raise(Zlib::GzipFile::Error, 'closed gzip stream') end end end diff --git a/spec/ruby/library/zlib/gzipfile/crc_spec.rb b/spec/ruby/library/zlib/gzipfile/crc_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/crc_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/finish_spec.rb b/spec/ruby/library/zlib/gzipfile/finish_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/finish_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/level_spec.rb b/spec/ruby/library/zlib/gzipfile/level_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/level_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/mtime_spec.rb b/spec/ruby/library/zlib/gzipfile/mtime_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/mtime_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/orig_name_spec.rb b/spec/ruby/library/zlib/gzipfile/orig_name_spec.rb index cae5305355..1da375390b 100644 --- a/spec/ruby/library/zlib/gzipfile/orig_name_spec.rb +++ b/spec/ruby/library/zlib/gzipfile/orig_name_spec.rb @@ -19,8 +19,7 @@ describe "Zlib::GzipFile#orig_name" do Zlib::GzipWriter.wrap @io do |gzio| gzio.close - lambda { gzio.orig_name }.should \ - raise_error(Zlib::GzipFile::Error, 'closed gzip stream') + -> { gzio.orig_name }.should.raise(Zlib::GzipFile::Error, 'closed gzip stream') end end end diff --git a/spec/ruby/library/zlib/gzipfile/os_code_spec.rb b/spec/ruby/library/zlib/gzipfile/os_code_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/os_code_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/sync_spec.rb b/spec/ruby/library/zlib/gzipfile/sync_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/sync_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/to_io_spec.rb b/spec/ruby/library/zlib/gzipfile/to_io_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/to_io_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipfile/wrap_spec.rb b/spec/ruby/library/zlib/gzipfile/wrap_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipfile/wrap_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/each_byte_spec.rb b/spec/ruby/library/zlib/gzipreader/each_byte_spec.rb index d2c43ecaa4..48821dc833 100644 --- a/spec/ruby/library/zlib/gzipreader/each_byte_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/each_byte_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#each_byte" do +describe "Zlib::GzipReader#each_byte" do before :each do @data = '12345abcde' diff --git a/spec/ruby/library/zlib/gzipreader/each_char_spec.rb b/spec/ruby/library/zlib/gzipreader/each_char_spec.rb new file mode 100644 index 0000000000..de6396da7e --- /dev/null +++ b/spec/ruby/library/zlib/gzipreader/each_char_spec.rb @@ -0,0 +1,51 @@ +require_relative '../../../spec_helper' +require 'stringio' +require 'zlib' + +describe "Zlib::GzipReader#each_char" do + + before :each do + @data = '12345abcde' + @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, + 76, 74, 78, 73, 5, 0, 157, 5, 0, 36, 10, 0, 0, 0].pack('C*') + + @io = StringIO.new @zip + ScratchPad.clear + end + + it "calls the given block for each char in the stream, passing the char as an argument" do + gz = Zlib::GzipReader.new @io + + ScratchPad.record [] + gz.each_char { |b| ScratchPad << b } + + ScratchPad.recorded.should == ["1", "2", "3", "4", "5", "a", "b", "c", "d", "e"] + end + + it "returns an enumerator, which yields each char in the stream, when no block is passed" do + gz = Zlib::GzipReader.new @io + enum = gz.each_char + + ScratchPad.record [] + while true + begin + ScratchPad << enum.next + rescue StopIteration + break + end + end + + ScratchPad.recorded.should == ["1", "2", "3", "4", "5", "a", "b", "c", "d", "e"] + end + + it "increments position before calling the block" do + gz = Zlib::GzipReader.new @io + + i = 1 + gz.each_char do |ignore| + gz.pos.should == i + i += 1 + end + end + +end diff --git a/spec/ruby/library/zlib/gzipreader/each_line_spec.rb b/spec/ruby/library/zlib/gzipreader/each_line_spec.rb index b576788e27..6f17365879 100644 --- a/spec/ruby/library/zlib/gzipreader/each_line_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/each_line_spec.rb @@ -1,5 +1,6 @@ +require_relative "../../../spec_helper" require_relative 'shared/each' -describe "GzipReader#each_line" do +describe "Zlib::GzipReader#each_line" do it_behaves_like :gzipreader_each, :each_line end diff --git a/spec/ruby/library/zlib/gzipreader/each_spec.rb b/spec/ruby/library/zlib/gzipreader/each_spec.rb index f9b90be316..3b98391a87 100644 --- a/spec/ruby/library/zlib/gzipreader/each_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/each_spec.rb @@ -1,5 +1,6 @@ +require_relative "../../../spec_helper" require_relative 'shared/each' -describe "GzipReader#each" do +describe "Zlib::GzipReader#each" do it_behaves_like :gzipreader_each, :each end diff --git a/spec/ruby/library/zlib/gzipreader/eof_spec.rb b/spec/ruby/library/zlib/gzipreader/eof_spec.rb index e33d8e3133..a38e144c72 100644 --- a/spec/ruby/library/zlib/gzipreader/eof_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/eof_spec.rb @@ -2,8 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#eof?" do - +describe "Zlib::GzipReader#eof?" do before :each do @data = '{"a":1234}' @zip = [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 171, 86, 74, 84, 178, 50, @@ -13,31 +12,31 @@ describe "GzipReader#eof?" do it "returns true when at EOF" do gz = Zlib::GzipReader.new @io - gz.eof?.should be_false + gz.eof?.should == false gz.read - gz.eof?.should be_true + gz.eof?.should == true end it "returns true when at EOF with the exact length of uncompressed data" do gz = Zlib::GzipReader.new @io - gz.eof?.should be_false + gz.eof?.should == false gz.read(10) - gz.eof?.should be_true + gz.eof?.should == true end it "returns true when at EOF with a length greater than the size of uncompressed data" do gz = Zlib::GzipReader.new @io - gz.eof?.should be_false + gz.eof?.should == false gz.read(11) - gz.eof?.should be_true + gz.eof?.should == true end it "returns false when at EOF when there's data left in the buffer to read" do gz = Zlib::GzipReader.new @io gz.read(9) - gz.eof?.should be_false + gz.eof?.should == false gz.read - gz.eof?.should be_true + gz.eof?.should == true end # This is especially important for JRuby, since eof? there @@ -45,12 +44,11 @@ describe "GzipReader#eof?" do it "does not affect the reading data" do gz = Zlib::GzipReader.new @io 0.upto(9) do |i| - gz.eof?.should be_false + gz.eof?.should == false gz.read(1).should == @data[i, 1] end - gz.eof?.should be_true - gz.read().should == "" - gz.eof?.should be_true + gz.eof?.should == true + gz.read.should == "" + gz.eof?.should == true end - end diff --git a/spec/ruby/library/zlib/gzipreader/getc_spec.rb b/spec/ruby/library/zlib/gzipreader/getc_spec.rb index 90b5ffe37a..be13592189 100644 --- a/spec/ruby/library/zlib/gzipreader/getc_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/getc_spec.rb @@ -2,8 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#getc" do - +describe "Zlib::GzipReader#getc" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, @@ -34,8 +33,7 @@ describe "GzipReader#getc" do gz = Zlib::GzipReader.new @io gz.read pos = gz.pos - gz.getc.should be_nil + gz.getc.should == nil gz.pos.should == pos end - end diff --git a/spec/ruby/library/zlib/gzipreader/gets_spec.rb b/spec/ruby/library/zlib/gzipreader/gets_spec.rb index 8e4465e49c..5d0809f833 100644 --- a/spec/ruby/library/zlib/gzipreader/gets_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/gets_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'zlib' require 'stringio' -describe 'GzipReader#gets' do +describe 'Zlib::GzipReader#gets' do describe 'with "" separator' do it 'reads paragraphs skipping newlines' do # gz contains "\n\n\n\n\n123\n45\n\n\n\n\nabc\nde\n\n\n\n\n" @@ -16,7 +16,7 @@ describe 'GzipReader#gets' do gz.gets('').should == "123\n45\n\n" gz.gets('').should == "abc\nde\n\n" - gz.eof?.should be_true + gz.eof?.should == true end end end diff --git a/spec/ruby/library/zlib/gzipreader/lineno_spec.rb b/spec/ruby/library/zlib/gzipreader/lineno_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/lineno_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/mtime_spec.rb b/spec/ruby/library/zlib/gzipreader/mtime_spec.rb new file mode 100644 index 0000000000..e8e71fa72e --- /dev/null +++ b/spec/ruby/library/zlib/gzipreader/mtime_spec.rb @@ -0,0 +1,11 @@ +require_relative '../../../spec_helper' +require 'zlib' +require 'stringio' + +describe "Zlib::GzipReader#mtime" do + it "returns the timestamp from the Gzip header" do + io = StringIO.new "\x1f\x8b\x08\x00\x44\x33\x22\x11\x00\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00" + gz = Zlib::GzipReader.new(io) + gz.mtime.to_i.should == 0x11223344 + end +end diff --git a/spec/ruby/library/zlib/gzipreader/new_spec.rb b/spec/ruby/library/zlib/gzipreader/new_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/new_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/open_spec.rb b/spec/ruby/library/zlib/gzipreader/open_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/open_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/pos_spec.rb b/spec/ruby/library/zlib/gzipreader/pos_spec.rb index df7c78ad8f..8586faec92 100644 --- a/spec/ruby/library/zlib/gzipreader/pos_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/pos_spec.rb @@ -2,8 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#pos" do - +describe "Zlib::GzipReader#pos" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, @@ -22,5 +21,4 @@ describe "GzipReader#pos" do gz.read gz.pos.should == @data.length end - end diff --git a/spec/ruby/library/zlib/gzipreader/read_spec.rb b/spec/ruby/library/zlib/gzipreader/read_spec.rb index a90b2bf498..b07d433bdd 100644 --- a/spec/ruby/library/zlib/gzipreader/read_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/read_spec.rb @@ -2,8 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#read" do - +describe "Zlib::GzipReader#read" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, @@ -29,9 +28,9 @@ describe "GzipReader#read" do it "does not accept a negative length to read" do gz = Zlib::GzipReader.new @io - lambda { + -> { gz.read(-1) - }.should raise_error(ArgumentError) + }.should.raise(ArgumentError) end it "returns an empty string if a 0 length is given" do @@ -49,7 +48,7 @@ describe "GzipReader#read" do end describe "at the end of data" do - it "returns empty string if length prameter is not specified or 0" do + it "returns empty string if length parameter is not specified or 0" do gz = Zlib::GzipReader.new @io gz.read # read till the end gz.read(0).should == "" @@ -57,12 +56,11 @@ describe "GzipReader#read" do gz.read(nil).should == "" end - it "returns nil if length prameter is positive" do + it "returns nil if length parameter is positive" do gz = Zlib::GzipReader.new @io gz.read # read till the end - gz.read(1).should be_nil - gz.read(2**16).should be_nil + gz.read(1).should == nil + gz.read(2**16).should == nil end end - end diff --git a/spec/ruby/library/zlib/gzipreader/readchar_spec.rb b/spec/ruby/library/zlib/gzipreader/readchar_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/readchar_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/readline_spec.rb b/spec/ruby/library/zlib/gzipreader/readline_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/readline_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/readlines_spec.rb b/spec/ruby/library/zlib/gzipreader/readlines_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/readlines_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/readpartial_spec.rb b/spec/ruby/library/zlib/gzipreader/readpartial_spec.rb index a367e5b856..559ce9f841 100644 --- a/spec/ruby/library/zlib/gzipreader/readpartial_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/readpartial_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe 'GzipReader#readpartial' do +describe "Zlib::GzipReader#readpartial" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, diff --git a/spec/ruby/library/zlib/gzipreader/rewind_spec.rb b/spec/ruby/library/zlib/gzipreader/rewind_spec.rb index 2e22458b43..b31abb6abf 100644 --- a/spec/ruby/library/zlib/gzipreader/rewind_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/rewind_spec.rb @@ -2,8 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipReader#rewind" do - +describe "Zlib::GzipReader#rewind" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, diff --git a/spec/ruby/library/zlib/gzipreader/shared/each.rb b/spec/ruby/library/zlib/gzipreader/shared/each.rb index 11c15d8a66..71608e04ab 100644 --- a/spec/ruby/library/zlib/gzipreader/shared/each.rb +++ b/spec/ruby/library/zlib/gzipreader/shared/each.rb @@ -3,7 +3,6 @@ require 'stringio' require 'zlib' describe :gzipreader_each, shared: true do - before :each do @data = "firstline\nsecondline\n\nforthline" @zip = [31, 139, 8, 0, 244, 125, 128, 88, 2, 255, 75, 203, 44, 42, 46, 201, @@ -47,5 +46,4 @@ describe :gzipreader_each, shared: true do @gzreader.pos.should == i end end - end diff --git a/spec/ruby/library/zlib/gzipreader/tell_spec.rb b/spec/ruby/library/zlib/gzipreader/tell_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/tell_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipreader/ungetbyte_spec.rb b/spec/ruby/library/zlib/gzipreader/ungetbyte_spec.rb index f29927e20b..53870b9177 100644 --- a/spec/ruby/library/zlib/gzipreader/ungetbyte_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/ungetbyte_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe 'GzipReader#ungetbyte' do +describe "Zlib::GzipReader#ungetbyte" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, @@ -21,11 +21,9 @@ describe 'GzipReader#ungetbyte' do @gz.read.should == '!12345abcde' end - ruby_bug "#13616", ""..."2.6" do - it 'decrements pos' do - @gz.ungetbyte 0x21 - @gz.pos.should == -1 - end + it 'decrements pos' do + @gz.ungetbyte 0x21 + @gz.pos.should == -1 end end @@ -96,7 +94,7 @@ describe 'GzipReader#ungetbyte' do it 'makes eof? false' do @gz.ungetbyte 0x21 - @gz.eof?.should be_false + @gz.eof?.should == false end end @@ -114,7 +112,7 @@ describe 'GzipReader#ungetbyte' do it 'does not make eof? false' do @gz.ungetbyte nil - @gz.eof?.should be_true + @gz.eof?.should == true end end end diff --git a/spec/ruby/library/zlib/gzipreader/ungetc_spec.rb b/spec/ruby/library/zlib/gzipreader/ungetc_spec.rb index d749d58cca..46dcfde989 100644 --- a/spec/ruby/library/zlib/gzipreader/ungetc_spec.rb +++ b/spec/ruby/library/zlib/gzipreader/ungetc_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe 'GzipReader#ungetc' do +describe "Zlib::GzipReader#ungetc" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, @@ -21,11 +21,9 @@ describe 'GzipReader#ungetc' do @gz.read.should == 'x12345abcde' end - ruby_bug "#13616", ""..."2.6" do - it 'decrements pos' do - @gz.ungetc 'x' - @gz.pos.should == -1 - end + it 'decrements pos' do + @gz.ungetc 'x' + @gz.pos.should == -1 end end @@ -35,11 +33,9 @@ describe 'GzipReader#ungetc' do @gz.read.should == 'ŷ12345abcde' end - ruby_bug "#13616", ""..."2.6" do - it 'decrements pos' do - @gz.ungetc 'ŷ' - @gz.pos.should == -2 - end + it 'decrements pos' do + @gz.ungetc 'ŷ' + @gz.pos.should == -2 end end @@ -49,11 +45,9 @@ describe 'GzipReader#ungetc' do @gz.read.should == 'xŷž12345abcde' end - ruby_bug "#13616", ""..."2.6" do - it 'decrements pos' do - @gz.ungetc 'xŷž' - @gz.pos.should == -5 - end + it 'decrements pos' do + @gz.ungetc 'xŷž' + @gz.pos.should == -5 end end @@ -63,11 +57,9 @@ describe 'GzipReader#ungetc' do @gz.read.should == '!12345abcde' end - ruby_bug "#13616", ""..."2.6" do - it 'decrements pos' do - @gz.ungetc 0x21 - @gz.pos.should == -1 - end + it 'decrements pos' do + @gz.ungetc 0x21 + @gz.pos.should == -1 end end @@ -198,7 +190,7 @@ describe 'GzipReader#ungetc' do it 'makes eof? false' do @gz.ungetc 'x' - @gz.eof?.should be_false + @gz.eof?.should == false end end @@ -215,7 +207,7 @@ describe 'GzipReader#ungetc' do it 'makes eof? false' do @gz.ungetc 'ŷ' - @gz.eof?.should be_false + @gz.eof?.should == false end end @@ -232,7 +224,7 @@ describe 'GzipReader#ungetc' do it 'makes eof? false' do @gz.ungetc 'xŷž' - @gz.eof?.should be_false + @gz.eof?.should == false end end @@ -249,7 +241,7 @@ describe 'GzipReader#ungetc' do it 'makes eof? false' do @gz.ungetc 0x21 - @gz.eof?.should be_false + @gz.eof?.should == false end end @@ -266,7 +258,7 @@ describe 'GzipReader#ungetc' do it 'does not make eof? false' do @gz.ungetc '' - @gz.eof?.should be_true + @gz.eof?.should == true end end @@ -284,7 +276,7 @@ describe 'GzipReader#ungetc' do it 'does not make eof? false' do @gz.ungetc nil - @gz.eof?.should be_true + @gz.eof?.should == true end end end diff --git a/spec/ruby/library/zlib/gzipreader/unused_spec.rb b/spec/ruby/library/zlib/gzipreader/unused_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipreader/unused_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/append_spec.rb b/spec/ruby/library/zlib/gzipwriter/append_spec.rb index 9404dbd8b2..ef9e3d3a6b 100644 --- a/spec/ruby/library/zlib/gzipwriter/append_spec.rb +++ b/spec/ruby/library/zlib/gzipwriter/append_spec.rb @@ -9,9 +9,7 @@ describe "Zlib::GzipWriter#<<" do it "returns self" do Zlib::GzipWriter.wrap @io do |gzio| - (gzio << "test").should equal(gzio) + (gzio << "test").should.equal?(gzio) end end - - it "needs to be reviewed for spec completeness" end diff --git a/spec/ruby/library/zlib/gzipwriter/comment_spec.rb b/spec/ruby/library/zlib/gzipwriter/comment_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/comment_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/flush_spec.rb b/spec/ruby/library/zlib/gzipwriter/flush_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/flush_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/mtime_spec.rb b/spec/ruby/library/zlib/gzipwriter/mtime_spec.rb index 96e2b18368..a70fa68069 100644 --- a/spec/ruby/library/zlib/gzipwriter/mtime_spec.rb +++ b/spec/ruby/library/zlib/gzipwriter/mtime_spec.rb @@ -31,8 +31,7 @@ describe "Zlib::GzipWriter#mtime=" do Zlib::GzipWriter.wrap @io do |gzio| gzio.write '' - lambda { gzio.mtime = nil }.should \ - raise_error(Zlib::GzipFile::Error, 'header is already written') + -> { gzio.mtime = nil }.should.raise(Zlib::GzipFile::Error, 'header is already written') end end end diff --git a/spec/ruby/library/zlib/gzipwriter/new_spec.rb b/spec/ruby/library/zlib/gzipwriter/new_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/new_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/open_spec.rb b/spec/ruby/library/zlib/gzipwriter/open_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/open_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/orig_name_spec.rb b/spec/ruby/library/zlib/gzipwriter/orig_name_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/orig_name_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/pos_spec.rb b/spec/ruby/library/zlib/gzipwriter/pos_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/pos_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/print_spec.rb b/spec/ruby/library/zlib/gzipwriter/print_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/print_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/printf_spec.rb b/spec/ruby/library/zlib/gzipwriter/printf_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/printf_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/putc_spec.rb b/spec/ruby/library/zlib/gzipwriter/putc_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/putc_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/puts_spec.rb b/spec/ruby/library/zlib/gzipwriter/puts_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/puts_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/tell_spec.rb b/spec/ruby/library/zlib/gzipwriter/tell_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/gzipwriter/tell_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/gzipwriter/write_spec.rb b/spec/ruby/library/zlib/gzipwriter/write_spec.rb index f694ce7cb7..522ae7f2aa 100644 --- a/spec/ruby/library/zlib/gzipwriter/write_spec.rb +++ b/spec/ruby/library/zlib/gzipwriter/write_spec.rb @@ -2,7 +2,7 @@ require_relative '../../../spec_helper' require 'stringio' require 'zlib' -describe "GzipWriter#write" do +describe "Zlib::GzipWriter#write" do before :each do @data = '12345abcde' @zip = [31, 139, 8, 0, 44, 220, 209, 71, 0, 3, 51, 52, 50, 54, 49, 77, diff --git a/spec/ruby/library/zlib/inflate/append_spec.rb b/spec/ruby/library/zlib/inflate/append_spec.rb index e1c357f82e..a4c791e31e 100644 --- a/spec/ruby/library/zlib/inflate/append_spec.rb +++ b/spec/ruby/library/zlib/inflate/append_spec.rb @@ -41,7 +41,7 @@ describe "Zlib::Inflate#<<" do it "properly handles incomplete data" do # add bytes, one by one @foo_deflated[0, 5].each_byte { |d| @z << d.chr} - lambda { @z.finish }.should raise_error(Zlib::BufError) + -> { @z.finish }.should.raise(Zlib::BufError) end it "properly handles excessive data, byte-by-byte" do diff --git a/spec/ruby/library/zlib/inflate/finish_spec.rb b/spec/ruby/library/zlib/inflate/finish_spec.rb index f6e592fb6b..b7494e419c 100644 --- a/spec/ruby/library/zlib/inflate/finish_spec.rb +++ b/spec/ruby/library/zlib/inflate/finish_spec.rb @@ -1,3 +1,4 @@ +require_relative "../../../spec_helper" require 'zlib' describe "Zlib::Inflate#finish" do @@ -22,7 +23,7 @@ describe "Zlib::Inflate#finish" do end it "each chunk should have the same prefix" do - @chunks.all? { |chunk| chunk =~ /\A0+\z/ }.should be_true + @chunks.all? { |chunk| chunk =~ /\A0+\z/ }.should == true end end diff --git a/spec/ruby/library/zlib/inflate/inflate_spec.rb b/spec/ruby/library/zlib/inflate/inflate_spec.rb index 7d66fb039a..92e52363db 100644 --- a/spec/ruby/library/zlib/inflate/inflate_spec.rb +++ b/spec/ruby/library/zlib/inflate/inflate_spec.rb @@ -39,6 +39,13 @@ describe "Zlib::Inflate#inflate" do @inflator.finish.should == 'uncompressed_data' end + it "has a binary encoding" do + data = [120, 156, 99, 96, 128, 1, 0, 0, 10, 0, 1].pack('C*') + unzipped = @inflator.inflate data + @inflator.finish.encoding.should == Encoding::BINARY + unzipped.encoding.should == Encoding::BINARY + end + end describe "Zlib::Inflate.inflate" do @@ -65,7 +72,7 @@ describe "Zlib::Inflate.inflate" do data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') z = Zlib::Inflate.new # add bytes, one by one - result = "" + result = +"" data.each_byte { |d| result << z.inflate(d.chr)} result << z.finish result.should == "foo" @@ -75,15 +82,15 @@ describe "Zlib::Inflate.inflate" do data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*')[0,5] z = Zlib::Inflate.new # add bytes, one by one, but not all - result = "" + result = +"" data.each_byte { |d| result << z.inflate(d.chr)} - lambda { result << z.finish }.should raise_error(Zlib::BufError) + -> { result << z.finish }.should.raise(Zlib::BufError) end it "properly handles excessive data, byte-by-byte" do main_data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') data = main_data * 2 - result = "" + result = +"" z = Zlib::Inflate.new # add bytes, one by one @@ -98,7 +105,7 @@ describe "Zlib::Inflate.inflate" do it "properly handles excessive data, in one go" do main_data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') data = main_data * 2 - result = "" + result = +"" z = Zlib::Inflate.new result << z.inflate(data) @@ -131,7 +138,7 @@ describe "Zlib::Inflate#inflate" do end it "properly handles chunked data" do - @chunks.all? { |chunk| chunk =~ /\A0+\z/ }.should be_true + @chunks.all? { |chunk| chunk =~ /\A0+\z/ }.should == true end end diff --git a/spec/ruby/library/zlib/inflate/new_spec.rb b/spec/ruby/library/zlib/inflate/new_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/inflate/new_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/inflate/set_dictionary_spec.rb b/spec/ruby/library/zlib/inflate/set_dictionary_spec.rb index 251cec44bb..375ee3c765 100644 --- a/spec/ruby/library/zlib/inflate/set_dictionary_spec.rb +++ b/spec/ruby/library/zlib/inflate/set_dictionary_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: binary -*- +# encoding: binary require_relative '../../../spec_helper' require 'zlib' diff --git a/spec/ruby/library/zlib/inflate/sync_point_spec.rb b/spec/ruby/library/zlib/inflate/sync_point_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/inflate/sync_point_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/inflate/sync_spec.rb b/spec/ruby/library/zlib/inflate/sync_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/inflate/sync_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/inflate_spec.rb b/spec/ruby/library/zlib/inflate_spec.rb index 393bea4f3c..42c8dc5fbe 100644 --- a/spec/ruby/library/zlib/inflate_spec.rb +++ b/spec/ruby/library/zlib/inflate_spec.rb @@ -1,7 +1,7 @@ require_relative '../../spec_helper' require "zlib" -describe "Zlib#inflate" do +describe "Zlib.inflate" do it "inflates some data" do Zlib.inflate([120, 156, 51, 52, 132, 1, 0, 10, 145, 1, 235].pack('C*')).should == "1" * 10 end diff --git a/spec/ruby/library/zlib/zlib_version_spec.rb b/spec/ruby/library/zlib/zlib_version_spec.rb index e724feaa39..7edc76cdd5 100644 --- a/spec/ruby/library/zlib/zlib_version_spec.rb +++ b/spec/ruby/library/zlib/zlib_version_spec.rb @@ -1 +1,8 @@ require_relative '../../spec_helper' +require 'zlib' + +describe "Zlib.zlib_version" do + it "returns the version of the libz library" do + Zlib.zlib_version.should.instance_of?(String) + end +end diff --git a/spec/ruby/library/zlib/zstream/close_spec.rb b/spec/ruby/library/zlib/zstream/close_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/close_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/closed_spec.rb b/spec/ruby/library/zlib/zstream/closed_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/closed_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/end_spec.rb b/spec/ruby/library/zlib/zstream/end_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/end_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/ended_spec.rb b/spec/ruby/library/zlib/zstream/ended_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/ended_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/finish_spec.rb b/spec/ruby/library/zlib/zstream/finish_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/finish_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/finished_spec.rb b/spec/ruby/library/zlib/zstream/finished_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/finished_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/flush_next_in_spec.rb b/spec/ruby/library/zlib/zstream/flush_next_in_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/flush_next_in_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/flush_next_out_spec.rb b/spec/ruby/library/zlib/zstream/flush_next_out_spec.rb index 59a0622903..63676a8203 100644 --- a/spec/ruby/library/zlib/zstream/flush_next_out_spec.rb +++ b/spec/ruby/library/zlib/zstream/flush_next_out_spec.rb @@ -8,7 +8,7 @@ describe "Zlib::ZStream#flush_next_out" do zs << [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') zs.flush_next_out.should == 'foo' - zs.finished?.should == true + zs.should.finished? zs.flush_next_out.should == '' end end diff --git a/spec/ruby/library/zlib/zstream/reset_spec.rb b/spec/ruby/library/zlib/zstream/reset_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/reset_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/stream_end_spec.rb b/spec/ruby/library/zlib/zstream/stream_end_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/stream_end_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/total_in_spec.rb b/spec/ruby/library/zlib/zstream/total_in_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/total_in_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' diff --git a/spec/ruby/library/zlib/zstream/total_out_spec.rb b/spec/ruby/library/zlib/zstream/total_out_spec.rb deleted file mode 100644 index e15f14f95f..0000000000 --- a/spec/ruby/library/zlib/zstream/total_out_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative '../../../spec_helper' |
