/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 6 Ġ< code @ io 7 m . com > Ġhttp :// io 7 m . com Ċ Ġ* Ċ Ġ* ĠPermission Ġto Ġuse , Ġcopy , Ġmodify , Ġand / or Ġdistribute Ġthis Ġsoftware Ġfor Ġany Ċ Ġ* Ġpurpose Ġwith Ġor Ġwithout Ġfee Ġis Ġhereby Ġgranted , Ġprovided Ġthat Ġthe Ġabove Ċ Ġ* Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġappear Ġin Ġall Ġcopies . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS " ĠAND ĠTHE ĠAUTHOR ĠDISCLAIM S ĠALL ĠWARRANTIES Ċ Ġ* ĠWITH ĠREG ARD ĠTO ĠTHIS ĠSOFTWARE ĠINCLUDING ĠALL ĠIMPLIED ĠWARRANTIES ĠOF Ċ Ġ* ĠMERCHANTABILITY ĠAND ĠFITNESS . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHOR ĠBE ĠLIABLE ĠFOR ĠANY Ċ Ġ* ĠSPECIAL , ĠDIRECT , ĠINDIRECT , ĠOR ĠCONSEQUENTIAL ĠDAMAGES ĠOR ĠANY ĠDAMAGES Ċ Ġ* ĠWHAT SO E VER ĠRESULT ING ĠFROM ĠLOSS ĠOF ĠUSE , ĠDATA ĠOR ĠPROFITS , ĠWHETHER ĠIN ĠAN Ċ Ġ* ĠACTION ĠOF ĠCONTRACT , ĠNEGLIGENCE ĠOR ĠOTHER ĠTOR TI O US ĠACTION , ĠARISING ĠOUT ĠOF ĠOR Ċ Ġ* ĠIN ĠCONNECTION ĠWITH ĠTHE ĠUSE ĠOR ĠPER FORMANCE ĠOF ĠTHIS ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . io 7 m . k struct ural . tests . parser . imp er ative Ċ Ċ import Ġcom . io 7 m . k struct ural . core . K SE lement . KS Block Ċ import Ġcom . io 7 m . k struct ural . core . K SE lement . KS Block . KS Block Paragraph Ċ import Ġcom . io 7 m . k struct ural . core . KS Parse Ċ import Ġcom . io 7 m . k struct ural . core . KS Parse Context Ċ import Ġcom . io 7 m . k struct ural . core . KS ParseError Ċ import Ġcom . io 7 m . k struct ural . core . KS Parser Driver Type Ċ import Ġcom . io 7 m . k struct ural . core . KS Result . KS Failure Ċ import Ġcom . io 7 m . k struct ural . core . KS Result . K SS uccess Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . FileSystem Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ Ċ abstract Ġclass ĠK S Imp er ative Parser Driver Contract Ġ{ ĊĊĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( ĊĠĠĠ ĠK S Imp er ative Parser Driver Contract :: class . java ) ĊĊĠ Ġprotected Ġabstract Ġfun Ġnew Driver () Ġ: ĠK S Parser Driver Type ĊĊĠ Ġprotected Ġabstract Ġfun Ġnew Filesystem () Ġ: ĠFileSystem ĊĊĠ Ġprotected Ġvar Ġfilesystem Ġ: ĠFileSystem ? Ġ= Ġnull ĊĊĠ Ġ@ Before Ġfun Ġsetup Filesystem () Ġ: ĠUnit Ġ{ ĊĠĠĠ Ġthis . filesystem Ġ= Ġnew Filesystem () ĊĠ Ġ} ĊĊĠ Ġ@ After Ġfun ĠtearDown Filesystem () Ġ: ĠUnit Ġ{ ĊĠĠĠ Ġthis . filesystem !!. close () ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun Ġother File () Ġ= ĊĠĠĠ Ġfilesystem !!. getPath ("/ other "). to AbsolutePath (). resolve (" file . sd ") ĊĊĠ Ġprotected Ġfun Ġdefault File () Ġ= ĊĠĠĠ Ġfilesystem !!. getPath (" file . txt ") ĊĊĠ Ġprotected Ġfun Ġroot Directory () Ġ= ĊĠĠĠ Ġfilesystem !!. root Directories . first () !! ĊĊĠ Ġprivate Ġfun Ġshow Errors ( r Ġ: ĠK S Failure < KS Block < KS Parse >, ĠK S ParseError >) Ġ{ ĊĠĠĠ Ġr . errors . forEach Indexed Ġ{ Ġi , Ġe Ġ-> ĊĠĠĠĠĠ ĠLOG . error ("[ {} ]: Ġ{}", Ġi , Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwrite ( s Ġ: ĠString , Ġfile Ġ: ĠPath ) Ġ{ ĊĠĠĠ Ġif Ġ( file . parent Ġ!= Ġnull ) ĠFiles . create Directories ( file . parent ) ĊĠĠĠ ĠFiles . write ( file . to AbsolutePath (), Ġs . toByteArray ( StandardCharsets . UTF _ 8 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error UnexpectedEOF () Ġ{ ĊĠĠĠ Ġwrite (""" """, Ġdefault File ()) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( root Directory ()) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġdefault File ()) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error Some where () Ġ{ ĊĠĠĠ Ġwrite (""" Ċ [ section Ġ[ title Ġx ]] Ċ [ paragraph ] Ċ [ paragraph Ġp ] Ċ [ paragraph ] Ċ """, Ġdefault File ()) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( root Directory ()) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġdefault File ()) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error Wrong Content () Ġ{ ĊĠĠĠ Ġwrite (""" Ċ [ section Ġ[ title Ġx ]] Ċ [ paragraph ] Ċ [ subsection Ġ[ title Ġk ]] Ċ [ paragraph ] Ċ """, Ġdefault File ()) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( root Directory ()) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġdefault File ()) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error No Inline Inter medi ates () Ġ{ ĊĠĠĠ Ġwrite (""" Ċ [ section Ġ[ title Ġx ]] Ċ [ paragraph ] Ċ [ subsection Ġ[ title Ġq ]] Ċ a Ġb Ġc Ġd Ġe Ġf Ġg Ġh Ġi Ġj Ġk Ġl Ġm Ġn Ġo Ġp Ġq Ġr Ġs Ġt Ġu Ġv Ġw Ġx Ġy Ġz . Ċ [ paragraph ] Ċ """, Ġdefault File ()) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( root Directory ()) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġdefault File ()) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error Too Many () Ġ{ ĊĠĠĠ Ġwrite (""" Ċ [ section Ġ[ title Ġx ] ĊĠ Ġ[ paragraph ]] Ċ """, Ġother File ()) ĊĊĠĠĠ Ġwrite (""" Ċ [ import Ġ"/ other / file . sd "] Ċ [ import Ġ"/ other / file . sd "] Ċ """, Ġdefault File ()) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( filesystem !!. getPath ("/ base ")) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġdefault File ()) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error Outside Base () Ġ{ ĊĠĠĠ Ġwrite (""" Ċ [ section Ġ[ title Ġx ] ĊĠ Ġ[ paragraph ]] Ċ """, Ġother File ()) ĊĊĠĠĠ Ġval Ġc file Ġ= Ġfilesystem !!. getPath ("/ base / file . txt ") ĊĠĠĠ Ġwrite (""" Ċ [ import Ġ"/ other / file . sd "] Ċ """, Ġc file ) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( filesystem !!. getPath ("/ base ")) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġc file ) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 2 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest Error Outside Base Inline () Ġ{ ĊĠĠĠ Ġwrite (""" Hello . """, Ġother File ()) ĊĊĠĠĠ Ġval Ġc file Ġ= Ġfilesystem !!. getPath ("/ base / file . txt ") ĊĠĠĠ Ġwrite (""" Ċ [ paragraph ] Ċ [ include Ġ"/ other / file . sd "] Ċ """, Ġc file ) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( filesystem !!. getPath ("/ base ")) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġc file ) ĊĊĠĠĠ Ġr Ġas ĠK S Failure ĊĠĠĠ Ġshow Errors ( r ) ĊĠĠĠ ĠAssert . assertEquals ( 1 , Ġr . errors . size ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġtest OK () Ġ{ ĊĠĠĠ Ġval Ġc file Ġ= Ġfilesystem !!. getPath ("/ base / file . txt ") ĊĠĠĠ Ġwrite (""" Ċ [ paragraph ] Ċ A ĠB ĠC Ċ """, Ġc file ) ĊĊĠĠĠ Ġval Ġd Ġ= Ġnew Driver () ĊĠĠĠ Ġval Ġc Ġ= ĠK S Parse Context . empty ( filesystem !!. getPath ("/ base ")) ĊĠĠĠ Ġval Ġr Ġ= Ġd . parse Block ( c , Ġc file ) ĊĊĠĠĠ Ġr Ġas ĠK SS uccess < KS Block Paragraph < KS Parse >, ĠK S ParseError > ĊĠ Ġ} Ċ }