red 4.0.6 → 4.1.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.
- data/Manifest.txt +4 -3
- data/bin/red +1 -0
- data/lib/red/executable.rb +4 -1
- data/lib/red/nodes/assignment_nodes.rb +6 -5
- data/lib/red/nodes/call_nodes.rb +23 -8
- data/lib/red/nodes/control_nodes.rb +4 -9
- data/lib/red/nodes/data_nodes.rb +8 -6
- data/lib/red/nodes/definition_nodes.rb +14 -6
- data/lib/red/nodes/literal_nodes.rb +1 -1
- data/lib/red/nodes/logic_nodes.rb +14 -8
- data/lib/red/version.rb +2 -2
- data/lib/red.rb +10 -2
- data/lib/source/ruby.rb +387 -334
- data/spec/array.red +389 -0
- data/spec/hash.red +137 -0
- data/spec/object.red +22 -0
- data/spec/string.red +74 -0
- metadata +7 -6
- data/spec/red_spec.rb +0 -10
- data/spec/spec.opts +0 -1
- data/spec/spec_helper.rb +0 -10
data/spec/array.red
ADDED
@@ -0,0 +1,389 @@
|
|
1
|
+
Spec.describe Array do |it|
|
2
|
+
# it.can 'intersect' do
|
3
|
+
# ([1,1,3,5] & [1,2,3]).should_equal([1,3])
|
4
|
+
# end
|
5
|
+
|
6
|
+
it.can 'initialize with the [] literals' do
|
7
|
+
[1].should_equal([1])
|
8
|
+
end
|
9
|
+
|
10
|
+
it.can 'initialize with the %w() literal' do
|
11
|
+
%w(a).should_equal(['a'])
|
12
|
+
end
|
13
|
+
|
14
|
+
it.can 'multiply itself by an integer and return a larger array' do
|
15
|
+
([1,2,3] * 2).should_equal([1,2,3,1,2,3])
|
16
|
+
end
|
17
|
+
|
18
|
+
it.can 'multiply itself by a string and return a joined string' do
|
19
|
+
([1,2,3] * ":").should_equal('1:2:3')
|
20
|
+
end
|
21
|
+
|
22
|
+
it.can 'be added to another array, resulting in one large array' do
|
23
|
+
([1,2,3] + [4,5]).should_equal([1, 2, 3, 4, 5])
|
24
|
+
end
|
25
|
+
|
26
|
+
it.can 'subtract another array, returning an array containing only items that appear in itself and not in the other' do
|
27
|
+
([1,1,2,2,3,3,4,5] - [1,2,4]).should_equal([3, 3, 5])
|
28
|
+
end
|
29
|
+
|
30
|
+
it.can 'append an object to the its end as the last element' do
|
31
|
+
([1,2] << 'c' << 'd' << [3,4]).should_equal([1, 2, "c", "d", [3, 4]])
|
32
|
+
end
|
33
|
+
|
34
|
+
it.can 'compare itself to another array' do
|
35
|
+
(['a','a','c'] <=> ['a','b','c']).should_equal(-1)
|
36
|
+
([1,2,3,4,5,6] <=> [1,2]).should_equal(1)
|
37
|
+
([1,2] <=> [1,2]).should_equal(0)
|
38
|
+
end
|
39
|
+
|
40
|
+
it.can 'check if its equal to another array' do
|
41
|
+
(['a','c'] == ['a', 'c', 7]).should_be_false
|
42
|
+
(['a','c', 7] == ['a', 'c', 7]).should_be_true
|
43
|
+
(['a','c', 7] == ['a', 'd', 'f']).should_be_false
|
44
|
+
end
|
45
|
+
|
46
|
+
it.can 'retrieve the object at a numeric index' do
|
47
|
+
a = ['a','b','c']
|
48
|
+
a[0].should_equal('a')
|
49
|
+
a.at(-1).should_equal('c')
|
50
|
+
a.at(0).should_equal('a')
|
51
|
+
a.slice(0).should_equal('a')
|
52
|
+
end
|
53
|
+
|
54
|
+
it.returns 'nil if the object at the numeric index is nil or index is greater than its length' do
|
55
|
+
['a','b',nil][2].should_be_nil
|
56
|
+
['a','b'][2].should_be_nil
|
57
|
+
['a','b',nil].slice(2).should_be_nil
|
58
|
+
['a','b'].slice(2).should_be_nil
|
59
|
+
end
|
60
|
+
|
61
|
+
it.returns 'a sub array based on a start position and length' do
|
62
|
+
(['a','b','c','d'][1,2]).should_equal(['b','c'])
|
63
|
+
end
|
64
|
+
|
65
|
+
it.returns 'a limited sub array when a start position and length are provided and position + length go beyond the size of the array' do
|
66
|
+
(['a','b','c','d'][3,2]).should_equal(['d'])
|
67
|
+
['a','b','c','d'].slice(3,2).should_equal(['d'])
|
68
|
+
end
|
69
|
+
|
70
|
+
it.returns 'nil if a position and length are provided and position is past the size of the array' do
|
71
|
+
(['a','b','c','d'][4,2]).should_be_nil
|
72
|
+
['a','b','c','d'].slice(4,2).should_be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it.returns 'a sub array when a range is provided' do
|
76
|
+
(['a','b','c','d'][1..3]).should_equal(['b','c', 'd'])
|
77
|
+
['a','b','c','d'].slice(1..3).should_equal(['b','c', 'd'])
|
78
|
+
end
|
79
|
+
|
80
|
+
it.returns 'a limited sub array when a range is provided and the range goes beyond the size of the array' do
|
81
|
+
(['a','b','c','d'][2..5]).should_equal(['c','d'])
|
82
|
+
['a','b','c','d'].slice(2..5).should_equal(['c','d'])
|
83
|
+
end
|
84
|
+
|
85
|
+
it.returns 'nil if a range is provided and the range begins beyong the sie of the array' do
|
86
|
+
(['a','b','c','d'][4..5]).should_equal(nil)
|
87
|
+
['a','b','c','d'].slice(4..5).should_equal(nil)
|
88
|
+
end
|
89
|
+
|
90
|
+
it.can 'assgin objects to a specific location in the array, overwriting as neccessary' do
|
91
|
+
a = ['0']
|
92
|
+
a[0] = 'zero'
|
93
|
+
a.should_equal(['zero'])
|
94
|
+
end
|
95
|
+
|
96
|
+
it.can 'assign objects to a specific location in the array, padding with nil if neccessary' do
|
97
|
+
a = []
|
98
|
+
a[4] = '4'
|
99
|
+
a.should_equal([nil,nil,nil,nil,'4'])
|
100
|
+
end
|
101
|
+
|
102
|
+
it.can 'assign objects from an array to a location in the array based on a start position and length' do
|
103
|
+
([1,2,3,4,5,6,7][0,3] = ['a','b', 'c']).should_equal(['a','b','c',4,5,6,7])
|
104
|
+
end
|
105
|
+
|
106
|
+
it.can 'assign objects from an array to a location in the array based on a range' do
|
107
|
+
([1,2,3,4,5,6,7][1..2] = ['a','b']).should_equal([1,'a','b',4,5,6,7])
|
108
|
+
end
|
109
|
+
|
110
|
+
it.can 'assoc' do
|
111
|
+
a = [['colors','red','blue','green'], ['letters','a','b','c'], 'foo']
|
112
|
+
a.assoc('letters').should_equal(["letters", "a", "b", "c"])
|
113
|
+
a.assoc('foo').should_be_nil
|
114
|
+
end
|
115
|
+
|
116
|
+
it.can 'clear' do
|
117
|
+
[3,2,1].clear.should_equal([])
|
118
|
+
end
|
119
|
+
|
120
|
+
it.can 'map additonal values into a new array' do
|
121
|
+
a = [1,2,3,4]
|
122
|
+
b = a.collect {|x| x + 100}
|
123
|
+
b.should_equal([101,102,103,104])
|
124
|
+
a.should_not_equal(b)
|
125
|
+
|
126
|
+
# map is an alias for collect
|
127
|
+
a = [1,2,3,4]
|
128
|
+
b = a.map {|x| x + 100}
|
129
|
+
b.should_equal([101,102,103,104])
|
130
|
+
a.should_not_equal(b)
|
131
|
+
end
|
132
|
+
|
133
|
+
it.can 'map additonal values into itself' do
|
134
|
+
a = [1,2,3,4]
|
135
|
+
b = a.collect! {|x| x + 100}
|
136
|
+
b.should_equal([101,102,103,104])
|
137
|
+
a.should_equal(b)
|
138
|
+
|
139
|
+
# map! is an alias for collect!
|
140
|
+
a = [1,2,3,4]
|
141
|
+
b = a.map! {|x| x + 100}
|
142
|
+
b.should_equal([101,102,103,104])
|
143
|
+
a.should_equal(b)
|
144
|
+
end
|
145
|
+
|
146
|
+
it.can 'remove nil elements' do
|
147
|
+
['a',nil,'b',nil,'c'].compact!.should_equal(["a", "b", "c"])
|
148
|
+
end
|
149
|
+
|
150
|
+
it.returns 'nil when attempting to remove nil elements from an array that has no nil elements' do
|
151
|
+
["a", "b", "c"].compact!.should_equal(nil)
|
152
|
+
end
|
153
|
+
|
154
|
+
it.can 'add the elelemts of a new array to its own end, as elements' do
|
155
|
+
[1,2].concat([3,4]).concat([5,6]).should_equal([1, 2, 3, 4, 5, 6])
|
156
|
+
end
|
157
|
+
|
158
|
+
it.can 'delete any objects in an array equal to a passed object, returning the passed object'
|
159
|
+
|
160
|
+
it.returns 'nil when attempting to delete an object from an array that does not contain the object' do
|
161
|
+
# ['a','b','b','b','c'].delete('z').should_equal(nil)
|
162
|
+
end
|
163
|
+
|
164
|
+
it.can 'delete objects from an array based on a provided block'
|
165
|
+
|
166
|
+
it.can 'delete an item at a specific index, returning the item' do
|
167
|
+
a = ['a','b','c','d']
|
168
|
+
a.delete_at(2).should_equal('c')
|
169
|
+
a.should_equal(['a','b','d'])
|
170
|
+
end
|
171
|
+
|
172
|
+
it.returns 'nil when attemping to delete an item at specific position if the array does not contain an object at the position' do
|
173
|
+
['a','b','c','d'].delete_at(6).should_equal(nil)
|
174
|
+
end
|
175
|
+
|
176
|
+
it.can 'delete objects based on a specific equality checking block'
|
177
|
+
it.can 'loop through its elements'
|
178
|
+
it.can 'check whether it is empty'
|
179
|
+
it.can 'check whether it is equal to another array, returning true or false'
|
180
|
+
|
181
|
+
it.can 'fetch items with an index' do
|
182
|
+
['a','b','c'].fetch(1).should_equal('b')
|
183
|
+
end
|
184
|
+
|
185
|
+
it.returns 'nil when fetching an item with a provided index beyond the length' do
|
186
|
+
['a','b','c'].fetch(5).should_be_nil
|
187
|
+
end
|
188
|
+
|
189
|
+
it.returns 'a default value if one is provided when fetching at an index and there is no object at the index' do
|
190
|
+
['a','b','c'].fetch(5, 'FAIL').should_equal('FAIL')
|
191
|
+
end
|
192
|
+
|
193
|
+
it.can 'call a blockon failed value fetching if a block is provided'
|
194
|
+
|
195
|
+
it.can 'fill itself with new values' do
|
196
|
+
['a','b','c', 'd'].fill('x').should_equal(['x','x','x','x'])
|
197
|
+
end
|
198
|
+
|
199
|
+
it.can 'fill itself with new values starting a start position and continuing for an optional length' do
|
200
|
+
['a','b','c', 'd'].fill('x', 2).should_equal(['a','b','x','x'])
|
201
|
+
['a','b','c', 'd'].fill('x', 1,2).should_equal(['a','x','x','d'])
|
202
|
+
end
|
203
|
+
|
204
|
+
it.can 'get the its first element' do
|
205
|
+
['1','2','3'].first.should_equal('1')
|
206
|
+
end
|
207
|
+
|
208
|
+
it.can 'get the its first n elements with a provider number' do
|
209
|
+
['1','2','3'].first(2).should_equal(['1','2'])
|
210
|
+
end
|
211
|
+
|
212
|
+
it.can 'flatten and return a new flat array' do
|
213
|
+
a = ['a','b',['d','e','f'],'g']
|
214
|
+
b = a.flatten
|
215
|
+
a.should_not_equal(['a','b','d','e','f','g'])
|
216
|
+
b.should_equal(['a','b','d','e','f','g'])
|
217
|
+
end
|
218
|
+
|
219
|
+
it.can 'flatten itself' do
|
220
|
+
a = ['a','b',['d','e','f'],'g']
|
221
|
+
b = a.flatten!
|
222
|
+
a.should_equal(['a','b','d','e','f','g'])
|
223
|
+
b.should_equal(['a','b','d','e','f','g'])
|
224
|
+
end
|
225
|
+
|
226
|
+
it.returns 'nil if flattening itself and no changes were made' do
|
227
|
+
['a','b','d','e','f','g'].flatten!.should_equal(nil)
|
228
|
+
end
|
229
|
+
|
230
|
+
it.can 'determine whether it includes an object returning true or false' do
|
231
|
+
['a','b','c'].include?('a').should_be_true
|
232
|
+
['a','b','c'].include?('d').should_be_false
|
233
|
+
end
|
234
|
+
|
235
|
+
it.returns 'the index of an object when looking for an object and the object is in the array' do
|
236
|
+
['a','b','c'].index('a').should_equal(0)
|
237
|
+
end
|
238
|
+
|
239
|
+
it.returns 'nil when looking for an object and the object is not in the array' do
|
240
|
+
['a','b','c'].index('d').should_be_nil
|
241
|
+
end
|
242
|
+
|
243
|
+
it.can 'insert an object before paritcular index' do
|
244
|
+
[1,2,3,4].insert(2,99).should_equal([1, 2, 99, 3, 4])
|
245
|
+
end
|
246
|
+
|
247
|
+
it.can 'insert an object before a paricular negative index' do
|
248
|
+
[1,2,3,4].insert(-2,'a','b','c').should_equal([1, 2, 3, "a", "b", "c", 4])
|
249
|
+
end
|
250
|
+
|
251
|
+
it.returns 'printable version of itself' do
|
252
|
+
[1,2,3].inspect.should_equal("[1, 2, 3]")
|
253
|
+
end
|
254
|
+
|
255
|
+
it.can 'join each element with a string, returning a new string' do
|
256
|
+
['a','b','c'].join(',').should_equal('a,b,c')
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
it.can 'get the its last element' do
|
261
|
+
['1','2','3'].last.should_equal('3')
|
262
|
+
end
|
263
|
+
|
264
|
+
it.can 'get the its last n elements with a provider number' do
|
265
|
+
['1','2','3'].last(2).should_equal(['2','3'])
|
266
|
+
end
|
267
|
+
|
268
|
+
it.can 'provide its length as a number' do
|
269
|
+
a = ['1','2','3']
|
270
|
+
a.size.should_equal(3)
|
271
|
+
a.length.should_equal(3)
|
272
|
+
end
|
273
|
+
|
274
|
+
it.returns 'the number of non-nil items' do
|
275
|
+
[1, nil, 3, nil, 5].nitems.should_equal(3)
|
276
|
+
end
|
277
|
+
|
278
|
+
it.can 'remove its last item returing that item' do
|
279
|
+
a = ['1','2','3']
|
280
|
+
a.pop.should_equal('3')
|
281
|
+
a.should_equal(['1','2'])
|
282
|
+
end
|
283
|
+
|
284
|
+
it.returns 'nil when attempting to pop an item when empty' do
|
285
|
+
[].pop.should_equal(nil)
|
286
|
+
end
|
287
|
+
|
288
|
+
it.can 'append items to its end, returning itself' do
|
289
|
+
[1,2,3].push(4).push(5,6,7).should_equal([1, 2, 3, 4, 5, 6, 7])
|
290
|
+
end
|
291
|
+
|
292
|
+
it.can 'rassoc' do
|
293
|
+
a = [[1,'one'], [2,'two'], [:ii,'two']]
|
294
|
+
a.rassoc('two').should_equal([2, "two"])
|
295
|
+
a.rassoc('three').should_be_nil
|
296
|
+
end
|
297
|
+
|
298
|
+
it.can 'create a new array with rejected elements removed' do
|
299
|
+
a = [1,2,3,4,5]
|
300
|
+
b = a.reject {|x| x > 3 }
|
301
|
+
b.should_equal([1, 2, 3])
|
302
|
+
a.should_not_equal(b)
|
303
|
+
end
|
304
|
+
|
305
|
+
it.can 'remove every element for which block evaluates to true' do
|
306
|
+
a = [1,2,3,4,5]
|
307
|
+
b = a.reject {|x| x > 3 }
|
308
|
+
b.should_equal([1, 2, 3])
|
309
|
+
a.should_equal(b)
|
310
|
+
end
|
311
|
+
|
312
|
+
it.can 'repalce its contents with the contents of another array, truncating or expanding if necessary' do
|
313
|
+
['a','b','c'].replace(['w','x','y', 'z']).should_equal(["w", "x", "y", "z"])
|
314
|
+
end
|
315
|
+
|
316
|
+
it.can 'return a reversed array' do
|
317
|
+
a = [1,2,3,4,5]
|
318
|
+
b = a.reverse
|
319
|
+
b.should_equal([5,4,3,2,1])
|
320
|
+
a.should_equal([1,2,3,4,5])
|
321
|
+
end
|
322
|
+
|
323
|
+
it.can 'reverse itself' do
|
324
|
+
a = [1,2,3,4,5]
|
325
|
+
b = a.reverse!
|
326
|
+
b.should_equal([5,4,3,2,1])
|
327
|
+
a.should_equal([5,4,3,2,1])
|
328
|
+
end
|
329
|
+
|
330
|
+
it.can 'return a sorted array' do
|
331
|
+
a = [3, 2, 4, 1]
|
332
|
+
b = a.sort
|
333
|
+
b.should_equal([1,2,3,4])
|
334
|
+
a.should_not_equal(b)
|
335
|
+
end
|
336
|
+
|
337
|
+
it.can 'sort itself' do
|
338
|
+
a = [3, 2, 4, 1]
|
339
|
+
b = a.sort!
|
340
|
+
b.should_equal([1,2,3,4])
|
341
|
+
a.should_equal(b)
|
342
|
+
end
|
343
|
+
|
344
|
+
it.can 'convert itself to an array' do
|
345
|
+
[1,2,3].to_a.should_equal([1, 2, 3])
|
346
|
+
end
|
347
|
+
|
348
|
+
it.can 'convert itself to a string, calling .to_s on each element' do
|
349
|
+
[1,2,3].to_s.should_equal('123')
|
350
|
+
end
|
351
|
+
|
352
|
+
it.can 'transpose' do
|
353
|
+
[[1,2],[3,4],[5,6]].transpose.should_equal([[1, 3, 5], [2, 4, 6]])
|
354
|
+
end
|
355
|
+
|
356
|
+
it.can 'return a new array with repeated elements removed' do
|
357
|
+
a = ['a','b','b','c','c','c']
|
358
|
+
b = a.uniq
|
359
|
+
a.should_not_equal(["a", "b", "c"])
|
360
|
+
b.should_equal(["a", "b", "c"])
|
361
|
+
a.should_not_equal(b)
|
362
|
+
end
|
363
|
+
|
364
|
+
it.can 'remove repeated elements from itself' do
|
365
|
+
a = ['a','b','b','c','c','c']
|
366
|
+
b = a.uniq!
|
367
|
+
a.should_equal(["a", "b", "c"])
|
368
|
+
b.should_equal(["a", "b", "c"])
|
369
|
+
a.should_equal(b)
|
370
|
+
end
|
371
|
+
|
372
|
+
it.returns 'nil if removing repeated elements from itself has no effect' do
|
373
|
+
["a", "b", "c"].uniq!.should_equal(nil)
|
374
|
+
end
|
375
|
+
|
376
|
+
it.can 'prepend objects to the front, shifting the indices of another array\'s other elements up one, then returns itself' do
|
377
|
+
a = ['b','c']
|
378
|
+
a.unshift('a').should_equal(["a", "b", "c"])
|
379
|
+
a.unshift(1,2,3).should_equal([1, 2, 3, "a", "b", "c"])
|
380
|
+
end
|
381
|
+
|
382
|
+
it.can 'retrurn an array containing the elements in self corresponding to the given selector(s)'
|
383
|
+
it.can 'combine with another array instering elements at a position in one the same indexed element in the other (zipping)'
|
384
|
+
|
385
|
+
it.can 'provider a union of two arrays' do
|
386
|
+
([1,2,3] | [3,4,1]).should_equal([1, 2, 3, 4])
|
387
|
+
end
|
388
|
+
|
389
|
+
end
|
data/spec/hash.red
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
Spec.describe Hash do |it|
|
2
|
+
it.can 'initialize itself with { } literals' do
|
3
|
+
{'a' => 'b'}.should_equal({'a' => 'b'})
|
4
|
+
end
|
5
|
+
|
6
|
+
it.can 'initialize itself with through the Hash.new' do
|
7
|
+
Hash.new.should_equal({})
|
8
|
+
end
|
9
|
+
|
10
|
+
# TODO: BROKE
|
11
|
+
it.can 'take a default value to return if accessing a missing key' do
|
12
|
+
# h = Hash.new('unknown key')
|
13
|
+
# h[:not_there].should_equal('unknown key')
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO: BROKE
|
17
|
+
it.can 'alter the default key by accessing an unknow key and changing it' do
|
18
|
+
# h = Hash.new('unknown key')
|
19
|
+
# h[:not_there].upcase
|
20
|
+
# h[:not_anywhere].should_equal('UNKNOWN KEY')
|
21
|
+
end
|
22
|
+
|
23
|
+
it.does_not 'store values from the defaults in the hash' do
|
24
|
+
h = Hash.new('unknown key')
|
25
|
+
h[:a] = 1
|
26
|
+
h[:b] = 2
|
27
|
+
h.keys.should_equal([:a, :b])
|
28
|
+
end
|
29
|
+
|
30
|
+
it.can 'determine whether its contents are equal to the contents of another hash' do
|
31
|
+
({'a' => 'b'} == {'a' => 'b'}).should_be_true
|
32
|
+
({'d' => 'b'} == {'a' => 'b'}).should_be_false
|
33
|
+
end
|
34
|
+
|
35
|
+
it.can 'retrive and element by its key' do
|
36
|
+
{:a => 'b'}[:a].should_equal('b')
|
37
|
+
end
|
38
|
+
|
39
|
+
it.returns 'nil when attempting to retrieve an element with a non-existent key' do
|
40
|
+
{:a => 'b'}['n'].should_equal(nil)
|
41
|
+
end
|
42
|
+
|
43
|
+
it.can 'store an element to be accessed by the provided key' do
|
44
|
+
h1 = {}
|
45
|
+
(h1['a'] = 'stored').should_equal('stored')
|
46
|
+
h1.should_equal({'a' => 'stored'})
|
47
|
+
|
48
|
+
h2 = {}
|
49
|
+
h2.store('a', 'stored').should_equal('stored')
|
50
|
+
|
51
|
+
h2.should_equal({'a' => 'stored'})
|
52
|
+
end
|
53
|
+
|
54
|
+
it.can 'clear itself' do
|
55
|
+
{'a' => 1, 'b' => 2}.clear.should_equal({})
|
56
|
+
end
|
57
|
+
|
58
|
+
it.can 'default'
|
59
|
+
it.can 'default='
|
60
|
+
it.can 'default_proc='
|
61
|
+
|
62
|
+
it.can 'delete elements' do
|
63
|
+
h = {:a => 100, :b => 200}
|
64
|
+
h.delete(:a).should_equal(100)
|
65
|
+
h.should_equal({:b => 200})
|
66
|
+
end
|
67
|
+
|
68
|
+
it.can 'delete elements based on a block' do
|
69
|
+
h = {:a => 100, :b => 200, :c => 300 }
|
70
|
+
h.delete_if {|k,v| v >= 200 }
|
71
|
+
h.should_equal({:a => 100})
|
72
|
+
end
|
73
|
+
|
74
|
+
it.can 'loop' do
|
75
|
+
h = {:a => 100, :b => 200, :c => 300 }
|
76
|
+
h.each {|k,v| v += 10}
|
77
|
+
h.should_equal({:a => 110, :b => 220, :c => 300 })
|
78
|
+
end
|
79
|
+
|
80
|
+
it.can 'loop through each key'
|
81
|
+
it.can 'loop through each value'
|
82
|
+
it.can 'be checked for emptiness'
|
83
|
+
it.can 'fetch'
|
84
|
+
|
85
|
+
it.can 'tell if it includes a key'
|
86
|
+
it.can 'tell if it includes a key'
|
87
|
+
|
88
|
+
it.can 'return the key for a given value'
|
89
|
+
it.returns 'nil if there is no key for a given value'
|
90
|
+
|
91
|
+
it.can 'format an inspectable string of itself' do
|
92
|
+
h = Hash[:a,100,:b,200].inspect.should_equal("{:a => 100, :b => 200}")
|
93
|
+
end
|
94
|
+
|
95
|
+
it.can 'return a new hash with keys and values inverted' do
|
96
|
+
{:n => 100, :m => 100, :y => 300, :d => 200, :a => 0 }.invert.should_equal({100 => :m, 300 => :y, 200 => :d, 0 => :a})
|
97
|
+
end
|
98
|
+
|
99
|
+
it.can 'provide an array of its keys' do
|
100
|
+
{:a => 100, :b => 200}.keys.should_equal([:a,:b])
|
101
|
+
end
|
102
|
+
|
103
|
+
it.can 'give its length as a number' do
|
104
|
+
h = {:a => 100, :b => 200}
|
105
|
+
h.size.should_equal(2)
|
106
|
+
h.length.should_equal(2)
|
107
|
+
end
|
108
|
+
|
109
|
+
it.can 'merge with another hash, retuning a new hash' do
|
110
|
+
a = {:a => 100, :b => 200}
|
111
|
+
b = a.merge({:a => 150, :c => 300})
|
112
|
+
b.should_equal({:a => 150, :b => 200, :c => 300})
|
113
|
+
a.should_not_equal(b)
|
114
|
+
end
|
115
|
+
|
116
|
+
it.can 'merge with another hash altering itself' do
|
117
|
+
a = {:a => 100, :b => 200}
|
118
|
+
b = a.merge!({:a => 150, :c => 300})
|
119
|
+
b.should_equal({:a => 150, :b => 200, :c => 300})
|
120
|
+
a.should_equal(b)
|
121
|
+
end
|
122
|
+
|
123
|
+
it.can 'reject certain elements based on a block and return a new hash'
|
124
|
+
it.can 'reject certain elements based on a block and alter its own contents'
|
125
|
+
it.can 'replace its contents with the contents of another hash'
|
126
|
+
it.can 'select'
|
127
|
+
it.can 'remove a key-value pair from itself and return a two-item array [key, value]'
|
128
|
+
it.returns 'its default value when attempting to remove a key-value pair from itself and the hash is nil'
|
129
|
+
|
130
|
+
it.can 'sort and return an array of nested [key,value] arrays, sorted'
|
131
|
+
it.can 'convert to an array of nested [key,value] arrays'
|
132
|
+
|
133
|
+
it.can 'convert to a string'
|
134
|
+
it.can 'tell if it has a value'
|
135
|
+
it.can 'return an array of its values'
|
136
|
+
it.can 'return an array of values stored at one or more key location'
|
137
|
+
end
|
data/spec/object.red
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Spec.describe Object do |it|
|
2
|
+
it.can 'find its class'
|
3
|
+
|
4
|
+
it.can 'be extended with additioanl functionality' do
|
5
|
+
module Stuff
|
6
|
+
def x
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
o = Object.new
|
11
|
+
o.extend(Stuff)
|
12
|
+
o.respond_to?(:x).should_be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it.has 'an object_id' do
|
16
|
+
Object.new.object_id.should_not_be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it.can 'tell whether it will respond to a method referenced as a symbol' do
|
20
|
+
Object.respond_to?(:respond_to?).should_be_true
|
21
|
+
end
|
22
|
+
end
|
data/spec/string.red
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
Spec.describe String do |it|
|
2
|
+
it.can 'initialze with the " " literals' do
|
3
|
+
'red'.should_equal(String.new('red'))
|
4
|
+
end
|
5
|
+
|
6
|
+
it.can 'format itself using sprintf notation' do
|
7
|
+
("%05d" % 123).should_equal('00123')
|
8
|
+
end
|
9
|
+
|
10
|
+
it.can 'multiply by a number' do
|
11
|
+
('abc ' * 3).should_equal('abc abc abc ')
|
12
|
+
end
|
13
|
+
|
14
|
+
it.can 'be added to another string' do
|
15
|
+
('abc' + 'def').should_equal('abcdef')
|
16
|
+
end
|
17
|
+
|
18
|
+
it.can 'have new characters added to its end' do
|
19
|
+
('abc' << 'def').should_equal('abcdef')
|
20
|
+
'abc'.concat('def').should_equal('abcdef')
|
21
|
+
end
|
22
|
+
|
23
|
+
it.can 'have new numbers added to its end, which become characters if between 0 and 255' do
|
24
|
+
('a' << 103 << 104).should_equal('agh')
|
25
|
+
('a'.concat(103).concat(104)).should_equal('agh')
|
26
|
+
end
|
27
|
+
|
28
|
+
it.can 'compare itself to other strings' do
|
29
|
+
('abcdef' <=> 'abcde' ).should_equal(1)
|
30
|
+
('abcdef' <=> 'abcdef' ).should_equal(0)
|
31
|
+
('abcdef' <=> 'abcdefg').should_equal(-1)
|
32
|
+
('abcdef' <=> 'ABCDEF' ).should_equal(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
# TODO: BROKE
|
36
|
+
it.can 'check if it is equal to another string' do
|
37
|
+
# ('abc' == 'abc').should_equal(true)
|
38
|
+
# ('abc' == 'ac').should_equal(false)
|
39
|
+
end
|
40
|
+
|
41
|
+
it.can 'return a capitalized version of itself' do
|
42
|
+
a = 'abcdef'
|
43
|
+
b = a.capitalize
|
44
|
+
b.should_equal('Abcdef')
|
45
|
+
a.should_equal('abcdef')
|
46
|
+
|
47
|
+
a = 'ABCDEF'
|
48
|
+
b = a.capitalize
|
49
|
+
b.should_equal('Abcdef')
|
50
|
+
a.should_equal('ABCDEF')
|
51
|
+
|
52
|
+
a = '123ABC'
|
53
|
+
b = a.capitalize
|
54
|
+
b.should_equal('123abc')
|
55
|
+
a.should_equal('123ABC')
|
56
|
+
end
|
57
|
+
|
58
|
+
it.can 'capitalize itself' do
|
59
|
+
a = 'abcdef'
|
60
|
+
b = a.capitalize!
|
61
|
+
b.should_equal('Abcdef')
|
62
|
+
a.should_equal('Abcdef')
|
63
|
+
|
64
|
+
a = 'ABCDEF'
|
65
|
+
b = a.capitalize!
|
66
|
+
b.should_equal('Abcdef')
|
67
|
+
a.should_equal('Abcdef')
|
68
|
+
|
69
|
+
a = '123ABC'
|
70
|
+
b = a.capitalize!
|
71
|
+
b.should_equal('123abc')
|
72
|
+
a.should_equal('123abc')
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: red
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Sielaff
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-11-05 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
43
|
+
version: 1.8.2
|
44
44
|
version:
|
45
45
|
description: Red writes like Ruby and runs like JavaScript.
|
46
46
|
email:
|
@@ -85,9 +85,10 @@ files:
|
|
85
85
|
- script/generate
|
86
86
|
- script/txt2html
|
87
87
|
- setup.rb
|
88
|
-
- spec/
|
89
|
-
- spec/
|
90
|
-
- spec/
|
88
|
+
- spec/array.red
|
89
|
+
- spec/hash.red
|
90
|
+
- spec/object.red
|
91
|
+
- spec/string.red
|
91
92
|
- tasks/deployment.rake
|
92
93
|
- tasks/environment.rake
|
93
94
|
- tasks/rspec.rake
|
data/spec/red_spec.rb
DELETED
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--colour
|