code-ruby 0.5.6 → 0.6.1

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -3
  3. data/Gemfile.lock +11 -21
  4. data/README.md +2 -102
  5. data/bin/code +34 -16
  6. data/code-ruby.gemspec +5 -3
  7. data/lib/code/error.rb +16 -5
  8. data/lib/code/node/base_10.rb +4 -2
  9. data/lib/code/node/base_16.rb +3 -1
  10. data/lib/code/node/base_2.rb +3 -1
  11. data/lib/code/node/base_8.rb +3 -1
  12. data/lib/code/node/boolean.rb +4 -2
  13. data/lib/code/node/call.rb +35 -12
  14. data/lib/code/node/call_argument.rb +16 -5
  15. data/lib/code/node/code.rb +5 -4
  16. data/lib/code/node/decimal.rb +2 -0
  17. data/lib/code/node/{dictionnary.rb → dictionary.rb} +14 -5
  18. data/lib/code/node/function.rb +7 -4
  19. data/lib/code/node/function_parameter.rb +3 -1
  20. data/lib/code/node/if.rb +5 -3
  21. data/lib/code/node/left_operation.rb +63 -0
  22. data/lib/code/node/list.rb +2 -0
  23. data/lib/code/node/negation.rb +2 -0
  24. data/lib/code/node/not.rb +2 -0
  25. data/lib/code/node/nothing.rb +3 -1
  26. data/lib/code/node/number.rb +2 -0
  27. data/lib/code/node/right_operation.rb +70 -0
  28. data/lib/code/node/splat.rb +2 -0
  29. data/lib/code/node/square_bracket.rb +37 -0
  30. data/lib/code/node/statement.rb +13 -5
  31. data/lib/code/node/string.rb +3 -1
  32. data/lib/code/node/ternary.rb +5 -3
  33. data/lib/code/node/unary_minus.rb +2 -0
  34. data/lib/code/node/while.rb +6 -4
  35. data/lib/code/node.rb +11 -5
  36. data/lib/code/object/argument.rb +13 -7
  37. data/lib/code/object/boolean.rb +43 -5
  38. data/lib/code/object/class.rb +17 -0
  39. data/lib/code/object/context.rb +36 -0
  40. data/lib/code/object/decimal.rb +252 -100
  41. data/lib/code/object/dictionary.rb +641 -0
  42. data/lib/code/object/function.rb +54 -27
  43. data/lib/code/object/global.rb +65 -19
  44. data/lib/code/object/identifier_list.rb +47 -0
  45. data/lib/code/object/integer.rb +320 -137
  46. data/lib/code/object/list.rb +140 -138
  47. data/lib/code/object/nothing.rb +10 -4
  48. data/lib/code/object/number.rb +6 -1
  49. data/lib/code/object/range.rb +85 -88
  50. data/lib/code/object/ruby_function.rb +11 -6
  51. data/lib/code/object/string.rb +51 -48
  52. data/lib/code/object.rb +117 -139
  53. data/lib/code/parser/addition.rb +4 -2
  54. data/lib/code/parser/and_operator.rb +4 -2
  55. data/lib/code/parser/bitwise_and.rb +4 -2
  56. data/lib/code/parser/bitwise_or.rb +4 -2
  57. data/lib/code/parser/boolean.rb +3 -1
  58. data/lib/code/parser/call.rb +17 -11
  59. data/lib/code/parser/chained_call.rb +10 -22
  60. data/lib/code/parser/class.rb +9 -6
  61. data/lib/code/parser/code.rb +6 -4
  62. data/lib/code/parser/{dictionnary.rb → dictionary.rb} +16 -13
  63. data/lib/code/parser/equal.rb +9 -36
  64. data/lib/code/parser/equality.rb +4 -2
  65. data/lib/code/parser/function.rb +24 -9
  66. data/lib/code/parser/greater.rb +6 -3
  67. data/lib/code/parser/group.rb +4 -2
  68. data/lib/code/parser/if.rb +6 -4
  69. data/lib/code/parser/if_modifier.rb +5 -25
  70. data/lib/code/parser/left_operation.rb +40 -0
  71. data/lib/code/parser/list.rb +6 -5
  72. data/lib/code/parser/multiplication.rb +4 -2
  73. data/lib/code/parser/name.rb +19 -4
  74. data/lib/code/parser/negation.rb +4 -2
  75. data/lib/code/parser/not_keyword.rb +5 -3
  76. data/lib/code/parser/nothing.rb +3 -10
  77. data/lib/code/parser/number.rb +4 -2
  78. data/lib/code/parser/or_keyword.rb +4 -2
  79. data/lib/code/parser/or_operator.rb +4 -2
  80. data/lib/code/parser/power.rb +4 -28
  81. data/lib/code/parser/range.rb +4 -2
  82. data/lib/code/parser/rescue.rb +6 -26
  83. data/lib/code/parser/right_operation.rb +40 -0
  84. data/lib/code/parser/shift.rb +4 -2
  85. data/lib/code/parser/splat.rb +5 -3
  86. data/lib/code/parser/square_bracket.rb +48 -0
  87. data/lib/code/parser/statement.rb +3 -1
  88. data/lib/code/parser/string.rb +12 -10
  89. data/lib/code/parser/ternary.rb +10 -11
  90. data/lib/code/parser/unary_minus.rb +5 -3
  91. data/lib/code/parser/while.rb +5 -3
  92. data/lib/code/parser/whitespace.rb +2 -0
  93. data/lib/code/parser.rb +10 -3
  94. data/lib/code/ruby.rb +4 -2
  95. data/lib/code/type/hash.rb +38 -0
  96. data/lib/code/type/maybe.rb +29 -0
  97. data/lib/code/type/or.rb +38 -0
  98. data/lib/code/type/repeat.rb +38 -0
  99. data/lib/code/type/sig.rb +130 -0
  100. data/lib/code/type.rb +25 -0
  101. data/lib/code/version.rb +3 -0
  102. data/lib/code-ruby.rb +1 -2
  103. data/lib/code.rb +15 -16
  104. data/spec/code/node/call_spec.rb +39 -0
  105. data/spec/code/object/boolean_spec.rb +18 -0
  106. data/spec/code/object/decimal_spec.rb +51 -0
  107. data/spec/code/object/dictionary_spec.rb +98 -0
  108. data/spec/code/object/function_spec.rb +42 -0
  109. data/spec/code/object/integer_spec.rb +43 -0
  110. data/spec/code/object/nothing_spec.rb +14 -0
  111. data/spec/code/object/range_spec.rb +23 -0
  112. data/spec/code/parser/boolean_spec.rb +5 -10
  113. data/spec/code/parser/chained_call.rb +4 -5
  114. data/spec/code/parser/{dictionnary_spec.rb → dictionary_spec.rb} +5 -6
  115. data/spec/code/parser/function_spec.rb +4 -5
  116. data/spec/code/parser/group_spec.rb +5 -12
  117. data/spec/code/parser/if_modifier_spec.rb +18 -0
  118. data/spec/code/parser/list_spec.rb +4 -5
  119. data/spec/code/parser/number_spec.rb +4 -5
  120. data/spec/code/parser/string_spec.rb +4 -5
  121. data/spec/code/parser_spec.rb +22 -16
  122. data/spec/code/type_spec.rb +21 -0
  123. data/spec/code_spec.rb +171 -0
  124. data/spec/spec_helper.rb +1 -6
  125. metadata +63 -136
  126. data/.cherry.js +0 -21
  127. data/.editorconfig +0 -9
  128. data/.github/workflows/rspec.yml +0 -14
  129. data/.gitignore +0 -2
  130. data/.prettierrc +0 -3
  131. data/.tool-versions +0 -1
  132. data/CHANGELOG.md +0 -55
  133. data/LICENSE +0 -7
  134. data/TODO +0 -17
  135. data/bin/format +0 -3
  136. data/bin/publish +0 -19
  137. data/bin/template +0 -85
  138. data/bin/test +0 -17
  139. data/docs/class.code +0 -9
  140. data/docs/euler/1.template +0 -10
  141. data/docs/euler/2.template +0 -16
  142. data/docs/euler/3.template +0 -16
  143. data/docs/euler/4.template +0 -10
  144. data/docs/euler/5.template +0 -13
  145. data/docs/fibonnaci.template +0 -14
  146. data/docs/meetup.code +0 -12
  147. data/docs/precedence.template +0 -36
  148. data/docs/rain.code +0 -22
  149. data/docs/slack.code +0 -17
  150. data/docs/stripe.code +0 -7
  151. data/docs/twitter.code +0 -9
  152. data/language-ruby.gemspec +0 -17
  153. data/lib/code/node/chained_call.rb +0 -23
  154. data/lib/code/node/equal.rb +0 -34
  155. data/lib/code/node/if_modifier.rb +0 -47
  156. data/lib/code/node/operation.rb +0 -38
  157. data/lib/code/node/power.rb +0 -20
  158. data/lib/code/node/rescue.rb +0 -17
  159. data/lib/code/object/dictionnary.rb +0 -96
  160. data/lib/code/parser/equality_lower.rb +0 -9
  161. data/lib/code/parser/operation.rb +0 -35
  162. data/lib/language/atom.rb +0 -342
  163. data/lib/language/output.rb +0 -130
  164. data/lib/language/parser/absent/present.rb +0 -8
  165. data/lib/language/parser/absent.rb +0 -6
  166. data/lib/language/parser/end_of_input.rb +0 -6
  167. data/lib/language/parser/interuption.rb +0 -38
  168. data/lib/language/parser/not_end_of_input.rb +0 -6
  169. data/lib/language/parser/str/not_found.rb +0 -16
  170. data/lib/language/parser/str.rb +0 -6
  171. data/lib/language/parser.rb +0 -53
  172. data/lib/language-ruby.rb +0 -10
  173. data/lib/language.rb +0 -80
  174. data/lib/template/node/code_part.rb +0 -13
  175. data/lib/template/node/part.rb +0 -19
  176. data/lib/template/node/template.rb +0 -15
  177. data/lib/template/node/text_part.rb +0 -13
  178. data/lib/template/node.rb +0 -4
  179. data/lib/template/parser/template.rb +0 -39
  180. data/lib/template/parser.rb +0 -19
  181. data/lib/template/version.rb +0 -3
  182. data/lib/template-ruby.rb +0 -10
  183. data/lib/template.rb +0 -50
  184. data/spec/code/addition_spec.rb +0 -13
  185. data/spec/code/and_operator_spec.rb +0 -13
  186. data/spec/code/bitwise_and_spec.rb +0 -13
  187. data/spec/code/bitwise_or_spec.rb +0 -13
  188. data/spec/code/boolean_spec.rb +0 -13
  189. data/spec/code/call_spec.rb +0 -21
  190. data/spec/code/chained_call_spec.rb +0 -16
  191. data/spec/code/code_spec.rb +0 -29
  192. data/spec/code/dictionnary_spec.rb +0 -17
  193. data/spec/code/equal_spec.rb +0 -26
  194. data/spec/code/equality_spec.rb +0 -13
  195. data/spec/code/function_spec.rb +0 -18
  196. data/spec/code/greater_spec.rb +0 -18
  197. data/spec/code/group_spec.rb +0 -12
  198. data/spec/code/if_modifier_spec.rb +0 -20
  199. data/spec/code/if_spec.rb +0 -25
  200. data/spec/code/list_spec.rb +0 -19
  201. data/spec/code/multiplication_spec.rb +0 -18
  202. data/spec/code/negation_spec.rb +0 -20
  203. data/spec/code/not_keyword_spec.rb +0 -13
  204. data/spec/code/nothing_spec.rb +0 -17
  205. data/spec/code/number_spec.rb +0 -22
  206. data/spec/code/or_keyword_spec.rb +0 -17
  207. data/spec/code/or_operator_spec.rb +0 -16
  208. data/spec/code/parser/call_spec.rb +0 -26
  209. data/spec/code/power_spec.rb +0 -13
  210. data/spec/code/range_spec.rb +0 -16
  211. data/spec/code/rescue_spec.rb +0 -13
  212. data/spec/code/shift_spec.rb +0 -13
  213. data/spec/code/splat_spec.rb +0 -13
  214. data/spec/code/string_spec.rb +0 -27
  215. data/spec/code/ternary_spec.rb +0 -18
  216. data/spec/code/unary_minus_spec.rb +0 -13
  217. data/spec/code/while_spec.rb +0 -18
  218. data/template-ruby.gemspec +0 -19
