package Ġio . d amo . as pen Ċ Ċ import Ġorg . junit . rules . Test Rule Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( Test Tree Runner :: class ) Ċ open Ġclass ĠTest Ġ: ĠTest Tree Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġroot Ġ= ĠTest Branch . create Root ( java Class . name ) ĊĠĠĠ Ġprivate Ġval Ġbody : ĠTest . () Ġ-> ĠUnit ĊĊĠĠĠ Ġconstructor ( body : ĠTest . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . body Ġ= Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . body Ġ= Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Root () Ġ= Ġroot ĊĊĠĠĠ Ġoverride Ġfun Ġread Test Body () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . body . invoke ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuse Rule ( rule : ĠTest Rule ) ĊĠĠĠĠĠĠĠ Ġ= Ġroot . add Rule ( rule ) ĊĊĠĠĠ Ġfun Ġbefore ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot . before Ġ= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġafter ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot . after Ġ= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdescribe ( name : ĠAny , Ġblock : ĠTest Description . () Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= ĠTest Description ( root . addChild Branch ( name )). block () ĊĊĠĠĠ Ġfun Ġtest ( name : ĠAny ? Ġ= Ġnull , Ġblock : Ġ() Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Test ( root , Ġname , Ġblock ) ĊĊĠĠĠ Ġfun Ġf test ( name : ĠAny ? Ġ= Ġnull , Ġblock : Ġ() Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Test ( root , Ġname , Ġblock , Ġfocused Ġ= Ġtrue ) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠTest Data > Ġtable Test ( table Data : ĠList < T >, Ġblock : ĠT . () Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Table Test ( root , Ġtable Data , Ġblock ) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠTest Data > Ġf table Test ( table Data : ĠList < T >, Ġblock : ĠT . () Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Table Test ( root , Ġtable Data , Ġblock , Ġfocused Ġ= Ġtrue ) Ċ } ĊĊ Ċ open Ġclass ĠTest Data ( val Ġname : ĠAny ) ĊĊ Ċ class ĠTest Description ( private Ġval Ġbranch : ĠTest Branch ) Ġ{ ĊĠĠĠ Ġfun Ġtest ( name : ĠAny ? Ġ= Ġnull , Ġblock : Ġ() Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Test ( branch , Ġname , Ġblock ) ĊĊĠĠĠ Ġfun Ġf test ( name : ĠAny Ġ= Ġ" test ", Ġblock : Ġ() Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Test ( branch , Ġname , Ġblock , Ġfocused Ġ= Ġtrue ) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠTest Data > Ġtable Test ( table Data : ĠList < T >, Ġblock : ĠT . () Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Table Test ( branch , Ġtable Data , Ġblock ) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠTest Data > Ġf table Test ( table Data : ĠList < T >, Ġblock : ĠT . () Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ= Ġfocused Table Test ( branch , Ġtable Data , Ġblock , Ġfocused Ġ= Ġtrue ) Ċ } ĊĊ Ċ private Ġfun Ġfocused Test ( branch : ĠTest Branch , Ġname : ĠAny ?, Ġblock : Ġ() Ġ-> ĠUnit , Ġfocused : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġval Ġtest Name Ġ= Ġname ?. toString () Ġ?: Ġ" test " ĊĠĠĠ Ġbranch . addChild Leaf ( test Name , Ġblock , Ġfocused ) Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠTest Data > Ġfocused Table Test ( branch : ĠTest Branch , Ġtable Data : ĠList < T >, Ġblock : ĠT . () Ġ-> ĠUnit , Ġfocused : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġtable Data . forEach Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠ Ġbranch . addChild Leaf ( data . name , Ġ{ Ġdata . block () Ġ}, Ġfocused ) ĊĠĠĠ Ġ} Ċ } Ċ