Add bin and edit workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s

This commit is contained in:
2026-09-16 13:11:16 -06:00
parent c8ac4fcae5
commit 4cee170d66
17576 changed files with 895740 additions and 2 deletions
@@ -0,0 +1,37 @@
require 'facets/array/arrange'
test_case Array do
method :rangify do
test 'Array of consecutive integers should return an array made up of a single range.' do
[1,2,3,4,5].rangify.assert == [1..5]
end
test 'Array of non-consecutive integers should return the original array.' do
[1,3,5,7].rangify.assert == [1,3,5,7]
end
test 'Array of ranges should return the correct ranges.' do
arr = [40..45, 1..3, 4..10, 20..30, 24..28, 42..50, 1..6, 1..3, 1..1]
arr.rangify.assert == [1..10, 20..30, 40..50]
end
test 'Array of ranges and integers should return the correct ranges.' do
arr = [99, 100, 1..3, 101, 4..5, 103, 10..19, 99, 20..20, 31, 32..33, 98, 97]
arr.rangify.assert == [1..5, 10..20, 31..33, 97..101, 103]
end
test 'Array of non-consecutive integers should return the correct ranges.' do
[1,2,3,6,7,8,10,15].rangify.assert == [1..3, 6..8, 10, 15]
end
test 'Element order should not affect the result.' do
[8, 1, 15, 2, 6, 3, 7, 10].rangify.assert == [1..3, 6..8, 10, 15]
end
test 'Duplicate elements should not affect the result.' do
[8, 1, 15, 2, 6, 3, 7, 10, 8, 15, 2, 3, 1, 2].rangify.assert == [1..3, 6..8, 10, 15]
end
end
end
@@ -0,0 +1,16 @@
require 'facets/array/average'
test_case Array do
method :average do
test 'Empty array returns nil' do
[].average.assert == nil
end
test 'Calculate average of array of numerical values' do
[1, 2, 3].average.assert == 2
[96, 35, 72, 30, 75, 33, 68, 13, 49, 71].average.assert == 54.2
[36, -67, -17, 85, -46, -64, -23, -13, 89, -47].average.assert == -6.7
[60.7829, 31.2622, 20.626, 78.8907, 61.5328].average.assert == 50.61892
end
end
end
@@ -0,0 +1,48 @@
covers 'facets/array/before'
test_case Array do
method :before do
setup do
@sequence = ['a', 'b', 'c']
end
test "returns the previous element" do
@sequence.before('b').assert == 'a'
@sequence.before('c').assert == 'b'
end
test "loops around from back to front" do
@sequence.before('a').assert == 'c'
end
test "non-member elements return nil" do
@sequence.before('d').assert == nil
end
end
method :after do
setup do
@sequence = ['a', 'b', 'c']
end
test "returns the following element" do
@sequence.after('a').assert == 'b'
@sequence.after('b').assert == 'c'
end
test "loops around from back to front" do
@sequence.after('c').assert == 'a'
end
test "non-member elements return nil" do
@sequence.after('d').assert == nil
end
end
end
@@ -0,0 +1,23 @@
covers 'facets/array/collapse'
test_case Array do
method :collapse do
test do
[1, nil, [1, 2], nil, [[3]]].collapse.assert == [1, 1, 2, 3]
end
end
method :collapse! do
test do
a = [1, nil, [1, 2], nil, [[3]]]
a.collapse!
a.assert == [1, 1, 2, 3]
end
end
end
@@ -0,0 +1,35 @@
covers 'facets/array/commonality'
test_case Array do
method :commonality do
test do
a = [1,2,2,3,3,3]
e = { 2 => [2,2], 3 => [3,3,3] }
r = a.commonality
r.assert == e
end
test "with block" do
a = [1,2,2,3,3,3]
e = {false=>[1, 2, 2], true=>[3, 3, 3]}
r = a.commonality{ |x| x > 2 }
r.assert == e
end
end
method :collisions do
test "alias for commonality" do
a = [1,2,2,3,3,3]
e = { 2 => [2,2], 3 => [3,3,3] }
r = a.collisions
r.assert == e
end
end
end
@@ -0,0 +1,50 @@
covers 'facets/array/conjoin'
test_case Array do
method :conjoin do
setup "any array" do
@a = [1,2,3,4]
end
test "like join but spaced" do
@a.conjoin.assert == "1 2 3 4"
end
test "comma+space and 'and' on tail" do
@a.conjoin(', ', ' and ').assert = "1, 2, 3 and 4"
end
test "comma+space and 'or' on tail using :last option" do
@a.conjoin(', ', :last => ' or ').assert == "1, 2, 3 or 4"
end
test "semicolon+space and ampersand on tail using index" do
@a.conjoin('; ', -1 => ' & ').assert == "1; 2; 3 & 4"
end
test "with block to determine separator" do
r = @a.conjoin{ |i, a, b| i % 2 == 0 ? '.' : '-' }
r.assert == "1.2-3.4"
end
test "very esoteric transformation" do
r = @a.conjoin{ |i, x, y| "<#{i} #{x} #{y}>" }
r.assert == "1<0 1 2>2<1 2 3>3<2 3 4>4"
end
test "with :space option" do
r = @a.conjoin(',', '&', :space=>2)
r.assert == "1 , 2 , 3 & 4"
end
test ":spacer option can set an alternate spacing string" do
r = @a.conjoin('|', '>', :space=>2, :spacer=>'-')
r.assert == "1--|--2--|--3-->--4"
end
end
end
@@ -0,0 +1,14 @@
covers 'facets/array/contains'
test_case Array do
method :contains? do
test do
[1,2,3,4].assert.contains?(2)
[1,2,3,4].refute.contains?(9)
end
end
end
@@ -0,0 +1,42 @@
covers 'facets/array/delete'
test_case Array do
method :delete_unless do
test do
a = [1,2,3]
a.delete_unless{ |e| e == 2 }
a.assert == [2]
end
end
method :delete_values do
test do
a = [1,2,3,4]
a.delete_values(1,2).assert == [1,2]
a.assert == [3,4]
end
end
method :delete_values_at do
test do
a = [1,2,3,4]
a.delete_values_at(1,2).assert == [2,3]
a.assert == [1,4]
end
test do
a = [1,2,3,4]
a.delete_values_at(0..2).assert == [1,2,3]
a.assert == [4]
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/delete_unless'
test_case Array do
method :delete_unless do
test 'with an explicit block' do
[1,2,3].delete_unless{ |x| x < 2 }.assert == [1]
end
test 'with an implicit block' do
[1,2,3].delete_unless(&:even?).assert == [2]
end
end
end
@@ -0,0 +1,31 @@
covers 'facets/array/delete_values'
test_case Array do
method :delete_values do
test do
a = [1,2,3,4]
a.delete_values(1,2).assert == [1,2]
a.assert == [3,4]
end
end
method :delete_values_at do
test do
a = [1,2,3,4]
a.delete_values_at(1,2).assert == [2,3]
a.assert == [1,4]
end
test do
a = [1,2,3,4]
a.delete_values_at(0..2).assert == [1,2,3]
a.assert == [4]
end
end
end
@@ -0,0 +1,24 @@
covers 'facets/array/divide'
test_case Array do
method :divide do
test do
r = ['a1','b1','a2','b2'].divide(/^a/)
r.assert == [['a1','b1'],['a2','b2']]
end
test do
r = ['a1','b1','a2','b2'].divide(/^b/)
r.assert == [['a1'],['b1', 'a2'],['b2']]
end
test do
r = ['a1','b1','a2','b2'].divide(/c/)
r.assert = [['a1','b1','a2','b2']]
end
end
end
@@ -0,0 +1,29 @@
covers 'facets/array/duplicates'
test_case Array do
method :duplicates do
test do
a = [1,1,2,2,3,4,5]
a.duplicates.sort.assert == [1,2]
end
test "with minimum" do
a = [0,1,2,3,4,5,
0,1,2,3,4,
0,1,2,3,
0,1,2,
0,1,
0]
(1..6).each do |m|
d = a.duplicates(m).sort
e = [*0..6-m]
d.assert == e
end
end
end
end
@@ -0,0 +1,31 @@
covers 'facets/array/each_overlap'
test_case Array do
method :each_overlap do
test do
a = [1,2,3,4,5]
r = []
a.each_overlap(2,1) { |x| r << x }
r.assert == [[1,2],[2,3],[3,4],[4,5]]
end
test do
a = [1,2,3,4,5,6,7]
r = []
a.each_overlap(3,1) { |x| r << x }
r.assert == [[1,2,3],[3,4,5],[5,6,7]]
end
test do
a = [1,2,3,4,5]
r = []
a.each_overlap(3,2) { |x| r << x }
r.assert == [[1,2,3],[2,3,4],[3,4,5]]
end
end
end
@@ -0,0 +1,16 @@
covers 'facets/array/each_pair'
test_case Array do
method :each_pair do
test do
result = {}
a = [:a,:b,:c,:d]
a.each_pair{|i,e| result[e] = i + 1}
result.assert == {a: 1, b: 2, c: 3, d: 4}
end
end
end
@@ -0,0 +1,16 @@
covers 'facets/array/each_value'
test_case Array do
method :each_value do
test do
a = [ "a", "b", "c" ]
out = ''
a.each_value {|x| out += "#{x} -- " }
out.assert == 'a -- b -- c -- '
end
end
end
@@ -0,0 +1,23 @@
covers 'facets/array/entropy'
test_case Array do
method :entropy do
test do
%w{ a b }.entropy.assert == 1.0
end
end
method :ideal_entropy do
test do
%w{ a b }.ideal_entropy.assert == 1.0
%w{ a a b b }.ideal_entropy.assert == 2.0
end
end
end
@@ -0,0 +1,28 @@
covers 'facets/array/extract_options'
test_case Array do
method :extract_options! do
test do
h = { :x=>1, :y=>1 }
a = [:a, :b, h]
a.extract_options!.assert == h
end
end
end
test_case Hash do
method :extractable_options? do
test do
h = { :x=>1, :y=>1 }
h.assert.extractable_options?
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/indexable'
test_case Array do
method :first! do
test "alias of shift" do
a = [1,2,3]
r = a.first!
r.assert == 1
a.assert == [2,3]
end
end
end
@@ -0,0 +1,42 @@
covers 'facets/array/from'
test_case Array do
method :from do
test do
%w{W o r l d}.from(3).assert == ['l', 'd']
%w{W o r l d}.from(8).assert == []
end
end
method :thru do
test do
[1, 2, 3, 4, 5].thru(2).assert == [1, 2, 3]
[1, 2, 3, 4, 5].thru(7).assert == [1, 2, 3, 4, 5]
end
test do
[1, 2, 3, 4, 5].thru(0, 2).assert == [1, 2, 3]
[1, 2, 3, 4, 5].thru(2, 4).assert == [3, 4, 5]
end
test do
[1, 2, 3, 4, 5].thru(3, 7).assert == [4, 5]
end
test do
[1, 2, 3, 4, 5].thru(6, 7).assert = []
end
end
end
@@ -0,0 +1,19 @@
require 'facets/array/intersection'
test_case Array do
method :intersection do
test { [1, 2].intersection.assert == nil }
test { [1..10, 11..20].intersection.assert == nil }
test { [1..10, 5..15, 11..20].intersection.assert == nil }
test { [8..8, 1..10, 10 ].intersection.assert == nil }
test { [10, 1..10].intersection.assert == 10 }
test { [1..10, 1].intersection.assert == 1 }
test { [1, 1].intersection.assert == 1 }
test { [1..10, 5, 5..8, 5..10 ].intersection.assert == 5 }
test { [1..10, 5..8, 5..10 ].intersection.assert == (5..8) }
test { [5..10, 1..10, 4..8 ].intersection.assert == (5..8) }
test { [5..10, 1..10, 4..20, 8].intersection.assert == 8 }
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/indexable'
test_case Array do
method :last! do
test "alias of pop" do
a = [1,2,3]
r = a.last!
r.assert == 3
a.assert == [1,2]
end
end
end
@@ -0,0 +1,27 @@
covers 'facets/array/median'
test_case Array do
method :median do
test "odd sized" do
r = %w{e a b c d}.median
r.assert == "c"
end
test "even sized" do
r = %w{f e a b c d}.median
r.assert == "d"
end
test "with positive offset" do
r = %w{e a b c d}.median(1)
r.assert == "d"
end
test "with negative offset" do
r = %w{e a b c d}.median(-1)
r.assert == "b"
end
end
end
@@ -0,0 +1,27 @@
covers 'facets/array/merge'
test_case Array do
method :merge do
test do
a = [1,2,3]
b = [3,4,5]
a.merge(b).assert == [1,2,3,4,5]
end
end
method :merge! do
test do
a = [1,2,3]
b = [3,4,5]
a.merge!(b)
a.assert == [1,2,3,4,5]
end
end
end
@@ -0,0 +1,12 @@
require 'facets/array/missing'
test_case Array do
method :missing do
test { [1,3..3].missing.assert == [2] }
test { [1..5,10..12].missing.assert == [6..9] }
test { [100, 9..11, 14, 1..5, 16, 10..12, 17..17].missing.assert == [6..8, 13, 15, 18..99] }
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/mode'
test_case Array do
method :mode do
test do
[1, 1, 2, 3].mode.assert == [1]
end
test do
[1, 1, 2, 2, 3].mode.sort.assert == [1,2]
end
end
end
@@ -0,0 +1,25 @@
covers 'facets/array/nonuniq'
test_case Array do
method :nonuniq do
test do
a = [1,1,2,2,3,4,5]
a.nonuniq.sort.assert == [1,2]
end
end
method :nonuniq! do
test do
a = [1,1,2,2,3,4,5]
a.nonuniq!
a.sort.assert == [1,2]
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/not_empty'
test_case Array do
method :not_empty? do
test do
[].refute.not_empty?
end
test do
[1,2].assert.not_empty?
end
end
end
@@ -0,0 +1,52 @@
covers 'facets/array/occur'
test_case Array do
method :occur do
test "set limit" do
a = [1,2,3,4,5,
2,3,4,5,
3,4,5,
4,5,
5]
(1..5).each do |m|
d = a.occur(m)
d.assert == [m]
end
end
test "range" do
a = %w{a b c d e
b c d e
c d e
d e
e}
a.occur(1..2).sort.assert == ['a','b']
a.occur(1..3).sort.assert == ['a','b','c']
a.occur(2..3).sort.assert == ['b','c']
end
test do
a = [:a,:b,:a]
a.occur(1).assert == [:b]
end
test do
a = [:a,:b,:a]
a.occur(2).assert == [:a]
end
test do
a = [:a,:b,:a]
a.occur(1..1).assert == [:b]
end
test do
a = [:a,:b,:a]
a.occur{ |n| n % 2 == 0 }.assert == [:a]
end
end
end
@@ -0,0 +1,20 @@
covers 'facets/array/occurrence'
test_case Array do
method :occurrence do
test "no arguments" do
r = [:a,:a,:b,:c,:c,:c].occurrence
r.assert == { :a => 2, :b => 1, :c => 3 }
end
test "with block" do
r = [2,2,3,4,4,4].occurrence{|i| i % 2}
r.assert == { 0 => 5, 1 => 1 }
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/only.rb'
test_case Array do
method :only do
test do
[5].only.assert == 5
[nil].only.assert == nil
expect(IndexError){ [].only }
expect(IndexError){ [1,2,3].only }
end
end
end
@@ -0,0 +1,13 @@
covers 'facets/array/op_pow'
test_case Array do
method :** do
test do
([1,2] ** [3,4]).assert == [[1, 3], [1, 4], [2, 3], [2, 4]]
end
end
end
@@ -0,0 +1,40 @@
covers 'facets/array/pad'
test_case Array do
method :pad do
test do
r = [0,1,2,3].pad(7,"x")
x = [0,1,2,3,"x","x","x"]
r.assert == x
end
test "negative index" do
r = [0,1,2,3].pad(-7,"n")
x = ["n","n","n",0,1,2,3]
r.assert == x
end
end
method :pad! do
test do
a = [0,1,2,3]
r = a.pad!(6,"y")
x = [0,1,2,3,"y","y"]
r.assert == x
end
test "negative index" do
a = [0,1,2,3]
r = a.pad!(-6,"q")
x = ["q","q",0,1,2,3]
r.assert == x
end
end
end
@@ -0,0 +1,28 @@
covers 'facets/array/pull'
test_case Array do
method :peek do
test do
a = [1,2,3]
a.peek.assert == 3
a.assert == [1,2,3]
end
test do
a = [1,2,3]
a.peek(1).assert == 2
a.assert == [1,2,3]
end
test do
a = [1,2,3]
a.peek(-1).assert == 1
a.assert == [1,2,3]
end
end
end
@@ -0,0 +1,21 @@
covers 'facets/array/pull'
test_case Array do
method :poke do
test do
a = [1,2,3]
a.poke(9)
a.assert == [9,1,2,3]
end
test do
a = [2,3]
a.poke(1).assert == [1,2,3]
a.poke(4).assert == [4,1,2,3]
end
end
end
@@ -0,0 +1,18 @@
covers 'facets/array/probability'
test_case Array do
method :probability do
test do
%w{a b}.probability.assert == {'a'=>0.5, 'b'=>0.5}
end
test do
%w{a a a b}.probability.assert == {'a'=>0.75, 'b'=>0.25}
end
end
end
@@ -0,0 +1,15 @@
covers 'facets/array/pull'
test_case Array do
method :pull do
test do
a = [1,2,3]
a.pull.assert == 1
a.assert == [2,3]
end
end
end
@@ -0,0 +1,40 @@
covers 'facets/array/recurse'
test_case Array do
method :recurse do
test do
a = ["a", ["b", "c", nil], nil]
r = a.recurse{|a| a.compact! }
r.assert ["a", ["b", "c"]]
end
test "with Hashes" do
require 'facets/hash/recurse'
objects = []
struct = [1, 2, {:a => 3, :b => [4, 5, {:c=>6}]}, [7, 8]]
struct.recurse(Array, Hash){|o| objects << o; o }
objects.assert.include?( [7, 8] )
objects.assert.include?( {:c=>6} )
objects.assert.include?( [4, 5, {:c=>6}] )
objects.assert.include?( {:a => 3, :b => [4, 5, {:c=>6}]} )
objects.assert.include?( struct )
objects.length.assert == 5
end
end
method :recurse! do
test do
a = ["a", ["b", "c", nil], nil]
a.recurse!{|a| a.compact! }
a.assert ["a", ["b", "c"]]
end
end
end
@@ -0,0 +1,33 @@
covers 'facets/array/recursively'
test_case Array do
method :recursively do
test "each" do
r = []
[1,2,['a','b']].recursively{ |v| v }.each{ |v| r << v }
r.assert == [1,2,'a','b']
end
test "map" do
a = [1,2,['a','b']]
r = a.recursively{ |v| v.reverse }.map{ |v| v.succ }
r.assert == [2,3,['c','b']]
end
test "map!" do
a = [1,2,['a','b']]
a.recursively{ |v| v }.map!{ |v| v.succ }
a.assert == [2,3,['b','c']]
end
test "with block" do
a = [1,2,['a','b', nil], nil]
r = a.recursively{ |v| v.compact }.map{ |v| v }.compact
r.assert == [1,2,['a','b']]
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/array/reject_values'
testcase Array do
method :reject_values do
test do
a = [1,2,3,4,5]
r = a.reject_values(2,4)
r.assert == [1,3,5]
a.assert = [1,2,3,4,5] # hasn't changed
end
end
end
@@ -0,0 +1,21 @@
covers 'facets/array/splice'
test_case Array do
method :splice do
test do
a = [1,2,3]
a.splice(1).assert == 2
a.assert == [1,3]
end
test do
a = [1,2,3]
a.splice(1,4).assert == 4
a.assert == [1,4,3]
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/array/split'
test_case Array do
method :split do
test do
['a','b','c'].split('b').assert == [['a'], ['c']]
end
test "empty" do
[].split('a').assert == []
end
test "same" do
['a'].split('a').assert == []
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/array/squeeze'
test_case Array do
method :squeeze! do
test 'default' do
a = [1,2,2,3,3,2,1]
a.squeeze!
a.assert == [1,2,3,2,1]
end
test 'with argument' do
a = [1,2,2,3,3,2,1]
a.squeeze!(*[3])
a.assert == [1,2,2,3,2,1]
end
end
end
@@ -0,0 +1,18 @@
require 'facets/array/standard_deviation'
test_case Array do
method :standard_deviation do
test 'Empty array returns nil' do
[].standard_deviation.assert == nil
end
test 'Calculate standard_deviation of array of numerical values' do
[1, 2, 3].standard_deviation.assert == 0.816496580927726
[96, 35, 72, 30, 75, 33, 68, 13, 49, 71].standard_deviation.assert == 24.69331893448104
[36, -67, -17, 85, -46, -64, -23, -13, 89, -47].standard_deviation.assert == 54.67183918618432
[60.7829, 31.2622, 20.626, 78.8907, 61.5328].standard_deviation.assert == 21.428815505053002
end
end
end
@@ -0,0 +1,28 @@
covers 'facets/array/step.rb'
test_case Array do
method :step do
test "iteration" do
a = [:a, :b, :c, :d]
r = []
a.step(2){ |e| r << e }
r.assert == [:b, :d]
end
test "conversion to array" do
a = [:a, :b, :c, :d]
a.step(1).to_a.assert == [:a, :b, :c, :d]
a.step(2).to_a.assert == [:b, :d]
a.step(3).to_a.assert == [:c]
a.step(5).to_a.assert == []
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/array/store'
test_case Array do
method :store do
test do
a = [1,2,3,4,5]
a.store(0, :A)
a.assert == [:A,2,3,4,5]
end
test do
a = [1,2,3,4,5]
a.store(-1, :Z)
a.assert == [1,2,3,4,:Z]
end
end
end
@@ -0,0 +1,14 @@
covers 'facets/array/to_h'
test_case Array do
method :to_h do
test do
arr = [[:a, 1], [:b, 2]]
arr.to_h.assert == {:a => 1, :b => 2}
end
end
end
@@ -0,0 +1,26 @@
covers 'facets/array/traverse'
test_case Array do
method :traverse do
test do
a = ["A", "B", ["X", "Y"]]
g = a.traverse{ |e| e.downcase }
g.assert == ["a", "b", ["x", "y"]]
end
end
method :traverse! do
test do
a = ["A", "B", ["X", "Y"]]
a.traverse!{ |e| e.downcase }
a.assert == ["a", "b", ["x", "y"]]
end
end
end
@@ -0,0 +1,24 @@
covers 'facets/array/uniq_by'
test_case Array do
method :uniq_by! do
test do
e = [-5, -4, -3, -2, -1, 0]
r = (-5..5).to_a
r.uniq_by!{ |i| i*i }
r.assert == e
end
test do
e = [5, 4, 3, 2, 1, 0]
r = (-5..5).to_a.reverse
r.uniq_by!{ |i| i*i }
r.assert == e
end
end
end
@@ -0,0 +1,23 @@
covers 'facets/array/unique_permutation'
test_case Array do
method :unique_permutation do
test 'example' do
[1,1,2,2,3].unique_permutation(2).to_a.assert == [
[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2]
]
end
test 'not eq permutation.to_a' do
[1,1,2,3].unique_permutation.to_a.assert != [1,1,2,3].permutation.to_a
end
test 'eq permutation.to_a.uniq' do
[1,1,2,3].unique_permutation.to_a.assert == [1,1,2,3].permutation.to_a.uniq
end
end
end
@@ -0,0 +1,17 @@
require 'facets/array/variance'
test_case Array do
method :variance do
test 'Empty array returns nil' do
[].variance.assert == nil
end
test 'Calculate variance of array of numerical values' do
[1, 2, 3].variance.assert == 0.6666666666666666
[96, 35, 72, 30, 75, 33, 68, 13, 49, 71].variance.assert == 609.76
[36, -67, -17, 85, -46, -64, -23, -13, 89, -47].variance.assert == 2989.0099999999993
[60.7829, 31.2622, 20.626, 78.8907, 61.5328].variance.assert == 459.1941339495999
end
end
end
@@ -0,0 +1,13 @@
covers 'facets/array/zip'
test_case Array do
method :zip do
test 'example' do
Array.zip([1,2], [3,4]).assert == [[1,3],[2,4]]
end
end
end
@@ -0,0 +1,69 @@
covers 'facets/binding/caller'
test_case Binding do
a = 1
b = 2
x = "hello"
bind = binding
line = __LINE__ # the line number must be updated if it moves
file = __FILE__ # why does it equal basename only?
method :__LINE__ do
test do
bind.__LINE__.assert == line - 1
end
end
method :__FILE__ do
test do
bind.__FILE__.assert == file
end
end
method :__DIR__ do
test do
bind.__DIR__.assert == File.dirname(file)
end
end
method :callstack do
test do
bind.callstack.assert.is_a?(Array)
end
end
method :call_stack do
test do
bind.call_stack.assert.is_a?(Array)
end
end
method :caller do
test do
Exception.refute.raised? do
bind.caller
end
end
end
method :__callee__ do
test do
alternate.__callee__.assert == :alternate
end
end
method :__method__ do
test do
alternate.__method__.assert == :alternate
end
end
# helper method
def alternate
binding
end
end
@@ -0,0 +1,18 @@
covers 'facets/binding/defined'
test_case Binding do
a = 1
b = 2
x = "hello"
bind = binding
method :defined? do
test do
bind.assert.defined?("x")
end
end
end
@@ -0,0 +1,24 @@
covers 'facets/binding/op'
test_case Binding do
a = 1
b = 2
x = "hello"
bind = binding
method :[] do
test do
bind["x"].assert == "hello"
end
end
method :[]= do
test do
bind["x"] = "goodbye"
bind["x"].assert == "goodbye"
end
end
end
@@ -0,0 +1,16 @@
covers 'facets/binding/self'
test_case Binding do
bind = binding
this = self
method :self do
test do
bind.self == this
end
end
end
@@ -0,0 +1,19 @@
covers 'facets/class/descendants'
test_case Class do
method :descendants do
a = Class.new
b = Class.new(a)
c = Class.new(b)
test do
a.descendants.assert.include?(b)
a.descendants.assert.include?(c)
end
end
end
@@ -0,0 +1,32 @@
covers 'facets/class/preallocate'
test_case Class do
method :preallocate do
setup do
@c = Class.new do
def f
"f"
end
end
@m = Module.new do
def f
'{' + super + '}'
end
end
end
test do
m = @m
@c.class_eval do
preallocate m
end
x = @c.new
x.f.assert == "{f}"
end
end
end
@@ -0,0 +1,20 @@
covers 'facets/class/subclasses'
test_case Class do
method :subclasses do
# class with a number of subclasses
c = Class.new
x = Class.new(c)
y = Class.new(c)
z = Class.new(c)
test do
c.subclasses == [x, y, z]
end
end
end
@@ -0,0 +1,16 @@
covers 'facets/class/to_proc'
test_case Class do
method :to_proc do
test do
person = Struct.new(:name)
people = ["joe"].map(&person)
people[0].name.assert == "joe"
end
end
end
@@ -0,0 +1,32 @@
covers 'facets/comparable/bound'
test_case Comparable do
method :bound do
test 'single argument' do
3.bound(4).assert == 4
4.bound(4).assert == 4
5.bound(4).assert == 5
end
test 'two arguments' do
4.bound(3,5).assert == 4
3.bound(3,5).assert == 3
5.bound(3,5).assert == 5
2.bound(3,5).assert == 3
6.bound(3,5).assert == 5
end
test 'on strings' do
'd'.bound('c','e').assert == 'd'
'c'.bound('c','e').assert == 'c'
'e'.bound('c','e').assert == 'e'
'b'.bound('c','e').assert == 'c'
'f'.bound('c','e').assert == 'e'
end
end
end
@@ -0,0 +1,36 @@
covers 'facets/comparable/cap'
test_case Comparable do
method :cap do
test do
3.cap(4).assert == 3
4.cap(4).assert == 4
5.cap(4).assert == 4
end
end
method :at_most do
test do
3.at_most(4).assert == 3
4.at_most(4).assert == 4
5.at_most(4).assert == 4
end
end
method :at_least do
test do
3.at_least(4).assert == 4
4.at_least(4).assert == 4
5.at_least(4).assert == 5
end
end
end
@@ -0,0 +1,31 @@
covers 'facets/comparable/clip'
test_case Comparable do
method :clip do
test 'single argument' do
3.clip(4).assert == 4
4.clip(4).assert == 4
5.clip(4).assert == 5
end
test 'two arguments' do
4.clip(3,5).assert == 4
3.clip(3,5).assert == 3
5.clip(3,5).assert == 5
2.clip(3,5).assert == 3
6.clip(3,5).assert == 5
end
test 'on strings' do
'd'.clip('c','e').assert == 'd'
'c'.clip('c','e').assert == 'c'
'e'.clip('c','e').assert == 'e'
'b'.clip('c','e').assert == 'c'
'f'.clip('c','e').assert == 'e'
end
end
end
@@ -0,0 +1,16 @@
covers 'facets/comparable/cmp'
test_case Comparable do
method :cmp do
test 'on integers' do
3.cmp(4).assert == -1
3.cmp(3).assert == 0
3.cmp(2).assert == 1
end
end
end
@@ -0,0 +1,61 @@
covers 'facets/comparable/op_get'
test_case Comparable do
class_method :[] do
test do
c = Class.new do
include Comparable[:a,:b]
attr_accessor :a, :b
def initialize(a,b)
@a=a; @b=b
end
end
a = [c.new(10,20),c.new(10,30)]
a.sort.assert == a
a = [c.new(10,30),c.new(10,20)]
a.sort.assert == a.reverse
a = [c.new(10,10),c.new(20,10)]
a.sort.assert == a
a = [c.new(20,10),c.new(10,10)]
a.sort.assert == a.reverse
a = [c.new(10,30),c.new(20,10)]
a.sort.assert == a
end
=begin
class_method :sort_on do
test do
c = Class.new
c.class_eval {
def initialize(a,b)
@a=a; @b=b
end
sort_on :a,:b
}
a = [c.new(10,20),c.new(10,30)]
assert_equal( a, a.sort )
a = [c.new(10,30),c.new(10,20)]
assert_equal( a.reverse, a.sort )
a = [c.new(10,10),c.new(20,10)]
assert_equal( a, a.sort )
a = [c.new(20,10),c.new(10,10)]
assert_equal( a.reverse, a.sort )
a = [c.new(10,30),c.new(20,10)]
assert_equal( a, a.sort )
end
end
=end
end
end
@@ -0,0 +1,194 @@
covers 'facets/denumerable'
covers 'facets/enumerable/defer'
#require 'facets/enumerable/take'
test_case Denumerable do
c = Class.new do
include Denumerable
def initialize(*a)
@a = a
end
def each(&blk)
@a.each(&blk)
end
def size; @a.size; end
end
method :map do
test do
o = c.new(1,2,3,4)
o.map.assert.is_a?(Denumerator)
o.map{ |x| x + 1 }.assert.is_a?(Denumerator)
o.map{ |x| x + 1 }.to_a.assert == [2,3,4,5]
end
end
method :collect do
test do
o = c.new(1,2,3,4)
o.collect.assert.is_a?(Denumerator)
o.collect{ |x| x + 1 }.assert.is_a?(Denumerator)
o.collect{ |x| x + 1 }.to_a.assert == [2,3,4,5]
end
end
method :select do
test do
o = c.new(1,2,3,4)
o.select.assert.is_a?(Denumerator)
o.select{ |x| x > 1 }.assert.is_a?(Denumerator)
o.select{ |x| x > 1 }.to_a.assert == [2,3,4]
end
end
method :find_all do
test do
o = c.new(1,2,3,4)
o.find_all.assert.is_a?(Denumerator)
o.find_all{ |x| x > 1 }.assert.is_a?(Denumerator)
o.find_all{ |x| x > 1 }.to_a.assert == [2,3,4]
end
end
method :reject do
test do
o = c.new(1,2,3,4)
o.reject.assert.is_a?(Denumerator)
o.reject{ |x| x > 1 }.assert.is_a?(Denumerator)
o.reject{ |x| x > 1 }.to_a.assert == [1]
end
end
method :skip do
test do
o = c.new(1,2,3,4)
o.skip(2).assert.is_a?(Denumerator)
o.skip(2).to_a.assert == [3,4]
end
end
method :take do
test do
o = c.new(1,2,3,4)
o.take(2).assert.is_a?(Denumerator)
o.take(2).to_a.assert == [1,2]
end
end
end
test_case Denumerator do
source = (1..1/0.0) # infinite Enumerable object
method :each do
test do
res = []
(1..5).defer.each { |i| res << i }
res.assert == [1,2,3,4,5]
end
end
method :take do
test do
d = source.defer
d.take(5).to_a.assert == [1,2,3,4,5]
end
end
method :inject do
test do
d = (1..5).defer
d = d.inject({}) { |h,v| h[v] = v*2; h }
d.assert == {1=>2,2=>4,3=>6,4=>8,5=>10}
end
# TODO: problem with break in proc
#test do
# d = (1..5).defer
# d = d.inject({}){ |h,v| h[v] = v*2; break h if v>=3; h }
# d.assert == {1=>2,2=>4,3=>6}
#end
end
method :max do
test do
d = source.defer
d.take(5).max.assert == 5
end
end
method :min do
test do
d = source.defer
d.take(5).min.assert == 1
end
end
method :sort_by do
test do
d = source.defer
d.take(5).sort_by{ |x| -x }.assert == [5,4,3,2,1]
end
end
method :map do
test do
d = source.defer
d.map{ |i| i*2 }.take(5).min.assert == 2
end
end
method :defer do
test do
d = source.defer.defer{ |out,i| out << i*2 }
d.take(5).to_a.assert == [2,4,6,8,10]
end
test "chain" do
d = source.defer { |out,i| out.yield(i) if i % 2 == 0 }.
defer { |out,i| out.yield(i + 100) }
d.take(5).to_a.assert == [102,104,106,108,110]
end
end
method :select do
test do
d = source.defer
d = d.select{ |i| i % 2 == 0 }
d.take(5).to_a.assert == [2,4,6,8,10]
end
end
method :find_all do
test do
d = source.defer
d = d.find_all{ |i| i % 2 == 0 }
d.take(5).to_a.assert == [2,4,6,8,10]
end
end
method :reject do
test do
d = source.defer
d = d.reject { |i| i % 3 == 0 }
d.take(5).to_a.assert == [1,2,4,5,7]
end
end
method :skip do
test do
d = source.defer
d = d.skip(20)
d.take(5).to_a.assert == [21,22,23,24,25]
end
end
#method :each_cons
# test do
# a = source.defer
# assert_equal [[1,2,3],[2,3,4],[3,4,5],[4,5,6]], a.each_cons(3).take(4)
# end
#end
end
@@ -0,0 +1,40 @@
covers 'facets/dir/ascend'
test_case Dir do
test_directory = 'test/core/dir'
class_method :ascend do
test do
c = []
Dir.ascend(test_directory) do |path|
c << path
end
rdir = test_directory
c.each do |d|
d.assert == rdir
rdir = File.dirname(rdir)
end
end
end
class_method :ascend do
test "exclude current" do
c = []
Dir.ascend(test_directory, false) do |path|
c << path
end
rdir = File.dirname(test_directory)
c.each do |d|
d.assert == rdir
rdir = File.dirname(rdir)
end
end
end
end
@@ -0,0 +1,24 @@
covers 'facets/dir/ascend'
test_case Dir do
test_directory = 'test/core/dir'
class_method :descend do
test do
c = []
Dir.descend(test_directory) do |path|
c << path
end
rdir = test_directory
c.reverse_each do |d|
d.assert == rdir
rdir = File.dirname(rdir)
end
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/dir/each_child'
test_case Dir do
test_directory = 'test'
method :each_child do
test do
c = []
d = Dir.new(test_directory)
d.each_child do |path|
c << path
end
d.close
(['core', 'standard'] - c).assert.empty?
end
end
end
@@ -0,0 +1,25 @@
covers 'facets/dir/multiglob'
test_case Dir do
class_method :multiglob do
test do
r = Dir.multiglob('test/c*').sort
r.assert.include?('test/core')
end
end
class_method :multiglob_r do
test do
r = Dir.multiglob_r('test').sort
r.assert.include?('test/core/dir')
r.assert.include?('test/core/dir/test_multiglob.rb')
end
end
end
@@ -0,0 +1,14 @@
covers 'facets/dir/parent'
test_case Dir do
class_method :parent? do
test do
Dir.assert.parent?("a/b/c", "a/b/c/d")
end
end
end
@@ -0,0 +1,26 @@
covers 'facets/dir/recurse'
test_case Dir do
class_method :recurse do
test do
r = Dir.recurse('test')
r.assert.include?('test/core/dir')
r.assert.include?('test/core/dir/test_recurse.rb')
end
end
class_method :ls_r do
test do
r = Dir.ls_r('test')
r.assert.include?('test/core/dir')
r.assert.include?('test/core/dir/test_recurse.rb')
end
end
end
@@ -0,0 +1,44 @@
covers 'facets/enumerable/accumulate'
test_case Enumerable do
method :accumulate do
test do
a = [1,2,3]
a.accumulate.succ.assert == [2,3,4]
end
test do
a = [{:ab=>1},{22=>:c}]
a.accumulate.values_at(:ab,22).assert == [1,nil,:c]
end
test "chained twice" do
a = [1,2,3]
a.accumulate(2).succ.to_s.assert == ['2','3','4']
end
test "chained three times" do
a = [{:ab=>1},{22=>:c}]
a.accumulate(3).keys.to_s.split(//).assert == ['a', 'b', '2']
end
test "empty receiver" do
a = []
a.accumulate.succ.assert == []
end
end
method :accumulate_all do
test "not uniq entries" do
a = [{:ab=>1},{22=>:c}]
a.accumulate_all(3).keys.to_s.split(//).assert == ['a', 'b', '2', '2']
end
end
end
@@ -0,0 +1,36 @@
covers 'facets/enumerable/cluster'
test_case Enumerable do
method :cluster do
test "on an array" do
a = [0, 2, 3, 5, 6, 6, 7, 13]
e = [[0, 2], [3, 5], [6, 6], [7, 13]]
r = a.cluster{ |x| x % 2 }
r.assert == e
end
test "on an array of strings" do
a = ["dog", "duck", "cat", "dude"]
e = [["dog", "duck"], ["cat"], ["dude"]]
r = a.cluster{ |x| x[0] }
r.assert == e
end
test "on a hash" do
h = {0=>0, 1=>2, 2=>4, 3=>6, 4=>8, 5=>1, 6=>3, 7=>5, 8=>7, 9=>9}
e = [[[0, 0], [1, 2], [2, 4], [3, 6], [4, 8]], [[5, 1], [6, 3], [7, 5], [8, 7], [9, 9]]]
r = h.cluster{ |k, v| v % 2 }.each{|a| a.sort!}
r.assert == e
end
test "on an empty array" do
r = [].cluster{ |a| a }
r.assert == []
end
end
end
@@ -0,0 +1,32 @@
covers 'facets/enumerable/compact_map'
test_case Enumerable do
method :compact_map do
test do
r = [1,2,nil,4].compact_map { |e| e }
r.assert == [1,2,4]
end
end
method :compact_collect do
test do
r = [1,2,nil,4].compact_collect { |e| e }
r.assert == [1,2,4]
end
end
#method :filter_collect do
# e = [3,4]
# a = [1,2,3,4].filter_collect { |n|
# throw(:skip) if n < 3
# n
# }
# assert_equal( e, a )
#end
end
@@ -0,0 +1,27 @@
covers 'facets/enumerable/defer'
test_case Enumerable do
method :defer do
source = (1...1/0.0)
test do
Denumerator.assert === [1,2,3,4].defer
end
test "without block" do
a = source.defer
a.class.assert == Denumerator
a.take(5).to_a.assert == [1,2,3,4,5]
end
test "with block" do
a = source.defer { |out,i| out << i*2 }
a.class.assert == Denumerator
a.take(5).to_a.assert == [2,4,6,8,10]
end
end
end
@@ -0,0 +1,49 @@
covers 'facets/enumerable/each_by'
test_case Enumerable do
method :each_by do
test "infer groups of two" do
e = [[1,2], [3,4], [5,6]]
a = [1,2,3,4,5,6]
r = []
a.each_by{ |a,b| r << [a,b] }
r.assert == e
end
test "infer groups of three" do
e = [[1,2,3],[4,5,nil]]
a = [1,2,3,4,5]
r = []
a.each_by{ |a,b,c| r << [a,b,c] }
r.assert == e
end
test "specify groups of two" do
e = [[1,2],[3,4]]
a = [1,2,3,4]
r = []
a.each_by(2){ |a,b| r << [a,b] }
r.assert == e
end
test "specify groups of three with splat argument" do
e = [ [[1,2,3]], [[4,5,6]] ]
a = [1,2,3,4,5,6]
r = []
a.each_by(3){ |*a| r << a }
r.assert == e
end
test "specify groups of four with splat argument" do
e = [ [[1,2,3,4]], [[5,6,7,8]] ]
a = [1,2,3,4,5,6,7,8]
r = []
a.each_by(4){ |*a| r << a }
r.assert == e
end
end
end
@@ -0,0 +1,33 @@
covers 'facets/enumerable/every'
test_case Enumerable do
method :every do
test do
a = [1,2,3]
(a.every + 3 ).assert == [4,5,6]
(a.every - 1).assert == [0,1,2]
(a.every.to_s).assert == ['1','2','3']
end
test "on Enumerator" do
e = [1,2,3].to_enum(:map)
r = e.every + 3
r.assert == [4,5,6]
end
end
method :every! do
test do
a = [1,2,3]
a.every! + 3
a.assert == [4,5,6]
end
end
end
@@ -0,0 +1,30 @@
covers 'facets/enumerable/ewise'
test_case Enumerable do
method :ewise do
test do
a = [1,2,3]
(a.ewise + 3).assert == [4,5,6]
(a.ewise + [4,5]).assert == [5,7]
(a.ewise.+([4,5],2)).assert == [[5,7],[3,4,5]]
(a.ewise.+([4,5],3)).assert == [[5,7],[4,5,6]]
end
end
method :elementwise do
test do
a = [1,2,3]
(a.elementwise + 3).assert == [4,5,6]
(a.elementwise + [4,5]).assert == [5,7]
(a.elementwise.+([4,5],2)).assert == [[5,7],[3,4,5]]
(a.elementwise.+([4,5],3)).assert == [[5,7],[4,5,6]]
end
end
end
@@ -0,0 +1,15 @@
covers 'facets/enumerable/exclude'
test_case Enumerable do
method :exclude? do
test do
a = [1,2,2,3]
a.refute.exclude?(2)
a.assert.exclude?(4)
end
end
end
@@ -0,0 +1,15 @@
covers 'facets/enumerable/expand'
test_case Enumerable do
method :expand do
test do
a = [1,2,2,[1,2]]
r = a.expand
r == [1,2,2,1,2]
end
end
end
@@ -0,0 +1,19 @@
covers 'facets/enumerable/filter'
test_case Enumerable do
method :filter do
test do
x = (1..10000)
x = x.filter{ |out,i| out << i if i % 2 == 0 } # like select
x = x.filter{ |out,i| out << i + 100 } # like map
x = x.take(3)
x.assert == [102, 104, 106]
end
end
end
@@ -0,0 +1,96 @@
covers 'facets/enumerable/find_yield'
test_case Enumerable do
method :find_yield do
test "a value" do
r = [true].find_yield { |value| value }
r.assert == true
end
test "detects correct value" do
r = [1].find_yield { |value| value }
r.assert == 1
end
test "returns value of block" do
r = [1].find_yield { |v| v + 3 }
r.assert == 4
end
test "detects first truthy value" do
r = [false, false, 1].find_yield { |value| value }
r.assert == 1
end
test "returns value when block is true" do
r = [false].find_yield { |value| true }
r.assert == true
end
test "returns early when block is true" do
v1 = lambda { :something }
v2 = lambda { raise "This shouldn't be called" }
r = [v1, v2].find_yield { |obj| obj.call }
r.assert == :something
end
test "returns nil when block returns false for all elements" do
r = [1,2,3,4].find_yield { |value| false }
r.assert == nil
end
test "returns nil when no elements in collection" do
r = [].find_yield { |v| }
r.assert == nil
end
test "can have return value specified when block isnt true" do
r = [1,2,3].find_yield(:a_value){ |value| false }
r.assert == :a_value
end
test "documentation correct" do
obj1, obj2 = Object.new, Object.new
class << obj1
def foo?
false
end
def foo
raise
end
end
class << obj2
def foo?
true
end
def foo
"a value"
end
end
obj1.foo?.assert == false
obj2.foo?.assert == true
obj2.foo.assert == "a value"
result = [obj1, obj2].find_yield { |obj| obj.foo if obj.foo? }
result.assert == "a value"
end
end
method :map_detect do
test "old alias for #find_yield" do
r = [true].map_detect{ |value| value }
r.assert == true
end
end
end
@@ -0,0 +1,15 @@
covers 'facets/enumerable/frequency'
test_case Enumerable do
method :frequency do
test do
%w{a b}.frequency.assert == {'a'=>1,'b'=>1}
%w{a a b}.frequency.assert == {'a'=>2,'b'=>1}
end
end
end
@@ -0,0 +1,42 @@
covers 'facets/enumerable/graph'
test_case Enumerable do
method :graph do
test "returns hash" do
a = { :a => 1, :b => 2, :c => 3 }
e = { :a => 2, :b => 3, :c => 4 }
r = a.graph{ |k,v| {k => v+1} }
r.assert == e
end
test "hash of array" do
a = { :a => [1,2], :b => [2,3], :c => [3,4] }
e = { :a => 2, :b => 6, :c => 12 }
r = a.graph{ |k,v| [k, v[0]*v[1] ] }
r.assert == e
end
test "array of array" do
a = [ [1,2], [2,3], [3,4] ]
e = { [1,2] => 2, [2,3] => 6, [3,4] => 12 }
r = a.graph{ |a| [a, a[0]*a[1] ] }
r.assert == e
end
test "squares" do
numbers = (1..3)
squares = numbers.graph{ |n| [n, n*n] }
squares.assert == {1=>1, 2=>4, 3=>9}
end
test "roots" do
numbers = (1..3)
sq_roots = numbers.graph{ |n| [n*n, n] }
sq_roots.assert == {1=>1, 4=>2, 9=>3}
end
end
end
@@ -0,0 +1,113 @@
covers 'facets/enumerable/hashify'
test_case Enumerable do
method :hashify do
test do
a = [ [:a,1], [:b,2] ]
a.hashify.class.assert == Enumerable::Hashifier
end
end
end
test_case Enumerable::Hashifier do
method :splat do
test do
a = [1,2,3,4]
h = Enumerable::Hashifier.new(a)
h.splat.assert == {1 => 2, 3 => 4}
end
test do
a = [1,2,3,4,5]
h = Enumerable::Hashifier.new(a)
h.splat.assert == {1 => 2, 3 => 4, 5=> nil}
end
test do
a = 1..5
h = Enumerable::Hashifier.new(a)
h.splat.assert == {1 => 2, 3 => 4, 5=> nil}
end
end
method :flat do
test do
a = [:a,1,[:b,2,:c],4]
h = Enumerable::Hashifier.new(a)
h.flat.assert == {a: 1, b: 2, c: 4}
end
test do
a = [:a,1,[:b,2,:c]]
h = Enumerable::Hashifier.new(a)
h.flat.assert == {a: 1, b: 2, c: nil}
end
test do
require 'set'
a = Set.new([:a, 1, [:b, 2, :c]])
h = Enumerable::Hashifier.new(a)
h.flat.assert == {a: 1, b: 2, c: nil}
end
end
method :associate do
test do
a = [ [:a,1,2], [:b,2], [:c], [:d] ]
a.hashify.associate.assert == { :a=>[1,2], :b=>[2], :c=>[], :d=>[] }
end
test do
a = [ :x, [:x], [:x,1,2], [:x,3], [:x,4] ]
a.hashify.associate.assert == { :x=>[4] }
end
end
method :merge do
test do
a = [ [:a,1,2], [:b,2], [:c], [:d] ]
a.hashify.merge.assert == { :a=>1, :b=>2, :c=>nil, :d=>nil }
end
test do
a = [ :x, [:x], [:x,1,2], [:x,3], [:x,4] ]
a.hashify.merge.assert == { :x=>4 }
end
end
method :concat do
test do
a = [ [:a,1,2], [:b,2], [:c], [:d] ]
a.hashify.concat.assert == { :a=>[1,2], :b=>[2], :c=>[], :d=>[] }
end
test do
a = [ [:a,1,2], [:a,3], [:a,4], [:a], :a ]
a.hashify.concat.assert == { :a=>[1,2,3,4] }
end
end
method :by_index do
test do
[:a,:b,:c].hashify.by_index.assert == {0=>:a, 1=>:b, 2=>:c}
end
end
method :auto do
test do
a = [ [:a,1], [:b,2] ]
a.hashify.auto.assert == { :a=>1, :b=>2 }
end
test do
a = [ [:a,1,2], [:b,2], [:c], [:d] ]
a.hashify.auto.assert == { :a=>[1,2], :b=>[2], :c=>[], :d=>[] }
end
test do
a = [ [:a,1,2], 2, :b, [:c,3], 9 ]
a.hashify.auto.assert =={ [:a,1,2]=>2, :b=>[:c,3], 9=>nil }
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/enumerable/key_by'
test_case Enumerable do
method :key_by do
test do
a = [:a,:b,:c]
r = a.key_by{ |v| v.to_s }
r.assert == {'a'=>:a, 'b'=>:b, 'c'=>:c}
end
# Is this how it should behave?
test "works with a hash" do
h = {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2}
r = h.key_by{ |k,v| k }
r.assert == {"A"=>["A",1], "B"=>["B",1], "C"=>["C",1], "D"=>["D",2], "E"=>["E",2]}
end
end
end
@@ -0,0 +1,27 @@
covers 'facets/enumerable/map_by'
test_case Enumerable do
method :map_by do
test do
a = [1,2,3,4,5]
r = a.map_by{ |e| [e % 2, e + 1] }
r.assert == { 0=>[3,5], 1=>[2,4,6] }
end
test "works well with a hash" do
h = {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2}
r = h.map_by{ |k,v| [v, k.downcase] }
r.assert == {1=>["a", "b", "c"], 2=>["d", "e"]}
end
test "if only a scalar is returned, #map_by acts like #group_by" do
h = {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2}
r = h.map_by{ |k,v| v }
r.assert == {1=>[["A",1], ["B",1], ["C",1]], 2=>[["D",2], ["E",2]]}
end
end
end
@@ -0,0 +1,26 @@
covers 'facets/enumerable/map_send'
test_case Enumerable do
method :map_send do
test do
[1,2,3].map_send(:+, 3).assert == [4,5,6]
end
end
#method :map_send do
# test do
# r = [1,2,3].map_send(:+, 1)
# assert_equal(r, [2,3,4])
# end
#
# test "with_block" do
# r = [1,2,3].map_send(:+,1){ |x| x + 1 }
# assert_equal(r, [3,4,5])
# end
#end
end
@@ -0,0 +1,23 @@
covers 'facets/enumerable/map_with_index'
test_case Enumerable do
method :map_with_index do
test do
a = [1,2,3].map_with_index{ |e,i| e*i }
a.assert == [0,2,6]
end
end
method :collect_with_index do
test do
a = [1,2,3].collect_with_index{ |e,i| e*i }
a.assert == [0,2,6]
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/enumerable/mash'
test_case Enumerable do
method :mash do
test "is an alias for #graph" do
a = { :a => 1, :b => 2, :c => 3 }
e = { :a => 2, :b => 3, :c => 4 }
r = a.mash{ |k,v| {k => v+1} }
r.assert == e
end
end
end
@@ -0,0 +1,17 @@
covers 'facets/enumerable/modulate'
test_case Enumerable do
method :modulate do
test do
a = [2,4,6,8]
r = a.modulate(2)
x = [[2,6],[4,8]]
r.assert == x
end
end
end
@@ -0,0 +1,40 @@
covers 'facets/enumerable/occur'
test_case Enumerable do
method :occur do
# make an Enumerable class to test
eC = Class.new do
include Enumerable
def initialize(*a)
@a = a
end
def each(&b)
@a.each(&b)
end
end
test do
e = eC.new(:a,:b,:a)
e.occur(1).assert == [:b]
end
test do
e = eC.new(:a,:b,:a)
e.occur(2).assert == [:a]
end
test do
e = eC.new(:a,:b,:a)
e.occur(1..1).assert == [:b]
end
test do
e = eC.new(:a,:b,:a)
e.occur{ |n| n % 2 == 0 }.assert == [:a]
end
end
end
@@ -0,0 +1,40 @@
covers 'facets/enumerable/only'
test_case Enumerable do
# make an Enumerable class to test
eC = Class.new do
include Enumerable
def initialize(*a)
@a = a
end
def each(&b)
@a.each(&b)
end
end
method :only? do
test do
e = eC.new(false)
assert e.only?
end
test do
e = eC.new(1)
assert e.only?
end
test do
e = eC.new(false, false)
refute e.only?
end
test do
e = eC.new()
refute e.only?
end
end
end
@@ -0,0 +1,19 @@
covers 'facets/enumerable/per'
test_case Enumerable do
method :per do
test "map" do
e = [1,2,3].per.map
(e + 3).assert == [4,5,6]
(e - 1).assert == [0,1,2]
e.to_s.assert == ['1','2','3']
end
end
end
@@ -0,0 +1,22 @@
covers 'facets/enumerable/purge'
test_case Enumerable do
method :purge do
test do
[1, nil, 2].purge.assert == [1,2]
end
test "with trash arguments" do
(1..6).purge(3,4).assert == [1,2,5,6]
end
test "with block" do
(1..6).purge(0){ |n| n % 2 }.assert == [1,3,5]
(1..6).purge(1){ |n| n % 2 }.assert == [2,4,6]
end
end
end
@@ -0,0 +1,33 @@
covers 'facets/enumerable/recursively'
test_case Enumerable do
method :recursively do
c = Class.new do
include Enumerable
def initialize(ary)
@ary = ary
end
def each(&b)
@ary.each(&b)
end
end
test "each" do
e = c.new [1,2,['a','b']]
a = []
e.recursively(Enumerable).each{ |v| a << v }
a.assert == [1,2,'a','b']
end
test "map" do
e = c.new [1,2,['a','b']]
a = e.recursively(Enumerable).map{ |v| v.succ }
a.assert == [2,3,['b','c']]
end
end
end
@@ -0,0 +1,35 @@
covers 'facets/enumerable/squeeze'
test_case Enumerable do
method :squeeze do
# make an Enumerable class to test
eC = Class.new do
include Enumerable
def initialize(*a)
@a = a
end
def each(&b)
@a.each(&b)
end
end
test 'example (default)' do
e = eC.new(1,2,2,3,3,2,1)
e.squeeze.assert == [1,2,3,2,1]
end
test 'sort.squeeze eq uniq (default)' do
e = eC.new(1,2,2,3,3,2,1)
e.sort.squeeze.assert == [1,2,3]
end
test 'example (with argument)' do
e = eC.new(1,2,2,3,3,2,1)
e.squeeze(*[3]).assert == [1,2,2,3,2,1]
end
end
end
@@ -0,0 +1,40 @@
covers 'facets/enumerable/sum'
test_case Enumerable do
method :sum do
test do
[1,2,3].sum.assert == 6
end
test 'with block' do
a = [1.0, 2.1, 3.2].sum(&:to_i)
a.assert == 6
end
test 'with identity' do
a = [].sum(9)
a.assert == 9
a = [1].sum(9)
a.assert == 10
end
test 'with identity and block' do
# notice identity is not effected by the block
a = [].sum(9.1, &:to_i)
a.assert == 9.1
a = [1.1].sum(9.1, &:to_i)
a.assert == 10.1
end
test 'with non-numeral addition' do
a = [[1],[2],[3]].sum([])
a.assert == [1,2,3]
end
end
end
@@ -0,0 +1,25 @@
covers 'facets/enumerable/uniq_by'
test_case Enumerable do
method :uniq_by do
test do
e = [-5, -4, -3, -2, -1, 0]
r = (-5..5).to_a.uniq_by{ |i| i*i }
r.assert == e
end
end
#method :uniq_by! do
# test do
# e = [-5, -4, -3, -2, -1, 0]
# r = (-5..5).to_a
# r.uniq_by!{ |i| i*i }
# r.assert == e
# end
#end
end
@@ -0,0 +1,14 @@
covers 'facets/enumerable/visit'
test_case Enumerable do
method :visit do
test do
r = [1, 2, 8..9].visit{ |x| x.succ }
r.assert == [2, 3, [9, 10]]
end
end
end

Some files were not shown because too many files have changed in this diff Show More