Skip to content

Instantly share code, notes, and snippets.

@msanroman
Created October 17, 2013 10:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msanroman/7022329 to your computer and use it in GitHub Desktop.
Save msanroman/7022329 to your computer and use it in GitHub Desktop.
Software Craftsmanship Barcelona 2013 - Transformation Priority Premise [Roman Numerals Kata]
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