From 68d7e617fb66ac1179fd324f97348e8b8ea59cc0 Mon Sep 17 00:00:00 2001 From: Giuseppe Superbo Date: Mon, 15 Oct 2018 17:12:22 +0300 Subject: [PATCH] Assignment finished --- src/RomanNumerals.java | 162 ++++++++++++++++++- tests/TestRomanNumerals.java | 294 ++++++++++++++++++++++++++++++++++- 2 files changed, 452 insertions(+), 4 deletions(-) diff --git a/src/RomanNumerals.java b/src/RomanNumerals.java index 20904f0..d312b3a 100644 --- a/src/RomanNumerals.java +++ b/src/RomanNumerals.java @@ -1,8 +1,166 @@ public class RomanNumerals { public int convertToInteger(String romanNum) { - // To be Implemented - return 0; + int result = 0; // + if(CheckingCharacters(romanNum)) { + if(checkingSubstraction(romanNum)) { + if(romanNum.length() == 1) + result = SingleCharacterValue(romanNum.charAt(0)); + else + result = SummingValues(romanNum); + } + else{ + result = -2; + System.out.println("Wrong number format for substractions! Return -2!"); + } + } + else{ + result = -1 ; + System.out.println("Wrong number format! Returning -1!"); + } + return result; } + + public boolean CheckingCharacters (String romanNum) { + boolean flag = true; + int countI = 0; + int countX = 0; + int countC = 0; + int countM = 0; + int countV = 0; + int countL = 0; + int countD = 0; + String check = ""; + for(int i=0; i < romanNum.length(); i++) { + check += romanNum.charAt(i); + switch(romanNum.charAt(i)) { + case('I'): + countI++; + if(countI > 3) + flag = false; + break; + case('X'): + countX++; + if(countX > 3 && check.contains("XXXX")) + flag = false; + break; + case('C'): + countC++; + if(countC > 3 && check.contains("CCCC")) + flag = false; + break; + case('M'): + countM++; + if(countM > 3 && check.contains("MMMM")) + flag = false; + break; + case('V'): + countV++; + if(countV > 1) + flag = false; + break; + case('L'): + countL++; + if(countL > 1) + flag = false; + break; + case('D'): + countD++; + if(countD > 1) + flag = false; + break; + default: + flag = false; + } + } + return flag; + } + + public boolean checkingSubstraction(String romanNum) { + boolean flag = true; + for(int i=0; i < romanNum.length(); i++) { + switch(romanNum.charAt(i)) { + case('I'): + if(i < romanNum.length() - 1 && romanNum.length() > 1) { + if(romanNum.charAt(i+1) != 'V' && romanNum.charAt(i+1) != 'X' && romanNum.charAt(i+1) != 'I') + flag = false; + } + + if(i < romanNum.length() - 2 && romanNum.length() > 2) { + if(romanNum.charAt(i+1) == 'I' && romanNum.charAt(i+2) != 'I') + flag = false; + } + + break; + case('X'): + if(i < romanNum.length() - 1 && romanNum.length() > 1) { + if(romanNum.charAt(i+1) != 'L' && romanNum.charAt(i+1) != 'C' && romanNum.charAt(i+1) != 'X' && romanNum.charAt(i+1) != 'I' && romanNum.charAt(i+1) != 'V') + flag = false; + + } + + if(i < romanNum.length() - 2 && romanNum.length() > 2) { + if(romanNum.charAt(i+1) == 'X' && (romanNum.charAt(i+2) != 'X' && romanNum.charAt(i+2) != 'V' && romanNum.charAt(i+2) != 'I')) + flag = false; + } + break; + + case('C'): + if(i < romanNum.length() - 1 && romanNum.length() > 1) { + if(romanNum.charAt(i+1) != 'D' && romanNum.charAt(i+1) != 'M' && romanNum.charAt(i+1) != 'C' && romanNum.charAt(i+1) != 'L' && romanNum.charAt(i+1) != 'X' && romanNum.charAt(i+1) != 'I' && romanNum.charAt(i+1) != 'V') + flag = false; + } + + if(i < romanNum.length() - 2 && romanNum.length() > 2) { + if(romanNum.charAt(i+1) == 'C' && (romanNum.charAt(i+2) != 'C' && romanNum.charAt(i+2) != 'L' && romanNum.charAt(i+2) != 'X' && romanNum.charAt(i+2) != 'V' && romanNum.charAt(i+2) != 'I' )) + flag = false; + } + break; + } + System.out.println(flag); + System.out.println(romanNum.charAt(i)); + } + return flag; + } + + public int SingleCharacterValue(char character) { + int value = 0; + switch(character) { + case('I'): + value = 1; + break; + case('V'): + value = 5; + break; + case('X'): + value = 10; + break; + case('L'): + value = 50; + break; + case('C'): + value = 100; + break; + case('D'): + value = 500; + break; + case('M'): + value = 1000; + break; + } + return value; + } + + public int SummingValues(String romanNum) { + int sum = 0; + for(int i = romanNum.length() - 1; i >= 0 ; i--) { + if(i != romanNum.length() - 1 && SingleCharacterValue(romanNum.charAt(i)) < SingleCharacterValue(romanNum.charAt(i+1))) + sum -= SingleCharacterValue(romanNum.charAt(i)); + else + sum += SingleCharacterValue(romanNum.charAt(i)); + } + System.out.println(sum); + return sum; + } } diff --git a/tests/TestRomanNumerals.java b/tests/TestRomanNumerals.java index 5d1de75..822d1d7 100644 --- a/tests/TestRomanNumerals.java +++ b/tests/TestRomanNumerals.java @@ -4,9 +4,299 @@ public class TestRomanNumerals { + //Test for CheckingCharacters() Method @Test - public void test() { - fail("Not yet implemented"); + public void CheckingCharacters_IIII() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("IIII")); } + + + @Test + public void CheckingCharacters_III() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("III")); + } + + @Test + public void CheckingCharacters_XXXX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("XXXX")); + } + + @Test + public void CheckingCharacters_XXXIX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("XXXIX")); + } + + @Test + public void CheckingCharacters_XXX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("XXX")); + } + + @Test + public void CheckingCharacters_CCCC() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("CCCC")); + } + + @Test + public void CheckingCharacters_CCCXC() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("CCCXC")); + } + + @Test + public void CheckingCharacters_CCC() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("CCC")); + } + + @Test + public void CheckingCharacters_MMMM() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("MMMM")); + } + + @Test + public void CheckingCharacters_MMMCM() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("MMMCM")); + } + + @Test + public void CheckingCharacters_MMM() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("MMM")); + } + + @Test + public void CheckingCharacters_VV() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("VV")); + } + + @Test + public void CheckingCharacters_V() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("V")); + } + + @Test + public void CheckingCharacters_LL() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("LL")); + } + + @Test + public void CheckingCharacters_L() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("L")); + } + + @Test + public void CheckingCharacters_DD() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.CheckingCharacters("DD")); + } + + @Test + public void CheckingCharacters_D() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.CheckingCharacters("D")); + } + + //Tests for CheckingSubstraction() method + + @Test + public void CheckingSubstraction_IIX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.checkingSubstraction("IIX")); + } + + @Test + public void CheckingSubstraction_XXL() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.checkingSubstraction("XXL")); + } + + @Test + public void CheckingSubstraction_XIII() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.checkingSubstraction("XIII")); + } + + @Test + public void CheckingSubstraction_CCD() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.checkingSubstraction("CCD")); + } + + @Test + public void CheckingSubstraction_DCCC() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(true, RN.checkingSubstraction("DCCC")); + } + + @Test + public void CheckingSubstraction_XD() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.checkingSubstraction("XD")); + } + + @Test + public void CheckingSubstraction_IM() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(false, RN.checkingSubstraction("IM")); + } + + //Tests for SingleCharacterValue() method + @Test + public void SingleCharacterValue_I() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(1, RN.SingleCharacterValue('I')); + } + + @Test + public void SumValue_V() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(5, RN.SingleCharacterValue('V')); + } + + @Test + public void SumValue_X() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(10, RN.SingleCharacterValue('X')); + } + + @Test + public void SumValue_L() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(50, RN.SingleCharacterValue('L')); + } + + @Test + public void SumValue_C() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(100, RN.SingleCharacterValue('C')); + } + + @Test + public void SumValue_D() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(500, RN.SingleCharacterValue('D')); + } + + @Test + public void SumValue_M() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(1000, RN.SingleCharacterValue('M')); + } + + //Tests for SummingValues() method + @Test + public void SummingValues_II() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(2,RN.SummingValues("II")); + } + + @Test + public void SummingValues_III() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(3,RN.SummingValues("III")); + } + + @Test + public void SummingValues_IV() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(4,RN.SummingValues("IV")); + } + + @Test + public void SummingValues_VI() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(6,RN.SummingValues("VI")); + } + + @Test + public void SummingValues_VII() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(7,RN.SummingValues("VII")); + } + + @Test + public void SummingValues_VIII() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(8,RN.SummingValues("VIII")); + } + + @Test + public void SummingValues_IX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(9,RN.SummingValues("IX")); + } + + @Test + public void SummingValues_XL() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(40,RN.SummingValues("XL")); + } + + @Test + public void SummingValues_XC() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(90,RN.SummingValues("XC")); + } + + @Test + public void SummingValues_CD() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(400,RN.SummingValues("CD")); + } + + @Test + public void SummingValues_CM() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(900,RN.SummingValues("CM")); + } + + //Tests convertToInteger() Method + @Test + public void convertToInteger_WrongFormatString() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(-1, RN.convertToInteger("ASdSADWD")); + } + + @Test + public void convertToInteger_WrongFormatString2() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(-2, RN.convertToInteger("ICCXX")); + } + + @Test + public void converToInteger_MDX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(1510, RN.convertToInteger("MDX")); + } + + @Test + public void converToInteger_MMCXCV() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(2195, RN.convertToInteger("MMCXCV")); + } + + @Test + public void converToInteger_MCMXCVII() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(1997, RN.convertToInteger("MCMXCVII")); + } + + @Test + public void converToInteger_CMXCIX() { + RomanNumerals RN = new RomanNumerals(); + assertEquals(999, RN.convertToInteger("CMXCIX")); + } }