q-language 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/.gemtest +0 -0
  2. data/Rakefile +10 -0
  3. data/lib/q-language.rb +9 -0
  4. data/lib/q-language/device.rb +166 -0
  5. data/lib/q-language/environment.rb +358 -0
  6. data/lib/q-language/methods/array.rb +523 -0
  7. data/lib/q-language/methods/block.rb +26 -0
  8. data/lib/q-language/methods/class.rb +24 -0
  9. data/lib/q-language/methods/dynamic.rb +82 -0
  10. data/lib/q-language/methods/false.rb +47 -0
  11. data/lib/q-language/methods/hash.rb +351 -0
  12. data/lib/q-language/methods/implicit.rb +345 -0
  13. data/lib/q-language/methods/module.rb +39 -0
  14. data/lib/q-language/methods/nil.rb +47 -0
  15. data/lib/q-language/methods/number.rb +118 -0
  16. data/lib/q-language/methods/object.rb +155 -0
  17. data/lib/q-language/methods/string.rb +157 -0
  18. data/lib/q-language/methods/time.rb +110 -0
  19. data/lib/q-language/methods/token.rb +72 -0
  20. data/lib/q-language/methods/true.rb +14 -0
  21. data/lib/q-language/node.rb +45 -0
  22. data/lib/q-language/object.rb +125 -0
  23. data/lib/q-language/parser.rb +104 -0
  24. data/lib/q-language/writer.rb +90 -0
  25. data/test/methods/test_array.rb +191 -0
  26. data/test/methods/test_block.rb +66 -0
  27. data/test/methods/test_class.rb +34 -0
  28. data/test/methods/test_dynamic.rb +158 -0
  29. data/test/methods/test_false.rb +60 -0
  30. data/test/methods/test_hash.rb +10 -0
  31. data/test/methods/test_implicit.rb +332 -0
  32. data/test/methods/test_module.rb +55 -0
  33. data/test/methods/test_nil.rb +60 -0
  34. data/test/methods/test_number.rb +10 -0
  35. data/test/methods/test_object.rb +157 -0
  36. data/test/methods/test_string.rb +271 -0
  37. data/test/methods/test_time.rb +181 -0
  38. data/test/methods/test_token.rb +92 -0
  39. data/test/methods/test_true.rb +16 -0
  40. data/test/test.rb +23 -0
  41. metadata +103 -0
