serializable_proc 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/.gitignore +1 -0
  2. data/HISTORY.txt +9 -0
  3. data/README.rdoc +28 -10
  4. data/VERSION +1 -1
  5. data/lib/serializable_proc/binding.rb +27 -32
  6. data/lib/serializable_proc/fixes.rb +1 -1
  7. data/lib/serializable_proc/isolatable.rb +59 -0
  8. data/lib/serializable_proc/parsers/pt.rb +2 -5
  9. data/lib/serializable_proc/parsers/rp.rb +29 -29
  10. data/lib/serializable_proc/parsers.rb +22 -0
  11. data/lib/serializable_proc.rb +76 -10
  12. data/serializable_proc.gemspec +51 -21
  13. data/spec/bounded_vars/class_vars_spec.rb +60 -0
  14. data/spec/bounded_vars/class_vars_within_block_scope_spec.rb +31 -0
  15. data/spec/bounded_vars/errors_spec.rb +27 -0
  16. data/spec/bounded_vars/global_vars_spec.rb +60 -0
  17. data/spec/bounded_vars/global_vars_within_block_scope_spec.rb +31 -0
  18. data/spec/bounded_vars/instance_vars_spec.rb +60 -0
  19. data/spec/bounded_vars/instance_vars_within_block_scope_spec.rb +31 -0
  20. data/spec/bounded_vars/local_vars_spec.rb +60 -0
  21. data/spec/bounded_vars/local_vars_within_block_scope_spec.rb +31 -0
  22. data/spec/code_block/errors_spec.rb +65 -0
  23. data/spec/{multiple_arities_serializable_proc_spec.rb → code_block/multiple_arities_spec.rb} +2 -2
  24. data/spec/{optional_arity_serializable_proc_spec.rb → code_block/optional_arity_spec.rb} +2 -2
  25. data/spec/code_block/renaming_vars_spec.rb +160 -0
  26. data/spec/{one_arity_serializable_proc_spec.rb → code_block/single_arity_spec.rb} +2 -2
  27. data/spec/{zero_arity_serializable_proc_spec.rb → code_block/zero_arity_spec.rb} +2 -2
  28. data/spec/proc_like/extras_spec.rb +82 -0
  29. data/spec/proc_like/invoking_with_args_spec.rb +58 -0
  30. data/spec/proc_like/invoking_with_class_vars_spec.rb +96 -0
  31. data/spec/proc_like/invoking_with_global_vars_spec.rb +79 -0
  32. data/spec/proc_like/invoking_with_instance_vars_spec.rb +79 -0
  33. data/spec/proc_like/invoking_with_local_vars_spec.rb +79 -0
  34. data/spec/{marshalling_spec.rb → proc_like/marshalling_spec.rb} +1 -1
  35. data/spec/proc_like/others_spec.rb +106 -0
  36. data/spec/spec_helper.rb +10 -0
  37. metadata +52 -22
  38. data/lib/serializable_proc/sandboxer.rb +0 -24
  39. data/spec/extracting_bound_variables_spec.rb +0 -99
  40. data/spec/initializing_errors_spec.rb +0 -95
  41. data/spec/proc_like_spec.rb +0 -191
@@ -0,0 +1,82 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe 'Extra functionalities' do
4
+
5
+ describe '>> to_sexp (empty proc)' do
6
+
7
+ before do
8
+ @s_proc = SerializableProc.new{}
9
+ @expected = {
10
+ :extracted => s(:iter, s(:call, nil, :proc, s(:arglist)), nil),
11
+ :runnable => s(:iter, s(:call, nil, :proc, s(:arglist)), nil)
12
+ }
13
+ end
14
+
15
+ should 'return sexp representation of extracted code w debug unspecified' do
16
+ @s_proc.to_sexp.should.equal(@expected[:extracted])
17
+ end
18
+
19
+ should 'return sexp representation of extracted code w debug as false' do
20
+ @s_proc.to_sexp(false).should.equal(@expected[:extracted])
21
+ end
22
+
23
+ should 'return sexp representation of extracted code w debug as true' do
24
+ @s_proc.to_sexp(true).should.equal(@expected[:runnable])
25
+ end
26
+
27
+ end
28
+
29
+ describe '>> to_sexp (single statement proc)' do
30
+
31
+ before do
32
+ @s_proc = SerializableProc.new{ @x }
33
+ @expected = {
34
+ :extracted => s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:ivar, :@x)),
35
+ :runnable => s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:lvar, :ivar_x))
36
+ }
37
+ end
38
+
39
+ should 'return sexp representation of extracted code w debug unspecified' do
40
+ @s_proc.to_sexp.should.equal(@expected[:extracted])
41
+ end
42
+
43
+ should 'return sexp representation of extracted code w debug as false' do
44
+ @s_proc.to_sexp(false).should.equal(@expected[:extracted])
45
+ end
46
+
47
+ should 'return sexp representation of extracted code w debug as true' do
48
+ @s_proc.to_sexp(true).should.equal(@expected[:runnable])
49
+ end
50
+
51
+ end
52
+
53
+ describe '>> to_sexp (multi statements proc)' do
54
+
55
+ before do
56
+ @s_proc = SerializableProc.new do
57
+ @a = 1
58
+ @b = 2
59
+ end
60
+ @expected = {
61
+ :extracted => s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:block,
62
+ s(:iasgn, :@a, s(:lit, 1)), s(:iasgn, :@b, s(:lit, 2)))),
63
+ :runnable => s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:block,
64
+ s(:lasgn, :ivar_a, s(:lit, 1)), s(:lasgn, :ivar_b, s(:lit, 2))))
65
+ }
66
+ end
67
+
68
+ should 'return sexp representation of extracted code w debug unspecified' do
69
+ @s_proc.to_sexp.should.equal(@expected[:extracted])
70
+ end
71
+
72
+ should 'return sexp representation of extracted code w debug as false' do
73
+ @s_proc.to_sexp(false).should.equal(@expected[:extracted])
74
+ end
75
+
76
+ should 'return sexp representation of extracted code w debug as true' do
77
+ @s_proc.to_sexp(true).should.equal(@expected[:runnable])
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,58 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ [:[], :call].each do |invoke|
4
+ describe "Invoking with args using :#{invoke}" do
5
+
6
+ describe '>> wo specified binding' do
7
+
8
+ should 'return yield result given no arg' do
9
+ s_proc = SerializableProc.new { %w{b c}.map{|x| x } }
10
+ s_proc.send(invoke).should.equal(%w{b c})
11
+ end
12
+
13
+ should 'return yield result given single arg' do
14
+ s_proc = SerializableProc.new {|i| %w{b c}.map{|x| x*i } }
15
+ s_proc.send(invoke, 2).should.equal(%w{bb cc})
16
+ end
17
+
18
+ should 'return yield result given optional args' do
19
+ s_proc = SerializableProc.new {|*args| %w{b c}.map{|x| [x,args].flatten.join } }
20
+ s_proc.send(invoke, '1', '2').should.equal(%w{b12 c12})
21
+ end
22
+
23
+ should 'return yield result given multiple args' do
24
+ s_proc = SerializableProc.new {|i, j| %w{b c}.map{|x| x*i*j } }
25
+ s_proc.send(invoke, 2, 3).should.equal(%w{bbbbbb cccccc})
26
+ end
27
+
28
+ end
29
+
30
+ describe '>> w specified binding' do
31
+
32
+ should 'return yield result given no arg' do
33
+ x = 'a'
34
+ s_proc = SerializableProc.new { %w{b c}.map{|x| x } }
35
+ s_proc.send(invoke, binding).should.equal(%w{b c})
36
+ end
37
+
38
+ should 'return yield result given single arg' do
39
+ x = 'a'
40
+ s_proc = SerializableProc.new {|i| %w{b c}.map{|x| x*i } }
41
+ s_proc.send(invoke, 2, binding).should.equal(%w{bb cc})
42
+ end
43
+
44
+ should 'return yield result given optional args' do
45
+ x = 'a'
46
+ s_proc = SerializableProc.new {|*args| %w{b c}.map{|x| [x,args].flatten.join } }
47
+ s_proc.send(invoke, '1', '2', binding).should.equal(%w{b12 c12})
48
+ end
49
+
50
+ should 'return yield result given multiple args' do
51
+ x = 'a'
52
+ s_proc = SerializableProc.new {|i, j| %w{b c}.map{|x| x*i*j } }
53
+ s_proc.send(invoke, 2, 3, binding).should.equal(%w{bbbbbb cccccc})
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,96 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ [:[], :call].each do |invoke|
4
+ describe "Invoking with class vars using :#{invoke}" do
5
+
6
+ describe '>> (w isolation)' do
7
+
8
+ should 'not be affected by out-of-scope changes when wo specified binding' do
9
+ @@x, @@y = 'awe', 'some'
10
+ s_proc = SerializableProc.new { @@x.sub!('awe','hand'); @@x + @@y }
11
+ @@x, @@y = 'wonder', 'ful'
12
+ s_proc.send(invoke).should.equal('handsome')
13
+ end
14
+
15
+ should 'not effect out-of-scope changes when wo specified binding' do
16
+ @@x, @@y = 'awe', 'some'
17
+ s_proc = SerializableProc.new { @@x.sub!('awe','hand'); @@x + @@y }
18
+ @@x, @@y = 'wonder', 'ful'
19
+ s_proc.send(invoke)
20
+ @@x.should.equal('wonder')
21
+ end
22
+
23
+ should 'not be affected by out-of-scope changes even when w specified binding' do
24
+ @@x, @@y = 'awe', 'some'
25
+ s_proc = SerializableProc.new { @@x.sub!('awe','hand'); @@x + @@y }
26
+ @@x, @@y = 'wonder', 'ful'
27
+ s_proc.send(invoke, binding).should.equal('handsome')
28
+ end
29
+
30
+ should 'not effect out-of-scope changes even when w specified binding' do
31
+ @@x, @@y = 'awe', 'some'
32
+ s_proc = SerializableProc.new { @@x.sub!('awe','hand'); @@x + @@y }
33
+ @@x, @@y = 'wonder', 'ful'
34
+ s_proc.send(invoke, binding)
35
+ @@x.should.equal('wonder')
36
+ end
37
+
38
+ end
39
+
40
+ describe '>> (wo isolation)' do
41
+
42
+ if RUBY_VERSION.include?('1.9.')
43
+
44
+ should 'raise NameError when wo specified binding' do
45
+ @@x, @@y = 'wonder', 'ful'
46
+ s_proc = SerializableProc.new do
47
+ @@_not_isolated_vars = :class
48
+ @@x.sub!('awe','hand')
49
+ @@x + @@y
50
+ end
51
+ @@x, @@y = 'awe', 'some'
52
+ lambda { s_proc.send(invoke) }.should.raise(NameError)
53
+ end
54
+
55
+ else
56
+
57
+ should 'reflect out-of-scope vars even when wo specified binding' do
58
+ @@x, @@y = 'wonder', 'ful'
59
+ s_proc = SerializableProc.new do
60
+ @@_not_isolated_vars = :class
61
+ @@x.sub!('awe','hand')
62
+ @@x + @@y
63
+ end
64
+ @@x, @@y = 'awe', 'some'
65
+ s_proc.send(invoke).should.equal('handsome')
66
+ end
67
+
68
+ end
69
+
70
+ should 'be affected by out-of-scope changes w specified binding' do
71
+ @@x, @@y = 'wonder', 'ful'
72
+ s_proc = SerializableProc.new do
73
+ @@_not_isolated_vars = :class
74
+ @@x.sub!('awe','hand')
75
+ @@x + @@y
76
+ end
77
+ @@x, @@y = 'awe', 'some'
78
+ s_proc.send(invoke, binding).should.equal('handsome')
79
+ end
80
+
81
+ should 'effect out-of-scope changes w specified binding' do
82
+ @@x, @@y = 'wonder', 'ful'
83
+ s_proc = SerializableProc.new do
84
+ @@_not_isolated_vars = :class
85
+ @@x.sub!('awe','hand')
86
+ @@x + @@y
87
+ end
88
+ @@x, @@y = 'awe', 'some'
89
+ s_proc.send(invoke, binding)
90
+ @@x.should.equal('hand')
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,79 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ [:[], :call].each do |invoke|
4
+ describe "Invoking with global vars using :#{invoke}" do
5
+
6
+ describe '>> (w isolation)' do
7
+
8
+ should 'not be affected by out-of-scope changes when wo specified binding' do
9
+ $x, $y = 'awe', 'some'
10
+ s_proc = SerializableProc.new { $x.sub!('awe','hand'); $x + $y }
11
+ $x, $y = 'wonder', 'ful'
12
+ s_proc.send(invoke).should.equal('handsome')
13
+ end
14
+
15
+ should 'not effect out-of-scope changes when wo specified binding' do
16
+ $x, $y = 'awe', 'some'
17
+ s_proc = SerializableProc.new { $x.sub!('awe','hand'); $x + $y }
18
+ $x, $y = 'wonder', 'ful'
19
+ s_proc.send(invoke)
20
+ $x.should.equal('wonder')
21
+ end
22
+
23
+ should 'not be affected by out-of-scope changes even when w specified binding' do
24
+ $x, $y = 'awe', 'some'
25
+ s_proc = SerializableProc.new { $x.sub!('awe','hand'); $x + $y }
26
+ $x, $y = 'wonder', 'ful'
27
+ s_proc.send(invoke, binding).should.equal('handsome')
28
+ end
29
+
30
+ should 'not effect out-of-scope changes even when w specified binding' do
31
+ $x, $y = 'awe', 'some'
32
+ s_proc = SerializableProc.new { $x.sub!('awe','hand'); $x + $y }
33
+ $x, $y = 'wonder', 'ful'
34
+ s_proc.send(invoke, binding)
35
+ $x.should.equal('wonder')
36
+ end
37
+
38
+ end
39
+
40
+ describe '>> (wo isolation)' do
41
+
42
+ should 'reflect out-of-scope vars even when wo specified binding' do
43
+ $x, $y = 'wonder', 'ful'
44
+ s_proc = SerializableProc.new do
45
+ @@_not_isolated_vars = :global
46
+ $x.sub!('awe','hand')
47
+ $x + $y
48
+ end
49
+ $x, $y = 'awe', 'some'
50
+ s_proc.send(invoke).should.equal('handsome')
51
+ end
52
+
53
+ should 'be affected by out-of-scope changes w specified binding' do
54
+ $x, $y = 'wonder', 'ful'
55
+ s_proc = SerializableProc.new do
56
+ @@_not_isolated_vars = :global
57
+ $x.sub!('awe','hand')
58
+ $x + $y
59
+ end
60
+ $x, $y = 'awe', 'some'
61
+ s_proc.send(invoke, binding).should.equal('handsome')
62
+ end
63
+
64
+ should 'effect out-of-scope changes w specified binding' do
65
+ $x, $y = 'wonder', 'ful'
66
+ s_proc = SerializableProc.new do
67
+ @@_not_isolated_vars = :global
68
+ $x.sub!('awe','hand')
69
+ $x + $y
70
+ end
71
+ $x, $y = 'awe', 'some'
72
+ s_proc.send(invoke, binding)
73
+ $x.should.equal('hand')
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,79 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ [:[], :call].each do |invoke|
4
+ describe "Invoking with instance vars using :#{invoke}" do
5
+
6
+ describe '>> (w isolation)' do
7
+
8
+ should 'not be affected by out-of-scope changes when wo specified binding' do
9
+ @x, @y = 'awe', 'some'
10
+ s_proc = SerializableProc.new { @x.sub!('awe','hand'); @x + @y }
11
+ @x, @y = 'wonder', 'ful'
12
+ s_proc.send(invoke).should.equal('handsome')
13
+ end
14
+
15
+ should 'not effect out-of-scope changes when wo specified binding' do
16
+ @x, @y = 'awe', 'some'
17
+ s_proc = SerializableProc.new { @x.sub!('awe','hand'); @x + @y }
18
+ @x, @y = 'wonder', 'ful'
19
+ s_proc.send(invoke)
20
+ @x.should.equal('wonder')
21
+ end
22
+
23
+ should 'not be affected by out-of-scope changes even when w specified binding' do
24
+ @x, @y = 'awe', 'some'
25
+ s_proc = SerializableProc.new { @x.sub!('awe','hand'); @x + @y }
26
+ @x, @y = 'wonder', 'ful'
27
+ s_proc.send(invoke, binding).should.equal('handsome')
28
+ end
29
+
30
+ should 'not effect out-of-scope changes even when w specified binding' do
31
+ @x, @y = 'awe', 'some'
32
+ s_proc = SerializableProc.new { @x.sub!('awe','hand'); @x + @y }
33
+ @x, @y = 'wonder', 'ful'
34
+ s_proc.send(invoke, binding)
35
+ @x.should.equal('wonder')
36
+ end
37
+
38
+ end
39
+
40
+ describe '>> (wo isolation)' do
41
+
42
+ should 'raise NameError when wo specified binding' do
43
+ @x, @y = 'wonder', 'ful'
44
+ s_proc = SerializableProc.new do
45
+ @@_not_isolated_vars = :instance
46
+ @x.sub!('awe','hand')
47
+ @x + @y
48
+ end
49
+ @x, @y = 'awe', 'some'
50
+ lambda { s_proc.send(invoke) }.should.raise(NameError)
51
+ end
52
+
53
+ should 'be affected by out-of-scope changes w specified binding' do
54
+ @x, @y = 'wonder', 'ful'
55
+ s_proc = SerializableProc.new do
56
+ @@_not_isolated_vars = :instance
57
+ @x.sub!('awe','hand')
58
+ @x + @y
59
+ end
60
+ @x, @y = 'awe', 'some'
61
+ s_proc.send(invoke, binding).should.equal('handsome')
62
+ end
63
+
64
+ should 'effect out-of-scope changes w specified binding' do
65
+ @x, @y = 'wonder', 'ful'
66
+ s_proc = SerializableProc.new do
67
+ @@_not_isolated_vars = :instance
68
+ @x.sub!('awe','hand')
69
+ @x + @y
70
+ end
71
+ @x, @y = 'awe', 'some'
72
+ s_proc.send(invoke, binding)
73
+ @x.should.equal('hand')
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,79 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ [:[], :call].each do |invoke|
4
+ describe "Invoking with local vars using :#{invoke}" do
5
+
6
+ describe '>> (w isolation)' do
7
+
8
+ should 'not be affected by out-of-scope changes when wo specified binding' do
9
+ x, y = 'awe', 'some'
10
+ s_proc = SerializableProc.new { x.sub!('awe','hand'); x + y }
11
+ x, y = 'wonder', 'ful'
12
+ s_proc.send(invoke).should.equal('handsome')
13
+ end
14
+
15
+ should 'not effect out-of-scope changes when wo specified binding' do
16
+ x, y = 'awe', 'some'
17
+ s_proc = SerializableProc.new { x.sub!('awe','hand'); x + y }
18
+ x, y = 'wonder', 'ful'
19
+ s_proc.send(invoke)
20
+ x.should.equal('wonder')
21
+ end
22
+
23
+ should 'not be affected by out-of-scope changes even when w specified binding' do
24
+ x, y = 'awe', 'some'
25
+ s_proc = SerializableProc.new { x.sub!('awe','hand'); x + y }
26
+ x, y = 'wonder', 'ful'
27
+ s_proc.send(invoke, binding).should.equal('handsome')
28
+ end
29
+
30
+ should 'not effect out-of-scope changes even when w specified binding' do
31
+ x, y = 'awe', 'some'
32
+ s_proc = SerializableProc.new { x.sub!('awe','hand'); x + y }
33
+ x, y = 'wonder', 'ful'
34
+ s_proc.send(invoke, binding)
35
+ x.should.equal('wonder')
36
+ end
37
+
38
+ end
39
+
40
+ describe '>> (wo isolation)' do
41
+
42
+ should 'raise NameError when wo specified binding' do
43
+ x, y = 'wonder', 'ful'
44
+ s_proc = SerializableProc.new do
45
+ @@_not_isolated_vars = :local
46
+ x.sub!('awe','hand')
47
+ x + y
48
+ end
49
+ x, y = 'awe', 'some'
50
+ lambda { s_proc.send(invoke) }.should.raise(NameError)
51
+ end
52
+
53
+ should 'be affected by out-of-scope changes w specified binding' do
54
+ x, y = 'wonder', 'ful'
55
+ s_proc = SerializableProc.new do
56
+ @@_not_isolated_vars = :local
57
+ x.sub!('awe','hand')
58
+ x + y
59
+ end
60
+ x, y = 'awe', 'some'
61
+ s_proc.send(invoke, binding).should.equal('handsome')
62
+ end
63
+
64
+ should 'effect out-of-scope changes w specified binding' do
65
+ x, y = 'wonder', 'ful'
66
+ s_proc = SerializableProc.new do
67
+ @@_not_isolated_vars = :local
68
+ x.sub!('awe','hand')
69
+ x + y
70
+ end
71
+ x, y = 'awe', 'some'
72
+ s_proc.send(invoke, binding)
73
+ x.should.equal('hand')
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper')
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
3
  describe 'Marshalling' do
