2009-10-14 22:51:50 -05:00
require File . dirname ( __FILE__ ) + '/spec_helper.rb'
describe " The Ruby Racer " do
before ( :each ) do
@cxt = V8 :: Context . new
end
describe " Type Conversion from Ruby to Javascript " do
2009-10-16 08:29:23 -05:00
it " can pass nil back to ruby " do
eval ( " null " ) . should be_nil
end
it " passes back undefined value as nil " do
eval ( " this.undefined " ) . should be_nil
end
2009-10-14 22:51:50 -05:00
it " can pass strings back to ruby " do
eval ( " 'Hello World' " ) . should == " Hello World "
end
2009-10-16 09:55:18 -05:00
it " can pass large strings back to ruby " do
lorem = " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis faucibus, diam vel pellentesque aliquet, nisl sapien molestie eros, vitae vehicula libero massa vel neque. Phasellus tempor pharetra ipsum vel venenatis. Quisque vitae nisl vitae quam mattis pellentesque et in sapien. Sed at lectus quis eros pharetra feugiat non ac neque. Vivamus lacus eros, feugiat at volutpat at, viverra id nisl. Vivamus ac dolor eleifend libero venenatis pharetra ut iaculis arcu. Donec neque nibh, vehicula non porta a, consectetur eu erat. Sed eleifend, metus vel euismod placerat, lectus lectus sollicitudin nisl, ac elementum sem quam nec dolor. In hac habitasse platea dictumst. Proin vitae suscipit orci. Suspendisse a ipsum vel lorem tempus scelerisque et vitae neque. Proin sodales, tellus sit amet consequat cursus, odio massa ultricies enim, eu fermentum velit lectus in lacus. Quisque eu porttitor diam. Nunc felis purus, facilisis non tristique ac, pulvinar nec nulla. Duis dolor risus, egestas nec tristique ac, ullamcorper cras amet. "
eval ( " ' #{ lorem } ' " ) . should == lorem
end
it " can pass the empty string back to ruby " do
eval ( " '' " ) . should == " "
end
2009-10-15 23:23:53 -04:00
it " can pass doubles back to ruby " do
2009-10-14 22:51:50 -05:00
eval ( " 2.5 " ) . should == 2 . 5
end
2009-10-15 23:23:53 -04:00
it " can pass fixed numbers back to ruby " do
eval ( " 1 " ) . should == 1
end
2009-10-14 22:51:50 -05:00
it " can pass boolean values back to ruby " do
eval ( " true " ) . should be ( true )
eval ( " false " ) . should be ( false )
end
2009-10-22 21:45:41 -05:00
it " can pass objects back to ruby " do
2009-11-01 11:53:19 -06:00
eval ( " ({foo: 'bar', baz: 'bang', '5': 5, segfault: {}}) " ) . tap do | object |
2009-11-02 21:03:56 -06:00
object . should_not be_nil
2009-10-22 21:45:41 -05:00
object [ 'foo' ] . should == 'bar'
object [ 'baz' ] . should == 'bang'
2009-11-01 11:53:19 -06:00
object [ '5' ] . should == 5
object [ 'segfault' ] . should be_kind_of ( V8 :: JSObject )
2009-10-22 21:45:41 -05:00
end
2009-11-02 21:03:56 -06:00
end
2009-10-22 23:27:41 -05:00
2009-10-14 22:51:50 -05:00
end
2009-10-22 23:27:41 -05:00
2009-11-02 21:03:56 -06:00
describe " Calling Ruby Code from JavaScript " do
2009-11-01 11:53:19 -06:00
2009-11-03 22:57:37 -06:00
it " knows your name " do
class Foo
def call
end
end
foo = Foo . new
#V8.what_is_this? Class.new
# V8.what_is_this? Module.new
# V8.what_is_this? Object.new
# V8.what_is_this? :foo
# V8.what_is_this? V8::JSObject.new
# V8.what_is_this?(proc {|foo| "string form is: #{foo}"})
# V8.what_is_this?(foo.method(:bar))
V8 . what_is_this? ( foo )
end
2009-11-02 21:03:56 -06:00
it " can embed a ruby closure and call it from javascript " do
2009-11-03 22:57:37 -06:00
# pending
2009-11-03 15:16:07 -06:00
eval ( 'times(5,2)' , :times = > lambda { | lhs , rhs | lhs * rhs } ) . should == 10
2009-11-01 11:53:19 -06:00
end
2009-11-02 21:03:56 -06:00
it " can call a bound ruby method " do
2009-11-03 15:16:07 -06:00
pending
five = singleton ( 5 ) do
2009-11-02 21:03:56 -06:00
def initialize ( lhs )
2009-11-03 15:16:07 -06:00
@lhs = lhs
2009-11-02 21:03:56 -06:00
end
def times ( rhs )
@lhs * rhs
end
2009-11-03 15:16:07 -06:00
end
eval ( 'timesfive(3)' , :timesfive = > mult . method ( :times ) ) . should == 15
2009-11-01 11:53:19 -06:00
end
2009-11-02 21:03:56 -06:00
it " can embed a ruby object and call its methods " do
pending
2009-11-03 15:16:07 -06:00
eval ( 'object.times(8,8)' , :object = > singelton {
def times ( lhs , rhs )
lhs * rhs
end
} )
end
it " unwraps ruby objects returned by embedded ruby code to maintain referential integrity " do
pending
mock ( :object ) . tap do | o |
eval ( 'get()' , :get = > lambda { o } ) . should be ( o )
2009-11-01 11:53:19 -06:00
end
2009-11-03 15:16:07 -06:00
end
2009-11-02 21:03:56 -06:00
end
2009-11-03 15:16:07 -06:00
# describe "Passing Ruby Values Back from Javascript"
2009-11-01 11:53:19 -06:00
2009-11-02 21:03:56 -06:00
def eval ( str , scope = nil )
2009-10-14 22:51:50 -05:00
@cxt . eval ( str )
end
2009-11-03 15:16:07 -06:00
def singleton ( * args , & body )
Class . new . class_eval ( & body ) . new ( * args )
end
2009-10-14 22:51:50 -05:00
end