Created
October 17, 2013 10:06
-
-
Save msanroman/7022329 to your computer and use it in GitHub Desktop.
Software Craftsmanship Barcelona 2013 - Transformation Priority Premise [Roman Numerals Kata]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
should = require 'should' | |
class ArabicToRomanConversions | |
conversions: | |
[ | |
{ arabic: 1, roman: 'I'}, | |
{ arabic: 4, roman: 'IV'}, | |
{ arabic: 5, roman: 'V'}, | |
{ arabic: 9, roman: 'IX'}, | |
{ arabic: 10, roman: 'X'}, | |
{ arabic: 40, roman: 'XL'}, | |
{ arabic: 50, roman: 'L'}, | |
{ arabic: 90, roman: 'XC'}, | |
{ arabic: 100, roman: 'C'}, | |
{ arabic: 400, roman: 'CD'}, | |
{ arabic: 500, roman: 'D'}, | |
{ arabic: 900, roman: 'CM'} | |
{ arabic: 1000, roman: 'M'} | |
] | |
lookup_conversion: (arabic) -> | |
for conversion in @conversions | |
partial_conversion = conversion if conversion.arabic <= arabic | |
partial_conversion | |
class ArabicToRoman | |
constructor: (@dictionary) -> | |
cant_convert: (arabic) -> arabic < 1 | |
convert: (arabic, roman = '') -> | |
return roman if @cant_convert arabic | |
partial_conversion = @dictionary.lookup_conversion arabic | |
arabic_remaining = arabic - partial_conversion.arabic | |
roman += partial_conversion.roman | |
@convert arabic_remaining, roman | |
describe 'RomanNumerals', -> | |
before -> @roman_converter = new ArabicToRoman(new ArabicToRomanConversions) | |
it 'for 1 it should return I', -> @roman_converter.convert(1).should.eql 'I' | |
it 'for 2 it should return II', -> @roman_converter.convert(2).should.eql 'II' | |
it 'for 3 it should return III', -> @roman_converter.convert(3).should.eql 'III' | |
it 'for 4 it should return IV', -> @roman_converter.convert(4).should.eql 'IV' | |
it 'for 5 it should return V', -> @roman_converter.convert(5).should.eql 'V' | |
it 'for 9 it should return IX', -> @roman_converter.convert(9).should.eql 'IX' | |
it 'for 10 it should return X', -> @roman_converter.convert(10).should.eql 'X' | |
it 'for 40 it should return XL', -> @roman_converter.convert(40).should.eql 'XL' | |
it 'for 50 it should return L', -> @roman_converter.convert(50).should.eql 'L' | |
it 'for 90 it should return XC', -> @roman_converter.convert(90).should.eql 'XC' | |
it 'for 100 it should return C', -> @roman_converter.convert(100).should.eql 'C' | |
it 'for 400 it should return CD', -> @roman_converter.convert(400).should.eql 'CD' | |
it 'for 500 it should return D', -> @roman_converter.convert(500).should.eql 'D' | |
it 'for 900 it should return CM', -> @roman_converter.convert(900).should.eql 'CM' | |
it 'for 1000 it should return M', -> @roman_converter.convert(1000).should.eql 'M' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment