package Ġru . tim ak den . s udoku Ċ Ċ import Ġio . kot est . assertions . throw ables . should Not Throw Any Ċ import Ġio . kot est . assertions . throw ables . should Not Throw Any Unit Ċ import Ġio . kot est . assertions . throw ables . should Throw Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . kot est . matchers . throwable . should Have Message Ċ Ċ class ĠS udoku Spec Ġ: ĠString Spec ({ ĊĠĠĠ Ġ" S udoku Solution Extractor Ġshould Ġextract Ġsolution Ġfrom Ġfile " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilepath Ġ= Ġthis :: class . java . class Loader . getResource (" valid . txt ") ?. path Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġexpected Solution Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 3 , Ġ 5 , Ġ 2 , Ġ 6 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 6 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 4 , Ġ 9 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 8 , Ġ 2 , Ġ 6 , Ġ 1 , Ġ 9 , Ġ 5 , Ġ 3 , Ġ 4 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 7 , Ġ 4 , Ġ 6 , Ġ 8 , Ġ 2 , Ġ 9 , Ġ 1 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 9 , Ġ 5 , Ġ 1 , Ġ 7 , Ġ 4 , Ġ 3 , Ġ 6 , Ġ 2 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 5 , Ġ 1 , Ġ 9 , Ġ 3 , Ġ 2 , Ġ 6 , Ġ 8 , Ġ 7 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 , Ġ 4 , Ġ 8 , Ġ 9 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 7 , Ġ 6 , Ġ 3 , Ġ 4 , Ġ 1 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġshould Not Throw Any Ġ{ ĠS udoku Solution Extractor . get Solution FromFile ( filepath ) Ġ} ĠshouldBe Ġexpected Solution ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Solution Extractor Ġshould Ġthrow Ġexception Ġwhen Ġfile Ġcouldn 't Ġbe Ġopened " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilepath Ġ= Ġ" abc . xyz " ĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Solution Extractor . get Solution FromFile ( filepath ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" File Ġabc . xyz Ġdoesn 't Ġexist Ġor Ġit 's Ġa Ġdirectory " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Solution Extractor Ġshould Ġthrow Ġexception Ġwhen Ġfile Ġcontains Ġinvalid Ġnumber Ġof Ġlines " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilepath Ġ= Ġthis :: class . java . class Loader . getResource (" invalid _ number _ of _ lines . txt ") ?. path Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Solution Extractor . get Solution FromFile ( filepath ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" Input Ġdata Ġhas Ġinvalid Ġnumber Ġof Ġlines : Ġ 8 Ġ( should Ġbe Ġ 9 )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Solution Extractor Ġshould Ġthrow Ġexception Ġwhen Ġfile Ġcontains Ġinvalid Ġdata " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilepath Ġ= Ġthis :: class . java . class Loader . getResource (" contains _ letter . txt ") ?. path Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Solution Extractor . get Solution FromFile ( filepath ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" Line Ġ 6 Ġshould Ġmatch Ġthe Ġregex Ġ\" ([ 1 - 9 ], ){ 8 }[ 1 - 9 ] \", Ġbut Ġit Ġdidn 't : Ġ 9 , 5 , 1 , 7 , X , 3 , 6 , 2 , 8 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Validator Ġshould Ġvalidate Ġsolution " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 3 , Ġ 5 , Ġ 2 , Ġ 6 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 6 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 4 , Ġ 9 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 8 , Ġ 2 , Ġ 6 , Ġ 1 , Ġ 9 , Ġ 5 , Ġ 3 , Ġ 4 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 7 , Ġ 4 , Ġ 6 , Ġ 8 , Ġ 2 , Ġ 9 , Ġ 1 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 9 , Ġ 5 , Ġ 1 , Ġ 7 , Ġ 4 , Ġ 3 , Ġ 6 , Ġ 2 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 5 , Ġ 1 , Ġ 9 , Ġ 3 , Ġ 2 , Ġ 6 , Ġ 8 , Ġ 7 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 , Ġ 4 , Ġ 8 , Ġ 9 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 7 , Ġ 6 , Ġ 3 , Ġ 4 , Ġ 1 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġshould Not Throw Any Unit Ġ{ ĠS udoku Validator . validate ( solution ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Validator Ġshould Ġthrow Ġexception Ġwhen Ġsolution Ġcontains Ġduplicates Ġin Ġa Ġrow " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 3 , Ġ 5 , Ġ 2 , Ġ 6 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 6 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 4 , Ġ 9 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 9 , Ġ 7 , Ġ 7 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 8 , Ġ 2 , Ġ 6 , Ġ 1 , Ġ 9 , Ġ 5 , Ġ 3 , Ġ 4 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 7 , Ġ 4 , Ġ 6 , Ġ 8 , Ġ 2 , Ġ 9 , Ġ 1 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 9 , Ġ 5 , Ġ 1 , Ġ 8 , Ġ 4 , Ġ 3 , Ġ 6 , Ġ 2 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 5 , Ġ 1 , Ġ 9 , Ġ 3 , Ġ 2 , Ġ 6 , Ġ 8 , Ġ 7 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 , Ġ 4 , Ġ 8 , Ġ 9 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 7 , Ġ 6 , Ġ 3 , Ġ 4 , Ġ 1 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Validator . validate ( solution ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" Row Ġ 3 Ġcontains Ġduplicates : Ġ[ 1 , Ġ 9 , Ġ 7 , Ġ 7 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 2 ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Validator Ġshould Ġthrow Ġexception Ġwhen Ġsolution Ġcontains Ġduplicates Ġin Ġa Ġcolumn " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 3 , Ġ 5 , Ġ 2 , Ġ 6 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 6 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 4 , Ġ 9 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 9 , Ġ 7 , Ġ 8 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 8 , Ġ 2 , Ġ 6 , Ġ 1 , Ġ 9 , Ġ 5 , Ġ 3 , Ġ 4 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 7 , Ġ 4 , Ġ 6 , Ġ 8 , Ġ 2 , Ġ 9 , Ġ 1 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 9 , Ġ 5 , Ġ 1 , Ġ 7 , Ġ 4 , Ġ 3 , Ġ 6 , Ġ 2 , Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 5 , Ġ 1 , Ġ 9 , Ġ 2 , Ġ 3 , Ġ 6 , Ġ 8 , Ġ 7 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 , Ġ 4 , Ġ 8 , Ġ 9 , Ġ 5 , Ġ 7 , Ġ 1 , Ġ 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 7 , Ġ 6 , Ġ 3 , Ġ 4 , Ġ 1 , Ġ 8 , Ġ 2 , Ġ 5 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Validator . validate ( solution ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" Column Ġ 4 Ġcontains Ġduplicates : Ġ[ 2 , Ġ 5 , Ġ 8 , Ġ 1 , Ġ 6 , Ġ 7 , Ġ 2 , Ġ 9 , Ġ 4 ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" S udoku Validator Ġshould Ġthrow Ġexception Ġwhen Ġsolution Ġcontains Ġduplicates Ġin Ġa Ġ 3 x 3 Ġsquare " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsolution Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 , Ġ 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 , Ġ 9 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 , Ġ 9 , Ġ 1 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 , Ġ 9 , Ġ 1 , Ġ 2 , Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 5 , Ġ 6 , Ġ 7 , Ġ 8 , Ġ 9 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 6 , Ġ 7 , Ġ 8 , Ġ 9 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 7 , Ġ 8 , Ġ 9 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 8 , Ġ 9 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 9 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġshould Throw < S udoku Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS udoku Validator . validate ( solution ) ĊĠĠĠĠĠĠĠ Ġ} Ġshould Have Message Ġ" One Ġof Ġthe Ġ 3 x 3 Ġsquares Ġcontains Ġduplicates : Ġ[ 1 , Ġ 2 , Ġ 3 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 3 , Ġ 4 , Ġ 5 ]" ĊĠĠĠ Ġ} Ċ }) Ċ