package Ġorg . v accine impact . api . black box Tests . schemas Ċ Ċ import Ġcom . openc sv . CSV Reader Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . assertj . core . api . Assertions . fail Ċ import Ġjava . io . String Reader Ċ Ċ open Ġclass ĠCSV Specification ( protected Ġval Ġcolumns : ĠList < CSV Column Specification >) Ċ { ĊĠĠĠ Ġfun Ġvalidate Row ( csv AsString : ĠString ): ĠIterable < Array < String >> ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Text Ġ= Ġcsv AsString . trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( trimmed Text . startsWith ("{ ") Ġ|| Ġtrimmed Text . startsWith (" [" )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Expected ĠCSV Ġdata , Ġbut Ġthis Ġlooks Ġa Ġlot Ġlike ĠJSON : Ġ$ csv AsString ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcsv Ġ= ĠString Reader ( trimmed Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĠCSV Reader ( it ). read All () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġprocess Row ( csv . first ()) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġcsv . drop ( 1 ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( headers ). contains Exactly Elements Of ( columns . map Ġ{ Ġit . name Ġ}) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġrow ) Ġin Ġbody . with Index ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Row ( process Row ( row ), Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Row ( row : ĠList < String >, ĠrowIndex : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( row . size Ġ!= Ġcolumns . size ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Row Ġ$ rowIndex Ġhad Ġthe Ġwrong Ġnumber Ġof Ġcolumns . ĠIt Ġhad Ġ${ row . size }, Ġbut Ġwe Ġexpected Ġ${ columns . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ(( spec , Ġactual ) Ġin Ġcolumns . zip ( row )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspec . assert Matches ( actual , ĠrowIndex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġprocess Row ( row : ĠArray < String >): ĠList < String > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrow . toList () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFlex ible CSV Specification ( minimum Columns : ĠList < CSV Column Specification >): ĠCSV Specification ( minimum Columns ) Ċ { ĊĠĠĠ Ġoverride Ġfun Ġprocess Row ( row : ĠArray < String >): ĠList < String > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġcare Ġwhat Ġhappens Ġafter Ġthe Ġspecified Ġcolumns Ġ- Ġthose Ġcan Ġbe Ġanything ĊĠĠĠĠĠĠĠ Ġreturn Ġrow . take ( columns . size ) ĊĠĠĠ Ġ} Ċ }