package Ġtemplate . experiment 4 Ċ Ċ import Ġjunit . framework . TestCase Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . todo ĊĊ Ċ /** Ċ Ġ* ĠCreates Ġa Ġstring Ġtemplate Ġfrom Ġsome Ġconstant Ġstring Ġexpressions Ġand Ġsome Ġdynamic Ġexpressions . Ċ Ġ*/ Ċ class ĠString Template < T >( val Ġconstant Text Ġ: ĠArray < String >, Ġval Ġfn Ġ: Ġ( T ) Ġ-> ĠUnit ) Ġ{ Ċ } Ċ Ċ fun ĠStringBuilder . text ( value Ġ: ĠString ) Ġ: ĠUnit Ġ{ ĊĠĠĠ Ġthis . append ( value ) Ċ } Ċ Ċ fun ĠStringBuilder . expression ( value Ġ: ĠAny ?) Ġ: ĠUnit Ġ{ ĊĠĠĠ Ġthis . append ( value ) Ċ } Ċ Ċ /** Ċ Ġ* ĠConverts Ġa Ġ[[ String Template ]] Ġto Ġa ĠString Ċ Ġ*/ Ċ fun ĠtoString ( template Ġ: ĠString Template < StringBuilder >) Ġ: ĠString Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠ Ġtemplate . fn ( builder ) ĊĠĠĠ Ġreturn Ġbuilder . toString () Ġ?: Ġ"" Ċ } Ċ Ċ class ĠString Template Test Ġ: ĠTestCase () Ġ{ ĊĠĠĠ Ġfun Ġtest Template () Ġ: ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" James " ĊĊĠĠĠĠĠĠĠ Ġ// ĠCode Ġgenerated Ġby Ġthe Ġfollowing Ġtemplate Ġexpression : ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġactual Ġ= Ġ" hello Ġ$ name !" ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠString Template < StringBuilder >( array (" hello Ġ", Ġ"! "), Ġ{ Ġ( it Ġ: ĠStringBuilder ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" About Ġto Ġapply Ġfunction !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . text (" hello Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . expression ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . text (" !") ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġprintln (" Template Ġhas Ġconstants Ġ${ template . constant Text . toList ()} Ġand Ġfunction Ġ${ template . fn }") ĊĊĠĠĠĠĠĠĠ Ġtodo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠtoString ( template ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" hello ĠJames !", Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }