Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 105 additions & 4 deletions src/RomanNumerals.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,109 @@

public class RomanNumerals {
public int convertToInteger(String romanNum) {
// To be Implemented
return 0;
public int convertToInteger(String romanNum) {

romanNum = romanNum.toUpperCase();
if(testRepeatIXCM(romanNum)) return -1;
if(testRepeatVLD(romanNum)) return -2;
if(testAllowedSubstractIXC(romanNum)) return -3;
if(testAllowedSubstractOne(romanNum)) return -4;
if(testNoSubstractAllowedVLD(romanNum)) return -5;
if(!romanNum.matches("^[IVXLCDM]+$") && romanNum != "") return -6;

return calculateString(convertToNumberArray(romanNum));

}

private int getMainNumberValue(char pieceOfString){
int result = 0;

switch (pieceOfString){
case 'I': result = 1;
break;
case 'V': result = 5;
break;
case 'X': result = 10;
break;
case 'L': result = 50;
break;
case 'C': result = 100;
break;
case 'D': result = 500;
break;
case 'M': result = 1000;

} return result;
}

private boolean testRepeatVLD(String romanNum){
boolean test = false;
int counter = 1;
for(int i = 0; i < romanNum.length(); i++){
if(i >= 1 && romanNum.charAt(i) == romanNum.charAt(i-1) && "VLD".indexOf(romanNum.charAt(i)) >= 0) {
counter++;
if(counter >= 2) test = true;
}
else counter = 1;
} return test;
}

private boolean testRepeatIXCM(String romanNum){
boolean test = false;
int counter = 1;
for(int i = 0; i < romanNum.length(); i++){
if(i >= 1 && romanNum.charAt(i) == romanNum.charAt(i-1)) {
counter++;
if(counter >= 4) test = true;
}
else counter = 1;
} return test;
}

private boolean testAllowedSubstractOne(String romanNum){
boolean test = false;

for(int i = 2; i < romanNum.length(); i++){
if(romanNum.charAt(i-2) == 'I' && romanNum.charAt(i-1) == 'I' && "VX".indexOf(romanNum.charAt(i)) >= 0) test = true;
if(romanNum.charAt(i-2) == 'X' && romanNum.charAt(i-1) == 'X' && "LC".indexOf(romanNum.charAt(i)) >= 0) test = true;
if(romanNum.charAt(i-2) == 'C' && romanNum.charAt(i-1) == 'C' && "DM".indexOf(romanNum.charAt(i)) >= 0) test = true;
} return test;
}

private boolean testAllowedSubstractIXC(String romanNum){
boolean test = false;

for(int i = 1; i < romanNum.length(); i++){
if(romanNum.charAt(i-1) == 'I' && "LCDM".indexOf(romanNum.charAt(i)) >= 0) test = true;
if(romanNum.charAt(i-1) == 'X' && "DM".indexOf(romanNum.charAt(i)) >= 0) test = true;
} return test;
}

private boolean testNoSubstractAllowedVLD(String romanNum){
boolean test = false;

for(int i = 1; i < romanNum.length(); i++){
if(romanNum.charAt(i-1) == 'V' && romanNum.charAt(i) != 'I') test = true;
if(romanNum.charAt(i-1) == 'L' && "IVX".indexOf(romanNum.charAt(i)) == -1) test = true;
if(romanNum.charAt(i-1) == 'D' && romanNum.charAt(i) == 'M') test = true;
} return test;
}

private int calculateString(int[] numbersArray){
int result = 0;

for(int i=0; i < numbersArray.length; i++){
if(i < numbersArray.length-1 && numbersArray[i] < numbersArray[i+1]) result-=numbersArray[i];
else result += numbersArray[i];
} return result;
}

private int[] convertToNumberArray(String romanNum){
int[] numbersArray = new int[10];

for(int i = 0; i < romanNum.length(); i++){
numbersArray[i] = getMainNumberValue(romanNum.charAt(i));
} return numbersArray;
}
}


}
141 changes: 139 additions & 2 deletions tests/TestRomanNumerals.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,149 @@
import static org.junit.Assert.*;

import org.junit.Ignore;
import org.junit.Test;

