File: repeated_combination_spec.rb

package info (click to toggle)
ruby-immutable-ruby 0.1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,852 kB
  • sloc: ruby: 16,556; makefile: 4
file content (77 lines) | stat: -rw-r--r-- 2,608 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
require 'spec_helper'

describe Immutable::Vector do
  describe '#repeated_combination' do
    let(:vector) { V[1,2,3,4] }

    context 'with no block' do
      it 'returns an Enumerator' do
        vector.repeated_combination(2).class.should be(Enumerator)
      end
    end

    context 'with a block' do
      it 'returns self' do
        vector.repeated_combination(2) {}.should be(vector)
      end
    end

    context 'with a negative argument' do
      it 'yields nothing and returns self' do
        result = []
        vector.repeated_combination(-1) { |obj| result << obj }.should be(vector)
        result.should eql([])
      end
    end

    context 'with a zero argument' do
      it 'yields an empty array' do
        result = []
        vector.repeated_combination(0) { |obj| result << obj }
        result.should eql([[]])
      end
    end

    context 'with a argument of 1' do
      it 'yields each item in the vector, as single-item vectors' do
        result = []
        vector.repeated_combination(1) { |obj| result << obj }
        result.should eql([[1],[2],[3],[4]])
      end
    end

    context 'on an empty vector, with an argument greater than zero' do
      it 'yields nothing' do
        result = []
        V.empty.repeated_combination(1) { |obj| result << obj }
        result.should eql([])
      end
    end

    context 'with a positive argument, greater than 1' do
      it 'yields all combinations of the given size (where a single element can appear more than once in a row)' do
        vector.repeated_combination(2).to_a.should == [[1,1], [1,2], [1,3], [1,4], [2,2], [2,3], [2,4], [3,3], [3,4], [4,4]]
        vector.repeated_combination(3).to_a.should == [[1,1,1], [1,1,2], [1,1,3], [1,1,4],
          [1,2,2], [1,2,3], [1,2,4], [1,3,3], [1,3,4], [1,4,4], [2,2,2], [2,2,3],
          [2,2,4], [2,3,3], [2,3,4], [2,4,4], [3,3,3], [3,3,4], [3,4,4], [4,4,4]]
        V[1,2,3].repeated_combination(3).to_a.should == [[1,1,1], [1,1,2],
          [1,1,3], [1,2,2], [1,2,3], [1,3,3], [2,2,2], [2,2,3], [2,3,3], [3,3,3]]
      end
    end

    it 'leaves the original unmodified' do
      vector.repeated_combination(2) {}
      vector.should eql(V[1,2,3,4])
    end

    it 'behaves like Array#repeated_combination' do
      0.upto(5) do |comb_size|
        array = 10.times.map { rand(1000) }
        V.new(array).repeated_combination(comb_size).to_a.should == array.repeated_combination(comb_size).to_a
      end

      array = 18.times.map { rand(1000) }
      V.new(array).repeated_combination(2).to_a.should == array.repeated_combination(2).to_a
    end
  end
end