mendel 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,74 @@
1
+ require_relative "../../spec_helper"
2
+ require "mendel"
3
+ require "mendel/observable_combiner"
4
+ require "mendel/visualizers/base"
5
+
6
+ describe Mendel::Visualizers::Base do
7
+
8
+ let(:klass) { described_class }
9
+ let(:combiner_class) {
10
+ Class.new(Mendel::ObservableCombiner) do
11
+ def score_combination(items)
12
+ items.reduce(0) { |sum, item| sum += item }
13
+ end
14
+ end
15
+ }
16
+
17
+ let(:combiner) { combiner_class.new(list1, list2) }
18
+ let(:list1) { (1..10).to_a }
19
+ let(:list2) { (1..10).map {|i| i + 0.1} }
20
+
21
+ describe "initialization" do
22
+
23
+ it "adds itself to the observers of the combiner" do
24
+ expect(combiner).to receive(:add_observer)
25
+ klass.new(combiner)
26
+ end
27
+
28
+ it "requires the combiner to have exactly 2 lists" do
29
+ expect{klass.new(combiner)}.not_to raise_error
30
+ expect{klass.new(combiner_class.new([1], [2], [3]))}.to raise_error(klass.const_get('InvalidListCount'))
31
+ expect{klass.new(combiner_class.new([1]))}.to raise_error(klass.const_get('InvalidListCount'))
32
+ end
33
+
34
+ it "limits list length" do
35
+ over = klass.max_list_length + 10
36
+ expect{klass.new(combiner_class.new([1], (1..over).to_a))}.to raise_error(klass.const_get('ListsTooLarge'))
37
+ end
38
+
39
+ end
40
+
41
+ describe "after initialization" do
42
+
43
+ let!(:visualizer) { klass.new(combiner) }
44
+
45
+ describe "keeping a grid of state" do
46
+
47
+ it "starts everything as unscored" do
48
+ expect(visualizer.grid).to eq(
49
+ Array.new(list2.size, Array.new(list1.size, [:unscored]))
50
+ )
51
+ end
52
+
53
+ describe "handling notifications when a combination is returned" do
54
+
55
+ before :each do
56
+ combiner.take(1)
57
+ end
58
+
59
+ it "remembers which item was returned" do
60
+ expect(visualizer.grid[0][0]).to match_array([:returned, a_kind_of(Numeric)])
61
+ end
62
+
63
+ it "remembers which items were scored" do
64
+ expect(visualizer.grid[1][0]).to match_array([:scored, a_kind_of(Numeric)])
65
+ expect(visualizer.grid[0][1]).to match_array([:scored, a_kind_of(Numeric)])
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+
74
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mendel
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Long
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: PriorityQueue
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: colorize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.7.7
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.7
97
+ description: Mendel breeds the best combinations of N lists without building all possible
98
+ combinations.
99
+ email:
100
+ - nathanmlong@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".ruby-version"
108
+ - Gemfile
109
+ - LICENSE.txt
110
+ - README.md
111
+ - Rakefile
112
+ - TODO.md
113
+ - benchmark/addition_combiner.rb
114
+ - benchmark/benchmarker.rb
115
+ - benchmark/graph.rb
116
+ - benchmark/run_six_lists.rb
117
+ - benchmark/run_two_lists.rb
118
+ - benchmark/simple.rb
119
+ - lib/mendel.rb
120
+ - lib/mendel/combiner.rb
121
+ - lib/mendel/min_priority_queue.rb
122
+ - lib/mendel/observable_combiner.rb
123
+ - lib/mendel/version.rb
124
+ - lib/mendel/visualizers/ascii.rb
125
+ - lib/mendel/visualizers/base.rb
126
+ - mendel.gemspec
127
+ - spec/fixtures/example_input.rb
128
+ - spec/fixtures/example_output/different_lengths.rb
129
+ - spec/fixtures/example_output/inc_integers_w_inc_decimals.rb
130
+ - spec/fixtures/example_output/inc_integers_w_repeats.rb
131
+ - spec/fixtures/example_output/inc_integers_w_repeats_and_skips.rb
132
+ - spec/fixtures/example_output/inc_integers_w_skips.rb
133
+ - spec/mendel/combiner_spec.rb
134
+ - spec/mendel/min_priority_queue_spec.rb
135
+ - spec/mendel/observable_combiner_spec.rb
136
+ - spec/spec_helper.rb
137
+ - spec/support/foosball_team.rb
138
+ - visualizer_spec/ascii_spec.rb
139
+ - visualizer_spec/base_spec.rb
140
+ homepage: ''
141
+ licenses:
142
+ - MIT
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubyforge_project:
160
+ rubygems_version: 2.5.1
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: Mendel breeds the best combinations of lists that you provide.
164
+ test_files:
165
+ - spec/fixtures/example_input.rb
166
+ - spec/fixtures/example_output/different_lengths.rb
167
+ - spec/fixtures/example_output/inc_integers_w_inc_decimals.rb
168
+ - spec/fixtures/example_output/inc_integers_w_repeats.rb
169
+ - spec/fixtures/example_output/inc_integers_w_repeats_and_skips.rb
170
+ - spec/fixtures/example_output/inc_integers_w_skips.rb
171
+ - spec/mendel/combiner_spec.rb
172
+ - spec/mendel/min_priority_queue_spec.rb
173
+ - spec/mendel/observable_combiner_spec.rb
174
+ - spec/spec_helper.rb
175
+ - spec/support/foosball_team.rb