maroon 0.6.1 → 0.6.5
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.
- checksums.yaml +7 -0
- data/Examples/Dijkstra/CalculateShortestDistance.rb +16 -12
- data/Examples/Dijkstra/calculate_shortest_path.rb +47 -27
- data/Examples/Dijkstra/data.rb +41 -14
- data/Examples/Dijkstra/dijkstra.rb +4 -3
- data/Examples/MoneyTransfer.rb +61 -60
- data/Examples/greeter.rb +8 -7
- data/Examples/meter.rb +35 -29
- data/Gemfile +9 -4
- data/LICENSE.txt +21 -21
- data/README.md +13 -0
- data/Rakefile +41 -1
- data/Test/Generate/method_info_test.rb +12 -0
- data/Test/{Greeter_test.rb → Greeter_test_disabled.rb} +24 -20
- data/Test/ImmutableQueue_test.rb +18 -0
- data/Test/MethodInfo_test.rb +65 -0
- data/Test/alltests.rb +1 -0
- data/Test/{source_assertions.rb → assertions.rb} +15 -7
- data/Test/bind_test.rb +13 -0
- data/Test/expression_test.rb +105 -0
- data/Test/method_call_test.rb +83 -0
- data/Test/self_test.rb +46 -0
- data/Test/stack_test.rb +17 -0
- data/Test/test_helper.rb +14 -0
- data/base/ImmutableStack.rb +32 -0
- data/base/MethodDefinition.rb +124 -0
- data/base/bind_rewriter.rb +58 -0
- data/base/immutable_queue.rb +50 -0
- data/base/maroon_base.rb +267 -0
- data/base/method_call.rb +78 -0
- data/base/method_info.rb +86 -0
- data/base/self.rb +60 -0
- data/generated/build.rb +13 -0
- data/generated/interpretation_context.rb +29 -0
- data/lib/Bind.rb +65 -0
- data/lib/Context.rb +187 -0
- data/lib/ImmutableQueue.rb +50 -0
- data/lib/ImmutableStack.rb +38 -0
- data/lib/MethodCall.rb +91 -0
- data/lib/MethodDefinition.rb +114 -0
- data/lib/MethodInfo.rb +78 -0
- data/lib/Self.rb +71 -0
- data/lib/build.rb +14 -0
- data/lib/interpretation_context.rb +30 -0
- data/lib/maroon/contracts.rb +43 -0
- data/lib/maroon/kernel.rb +2 -0
- data/lib/maroon/version.rb +3 -3
- data/maroon.gemspec +26 -26
- metadata +49 -31
- data/lib/Source_cleaner.rb +0 -34
- data/lib/maroon.rb +0 -165
- data/lib/rewriter.rb +0 -185
data/Examples/greeter.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#Thanks to Ted Milken for updating the original example
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
require_relative '../base/maroon_base.rb'
|
3
|
+
#require_relative '../base/maroon/kernel.rb'
|
4
|
+
#require_relative '../base/maroon/contracts.rb'
|
5
5
|
|
6
6
|
class Person
|
7
7
|
attr_accessor :name
|
8
8
|
attr_accessor :greeting
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
ctx, source = Context::define :Greet_Someone, :greet do
|
12
12
|
role :greeter do
|
13
13
|
welcome do
|
14
14
|
self.greeting
|
@@ -19,7 +19,7 @@ context :Greet_Someone, :greet do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
greet do
|
22
|
-
puts
|
22
|
+
puts %{#{greeter.name}: "#{greeter.welcome}, #{greeted.name}!"}
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -30,6 +30,7 @@ class Greet_Someone
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
p source
|
33
34
|
p1 = Person.new
|
34
35
|
p1.name = 'Bob'
|
35
36
|
p1.greeting = 'Hello'
|
@@ -39,7 +40,7 @@ p2.name = 'World!'
|
|
39
40
|
p2.greeting = 'Greetings'
|
40
41
|
|
41
42
|
#Execute is automagically created for the default interaction (specified by the second argument in context :Greet_Someone, :greet do)
|
42
|
-
#Executes
|
43
|
-
Greet_Someone.
|
43
|
+
#Executes construct a context object and calls the default interaction on this object
|
44
|
+
#Greet_Someone.assert_that(p1).can_play(:greeter)
|
44
45
|
#constructs a Greet_Someone context object and executes greet.
|
45
46
|
Greet_Someone.new(p2, p1).greet
|
data/Examples/meter.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
require './lib/maroon/kernel'
|
3
3
|
|
4
4
|
context :Meter, :current_total do
|
5
|
-
|
5
|
+
role :price_per_sec
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
role :route do
|
8
|
+
price do
|
9
|
+
route.calculate_price clock.start
|
10
|
+
end
|
11
|
+
end
|
12
12
|
|
13
13
|
role :clock do
|
14
14
|
price do
|
@@ -20,17 +20,17 @@ context :Meter, :current_total do
|
|
20
20
|
route.update_position current_position
|
21
21
|
clock.price + route.price
|
22
22
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
print_route do
|
24
|
+
route.each_point { |x, y|
|
25
|
+
p "#{x},#{y}"
|
26
|
+
}
|
27
|
+
end
|
28
28
|
end
|
29
29
|
|
30
30
|
class Meter
|
31
|
-
def initialize(start,start_pos)
|
31
|
+
def initialize(start, start_pos)
|
32
32
|
@clock = Clock.new start
|
33
|
-
@route = Route.new({0=>{1=>1.25}},Road_types.new)
|
33
|
+
@route = Route.new({0 => {1 => 1.25}}, Road_types.new)
|
34
34
|
route.update_position start_pos
|
35
35
|
@price_per_sec = 0.05
|
36
36
|
end
|
@@ -38,16 +38,19 @@ end
|
|
38
38
|
|
39
39
|
class Clock
|
40
40
|
attr_reader :start
|
41
|
+
|
41
42
|
def initialize(start)
|
42
43
|
@start = start
|
43
44
|
end
|
45
|
+
|
44
46
|
def duration
|
45
47
|
(Time::now - @start)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
51
|
context :Route do
|
50
|
-
role :prices do
|
52
|
+
role :prices do
|
53
|
+
end
|
51
54
|
role :payable_position do
|
52
55
|
price_from do |prev|
|
53
56
|
return 0 unless prev
|
@@ -59,23 +62,23 @@ context :Route do
|
|
59
62
|
end
|
60
63
|
|
61
64
|
role :positions do
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
65
|
+
price_for_route do |price_table|
|
66
|
+
prev = nil
|
67
|
+
sum = 0
|
68
|
+
positions.each do |pos|
|
69
|
+
bind pos => :payable_position, price_table => :prices
|
70
|
+
sum += pos.price_from prev
|
71
|
+
prev = pos
|
72
|
+
end
|
73
|
+
sum
|
74
|
+
end
|
72
75
|
end
|
73
76
|
update_position do |new_position|
|
74
77
|
positions << new_position
|
75
78
|
end
|
76
79
|
calculate_price do |start_time|
|
77
|
-
|
78
|
-
|
80
|
+
price_table = prices[start_time.hour / (24/prices.length)]
|
81
|
+
positions.price_for_route price_table
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
@@ -91,11 +94,13 @@ class Road_types
|
|
91
94
|
def initialize
|
92
95
|
@road_types = {}
|
93
96
|
end
|
94
|
-
|
97
|
+
|
98
|
+
def []=(pos, road_type)
|
95
99
|
t = @road_types[pos.x] ||= {}
|
96
100
|
t = t[pos.y] ||= {}
|
97
101
|
t[pos.z] = road_type
|
98
102
|
end
|
103
|
+
|
99
104
|
def [](pos)
|
100
105
|
t = @road_types[pos.x]
|
101
106
|
return 1 unless t
|
@@ -111,7 +116,8 @@ class Position
|
|
111
116
|
attr_reader :x
|
112
117
|
attr_reader :y
|
113
118
|
attr_reader :z
|
114
|
-
|
119
|
+
|
120
|
+
def initialize(x, y, z)
|
115
121
|
@x = x
|
116
122
|
@y = y
|
117
123
|
@z = z
|
data/Gemfile
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
source '
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in maroon.gemspec
|
4
|
-
gemspec
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in maroon.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development, :test do
|
7
|
+
gem 'rake'
|
8
|
+
gem 'debugger'
|
9
|
+
end
|
data/LICENSE.txt
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
Copyright (c) 2013 TODO: Write your name
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
1
|
+
Copyright (c) 2013 TODO: Write your name
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
22
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -30,6 +30,12 @@ Context::define :context_name do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
## Running Tests
|
34
|
+
|
35
|
+
If you're using Bundler, run `bundle install` to setup your environment.
|
36
|
+
|
37
|
+
Run `rake test` or just `rake` to make the tests run.
|
38
|
+
|
33
39
|
|
34
40
|
## Contributing
|
35
41
|
|
@@ -39,3 +45,10 @@ end
|
|
39
45
|
4. Push to the branch (`git push origin my-new-feature`)
|
40
46
|
5. Create new Pull Request
|
41
47
|
|
48
|
+
|
49
|
+
Known bugs
|
50
|
+
There are a few known bugs. The two major once are that #{...} syntax in strings can't beused. This is due to
|
51
|
+
limitaion/bug in the current version of sourcify.
|
52
|
+
If declaring several role methods for the same role sourcify might get confused and return the same sexp for
|
53
|
+
multiple of them. The work around is to use do...end for the role ans {|| } for the role methods
|
54
|
+
|
data/Rakefile
CHANGED
@@ -1 +1,41 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Rake::TestTask.new do |t|
|
5
|
+
t.libs << 'test'
|
6
|
+
t.test_files = FileList['test/*_test.rb']
|
7
|
+
t.verbose = true
|
8
|
+
end
|
9
|
+
|
10
|
+
task :generate do |t|
|
11
|
+
require_relative './lib/Context'
|
12
|
+
require_relative './lib/maroon/kernel'
|
13
|
+
require_relative './lib/build' #use the one in lib. That should be the stable one
|
14
|
+
Context::generate_files_in(:generated) #generate files not just in memory classes
|
15
|
+
`git ls-files ./base/`.split($/).grep(%r{(.)*.rb}).select {|f|p f; require_relative("#{f}")}
|
16
|
+
end
|
17
|
+
|
18
|
+
#execute as with command line to make memory spaces independent
|
19
|
+
task :build_lib_setup do |t|
|
20
|
+
generate_out = `rake generate`
|
21
|
+
raise generate_out if generate_out and generate_out != ''
|
22
|
+
test_res = {}
|
23
|
+
test_out = `rake test`
|
24
|
+
test_out.split(/[\n,]/)[-5..-1].each do |e|
|
25
|
+
pair = e.strip.split(/\s/)
|
26
|
+
test_res[pair[-1].to_sym] = pair[0].to_i
|
27
|
+
end
|
28
|
+
raise test_out if (test_res[:failures] + test_res[:errors] != 0)
|
29
|
+
generate_out = `rake build_generate`
|
30
|
+
raise generate_out if generate_out and generate_out != ''
|
31
|
+
end
|
32
|
+
|
33
|
+
task :build_generate do |t|
|
34
|
+
require_relative './generated/build' #use the one previously generated
|
35
|
+
Context::generate_files_in('generated') #generate files
|
36
|
+
`git ls-files ./base/`.split($/).grep(%r{(.)*.rb}).select {|f| require_relative("#{f}")}
|
37
|
+
end
|
38
|
+
|
39
|
+
task :default => [:generate,:test]
|
40
|
+
|
41
|
+
task :build_lib => [:build_lib_setup,:test]
|
@@ -1,13 +1,14 @@
|
|
1
|
-
|
2
|
-
require './lib/maroon.rb'
|
3
|
-
require './lib/maroon/kernel.rb'
|
4
|
-
require 'ripper'
|
5
|
-
require './Test/source_assertions.rb'
|
6
|
-
require './Examples/meter.rb'
|
1
|
+
require_relative './test_helper.rb'
|
7
2
|
|
3
|
+
require_relative '../lib/maroon/kernel.rb'
|
4
|
+
require_relative '../lib/build'
|
8
5
|
|
9
|
-
|
10
|
-
|
6
|
+
require_relative 'assertions.rb'
|
7
|
+
#require './Examples/meter.rb'
|
8
|
+
|
9
|
+
|
10
|
+
class BasicTests < MiniTest::Unit::TestCase
|
11
|
+
include SourceAssertions
|
11
12
|
|
12
13
|
def test_define_context
|
13
14
|
name = :MyContext
|
@@ -19,12 +20,12 @@ class BasicTests < Test::Unit::TestCase
|
|
19
20
|
|
20
21
|
def test_base_class
|
21
22
|
name = :MyDerivedContext
|
22
|
-
ctx,source = context name, Person do
|
23
|
+
ctx, source = context name, Person do
|
23
24
|
end
|
24
25
|
obj = MyDerivedContext.new
|
25
26
|
obj.name = name
|
26
27
|
assert_equal(ctx.name, "Kernel::#{name}")
|
27
|
-
|
28
|
+
refute_nil(obj.name)
|
28
29
|
assert((obj.class < Person), 'Object is not a Person')
|
29
30
|
assert_equal(name, obj.name)
|
30
31
|
end
|
@@ -38,7 +39,7 @@ class BasicTests < Test::Unit::TestCase
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
41
|
-
|
42
|
+
refute_nil(ctx)
|
42
43
|
assert_equal(ctx.name, "Kernel::#{name}")
|
43
44
|
assert_source_equal("class #{name}\r\n\n@#{role_name}\n\n private\ndef #{role_name};@#{role_name} end\n\n \ndef self_#{role_name}_role_go_do \n end\n\n\r\nend", source)
|
44
45
|
end
|
@@ -47,7 +48,7 @@ class BasicTests < Test::Unit::TestCase
|
|
47
48
|
name, role_name = :MyContextWithRoleAndArgs, :my_role
|
48
49
|
ctx, source = Context::define name do
|
49
50
|
role role_name do
|
50
|
-
role_go_do do |x,y|
|
51
|
+
role_go_do do |x, y|
|
51
52
|
|
52
53
|
end
|
53
54
|
role_go do |x|
|
@@ -55,7 +56,7 @@ class BasicTests < Test::Unit::TestCase
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
58
|
-
|
59
|
+
refute_nil(ctx)
|
59
60
|
assert_equal(ctx.name, "Kernel::#{name}")
|
60
61
|
assert_source_equal("class #{name}\r\n\n@#{role_name}\n\n private\ndef #{role_name};@#{role_name} end\n\n \ndef self_#{role_name}_role_go_do(x,y) \n end\n\ndef self_#{role_name}_role_go(x) \n end\n\n\r\nend", source)
|
61
62
|
end
|
@@ -78,7 +79,7 @@ class BasicTests < Test::Unit::TestCase
|
|
78
79
|
end
|
79
80
|
end
|
80
81
|
arr = MyContextUsingBind.new.go_do
|
81
|
-
|
82
|
+
refute_nil(ctx)
|
82
83
|
assert_equal(ctx.name, "Kernel::#{name}")
|
83
84
|
expected = "class MyContextUsingBind\r\n \ndef go_do \na = Array.new\n [1, 2].each do |e|\n temp____other_role = @other_role\n @other_role = e\n (a << self_other_role_plus_one)\n @other_role = temp____other_role\n end\n a\n end\n\n@other_role\n\n private\ndef other_role;@other_role end\n\n \ndef self_other_role_plus_one \n(other_role + 1) end\n\n\r\nend"
|
84
85
|
assert_source_equal(expected, source)
|
@@ -140,7 +141,7 @@ class Greet_Someone2
|
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
143
|
-
class TestExamples <
|
144
|
+
class TestExamples < MiniTest::Unit::TestCase
|
144
145
|
def test_greeter
|
145
146
|
p1 = Person.new
|
146
147
|
p1.name = 'Bob'
|
@@ -164,7 +165,7 @@ class TestExamples < Test::Unit::TestCase
|
|
164
165
|
end
|
165
166
|
|
166
167
|
|
167
|
-
class TestExamples <
|
168
|
+
class TestExamples < MiniTest::Unit::TestCase
|
168
169
|
def test_greeter
|
169
170
|
p1 = Person.new
|
170
171
|
p1.name = 'Bob'
|
@@ -174,6 +175,9 @@ class TestExamples < Test::Unit::TestCase
|
|
174
175
|
p2.name = 'World!'
|
175
176
|
p2.greeting = 'Greetings'
|
176
177
|
|
178
|
+
puts "with_contracts: #{Context::with_contracts}"
|
179
|
+
Greet_Someone.assert_that(p1).can_play(:greeter)
|
180
|
+
Greet_Someone.refute_that(self).can_play(:greeter)
|
177
181
|
message = ' Nice weather, don\'t you think?'
|
178
182
|
res1 = Greet_Someone2.call p1, p2, message
|
179
183
|
res2 = Greet_Someone2.new(p2, p1).greet message
|
@@ -186,11 +190,11 @@ class TestExamples < Test::Unit::TestCase
|
|
186
190
|
end
|
187
191
|
end
|
188
192
|
|
189
|
-
class TestExamples <
|
193
|
+
class TestExamples < MiniTest::Unit::TestCase
|
190
194
|
def test_meter_example
|
191
|
-
meter = Meter.new Time::now, Position.new(1,2,0)
|
192
|
-
result = meter.call Position.new(2,4,1)
|
193
|
-
assert_equal(3,result.to_i)
|
195
|
+
meter = Meter.new Time::now, Position.new(1, 2, 0)
|
196
|
+
result = meter.call Position.new(2, 4, 1)
|
197
|
+
assert_equal(3, result.to_i)
|
194
198
|
end
|
195
199
|
end
|
196
200
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require_relative '../generated/ImmutableQueue'
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
class ImmutableQueueTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_sunny
|
9
|
+
queue = ImmutableQueue::empty.push 1
|
10
|
+
queue = queue.push(2)
|
11
|
+
f,queue = queue.pop()
|
12
|
+
refute_nil(queue)
|
13
|
+
s,queue = queue.pop()
|
14
|
+
assert_equal(1,f)
|
15
|
+
assert_equal(2,s)
|
16
|
+
assert_equal(ImmutableQueue::empty, queue)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require_relative '../generated/MethodInfo'
|
3
|
+
require 'ripper'
|
4
|
+
require_relative 'test_helper'
|
5
|
+
|
6
|
+
class MethodInfoTest < Test::Unit::TestCase
|
7
|
+
include SourceAssertions
|
8
|
+
def test_simple
|
9
|
+
block = get_sexp do |a,b|
|
10
|
+
p 'this is a test'
|
11
|
+
end
|
12
|
+
source = MethodInfo.new(false,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
|
13
|
+
expected = %{def name(a,b)
|
14
|
+
p("this is a test")
|
15
|
+
end
|
16
|
+
}
|
17
|
+
assert_source_equal(expected,source)
|
18
|
+
end
|
19
|
+
def test_class_method
|
20
|
+
block = get_sexp do |a,b|
|
21
|
+
p 'this is a test'
|
22
|
+
end
|
23
|
+
source = MethodInfo.new(self,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
|
24
|
+
expected = %{def self.name(a,b)
|
25
|
+
p("this is a test")
|
26
|
+
end
|
27
|
+
}
|
28
|
+
assert_source_equal(expected,source)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_splat_argument
|
32
|
+
block = get_sexp do |a,*b|
|
33
|
+
p 'this is a test'
|
34
|
+
end
|
35
|
+
source = MethodInfo.new(nil,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
|
36
|
+
expected = %{def name(a,*b)
|
37
|
+
p("this is a test")
|
38
|
+
end
|
39
|
+
}
|
40
|
+
assert_source_equal(expected,source)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_block_argument
|
44
|
+
block = get_sexp do |a,b|
|
45
|
+
p 'this is a test'
|
46
|
+
end
|
47
|
+
source = MethodInfo.new({:block=>:block},block,true)
|
48
|
+
source = source.build_as_context_method("name",InterpretationContext.new({},{},{},nil))
|
49
|
+
expected = %{def name(a,b,&block)
|
50
|
+
p("this is a test")
|
51
|
+
end
|
52
|
+
}
|
53
|
+
assert_source_equal(expected,source)
|
54
|
+
end
|
55
|
+
def test_block_argument_class_method
|
56
|
+
block = (get_sexp { |a,*b|
|
57
|
+
p 'is a test' })
|
58
|
+
source = MethodInfo.new({:block=>:block,:self=>self},block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
|
59
|
+
expected = %{def self.name(a,*b,&block)
|
60
|
+
p("this is a test")
|
61
|
+
end
|
62
|
+
}
|
63
|
+
assert_source_equal(expected,source)
|
64
|
+
end
|
65
|
+
end
|