@@ -0,0 +1,66 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestBlock < TestQ
9
+ def test_block_p_returns_self
10
+ returns :b, "{ :b block block? }"
11
+ end
12
+
13
+ def test_call_returns_block_return_value
14
+ eq 614, "{ block { Number(614) } call }"
15
+ end
16
+
17
+ def test_call_calls_block
18
+ set? :value, 614, "{ block { :value Number(614) } call }"
19
+ end
20
+
21
+ def test_eval_returns_block_return_value
22
+ eq 614, "{ block { Number(614) } eval new }"
23
+ end
24
+
25
+ def test_eval_calls_block
26
+ set? :value, 614, "{ block { :value Number(614) } eval new }"
27
+ end
28
+
29
+ def test_eval_calls_block_with_dynamic_as_self
30
+ script = "{ block { :value self } eval :o new }"
31
+ env = Q_Device.new(script).execute
32
+
33
+ assert_equal(env.get(:o), env.get(:value))
34
+ end
35
+
36
+ def test_eval_arg_returns_block_return_value
37
+ eq 614, "{ block :arg { Number(614) } eval_arg new Token(arg) }"
38
+ end
39
+
40
+ def test_eval_arg_calls_block
41
+ set? :value, 614, "{ block :arg { :value Number(614) } eval_arg new Token(arg) }"
42
+ end
43
+
44
+ def test_eval_arg_calls_block_with_dynamic_as_self
45
+ script = "{ block :arg { :value self } eval_arg :o new Token(arg) }"
46
+ env = Q_Device.new(script).execute
47
+
48
+ assert_equal(env.get(:o), env.get(:value))
49
+ end
50
+
51
+ def test_eval_arg_calls_block_with_argument
52
+ set? :value, 614, "{ block :arg { :value :arg } eval_arg :o new Number(614) }"
53
+ end
54
+
55
+ def test_call_arg_returns_block_return_value
56
+ eq 614, "{ block :arg { Number(614) } call_arg Token(arg) }"
57
+ end
58
+
59
+ def test_call_arg_calls_block
60
+ set? :value, 614, "{ block :arg { :value Number(614) } call_arg Token(arg) }"
61
+ end
62
+
63
+ def test_call_arg_calls_block_with_argument
64
+ set? :value, 614, "{ block :arg { :value :arg } call_arg Number(614) }"
65
+ end
66
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestClass < TestQ
9
+ def test_class_p_returns_self
10
+ returns :c, "{ :c class class? }"
11
+ end
12
+
13
+ def test_init_returns_instance
14
+ script = "{ :c class init Number(614) }"
15
+ env = Q_Device.new(script).execute
16
+
17
+ assert_instance_of(env.get(:c), env.return_value)
18
+ end
19
+
20
+ def test_init_sets_init_value
21
+ eq 614, "{ class init Number(614) init_value }"
22
+ end
23
+
24
+ def test_module_p_returns_false
25
+ eq false, "{ class module? }"
26
+ end
27
+
28
+ def test_new_returns_instance
29
+ script = "{ :c class new }"
30
+ env = Q_Device.new(script).execute
31
+
32
+ assert_instance_of(env.get(:c), env.return_value)
33
+ end
34
+ end
@@ -0,0 +1,158 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestDynamic < TestQ
9
+ def test_def_returns_self
10
+ returns :o, "{ :o new def Token(foo) { Number(614) } }"
11
+ end
12
+
13
+ def test_def_defines_method
14
+ script = "{ new def Token(foo) { Number(614) } }"
15
+ env = Q_Device.new(script).execute
16
+
17
+ assert_equal(614, env.return_value.foo)
18
+ end
19
+
20
+ def test_def_defines_method_where_self_is_the_caller
21
+ script = "{ new def Token(foo) { self } }"
22
+ object = Q_Device.new(script).execute.return_value
23
+
24
+ assert_equal(object, object.foo)
25
+ end
26
+
27
+ def test_dynamic_p_returns_self
28
+ returns :o, "{ :o new dynamic? }"
29
+ end
30
+
31
+ def test_eval_returns_block_return_value
32
+ eq 614, "{ new eval { Number(614) } }"
33
+ end
34
+
35
+ def test_eval_calls_block
36
+ set? :value, 614, "{ new eval { :value Number(614) } }"
37
+ end
38
+
39
+ def test_eval_calls_block_with_object_as_self
40
+ script = "{ :o new eval { :value self } }"
41
+ env = Q_Device.new(script).execute
42
+
43
+ assert_equal(env.get(:o), env.get(:value))
44
+ end
45
+
46
+ def test_eval_arg_returns_block_return_value
47
+ eq 614, "{ new eval_arg Token(arg) { Number(614) } }"
48
+ end
49
+
50
+ def test_eval_arg_calls_block
51
+ set? :value, 614, "{ new eval_arg Token(arg) { :value Number(614) } }"
52
+ end
53
+
54
+ def test_eval_arg_calls_block_with_object_as_self
55
+ script = "{ :o new eval_arg Token(arg) { :value self } }"
56
+ env = Q_Device.new(script).execute
57
+
58
+ assert_equal(env.get(:o), env.get(:value))
59
+ end
60
+
61
+ def test_eval_arg_calls_block_with_argument
62
+ set? :value, 614, "{ :o new eval_arg Number(614) :x { :value :x } }"
63
+ end
64
+
65
+ def test_extend_returns_self
66
+ returns :o, "{ :o new extend module }"
67
+ end
68
+
69
+ def test_extend_includes_module
70
+ script = "{ new extend { module def Token(foo) { Number(614) } } }"
71
+ env = Q_Device.new(script).execute
72
+
73
+ assert_equal(614, env.return_value.foo)
74
+ end
75
+
76
+ def test_extend_does_not_include_class
77
+ script = "{ new include { class def Token(foo) { Number(614) } } }"
78
+ env = Q_Device.new(script).execute
79
+
80
+ assert_raises(NoMethodError) { env.return_value.foo }
81
+ end
82
+
83
+ def test_iget_returns_instance_variable_value
84
+ eq 614, "{ :o new iset Number(614) Token(ivar) :o iget Token(ivar) }"
85
+ end
86
+
87
+ def test_iget_returns_nil_for_unknown_variable_name
88
+ eq nil, "{ new iget Token(ivar) }"
89
+ end
90
+
91
+ def test_iget_returns_nil_for_illegal_variable_name
92
+ eq nil, "{ new iget Token(\t) }"
93
+ end
94
+
95
+ def test_init_value_returns_init_value
96
+ eq 614, "{ init Number(614) init_value }"
97
+ end
98
+
99
+ def test_init_value_returns_nil_for_non_initialized_objects
100
+ eq nil, "{ new init_value }"
101
+ end
102
+
103
+ def test_instance_p_returns_true_when_object_is_instance_of_class
104
+ eq true, "{ :c class new instance? :c }"
105
+ end
106
+
107
+ def test_instance_p_returns_false_when_object_is_not_instance_of_class
108
+ eq false, "{ new instance? { class } }"
109
+ end
110
+
111
+ def test_is_p_returns_true_when_object_is_instance_of_class
112
+ eq true, "{ :c class new is? :c }"
113
+ end
114
+
115
+ def test_is_p_returns_false_when_object_is_not_instance_of_class
116
+ eq false, "{ new is? { class } }"
117
+ end
118
+
119
+ def test_is_p_returns_true_when_object_includes_module
120
+ eq true, "{ { class include { :m module } } new is? :m }"
121
+ end
122
+
123
+ def test_is_p_returns_false_when_object_does_not_include_module
124
+ eq false, "{ new is? module }"
125
+ end
126
+
127
+ def test_iset_returns_instance_variable_value
128
+ eq 614, "{ new iset Number(614) Token(ivar) }"
129
+ end
130
+
131
+ def test_iset_sets_instance_variable_value
132
+ eq 614, "{ :o new iset Number(614) Token(ivar) :o iget Token(ivar) }"
133
+ end
134
+
135
+ def test_iset_returns_nil_for_illegal_variable_name
136
+ eq nil, "{ new iset Number(614) Token(\t) }"
137
+ end
138
+
139
+ def test_metaclass_returns_object_class
140
+ returns :c, "{ :c class new metaclass }"
141
+ end
142
+
143
+ def test_send_calls_method
144
+ set? :value, 614, "{ new def Token(foo) { :value Number(614) } send Token(foo) }"
145
+ end
146
+
147
+ def test_send_returns_method_return_value
148
+ eq 614, "{ new def Token(foo) { Number(614) } send Token(foo) }"
149
+ end
150
+
151
+ def test_send_arg_calls_method
152
+ set? :value, 614, "{ new def Token(foo) :arg { :value :arg } send_arg Token(foo) Number(614) }"
153
+ end
154
+
155
+ def test_send_arg_returns_method_return_value
156
+ eq 614, "{ new def Token(foo) :arg { :arg add Number(613) } send_arg Token(foo) Number(1) }"
157
+ end
158
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestFalse < TestQ
9
+ def test_and_returns_false
10
+ eq false, "{ false and Token(a) }"
11
+ end
12
+
13
+ def test_choose_returns_object_2
14
+ eq :b, "{ choose false Token(a) Token(b) }"
15
+ end
16
+
17
+ def test_false_p_returns_true
18
+ eq true, "{ false false? }"
19
+ end
20
+
21
+ def test_if_returns_nil
22
+ eq nil, "{ if false { Token(a) } }"
23
+ end
24
+
25
+ def test_not_returns_true
26
+ eq true, "{ not false }"
27
+ end
28
+
29
+ def test_or_returns_object
30
+ eq :a, "{ false or Token(a) }"
31
+ end
32
+
33
+ def test_stringify_returns_false_string
34
+ eq "false", "{ false stringify }"
35
+ end
36
+
37
+ def test_tally_returns_negative_one
38
+ eq -1, "{ false tally }"
39
+ end
40
+
41
+ def test_unless_returns_block_return_value
42
+ eq :a, "{ unless false { Token(a) } }"
43
+ end
44
+
45
+ def test_unless_calls_block
46
+ set? :value, 614, "{ unless false { :value Number(614) } }"
47
+ end
48
+
49
+ def test_xor_false_returns_false
50
+ eq false, "{ false xor false }"
51
+ end
52
+
53
+ def test_xor_nil_returns_false
54
+ eq false, "{ false xor nil }"
55
+ end
56
+
57
+ def test_xor_true_returns_true
58
+ eq true, "{ false xor true }"
59
+ end
60
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestHash < TestQ
9
+
10
+ end
@@ -0,0 +1,332 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright © 2010-2011 Jesse Sielaff
4
+ #
5
+
6
+ require_relative '../test.rb'
7
+
8
+ class TestImplicit < TestQ
9
+ def test_all_p
10
+ end
11
+
12
+ def test_any_p
13
+ end
14
+
15
+ def test_array_returns_empty_array
16
+ eq [], "{ array }"
17
+ end
18
+
19
+ def test_arrays_returns_array_of_all_arrays_in_queue
20
+ eq [[],[],[]], "{ array array array arrays }"
21
+ end
22
+
23
+ def test_block_returns_next_block_as_an_object
24
+ script = "{ block { } }"
25
+ env = Q_Device.new(script).execute
26
+
27
+ assert_instance_of(Proc, env.return_value)
28
+ end
29
+
30
+ def test_blocks_returns_array_of_all_blocks_in_queue
31
+ script = "{ block { } block { } block { } blocks }"
32
+ env = Q_Device.new(script).execute
33
+
34
+ assert_equal(3, env.return_value.length)
35
+ assert_equal(true, env.return_value.all? {|x| x.is_a?(Proc) })
36
+ end
37
+
38
+ def test_break
39
+ end
40
+
41
+ def test_class_returns_a_new_class
42
+ script = "{ class }"
43
+ env = Q_Device.new(script).execute
44
+
45
+ assert_instance_of(Class, env.return_value)
46
+ end
47
+
48
+ def test_classes_returns_array_of_all_classes_in_queue
49
+ script = "{ class class class classes }"
50
+ env = Q_Device.new(script).execute
51
+
52
+ assert_equal(3, env.return_value.length)
53
+ assert_equal(true, env.return_value.all? {|x| x.is_a?(Class) })
54
+ end
55
+
56
+ def test_compact_returns_array_of_all_non_nil_items_in_queue
57
+ eq [:a,:b], "{ Token(a) nil Token(b) nil compact elect }"
58
+ end
59
+
60
+ def test_compact_leaves_nils_in_queue
61
+ eq [:a, nil, :b, nil, [:a,:b]], "{ Token(a) nil Token(b) nil compact objects }"
62
+ end
63
+
64
+ def test_compact_bang_returns_array_of_all_non_nil_items_in_queue
65
+ eq [:a,:b], "{ Token(a) nil Token(b) nil compact! elect }"
66
+ end
67
+
68
+ def test_compact_bang_removes_nils_from_queue
69
+ eq [:a, :b, [:a,:b]], "{ Token(a) nil Token(b) nil compact! objects }"
70
+ end
71
+
72
+ def test_count_returns_number_of_matching_objects_left_in_queue
73
+ eq 2, "{ nil Token(a) nil Token(b) nil count elect }"
74
+ end
75
+
76
+ # figure out why this doesn't work with nil,
77
+ # e.g. "{ nil nil nil count_by :x { :x nil? } }"
78
+ def test_count_by_returns_number_of_objects_in_queue_for_which_block_returns_true
79
+ eq 2, "{ nil Token(a) Token(b) count_by :x { :x token? } elect }"
80
+ end
81
+
82
+ def test_def_returns_env_object
83
+ script = "{ def Token(foo) { Number(614) } }"
84
+ env = Q_Device.new(script).execute
85
+
86
+ assert_equal(env.object, env.return_value)
87
+ end
88
+
89
+ def test_def_defines_method
90
+ script = "{ def Token(foo) { Number(614) } }"
91
+ env = Q_Device.new(script).execute
92
+
93
+ assert_equal(614, env.object.foo)
94
+ end
95
+
96
+ def test_def_defines_method_where_self_is_the_caller
97
+ script = "{ def Token(foo) { self } }"
98
+ object = Q_Device.new(script).execute.object
99
+
100
+ assert_equal(object, object.foo)
101
+ end
102
+
103
+ def test_e_returns_e
104
+ eq Number.e, "{ e }"
105
+ end
106
+
107
+ def test_each
108
+ end
109
+
110
+ def test_elect_returns_last_item_in_queue
111
+ eq :c, "{ Token(a) Token(b) Token(c) elect }"
112
+ end
113
+
114
+ def test_elect_removes_other_items_from_the_queue
115
+ eq 1, "{ Token(a) Token(b) Token(c) elect objects length }"
116
+ end
117
+
118
+ def test_false_returns_false
119
+ eq false, "{ false }"
120
+ end
121
+
122
+ def test_falses_returns_array_of_all_falses_in_queue
123
+ eq [false, false, false], "{ false false false falses }"
124
+ end
125
+
126
+ def test_hash_returns_new_empty_hash
127
+ eq({}, "{ hash }")
128
+ end
129
+
130
+ def test_hashes_returns_array_of_all_hashes_in_queue
131
+ eq [{},{},{}], "{ hash hash hash hashes }"
132
+ end
133
+
134
+ def test_i_returns_i
135
+ eq Complex(0,-1), "{ i }"
136
+ end
137
+
138
+ def test_jump_if_calls_block
139
+ set? :value, 1, "{ jump_if { :value one } }"
140
+ end
141
+
142
+ def test_jump_if_terminates_execution_of_enclosing_block_when_block_returns_true
143
+ set? :value, nil, "{ { jump_if { true } :value one } }"
144
+ end
145
+
146
+ def test_jump_if_does_not_terminate_execution_of_enclosing_block_when_block_returns_false
147
+ set? :value, 1, "{ { jump_if { false } :value one } }"
148
+ end
149
+
150
+ def test_jump
151
+ end
152
+
153
+ def test_loop
154
+ end
155
+
156
+ def test_map
157
+ end
158
+
159
+ def test_many_p
160
+ end
161
+
162
+ def test_module_returns_new_module
163
+ script = "{ module }"
164
+ env = Q_Device.new(script).execute
165
+
166
+ assert_instance_of(Module, env.return_value)
167
+ end
168
+
169
+ def test_modules_returns_array_of_all_modules_in_queue
170
+ script = "{ module module module modules }"
171
+ env = Q_Device.new(script).execute
172
+
173
+ assert_equal(3, env.return_value.length)
174
+ assert_equal(true, env.return_value.all? {|x| x.is_a?(Module) })
175
+ end
176
+
177
+ def test_nan_returns_nan
178
+ eq Number.nan, "{ nan }"
179
+ end
180
+
181
+ def test_neg_inf_returns_negative_infinity
182
+ eq Number.neg_inf, "{ neg_inf }"
183
+ end
184
+
185
+ def test_neg_one_returns_negative_one
186
+ eq -1, "{ neg_one }"
187
+ end
188
+
189
+ def test_new_returns_new_dynamic_object
190
+ script = "{ new }"
191
+ env = Q_Device.new(script).execute
192
+
193
+ assert_instance_of(QDynamic, env.return_value.to_q)
194
+ end
195
+
196
+ def test_newline_returns_newline_string
197
+ eq ?\n, "{ newline }"
198
+ end
199
+
200
+ def test_nil_returns_nil
201
+ eq nil, "{ nil }"
202
+ end
203
+
204
+ def test_nils_returns_array_of_all_nils_in_queue
205
+ eq [nil, nil, nil], "{ nil nil nil nils }"
206
+ end
207
+
208
+ def test_none_p
209
+ end
210
+
211
+ def test_now_returns_current_time
212
+ script = "{ now }"
213
+ env = Q_Device.new(script).execute
214
+
215
+ assert_equal(Time.now.round, env.return_value.round)
216
+ end
217
+
218
+ def test_numbers_returns_array_of_all_numbers_in_queue
219
+ eq [1, 2, 3], "{ Number(1) Number(2) Number(3) numbers }"
220
+ end
221
+
222
+ def test_objects_returns_array_of_all_objects_in_queue
223
+ eq [1, :a, true], "{ Number(1) Token(a) true objects }"
224
+ end
225
+
226
+ def test_one_returns_one
227
+ eq 1, "{ one }"
228
+ end
229
+
230
+ def test_one_p
231
+ end
232
+
233
+ def test_pi_returns_pi
234
+ eq Number.pi, "{ pi }"
235
+ end
236
+
237
+ def test_pos_inf_returns_positive_infinity
238
+ eq Number.pos_inf, "{ pos_inf }"
239
+ end
240
+
241
+ def test_self
242
+ end
243
+
244
+ def test_skip_a_returns_object_b
245
+ eq :b, "{ Token(a) Token(b) skip_a }"
246
+ end
247
+
248
+ def test_skip_b_returns_object_a
249
+ eq :a, "{ Token(a) Token(b) skip_b }"
250
+ end
251
+
252
+ def test_space_returns_space_string
253
+ eq ' ', "{ space }"
254
+ end
255
+
256
+ def test_string_returns_empty_string
257
+ eq '', "{ string }"
258
+ end
259
+
260
+ def test_strings_returns_array_of_all_strings_in_queue
261
+ eq [?a,?b,?c], "{ String(a) String(b) String(c) strings }"
262
+ end
263
+
264
+ def test_tab_returns_tab_string
265
+ eq ?\t, "{ tab }"
266
+ end
267
+
268
+ def test_three_returns_three
269
+ eq 3, "{ three }"
270
+ end
271
+
272
+ def test_times_returns_array_of_all_times_in_queue
273
+ script = "{ now now now times }"
274
+ env = Q_Device.new(script).execute
275
+
276
+ assert_equal(3, env.return_value.length)
277
+ assert_equal(true, env.return_value.all? {|x| x.is_a?(Time) })
278
+ end
279
+
280
+ def test_tokens_returns_array_of_all_tokens_in_queue
281
+ eq [:a,:b,:c], "{ Token(a) Token(b) Token(c) tokens }"
282
+ end
283
+
284
+ def test_true_returns_true
285
+ eq true, "{ true }"
286
+ end
287
+
288
+ def test_trues_returns_array_of_all_trues_in_queue
289
+ eq [true, true, true], "{ true true true trues }"
290
+ end
291
+
292
+ def test_two_returns_two
293
+ eq 2, "{ two }"
294
+ end
295
+
296
+ def test_uniq_returns_array_of_unique_items_in_queue
297
+ eq [:a, 1, nil], "{ Token(a) Token(a) Number(1) nil nil uniq elect }"
298
+ end
299
+
300
+ def test_uniq_leaves_duplicate_items_in_queue
301
+ eq [:a,:a,1,nil,nil,[:a,1,nil]], "{ Token(a) Token(a) Number(1) nil nil uniq objects }"
302
+ end
303
+
304
+ def test_uniq_bang_returns_array_of_unique_items_in_queue
305
+ eq [:a, 1, nil], "{ Token(a) Token(a) Number(1) nil nil uniq! elect }"
306
+ end
307
+
308
+ def test_uniq_bang_removes_duplicate_items_from_queue
309
+ eq [:a,1,nil,[:a,1,nil]], "{ Token(a) Token(a) Number(1) nil nil uniq! objects }"
310
+ end
311
+
312
+ def test_unset_returns_value_of_last_used_variable
313
+ eq 614, "{ :x unset }", x: 614
314
+ end
315
+
316
+ def test_unset_clears_value_of_last_used_variable
317
+ script = "{ :x unset }"
318
+ env = Q_Device.new(script).execute(x: 614)
319
+
320
+ assert_equal(nil, env.get(:x))
321
+ end
322
+
323
+ def test_until
324
+ end
325
+
326
+ def test_while
327
+ end
328
+
329
+ def test_zero_returns_zero
330
+ eq 0, "{ zero }"
331
+ end
332
+ end