Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

Fix the Ruby => JavaScript conversion of hashes nested within arrays #13

Closed
wants to merge 1 commit into
from
Jump to file or symbol
Failed to load files and symbols.
+49 −2
Split
View
@@ -43,10 +43,17 @@ def array_to_ruby(js_array)
end
def array_to_javascript(rb_array, scope = nil)
+ # First convert all array elements to their javascript equivalents and
+ # then invoke to_java below in order to create a Java array. This allows
+ # arrays with nested hashes to be converted properly.
+ converted_rb_array = rb_array.map do |rb_element|
+ to_javascript(rb_element, scope)
+ end
+
if scope && context = JS::Context.getCurrentContext
- context.newArray(scope, rb_array.to_java)
+ context.newArray(scope, converted_rb_array.to_java)
else
- JS::NativeArray.new(rb_array.to_java)
+ JS::NativeArray.new(converted_rb_array.to_java)
end
end
@@ -91,6 +91,46 @@
h.prototype.should be_nil # this is how Rhino works !
end
end
+
+ it "converts deeply nested ruby hashes into native objects" do
+ hash = {
+ :array => [
+ {
+ :breed => "Pug"
+ },
+ {
+ :breed => "English Bulldog"
+ },
+ {
+ :breed => [
+ "Pug",
+ "Beagle"
+ ]
+ }
+ ]
+ }
+
+ Rhino.to_javascript(hash).tap do |h|
+ h.should be_kind_of(Rhino::JS::NativeObject)
+
+ a = h.get("array", h)
+ a.should be_kind_of(Rhino::JS::NativeArray)
+
+ element0 = a.get(0,a)
+ element0.should be_kind_of(Rhino::JS::NativeObject)
+ element0.get("breed", element0).should == "Pug"
+
+ element2 = a.get(2,a)
+ element2.should be_kind_of(Rhino::JS::NativeObject)
+
+ nested_array = element2.get("breed", element2)
+ nested_array.should be_kind_of(Rhino::JS::NativeArray)
+ nested_array.get(0,nested_array).should == "Pug"
+ nested_array.get(1,nested_array).should == "Beagle"
+
+ h.prototype.should be_nil # this is how Rhino works !
+ end
+ end
describe "with a scope" do