4
4
 
@@ -0,0 +1,106 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe 'Being proc like' do
4
+
5
+ describe '>> ==' do
6
+
7
+ before do
8
+ @proc = SerializableProc.new{ %w{a b}.map{|x| x } }
9
+ end
10
+
11
+ should 'return true if comparing to itself' do
12
+ @proc.should.equal(@proc)
13
+ end
14
+
15
+ should 'return true if another SerializableProc has the same code' do
16
+ SerializableProc.new{ %w{a b}.map{|x| x } }.should.equal(@proc)
17
+ end
18
+
19
+ should 'return false if another SerializableProc does not have the same code' do
20
+ SerializableProc.new{ %w{b c}.map{|x| x } }.should.not.equal(@proc)
21
+ end
22
+
23
+ end
24
+
25
+ describe '>> clone' do
26
+ should 'return a serializable proc that yields +ve ==' do
27
+ s_proc = SerializableProc.new { %w{b c}.map{|x| x } }
28
+ clone = s_proc.clone
29
+ clone.should.equal(s_proc)
30
+ clone.object_id.should.not.equal(s_proc.object_id)
31
+ end
32
+ end
33
+
34
+ describe '>> to_proc' do
35
+
36
+ class << self
37
+ def work(&block) ; yield ; end
38
+ end
39
+
40
+ should 'return a non-serializable proc' do
41
+ o_proc = lambda { %w{b c}.map{|x| x } }
42
+ s_proc = SerializableProc.new(&o_proc)
43
+ n_proc = s_proc.to_proc
44
+ s_proc.should.not == n_proc
45
+ n_proc.class.should == Proc
46
+ n_proc.call.should.equal(o_proc.call)
47
+ end
48
+
49
+ should "support passing to a method using '&' char" do
50
+ s_proc = SerializableProc.new { %w{b c}.map{|x| x } }
51
+ work(&s_proc).should.equal(%w{b c})
52
+ end
53
+
54
+ end
55
+
56
+ describe '>> to_s' do
57
+ extend SerializableProc::Spec::Helpers
58
+
59
+ should 'return extracted code when debug is unspecified' do
60
+ x, @x, @@x, $x = 'lx', 'ix', 'cx', 'gx'
61
+ SerializableProc.new{ [x,@x,@@x,$x] }.to_s.should.be \
62
+ having_same_semantics_as('lambda { [x, @x, @@x, $x] }')
63
+ end
64
+
65
+ should 'return extracted code w debug as false' do
66
+ x, @x, @@x, $x = 'lx', 'ix', 'cx', 'gx'
67
+ SerializableProc.new{ [x,@x,@@x,$x] }.to_s(false).should.be \
68
+ having_same_semantics_as('lambda { [x, @x, @@x, $x] }')
69
+ end
70
+
71
+ should 'return runnable code w debug as true' do
72
+ x, @x, @@x, $x = 'lx', 'ix', 'cx', 'gx'
73
+ SerializableProc.new{ [x,@x,@@x,$x] }.to_s(true).should.be \
74
+ having_same_semantics_as('lambda { [lvar_x, ivar_x, cvar_x, gvar_x] }')
75
+ end
76
+ end
77
+
78
+ describe '>> arity' do
79
+ {
80
+ __LINE__ => lambda { },
81
+ __LINE__ => lambda {|x| },
82
+ __LINE__ => lambda {|x,y| },
83
+ __LINE__ => lambda {|*x| },
84
+ __LINE__ => lambda {|x, *y| },
85
+ __LINE__ => lambda {|(x,y)| },
86
+ }.each do |debug, block|
87
+ should "return arity of initializing block [##{debug}]" do
88
+ SerializableProc.new(&block).arity.should.equal(block.arity)
89
+ end
90
+ end
91
+ end
92
+
93
+ describe '>> binding' do
94
+ should 'raise NotImplementedError' do
95
+ lambda { SerializableProc.new { x }.binding }.should.raise(NotImplementedError)
96
+ end
97
+ # should 'return binding that contains duplicated contextual reference values' do
98
+ # x, @x, @@x, $x = 'lx', 'ix', 'cx', 'gx'
99
+ # expected = {'x' => x.dup, '@x' => @x.dup, '@@x' => @@x.dup, '$x' => $x.dup}
100
+ # s_proc = SerializableProc.new { [x, @x, @@x, $x] }
101
+ # x, @x, @@x, $x = 'ly', 'iy', 'cy', 'gy'
102
+ # expected.each{|k,v| s_proc.binding.eval(k).should.equal(v) }
103
+ # end
104
+ end
105
+
106
+ end
data/spec/spec_helper.rb CHANGED
@@ -39,6 +39,12 @@ class SerializableProc
39
39
  lambda {|code1| normalize[code1].should.equal(normalize[code2]) }
40
40
  end
41
41
 
42
+ def having_runnable_code_as(code)
43
+ lambda do |s_proc|
44
+ s_proc.code[:runnable].should.be having_same_semantics_as(code)
45
+ end
46
+ end
47
+
42
48
  def same_object_as(o2)
43
49
  lambda {|o1| o1.object_id == o2.object_id }
44
50
  end
@@ -78,6 +84,10 @@ class SerializableProc
78
84
  end
79
85
  end
80
86
 
87
+ def should_have_empty_binding(s_proc)
88
+ s_proc.binding_dump.should.be.empty
89
+ end
90
+
81
91
  def should_handle_proc_variable(file, code, test_args)
82
92
  test_args.each do |line, block|
83
93
  should "handle proc variable [##{line}]" do