h8 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module H8
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'h8'
3
+
4
+ describe 'context' do
5
+
6
+ it 'should create' do
7
+ cxt = H8::Context.new
8
+ cxt.eval("'Res: ' + (2+5);")
9
+ end
10
+
11
+ it 'should gate simple values to JS context' do
12
+ cxt = H8::Context.new foo: 'hello', bar: 'world'
13
+ cxt[:sign] = '!'
14
+ res = cxt.eval "foo+' '+bar+sign;"
15
+ res.should == 'hello world!'
16
+ cxt.set one: 101, real: 1.21
17
+ cxt.eval("one + one;").should == 202
18
+ cxt.eval("real + one;").should == (101 + 1.21)
19
+ end
20
+
21
+ it 'should gate H8::Values back to JS context' do
22
+ cxt = H8::Context.new
23
+ obj = cxt.eval "('che bel');"
24
+ cxt[:first] = obj
25
+ res = cxt.eval "first + ' giorno';"
26
+ res.should == 'che bel giorno'
27
+ end
28
+
29
+ it 'should not gate H8::Values between contexts' do
30
+ cxt = H8::Context.new
31
+ obj = cxt.eval "('che bel');"
32
+ cxt1 = H8::Context.new
33
+ expect( -> {
34
+ cxt1[:first] = obj
35
+ res = cxt1.eval "first + ' giorno';"
36
+ }).to raise_error(H8::Error)
37
+ end
38
+
39
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+ require 'h8'
3
+
4
+ describe 'js_gate' do
5
+
6
+ it 'should return number as string' do
7
+ cxt = H8::Context.new
8
+ res = cxt.eval("0.2 + 122.1;")
9
+ res.to_s.should == '122.3'
10
+ # res.should_not be_integer
11
+ # res.should_not be_string
12
+ end
13
+
14
+ it 'should return integers' do
15
+ cxt = H8::Context.new
16
+ res = cxt.eval("0.2 + 122.1;")
17
+ res.to_i.should == 122
18
+ res.should_not be_integer
19
+ res = cxt.eval("11+22;")
20
+ res.to_i.should == 33
21
+ res.should be_integer
22
+ res.should be_float
23
+ res.should_not be_string
24
+ end
25
+
26
+ it 'should return floats' do
27
+ cxt = H8::Context.new
28
+ res = cxt.eval("0.2 + 122.1;")
29
+ res.to_s.should == '122.3'
30
+ res.should be_float
31
+ res.should_not be_integer
32
+ res.should_not be_string
33
+ end
34
+
35
+ it 'should return strings' do
36
+ res = H8::Context.eval("'hel' + 'lo';")
37
+ res.to_s.should == 'hello'
38
+ res.should be_string
39
+ res.should_not be_integer
40
+ res.should_not be_float
41
+ end
42
+
43
+ it 'should retreive JS fieds as indexes' do
44
+ res = H8::Context.eval("({ 'foo': 'bar', 'bar': 122 });")
45
+ res['foo'].to_s.should == 'bar'
46
+ res['bar'].to_i.should == 122
47
+ end
48
+
49
+ it 'should retreive JS fieds as properties' do
50
+ res = H8::Context.eval("({ 'foo': 'bar', 'bar': 122 });")
51
+ res.bar.to_i.should == 122
52
+ res.foo.to_s.should == 'bar'
53
+ res.foo.to_s.should == 'bar'
54
+ res.bar.to_i.should == 122
55
+ # cached method check
56
+ res.foo.to_s.should == 'bar'
57
+ res.bar.to_i.should == 122
58
+ end
59
+
60
+ it 'should access arrays' do
61
+ res = H8::Context.eval("[-10, 'foo', 'bar'];")
62
+ res.should_not be_undefined
63
+ res.array?.should be_true
64
+ res.length.should == 3
65
+ 3.times {
66
+ res[0].to_i.should == -10
67
+ res[1].to_s.should == 'foo'
68
+ res[2].to_s.should == 'bar'
69
+ }
70
+ end
71
+
72
+ it 'should eval and keep context alive' do
73
+ obj = H8::Context.eval("({ 'foo': 'bar', 'bar': 122 });")
74
+ GC.start # Here Context of obj that is not referenced should be kept
75
+ obj.foo.should == 'bar'
76
+ end
77
+
78
+ it 'should convert simple types to ruby' do
79
+ res = H8::Context.eval("({ 'foo': 'bar', 'bar': 122, pi: 3.1415 });")
80
+ r = res.foo.to_ruby
81
+ r.should be_kind_of(String)
82
+ r.should == 'bar'
83
+
84
+ r = res.bar.to_ruby
85
+ r.should be_kind_of(Fixnum)
86
+ r.should == 122
87
+
88
+ r = res.pi.to_ruby
89
+ r.should be_kind_of(Float)
90
+ (r == 3.1415).should be_true
91
+ end
92
+
93
+ it 'should convert arrays to ruby' do
94
+ res = H8::Context.eval("[-10, 'foo', 'bar'];")
95
+ res.to_ruby.should == [-10, 'foo', 'bar']
96
+ res.to_ary.should == [-10, 'foo', 'bar']
97
+ expect(-> { H8::Context.eval("'not array'").to_ary}).to raise_error(H8::Error)
98
+ end
99
+
100
+ it 'should provide hash methods' do
101
+ pending
102
+ obj = H8::Context.eval("({ 'foo': 'bar', 'bar': 122 });")
103
+ obj.keys.should == ['foo', 'bar']
104
+ end
105
+
106
+ it 'should convert compare to ruby objects' do
107
+ res = H8::Context.eval("({ 'foo': 'bar', 'bar': 122 });")
108
+ (res.foo != 'bar').should be_false
109
+ (res.foo == 'bar').should be_true
110
+ (res.foo != 'ba1').should be_true
111
+ (res.foo == 'ba1').should be_false
112
+
113
+ (res.bar != 'bar').should be_true
114
+ (res.bar == 'bar').should be_false
115
+ (res.bar != 122).should be_false
116
+ (res.bar == 122).should be_true
117
+ (res.bar <= 122).should be_true
118
+ (res.bar <= 123).should be_true
119
+ (res.bar >= 122).should be_true
120
+ (res.bar >= 121).should be_true
121
+
122
+ (res.bar > 120).should be_true
123
+ (res.bar < 130).should be_true
124
+ (res.bar > 129).should be_false
125
+ (res.bar < 19).should be_false
126
+ end
127
+
128
+ it 'should call functions with no args' do
129
+ res = H8::Context.eval "(function() { return 'sono callable'; });"
130
+ res.call('a', '1', '2').should == 'sono callable'
131
+ end
132
+
133
+ it 'should call functions with args' do
134
+ res = H8::Context.eval "(function(a, b) { return a + b; });"
135
+ res.call('10', '1').should == '101'
136
+ res.call(10, 1).should == 11
137
+ end
138
+
139
+ it 'should raise error on syntax' do
140
+ expect( -> {
141
+ H8::Context.eval 'this is not a valid js'
142
+ }).to raise_error(H8::Error)
143
+ end
144
+
145
+ it 'should call member functions only' do
146
+ res = H8::Context.eval <<-End
147
+ function cls(base) {
148
+ this.base = base;
149
+ this.someVal = 'hello!';
150
+ this.noArgs = function() { return 'world!'};
151
+ this.doAdd = function(a, b) {
152
+ return a + b + base;
153
+ }
154
+ }
155
+ new cls(100);
156
+ End
157
+ res.someVal.should == 'hello!'
158
+ res.noArgs.should == 'world!'
159
+ res.doAdd(10, 1).should == 111
160
+ end
161
+
162
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: h8
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - sergeych
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-04 00:00:00.000000000 Z
11
+ date: 2014-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,36 +39,63 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: libv8
42
+ name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :runtime
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.14.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.14.0
55
69
  description: 'Should be more or less replacement for broken therubyracer gem and riny
