/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠD uck Duck Go Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . duck duck go . app . global . exception Ċ Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ Ċ class ĠRoot Exception Finder Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest ee : ĠRoot Exception Finder ĊĠĠĠ Ġprivate Ġval Ġactual Root Ġ= ĠIllegalArgumentException (" 0 ") ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest ee Ġ= ĠRoot Exception Finder () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Exception IsNull Then Null Is Returned () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Root Ġ= Ġtest ee . find Root Exception ( null ) ĊĠĠĠĠĠĠĠ ĠassertNull ( calculated Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Exception Has No Additional Cause s It Is Ident ified As Root () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Root Ġ= Ġtest ee . find Root Exception ( actual Root ) ĊĠĠĠĠĠĠĠ Ġassert Root Found ( calculated Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Single Cause Then Correct Root Is Found () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnested Exception Ġ= Ġbuild Nested Exception ( actual Root , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Root Ġ= Ġtest ee . find Root Exception ( nested Exception ) ĊĠĠĠĠĠĠĠ Ġassert Root Found ( calculated Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Many Cause s Then Correct Root Is Found () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnested Exception Ġ= Ġbuild Nested Exception ( actual Root , Ġ 1 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Root Ġ= Ġtest ee . find Root Exception ( nested Exception ) ĊĠĠĠĠĠĠĠ Ġassert Root Found ( calculated Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwhen Nested Cause s Are Too Deep Then Returns Exception Found At Threshold () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnested Exception Ġ= Ġbuild Nested Exception ( actual Root , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Root Ġ= Ġtest ee . find Root Exception ( nested Exception ) ĊĠĠĠĠĠĠĠ Ġassert Root NotNull ( calculated Root ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 8 0 ", Ġcalculated Root ?. message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Root Found ( calculated Root : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Root NotNull ( calculated Root ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Wrong Ġcause Ġidentified ", Ġcalculated Root ?. message , Ġactual Root . message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Root NotNull ( calculated Root : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNotNull (" Root Ġwas Ġnull ; Ġnot Ġfound Ġcorrectly ", Ġcalculated Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Nested Exception ( ĊĠĠĠĠĠĠĠ Ġroot : ĠThrowable , ĊĠĠĠĠĠĠĠ Ġdepth Required : ĠInt ĊĠĠĠ Ġ): ĠThrowable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnested Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdepth Required ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnested Ġ= ĠIllegalArgumentException (( i Ġ+ Ġ 1 ). toString (), Ġnested ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnested ĊĠĠĠ Ġ} Ċ } Ċ