roman_numbers 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/roman_numbers/version.rb +1 -1
- data/spec/helpers.rb +42 -23
- data/spec/roman_numbers/roman_number_spec.rb +62 -23
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 154520d9143e2297d9ca4437b70f1eb36de4cf57
|
4
|
+
data.tar.gz: 6764dcb2c45acd10300909022016e5c400708ef8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c0d2b3fb03daaed1778de72df60e8f94f1496870073a3111998f1fcec225e9366d8830fedfa4f1e966d8f7a16eaf1f7c55d42d680cc351f15e6e131704f12ee
|
7
|
+
data.tar.gz: 1bb43845ca739c2ebded476deb5d8088a199458edbdd1797e3675c1856cc3946c2b95ac6d51583d710b1bb69ef8a744dbff9b1110fdf27fa3e26a7459e736dd4
|
data/spec/helpers.rb
CHANGED
@@ -1,28 +1,47 @@
|
|
1
1
|
module Helpers
|
2
|
-
def
|
2
|
+
def input_set_1
|
3
3
|
[
|
4
|
-
|
5
|
-
|
6
|
-
[10, 'X'],
|
7
|
-
[50, 'L'],
|
8
|
-
[100, 'C'],
|
9
|
-
[500, 'D'],
|
10
|
-
[1000, 'M'],
|
11
|
-
[4, 'IV'],
|
12
|
-
[9, 'IX'],
|
13
|
-
[40, 'XL'],
|
14
|
-
[90, 'XC'],
|
15
|
-
[400, 'CD'],
|
16
|
-
[900, 'CM'],
|
17
|
-
[207, 'CCVII'],
|
18
|
-
[1066, 'MLXVI'],
|
19
|
-
[44, 'XLIV'],
|
20
|
-
[49, 'XLIX'],
|
21
|
-
[904, 'CMIV'],
|
22
|
-
[944, 'CMXLIV'],
|
23
|
-
[1904, 'MCMIV'],
|
24
|
-
[1944, 'MCMXLIV'],
|
25
|
-
[3999, 'MMMCMXCIX'],
|
4
|
+
{integer: 39, roman: 'XXXIX'},
|
5
|
+
{integer: 390, roman: 'CCCXC'},
|
26
6
|
]
|
27
7
|
end
|
8
|
+
module_function :input_set_1
|
9
|
+
def input_set_2
|
10
|
+
[
|
11
|
+
{integer: 4, roman: 'IV'},
|
12
|
+
{integer: 9, roman: 'IX'},
|
13
|
+
{integer: 40, roman: 'XL'},
|
14
|
+
{integer: 90, roman: 'XC'},
|
15
|
+
{integer: 400, roman: 'CD'},
|
16
|
+
{integer: 900, roman: 'CM'},
|
17
|
+
]
|
18
|
+
end
|
19
|
+
module_function :input_set_2
|
20
|
+
def valid_inputs
|
21
|
+
[
|
22
|
+
{integer: 1, roman: 'I'},
|
23
|
+
{integer: 5, roman: 'V'},
|
24
|
+
{integer: 10, roman: 'X'},
|
25
|
+
{integer: 50, roman: 'L'},
|
26
|
+
{integer: 100, roman: 'C'},
|
27
|
+
{integer: 500, roman: 'D'},
|
28
|
+
{integer: 1000, roman: 'M'},
|
29
|
+
{integer: 4, roman: 'IV'},
|
30
|
+
{integer: 9, roman: 'IX'},
|
31
|
+
{integer: 40, roman: 'XL'},
|
32
|
+
{integer: 90, roman: 'XC'},
|
33
|
+
{integer: 400, roman: 'CD'},
|
34
|
+
{integer: 900, roman: 'CM'},
|
35
|
+
{integer: 207, roman: 'CCVII'},
|
36
|
+
{integer: 1066, roman: 'MLXVI'},
|
37
|
+
{integer: 44, roman: 'XLIV'},
|
38
|
+
{integer: 49, roman: 'XLIX'},
|
39
|
+
{integer: 904, roman: 'CMIV'},
|
40
|
+
{integer: 944, roman: 'CMXLIV'},
|
41
|
+
{integer: 1904, roman: 'MCMIV'},
|
42
|
+
{integer: 1944, roman: 'MCMXLIV'},
|
43
|
+
{integer: 3999, roman: 'MMMCMXCIX'},
|
44
|
+
]
|
45
|
+
end
|
46
|
+
module_function :valid_inputs
|
28
47
|
end
|
@@ -1,55 +1,95 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
module RomanNumbers
|
4
|
-
describe RomanNumber do
|
4
|
+
describe RomanNumber do
|
5
|
+
|
6
|
+
$invalid_input_error = InvalidInputError
|
5
7
|
|
6
8
|
before(:each) do
|
7
9
|
@roman_number = RomanNumber.new(1)
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
describe '#convert_decimal_to_roman' do
|
13
|
+
shared_examples_for "works_with_valid_integral_roman_input_collection" do |array|
|
14
|
+
# Note: here array is array of hashes
|
15
|
+
array.each do |hsh|
|
16
|
+
it %Q{returns #{hsh[:integer]} for #{hsh[:roman]} as input} do
|
17
|
+
RomanNumber.new(hsh[:integer]).convert_decimal_to_roman.should == hsh[:roman]
|
15
18
|
end
|
16
19
|
end
|
17
20
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
|
22
|
+
shared_examples_for "raises_error_on_invalid_roman_input_collection" do |array|
|
23
|
+
# Note: here array is array of integers
|
24
|
+
array.each do |integral_elem|
|
25
|
+
it %Q{raises #{$invalid_input_error} for #{integral_elem} as input} do
|
26
|
+
expect {
|
27
|
+
RomanNumber.new(integral_elem).convert_decimal_to_roman
|
28
|
+
}.to raise_error($invalid_input_error)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context %q(Symbols 'I', 'X', 'C', and 'M' cannot be repeated more than three times in succession) do
|
34
|
+
it_behaves_like "raises_error_on_invalid_roman_input_collection", %w(VIIII IIIIV XXXXI XXXXC CCCCX XCCCC MMMMC)
|
35
|
+
end
|
36
|
+
|
37
|
+
context %q(Symbols 'I', 'X', 'C', and 'M' can be repeated 4 times if 3rd and 4th are separated by smaller value) do
|
38
|
+
it_behaves_like "works_with_valid_integral_roman_input_collection", Helpers.input_set_1
|
39
|
+
end
|
40
|
+
|
41
|
+
context %q(Symbols 'D', 'L', 'V' can never be repeated in succession) do
|
42
|
+
it_behaves_like "raises_error_on_invalid_roman_input_collection", %w(DD DDC LL LLX VV VVI)
|
43
|
+
end
|
44
|
+
|
45
|
+
context %Q(Symbol 'I' can be subtrated from 'V' and 'X', and
|
46
|
+
Symbol 'L' can be subtracted from 'L' and 'C', and
|
47
|
+
Symbol 'C' can be subtracted from 'D' and 'M') do
|
48
|
+
it_behaves_like "works_with_valid_integral_roman_input_collection", Helpers.input_set_2
|
49
|
+
end
|
50
|
+
|
51
|
+
context %Q(Symbol 'I' can be subtrated from 'V' and 'X' only, and
|
52
|
+
Symbol 'X' can be subtracted from 'L' and 'C' only, and
|
53
|
+
Symbol 'C' can be subtracted from 'D' and 'M' only) do
|
54
|
+
it_behaves_like "raises_error_on_invalid_roman_input_collection", %w(IL IC ID IM XD XM)
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'For Following Valid Inputs' do
|
58
|
+
it_behaves_like "works_with_valid_integral_roman_input_collection", Helpers.valid_inputs
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'For Following Invalid Input' do
|
62
|
+
[4000, 0, -10, '10'].each do |exp_input|
|
63
|
+
it %Q{raises #{$invalid_input_error} for #{exp_input} as input} do
|
24
64
|
expect {
|
25
65
|
RomanNumber.new(exp_input).convert_decimal_to_roman
|
26
|
-
}.to raise_error(
|
66
|
+
}.to raise_error($invalid_input_error)
|
27
67
|
end
|
28
68
|
end
|
29
69
|
end
|
30
70
|
end
|
31
71
|
|
32
|
-
describe '#
|
72
|
+
describe '#convert_roman_to_decimal' do
|
33
73
|
context 'For Valid Input' do
|
34
|
-
Helpers.valid_inputs.each do |
|
35
|
-
it %Q{returns #{
|
36
|
-
RomanNumber.new(
|
74
|
+
Helpers.valid_inputs.each do |hsh|
|
75
|
+
it %Q{returns #{hsh[:roman]} for #{hsh[:integer]} as input} do
|
76
|
+
RomanNumber.new(hsh[:roman]).convert_roman_to_decimal.should == hsh[:integer]
|
37
77
|
end
|
38
78
|
end
|
39
79
|
end
|
80
|
+
|
40
81
|
context 'For Invalid Input' do
|
41
|
-
|
42
|
-
|
43
|
-
it %Q{raises #{exp_output} for #{exp_input} as input} do
|
82
|
+
%w(ABCDE CCCCVII CCVVVVI).each do |exp_input|
|
83
|
+
it %Q{raises #{$invalid_input_error} for #{exp_input} as input} do
|
44
84
|
expect {
|
45
85
|
RomanNumber.new(exp_input).convert_roman_to_decimal
|
46
|
-
}.to raise_error(
|
86
|
+
}.to raise_error($invalid_input_error)
|
47
87
|
end
|
48
88
|
end
|
49
89
|
end
|
50
90
|
end
|
51
91
|
|
52
|
-
describe 'PRIVATE_INTERFACE' do
|
92
|
+
describe 'PRIVATE_INTERFACE (for developer)' do
|
53
93
|
describe '#largest_repeatable_element' do
|
54
94
|
# set 1
|
55
95
|
[
|
@@ -93,7 +133,6 @@ module RomanNumbers
|
|
93
133
|
end
|
94
134
|
end
|
95
135
|
end
|
96
|
-
|
97
136
|
end
|
98
137
|
end
|
99
138
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roman_numbers
|
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
|
- Munish Goyal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|