56
70
  2.1+ '
57
71
  email:
58
- - sergeych
72
+ - real.sergeych@gmail.com
59
73
  executables: []
60
- extensions: []
74
+ extensions:
75
+ - ext/h8/extconf.rb
61
76
  extra_rdoc_files: []
62
77
  files:
63
78
  - ".gitignore"
79
+ - ".rspec"
64
80
  - Gemfile
65
81
  - LICENSE.txt
66
82
  - README.md
67
83
  - Rakefile
68
84
  - ext/h8/extconf.rb
85
+ - ext/h8/h8.cpp
86
+ - ext/h8/h8.h
87
+ - ext/h8/js_gate.h
88
+ - ext/h8/main.cpp
89
+ - ext/h8/object_wrap.h
90
+ - ext/h8/ruby_wrap.h
69
91
  - hybrid8.gemspec
92
+ - lib/h8.rb
93
+ - lib/h8/context.rb
94
+ - lib/h8/value.rb
70
95
  - lib/h8/version.rb
71
- - lib/hybrid8.rb
96
+ - spec/context_spec.rb
97
+ - spec/js_gate_spec.rb
98
+ - spec/spec_helper.rb
72
99
  homepage: ''
73
100
  licenses:
74
101
  - MIT
@@ -77,6 +104,7 @@ post_install_message:
77
104
  rdoc_options: []
78
105
  require_paths:
79
106
  - lib
107
+ - ext
80
108
  required_ruby_version: !ruby/object:Gem::Requirement
81
109
  requirements:
82
110
  - - ">="
@@ -93,4 +121,7 @@ rubygems_version: 2.2.2
93
121
  signing_key:
94
122
  specification_version: 4
95
123
  summary: Minimalistic and sane v8 bindings
96
- test_files: []
124
+ test_files:
125
+ - spec/context_spec.rb
126
+ - spec/js_gate_spec.rb
127
+ - spec/spec_helper.rb
@@ -1,5 +0,0 @@
1
- require "h8/version"
2
-
3
- module H8
4
- # Your code goes here...
5
- end