From 61916e408d86d19d1659cd8042de6503aecc6c98 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Fri, 12 Mar 2010 14:34:13 -0800 Subject: Add a bunch of specs for attribute type casting. --- spec/attributes/boolean_spec.rb | 57 +++++++++++++++++++ spec/attributes/float_spec.rb | 119 ++++++++++++++++++++++++++++++++++++++++ spec/attributes/integer_spec.rb | 119 ++++++++++++++++++++++++++++++++++++++++ spec/attributes/string_spec.rb | 43 +++++++++++++++ spec/attributes/time_spec.rb | 22 ++++++++ 5 files changed, 360 insertions(+) create mode 100644 spec/attributes/boolean_spec.rb create mode 100644 spec/attributes/float_spec.rb create mode 100644 spec/attributes/integer_spec.rb create mode 100644 spec/attributes/string_spec.rb create mode 100644 spec/attributes/time_spec.rb (limited to 'spec/attributes') diff --git a/spec/attributes/boolean_spec.rb b/spec/attributes/boolean_spec.rb new file mode 100644 index 0000000000..bb7eeb886d --- /dev/null +++ b/spec/attributes/boolean_spec.rb @@ -0,0 +1,57 @@ +require 'spec_helper' + +module Arel + describe "Attributes::Boolean" do + + before :all do + @relation = Model.build do |r| + r.engine Testing::Engine.new + r.attribute :awesome, Attributes::Boolean + end + end + + def type_cast(val) + @relation[:awesome].type_cast(val) + end + + describe "#type_cast" do + it "returns same value if passed a boolean" do + val = true + type_cast(val).should eql(val) + end + + it "returns boolean representation (false) of nil" do + type_cast(nil).should eql(false) + end + + it "returns boolean representation of 'true', 'false'" do + type_cast('true').should eql(true) + type_cast('false').should eql(false) + end + + it "returns boolean representation of :true, :false" do + type_cast(:true).should eql(true) + type_cast(:false).should eql(false) + end + + it "returns boolean representation of 0, 1" do + type_cast(1).should == true + type_cast(0).should == false + end + + it "calls #to_s on arbitrary objects" do + obj = Object.new + obj.extend Module.new { def to_s ; 'true' ; end } + type_cast(obj).should == true + end + + [ Object.new, 'string', '00.0', 5 ].each do |value| + it "raises exception when attempting type_cast of non-boolean value #{value.inspect}" do + lambda do + type_cast(value) + end.should raise_error(TypecastError, /could not typecast/) + end + end + end + end +end \ No newline at end of file diff --git a/spec/attributes/float_spec.rb b/spec/attributes/float_spec.rb new file mode 100644 index 0000000000..3d8acbde7b --- /dev/null +++ b/spec/attributes/float_spec.rb @@ -0,0 +1,119 @@ +require 'spec_helper' +require 'bigdecimal' + +module Arel + describe "Attributes::Float" do + + before :all do + @relation = Model.build do |r| + r.engine Testing::Engine.new + r.attribute :percentage, Attributes::Float + end + end + + def type_cast(val) + @relation[:percentage].type_cast(val) + end + + describe "#type_cast" do + it "returns same value if an float" do + type_cast(24.01).should eql(24.01) + end + + it "returns nil if passed nil" do + type_cast(nil).should be_nil + end + + it "returns nil if passed empty string" do + type_cast('').should be_nil + end + + it "returns float representation of a zero string float" do + type_cast('0').should eql(0.0) + end + + it "returns float representation of a positive string integer" do + type_cast('24').should eql(24.0) + end + + it "returns float representation of a positive string integer with spaces" do + type_cast(' 24').should eql(24.0) + type_cast('24 ').should eql(24.0) + end + + it "returns float representation of a negative string float" do + type_cast('-24.23').should eql(-24.23) + end + + it "returns float representation of a negative string integer with spaces" do + type_cast('-24 ').should eql(-24.0) + type_cast(' -24').should eql(-24.0) + end + + it "returns integer representation of a zero string float" do + type_cast('0.0').should eql(0.0) + end + + it "returns integer representation of a positive string float" do + type_cast('24.35').should eql(24.35) + end + + it "returns integer representation of a positive string float with spaces" do + type_cast(' 24.35').should eql(24.35) + type_cast('24.35 ').should eql(24.35) + end + + it "returns integer representation of a negative string float" do + type_cast('-24.35').should eql(-24.35) + end + + it "returns integer representation of a negative string float with spaces" do + type_cast(' -24.35 ').should eql(-24.35) + end + + it "returns integer representation of a zero string float, with no leading digits" do + type_cast('.0').should eql(0.0) + end + + it "returns integer representation of a zero string float, with no leading digits with spaces" do + type_cast(' .0').should eql(0.0) + end + + it "returns integer representation of a positive string float, with no leading digits" do + type_cast('.41').should eql(0.41) + end + + it "returns integer representation of a zero float" do + type_cast(0.0).should eql(0.0) + end + + it "returns integer representation of a positive float" do + type_cast(24.35).should eql(24.35) + end + + it "returns integer representation of a negative float" do + type_cast(-24.35).should eql(-24.35) + end + + it "returns integer representation of a zero decimal" do + type_cast(BigDecimal('0.0')).should eql(0.0) + end + + it "returns integer representation of a positive decimal" do + type_cast(BigDecimal('24.35')).should eql(24.35) + end + + it "returns integer representation of a negative decimal" do + type_cast(BigDecimal('-24.35')).should eql(-24.35) + end + + [ Object.new, true, '00.0', '0.', 'string' ].each do |value| + it "raises exception when attempting type_cast of non-numeric value #{value.inspect}" do + lambda do + type_cast(value) + end.should raise_error(TypecastError, /could not typecast/) + end + end + end + end +end \ No newline at end of file diff --git a/spec/attributes/integer_spec.rb b/spec/attributes/integer_spec.rb new file mode 100644 index 0000000000..611bbf2b24 --- /dev/null +++ b/spec/attributes/integer_spec.rb @@ -0,0 +1,119 @@ +require 'spec_helper' +require 'bigdecimal' + +module Arel + describe "Attributes::Integer" do + + before :all do + @relation = Model.build do |r| + r.engine Testing::Engine.new + r.attribute :age, Attributes::Integer + end + end + + def type_cast(val) + @relation[:age].type_cast(val) + end + + describe "#type_cast" do + it "returns same value if an integer" do + type_cast(24).should eql(24) + end + + it "returns nil if passed nil" do + type_cast(nil).should be_nil + end + + it "returns nil if passed empty string" do + type_cast('').should be_nil + end + + it "returns integer representation of a zero string integer" do + type_cast('0').should eql(0) + end + + it "returns integer representation of a positive string integer" do + type_cast('24').should eql(24) + end + + it "returns integer representation of a positive string integer with spaces" do + type_cast(' 24').should eql(24) + type_cast('24 ').should eql(24) + end + + it "returns integer representation of a negative string integer" do + type_cast('-24').should eql(-24) + end + + it "returns integer representation of a negative string integer with spaces" do + type_cast('-24 ').should eql(-24) + type_cast(' -24').should eql(-24) + end + + it "returns integer representation of a zero string float" do + type_cast('0.0').should eql(0) + end + + it "returns integer representation of a positive string float" do + type_cast('24.35').should eql(24) + end + + it "returns integer representation of a positive string float with spaces" do + type_cast(' 24.35').should eql(24) + type_cast('24.35 ').should eql(24) + end + + it "returns integer representation of a negative string float" do + type_cast('-24.35').should eql(-24) + end + + it "returns integer representation of a negative string float with spaces" do + type_cast(' -24.35 ').should eql(-24) + end + + it "returns integer representation of a zero string float, with no leading digits" do + type_cast('.0').should eql(0) + end + + it "returns integer representation of a zero string float, with no leading digits with spaces" do + type_cast(' .0').should eql(0) + end + + it "returns integer representation of a positive string float, with no leading digits" do + type_cast('.41').should eql(0) + end + + it "returns integer representation of a zero float" do + type_cast(0.0).should eql(0) + end + + it "returns integer representation of a positive float" do + type_cast(24.35).should eql(24) + end + + it "returns integer representation of a negative float" do + type_cast(-24.35).should eql(-24) + end + + it "returns integer representation of a zero decimal" do + type_cast(BigDecimal('0.0')).should eql(0) + end + + it "returns integer representation of a positive decimal" do + type_cast(BigDecimal('24.35')).should eql(24) + end + + it "returns integer representation of a negative decimal" do + type_cast(BigDecimal('-24.35')).should eql(-24) + end + + [ Object.new, true, '00.0', '0.', 'string' ].each do |value| + it "raises exception when attempting type_cast of non-numeric value #{value.inspect}" do + lambda do + type_cast(value) + end.should raise_error(TypecastError, /could not typecast/) + end + end + end + end +end \ No newline at end of file diff --git a/spec/attributes/string_spec.rb b/spec/attributes/string_spec.rb new file mode 100644 index 0000000000..f6d65dd045 --- /dev/null +++ b/spec/attributes/string_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' +require 'bigdecimal' + +module Arel + describe "Attributes::String" do + + before :all do + @relation = Model.build do |r| + r.engine Testing::Engine.new + r.attribute :name, Attributes::String + end + end + + def type_cast(val) + @relation[:name].type_cast(val) + end + + describe "#type_cast" do + it "returns same value if passed a String" do + val = "hell" + type_cast(val).should eql(val) + end + + it "returns nil if passed nil" do + type_cast(nil).should be_nil + end + + it "returns String representation of Symbol" do + type_cast(:hello).should == "hello" + end + + it "returns string representation of Integer" do + type_cast(1).should == '1' + end + + it "calls #to_s on arbitrary objects" do + obj = Object.new + obj.extend Module.new { def to_s ; 'hello' ; end } + type_cast(obj).should == 'hello' + end + end + end +end \ No newline at end of file diff --git a/spec/attributes/time_spec.rb b/spec/attributes/time_spec.rb new file mode 100644 index 0000000000..fcbe4f58e5 --- /dev/null +++ b/spec/attributes/time_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' +require 'bigdecimal' + +module Arel + describe "Attributes::Time" do + + before :all do + @relation = Model.build do |r| + r.engine Testing::Engine.new + r.attribute :created_at, Attributes::Time + end + end + + def type_cast(val) + @relation[:created_at].type_cast(val) + end + + describe "#type_cast" do + it "works" + end + end +end \ No newline at end of file -- cgit v1.2.3