/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 ĠMat th ias ĠGe is ler Ġ( bit P ogo ) Ġ/ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby ĠApache Ġv 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġtech . ant ib y tes . k mock . processor . mock Ċ Ċ import Ġcom . squareup . kotlin po et . TypeName Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġtech . ant ib y tes . k mock . processor . Processor Contract . Generic Declaration Ċ import Ġtech . ant ib y tes . k mock . processor . Processor Contract . Member Return TypeInfo Ċ import Ġtech . ant ib y tes . util . test . fixture . fixture Ċ import Ġtech . ant ib y tes . util . test . fixture . kotlin Fixture Ċ import Ġtech . ant ib y tes . util . test . must Be Ċ Ċ class ĠMember Return TypeInfo Extensions Spec Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfixture Ġ= Ġkotlin Fixture () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Class Scope Ġis Ġcalled Ġit Ġreturns Ġnull Ġif Ġno Ġclass Ġscope Ġwas Ġdeleg ated `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Class Scope () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Class Scope Ġis Ġcalled Ġit Ġreturns Ġnull Ġif Ġno Ġmatching Ġtypes Ġwere Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" any " Ġto Ġmock k () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Class Scope () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Class Scope Ġis Ġcalled Ġit Ġreturns Ġthe Ġresolved Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName Str Ġ= Ġ"${ fixture . fixture < String >() } ?" ĊĠĠĠĠĠĠĠ Ġval Ġtypes : ĠList < TypeName > Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġclass Scope : ĠMap < String , ĠList < TypeName >> Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Str . drop Last ( 1 ) Ġto Ġtypes ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġclass Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġproxy TypeName . toString () Ġ} Ġreturns Ġproxy TypeName Str ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Class Scope () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtypes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast Annotation Ġreturns Ġtrue Ġif Ġthe Ġmethod TypeName Ġand Ġproxy TypeName Ġdiffer `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġproxy TypeName . toString () Ġ} Ġreturns Ġfixture . fixture () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmethod TypeName . toString () Ġ} Ġreturns Ġfixture . fixture () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast Annotation ( null ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast Annotation Ġreturns Ġtrue Ġif Ġthe Ġrelax er Ġis Ġnot Ġnull Ġand Ġit Ġhas Ġgener ics Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelax er Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast Annotation Ġreturns Ġtrue Ġif Ġthe Ġrelax er Ġis Ġnot Ġnull Ġand Ġit Ġhas Ġa Ġresolve ĠClass Scope `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName Str Ġ= Ġ"${ fixture . fixture < String >() } ?" ĊĠĠĠĠĠĠĠ Ġval Ġtypes : ĠList < TypeName > Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġclass Scope : ĠMap < String , ĠList < TypeName >> Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Str . drop Last ( 1 ) Ġto Ġtypes ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġclass Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġproxy TypeName . toString () Ġ} Ġreturns Ġproxy TypeName Str ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelax er Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast For Receiver Property Ġreturns Ġfalse Ġif Ġit Ġhas Ġno Ġgener ics `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast For Receiver Property Ġreturns Ġfalse Ġif Ġit Ġhas Ġgener ics Ġand Ġat Ġless Ġthen Ġ 2 Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k ()) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . cast ReturnType Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast For Receiver Property Ġreturns Ġfalse Ġif Ġit Ġhas Ġgener ics Ġand Ġat Ġleast Ġ 2 Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k (), Ġmock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġneeds Cast For Receiver Property Ġreturns Ġtrue Ġif Ġthe Ġcast Ġflag Ġis Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns Ġempty List () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . cast ReturnType Ġ} Ġreturns Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . needs Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġhas Gener ics Ġreturns Ġfalse Ġif Ġneither Ġa Ġclass Ġscope Ġnor Ġa Ġgeneric Ġwere Ġgiven `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . has Gener ics () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġhas Gener ics Ġreturns Ġtrue Ġif Ġa Ġclass Ġscope Ġwas Ġgiven `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . has Gener ics () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġhas Gener ics Ġreturns Ġtrue Ġif Ġa Ġgener ics Ġwas Ġgiven `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . has Gener ics () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast On Return Ġreturns Ġa Ġstring Ġif Ġthe Ġmethod TypeName Ġand Ġproxy TypeName Ġdiffer `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast On Return () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ" Ġas Ġ$ method TypeName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Rel ax er Ġreturns Ġan Ġempty Ġstring Ġif Ġthe Ġrelax er Ġis Ġnull `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Rel ax er ( null ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Rel ax er Ġreturns Ġan Ġempty Ġstring Ġif Ġthe Ġrelax er Ġis Ġnot Ġnull Ġbut Ġit Ġhas Ġno Ġgener ics Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Rel ax er ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Rel ax er Ġreturns Ġa Ġstring Ġif Ġthe Ġrelax er Ġis Ġnot Ġnull Ġand Ġit Ġhas Ġgener ics Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Rel ax er ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ" Ġas Ġ$ method TypeName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Rel ax er Ġreturns Ġa Ġstring Ġif Ġthe Ġrelax er Ġis Ġnot Ġnull Ġand Ġit Ġhas Ġa Ġresolve ĠClass Scope `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġproxy TypeName Str Ġ= Ġ"${ fixture . fixture < String >() } ?" ĊĠĠĠĠĠĠĠ Ġval Ġtypes : ĠList < TypeName > Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġclass Scope : ĠMap < String , ĠList < TypeName >> Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Str . drop Last ( 1 ) Ġto Ġtypes ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġproxy TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġclass Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġproxy TypeName . toString () Ġ} Ġreturns Ġproxy TypeName Str ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Rel ax er ( mock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ" Ġas Ġ$ proxy TypeName Str " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Receiver Property Ġreturns Ġan Ġempty ĠString Ġif Ġit Ġhas Ġno Ġgener ics `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Receiver Property Ġreturns Ġan Ġempty Ġstring Ġif Ġit Ġhas Ġgener ics Ġand Ġat Ġless Ġthen Ġ 2 Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k ()) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . cast ReturnType Ġ} Ġreturns Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Receiver Property Ġreturns Ġa ĠString Ġif Ġit Ġhas Ġgener ics Ġand Ġat Ġleast Ġ 2 Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġmethod TypeName : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġmethod TypeName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns ĠlistOf ( mock k (), Ġmock k ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ" Ġas Ġ$ method TypeName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġresolve Cast For Receiver Property Ġreturns Ġa Ġstring Ġif Ġthe Ġcast Ġflag Ġis Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠType Name Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġgener ics : ĠGeneric Declaration Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= ĠMember Return TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod TypeName Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy TypeName Ġ= Ġmock k (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Ġ= Ġgener ics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Scope Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . types Ġ} Ġreturns Ġempty List () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġgener ics . cast ReturnType Ġ} Ġreturns Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġtype Info . resolve Cast For Receiver Property () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġactual Ġmust Be Ġ" Ġas Ġ$ type " ĊĠĠĠ Ġ} Ċ } Ċ