diff --git a/lib/tnetstring.rb b/lib/tnetstring.rb index 903f6c7..520a164 100644 --- a/lib/tnetstring.rb +++ b/lib/tnetstring.rb @@ -22,6 +22,8 @@ def self.parse(tnetstring) value = case payload_type when '#' payload.to_i + when '^' + payload.to_f when ',' payload when ']' @@ -145,6 +147,9 @@ def self.dump(obj) if obj.kind_of?(Integer) int_str = obj.to_s "#{int_str.length}:#{int_str}#" + elsif obj.kind_of?(Float) + float_str = obj.to_s + "#{float_str.length}:#{float_str}^" elsif obj.kind_of?(String) || obj.kind_of?(Symbol) "#{obj.length}:#{obj}," elsif obj.is_a?(TrueClass) diff --git a/spec/tnetstring_spec.rb b/spec/tnetstring_spec.rb index 3ea8f5e..7c605c9 100644 --- a/spec/tnetstring_spec.rb +++ b/spec/tnetstring_spec.rb @@ -2,8 +2,28 @@ describe TNetstring do context "parsing" do - it "parses an integer" do - TNetstring.parse('5:12345#')[0].should == 12345 + context "integers" do + it "parses a positive integer" do + TNetstring.parse('5:12345#')[0].should == 12345 + end + + it "parses a negative integer" do + TNetstring.parse('6:-12345#')[0].should == -12345 + end + end + + context "floats" do + it "parses a positve float" do + TNetstring.parse('3:3.5^')[0].should == 3.5 + end + + it "parses a negative float" do + TNetstring.parse('5:-3.14^')[0].should == -3.14 + end + + it "parses a float with leading zeros" do + TNetstring.parse('7:-000.14^')[0].should == -0.14 + end end it "parses an empty string" do @@ -78,8 +98,28 @@ end context "dumping" do - it "dumps an integer" do - TNetstring.dump(42).should == "2:42#" + context "integers" do + it "dumps a positive integer" do + TNetstring.dump(42).should == "2:42#" + end + + it "dumps a negative integer" do + TNetstring.dump(-42).should == "3:-42#" + end + end + + context "floats" do + it "dumps a positive float" do + TNetstring.dump(12.3).should == "4:12.3^" + end + + it "dumps a negative float" do + TNetstring.dump(-2.3).should == "4:-2.3^" + end + + it "dumps a float with integral value" do + TNetstring.dump(-42.0).should == "5:-42.0^" + end end it "dumps a string" do