trxl 0.1.5 → 0.1.8

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.
@@ -3,11 +3,11 @@ require 'spec_helper'
3
3
  describe "For conditional evaluation, the language" do
4
4
 
5
5
  include Trxl::SpecHelper
6
-
6
+
7
7
  before(:each) do
8
8
  @parser = Trxl::Calculator.new
9
9
  end
10
-
10
+
11
11
  it "should be able to evaluate conditional 'if' expressions without elsif and else branches" do
12
12
  program = "test = fun(x) { if(x) TRUE end };"
13
13
  eval(program + "test(TRUE)").should be_true
@@ -23,7 +23,7 @@ describe "For conditional evaluation, the language" do
23
23
  end
24
24
  PROGRAM
25
25
  eval(program).should be_true
26
-
26
+
27
27
  program = <<-PROGRAM
28
28
  if(FALSE)
29
29
  TRUE
@@ -32,7 +32,7 @@ describe "For conditional evaluation, the language" do
32
32
  end
33
33
  PROGRAM
34
34
  eval(program).should be_false
35
-
35
+
36
36
  program = <<-PROGRAM
37
37
  if(NULL)
38
38
  TRUE
@@ -41,7 +41,7 @@ describe "For conditional evaluation, the language" do
41
41
  end
42
42
  PROGRAM
43
43
  eval(program).should be_false
44
-
44
+
45
45
  program = <<-PROGRAM
46
46
  if(NULL != NULL)
47
47
  TRUE
@@ -200,7 +200,7 @@ describe "For conditional evaluation, the language" do
200
200
  PROGRAM
201
201
  eval(program).should == "else branch"
202
202
  end
203
-
203
+
204
204
  it "should be able to evaluate conditional 'if' expressions with multiple elsif and an else branch" do
205
205
  program = <<-PROGRAM
