package Ġcom . aut onomous apps . tasks Ċ Ċ import Ġcom . aut onomous apps . ad vice . P eb ble . R ipple Ċ import Ġcom . aut onomous apps . ad vice . R ipple Detector Ċ import Ġcom . aut onomous apps . graph . Dependency Graph Ċ import Ġcom . aut onomous apps . test . add Ad vice Ċ import Ġcom . aut onomous apps . test . change Ad vice Ċ import Ġcom . aut onomous apps . test . comp Ad vice For Ċ import Ġcom . aut onomous apps . test . graph From Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . Test Ċ Ċ class ĠR ipple Detector Test Ġ{ ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| ĊĠĠ Ġ* ĠB ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` a Ġtwo - node Ġgraph Ġcan 't Ġhave Ġri pp les `() Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From (": a ", Ġ": b ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a "), ĊĠĠĠĠĠ Ġcomp Ad vice For (": b ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġgraph Provider : Ġ( String ) Ġ-> ĠDependency Graph Ġ= Ġ{ Ġs Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ": a " Ġ-> Ġgraph From (": a ", Ġ": b ") ĊĠĠĠĠĠĠĠ Ġ": b " Ġ-> ĠDependency Graph (). apply Ġ{ Ġadd Node (": b ") Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġpath Ġ$ s ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": b ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġgraph Provider , ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġempty Set < R ipple >() ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA Ġuses ĠF . ĠWe Ġwill Ġbreak Ġthe Ġconnection Ġbetween ĠB Ġand ĠD . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| Ġ\ ĊĠĠ Ġ* ĠB Ġ ĠC ĊĠĠ Ġ* ĠâĶ Ĭ Ġ Ġ| ĊĠĠ Ġ* ĠD Ġ ĠE ĊĠĠ Ġ* Ġ| Ġ ĠâĶ Ĭ ĊĠĠ Ġ* ĠF ĠâĶ Ħ âĶ ĺ ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` can Ġdetect Ġri pple Ġfor Ġtrans itive Ġdependency Ġonce - removed `() Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From ( ĊĠĠĠĠĠ Ġ": a ", Ġ": b ", ĊĠĠĠĠĠ Ġ": a ", Ġ": c ", ĊĠĠĠĠĠ Ġ": b ", Ġ": d ", ĊĠĠĠĠĠ Ġ": d ", Ġ": f ", ĊĠĠĠĠĠ Ġ": c ", Ġ": e ", ĊĠĠĠĠĠ Ġ": e ", Ġ": f " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġgraph Provider : Ġ( String ) Ġ-> ĠDependency Graph Ġ= Ġ{ Ġs Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ": e " Ġ-> Ġgraph From (": e ", Ġ": f ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgraph . sub graph ( s ). remove Edge (": e ", Ġ": f ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġadvice For A Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For B Ġ= Ġchange Ad vice (": d ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a ", Ġadvice For A ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": b ", Ġadvice For B ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": b ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġgraph Provider , ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": a ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For B , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For A ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA Ġand ĠB Ġboth Ġuse ĠF . ĠWe Ġwill Ġbreak Ġthe Ġconnection Ġbetween ĠD Ġand ĠF . ĠThis Ġcauses Ġa Ġri pple Ġin ĠB ĊĠĠ Ġ* Ġ( but Ġnot Ġin ĠA , Ġsince ĠA Ġstill Ġhas Ġan Ġalternative Ġpath Ġto ĠF ). ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| Ġ\ ĊĠĠ Ġ* ĠB Ġ ĠC ĊĠĠ Ġ* Ġ| Ġ Ġ| ĊĠĠ Ġ* ĠD Ġ ĠE ĊĠĠ Ġ* ĠâĶ Ĭ Ġ/ ĊĠĠ Ġ* ĠF ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` detect s Ġdefin ite Ġri pple Ġand Ġexclude s Ġpotential Ġri pple Ġthat Ġhas Ġalternative Ġpath `() Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From ( ĊĠĠĠĠĠ Ġ": a ", Ġ": b ", ĊĠĠĠĠĠ Ġ": a ", Ġ": c ", ĊĠĠĠĠĠ Ġ": b ", Ġ": d ", ĊĠĠĠĠĠ Ġ": d ", Ġ": f ", ĊĠĠĠĠĠ Ġ": c ", Ġ": e ", ĊĠĠĠĠĠ Ġ": e ", Ġ": f " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġadvice For A Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For B Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For D Ġ= Ġchange Ad vice (": f ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a ", Ġadvice For A ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": b ", Ġadvice For B ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": d ", Ġadvice For D ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": d ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġ{ Ġgraph . sub graph ( it ) Ġ}, ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": b ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For B ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA Ġand ĠB Ġboth Ġuse ĠF . ĠWe Ġwill Ġbreak Ġthe Ġconnection Ġbetween ĠD Ġand ĠF . ĠThis Ġcauses Ġa Ġri pple Ġin Ġboth ĊĠĠ Ġ* ĠA Ġand ĠB . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| Ġ\ ĊĠĠ Ġ* ĠB Ġ ĠC ĊĠĠ Ġ* Ġ| Ġ Ġ| ĊĠĠ Ġ* ĠD Ġ ĠE ĊĠĠ Ġ* ĠâĶ Ĭ ĊĠĠ Ġ* ĠF ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` detect s Ġtwo Ġri pp les `() Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From ( ĊĠĠĠĠĠ Ġ": a ", Ġ": b ", ĊĠĠĠĠĠ Ġ": a ", Ġ": c ", ĊĠĠĠĠĠ Ġ": b ", Ġ": d ", ĊĠĠĠĠĠ Ġ": d ", Ġ": f ", ĊĠĠĠĠĠ Ġ": c ", Ġ": e " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġadvice For A Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For B Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For D Ġ= Ġchange Ad vice (": f ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a ", Ġadvice For A ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": b ", Ġadvice For B ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": d ", Ġadvice For D ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": d ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġ{ Ġgraph . sub graph ( it ) Ġ}, ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": b ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For B ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": a ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For A ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA Ġand ĠB Ġboth Ġuse ĠF . ĠWe Ġwill Ġbreak Ġthe Ġconnection Ġbetween ĠD Ġand ĠF . ĠWe Ġalso Ġhave Ġan Ġadvice Ġto ĊĠĠ Ġ* Ġbreak Ġthe Ġconnection Ġbetween ĠE Ġand ĠF , Ġbut Ġwe Ġdeli ber ately Ġonly Ġlook Ġfor Ġsingle - source Ġri pp les . ĊĠĠ Ġ* ĠTherefore Ġthere Ġwill Ġonly Ġbe Ġa Ġreported Ġri pple Ġin ĠB . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| Ġ\ ĊĠĠ Ġ* ĠB Ġ ĠC ĊĠĠ Ġ* Ġ| Ġ Ġ| ĊĠĠ Ġ* ĠD Ġ ĠE ĊĠĠ Ġ* ĠâĶ Ĭ Ġ ĠâĶ Ĭ ĊĠĠ Ġ* ĠF ĠâĶ Ħ âĶ ĺ ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` detect s Ġone Ġri pple Ġfrom Ġsingle Ġsource Ġ( algorithm Ġdoes Ġnot Ġsupport Ġmore Ġthan Ġone Ġsource )` () Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From ( ĊĠĠĠĠĠ Ġ": a ", Ġ": b ", ĊĠĠĠĠĠ Ġ": a ", Ġ": c ", ĊĠĠĠĠĠ Ġ": b ", Ġ": d ", ĊĠĠĠĠĠ Ġ": d ", Ġ": f ", ĊĠĠĠĠĠ Ġ": c ", Ġ": e ", ĊĠĠĠĠĠ Ġ": e ", Ġ": f " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġadvice For A Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For B Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For D Ġ= Ġchange Ad vice (": f ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġadvice For E Ġ= Ġchange Ad vice (": f ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a ", Ġadvice For A ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": b ", Ġadvice For B ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": d ", Ġadvice For D ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": e ", Ġadvice For E ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": d ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġ{ Ġgraph . sub graph ( it ) Ġ}, ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": b ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For B ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠĠ Ġ* ĠA Ġuses ĠF Ġand ĠG . ĠWe Ġwill Ġbreak Ġthe Ġconnection Ġbetween ĠD Ġand ĠF , Ġand ĠD Ġand ĠG . ĠThere Ġwill Ġbe Ġtwo ĊĠĠ Ġ* Ġri pp les Ġin ĠA . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA ĊĠĠ Ġ* Ġ| Ġ\ ĊĠĠ Ġ* ĠB Ġ ĠC ĊĠĠ Ġ* Ġ| ĠĠ Ġ\ ĊĠĠ Ġ* ĠD ĠĠĠ ĠE ĊĠĠ Ġ* ĠâĶ Ĭ Ġ? ĊĠĠ Ġ* ĠF Ġ ĠG ĊĠĠ Ġ*/ ĊĠ Ġ@ Test Ġfun Ġ` detect s Ġtwo Ġri pp les Ġfrom Ġtwo Ġdown grade s `() Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġgraph Ġ= Ġgraph From ( ĊĠĠĠĠĠ Ġ": a ", Ġ": b ", ĊĠĠĠĠĠ Ġ": a ", Ġ": c ", ĊĠĠĠĠĠ Ġ": b ", Ġ": d ", ĊĠĠĠĠĠ Ġ": d ", Ġ": f ", ĊĠĠĠĠĠ Ġ": d ", Ġ": g ", ĊĠĠĠĠĠ Ġ": c ", Ġ": e " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġadvice For A 1 Ġ= Ġadd Ad vice (": f ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For A 2 Ġ= Ġadd Ad vice (": g ", Ġ" implementation ", Ġ": d ") ĊĠĠĠ Ġval Ġadvice For D 1 Ġ= Ġchange Ad vice (": f ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġadvice For D 2 Ġ= Ġchange Ad vice (": g ", Ġ" api ", Ġ" implementation ") ĊĠĠĠ Ġval Ġbuild Health Ġ= Ġset Of ( ĊĠĠĠĠĠ Ġcomp Ad vice For (": a ", Ġadvice For A 1 , Ġadvice For A 2 ), ĊĠĠĠĠĠ Ġcomp Ad vice For (": d ", Ġadvice For D 1 , Ġadvice For D 2 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġactual Ġ= ĠR ipple Detector ( ĊĠĠĠĠĠ Ġquery Project Ġ= Ġ": d ", ĊĠĠĠĠĠ Ġproject Graph Provider Ġ= Ġ{ Ġgraph . sub graph ( it ) Ġ}, ĊĠĠĠĠĠ Ġfull Graph Ġ= Ġgraph , ĊĠĠĠĠĠ Ġbuild Health Ġ= Ġbuild Health ĊĠĠĠ Ġ). pe bble ĊĠĠĠ Ġval Ġexpected Ġ= Ġset Of ( ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": a ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D 1 , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For A 1 ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠR ipple ( ĊĠĠĠĠĠĠĠ Ġimpact ed Project Ġ= Ġ": a ", ĊĠĠĠĠĠĠĠ Ġdown grade Ġ= Ġadvice For D 2 , ĊĠĠĠĠĠĠĠ Ġupgrade Ġ= Ġadvice For A 2 ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( actual . ri pp les ). contains Exactly Elements In ( expected ) ĊĠ Ġ} Ċ }