public class TestRomanNumerals {

@Test
@Ignore
public void test() {
fail("Not yet implemented");
}

@Test
public void testRomanNumeralsVLDRepeatRules(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input VV should return error code -2", -2, test.convertToInteger("VV"));
assertEquals("Input VV should return error code -2", -2, test.convertToInteger("LL"));
assertEquals("Input VV should return error code -2", -2, test.convertToInteger("DD"));
}

@Test
public void testRomanNumeralsIXCMRepeatRules(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input IIII should return error code -1", -1, test.convertToInteger("IIII"));
assertEquals("Input XXXX should return error code -1", -1, test.convertToInteger("XXXX"));
assertEquals("Input CCCC should return error code -1", -1, test.convertToInteger("CCCC"));
assertEquals("Input MMMM should return error code -1", -1, test.convertToInteger("MMMM"));
}

@Test
public void testRomanNumeralsIXCSubstractRules(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input IL should return error code -3", -3, test.convertToInteger("IL"));
assertEquals("Input IC should return error code -3", -3, test.convertToInteger("IC"));
assertEquals("Input IC should return error code -3", -3, test.convertToInteger("ID"));
assertEquals("Input IC should return error code -3", -3, test.convertToInteger("IM"));
assertEquals("Input XD should return error code -3", -3, test.convertToInteger("XD"));
assertEquals("Input XM should return error code -3", -3, test.convertToInteger("XM"));

}

@Test
public void testRomanNumeralsOnlyOneSubstract(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input IIV should return error code -4", -4, test.convertToInteger("IIV"));
assertEquals("Input IIX should return error code -4", -4, test.convertToInteger("IIX"));
assertEquals("Input XXL should return error code -4", -4, test.convertToInteger("XXL"));
assertEquals("Input XXC should return error code -4", -4, test.convertToInteger("XXC"));
assertEquals("Input CCD should return error code -4", -4, test.convertToInteger("CCD"));
assertEquals("Input CCM should return error code -4", -4, test.convertToInteger("CCM"));

}
@Test
public void testRomanNumeralsNotSubtractVLD(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input VX should return error code -5", -5, test.convertToInteger("VX"));
assertEquals("Input LC should return error code -5", -5, test.convertToInteger("LC"));
assertEquals("Input DM should return error code -5", -5, test.convertToInteger("DM"));


}

@Test
public void testRomanNumeralsWithBasicElements() {
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input I should return 1", 1, test.convertToInteger("I"));
assertEquals("Input X should return 10", 10, test.convertToInteger("X"));
assertEquals("Input L should return 50", 50, test.convertToInteger("L"));
assertEquals("Input C should return 100", 100, test.convertToInteger("C"));
assertEquals("Input D should return 500", 500, test.convertToInteger("D"));
assertEquals("Input M should return 1000", 1000, test.convertToInteger("M"));

}

@Test
public void testRomanNumeralsAddTogether(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input MMMIII should return 3003", 3003, test.convertToInteger("MMMIII"));

}

@Test
public void testRomanNumeralsSubstract(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input IV should return 4", 4, test.convertToInteger("IV"));
assertEquals("Input IX should return 9", 9, test.convertToInteger("IX"));
assertEquals("Input XL should return 40", 40, test.convertToInteger("XL"));
assertEquals("Input XC should return 90", 90, test.convertToInteger("XC"));
assertEquals("Input CD should return 400", 400, test.convertToInteger("CD"));
assertEquals("Input CM should return 900", 900, test.convertToInteger("CM"));


}

@Test
public void testRomanNumeralsTotal(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input MMMCMXCIX should return 3999", 3999, test.convertToInteger("MMMCMXCIX"));
assertEquals("Empty Input should return 0", 0, test.convertToInteger(""));
}

@Test
public void testRomanNumeralsShouldAcceptLowerCase(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input MMMCMXCIX should return 3999", 3999, test.convertToInteger("mmmcmxcix"));
}

@Test
public void testRomanNumeralsOnlyContainMDCLXVI(){
//Setup
RomanNumerals test = new RomanNumerals();

//Assert
assertEquals("Input MMFM should return -6", -6, test.convertToInteger("MMFM"));
assertEquals("Input MF should return -6", -6, test.convertToInteger("MF"));
assertEquals("Input FM should return -6", -6, test.convertToInteger("FM"));

}

}