206
206
  foo = fun() {
@@ -217,7 +217,7 @@ describe "For conditional evaluation, the language" do
217
217
  foo();
218
218
  PROGRAM
219
219
  eval(program).should == 0
220
-
220
+
221
221
  program = <<-PROGRAM
222
222
  foo = fun() {
223
223
  if(2 == 1)
@@ -233,7 +233,7 @@ describe "For conditional evaluation, the language" do
233
233
  foo();
234
234
  PROGRAM
235
235
  eval(program).should == 1
236
-
236
+
237
237
  program = <<-PROGRAM
238
238
  foo = fun() {
239
239
  if(2 == 0)
@@ -249,7 +249,7 @@ describe "For conditional evaluation, the language" do
249
249
  foo();
250
250
  PROGRAM
251
251
  eval(program).should == 2
252
-
252
+
253
253
  program = <<-PROGRAM
254
254
  foo = fun() {
255
255
  if(2 == 0)
@@ -265,7 +265,7 @@ describe "For conditional evaluation, the language" do
265
265
  foo();
266
266
  PROGRAM
267
267
  eval(program).should == 3
268
-
268
+
269
269
  program = <<-PROGRAM
270
270
  foo = fun(value) {
271
271
  if(value <= 5000)
@@ -284,9 +284,9 @@ describe "For conditional evaluation, the language" do
284
284
  };
285
285
  foo(13000);
286
286
  PROGRAM
287
- eval(program).should == 15.92
287
+ eval(program).should == 15.92
288
288
  end
289
-
289
+
290
290
  it "should allow an arbitrary number of statements inside if/elsif/else expressions" do
291
291
  program = <<-PROGRAM
292
292
  foo = fun() {
@@ -306,7 +306,7 @@ describe "For conditional evaluation, the language" do
306
306
  };
307
307
  foo();
308
308
  PROGRAM
309
- eval(program).should == 0
309
+ eval(program).should == 0
310
310
 
311
311
  program = <<-PROGRAM
312
312
  foo = fun() {
@@ -326,7 +326,7 @@ describe "For conditional evaluation, the language" do
326
326
  };
327
327
  foo();
328
328
  PROGRAM
329
- eval(program).should == 1
329
+ eval(program).should == 1
330
330
 
331
331
  program = <<-PROGRAM
332
332
  foo = fun() {
@@ -346,7 +346,7 @@ describe "For conditional evaluation, the language" do
346
346
  };
347
347
  foo();
348
348
  PROGRAM
349
- eval(program).should == 2
349
+ eval(program).should == 2
350
350
 
351
351
  program = <<-PROGRAM
352
352
  foo = fun() {
@@ -366,9 +366,9 @@ describe "For conditional evaluation, the language" do
366
366
  };
367
367
  foo();
368
368
  PROGRAM
369
- eval(program).should == 3
369
+ eval(program).should == 3
370
370
  end
371
-
371
+
372
372
  it "should allow arbitrary expressions as conditional expression" do
373
373
  program = "test = fun(x) {if(x == 0) TRUE else FALSE end};"
374
374
  program << "test(0)"
@@ -432,6 +432,20 @@ describe "For conditional evaluation, the language" do
432
432
  foo("hello");
433
433
  PROGRAM
434
434
  eval(program).should == "something else"
435
+
436
+ program = <<-PROGRAM
437
+ foo = fun(x) {
438
+ case x
439
+ when NULL then "nil"
440
+ when 2 then "two"
441
+ when 3 then "three"
442
+ else FALSE
443
+ end
444
+ };
445
+ foo(NULL);
446
+ PROGRAM
447
+ eval(program).should == "nil"
448
+
435
449
  end
436
450
 
437
451
  it "should allow multiple statements in each branch of a 'case' expression" do
@@ -450,5 +464,5 @@ describe "For conditional evaluation, the language" do
450
464
  PROGRAM
451
465
  eval(program).should == [ 1, "one" ]
452
466
  end
453
-
467
+
454
468
  end
@@ -3,24 +3,24 @@ require 'spec_helper'
3
3
  describe "When working with Ranges, the Trxl::Calculator" do
4
4
 
5
5
  include Trxl::SpecHelper
6
-
6
+
7
7
  before(:each) do
8
8
  @parser = Trxl::Calculator.new
9
9
  end
10
-
10
+
11
11
  it "should return arrays for range literal expressions" do
12
12
  eval("0..0").should == [ 0 ]
13
13
  eval("0..-1").should == [ ]
14
14
  eval("0...0").should == [ ]
15
15
  eval("0...-1").should == [ ]
16
-
16
+
17
17
  eval("1..5").should == [ 1, 2, 3, 4, 5 ]
18
18
  eval("1 .. 5").should == [ 1, 2, 3, 4, 5 ]
19
19
  eval("a = 1; b = 5; a..b").should == [ 1, 2, 3, 4, 5 ]
20
20
  eval("1...5").should == [ 1, 2, 3, 4 ]
21
21
  eval("1 ... 5").should == [ 1, 2, 3, 4 ]
22
22
  eval("a = 1; b = 5; a...b").should == [ 1, 2, 3, 4 ]
23
-
23
+
24
24
  eval("\"a\"..\"a\"").should == [ "a" ]
25
25
  eval("\"a\"..\"c\"").should == [ "a", "b", "c" ]
26
26
  eval("\"a\" .. \"c\"").should == [ "a", "b", "c" ]
@@ -32,23 +32,26 @@ describe "When working with Ranges, the Trxl::Calculator" do
32
32
  eval("'a' .. 'c'").should == [ "a", "b", "c" ]
33
33
  eval("'a'...'c'").should == [ "a", "b" ]
34
34
  eval("'a' ... 'c'").should == [ "a", "b" ]
35
-
35
+
36
36
  eval("'aa'..'aa'").should == [ "aa" ]
37
37
  eval("'aa'..'ac'").should == [ "aa", "ab", "ac" ]
38
38
  eval("'aa'...'ac'").should == [ "aa", "ab" ]
39
39
 
40
+ eval("'a'.. 'ac'").should == %w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac]
41
+ eval("'a'...'ac'").should == %w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab]
42
+
40
43
  eval("1..5 == [ 1, 2, 3, 4, 5 ]").should be_true
41
44
  eval("1...5 == [ 1, 2, 3, 4 ]").should be_true
42
-
45
+
43
46
  eval("SIZE(1..5)").should == 5
44
-
47
+
45
48
  eval("a..b == [ 1, 2 ]", { :a => 1, :b => 2 }).should be_true
46
49
  eval("a..c", { :a => 1, :b => nil, :c => 2 }).should == [ 1, 2]
47
-
50
+
48
51
  lambda { eval("a..b", { :a => nil, :b => nil }) }.should raise_error
49
-
52
+
50
53
  end
51
-
54
+
52
55
  it "should store ranges as arrays" do
53
56
  eval("a = 1..5; a;").should == [ 1, 2, 3, 4, 5 ]
54
57
  eval("a = 1 .. 5; a;").should == [ 1, 2, 3, 4, 5 ]
@@ -59,23 +62,3 @@ describe "When working with Ranges, the Trxl::Calculator" do
59
62
  end
60
63
 
61
64
  end
62
-
63
- describe "When working with Strings, the Trxl::Calculator" do
64
-
65
- include Trxl::SpecHelper
66
-
67
- before(:each) do
68
- @parser = Trxl::Calculator.new
69
- end
70
-
71
- it "should evaluate string literals to strings using double quotes (\"\")" do
72
- eval("\"Test String\"").should == "Test String"
73
- eval("s = \"Test String\"; s;").should == "Test String"
74
- end
75
-
76
- it "should evaluate string literals to strings using single quotes ('')" do
77
- eval("'Test String'").should == "Test String"
78
- eval("s = 'Test String'; s;").should == "Test String"
79
- end
80
-
81
- end
@@ -1,44 +1,44 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "For defining Trxl::StdLib, the Trxl::Calculator" do
4
-
4
+
5
5
  include Trxl::SpecHelper
6
-
6
+
7
7
  before(:each) do
8
8
  @parser = Trxl::Calculator.new
9
9
  end
10
-
10
+
11
11
  it "should be able to require trxl code snippets and merge them into the current env" do
12
12
  program = "require 'stdlib'"
13
13
  env_after_require = eval(program)
14
14
  env_after_require.should have_key(:foreach_in)
15
- env_after_require.should have_key(:_foreach_in_)
15
+ env_after_require.should have_key(:__foreach_in__)
16
16
  env_after_require.should have_key(:inject)
17
- env_after_require.should have_key(:_inject_)
17
+ env_after_require.should have_key(:__inject__)
18
18
  env_after_require.should have_key(:map)
19
19
  env_after_require.should have_key(:ratio)
20
20
  end
21
-
21
+
22
22
  it "should be able to require scoped trxl code snippets and merge them into the current env" do
23
23
  program = "require 'stdlib/foreach_in'"
24
24
  env_after_require = eval(program)
25
25
  env_after_require.should have_key(:foreach_in)
26
-
26
+
27
27
  program = "require 'stdlib/inject'"
28
28
  env_after_require = eval(program)
29
29
  env_after_require.should have_key(:inject)
30
30
  end
31
-
31
+
32
32
  it "should be able to require scoped trxl code snippets and merge them into the current env" do
33
33
  program = "require 'stdlib/foreach_in'"
34
34
  env_after_require = eval(program)
35
35
  env_after_require.should have_key(:foreach_in)
36
-
36
+
37
37
  program = "require 'stdlib/inject'"
38
38
  env_after_require = eval(program)
39
39
  env_after_require.should have_key(:inject)
40
40
  end
41
-
41
+
42
42
  it "should ignore a require statement if the library has already been loaded" do
43
43
  program = "require 'stdlib/inject'"
44
44
  program = "require 'stdlib/map'"
@@ -46,5 +46,5 @@ describe "For defining Trxl::StdLib, the Trxl::Calculator" do
46
46
  env_after_require.should have_key(:inject)
47
47
  env_after_require.should have_key(:map)
48
48
  end
49
-
49
+
50
50
  end
@@ -3,15 +3,25 @@ require 'spec_helper'
3
3
  describe "The Trxl::StdLib" do
4
4
 
5
5
  include Trxl::SpecHelper
6
-
6
+
7
7
  before(:each) do
8
8
  @parser = Trxl::Calculator.new
9
9
  end
10
-
10
+
11
11
  it "should be able to parse the whole Trxl::StdLib code" do
12
12
  lambda { parse(Trxl::Calculator.stdlib) }.should_not raise_error
13
13
  end
14
-
14
+
15
+ it "should define a foreach function that does not invoke the body function for empty enumerables" do
16
+ program = <<-PROGRAM
17
+ require 'stdlib/foreach_in';
18
+ test = [];
19
+ foreach_in([], fun(i) { test << i });
20
+ test;
21
+ PROGRAM
22
+ eval(program).should == []
23
+ end
24
+
15
25
  it "should define a foreach function with read access to the outer env" do
16
26
  program = <<-PROGRAM
17
27
  require 'stdlib/foreach_in';
@@ -19,20 +29,40 @@ describe "The Trxl::StdLib" do
19
29
  PROGRAM
20
30
  eval(program).should == 3
21
31
  end
22
-
32
+
23
33
  it "should define a foreach function with write access to the outer env" do
24
34
  program = <<-PROGRAM
25
35
  require 'stdlib/foreach_in';
26
36
  sum = 0;
27
37
  a = 1..10;
28
- foreach_in(a, fun(e) {
29
- sum = sum + e
38
+ foreach_in(a, fun(e) {
39
+ sum = sum + e
30
40
  });
31
41
  sum;
32
42
  PROGRAM
33
43
  eval(program).should == 55
34
44
  end
35
45
 
46
+ it "should define an inject function that returns the original memo for empty enumerables" do
47
+ program = <<-PROGRAM
48
+ require 'stdlib/inject';
49
+ inject(0, [], fun(memo, val) { memo + val });
50
+ PROGRAM
51
+ eval(program).should == 0
52
+
53
+ program = <<-PROGRAM
54
+ require 'stdlib/inject';
55
+ inject([], [], fun(memo, val) { memo << val });
56
+ PROGRAM
57
+ eval(program).should == []
58
+
59
+ program = <<-PROGRAM
60
+ require 'stdlib/inject';
61
+ inject({}, [], fun(memo, val) { memo[val] });
62
+ PROGRAM
63
+ eval(program).should == {}
64
+ end
65
+
36
66
  it "should define an inject function with read access to the outer env" do
37
67
  program = <<-PROGRAM
38
68
  require 'stdlib/inject';
@@ -48,12 +78,12 @@ describe "The Trxl::StdLib" do
48
78
  base = 0;
49
79
  positives = inject(0, values, fun(memo, val) {
50
80
  if(ENV[val] == "yes")
51
- base = base + 1;
81
+ base = base + 1;
52
82
  memo + 1
53
- elsif(ENV[val] == "no")
54
- base = base + 1;
83
+ elsif(ENV[val] == "no")
84
+ base = base + 1;
55
85
  memo
56
- else
86
+ else
57
87
  memo
58
88
  end
59
89
  });
@@ -61,7 +91,7 @@ describe "The Trxl::StdLib" do
61
91
  ROUND((ROUND(positives, 10) / base) * 100, 2)
62
92
  else
63
93
  0
64
- end
94
+ end
65
95
  };
66
96
  ratio('a'..'c');
67
97
  PROGRAM
@@ -124,34 +154,34 @@ describe "The Trxl::StdLib" do
124
154
 
125
155
  it "should define a 'ratio' function for any enumerable collection" do
126
156
  env = {
127
- :a => "Ja",
157
+ :a => "Ja",
128
158
  :b => "Ja",
129
159
  :c => "Ja",
130
160
  :d => "Ja"
131
161
  }
132
162
  req_stmt = "require 'stdlib/ratio';"
133
163
  eval("#{req_stmt} ratio('a'..'d', 'Ja', 'keine Angabe');", env).should == 100
134
-
164
+
135
165
  env = {
136
- :a => "Ja",
166
+ :a => "Ja",
137
167
  :b => "Ja",
138
168
  :c => "Nein",
139
169
  :d => "Nein"
140
170
  }
141
171
  req_stmt = "require 'stdlib/ratio';"
142
172
  eval("#{req_stmt} ratio('a'..'d', 'Ja', 'keine Angabe');", env).should == 50
143
-
173
+
144
174
  env = {
145
- :a => "Nein",
175
+ :a => "Nein",
146
176
  :b => "Nein",
147
177
  :c => "Nein",
148
178
  :d => "Nein"
149
179
  }
150
180
  req_stmt = "require 'stdlib/ratio';"
151
181
  eval("#{req_stmt} ratio('a'..'d', 'Ja', 'keine Angabe');", env).should == 0
152
-
182
+
153
183
  env = {
154
- :a => "Ja",
184
+ :a => "Ja",
155
185
  :b => "Nein",
156
186
  :c => "Nein",
157
187
  :d => "Nein",
@@ -159,13 +189,13 @@ describe "The Trxl::StdLib" do
159
189
  }
160
190
  req_stmt = "require 'stdlib/ratio';"
161
191
  eval("#{req_stmt} ratio('a'..'e', 'Ja', 'keine Angabe');", env).should == 25
162
-
192
+
163
193
  env = {
164
194
  :a => "keine Angabe"
165
195
  }
166
196
  req_stmt = "require 'stdlib/ratio';"
167
197
  eval("#{req_stmt} ratio(['a'], 'Ja', 'keine Angabe');", env).should be_nil
168
-
198
+
169
199
  env = {
170
200
  :a => "keine Angabe",
171
201
  :b => "keine Angabe",
@@ -173,14 +203,14 @@ describe "The Trxl::StdLib" do
173
203
  }
174
204
  req_stmt = "require 'stdlib/ratio';"
175
205
  eval("#{req_stmt} ratio('a'..'c', 'Ja', 'keine Angabe');", env).should be_nil
176
-
206
+
177
207
  env = {
178
208
  :a => "Ja",
179
209
  :b => "keine Angabe"
180
210
  }
181
211
  req_stmt = "require 'stdlib/ratio';"
182
212
  eval("#{req_stmt} ratio('a'..'b', 'Ja', 'keine Angabe');", env).should == 100
183
-
213
+
184
214
  env = {
185
215
  :a => "Nein",
186
216
  :b => "keine Angabe"
@@ -208,20 +238,20 @@ describe "The Trxl::StdLib" do
208
238
  in_groups_of(2, 1..4, fun(group) { SUM(group) });
209
239
  PROGRAM
210
240
  eval(program).should == [ 3, 7 ]
211
-
241
+
212
242
  program = <<-PROGRAM
213
243
  require 'stdlib/in_groups_of';
214
244
  in_groups_of(2, 'a'..'d', fun(group) { group });
215
245
  PROGRAM
216
246
  eval(program).should == [ [ 'a', 'b' ], [ 'c', 'd' ] ]
217
-
247
+
218
248
  env = Trxl::Environment.new({
219
- :a => {
220
- 1 => "Building 1",
221
- 2 => "Building 2",
222
- 3 => "Building 3"
249
+ :a => {
250
+ 1 => "Building 1",
251
+ 2 => "Building 2",
252
+ 3 => "Building 3"
223
253
  },
224
- :b => {
254
+ :b => {
225
255
  1 => "Feuerwehrgebäude",
226
256
  2 => "Schulgebäude",
227
257
  3 => "Wohngebäude"
@@ -244,14 +274,14 @@ describe "The Trxl::StdLib" do
244
274
  :r => { 1 => 100, 2 => 200, 3 => 300 },
245
275
  :s => { 1 => 100, 2 => 200, 3 => 300 },
246
276
  :t => { 1 => 100, 2 => 200, 3 => 300 },
247
- :u => {
277
+ :u => {
248
278
  1 => [ 15, 15, 15 ],
249
279
  1 => [ 20, 20, 20 ],
250
280
  1 => [ 30, 30, 30 ]
251
281
  }
252
282
  })
253
283
  end
254
-
284
+
255
285
  it "should allow recursive functions as accumulator in 'in_groups_of' function calls" do
256
286
  program = <<-PROGRAM
257
287
  require 'stdlib/inject';
@@ -264,15 +294,155 @@ describe "The Trxl::StdLib" do
264
294
  PROGRAM
265
295
  eval(program).should == [ 3, 7 ]
266
296
  end
267
-
297
+
298
+ it "should define a 'hash_values' function" do
299
+ program = <<-PROGRAM
300
+ require 'stdlib/hash_values';
301
+ hash_values(hash);
302
+ PROGRAM
303
+
304
+ eval(program, :hash => {}).should == []
305
+
306
+ eval(program, {
307
+ :hash => {
308
+ 1 => 100,
309
+ 2 => 200,
310
+ 3 => 300
311
+ }
312
+ }).should == [ 100, 200, 300 ]
313
+
314
+ eval(program, {
315
+ :hash => {
316
+ 1 => [ 100, 100, 100 ],
317
+ 2 => [ 200, 200, 200 ],
318
+ 3 => [ 300, 300, 300 ]
319
+ }
320
+ }).should == [
321
+ [ 100, 100, 100 ],
322
+ [ 200, 200, 200 ],
323
+ [ 300, 300, 300 ],
324
+ ]
325
+ end
326
+
327
+ it "should define a 'hash_range_values' function" do
328
+ program = <<-PROGRAM
329
+ require 'stdlib/hash_range_values';
330
+ hash_range_values('a'..'b');
331
+ PROGRAM
332
+
333
+ eval(program, {
334
+ :a => { 1 => 100 },
335
+ :b => { 2 => 200 }
336
+ }).should == [
337
+ [100],
338
+ [200]
339
+ ]
340
+
341
+ eval(program, {
342
+ :a => { 1 => [ 100, 100, 100 ], 2 => [ 200, 200, 200 ] },
343
+ :b => { 3 => [ 300, 300, 300 ], 4 => [ 400, 400, 400 ] }
344
+ }).should == [
345
+ [ [100, 100, 100], [ 200, 200, 200 ] ],
346
+ [ [300, 300, 300], [ 400, 400, 400 ] ]
347
+ ]
348
+ end
349
+
350
+ it "should define a 'hash_value_sum' function" do
351
+
352
+ program = <<-PROGRAM
353
+ require 'stdlib/hash_value_sum';
354
+ hash_value_sum(hash);
355
+ PROGRAM
356
+
357
+ eval(program, :hash => {}).should == 0
358
+
359
+ eval(program, {
360
+ :hash => {
361
+ 1 => 100,
362
+ 2 => 200,
363
+ 3 => 300
364
+ }
365
+ }).should == 600
366
+
367
+ eval(program, {
368
+ :hash => {
369
+ 1 => [ 100, 100, 100 ],
370
+ 2 => [ 200, 200, 200 ],
371
+ 3 => [ 300, 300, 300 ]
372
+ }
373
+ }).should == 1800
374
+ end
375
+
376
+ it "should define a 'avg_hash_value_sum' function" do
377
+
378
+ program = <<-PROGRAM
379
+ require 'stdlib/avg_hash_value_sum';
380
+ avg_hash_value_sum(hash);
381
+ PROGRAM
382
+
383
+ eval(program, :hash => {}).should == 0
384
+
385
+ eval(program, {
386
+ :hash => {
387
+ 1 => 100,
388
+ 2 => 200,
389
+ 3 => 300
390
+ }
391
+ }).should == 200
392
+
393
+ eval(program, {
394
+ :hash => {
395
+ 1 => [ 100, 110, 120 ],
396
+ 2 => [ 200, 210, 220 ],
397
+ 3 => [ 300, 310, 320 ]
398
+ }
399
+ }).should == 630
400
+ end
401
+
402
+ it "should define a 'hash_range_value_sum' function" do
403
+
404
+ program = <<-PROGRAM
405
+ require 'stdlib/hash_range_value_sum';
406
+ hash_range_value_sum('a'..'b');
407
+ PROGRAM
408
+
409
+ eval(program, {
410
+ :a => { 1 => 100 },
411
+ :b => { 2 => 200 }
412
+ }).should == 300
413
+
414
+ eval(program, {
415
+ :a => { 1 => [ 100, 100, 100 ] },
416
+ :b => { 2 => [ 200, 200, 200 ] }
417
+ }).should == 900
418
+ end
419
+
420
+ it "should define a 'avg_hash_range_value_sum' function" do
421
+
422
+ program = <<-PROGRAM
423
+ require 'stdlib/avg_hash_range_value_sum';
424
+ avg_hash_range_value_sum('a'..'b');
425
+ PROGRAM
426
+
427
+ eval(program, {
428
+ :a => { 1 => 100 },
429
+ :b => { 2 => 200 }
430
+ }).should == 300
431
+
432
+ eval(program, {
433
+ :a => { 1 => [ 100, 110, 120 ] },
434
+ :b => { 2 => [ 200, 210, 220 ] }
435
+ }).should == 320
436
+ end
437
+
268
438
  it "should define a 'sum_of_type' function" do
269
439
  env = {
270
440
  :types => {
271
- 1 => "Feuerwehrgebäude",
272
- 2 => "Schulgebäude",
441
+ 1 => "Feuerwehrgebäude",
442
+ 2 => "Schulgebäude",
273
443
  3 => "Sonstige",
274
444
  },
275
- :values => {
445
+ :values => {
276
446
  1 => [ 100, 100, 100 ],
277
447
  2 => [ 200, 200, 200 ],
278
448
  3 => [ 300, 300, 300 ]
@@ -283,15 +453,15 @@ describe "The Trxl::StdLib" do
283
453
  eval("#{req_stmt} sum_of_type('Schulgebäude', types, values);", env).should == 600
284
454
  eval("#{req_stmt} sum_of_type('Sonstige', types, values);", env).should == 900
285
455
  end
286
-
456
+
287
457
  it "should define a 'avg_sum_of_type' function" do
288
458
  env = {
289
459
  :types => {
290
- 1 => "Feuerwehrgebäude",
291
- 2 => "Schulgebäude",
460
+ 1 => "Feuerwehrgebäude",
461
+ 2 => "Schulgebäude",
292
462
  3 => "Sonstige",
293
463
  },
294
- :values => {
464
+ :values => {
295
465
  1 => [ 100, 100, 100 ],
296
466
  2 => [ 200, 200, 200 ],
297
467
  3 => [ 300, 300, 300 ]
@@ -302,20 +472,20 @@ describe "The Trxl::StdLib" do
302
472
  eval("#{req_stmt} avg_sum_of_type('Schulgebäude', types, values);", env).should == 200
303
473
  eval("#{req_stmt} avg_sum_of_type('Sonstige', types, values);", env).should == 300
304
474
  end
305
-
475
+
306
476
  it "should define a 'total_range_sum_of_type' function" do
307
477
  env = {
308
478
  :types => {
309
- 1 => "Feuerwehrgebäude",
310
- 2 => "Schulgebäude",
479
+ 1 => "Feuerwehrgebäude",
480
+ 2 => "Schulgebäude",
311
481
  3 => "Sonstige",
312
482
  },
313
- :a => {
483
+ :a => {
314
484
  1 => [ 100, 100, 100 ],
315
485
  2 => [ 200, 200, 200 ],
316
486
  3 => [ 300, 300, 300 ]
317
487
  },
318
- :b => {
488
+ :b => {
319
489
  1 => [ 100, 100, 100 ],
320
490
  2 => [ 200, 200, 200 ],
321
491
  3 => [ 300, 300, 300 ]
@@ -326,20 +496,20 @@ describe "The Trxl::StdLib" do
326
496
  eval("#{req_stmt} total_range_sum_of_type('Schulgebäude', types, 'a'..'b');", env).should == 1200
327
497
  eval("#{req_stmt} total_range_sum_of_type('Sonstige', types, 'a'..'b');", env).should == 1800
328
498
  end
329
-
499
+
330
500
  it "should define a 'avg_range_sum_of_type' function" do
331
501
  env = {
332
502
  :types => {
333
- 1 => "Feuerwehrgebäude",
334
- 2 => "Schulgebäude",
503
+ 1 => "Feuerwehrgebäude",
504
+ 2 => "Schulgebäude",
335
505
  3 => "Sonstige",
336
506
  },
337
- :a => {
507
+ :a => {
338
508
  1 => [ 100, 100, 100 ],
339
509
  2 => [ 200, 200, 200 ],
340
510
  3 => [ 300, 300, 300 ]
341
511
  },
342
- :b => {
512
+ :b => {
343
513
  1 => [ 100, 100, 100 ],
344
514
  2 => [ 200, 200, 200 ],
345
515
  3 => [ 300, 300, 300 ]
@@ -350,7 +520,28 @@ describe "The Trxl::StdLib" do
350
520
  eval("#{req_stmt} avg_range_sum_of_type('Schulgebäude', types, 'a'..'b');", env).should == 400
351
521
  eval("#{req_stmt} avg_range_sum_of_type('Sonstige', types, 'a'..'b');", env).should == 600
352
522
  end
353
-
523
+
524
+ it "should define a 'avg_range_sum' function" do
525
+
526
+ program = <<-PROGRAM
527
+ require 'stdlib/avg_range_sum';
528
+ avg_range_sum('a'..'c');
529
+ PROGRAM
530
+
531
+ eval(program, {
532
+ :a => [],
533
+ :b => [],
534
+ :c => []
535
+ }).should == 0
536
+
537
+ eval(program, {
538
+ :a => [100, 200, 300],
539
+ :b => [400, 500, 600],
540
+ :c => [700, 800, 900]
541
+ }).should == 1500
542
+
543
+ end
544
+
354
545
  it "should define a 'year_from_date' function" do
355
546
  req_stmt = "require 'stdlib/year_from_date';"
356
547
  eval("#{req_stmt} year_from_date('01/1999');").should == 1999
@@ -358,7 +549,7 @@ describe "The Trxl::StdLib" do
358
549
  eval("#{req_stmt} year_from_date('12/2008');").should == 2008
359
550
  eval("#{req_stmt} year_from_date('12/2008');").should == 2008
360
551
  end
361
-
552
+
362
553
  it "should define a 'month_from_date' function" do
363
554
  req_stmt = "require 'stdlib/month_from_date';"
364
555
  eval("#{req_stmt} month_from_date('01/1999');").should == 1
@@ -366,5 +557,5 @@ describe "The Trxl::StdLib" do
366
557
  eval("#{req_stmt} month_from_date('1/2008');").should == 1
367
558
  eval("#{req_stmt} month_from_date('12/2008');").should == 12
368
559
  end
369
-
560
+
370
561
  end