AmberVM 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. data/README +38 -0
  2. data/bin/ambervm +278 -0
  3. data/lib/amber/acts_as_rvm_type.rb +157 -0
  4. data/lib/amber/classes/association.rb +36 -0
  5. data/lib/amber/classes/block.rb +52 -0
  6. data/lib/amber/classes/boolean.rb +40 -0
  7. data/lib/amber/classes/class.rb +50 -0
  8. data/lib/amber/classes/error.rb +22 -0
  9. data/lib/amber/classes/list.rb +96 -0
  10. data/lib/amber/classes/null.rb +35 -0
  11. data/lib/amber/classes/number.rb +95 -0
  12. data/lib/amber/classes/object.rb +56 -0
  13. data/lib/amber/classes/string.rb +79 -0
  14. data/lib/amber/classes.rb +113 -0
  15. data/lib/amber/environment.rb +251 -0
  16. data/lib/amber/fukubukuro/ecma_core.rb +409 -0
  17. data/lib/amber/fukubukuro.rb +866 -0
  18. data/lib/amber/functions/all.rb +3 -0
  19. data/lib/amber/functions/array/append.rb +50 -0
  20. data/lib/amber/functions/array/at.rb +50 -0
  21. data/lib/amber/functions/array/set_at.rb +50 -0
  22. data/lib/amber/functions/array.rb +30 -0
  23. data/lib/amber/functions/association/assoc_get.rb +55 -0
  24. data/lib/amber/functions/association/assoc_set.rb +56 -0
  25. data/lib/amber/functions/bitwise/bitwise_and.rb +41 -0
  26. data/lib/amber/functions/bitwise/bitwise_not.rb +41 -0
  27. data/lib/amber/functions/bitwise/bitwise_or.rb +41 -0
  28. data/lib/amber/functions/bitwise/bitwise_xor.rb +41 -0
  29. data/lib/amber/functions/bitwise.rb +3 -0
  30. data/lib/amber/functions/collection/get.rb +66 -0
  31. data/lib/amber/functions/collection/set.rb +67 -0
  32. data/lib/amber/functions/collection/size.rb +54 -0
  33. data/lib/amber/functions/general/cmp.rb +43 -0
  34. data/lib/amber/functions/general/eq.rb +45 -0
  35. data/lib/amber/functions/general/gt.rb +45 -0
  36. data/lib/amber/functions/general/gte.rb +45 -0
  37. data/lib/amber/functions/general/lt.rb +45 -0
  38. data/lib/amber/functions/general/lte.rb +45 -0
  39. data/lib/amber/functions/general/neq.rb +45 -0
  40. data/lib/amber/functions/general/type.rb +43 -0
  41. data/lib/amber/functions/general.rb +3 -0
  42. data/lib/amber/functions/io/print.rb +45 -0
  43. data/lib/amber/functions/io.rb +3 -0
  44. data/lib/amber/functions/list/align.rb +73 -0
  45. data/lib/amber/functions/list/join.rb +45 -0
  46. data/lib/amber/functions/list/map.rb +58 -0
  47. data/lib/amber/functions/list/split.rb +55 -0
  48. data/lib/amber/functions/list.rb +3 -0
  49. data/lib/amber/functions/logic/and.rb +55 -0
  50. data/lib/amber/functions/logic/not.rb +40 -0
  51. data/lib/amber/functions/logic/or.rb +50 -0
  52. data/lib/amber/functions/logic.rb +3 -0
  53. data/lib/amber/functions/math/abs.rb +39 -0
  54. data/lib/amber/functions/math/acos.rb +39 -0
  55. data/lib/amber/functions/math/add.rb +40 -0
  56. data/lib/amber/functions/math/asin.rb +39 -0
  57. data/lib/amber/functions/math/atan.rb +39 -0
  58. data/lib/amber/functions/math/ceil.rb +39 -0
  59. data/lib/amber/functions/math/cos.rb +39 -0
  60. data/lib/amber/functions/math/dec.rb +39 -0
  61. data/lib/amber/functions/math/div.rb +44 -0
  62. data/lib/amber/functions/math/exp.rb +39 -0
  63. data/lib/amber/functions/math/floor.rb +39 -0
  64. data/lib/amber/functions/math/inc.rb +39 -0
  65. data/lib/amber/functions/math/log.rb +39 -0
  66. data/lib/amber/functions/math/mod.rb +41 -0
  67. data/lib/amber/functions/math/mul.rb +43 -0
  68. data/lib/amber/functions/math/neg.rb +43 -0
  69. data/lib/amber/functions/math/power.rb +43 -0
  70. data/lib/amber/functions/math/rand.rb +36 -0
  71. data/lib/amber/functions/math/round.rb +39 -0
  72. data/lib/amber/functions/math/shl.rb +41 -0
  73. data/lib/amber/functions/math/shr.rb +41 -0
  74. data/lib/amber/functions/math/sin.rb +39 -0
  75. data/lib/amber/functions/math/sub.rb +43 -0
  76. data/lib/amber/functions/math/tan.rb +39 -0
  77. data/lib/amber/functions/math.rb +3 -0
  78. data/lib/amber/functions/objects/send.rb +22 -0
  79. data/lib/amber/functions/rails/print.rb +44 -0
  80. data/lib/amber/functions/rails.rb +3 -0
  81. data/lib/amber/functions/string/ansi.rb +24 -0
  82. data/lib/amber/functions/string/capstr.rb +23 -0
  83. data/lib/amber/functions/string/center.rb +25 -0
  84. data/lib/amber/functions/string/chr.rb +16 -0
  85. data/lib/amber/functions/string/ljust.rb +26 -0
  86. data/lib/amber/functions/string/regmatch.rb +34 -0
  87. data/lib/amber/functions/string/rjust.rb +26 -0
  88. data/lib/amber/functions/string.rb +3 -0
  89. data/lib/amber/functions.rb +103 -0
  90. data/lib/amber/interpreter.rb +1380 -0
  91. data/lib/amber/languages/brainfuck.rb +153 -0
  92. data/lib/amber/languages/ecma/compiler.rb +1661 -0
  93. data/lib/amber/languages/ecma/core-math.js +67 -0
  94. data/lib/amber/languages/ecma/core-objects.js +57 -0
  95. data/lib/amber/languages/ecma.rb +9 -0
  96. data/lib/amber/languages/ecma_fuku/compiler.rb +1622 -0
  97. data/lib/amber/languages/ecma_fuku/core-math.js +67 -0
  98. data/lib/amber/languages/ecma_fuku/core-objects.js +56 -0
  99. data/lib/amber/languages/ecma_fuku.rb +13 -0
  100. data/lib/amber/languages/math/compiler.rb +70 -0
  101. data/lib/amber/languages/math/tokenizer.rb +69 -0
  102. data/lib/amber/languages/math/tree.rb +110 -0
  103. data/lib/amber/languages/math.rb +26 -0
  104. data/lib/amber/languages.rb +99 -0
  105. data/lib/amber/library.rb +79 -0
  106. data/lib/amber/optimisation.rb +299 -0
  107. data/lib/amber/plugin.rb +337 -0
  108. data/lib/amber/rails.rb +90 -0
  109. data/lib/amber.rb +106 -0
  110. data/spec/amber/class_spec.rb +27 -0
  111. data/spec/amber/enviroment_spec.rb +61 -0
  112. data/spec/amber/function_spec.rb +25 -0
  113. data/spec/amber/functions/association/assoc_get_spec.rb +41 -0
  114. data/spec/amber/functions/association/assoc_set_spec.rb +43 -0
  115. data/spec/amber/functions/collection/get_spec.rb +12 -0
  116. data/spec/amber/functions/collection/set_spec.rb +10 -0
  117. data/spec/amber/functions/collection/size_spec.rb +10 -0
  118. data/spec/amber/functions/list/split_spec.rb +47 -0
  119. data/spec/amber/functions/string/ansi_spec.rb +44 -0
  120. data/spec/amber/functions/string/capstr_spec.rb +42 -0
  121. data/spec/amber/functions/string/center_spec.rb +49 -0
  122. data/spec/amber/functions/string/ljust_spec.rb +49 -0
  123. data/spec/amber/functions/string/regmatch_spec.rb +52 -0
  124. data/spec/amber/functions/string/rjust_spec.rb +49 -0
  125. data/spec/amber/interpreter/assignment_spec.rb +22 -0
  126. data/spec/amber/interpreter/condition_spec.rb +103 -0
  127. data/spec/amber/interpreter/constant_spec.rb +31 -0
  128. data/spec/amber/interpreter/core_call_spec.rb +72 -0
  129. data/spec/amber/interpreter/interpreter_spec.rb +11 -0
  130. data/spec/amber/interpreter/parameter_spec.rb +24 -0
  131. data/spec/amber/interpreter/sequence_spec.rb +47 -0
  132. data/spec/amber/interpreter/variable_spec.rb +24 -0
  133. data/spec/amber/plugin_spec.rb +10 -0
  134. data/spec/classes/atom/association_spec.rb +39 -0
  135. data/spec/classes/atom/block_spec.rb +25 -0
  136. data/spec/classes/atom/boolean_spec.rb +67 -0
  137. data/spec/classes/atom/error_spec.rb +43 -0
  138. data/spec/classes/atom/list_spec.rb +68 -0
  139. data/spec/classes/atom/number_spec.rb +132 -0
  140. data/spec/classes/atom/string_spec.rb +175 -0
  141. data/spec/languages/ecma/ecma_array_spec.rb +79 -0
  142. data/spec/languages/ecma/ecma_closure_spec.rb +38 -0
  143. data/spec/languages/ecma/ecma_literals_spec.rb +71 -0
  144. data/spec/languages/ecma/ecma_objects_spec.rb +165 -0
  145. data/spec/languages/ecma/ecma_old_spec.rb +540 -0
  146. data/spec/languages/ecma/ecma_spec.rb +64 -0
  147. data/spec/languages/ecma_fuku/ecma_array_spec.rb +61 -0
  148. data/spec/languages/ecma_fuku/ecma_closure_spec.rb +33 -0
  149. data/spec/languages/ecma_fuku/ecma_function_spec.rb +84 -0
  150. data/spec/languages/ecma_fuku/ecma_literals_spec.rb +55 -0
  151. data/spec/languages/ecma_fuku/ecma_objects_spec.rb +133 -0
  152. data/spec/languages/ecma_fuku/ecma_old_spec.rb +415 -0
  153. data/spec/languages/ecma_fuku/ecma_operator_spec.rb +33 -0
  154. data/spec/languages/ecma_fuku/ecma_spec.rb +52 -0
  155. data/spec/languages/math/compiler_spec.rb +49 -0
  156. data/spec/languages/math/tokenizer_spec.rb +73 -0
  157. data/spec/languages/math/tree_spec.rb +153 -0
  158. metadata +225 -0
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../helpers/plugin_helper'
2
+ require File.dirname(__FILE__) + '/../../helpers/function_helper'
3
+ require 'amber/functions/string/regmatch'
4
+
5
+
6
+ describe AmberVM::Functions::Regmatch do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Regmatch
10
+ end
11
+
12
+ describe "(plugin)" do
13
+ it_should_behave_like "a plugin"
14
+
15
+ end
16
+
17
+ describe "(function)" do
18
+ it_should_behave_like "a function"
19
+
20
+ it "should have a signature of string, string" do
21
+ @object.signature.should == [AmberVM::Classes::String, AmberVM::Classes::String]
22
+ end
23
+ it "should have a type of boolean" do
24
+ @object.data_type.should == :boolean
25
+ end
26
+ end
27
+
28
+ describe "(functionality)" do
29
+
30
+ it "should not work with exactly 2" do
31
+ @object.execute([], nil).should be_instance_of(AmberVM::Classes::Error)
32
+ @object.execute([1], nil).should be_instance_of(AmberVM::Classes::Error)
33
+ @object.execute([1,2,3], nil).should be_instance_of(AmberVM::Classes::Error)
34
+ @object.execute([1,2,3,4], nil).should be_instance_of(AmberVM::Classes::Error)
35
+ end
36
+
37
+ it "should retrn an error if the param is not a valid regexp" do
38
+ @object.execute(['*','*'], nil).should be_instance_of(AmberVM::Classes::Error)
39
+ end
40
+
41
+ it "should return true if the regular expressiom matches" do
42
+ @object.execute(['*','.'], nil).is_true?.should be_true
43
+ @object.execute(['1','\d'], nil).is_true?.should be_true
44
+ end
45
+
46
+ it "should return false if the regular expression does not matches" do
47
+ @object.execute(['*','a'], nil).is_true?.should be_false
48
+ @object.execute(['abc','\d'], nil).is_true?.should be_false
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/string/rjust'
4
+
5
+
6
+ describe AmberVM::Functions::Rjust do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Rjust
10
+ end
11
+
12
+ describe "(plugin)" do
13
+ it_should_behave_like "a plugin"
14
+
15
+ end
16
+
17
+ describe "(function)" do
18
+ it_should_behave_like "a function"
19
+
20
+ it "should have a signature of string, string" do
21
+ @object.signature.should == [AmberVM::Classes::String, AmberVM::Classes::Number, AmberVM::Classes::String]
22
+ end
23
+ it "should have a type of boolean" do
24
+ @object.data_type.should == :string
25
+ end
26
+ end
27
+
28
+ describe "(functionality)" do
29
+
30
+ it "should not work with less then 2 params or more then 3" do
31
+ @object.execute([], nil).should be_instance_of(AmberVM::Classes::Error)
32
+ @object.execute([1], nil).should be_instance_of(AmberVM::Classes::Error)
33
+ @object.execute([1,2,3,4], nil).should be_instance_of(AmberVM::Classes::Error)
34
+ end
35
+
36
+ it "should call the rjust function with one param if it is given" do
37
+ arg1 = mock('arg mock')
38
+ arg1.should_receive(:rjust).once.with(1).and_return 'rjust'
39
+ @object.execute([arg1,1], nil).should == 'rjust'
40
+ end
41
+
42
+ it "should call the rjust function with one two param if they are given" do
43
+ arg1 = mock('arg mock')
44
+ arg1.should_receive(:rjust).once.with(1,2).and_return 'rjust'
45
+ @object.execute([arg1,1,2], nil).should == 'rjust'
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,22 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Assignment do
4
+ before do
5
+ @variable = mock('variable mock')
6
+ @value = mock('value mock')
7
+ @env = mock('env mock')
8
+ @object = AmberVM::Interpreter::Assignment.new(@variable, @value)
9
+ end
10
+
11
+ it "should have the type of it's value" do
12
+ @value.should_receive(:data_type).with(no_args).once.and_return(:example)
13
+ @object.data_type.should == :example
14
+ end
15
+
16
+ it "should execute first the name then the value and store it in env" do
17
+ @variable.should_receive(:execute).with(@env).once.and_return(@variable)
18
+ @variable.should_receive(:val=).with('value').once.and_return('value')
19
+ @value.should_receive(:execute).with(@env).once.and_return('value')
20
+ @object.execute(@env).should == 'value'
21
+ end
22
+ end
@@ -0,0 +1,103 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Condition do
4
+ before do
5
+ @true_case = mock('true case mock')
6
+ @false_case = mock('false case mock')
7
+ @condition = mock('condition mock')
8
+ @env = AmberVM::Interpreter.env
9
+ @object = AmberVM::Interpreter::Condition.new(@condition, @true_case, @false_case)
10
+ end
11
+
12
+ it "should execute the condition if true execute the true case, retring it's value" do
13
+ result = mock('result mock')
14
+ result.should_receive(:is_true?).with(no_args).once.and_return(true)
15
+ @true_case.should_receive(:execute).with(@env).once.and_return('true case')
16
+ @condition.should_receive(:execute).with(@env).once.and_return(result)
17
+ @object.execute(@env).should == 'true case'
18
+ end
19
+
20
+ it "should execute the condition if false execute the false case, retring it's value" do
21
+ result = mock('result mock')
22
+ result.should_receive(:is_true?).with(no_args).once.and_return(false)
23
+ @false_case.should_receive(:execute).with(@env).once.and_return('false case')
24
+ @condition.should_receive(:execute).with(@env).once.and_return(result)
25
+ @object.execute(@env).should == 'false case'
26
+ end
27
+
28
+ it "should execute the condition if false and no false condition is given return nil" do
29
+ @object = AmberVM::Interpreter::Condition.new(@condition, @true_case)
30
+ result = mock('result mock')
31
+ result.should_receive(:is_true?).with(no_args).once.and_return(false)
32
+ @condition.should_receive(:execute).with(@env).once.and_return(result)
33
+ @object.execute(@env).should be_nil
34
+ end
35
+
36
+ it "should return the type of it's cases if they are the same" do
37
+ @true_case.should_receive(:data_type).with(no_args).once.and_return('type1')
38
+ @false_case.should_receive(:data_type).with(no_args).at_least(:once).and_return('type1')
39
+ @object.data_type.should == 'type1'
40
+ end
41
+
42
+ it "should return the :any type if the types are not the same" do
43
+ @true_case.should_receive(:data_type).with(no_args).once.and_return('type1')
44
+ @false_case.should_receive(:data_type).with(no_args).once.and_return('type2')
45
+ @object.data_type.should == :any
46
+ end
47
+ =begin
48
+
49
+ it "should use path 0 for the true case" do
50
+ result = mock('result mock')
51
+ result.should_receive(:is_true?).with(no_args).once.and_return(true)
52
+ path = mock('Path mock')
53
+
54
+ @env.should_receive(:path).twice.and_return(path)
55
+ path.should_receive(:<<).with(0).once
56
+ path.should_receive(:pop).with(no_args).once.and_return(0)
57
+
58
+ @true_case.should_receive(:execute).with(@env).once.and_return('true case')
59
+ @condition.should_receive(:execute).with(@env).once.and_return(result)
60
+ @object.execute(@env).should == 'true case'
61
+ end
62
+
63
+ it "should use path 1 for the false case" do
64
+ result = mock('result mock')
65
+ result.should_receive(:is_true?).with(no_args).once.and_return(false)
66
+ path = mock('Path mock')
67
+
68
+ @env.should_receive(:path).twice.and_return(path)
69
+ path.should_receive(:<<).with(1).once
70
+ path.should_receive(:pop).with(no_args).once.and_return(1)
71
+
72
+ @false_case.should_receive(:execute).with(@env).once.and_return('false case')
73
+ @condition.should_receive(:execute).with(@env).once.and_return(result)
74
+ @object.execute(@env).should == 'false case'
75
+ end
76
+
77
+ =begin
78
+ it "should add add a new layer to path when called" do
79
+ @path = mock('path mock')
80
+ @object = AmberVM::Interpreter::Sequence.new([@part1])
81
+ @part1.should_receive(:execute).with(@env, nil).once
82
+ @env.should_receive(:path).with(no_args).exactly(4).times.and_return(@path)
83
+ @path.should_receive(:<<).with(0).once
84
+ @path.should_receive(:pop).with(no_args).twice.and_return(0)
85
+ @path.should_receive(:<<).with(1).once
86
+ @object.execute(@env)
87
+ end
88
+
89
+ it "should skip parts according to the path" do
90
+ @part2.should_receive(:execute).with(@env, nil).once
91
+ @env.should_receive(:path).with(no_args).exactly(6).times.and_return([1])
92
+ @object.execute(@env, [1])
93
+ end
94
+
95
+ it "should hand down the path to the next executor" do
96
+ @part2.should_receive(:execute).with(@env, [2]).once
97
+ @env.should_receive(:path).with(no_args).exactly(6).times.and_return([1])
98
+ @object.execute(@env, [1,2])
99
+ end
100
+ =end
101
+
102
+
103
+ end
@@ -0,0 +1,31 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Constant do
4
+ before do
5
+ @value = mock('value mock')
6
+ @env = AmberVM::Interpreter.env
7
+ @object = AmberVM::Interpreter::Constant.new(@value)
8
+ end
9
+
10
+ it "should return the value when executed." do
11
+ @object.execute(@env).should be(@value)
12
+ end
13
+
14
+ it "should have the data type of it's value" do
15
+ @value.should_receive(:data_type).with(no_args).once.and_return(:example)
16
+ @object.data_type.should == :example
17
+ end
18
+
19
+ it "should compare with other constants based on the value" do
20
+ @object.==(@object).should be_true
21
+ object2 = AmberVM::Interpreter::Constant.new(@value)
22
+ @object.==(object2).should be_true
23
+ object3 = AmberVM::Interpreter::Constant.new(1)
24
+ @object.==(object3).should be_false
25
+ end
26
+
27
+ it "should not compare to other types" do
28
+ @object.==(1).should be_false
29
+ end
30
+
31
+ end
@@ -0,0 +1,72 @@
1
+ require 'amber/interpreter'
2
+ require 'amber/classes/block'
3
+
4
+ class CoreMock < AmberVM::Functions::Function
5
+ register_for :mock
6
+ class << self
7
+ def call *args
8
+ 'result'
9
+ end
10
+ def execargs
11
+ @execargs
12
+ end
13
+ def data_type
14
+ :type
15
+ end
16
+ def execargs=v
17
+ @execargs = v
18
+ end
19
+ end
20
+ end
21
+
22
+ class AmberVM::Interpreter::CoreCall
23
+ def fun
24
+ @fun
25
+ end
26
+
27
+ def fun= f
28
+ @fun = f
29
+ end
30
+ end
31
+
32
+ describe AmberVM::Interpreter::CoreCall do
33
+ before do
34
+ @param1 = mock('param 1 mock')
35
+ @param2 = mock('param 2 mock')
36
+ @fun = mock('Core mock')
37
+ @env = mock('env mock')
38
+ end
39
+
40
+ describe "(execution)" do
41
+ before do
42
+ @object = AmberVM::Interpreter::CoreCall.new(:mock, [@param1,@param2])
43
+ end
44
+
45
+ it "shold execute it's params when the Core.execargs returns true" do
46
+ CoreMock.execargs = true
47
+ @object = AmberVM::Interpreter::CoreCall.new('mock', [@param1,@param2])
48
+ @param1.should_receive(:execute).once.with(@env).and_return('param 1')
49
+ @param2.should_receive(:execute).once.with(@env).and_return('param 2')
50
+ @object.execute(@env).should == 'result'
51
+ end
52
+
53
+ it "shold not execute it's params when the Core.execargs returns false" do
54
+ CoreMock.execargs = false
55
+ @object = AmberVM::Interpreter::CoreCall.new('mock', [@param1,@param2])
56
+ @object.execute(@env).should == 'result'
57
+ end
58
+
59
+ it "should return the data type of the Core" do
60
+ @object.data_type.should == :type
61
+ end
62
+
63
+ it "should not compare with random objects" do
64
+ @object.==(1).should be_false
65
+ end
66
+
67
+ it "should compare with other Core if args and params are true it is the same" do
68
+ @object = AmberVM::Interpreter::CoreCall.new(:mock, [@param1,@param2])
69
+ @object.==(@object).should be_true
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter do
4
+
5
+ it "should create a constant" do
6
+ c = AmberVM::Interpreter.const(:string, 'wobble')
7
+ c.should be_instance_of(AmberVM::Interpreter::Constant)
8
+ c.value.should be_instance_of(AmberVM::Classes[:string])
9
+ c.value.should == 'wobble'
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Parameter do
4
+ before do
5
+ @value = mock('value mock')
6
+ @num = mock('name mock')
7
+ @env = mock('env mock')
8
+ @object = AmberVM::Interpreter::Parameter.new(@num)
9
+ end
10
+
11
+ it "should give the values type if name is a constant" do
12
+ @object.data_type.should == :any
13
+ end
14
+
15
+ it "should return the correct value and store it's type" do
16
+ @num.should_receive(:execute).with(@env).once.and_return(0)
17
+ @env.should_receive(:param).with(0).once.and_return(@value)
18
+ @value.should_receive(:data_type).with(no_args).once.and_return(:type)
19
+ @object.execute(@env).should be(@value)
20
+ @object.data_type.should == :type
21
+ end
22
+
23
+
24
+ end
@@ -0,0 +1,47 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Sequence do
4
+ =begin
5
+ before do
6
+ @part1 = mock('part1 mock')
7
+ @part2 = mock('part2 mock')
8
+ @env = mock('env mock')
9
+
10
+ @object = AmberVM::Interpreter::Sequence.new([@part1,@part2])
11
+ end
12
+
13
+ it "should execute each part after another" do
14
+ @part1.should_receive(:execute).with(@env, nil).once
15
+ @part2.should_receive(:execute).with(@env, nil).once
16
+ @env.should_receive(:path).with(no_args).exactly(6).times.and_return([1])
17
+ @object.execute(@env)
18
+ end
19
+
20
+ it "should have a data_type of :any" do
21
+ @object.data_type.should == :any
22
+ end
23
+
24
+ it "should add add a new layer to path when called" do
25
+ @path = mock('path mock')
26
+ @object = AmberVM::Interpreter::Sequence.new([@part1])
27
+ @part1.should_receive(:execute).with(@env, nil).once
28
+ @env.should_receive(:path).with(no_args).exactly(4).times.and_return(@path)
29
+ @path.should_receive(:<<).with(0).once
30
+ @path.should_receive(:pop).with(no_args).twice.and_return(0)
31
+ @path.should_receive(:<<).with(1).once
32
+ @object.execute(@env)
33
+ end
34
+
35
+ it "should skip parts according to the path" do
36
+ @part2.should_receive(:execute).with(@env, nil).once
37
+ @env.should_receive(:path).with(no_args).exactly(6).times.and_return([1])
38
+ @object.execute(@env, [1])
39
+ end
40
+
41
+ it "should hand down the path to the next executor" do
42
+ @part2.should_receive(:execute).with(@env, [2]).once
43
+ @env.should_receive(:path).with(no_args).exactly(6).times.and_return([1])
44
+ @object.execute(@env, [1,2])
45
+ end
46
+ =end
47
+ end
@@ -0,0 +1,24 @@
1
+ require 'amber/interpreter'
2
+
3
+ describe AmberVM::Interpreter::Variable do
4
+ before do
5
+ @value = mock('value mock')
6
+ @name = mock('name mock')
7
+ @env = mock('env mock')
8
+ @object = AmberVM::Interpreter::Variable.new(@name)
9
+ end
10
+
11
+ it "should give the values type if name is a constant" do
12
+ @object.data_type.should == :any
13
+ end
14
+
15
+ it "should return the correct value and store it's type" do
16
+ @name.should_receive(:execute).with(@env).once.and_return('name')
17
+ @env.should_receive(:[]).with('name').once.and_return(@value)
18
+ @value.should_receive(:val).with(no_args).once
19
+ @object.execute(@env).should be(@value)
20
+ @object.data_type.should == :any
21
+ end
22
+
23
+
24
+ end
@@ -0,0 +1,10 @@
1
+ require 'amber/plugin'
2
+ require 'spec/amber/helpers/plugin_helper'
3
+
4
+ describe AmberVM::PluginHost do
5
+ it_should_behave_like 'a plugin host'
6
+ end
7
+
8
+ describe AmberVM::Plugin do
9
+ it_should_behave_like 'a plugin'
10
+ end
@@ -0,0 +1,39 @@
1
+ require 'amber/classes'
2
+ require 'amber/classes/association'
3
+ require 'amber/functions/association/assoc_get'
4
+ require 'amber/functions/association/assoc_set'
5
+ require 'amber/functions/collection/size'
6
+
7
+ describe AmberVM::Classes::Association do
8
+
9
+ before(:each) do
10
+ @assoc = AmberVM::Classes::Association.new
11
+ @assoc['key'] = 'value'
12
+ end
13
+
14
+ it "should craete with no arguments"
15
+
16
+ it "should create with an hash"
17
+
18
+ it "should allow you to read values" do
19
+ @assoc['key'].should == 'value'
20
+ end
21
+
22
+ it "should allow you to write values" do
23
+ @assoc['key'].should == 'value'
24
+ @assoc['key'] = 'another value'
25
+ @assoc['key'].should == 'another value'
26
+ end
27
+
28
+ it "should publish a get method" do
29
+ @assoc.functions.keys.should include('get')
30
+ end
31
+
32
+ it "should publish a set method" do
33
+ @assoc.functions.keys.should include('set')
34
+ end
35
+
36
+ it "should publich a size method" do
37
+ @assoc.functions.keys.should include('size')
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ $: << 'lib'
2
+ require 'amber/classes'
3
+ require 'amber/interpreter'
4
+ describe AmberVM::Classes::Block do
5
+
6
+ before(:each) do
7
+ @env = AmberVM::Interpreter.env
8
+ end
9
+
10
+ it "should create with a value" do
11
+ b = AmberVM::Classes::Block.new(nil)
12
+ end
13
+
14
+ it "should return true to a execargs call" do
15
+ b = AmberVM::Classes::Block.new(nil)
16
+ b.execargs.should be_true
17
+ end
18
+
19
+ it "should do nothign on execution" do
20
+ code = mock('code mock')
21
+ b = AmberVM::Classes::Block.new(code)
22
+ b.execute(@env).should be_nil
23
+ end
24
+
25
+ end
@@ -0,0 +1,67 @@
1
+ require "amber/classes/boolean"
2
+ describe AmberVM::Classes::Boolean do
3
+
4
+
5
+ it "shoulds creat with a bool value" do
6
+ b = AmberVM::Classes::Boolean.new(true)
7
+ b.is_true?.should be_true
8
+ b = AmberVM::Classes::Boolean.new(false)
9
+ b.is_true?.should be_false
10
+ end
11
+
12
+ it "should create with nil" do
13
+ b = AmberVM::Classes::Boolean.new(nil)
14
+ b.is_true?.should be_false
15
+ end
16
+
17
+ it "should use is_true? if existing" do
18
+ val = mock('value mock')
19
+ val.should_receive(:respond_to?).once.with(:is_true?).and_return(true)
20
+ val.should_receive(:is_true?).once.with(no_args).and_return(false)
21
+ b = AmberVM::Classes::Boolean.new(val)
22
+ b.is_true?.should be_false
23
+ end
24
+
25
+ it "should have the data type :boolean" do
26
+ b = AmberVM::Classes::Boolean.new(true)
27
+ b.data_type.should == :boolean
28
+ end
29
+
30
+ def setup
31
+ super
32
+ @Boolean = AmberVM::Classes::Boolean
33
+ end
34
+
35
+ def test_class
36
+ assert(@Boolean)
37
+ end
38
+
39
+ def test_creation
40
+ assert(@Boolean.new(@Boolean), "Create not nil object bool")
41
+ end
42
+
43
+ def test_compare
44
+ assert_equal(@Boolean.new(true),@Boolean.new(true))
45
+ assert_equal(@Boolean.new(false),@Boolean.new(false))
46
+ assert_equal(@Boolean.new(false),@Boolean.new(nil))
47
+ assert_equal(@Boolean.new(true),@Boolean.new(self))
48
+ end
49
+
50
+ def test_creation_is_true
51
+ assert(@Boolean)
52
+ assert(b1 = @Boolean.new(true), "Create true bool.")
53
+ assert(b2 = @Boolean.new(false), "Create false bool.")
54
+ assert(b3 = @Boolean.new(nil), "Create nil bool.")
55
+ assert(b4 = @Boolean.new(b1), "Create is_true? object bool.")
56
+ assert(b5 = @Boolean.new(b2), "Create not is_true? object bool.")
57
+ assert(b6 = @Boolean.new(@Boolean), "Create not nil object bool.")
58
+
59
+ assert(b1.is_true?, "Test if true is true.")
60
+ assert(!b2.is_true?, "Test if false is false.")
61
+ assert(!b3.is_true?, "Test if nis is false.")
62
+ assert(b4.is_true?, "Test if a is_true? object is true.")
63
+ assert(!b5.is_true?, "Test if a not is_true? object is false.")
64
+ assert(b6.is_true?, "Test if not null object is true.")
65
+ end
66
+
67
+ end
@@ -0,0 +1,43 @@
1
+ require "amber/classes/error"
2
+ describe AmberVM::Classes::Error do
3
+
4
+ describe "(creation)" do
5
+
6
+ it "should create with an integer" do
7
+ e = AmberVM::Classes::Error.new(1,"Test error")
8
+ e.should be
9
+ end
10
+
11
+ it "should create with an integer" do
12
+ e = AmberVM::Classes::Error.new(1.2,"Test error")
13
+ e.should be
14
+ end
15
+
16
+ it "should create with with odd stuff" do
17
+ e = AmberVM::Classes::Error.new(nil,"Test error")
18
+ e.should be
19
+ e = AmberVM::Classes::Error.new("muhaha","Test error")
20
+ e.should be
21
+ end
22
+
23
+ end
24
+
25
+ describe "(usage)" do
26
+ it "shuld convert to a error string" do
27
+ e = AmberVM::Classes::Error.new(1,"Test error.")
28
+ e.to_s.should == "#1 Test error."
29
+ end
30
+
31
+ it "should prevent double positive error numbers" do
32
+ e = AmberVM::Classes::Error.new(-3,"Test error.")
33
+ e.to_s.should == "#-3 Test error."
34
+ end
35
+
36
+ it "should return false for is_true?." do
37
+ e = AmberVM::Classes::Error.new(1,"Test error.")
38
+ e.is_true?.should be_false
39
+ end
40
+
41
+ end
42
+
43
+ end