From 2b34be26dc734f835a74a2601e260f36495503a4 Mon Sep 17 00:00:00 2001 From: Rochas Date: Wed, 17 Dec 2025 00:42:06 +0100 Subject: [PATCH] test jqwik --- .../java/fr/istic/vv/RomanNumeraUtils.java | 20 +-- .../java/fr/istic/vv/RomanNumeralTest.java | 160 ++++++------------ .../fr/istic/vv/RomanNumeraUtils.class | Bin 4053 -> 3835 bytes .../fr/istic/vv/RomanNumeralTest.class | Bin 4361 -> 3897 bytes 4 files changed, 61 insertions(+), 119 deletions(-) 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 72c1d5f897bc6826cf984d764756141b2f0ab7fd..7543db56a995dbf3decaaebcc930c3a6431e9554 100644 GIT binary patch delta 1187 zcmYL{ZBUd|6vuyOpXb?UUj=DagCsYT2o^G@*dj?pKmxZ+E7(L+2oePrh2*<9|GoE||Nnfq zayH-h_1yJo;2}mo@cnMwzC6*B3=gz)?QIKh>*;PugcJSU?Y%8s&WzEV?O}&Nj>4Y{ zu#4T!_hyYR2cb3XKJTotB8G={=ajWuI-I|)N8J4k+6*{r-9^SOhMb-5i>s3!Mg*6L zheLuP`Vpv4B-(qcyIT7C+WTydIBV=;Ir`ytJ0ay?VPJz?HY>8jj~eTj8h=JjBWg{^ zSaHajBocLBV`<1e#cdz6*2Q`0Sdkrmi*KD=Z=sxYs=Q6I)j97i>MS%WCRml8^8Y_k z=HhemCMge@SFntVko&6Er{A~^eV1w-HH%}9uJwy{OxLvk_@dvq=*QE(6ZGxKO5X9V z+6Jq2K1+c!6K56sxSJysaD#jJfqVIxB7UWqKZr2LeNw{%@&pgcR>~w! zRGN8MS}B({*2x|!SUaHd5z6-l9-$(PcE@VUxCN4Q)wdE zK$W^K4Q$l%1WPVziM6<}NiEEs9HFMXgTb3mcys8>SX(&@MHggh7KuZ&s}vPv?pd11aO z@6Gv!$orr0eng<*v2676hm|~tf3LL z4)PL*809d>Rq=84PH|Lw;uu$TcbYN2d^dRT+=42Ryw!v-lB$a&e56Cuv=4T&}(c> zsGTmwc{o9`44C2gUS&4q>$43kCFQ?_1@%+ delta 1367 zcmZuwTTEP46kU7notZliEFBmcsijkq1_VN4ks3fO4CPV4V5!hrDvUBB?Jz@U29&mR z1Su5yp!U#O+q9-c!-sxYHCQmBUz(WuW5Sm)G4aPHCK{tL^o8pV#Q0(EJ$uf&XYYO1 z-fPd@O-q}d-#%Da1h5@%-*En{rMT8;>e$_i=P&HXgZDTlT$GAFU&11d^HE+FEe8RwKfkni?S=J!t=A6K}I~ebe zhJB?z5wIKKVALN9#A3mi9ZDUwJ+5C6WT{1K)+gWCnq=cmXs`ovMK4eFJ*`!&*KU{S zT8VX5hE$QUK{}NEdnDEOE4My4evFv3OL%=9ozUJ_Zl9fJ&SC0%dsg@h0Umg4}EwP zBgn=j zD4?g;)pZ@&s~a=QX~sqV8^;KJ)FEC+;o=MouW@Znz`)`BF|FR#>RUR^0SuUSA8 z4O92f8ghhrGmI41AmP0V8yw{QYW7{iYo&R^*L8zwkBllTk6qN88Z z5R(m1l8tG}!NsKbN6c0xq=;A5l9iJOdpXZSR`>8aFSn4|Z4wwH`xbmf8h-Y_6<@50 z-+}i@%M?G3a~y+O)^!OX()7c?6?XnOzd1#70;ub1YS|dzjVGl<6n@&7Q`lpiiOwvx_EweO! KJ&$SD{qR3>XcpT5 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 6e32f2fce7179851f8c9753a4110ef9787aed6aa..981af163226820c3cd14f0a279b32527f43d6a80 100644 GIT binary patch literal 3897 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 Qt$@gcJqWzV+X(*iJziF_4FCWD