diff --git a/code/roman-numerals/src/main/java/fr/istic/vv/RomanNumeraUtils.java b/code/roman-numerals/src/main/java/fr/istic/vv/RomanNumeraUtils.java index 857046c..cec2968 100644 --- a/code/roman-numerals/src/main/java/fr/istic/vv/RomanNumeraUtils.java +++ b/code/roman-numerals/src/main/java/fr/istic/vv/RomanNumeraUtils.java @@ -19,18 +19,18 @@ public class RomanNumeraUtils { public static boolean isValidRomanNumeral(String value) { boolean isValid = true; - char lastChar = ' '; - int nbLastChar = 0; - int valMax = 1001; + char lastChar = ' ';//X + int nbLastChar = 0;//1 + int valMax = 1000;//9 for(int i = 0; imapToNum.get(lastChar)){ - //seul I X C peuvent soustraire un symbole (ex : IX XC CM) + //règle 5. : seul I X C peuvent soustraire un symbole (ex : IX XC CM) if(lastChar == 'I' || lastChar == 'X' || lastChar == 'C'){ valMax = mapToNum.get(lastChar)-1; //si plus de 1 soustraction (ex IIX) ou que la soustraction est ni 1/10 ni 1/5 du chiffre le plus grand @@ -40,6 +40,7 @@ public class RomanNumeraUtils { } else isValid = false; } + else if((mapToNum.get(val)>valMax)) isValid = false; //règles 6. } switch (val){ @@ -85,7 +86,6 @@ public class RomanNumeraUtils { char lastChar = ' '; for(int i = 0; i=val){ number -= val; res = res + symb; - System.out.println(res); notFound = false; } else{ @@ -133,7 +133,6 @@ public class RomanNumeraUtils { if(number>=val-valSub){ number -= val-valSub; res = res + symbSub + symb; - System.out.println(res); notFoundSub = false; notFound = false; } @@ -144,7 +143,6 @@ public class RomanNumeraUtils { } } - System.out.println("Return : " + res); return res; } else throw new IllegalArgumentException("max 4000"); diff --git a/code/roman-numerals/src/test/java/fr/istic/vv/RomanNumeralTest.java b/code/roman-numerals/src/test/java/fr/istic/vv/RomanNumeralTest.java index c3b9972..458aa58 100644 --- a/code/roman-numerals/src/test/java/fr/istic/vv/RomanNumeralTest.java +++ b/code/roman-numerals/src/test/java/fr/istic/vv/RomanNumeralTest.java @@ -3,120 +3,64 @@ import net.jqwik.api.*; import net.jqwik.api.constraints.IntRange; import static fr.istic.vv.RomanNumeraUtils.*; + public class RomanNumeralTest { - - - @Example - void simpleValidRomanNumerals() { - assert isValidRomanNumeral("I"); - assert isValidRomanNumeral("II"); - assert isValidRomanNumeral("III"); - assert isValidRomanNumeral("IV"); - assert isValidRomanNumeral("VI"); - assert isValidRomanNumeral("VIII"); - assert isValidRomanNumeral("IX"); - assert isValidRomanNumeral("X"); - assert isValidRomanNumeral("XI"); - assert isValidRomanNumeral("MI"); - assert isValidRomanNumeral("XIII"); - } - - @Example - void nonValidRomanNumeralsBadLetter() { - assert !isValidRomanNumeral("IIIA"); - assert !isValidRomanNumeral("A"); - assert !isValidRomanNumeral("CAI"); - } - - @Example - void nonValidRomanNumeralsRepeated() { - assert !isValidRomanNumeral("IIII"); - assert !isValidRomanNumeral("XXXX"); - assert !isValidRomanNumeral("CCCC"); - assert !isValidRomanNumeral("MMMM"); - assert !isValidRomanNumeral("DD"); - assert !isValidRomanNumeral("LL"); - assert !isValidRomanNumeral("VV"); - } - - @Example - void validRomanNumeralsLeftSub() { - assert isValidRomanNumeral("IV"); - assert isValidRomanNumeral("IX"); - assert isValidRomanNumeral("XL"); - assert isValidRomanNumeral("XC"); - assert isValidRomanNumeral("CD"); - assert isValidRomanNumeral("CM"); - - } - - @Example - void nonValidRomanNumeralsLeftSub() { - assert !isValidRomanNumeral("VX"); - assert !isValidRomanNumeral("VL"); - assert !isValidRomanNumeral("IL"); - assert !isValidRomanNumeral("IC"); - assert !isValidRomanNumeral("VC"); - assert !isValidRomanNumeral("LC"); - assert !isValidRomanNumeral("ID"); - assert !isValidRomanNumeral("VD"); - assert !isValidRomanNumeral("XD"); - assert !isValidRomanNumeral("LD"); - assert !isValidRomanNumeral("IM"); - assert !isValidRomanNumeral("VM"); - assert !isValidRomanNumeral("XM"); - assert !isValidRomanNumeral("LM"); - assert !isValidRomanNumeral("DM"); - } - - @Example - void completValidRomanNumerals() { - assert isValidRomanNumeral("MCDXXXIV"); - assert isValidRomanNumeral("DCCLXXXIX"); - assert isValidRomanNumeral("LXIX"); - assert isValidRomanNumeral("MCCXXXIV"); - - } - - @Example - void completNonValidRomanNumerals() { - assert !isValidRomanNumeral("IXX"); - assert !isValidRomanNumeral("IXIXIX"); - assert !isValidRomanNumeral("MMMDCCCLIXXXVIII"); - assert !isValidRomanNumeral("XIXV"); - - } + char[] chars = {'M','D','C','L','X','V','I'}; + //1. - @Example - void testParseRomanNumeral() { - assert parseRomanNumeral("XX")==20; - assert parseRomanNumeral("XIX")==19; - assert parseRomanNumeral("XXI")==21; - assert parseRomanNumeral("IX")==9; - assert parseRomanNumeral("MCCXXXIV")==1234; + @Provide + Arbitrary invalidCharsGenerator() { + return Arbitraries.strings() + .withChars('A', 'Z') + .ofMaxLength(6) + .filter(s -> s.matches(".*[^MDCLXVI].*")); } - - - - @Example - void testToRomanNumeral() { - assert toRomanNumeral(20).compareTo("XX")==0; - assert toRomanNumeral(19).compareTo("XIX")==0; - assert toRomanNumeral(21).compareTo("XXI")==0; - assert toRomanNumeral(9).compareTo("IX")==0; - assert toRomanNumeral(1234).compareTo("MCCXXXIV")==0; - assert toRomanNumeral(3999).compareTo("MMMCMXCIX")==0; - } - - - - - @Property - boolean absoluteValueOfAllNumbersIsPositive(@ForAll @IntRange(min=Integer.MIN_VALUE +1) int anInteger) { - return Math.abs(anInteger) >= 0; + void invalidCharacters(@ForAll("invalidCharsGenerator") String s) { + assert !isValidRomanNumeral(s); } + + //2.3. + @Provide + Arbitrary invalidRepeatGenerator() { + return Arbitraries.strings() + .withChars(chars) + .ofMaxLength(10) + .filter(s -> + s.contains("MMMM") || s.contains("CCCC")|| + s.contains("XXXX") || s.contains("IIII")|| + s.contains("DD") || s.contains("LL") || s.contains("VV") + ); + } + + @Property(tries = 1000) //1000 pour être sure de tester tout les cas + void invalidRepeat(@ForAll("invalidRepeatGenerator") String s) { + assert !isValidRomanNumeral(s); + } + + + //4.5.6. + + @Provide + Arbitrary romanRange() { + return Arbitraries.integers().between(1, 3999); + } + + //ps : Ce test a permis de corriger un manque à la règle 6. (cas XLIX) + @Property + void refindIntAfterConvert(@ForAll("romanRange") int val) { + String str = toRomanNumeral(val); + int res = parseRomanNumeral(str); + System.out.println(val); + assert res==val; + } + + @Property + void isValid(@ForAll("romanRange") int val) { + assert isValidRomanNumeral(toRomanNumeral(val)); + } + } diff --git a/code/roman-numerals/target/classes/fr/istic/vv/RomanNumeraUtils.class b/code/roman-numerals/target/classes/fr/istic/vv/RomanNumeraUtils.class index 72c1d5f..7543db5 100644 Binary files a/code/roman-numerals/target/classes/fr/istic/vv/RomanNumeraUtils.class and b/code/roman-numerals/target/classes/fr/istic/vv/RomanNumeraUtils.class differ diff --git a/code/roman-numerals/target/test-classes/fr/istic/vv/RomanNumeralTest.class b/code/roman-numerals/target/test-classes/fr/istic/vv/RomanNumeralTest.class index 6e32f2f..981af16 100644 Binary files a/code/roman-numerals/target/test-classes/fr/istic/vv/RomanNumeralTest.class and b/code/roman-numerals/target/test-classes/fr/istic/vv/RomanNumeralTest.class differ