package Ġio . kot est . engine . spec Ċ Ċ import Ġio . kot est . core . spec . Order Ċ import Ġio . kot est . core . spec . Spec Ċ import Ġio . kot est . core . spec . Spec Execution Order Ċ import Ġio . kot est . mpp . annotation Ċ import Ġio . kot est . mpp . best Name Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠA Ġtype class Ġfor Ġordering Ġ[ Spec ] s . Ċ Ġ*/ Ċ interface ĠSpec Sorter Ġ{ ĊĊĠĠ Ġfun Ġcompare ( a : ĠK Class < out ĠSpec >, Ġb : ĠK Class < out ĠSpec >): ĠInt ĊĊĠĠ Ġfun Ġsort Classes ( classes : ĠList < K Class < out ĠSpec >> ): ĠList < K Class < out ĠSpec >> Ġ= ĊĠĠĠĠĠ Ġclasses . sorted With Ġ{ Ġa , Ġb Ġ-> Ġcompare ( a , Ġb ) Ġ} ĊĊĠĠ Ġfun Ġsort Specs ( specs : ĠList < Spec >): ĠList < Spec > Ġ= ĊĠĠĠĠĠ Ġspecs . sorted With Ġ{ Ġa , Ġb Ġ-> Ġcompare ( a :: class , Ġb :: class ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġimplementation Ġof Ġ[ Spec Execution Order ] Ġwhich Ġwill Ġorder Ġspecs Ġin Ġa Ġlex ico graphic Ġorder . Ċ Ġ*/ Ċ object ĠLex ico graphic Spec Sorter Ġ: ĠSpec Sorter Ġ{ ĊĠĠ Ġoverride Ġfun Ġcompare ( a : ĠK Class < out ĠSpec >, Ġb : ĠK Class < out ĠSpec >): ĠInt Ġ= Ġa . best Name (). compareTo ( b . best Name ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġimplementation Ġof Ġ[ Spec Execution Order ] Ġwhich Ġwill Ġorder Ġspecs Ġrandomly . Ċ Ġ*/ Ċ object ĠRandom Spec Sorter Ġ: ĠSpec Sorter Ġ{ ĊĠĠ Ġoverride Ġfun Ġcompare ( a : ĠK Class < out ĠSpec >, Ġb : ĠK Class < out ĠSpec >): ĠInt Ġ= ĠRandom . nextInt () Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġimplementation Ġof Ġ[ Spec Execution Order ] Ġwhich Ġwill Ġorder Ġspecs Ġbased Ġon Ġthe Ġinteger Ċ Ġ* Ġvalue Ġof Ġthe Ġ[ Order ] Ġannotation . ĠIf Ġthe Ġannotation Ġis Ġnot Ġpresent , Ġthen Ġthat Ġspec Ġis Ċ Ġ* Ġassumed Ġto Ġhave Ġa Ġ[ Int . MAX _ VALUE ] Ġdefault Ġvalue . Ċ Ġ* Ċ Ġ* ĠNote : ĠRuntime Ġannotations Ġare Ġnot Ġsupported Ġon ĠNative Ġor ĠJS Ġso Ġon Ġthose Ġplatforms Ċ Ġ* Ġthis Ġsort Ġorder Ġis Ġa Ġno - op . Ċ Ġ*/ Ċ expect Ġobject ĠAnnot ated Spec Sorter Ġ: Spec Sorter Ċ Ċ expect Ġclass ĠFailure First Sorter () Ġ: ĠSpec Sorter Ċ