diff --git a/src/net/m14m/romannumeralkata/ExpressionParser.java b/src/net/m14m/romannumeralkata/ExpressionParser.java index 5ed70ea..6fdd8ac 100644 --- a/src/net/m14m/romannumeralkata/ExpressionParser.java +++ b/src/net/m14m/romannumeralkata/ExpressionParser.java @@ -1,5 +1,7 @@ package net.m14m.romannumeralkata; +import java.util.regex.*; + public class ExpressionParser { private final NumeralParser romanNumeralParser; private final Formatter romanNumeralFormatter; @@ -16,7 +18,9 @@ public ExpressionParser(RomanNumeralParser romanNumeralParser, this.arabicNumeralFormatter = arabicNumeralFormatter; } - public Expression parse(String input) { + public Expression parse(String input) throws IllegalExpressionError { + Matcher matcher = Pattern.compile("([mdclxviMDCLXVI]+|\\d+)").matcher(input); + if (!matcher.matches()) throw new IllegalExpressionError(); Expression expression; if (input.matches("[mdclxviMDCLXVI]+")) { expression = new Numeral(arabicNumeralFormatter, romanNumeralParser, input); diff --git a/src/net/m14m/romannumeralkata/Main.java b/src/net/m14m/romannumeralkata/Main.java index 0d9c68c..22186a2 100644 --- a/src/net/m14m/romannumeralkata/Main.java +++ b/src/net/m14m/romannumeralkata/Main.java @@ -21,9 +21,13 @@ public Main(Reader input, Writer output) { public void execute() throws IOException { String input; while ((input = this.input.readLine()) != null) { - Expression expression = expressionParser.parse(input); - String displayValue = expression.getFormatter().format(expression.getValue()); - output.println(displayValue); + try { + Expression expression = expressionParser.parse(input); + String displayValue = expression.getFormatter().format(expression.getValue()); + output.println(displayValue); + } catch (IllegalExpressionError illegalExpressionError) { + throw new RuntimeException(illegalExpressionError); + } } } } diff --git a/test/net/m14m/romannumeralkata/ExpressionParserTest.java b/test/net/m14m/romannumeralkata/ExpressionParserTest.java index c3ae677..72580b3 100644 --- a/test/net/m14m/romannumeralkata/ExpressionParserTest.java +++ b/test/net/m14m/romannumeralkata/ExpressionParserTest.java @@ -11,18 +11,18 @@ public class ExpressionParserTest { new ArabicNumeralParser(), new ArabicNumeralFormatter() ); - @Test public void shouldParseRomanNumeralExpressions() { + @Test public void shouldParseRomanNumeralExpressions() throws IllegalExpressionError { assertThat(parser.parse("iii").getValue(), is(3)); assertThat(parser.parse("IX").getValue(), is(9)); } - @Test public void shouldParseArabicNumeralExpressions() { + @Test public void shouldParseArabicNumeralExpressions() throws IllegalExpressionError { assertThat(parser.parse("3").getValue(), is(3)); assertThat(parser.parse("9").getValue(), is(9)); } @Test(expected = IllegalExpressionError.class) - public void shouldDisallowBadExpressions() { + public void shouldDisallowBadExpressions() throws IllegalExpressionError { parser.parse("abc"); } }