AmberVM 0.0.19

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 (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,90 @@
1
+ =begin
2
+ The MIT License
3
+
4
+ Copyright (c) 2008 Heinz N. 'Licenser' Gies
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Ruby Mush"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+ =end
24
+
25
+ require 'amber/acts_as_amber_type.rb'
26
+
27
+ # Inlcude the AmberVM::ACtsAsAmberVMType into active record so functions like
28
+ # +acts_as_amber_type+ and comparable
29
+ ActiveRecord::Base.class_eval do
30
+ include AmberVM::ActsAsAmberVMType
31
+ end
32
+
33
+ module ActionController #:nodoc:
34
+ class Base
35
+ # This function allows to render code that gets compiled by amber. The first
36
+ # parameter passed is the code to compile, a string most likely, the second
37
+ # is a hash that is passed to the render function, see the Rails API doc for
38
+ # details on what to put there.
39
+ #
40
+ # In addition to those rails specifc parameters amber_render accepts 4 additioal
41
+ # parameters.They are the same as used in +amber_execute+.
42
+ def amber_reder code, options = {}
43
+ render options.merge({:text => amber_execute(code, options)})
44
+ end
45
+
46
+
47
+ # The amber_execute executes a string of code with a certein behavior and
48
+ # returns not the result but what was written in the special :render variable
49
+ # of the environment.
50
+ #
51
+ # The folowing options can be passed to it to influence it's behaviro.
52
+ #
53
+ # :language:: The language that should be used to compile the code, be adwised
54
+ # that it is nessessary to load this prior to executing it.
55
+ #
56
+ # :environment:: This allows to pass a own environment, for example to publish
57
+ # variables or to maintain state between executions.
58
+ #
59
+ # :object:: If this is set the code will be executed in the context of the
60
+ # object passed, this using it's local variable storage and it's
61
+ # functions. Be aware that when using :object and :environment
62
+ # togehter, variables set in the code will NOT go in the environment
63
+ # as they are local in the object.
64
+ #
65
+ # :timeout:: This is used to limit the execution time of the code, it can be
66
+ # used to prevent runaway processes beeing executed. Very helpfull
67
+ # when the code executed isn't 100% trunstworty.
68
+ def amber_execute code, options = {}
69
+ options = {
70
+ :language => :ecma,
71
+ :environment => AmberVM::Interpreter.env
72
+ }.merge(options)
73
+ compiler = AmberVM::Languages[options[:language]].new
74
+ code = compiler.compile(code)
75
+ code = AmberVM::Interpreter::ObjectContext.new(AmberVM::Interpreter::Constant.new(options[:object]), code) if options[:object]
76
+ if options[:environment][:render].is_a? AmberVM::Classes::Error or options[:environment][:render].nil?
77
+ options[:environment][:render] = ""
78
+ end
79
+ puts options[:environment][:render].inspect
80
+ if options[:timeout]
81
+ s = AmberVM::Safety.new :timeout => options[:timeout]
82
+ s.execute(code, options[:environment])
83
+ else
84
+ code.execute(options[:environment])
85
+ end
86
+ options[:environment][:render].val
87
+ end
88
+ end
89
+ end
90
+ require 'amber/functions/rails.rb'
data/lib/amber.rb ADDED
@@ -0,0 +1,106 @@
1
+ require 'amber/interpreter'
2
+ require 'amber/classes'
3
+ require 'amber/functions'
4
+ require 'amber/languages'
5
+ require 'timeout'
6
+
7
+ # This is the rVM library. Including it loads the very basic functionalites rVM offers.
8
+ #
9
+ # It however does not yet load any functions or languages for security propose.
10
+ # This will have to be done by hand for the reason that it will force the user to concider
11
+ # which functions he wants to offer and which not.
12
+ #
13
+ # You may very well load your own functions and languages with rVM in the same way you can
14
+ # load shipped languages.
15
+ #
16
+ # It also contains some usefull functions that wil allow to make the usuage easyer.
17
+ module AmberVM
18
+ VERSION = "0.0.19" unless defined?(AmberVM::VERSION)
19
+
20
+ # This class is designed to allow execting code more safely
21
+ #
22
+ # It allows to limit executin in multiple ways to prevent all sorty of runaway code.
23
+ class Safety
24
+
25
+ attr_reader :timeout
26
+ def initialize options = {}
27
+ @timeout = options[:timeout]
28
+ end
29
+
30
+ # Sets the timeout for the executin, in seconds (you may use 0.5 and such)
31
+ #
32
+ # The execution is aboarded and a exeption thrown if the
33
+ def timeout=t
34
+ raise ArgumentError, "The timeout must be a number!" if not t.is_a? Numeric
35
+ @timeout = t
36
+ end
37
+
38
+ # Executes the code with the former set security measures.
39
+ #
40
+ # Exceptions are thrown according to the problem
41
+ def execute code, env
42
+ res = nil
43
+ if @timeout
44
+ Timeout::timeout(@timeout) do
45
+ res = code.execute(env)
46
+ end
47
+ else
48
+ res = code.execute(env)
49
+ end
50
+ res
51
+ end
52
+ end
53
+
54
+ class << self
55
+ @@strict = false
56
+
57
+ # This getter returns if rVM handles types strict.
58
+ #
59
+ # Calling a method with wrong types will raise a error if this is true.
60
+ # If false rVM will try to typecast accordingly.
61
+ def strict
62
+ @@strict
63
+ end
64
+
65
+ # Sets if variables are strictly typed or casted for function calls.
66
+ # This allows to make a language either more secure or more flexible.
67
+ def strict= v
68
+ @@strict = v
69
+ end
70
+
71
+ # Compils a code the given language.
72
+ # A new compiler is created for that and discarded afterwards.
73
+ #
74
+ # Using +compiler_for+ and calling compile for it yourself
75
+ # is more performant if you plan on doing thise more then once.
76
+ def compile language, code
77
+ compiler_for(language).compile(code)
78
+ end
79
+
80
+ # Creates you a compiler object for the given language.
81
+ # If no language is given a error is raised.
82
+ def compiler_for language
83
+ if (l = AmberVM::Languages[language])
84
+ l.new
85
+ else
86
+ raise "AmberVM Error: Unknown Language #{language}"
87
+ end
88
+ end
89
+
90
+ # A utility function to give debug output based on weather $DEBUG is set or not
91
+ def debug text
92
+ if $HTML_DEBUG
93
+ puts "<p><pre>" + (">>> #{text}".gsub("<","&lt;").gsub('>','&gt;').gsub("\n","<br/>\n"))+ "</pre></p>"
94
+ else
95
+ puts ">>> #{text}"
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+
102
+ class String
103
+ def to_html
104
+ self.gsub('<','&lt;').gsub('>', '&gt;').gsub("\n", '<br/>').gsub(' ', '&nbsp;')
105
+ end
106
+ end
@@ -0,0 +1,27 @@
1
+ require 'amber/classes'
2
+ require 'spec/amber/helpers/plugin_helper'
3
+ require File.dirname(__FILE__) + '/helpers/class_helper'
4
+
5
+ describe AmberVM::Classes do
6
+ it_should_behave_like "a plugin host"
7
+ end
8
+
9
+ describe AmberVM::Classes::Class do
10
+ describe "(plugin)" do
11
+ before do
12
+ @object = AmberVM::Classes::Class
13
+ end
14
+ it_should_behave_like "a plugin"
15
+
16
+ end
17
+
18
+ describe "(class)" do
19
+ before do
20
+ @object = AmberVM::Classes::Class.new
21
+ end
22
+
23
+ it_should_behave_like "a class"
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,61 @@
1
+ require 'amber/interpreter'
2
+
3
+ shared_examples_for "a environment" do
4
+ it "should get the locals" do
5
+ @env['1'].val.should == 'one'
6
+ end
7
+
8
+ it "should return nil for unset locals" do
9
+ @env['2'].should == nil
10
+ end
11
+
12
+ it "should allow to change locals" do
13
+ @env['2'] = 'two'
14
+ @env['2'].val.should == 'two'
15
+ end
16
+ end
17
+
18
+ describe AmberVM::Interpreter::Environment do
19
+ before :each do
20
+ @env = AmberVM::Interpreter::Environment.new({:params => [1,2], :locals => {'1' => 'one'}})
21
+ end
22
+
23
+ it_should_behave_like "a environment"
24
+
25
+ it "should autocast locals to variable storages on creation" do
26
+ env = AmberVM::Interpreter::Environment.new({:params => [1,2], :locals => {'1' => 'one'}})
27
+ env['1'].should be_kind_of(AmberVM::Interpreter::VariableStorage)
28
+ end
29
+
30
+ it "should get the params" do
31
+ @env.param(0).should be(1)
32
+ @env.param(1).should be(2)
33
+ end
34
+
35
+ it "should have a path" do
36
+ @env.path.should be_kind_of(Array)
37
+ end
38
+
39
+
40
+ describe "(parented)" do
41
+ before do
42
+ @old_env = @env
43
+ @env = AmberVM::Interpreter::Environment.new({}, @old_env)
44
+ end
45
+
46
+ it_should_behave_like "a environment"
47
+
48
+ =begin
49
+ it "should have the same path as it's parrent" do
50
+ @env.path.should be(@old_env.path)
51
+ end
52
+ =end
53
+ it "should apply changes to already set variables to the parent" do
54
+ @env['1'].val.should == 'one'
55
+ @env['1'] = 'ONE!'
56
+ @env['1'].val.should == 'ONE!'
57
+ @old_env['1'].val.should == 'ONE!'
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,25 @@
1
+ require 'amber/functions'
2
+ require 'spec/amber/helpers/plugin_helper'
3
+ require File.dirname(__FILE__) + '/helpers/function_helper'
4
+
5
+ describe AmberVM::Functions do
6
+ it_should_behave_like "a plugin host"
7
+ end
8
+
9
+ describe AmberVM::Functions::Function do
10
+ describe "(plugin)" do
11
+ before do
12
+ @object = AmberVM::Functions::Function
13
+ end
14
+ it_should_behave_like "a plugin"
15
+
16
+ end
17
+
18
+ describe "(function)" do
19
+ before do
20
+ @object = AmberVM::Functions::Function
21
+ end
22
+ it_should_behave_like "a function"
23
+ end
24
+
25
+ end
@@ -0,0 +1,41 @@
1
+ require 'amber/functions'
2
+ require 'amber/functions/association/assoc_get'
3
+
4
+ describe AmberVM::Functions::AssocGet do
5
+ before(:each) do
6
+ @env = mock('env mock')
7
+ @function = AmberVM::Functions[:assoc_get]
8
+ end
9
+
10
+ it "should accept a usual function call with 2 parameters and get the value" do
11
+ params = [
12
+ p1 = mock('param 1 mock'),
13
+ p2 = mock('param 2 mock')
14
+ ]
15
+ res = p1.should_receive(:[]).with(p2).and_return('result')
16
+ @function.execute(params, @env).should == 'result'
17
+ end
18
+
19
+ it "should accept a object call wiht 1 parameter and a object in env and get the value" do
20
+ params = [
21
+ p1 = mock('param 1 mock')
22
+ ]
23
+ obj = mock('association mock')
24
+ @env.should_receive(:read_var_val).once.with(:self).and_return(obj)
25
+ obj.should_receive(:is_a?).once.with(AmberVM::Classes::Association).and_return(true)
26
+ res = obj.should_receive(:[]).with(p1).and_return('result')
27
+ @function.execute(params, @env).should == 'result'
28
+ end
29
+
30
+ it "should return an error with more then 2 arguments" do
31
+ params = [1,2,3]
32
+ @function.execute(params, @env).should be_an_instance_of(AmberVM::Classes::Error)
33
+ end
34
+
35
+
36
+ it "should return an error with no arguments" do
37
+ params = []
38
+ @function.execute(params, @env).should be_an_instance_of(AmberVM::Classes::Error)
39
+ end
40
+
41
+ end
@@ -0,0 +1,43 @@
1
+ require 'amber/functions'
2
+ require 'amber/functions/association/assoc_set'
3
+
4
+ describe AmberVM::Functions::AssocSet do
5
+ before(:each) do
6
+ @env = mock('env mock')
7
+ @function = AmberVM::Functions[:assoc_set]
8
+ end
9
+
10
+ it "should accept a usual function call with 3 parameters and return the value it sets" do
11
+ params = [
12
+ p1 = mock('param 1 mock'),
13
+ p2 = mock('param 2 mock'),
14
+ p3 = mock('param 3 mock')
15
+ ]
16
+ p1.should_receive(:[]=).with(p2, p3).and_return(p3)
17
+ @function.execute(params, @env).should == p3
18
+ end
19
+
20
+ it "should accept a object call wiht 2 parameter and a object in env and return the value it sets" do
21
+ params = [
22
+ p1 = mock('param 1 mock'),
23
+ p2 = mock('param 2 mock')
24
+ ]
25
+ obj = mock('association mock')
26
+ @env.should_receive(:read_var_val).once.with(:self).and_return(obj)
27
+ obj.should_receive(:is_a?).once.with(AmberVM::Classes::Association).and_return(true)
28
+ res = obj.should_receive(:[]=).with(p1,p2).and_return(p2)
29
+ @function.execute(params, @env).should == p2
30
+ end
31
+
32
+ it "should return an error with more then 4 arguments" do
33
+ params = [1, 2, 3, 4]
34
+ @function.execute(params, @env).should be_an_instance_of(AmberVM::Classes::Error)
35
+ end
36
+
37
+
38
+ it "should return an error with less then 2 arguments" do
39
+ params = [1]
40
+ @function.execute(params, @env).should be_an_instance_of(AmberVM::Classes::Error)
41
+ end
42
+
43
+ end
@@ -0,0 +1,12 @@
1
+ require 'amber/functions'
2
+ require 'amber/functions/association/assoc_get'
3
+ require 'amber/functions/array/at'
4
+ require 'amber/functions/collection/get'
5
+
6
+ describe AmberVM::Functions::Get do
7
+ before(:each) do
8
+ @env = mock('env mock')
9
+ @function = AmberVM::Functions[:get]
10
+ end
11
+
12
+ end
@@ -0,0 +1,10 @@
1
+ require 'amber/functions'
2
+ require 'amber/functions/collection/set'
3
+
4
+ describe AmberVM::Functions::Set do
5
+ before(:each) do
6
+ @env = mock('env mock')
7
+ @function = AmberVM::Functions[:set]
8
+ end
9
+
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'amber/functions'
2
+ require 'amber/functions/collection/size'
3
+
4
+ describe AmberVM::Functions::Set do
5
+ before(:each) do
6
+ @env = mock('env mock')
7
+ @function = AmberVM::Functions[:set]
8
+ end
9
+
10
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/list/split'
4
+
5
+ describe AmberVM::Functions::Split do
6
+
7
+ before do
8
+ @object = AmberVM::Functions::Split
9
+ end
10
+
11
+ describe "(plugin)" do
12
+ it_should_behave_like "a plugin"
13
+ end
14
+
15
+ describe "(function)" do
16
+ it_should_behave_like "a function"
17
+
18
+ it "should have a signature of string, string" do
19
+ @object.signature.should == [AmberVM::Classes::String, AmberVM::Classes::String]
20
+ end
21
+
22
+ it "should have a type of :list" do
23
+ @object.data_type.should == :list
24
+ end
25
+ end
26
+ describe "(functionality)" do
27
+ before do
28
+ @env = mock('env mock')
29
+ @old_db = $DB
30
+ $DB = mock('db mock')
31
+ end
32
+
33
+ after do
34
+ $DB = @old_db
35
+ end
36
+
37
+ it "should have tests implemented" do
38
+ pending "This needs to be implemented, locate functions neeeeeeeds specs."
39
+ end
40
+
41
+ it "should not work with more then 3 and less the 2 params" do
42
+ @object.execute([1], nil).should be_instance_of(AmberVM::Classes::Error)
43
+ @object.execute([1,2,3,1], nil).should be_instance_of(AmberVM::Classes::Error)
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/string/ansi'
4
+
5
+
6
+ describe AmberVM::Functions::Ansi do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Ansi
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 == :string
25
+ end
26
+ end
27
+
28
+ describe "(functionality)" do
29
+
30
+ it "should not work with less then 2 params" 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 call the ansi function for the seclond with the first argument as parameter" do
38
+ arg1 = mock('arg mock')
39
+ arg1.should_receive(:ansi).once.with(1).and_return 'one'
40
+ @object.execute([1,arg1], nil).should == 'one'
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/string/capstr'
4
+
5
+
6
+ describe AmberVM::Functions::Capstr do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Capstr
10
+ end
11
+
12
+
13
+ describe "(plugin)" do
14
+ it_should_behave_like "a plugin"
15
+
16
+ end
17
+
18
+ describe "(function)" do
19
+ it_should_behave_like "a function"
20
+
21
+ it "should have a signature of string" do
22
+ @object.signature.should == [AmberVM::Classes::String]
23
+ end
24
+ it "should have a type of boolean" do
25
+ @object.data_type.should == :string
26
+ end
27
+ end
28
+
29
+ describe "(functionality)" do
30
+
31
+ it "should not work with more or less then 1 param" do
32
+ @object.execute([], nil).should be_instance_of(AmberVM::Classes::Error)
33
+ @object.execute([1,2], nil).should be_instance_of(AmberVM::Classes::Error)
34
+ @object.execute([1,2,3], nil).should be_instance_of(AmberVM::Classes::Error)
35
+ end
36
+
37
+ it "should capitalize the first letter" do
38
+ @object.execute(["abc"], nil).should == 'Abc'
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/string/center'
4
+
5
+
6
+ describe AmberVM::Functions::Center do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Center
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 center function with one param if it is given" do
37
+ arg1 = mock('arg mock')
38
+ arg1.should_receive(:center).once.with(1).and_return 'center'
39
+ @object.execute([arg1,1], nil).should == 'center'
40
+ end
41
+
42
+ it "should call the center function with one two param if they are given" do
43
+ arg1 = mock('arg mock')
44
+ arg1.should_receive(:center).once.with(1,2).and_return 'center2'
45
+ @object.execute([arg1,1,2], nil).should == 'center2'
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec/amber/helpers/plugin_helper'
2
+ require 'spec/amber/helpers/function_helper'
3
+ require 'amber/functions/string/ljust'
4
+
5
+
6
+ describe AmberVM::Functions::Ljust do
7
+
8
+ before do
9
+ @object = AmberVM::Functions::Ljust
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 ljust function with one param if it is given" do
37
+ arg1 = mock('arg mock')
38
+ arg1.should_receive(:ljust).once.with(1).and_return 'ljust'
39
+ @object.execute([arg1,1], nil).should == 'ljust'
40
+ end
41
+
42
+ it "should call the ljust function with one two param if they are given" do
43
+ arg1 = mock('arg mock')
44
+ arg1.should_receive(:ljust).once.with(1,2).and_return 'ljust'
45
+ @object.execute([arg1,1,2], nil).should == 'ljust'
46
+ end
47
+ end
48
+
49
+ end