// package Ġcom . sk sam uel . kot est . engine . threads Ċ // Ċ // import Ġio . kot est . assertions . assert Soft ly Ċ // import Ġio . kot est . core . spec . Isolation Mode Ċ // import Ġio . kot est . core . spec . style . Fun Spec Ċ // import Ġio . kot est . matchers . collections . should Contain Any Of Ċ // import Ġio . kot est . matchers . collections . should Contain Exactly In Any Order Ċ // import Ġio . kot est . matchers . maps . should Have Size Ċ // import Ġkotlin . concurrent . get Or Set Ċ // Ċ // private Ġval Ġexternal Thread Accum Ġ= ĠPersistent Thread Local < String >() Ċ // Ċ // class ĠSpec Thread With Nested Test Instance Per Test Test Ġ: ĠFun Spec ({ Ċ // Ċ // ĠĠ Ġisolation Mode Ġ= ĠI sol ation Mode . Instance Per Test Ċ // ĠĠ Ġthreads Ġ= Ġ 3 Ċ // Ċ // ĠĠ Ġval Ġinner Thread Accum Ġ= Ċ // ĠĠĠĠĠ ĠPersistent Thread Local < String >() Ċ // Ċ // ĠĠ Ġafter Spec Ġ{ Ċ // ĠĠĠĠĠ Ġassert Soft ly Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . map Ġshould Have Size Ġ 1 Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . map . values . should Contain Any Of (" a ", Ġ" aa ", Ġ" b ", Ġ" bb ", Ġ" c ", Ġ" cc ", Ġ" cd ", Ġ" cdd ") Ċ // ĠĠĠĠĠ Ġ} Ċ // ĠĠ Ġ} Ċ // Ċ // ĠĠ Ġafter Project Ġ{ Ċ // ĠĠĠĠĠ Ġassert Soft ly Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . map . should Have Size ( 3 ) Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . map . values . should Contain Exactly In Any Order (" aaaa a ", Ġ" bb bbb ", Ġ" cccccc dc dd cdd ") Ċ // ĠĠĠĠĠ Ġ} Ċ // ĠĠ Ġ} Ċ // Ċ // ĠĠ Ġcontext (" First Ġsingle Ġthread Ġcontext ") Ġ{ Ċ // ĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" a ") Ċ // Ċ // ĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" a ") Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 1 Ġshould Ġcreate Ġown Ġkey Ġin Ġmap Ġwith Ġvalue Ġa ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" a ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" a ") Ċ // ĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 2 Ġshould Ġcreate Ġown Ġkey Ġin Ġmap Ġwith Ġvalue Ġ 1 ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" a ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" a ") Ċ // ĠĠĠĠĠ Ġ} Ċ // ĠĠ Ġ} Ċ // Ċ // ĠĠ Ġcontext (" Second Ġsingle Ġthread Ġcontext ") Ġ{ Ċ // Ċ // ĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" b ") Ċ // Ċ // ĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" b ") Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 1 Ġshould Ġcreate Ġkey Ġin Ġmap Ġor Ġadd Ġvalue Ġb ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" b ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" b ") Ċ // ĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 2 Ġshould Ġcreate Ġkey Ġin Ġmap Ġor Ġadd Ġvalue Ġb ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" b ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" b ") Ċ // ĠĠĠĠĠ Ġ} Ċ // ĠĠ Ġ} Ċ // Ċ // ĠĠ Ġcontext (" Third Ġsingle Ġthread Ġcontext ") Ġ{ Ċ // Ċ // ĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" c ") Ċ // Ċ // ĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" c ") Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 1 Ġshould Ġcreate Ġnew Ġkey Ġin Ġmap Ġfor Ġcontext Ġor Ġadd Ġvalue Ġc ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" c ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" c ") Ċ // ĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠ Ġtest (" test Ġ 2 Ġshould Ġcreate Ġnew Ġkey Ġin Ġmap Ġfor Ġcontext Ġor Ġadd Ġvalue Ġc ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" c ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" c ") Ċ // ĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠ Ġcontext (" First Ġinner Ġsingle Ġthread Ġcontext ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" d ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" d ") Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġtest (" test Ġ 1 Ġshould Ġcreate Ġnew Ġkey Ġin Ġmap Ġfor Ġcontext Ġor Ġadd Ġvalue Ġd ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" d ") Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" d ") Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġtest (" test Ġ 2 Ġshould Ġcreate Ġnew Ġkey Ġin Ġmap Ġfor Ġcontext Ġor Ġadd Ġvalue Ġd ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexternal Accum Ġ= Ġexternal Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Thread Accum . set ( external Accum Ġ+ Ġ" d ") Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccum Ġ= Ġinner Thread Accum . get Or Set Ġ{ Ġ"" Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinner Thread Accum . set ( accum Ġ+ Ġ" d ") Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠ Ġ} Ċ // ĠĠ Ġ} Ċ // Ċ // }) Ċ