data/lib/language.rb DELETED
@@ -1,80 +0,0 @@
1
- class Language
2
- def self.parse(input)
3
- new.parse(input)
4
- end
5
-
6
- def self.absent
7
- Atom::Absent.new(parent: new)
8
- end
9
-
10
- def self.ignore
11
- Atom::Ignore.new(parent: new)
12
- end
13
-
14
- def self.maybe
15
- Atom::Maybe.new(parent: new)
16
- end
17
-
18
- def self.repeat(min = 0, max = nil)
19
- Atom::Repeat.new(parent: new, min: min, max: max)
20
- end
21
-
22
- def self.aka(name)
23
- Atom::Aka.new(parent: new, name: name)
24
- end
25
-
26
- def self.|(other)
27
- Atom::Or.new(left: new, right: other)
28
- end
29
-
30
- def self.>>(other)
31
- Atom::And.new(left: new, right: other)
32
- end
33
-
34
- def self.<<(other)
35
- Atom::And.new(left: new, right: other)
36
- end
37
-
38
- def self.then(&block)
39
- Atom::Then.new(parent: new, block: block)
40
- end
41
-
42
- def parse(input_or_parser)
43
- if input_or_parser.is_a?(Parser)
44
- parser = input_or_parser
45
- clone =
46
- Parser.new(
47
- root: root,
48
- input: parser.input,
49
- cursor: parser.cursor,
50
- buffer: parser.buffer,
51
- output: parser.output
52
- )
53
-
54
- clone.parse(check_end_of_input: false)
55
-
56
- parser.cursor = clone.cursor
57
- parser.buffer = clone.buffer
58
- parser.output = clone.output
59
- else
60
- input = input_or_parser
61
- Parser.new(root: root, input: input).parse
62
- end
63
- end
64
-
65
- def str(string)
66
- Atom::Str.new(string: string)
67
- end
68
-
69
- def any
70
- Atom::Any.new
71
- end
72
-
73
- def to_s
74
- "<#{self.class.name}>"
75
- end
76
-
77
- def inspect
78
- to_s
79
- end
80
- end
@@ -1,13 +0,0 @@
1
- class Template
2
- class Node
3
- class CodePart < Node
4
- def initialize(code)
5
- @code = ::Code::Node::Code.new(code)
6
- end
7
-
8
- def evaluate(**args)
9
- @code.evaluate(**args)
10
- end
11
- end
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- class Template
2
- class Node
3
- class Part < Node
4
- def initialize(part)
5
- if part.key?(:text)
6
- @part = ::Template::Node::TextPart.new(part[:text])
7
- elsif part.key?(:code)
8
- @part = ::Template::Node::CodePart.new(part[:code])
9
- else
10
- raise NotImplementedError.new(part.inspect)
11
- end
12
- end
13
-
14
- def evaluate(**args)
15
- @part.evaluate(**args)
16
- end
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- class Template
2
- class Node
3
- class Template < Node
4
- def initialize(parts)
5
- @parts = parts.map { |part| ::Template::Node::Part.new(part) }
6
- end
7
-
8
- def evaluate(**args)
9
- io = args.fetch(:io)
10
-
11
- @parts.each { |part| io.print(part.evaluate(**args)) }
12
- end
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- class Template
2
- class Node
3
- class TextPart < Node
4
- def initialize(text)
5
- @text = text
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::String.new(@text.to_s)
10
- end
11
- end
12
- end
13
- end
data/lib/template/node.rb DELETED
@@ -1,4 +0,0 @@
1
- class Template
2
- class Node < ::Code::Node
3
- end
4
- end
@@ -1,39 +0,0 @@
1
- class Template
2
- class Parser
3
- class Template < Language
4
- def code
5
- ::Code::Parser::Code
6
- end
7
-
8
- def opening_curly_bracket
9
- str("{")
10
- end
11
-
12
- def closing_curly_bracket
13
- str("}")
14
- end
15
-
16
- def backslash
17
- str("\\")
18
- end
19
-
20
- def code_part
21
- opening_curly_bracket << code << (closing_curly_bracket | any.absent)
22
- end
23
-
24
- def text_character
25
- (backslash.ignore << opening_curly_bracket) |
26
- (opening_curly_bracket.absent << any)
27
- end
28
-
29
- def text_part
30
- text_character.repeat(1)
31
- end
32
-
33
- def root
34
- (code_part.aka(:code) | text_part.aka(:text)).repeat |
35
- str("").aka(:text).repeat(1, 1)
36
- end
37
- end
38
- end
39
- end
@@ -1,19 +0,0 @@
1
- class Template
2
- class Parser
3
- def initialize(input)
4
- @input = input
5
- end
6
-
7
- def self.parse(input)
8
- new(input).parse
9
- end
10
-
11
- def parse
12
- ::Template::Parser::Template.parse(input)
13
- end
14
-
15
- private
16
-
17
- attr_reader :input
18
- end
19
- end
@@ -1,3 +0,0 @@
1
- require_relative "../template"
2
-
3
- Template::Version = Gem::Version.new("0.5.6")
data/lib/template-ruby.rb DELETED
@@ -1,10 +0,0 @@
1
- require "bigdecimal"
2
- require "stringio"
3
- require "timeout"
4
- require "zeitwerk"
5
-
6
- loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
7
- loader.ignore("#{__dir__}/template-ruby.rb")
8
- loader.ignore("#{__dir__}/code-ruby.rb")
9
- loader.ignore("#{__dir__}/language-ruby.rb")
10
- loader.setup
data/lib/template.rb DELETED
@@ -1,50 +0,0 @@
1
- class Template
2
- DEFAULT_TIMEOUT = 10
3
-
4
- def initialize(input, io: StringIO.new, timeout: DEFAULT_TIMEOUT, ruby: {})
5
- @input = input
6
- @parsed =
7
- Timeout.timeout(timeout) { ::Template::Parser.parse(@input).to_raw }
8
- @io = io
9
- @timeout = timeout || DEFAULT_TIMEOUT
10
- @ruby = ::Code::Ruby.to_code(ruby || {})
11
- end
12
-
13
- def self.render(
14
- input,
15
- context = "",
16
- io: StringIO.new,
17
- timeout: DEFAULT_TIMEOUT,
18
- ruby: {}
19
- )
20
- new(input, io: io, timeout: timeout, ruby: ruby).render(context)
21
- end
22
-
23
- def render(context = "")
24
- Timeout.timeout(timeout) do
25
- if context != ""
26
- context = ::Code.evaluate(context, timeout: timeout, io: io, ruby: ruby)
27
- else
28
- context = ::Code::Object::Dictionnary.new
29
- end
30
-
31
- if !context.is_a?(::Code::Object::Dictionnary)
32
- raise ::Code::Template::IncompatibleContext.new(
33
- "context must be a dictionnary"
34
- )
35
- end
36
-
37
- context = context.merge(ruby)
38
-
39
- ::Template::Node::Template.new(parsed).evaluate(context: context, io: io)
40
-
41
- io.is_a?(StringIO) ? io.string : nil
42
- end
43
- end
44
-
45
- private
46
-
47
- attr_reader :parsed, :io, :timeout, :ruby
48
- end
49
-
50
- require_relative "template/version"
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 + 2", "3"], ["2 - 1", "1"], ["a = 2 - 1 a", "1"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "and operator" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["true && false", "false"], ["true && true", "true"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "bitwise and" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 & 1", "1"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "bitwise or" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 | 2", "3"], ["1 ^ 2", "3"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "boolean" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [%w[true true], %w[false false]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,21 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "call" do
4
- let(:timeout) { 0 }
5
-
6
- context "inspecting the io" do
7
- let(:io) { StringIO.new }
8
-
9
- subject do
10
- Code.evaluate(input, io: io, timeout: timeout)
11
- io.string
12
- end
13
-
14
- [["puts(true)", "true\n"], %w[print(false) false]].each do |input, output|
15
- context input do
16
- let(:input) { input }
17
- it { expect(subject).to eq(output) }
18
- end
19
- end
20
- end
21
- end
@@ -1,16 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "chained call" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["[1, 2, 3].select { |n| n.even? }", "[2]"],
9
- ["[1, 2, 3].select { |n| n.even? }.select { |n| n.odd? }", "[]"]
10
- ].each do |input, output|
11
- context input do
12
- let(:input) { input }
13
- it { expect(subject).to eq(output) }
14
- end
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- it "converts nil" do
5
- expect(Code::Ruby.from_code(Code.evaluate("a", ruby: { a: nil }))).to eq(nil)
6
- end
7
-
8
- it "works with downcase" do
9
- expect(Code.evaluate("downcase", "{ downcase: 1 }")).to eq(1)
10
- end
11
-
12
- it "works with nested objects" do
13
- expect(
14
- Code.evaluate(
15
- "items.first.title",
16
- ruby: { items: [{ title: "Hello" }] }
17
- )
18
- ).to eq("Hello")
19
- end
20
-
21
- it "works with arrays" do
22
- expect(
23
- Code.evaluate(
24
- "items.map { |item| item.title }",
25
- ruby: { items: [{ title: "Hello" }] }
26
- )
27
- ).to eq(["Hello"])
28
- end
29
- end
@@ -1,17 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "dictionnary" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- %w[{} {}],
9
- ["{ a: 1, b: 2, c: 3 }", '{"a" => 1, "b" => 2, "c" => 3}'],
10
- ['{ "first_name": "Dorian" }', '{"first_name" => "Dorian"}']
11
- ].each do |input, output|
12
- context input do
13
- let(:input) { input }
14
- it { expect(subject).to eq(output) }
15
- end
16
- end
17
- end
@@ -1,26 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["a = 1 a", "1"],
9
- ["a = 1 a += 1 a", "2"],
10
- ["a = 1 a -= 1 a", "0"],
11
- ["a = 1 a *= 2 a", "2"],
12
- ["a = 1 a /= 2 a", "0.5"],
13
- ["a = 10 a %= 2 a", "0"],
14
- ["a = 1 a >>= 1 a", "0"],
15
- ["a = 1 a <<= 1 a", "2"],
16
- ["a = 1 a |= 2 a", "3"],
17
- ["a = 1 a ^= 2 a", "3"],
18
- ["a = false a ||= true a", "true"],
19
- ["a = false a &&= true a", "false"]
20
- ].each do |input, output|
21
- context input do
22
- let(:input) { input }
23
- it { expect(subject).to eq(output) }
24
- end
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "while" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["1 == 1", "true"], ["1 == 1 and 2 == 2", "true"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["even? = (i) => { i.even? } even?(2)", "true"],
9
- ["even? = (i:) => { i.even? } even?(i: 2)", "true"],
10
- ["add = (a, b) => { a + b } add(1, 2)", "3"],
11
- ["minus = (a:, b:) => { a - b } minus(b: 1, a: 2)", "1"]
12
- ].each do |input, output|
13
- context input do
14
- let(:input) { input }
15
- it { expect(subject).to eq(output) }
16
- end
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "greater" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["1 > 2", "false"],
9
- ["1 < 2", "true"],
10
- ["1 <= 1", "true"],
11
- ["1 >= 1", "true"]
12
- ].each do |input, output|
13
- context input do
14
- let(:input) { input }
15
- it { expect(subject).to eq(output) }
16
- end
17
- end
18
- end
@@ -1,12 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "group" do
4
- subject { Code.evaluate(input).to_s }
5
-
6
- [["(true false)", "false"]].each do |input, output|
7
- context input do
8
- let(:input) { input }
9
- it { expect(subject).to eq(output) }
10
- end
11
- end
12
- end
@@ -1,20 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "if modifier" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["1 if true", "1"],
9
- ["1 if false", ""],
10
- ["1 unless true", ""],
11
- ["1 unless false", "1"],
12
- ["a = 0 a += 1 while a < 10 a", "10"],
13
- ["a = 0 a += 1 until a > 10 a", "11"]
14
- ].each do |input, output|
15
- context input do
16
- let(:input) { input }
17
- it { expect(subject).to eq(output) }
18
- end
19
- end
20
- end
data/spec/code/if_spec.rb DELETED
@@ -1,25 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "if" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["if true 1", "1"],
9
- ["unless false 1", "1"],
10
- ["if false 1", ""],
11
- ["unless true 1", ""],
12
- ["if false 1 else 2", "2"],
13
- ["if false 1 elsif true 2", "2"],
14
- ["if false 1 elsif false 2", ""],
15
- ["if false 1 else if true 2", "2"],
16
- ["if false 1 else if false 2", ""],
17
- ["if false 1 else unless false 2", "2"],
18
- ["if false 1 else unless true 2", ""]
19
- ].each do |input, output|
20
- context input do
21
- let(:input) { input }
22
- it { expect(subject).to eq(output) }
23
- end
24
- end
25
- end
@@ -1,19 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "list" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["[]", "[]"],
9
- ["[1, 2, 3]", "[1, 2, 3]"],
10
- ["[1, 2, 3].include?(2)", "true"],
11
- ["[1, 2, 3].include?(4)", "false"],
12
- ["[[true]]", "[[true]]"]
13
- ].each do |input, output|
14
- context input do
15
- let(:input) { input }
16
- it { expect(subject).to eq(output) }
17
- end
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "multiplication" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- ["2 * 3", "6"],
9
- ["2 * 3 + 2", "8"],
10
- ["2 / 4", "0.5"],
11
- ["4 % 3", "1"]
12
- ].each do |input, output|
13
- context input do
14
- let(:input) { input }
15
- it { expect(subject).to eq(output) }
16
- end
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "function" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [
8
- %w[!false true],
9
- %w[!!true true],
10
- %w[!!1 true],
11
- %w[+1 1],
12
- %w[+1.0 1.0],
13
- %w[+true true]
14
- ].each do |input, output|
15
- context input do
16
- let(:input) { input }
17
- it { expect(subject).to eq(output) }
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "not keyword" do
4
- let(:timeout) { 0 }
5
- subject { Code.evaluate(input, timeout: timeout).to_s }
6
-
7
- [["not true", "false"], ["not not false", "false"]].each do |input, output|
8
- context input do
9
- let(:input) { input }
10
- it { expect(subject).to eq(output) }
11
- end
12
- end
13
- end
@@ -1,17 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "nothing" do
4
- subject { Code.evaluate(input).to_s }
5
-
6
- [
7
- ["nothing", ""],
8
- ["null", ""],
9
- ["nil", ""],
10
- ["nothing null", ""]
11
- ].each do |input, output|
12
- context input do
13
- let(:input) { input }
14
- it { expect(subject).to eq(output) }
15
- end
16
- end
17
- end