ruby-fizzbuzz 0.0.4 → 0.0.5
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.
- checksums.yaml +8 -8
- data/CHANGES +7 -0
- data/CHANGES.rdoc +7 -0
- data/Rakefile +18 -0
- data/TODO +4 -11
- data/VERSION +1 -1
- data/benchmark/benchmark_fizzbuzz.rb +107 -0
- data/ext/fizzbuzz/fizzbuzz.c +4 -4
- data/lib/fizzbuzz.rb +2 -0
- data/lib/fizzbuzz/array.rb +88 -0
- data/lib/fizzbuzz/integer.rb +1 -1
- data/lib/fizzbuzz/range.rb +86 -0
- data/lib/fizzbuzz/version.rb +1 -1
- data/ruby-fizzbuzz.gemspec +71 -0
- data/test/test_fizzbuzz.rb +514 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGMwNWU1NjNiMzhmZGQwZGZlZjUyNTM4ZTE0N2ZiMWUyY2E0YjBkOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MzNkMTQ2MTkxMjUzNTY3M2UxZWQyZjg3NTQ3YzlhMTlmMjYwYjZiYg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NmYwYTYzYzA1MjUyODRhMmVmNTM0NDQ4OGY1NzYwMzAwZDBkZWRlODRjMTNm
|
10
|
+
ODQ1YjE5ZjYwMmM1NzQ4MWU5NWE3YzE5ZTkyODIyZDVlODBkNTQ2MjcyMTI5
|
11
|
+
ZjRiZTE0YzQzMjkwM2RjYTVkYjUzMjVlMDM5NWIwNjIyMjRmNzY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTAxOTE2YjM0NGMxZjVhNjc4YWYyZGUzMzcwMjRiNjNiNDlkMTY4MWMxNGQ4
|
14
|
+
Y2RjYzYxYjhkZDM0ZmM5NWE4MDYyZTZmOGY5YTQ2YjBmMWUxOGFkOWFjYmRm
|
15
|
+
ZjkyZGVlODdjMzgyMzliYjI3NjE1MTJjMWE3MmI5ZTA5ZWEwMDY=
|
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
fizzbuzz (0.0.5)
|
2
|
+
|
3
|
+
* Added integration with Array and Range types;
|
4
|
+
* Added simple benchmark.
|
5
|
+
|
6
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Tue, 26 Nov 2013 12:40:34 +0000
|
7
|
+
|
1
8
|
fizzbuzz (0.0.4)
|
2
9
|
|
3
10
|
* Retired support for Ruby 1.8.x (no support for MRI, Ruby Enterprise Edition and Rubinius);
|
data/CHANGES.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
fizzbuzz (0.0.5)
|
2
|
+
|
3
|
+
* Added integration with Array and Range types;
|
4
|
+
* Added simple benchmark.
|
5
|
+
|
6
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Tue, 26 Nov 2013 12:40:34 +0000
|
7
|
+
|
1
8
|
fizzbuzz (0.0.4)
|
2
9
|
|
3
10
|
* Retired support for Ruby 1.8.x (no support for MRI, Ruby Enterprise Edition and Rubinius);
|
data/Rakefile
CHANGED
@@ -72,6 +72,24 @@ end
|
|
72
72
|
|
73
73
|
Rake::Task[:test].prerequisites << :compile
|
74
74
|
|
75
|
+
desc 'Run benchmarks'
|
76
|
+
task :benchmark, [:first] => :test do |t,argument|
|
77
|
+
glob = File.expand_path("../benchmark/*.rb", __FILE__)
|
78
|
+
Dir[glob].each do |f|
|
79
|
+
process = ['ruby', f]
|
80
|
+
process << argument[:first] if argument[:first]
|
81
|
+
|
82
|
+
STDOUT.sync = true
|
83
|
+
STDERR.sync = true
|
84
|
+
|
85
|
+
IO.popen(process) do |stream|
|
86
|
+
stream.each {|line| puts line }
|
87
|
+
end
|
88
|
+
|
89
|
+
Process.waitpid rescue Errno::ECHILD
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
75
93
|
task :default => :package
|
76
94
|
|
77
95
|
# vim: set ts=2 sw=2 sts=2 et :
|
data/TODO
CHANGED
@@ -1,23 +1,16 @@
|
|
1
|
-
fizzbuzz (
|
2
|
-
|
3
|
-
* Add simple web interface with RESTful backend API.
|
4
|
-
|
5
|
-
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Mon, 01 Oct 2012 17:57:18 +0100
|
6
|
-
|
7
|
-
fizzbuzz (0.0.6)
|
1
|
+
fizzbuzz (0.0.7)
|
8
2
|
|
9
3
|
* Improve github project page;
|
10
4
|
* Re-factor unit tests to make them more idiomatic (maybe move to Rspec and BDD?).
|
11
5
|
|
12
|
-
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
|
6
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Tue, 26 Nov 2013 12:40:34 +0000
|
13
7
|
|
14
|
-
fizzbuzz (0.0.
|
8
|
+
fizzbuzz (0.0.6)
|
15
9
|
|
16
10
|
* Move to YARD from RDoc (as RDoc is very bad, really);
|
17
11
|
* Add pure-Ruby implementation;
|
18
|
-
* Add benchmarks;
|
19
12
|
* Add some examples;
|
20
13
|
* Add Doxygen style comments for other functions in the source code;
|
21
14
|
* Improve documentation i.e. source code commenting, README file, etc.
|
22
15
|
|
23
|
-
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
|
16
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Tue, 26 Nov 2013 12:40:34 +0000
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# :enddoc:
|
4
|
+
|
5
|
+
#
|
6
|
+
# benchmark_fizzbuzz.rb
|
7
|
+
#
|
8
|
+
# Copyright 2012-2013 Krzysztof Wilczynski
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
#
|
22
|
+
|
23
|
+
$: << File.expand_path('../../lib', __FILE__)
|
24
|
+
|
25
|
+
require 'time'
|
26
|
+
require 'benchmark'
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'fizzbuzz'
|
30
|
+
rescue LoadError
|
31
|
+
require 'rubygems'
|
32
|
+
require 'fizzbuzz'
|
33
|
+
end
|
34
|
+
|
35
|
+
CAPTION = "%8s%12s%11s%10s\n" % %w(User System Total Real)
|
36
|
+
|
37
|
+
n = (ARGV.shift || 1_000_000).to_i
|
38
|
+
|
39
|
+
start = Time.now
|
40
|
+
array = (1 .. n).to_a
|
41
|
+
reports = []
|
42
|
+
|
43
|
+
puts "FizzBuzz #{FizzBuzz::VERSION}, n = #{n}\n\n"
|
44
|
+
|
45
|
+
Benchmark.benchmark(CAPTION, 24) do |bm|
|
46
|
+
reports << bm.report('FizzBuzz::fizzbuzz') do
|
47
|
+
FizzBuzz.fizzbuzz(1, n)
|
48
|
+
end
|
49
|
+
|
50
|
+
reports << bm.report('FizzBuzz#each') do
|
51
|
+
FizzBuzz.new(1, n).each {|i| i }
|
52
|
+
end
|
53
|
+
|
54
|
+
reports << bm.report('FizzBuzz#reverse_each') do
|
55
|
+
FizzBuzz.new(1, n).reverse_each {|i| i }
|
56
|
+
end
|
57
|
+
|
58
|
+
reports << bm.report('FizzBuzz#to_a') do
|
59
|
+
FizzBuzz.new(1, n).to_a
|
60
|
+
end
|
61
|
+
|
62
|
+
reports << bm.report('FizzBuzz::[]') do
|
63
|
+
n.times {|i| FizzBuzz[i] }
|
64
|
+
end
|
65
|
+
|
66
|
+
reports << bm.report('FizzBuzz::is_fizz?') do
|
67
|
+
n.times {|i| FizzBuzz.is_fizz?(i) }
|
68
|
+
end
|
69
|
+
|
70
|
+
reports << bm.report('FizzBuzz::is_buzz?') do
|
71
|
+
n.times {|i| FizzBuzz.is_buzz?(i) }
|
72
|
+
end
|
73
|
+
|
74
|
+
reports << bm.report('FizzBuzz::is_fizzbuzz?') do
|
75
|
+
n.times {|i| FizzBuzz.is_fizzbuzz?(i) }
|
76
|
+
end
|
77
|
+
|
78
|
+
reports << bm.report('Array#fizzbuzz') do
|
79
|
+
(1 .. n).fizzbuzz
|
80
|
+
end
|
81
|
+
|
82
|
+
reports << bm.report('Range#fizzbuzz') do
|
83
|
+
array.fizzbuzz
|
84
|
+
end
|
85
|
+
|
86
|
+
[]
|
87
|
+
end
|
88
|
+
|
89
|
+
reports.sort_by! {|i| i.real }
|
90
|
+
|
91
|
+
overall = reports.reduce(:+)
|
92
|
+
average = overall / reports.size
|
93
|
+
|
94
|
+
fastest, slowest = reports.shift, reports.pop
|
95
|
+
|
96
|
+
padding = [fastest.label, slowest.label].max
|
97
|
+
padding = padding.size > 16 ? 24 : 16
|
98
|
+
|
99
|
+
puts "\n%15s%s%16s\n" % ['', CAPTION.strip, 'Name'] +
|
100
|
+
"%s%48s [ %-#{padding}s ]\n" % ['Fastest:', fastest.to_s.strip, fastest.label.strip] +
|
101
|
+
"%s%48s [ %-#{padding}s ]\n" % ['Slowest:', slowest.to_s.strip, slowest.label.strip] +
|
102
|
+
"%s%48s\n" % ['Average:', average.to_s.strip] +
|
103
|
+
"%s%48s\n" % ['Overall:', overall.to_s.strip] +
|
104
|
+
"\n%s%13.6f\n" % ['Wall Clock Time:', Time.now.to_f - start.to_f]
|
105
|
+
|
106
|
+
# vim: set ts=2 sw=2 sts=2 et :
|
107
|
+
# encoding: utf-8
|
data/ext/fizzbuzz/fizzbuzz.c
CHANGED
@@ -66,7 +66,7 @@ static VALUE fizzbuzz_range_error(VALUE klass, VALUE start, VALUE stop,
|
|
66
66
|
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value of either
|
67
67
|
* +start+ or +stop+ is not an _Integer_ or _Bignum_ type.
|
68
68
|
*
|
69
|
-
* See also: FizzBuzz::fizzbuzz
|
69
|
+
* See also: FizzBuzz::fizzbuzz and FizzBuzz::[]
|
70
70
|
*/
|
71
71
|
VALUE
|
72
72
|
rb_fb_initialize(int argc, VALUE *argv, VALUE object)
|
@@ -182,7 +182,7 @@ rb_fb_set_stop(VALUE object, VALUE value)
|
|
182
182
|
* call-seq:
|
183
183
|
* fizzbuzz.to_a -> array
|
184
184
|
*
|
185
|
-
* Returns an array containing results upon calculating an appropriate
|
185
|
+
* Returns an +array+ containing results upon calculating an appropriate
|
186
186
|
* values for a given range from +start+ to +stop+.
|
187
187
|
*
|
188
188
|
* Example:
|
@@ -203,7 +203,7 @@ rb_fb_array(VALUE object)
|
|
203
203
|
* fizzbuzz.each {|value| block } -> self
|
204
204
|
* fizzbuzz.each -> an Enumerator
|
205
205
|
*
|
206
|
-
* Calls the block
|
206
|
+
* Calls the block _once_ for each subsequent value for a given range
|
207
207
|
* from +start+ to +stop+, passing the value as a parameter to the block.
|
208
208
|
*
|
209
209
|
* If no block is given, an +Enumerator+ is returned instead.
|
@@ -244,7 +244,7 @@ rb_fb_enumerator(VALUE object)
|
|
244
244
|
* fizzbuzz.reverse_each {|value| block } -> self
|
245
245
|
* fizzbuzz.reverse_each -> an Enumerator
|
246
246
|
*
|
247
|
-
* Calls the block
|
247
|
+
* Calls the block _once_ for each subsequent value for a given range
|
248
248
|
* from +start+ to +stop+ in an <i>reverse order</i>, passing the value
|
249
249
|
* as a parameter to the block.
|
250
250
|
*
|
data/lib/fizzbuzz.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# :stopdoc:
|
4
|
+
|
5
|
+
#
|
6
|
+
# array.rb
|
7
|
+
#
|
8
|
+
# Copyright 2012-2013 Krzysztof Wilczynski
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
#
|
22
|
+
|
23
|
+
# :startdoc:
|
24
|
+
|
25
|
+
#
|
26
|
+
# Provides a convenient integration of _FizzBuzz_ with _Array_ class.
|
27
|
+
#
|
28
|
+
class Array
|
29
|
+
#
|
30
|
+
# call-seq:
|
31
|
+
# array.fizzbuzz( reverse ) -> array
|
32
|
+
# array.fizzbuzz( reverse ) {|value| block } -> self
|
33
|
+
#
|
34
|
+
# Returns either an array or accepts a block if such is given. When a block is given
|
35
|
+
# then it will call the block once for each subsequent value for a given array, passing
|
36
|
+
# the value as a parameter to the block.
|
37
|
+
#
|
38
|
+
# Additionally, if the value of +reverse+ is set to be +true+ then the results will
|
39
|
+
# be given in an <em>reverse order</em> whether in a resulting array or when passing
|
40
|
+
# values to a block given.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
45
|
+
# array.fizzbuzz #=> [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
|
46
|
+
# array.fizzbuzz(true) #=> ["FizzBuzz", 14, 13, "Fizz", 11, "Buzz", "Fizz", 8, 7, "Fizz", "Buzz", 4, "Fizz", 2, 1]
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
#
|
50
|
+
# array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
|
51
|
+
# array.fizzbuzz {|value| puts "Got #{value}" }
|
52
|
+
#
|
53
|
+
# Produces:
|
54
|
+
#
|
55
|
+
# Got 1
|
56
|
+
# Got 2
|
57
|
+
# Got Fizz
|
58
|
+
# Got 4
|
59
|
+
# Got Buzz
|
60
|
+
# Got Fizz
|
61
|
+
# Got 7
|
62
|
+
# Got 8
|
63
|
+
# Got Fizz
|
64
|
+
# Got Buzz
|
65
|
+
# Got 11
|
66
|
+
# Got Fizz
|
67
|
+
# Got 13
|
68
|
+
# Got 14
|
69
|
+
# Got FizzBuzz
|
70
|
+
#
|
71
|
+
# See also: FizzBuzz::fizzbuzz, FizzBuzz#to_a, FizzBuzz#each and FizzBuzz#reverse_each
|
72
|
+
#
|
73
|
+
def fizzbuzz(reverse = false)
|
74
|
+
values = self.send(reverse ? :reverse : :entries)
|
75
|
+
|
76
|
+
if block_given?
|
77
|
+
values.each {|i| yield FizzBuzz[i] }
|
78
|
+
self
|
79
|
+
else
|
80
|
+
values.collect {|i| FizzBuzz[i] }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# :enddoc:
|
86
|
+
|
87
|
+
# vim: set ts=2 sw=2 sts=2 et :
|
88
|
+
# encoding: utf-8
|
data/lib/fizzbuzz/integer.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# :stopdoc:
|
4
|
+
|
5
|
+
#
|
6
|
+
# range.rb
|
7
|
+
#
|
8
|
+
# Copyright 2012-2013 Krzysztof Wilczynski
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
#
|
22
|
+
|
23
|
+
# :startdoc:
|
24
|
+
|
25
|
+
#
|
26
|
+
# Provides a convenient integration of _FizzBuzz_ with _Range_ class.
|
27
|
+
#
|
28
|
+
class Range
|
29
|
+
#
|
30
|
+
# call-seq:
|
31
|
+
# range.fizzbuzz( reverse ) -> array
|
32
|
+
# range.fizzbuzz( reverse ) {|value| block } -> self
|
33
|
+
#
|
34
|
+
# Returns either an array or accepts a block if such is given. When a block is given
|
35
|
+
# then it will call the block once for each subsequent value for a given range, passing
|
36
|
+
# the value as a parameter to the block.
|
37
|
+
#
|
38
|
+
# Additionally, if the value of +reverse+ is set to be +true+ then the results will
|
39
|
+
# be given in an <em>reverse order</em> whether in a resulting array or when passing
|
40
|
+
# values to a block given.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# (1..15).fizzbuzz #=> [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
|
45
|
+
# (1..15).fizzbuzz(true) #=> ["FizzBuzz", 14, 13, "Fizz", 11, "Buzz", "Fizz", 8, 7, "Fizz", "Buzz", 4, "Fizz", 2, 1]
|
46
|
+
#
|
47
|
+
# Example:
|
48
|
+
#
|
49
|
+
# (1..15).fizzbuzz {|value| puts "Got #{value}" }
|
50
|
+
#
|
51
|
+
# Produces:
|
52
|
+
#
|
53
|
+
# Got 1
|
54
|
+
# Got 2
|
55
|
+
# Got Fizz
|
56
|
+
# Got 4
|
57
|
+
# Got Buzz
|
58
|
+
# Got Fizz
|
59
|
+
# Got 7
|
60
|
+
# Got 8
|
61
|
+
# Got Fizz
|
62
|
+
# Got Buzz
|
63
|
+
# Got 11
|
64
|
+
# Got Fizz
|
65
|
+
# Got 13
|
66
|
+
# Got 14
|
67
|
+
# Got FizzBuzz
|
68
|
+
#
|
69
|
+
# See also: FizzBuzz::fizzbuzz, FizzBuzz#to_a, FizzBuzz#each and FizzBuzz#reverse_each
|
70
|
+
#
|
71
|
+
def fizzbuzz(reverse = false)
|
72
|
+
values = self.collect {|i| FizzBuzz[i] }.send(reverse ? :reverse : :entries)
|
73
|
+
|
74
|
+
if block_given?
|
75
|
+
values.each {|i| yield i }
|
76
|
+
self
|
77
|
+
else
|
78
|
+
values
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# :enddoc:
|
84
|
+
|
85
|
+
# vim: set ts=2 sw=2 sts=2 et :
|
86
|
+
# encoding: utf-8
|
data/lib/fizzbuzz/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# :enddoc:
|
4
|
+
|
5
|
+
#
|
6
|
+
# ruby-fizzbuzz.gemspec
|
7
|
+
#
|
8
|
+
# Copyright 2012-2013 Krzysztof Wilczynski
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
#
|
22
|
+
|
23
|
+
signing_key = File.expand_path('~/.gem/kwilczynski-private.pem')
|
24
|
+
|
25
|
+
Gem::Specification.new do |s|
|
26
|
+
s.name = 'ruby-fizzbuzz'
|
27
|
+
|
28
|
+
s.description = <<-EOS
|
29
|
+
Yet another FizzBuzz in Ruby.
|
30
|
+
|
31
|
+
Provides simple and fast solution to a popular FizzBuzz problem for Ruby.
|
32
|
+
|
33
|
+
Written in C as an example of using Ruby's C API - with the support for
|
34
|
+
arbitrary large numeric values via the Bignum class.
|
35
|
+
EOS
|
36
|
+
|
37
|
+
s.platform = Gem::Platform::RUBY
|
38
|
+
s.version = File.read('VERSION').strip
|
39
|
+
s.license = 'Apache License, Version 2.0'
|
40
|
+
s.author = 'Krzysztof Wilczynski'
|
41
|
+
s.email = 'krzysztof.wilczynski@linux.com'
|
42
|
+
s.homepage = 'http://about.me/kwilczynski'
|
43
|
+
|
44
|
+
s.rubyforge_project = 'ruby-fizzbuzz'
|
45
|
+
s.rubygems_version = '~> 1.3.7'
|
46
|
+
s.has_rdoc = true
|
47
|
+
|
48
|
+
s.summary = 'Yet another FizzBuzz in Ruby'
|
49
|
+
|
50
|
+
s.files = Dir['ext/**/*.{c,h,rb}'] +
|
51
|
+
Dir['lib/**/*.rb'] +
|
52
|
+
Dir['benchmark/**/*.rb'] +
|
53
|
+
Dir['test/**/*.rb'] +
|
54
|
+
%w(Rakefile ruby-fizzbuzz.gemspec AUTHORS
|
55
|
+
CHANGES CHANGES.rdoc COPYRIGHT LICENSE
|
56
|
+
README README.rdoc TODO VERSION)
|
57
|
+
|
58
|
+
s.executables << 'fizzbuzz'
|
59
|
+
s.require_paths << 'lib'
|
60
|
+
s.extensions << 'ext/fizzbuzz/extconf.rb'
|
61
|
+
|
62
|
+
s.add_development_dependency 'rake', '>= 0.8.7'
|
63
|
+
s.add_development_dependency 'rdoc', '>= 3.12'
|
64
|
+
s.add_development_dependency 'test-unit', '>= 2.5.2'
|
65
|
+
s.add_development_dependency 'rake-compiler', '>= 0.7.1'
|
66
|
+
|
67
|
+
s.signing_key = signing_key if File.exists?(signing_key)
|
68
|
+
end
|
69
|
+
|
70
|
+
# vim: set ts=2 sw=2 sts=2 et :
|
71
|
+
# encoding: utf-8
|
@@ -0,0 +1,514 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
# :enddoc:
|
4
|
+
|
5
|
+
#
|
6
|
+
# test_fizzbuzz.rb
|
7
|
+
#
|
8
|
+
# Copyright 2012-2013 Krzysztof Wilczynski
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
#
|
22
|
+
|
23
|
+
begin
|
24
|
+
require 'coveralls'
|
25
|
+
Coveralls.wear!
|
26
|
+
rescue LoadError
|
27
|
+
STDERR.puts 'The Coveralls gem is not installed, skipping ...'
|
28
|
+
end
|
29
|
+
|
30
|
+
gem 'test-unit', '>= 2.5.2'
|
31
|
+
|
32
|
+
require 'test/unit'
|
33
|
+
require 'fizzbuzz'
|
34
|
+
|
35
|
+
DEFAULT_START = 1
|
36
|
+
DEFAULT_STOP = 15
|
37
|
+
DEFAULT_WORDS = ['Fizz', 'Buzz', 'FizzBuzz']
|
38
|
+
DEFAULT_EXPECTED = [1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz']
|
39
|
+
|
40
|
+
DEFAULT_SINGLETON_METHODS = [:fizzbuzz, :is_fizz?, :is_buzz?, :is_fizzbuzz?]
|
41
|
+
DEFAULT_INSTANCE_METHODS = [:to_a, :each, :reverse_each]
|
42
|
+
|
43
|
+
DEFAULT_INSTANCE_METHODS_ADDED = [:fizz?, :buzz?, :fizzbuzz?]
|
44
|
+
|
45
|
+
class Fixnum
|
46
|
+
class << self
|
47
|
+
def overflow_size_with_sign
|
48
|
+
bits = [''].pack('p').size * 8
|
49
|
+
2 ** (bits - 1) - 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class FizzBuzzTest < Test::Unit::TestCase
|
55
|
+
def setup
|
56
|
+
@integer = 1
|
57
|
+
@bignum = 1_000_000_000_000
|
58
|
+
@large_bignum = 1_000_000_000_000_000
|
59
|
+
|
60
|
+
if Fixnum::overflow_size_with_sign + 1 > 2147483647
|
61
|
+
@bignum = @bignum ** 2
|
62
|
+
@large_bignum = @large_bignum ** 2
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_fizzbuzz_alias
|
67
|
+
assert(FB == FizzBuzz)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_fizzbuzz_singleton_methods
|
71
|
+
fb = FizzBuzz
|
72
|
+
|
73
|
+
assert_block do
|
74
|
+
DEFAULT_SINGLETON_METHODS.all? {|i| fb.respond_to?(i) }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_fizzbuzz_new_instance
|
79
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
80
|
+
assert(fb.class == FizzBuzz)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_fizzbuzz_instance_methods
|
84
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
85
|
+
|
86
|
+
assert_block do
|
87
|
+
DEFAULT_INSTANCE_METHODS.all? {|i| fb.respond_to?(i) }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_integer_integration
|
92
|
+
assert_block do
|
93
|
+
DEFAULT_INSTANCE_METHODS_ADDED.all? {|i| @integer.respond_to?(i) }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_integer_is_fizz
|
98
|
+
assert_equal(3.fizz?, true)
|
99
|
+
assert_equal(15.fizz?, false)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_integer_is_buzz
|
103
|
+
assert_equal(5.buzz?, true)
|
104
|
+
assert_equal(15.buzz?, false)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_integer_is_fizzbuzz
|
108
|
+
assert_equal(15.fizzbuzz?, true)
|
109
|
+
assert_equal(3.fizzbuzz?, false)
|
110
|
+
assert_equal(5.fizzbuzz?, false)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_bignum_integration
|
114
|
+
assert_block do
|
115
|
+
DEFAULT_INSTANCE_METHODS_ADDED.all? {|i| @bignum.respond_to?(i) }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_bignum_is_fizz
|
120
|
+
assert_equal((@bignum + 2).fizz?, true)
|
121
|
+
assert_equal((@bignum + 15).fizz?, false)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_bignum_is_buzz
|
125
|
+
assert_equal((@bignum + 15).buzz?, true)
|
126
|
+
assert_equal((@bignum + 5).buzz?, false)
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_bignum_is_fizzbuzz
|
130
|
+
assert_equal((@bignum + 5).fizzbuzz?, true)
|
131
|
+
assert_equal((@bignum + 2).fizzbuzz?, false)
|
132
|
+
assert_equal((@bignum + 15).fizzbuzz?, false)
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_array_integration
|
136
|
+
assert([].respond_to?(:fizzbuzz))
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_array_integration_fizzbuzz
|
140
|
+
obtainted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].fizzbuzz
|
141
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_array_integration_fizzbuzz_reverse
|
145
|
+
obtainted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].fizzbuzz(true)
|
146
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_array_integration_fizzbuzz_block
|
150
|
+
obtainted = []
|
151
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].fizzbuzz {|i| obtainted << i }
|
152
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_array_integration_fizzbuzz_block_reverse
|
156
|
+
obtainted = []
|
157
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].fizzbuzz(true) {|i| obtainted << i }
|
158
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_range_integration
|
162
|
+
assert((0..0).respond_to?(:fizzbuzz))
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_range_integration_fizzbuzz
|
166
|
+
obtainted = (DEFAULT_START .. DEFAULT_STOP).fizzbuzz
|
167
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_range_integration_fizzbuzz_reverse
|
171
|
+
obtainted = (DEFAULT_START .. DEFAULT_STOP).fizzbuzz(true)
|
172
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_range_integration_fizzbuzz_block
|
176
|
+
obtainted = []
|
177
|
+
(DEFAULT_START .. DEFAULT_STOP).fizzbuzz {|i| obtainted << i }
|
178
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_range_integration_fizzbuzz_block_reverse
|
182
|
+
obtainted = []
|
183
|
+
(DEFAULT_START .. DEFAULT_STOP).fizzbuzz(true) {|i| obtainted << i }
|
184
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_singleton_fizzbuzz_incorrect_range_error
|
188
|
+
assert_raise FizzBuzz::RangeError do
|
189
|
+
FizzBuzz.fizzbuzz(2, 1)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_singleton_fizzbuzz_incorrect_type_error
|
194
|
+
assert_raise FizzBuzz::TypeError do
|
195
|
+
FizzBuzz.fizzbuzz('', '')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_singleton_fizzbuzz_integer
|
200
|
+
integer = @integer + 14
|
201
|
+
obtainted = FizzBuzz.fizzbuzz(integer, integer)
|
202
|
+
assert_equal(obtainted, ['FizzBuzz'])
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_singleton_fizzbuzz_bignum
|
206
|
+
bignum = @bignum + 5
|
207
|
+
obtainted = FizzBuzz.fizzbuzz(bignum, bignum)
|
208
|
+
assert_equal(obtainted, ['FizzBuzz'])
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_singleton_fizzbuzz_large_bignum
|
212
|
+
bignum = @large_bignum + 5
|
213
|
+
obtainted = FizzBuzz.fizzbuzz(bignum, bignum)
|
214
|
+
assert_equal(obtainted, ['FizzBuzz'])
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_singleton_fizzbuzz_array
|
218
|
+
obtained = FizzBuzz.fizzbuzz(DEFAULT_START, DEFAULT_STOP)
|
219
|
+
assert_equal(obtained, DEFAULT_EXPECTED)
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_singleton_fizzbuzz_array_reverse
|
223
|
+
obtained = FizzBuzz.fizzbuzz(DEFAULT_START, DEFAULT_STOP, true)
|
224
|
+
assert_equal(obtained, DEFAULT_EXPECTED.reverse)
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_singleton_fizzbuzz_block
|
228
|
+
obtainted = []
|
229
|
+
FizzBuzz.fizzbuzz(DEFAULT_START, DEFAULT_STOP) {|i| obtainted << i }
|
230
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_singleton_fizzbuzz_block_reverse
|
234
|
+
obtainted = []
|
235
|
+
FizzBuzz.fizzbuzz(DEFAULT_START, DEFAULT_STOP, true) {|i| obtainted << i }
|
236
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_singleton_squre
|
240
|
+
obtained_fizz = FizzBuzz[3]
|
241
|
+
obtained_buzz = FizzBuzz[5]
|
242
|
+
obtained_fizzbuzz = FizzBuzz[15]
|
243
|
+
|
244
|
+
obtained = [obtained_fizz, obtained_buzz, obtained_fizzbuzz]
|
245
|
+
|
246
|
+
assert(FizzBuzz[@integer].class == Fixnum)
|
247
|
+
assert_block do
|
248
|
+
obtained.each_with_index.all? do |v,i|
|
249
|
+
v.is_a?(String) && obtained[i] == DEFAULT_WORDS[i]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_singleton_squre_bignum
|
255
|
+
obtained_fizz = FizzBuzz[@bignum + 2]
|
256
|
+
obtained_buzz = FizzBuzz[@bignum + 15]
|
257
|
+
obtained_fizzbuzz = FizzBuzz[@bignum + 5]
|
258
|
+
|
259
|
+
obtained = [obtained_fizz, obtained_buzz, obtained_fizzbuzz]
|
260
|
+
|
261
|
+
assert(FizzBuzz[@bignum + 3].class == Bignum)
|
262
|
+
assert_block do
|
263
|
+
obtained.each_with_index.all? do |v,i|
|
264
|
+
v.is_a?(String) && obtained[i] == DEFAULT_WORDS[i]
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_singleton_squre_large_bignum
|
270
|
+
obtained_fizz = FizzBuzz[@large_bignum + 2]
|
271
|
+
obtained_buzz = FizzBuzz[@large_bignum + 15]
|
272
|
+
obtained_fizzbuzz = FizzBuzz[@large_bignum + 5]
|
273
|
+
|
274
|
+
obtained = [obtained_fizz, obtained_buzz, obtained_fizzbuzz]
|
275
|
+
|
276
|
+
assert(FizzBuzz[@large_bignum + 3].class == Bignum)
|
277
|
+
assert_block do
|
278
|
+
obtained.each_with_index.all? do |v,i|
|
279
|
+
v.is_a?(String) && obtained[i] == DEFAULT_WORDS[i]
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_singleton_is_fizz
|
285
|
+
assert_equal(FizzBuzz.is_fizz?(3), true)
|
286
|
+
assert_equal(FizzBuzz.is_fizz?(15), false)
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_singleton_is_buzz
|
290
|
+
assert_equal(FizzBuzz.is_buzz?(5), true)
|
291
|
+
assert_equal(FizzBuzz.is_buzz?(15), false)
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_singleton_is_fizzbuzz
|
295
|
+
assert_equal(FizzBuzz.is_fizzbuzz?(15), true)
|
296
|
+
assert_equal(FizzBuzz.is_fizzbuzz?(3), false)
|
297
|
+
assert_equal(FizzBuzz.is_fizzbuzz?(5), false)
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_fizzbuzz_for_0
|
301
|
+
obtained_square = FizzBuzz[0]
|
302
|
+
obtained_is_fizzbuzz = FizzBuzz.is_fizzbuzz?(0)
|
303
|
+
|
304
|
+
assert(obtained_square.is_a?(Integer) && obtained_square == 0)
|
305
|
+
assert(obtained_is_fizzbuzz.is_a?(FalseClass) && obtained_is_fizzbuzz == false)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_to_a
|
309
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
310
|
+
assert_equal(fb.to_a, DEFAULT_EXPECTED)
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_each
|
314
|
+
obtainted = []
|
315
|
+
|
316
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
317
|
+
fb.each {|i| obtainted << i }
|
318
|
+
|
319
|
+
assert_equal(obtainted, DEFAULT_EXPECTED)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_reverse_each
|
323
|
+
obtainted = []
|
324
|
+
|
325
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
326
|
+
fb.reverse_each {|i| obtainted << i }
|
327
|
+
|
328
|
+
assert_equal(obtainted, DEFAULT_EXPECTED.reverse)
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_for_fizzbuzz_integer
|
332
|
+
fb = FizzBuzz.new(DEFAULT_START, 15)
|
333
|
+
assert_equal(fb.to_a[14], 'FizzBuzz')
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_for_fizzbuzz_bignum
|
337
|
+
fb = FizzBuzz.new(@bignum + 5, @bignum + 5)
|
338
|
+
assert_equal(fb.to_a[0], 'FizzBuzz')
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_for_fizzbuzz_large_bignum
|
342
|
+
fb = FizzBuzz.new(@large_bignum + 5, @large_bignum + 5)
|
343
|
+
assert_equal(fb.to_a[0], 'FizzBuzz')
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_correct_start_integer
|
347
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
348
|
+
|
349
|
+
assert(fb.start.is_a?(Integer) && fb.start == 1)
|
350
|
+
fb.start = 2
|
351
|
+
assert(fb.start.is_a?(Integer) && fb.start == 2)
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_correct_start_bignum
|
355
|
+
fb = FizzBuzz.new(@bignum, @bignum)
|
356
|
+
|
357
|
+
assert_block do
|
358
|
+
fb.start.is_a?(Bignum) && fb.start == @bignum
|
359
|
+
fb.start = @bignum - 5
|
360
|
+
fb.start.is_a?(Bignum) && fb.start == (@bignum - 5)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_correct_start_large_bignum
|
365
|
+
fb = FizzBuzz.new(@large_bignum, @large_bignum)
|
366
|
+
|
367
|
+
assert(fb.start.is_a?(Bignum) && fb.start == @large_bignum)
|
368
|
+
fb.start = @large_bignum - 5
|
369
|
+
assert(fb.start.is_a?(Bignum) && fb.start == (@large_bignum - 5))
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_correct_stop_integer
|
373
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
374
|
+
|
375
|
+
assert(fb.stop.is_a?(Integer) && fb.stop == 15)
|
376
|
+
fb.stop = 5
|
377
|
+
assert(fb.stop.is_a?(Integer) && fb.stop == 5)
|
378
|
+
end
|
379
|
+
|
380
|
+
def test_correct_stop_bignum
|
381
|
+
fb = FizzBuzz.new(@bignum, @bignum)
|
382
|
+
|
383
|
+
assert(fb.stop.is_a?(Bignum) && fb.stop == @bignum)
|
384
|
+
fb.stop = @bignum + 5
|
385
|
+
assert(fb.stop.is_a?(Bignum) && fb.stop == (@bignum + 5))
|
386
|
+
end
|
387
|
+
|
388
|
+
def test_correct_stop_large_bignum
|
389
|
+
fb = FizzBuzz.new(@large_bignum, @large_bignum)
|
390
|
+
|
391
|
+
assert(fb.stop.is_a?(Bignum) && fb.stop == @large_bignum)
|
392
|
+
fb.stop = @large_bignum + 5
|
393
|
+
assert(fb.stop.is_a?(Bignum) && fb.stop == (@large_bignum + 5))
|
394
|
+
end
|
395
|
+
|
396
|
+
def test_missing_arguments
|
397
|
+
assert_raise ArgumentError do
|
398
|
+
FizzBuzz.new
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_arguments_type_error_strings
|
403
|
+
assert_raise FizzBuzz::TypeError do
|
404
|
+
FizzBuzz.new('', '')
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
def test_arguments_type_error_nils
|
409
|
+
assert_raise FizzBuzz::TypeError do
|
410
|
+
FizzBuzz.new(nil, nil)
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_incorrect_range_error
|
415
|
+
assert_raise FizzBuzz::RangeError do
|
416
|
+
FizzBuzz.new(2, 1)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
def test_start_type_error
|
421
|
+
assert_raise FizzBuzz::TypeError do
|
422
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
423
|
+
fb.start = ''
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
def test_stop_type_error
|
428
|
+
assert_raise FizzBuzz::TypeError do
|
429
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
430
|
+
fb.stop = ''
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def test_correct_start_stop
|
435
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
436
|
+
|
437
|
+
fb.start = 2
|
438
|
+
fb.stop = 3
|
439
|
+
|
440
|
+
assert(fb.start.is_a?(Integer) && fb.start == 2)
|
441
|
+
assert(fb.stop.is_a?(Integer) && fb.stop == 3)
|
442
|
+
end
|
443
|
+
|
444
|
+
def test_start_range_error
|
445
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
446
|
+
|
447
|
+
assert_raise FizzBuzz::RangeError do
|
448
|
+
fb.start = 16
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
def test_stop_range_error
|
453
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
454
|
+
|
455
|
+
assert_raise FizzBuzz::RangeError do
|
456
|
+
fb.stop = -1
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
def test_for_range_error
|
461
|
+
assert_nothing_raised do
|
462
|
+
FizzBuzz.new(DEFAULT_START, @bignum ** 2)
|
463
|
+
FizzBuzz.new(-@large_bignum, DEFAULT_STOP)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
def test_error_attributes_not_nil
|
468
|
+
fb = FizzBuzz.new(DEFAULT_START, DEFAULT_STOP)
|
469
|
+
|
470
|
+
begin
|
471
|
+
fb.start = 1
|
472
|
+
fb.stop = 0
|
473
|
+
rescue FizzBuzz::RangeError => error
|
474
|
+
assert_equal(error.start, 1)
|
475
|
+
assert_equal(error.stop, 0)
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
def test_error_attributes_nil
|
480
|
+
begin
|
481
|
+
FizzBuzz.new('', '')
|
482
|
+
rescue FizzBuzz::TypeError => error
|
483
|
+
assert_equal(error.start, nil)
|
484
|
+
assert_equal(error.stop, nil)
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_start_type_error_message
|
489
|
+
begin
|
490
|
+
FizzBuzz.new('', DEFAULT_STOP)
|
491
|
+
rescue FizzBuzz::TypeError => error
|
492
|
+
assert_equal(error.message, 'must be an Integer or Bignum type for start')
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
def test_stop_type_error_message
|
497
|
+
begin
|
498
|
+
FizzBuzz.new(DEFAULT_START, '')
|
499
|
+
rescue FizzBuzz::TypeError => error
|
500
|
+
assert_equal(error.message, 'must be an Integer or Bignum type for stop')
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
def test_range_error_message
|
505
|
+
begin
|
506
|
+
FizzBuzz.new(DEFAULT_STOP, DEFAULT_START)
|
507
|
+
rescue FizzBuzz::RangeError => error
|
508
|
+
assert_equal(error.message, 'start value is higher than stop value')
|
509
|
+
end
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
# vim: set ts=2 sw=2 sts=2 et :
|
514
|
+
# encoding: utf-8
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-fizzbuzz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Krzysztof Wilczynski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -89,10 +89,15 @@ files:
|
|
89
89
|
- ext/fizzbuzz/fizzbuzz.h
|
90
90
|
- ext/fizzbuzz/extconf.rb
|
91
91
|
- lib/fizzbuzz/bignum.rb
|
92
|
+
- lib/fizzbuzz/array.rb
|
92
93
|
- lib/fizzbuzz/integer.rb
|
94
|
+
- lib/fizzbuzz/range.rb
|
93
95
|
- lib/fizzbuzz/version.rb
|
94
96
|
- lib/fizzbuzz.rb
|
97
|
+
- benchmark/benchmark_fizzbuzz.rb
|
98
|
+
- test/test_fizzbuzz.rb
|
95
99
|
- Rakefile
|
100
|
+
- ruby-fizzbuzz.gemspec
|
96
101
|
- AUTHORS
|
97
102
|
- CHANGES
|
98
103
|
- CHANGES.rdoc
|