package Ġnet . bnb 1 . k rad le . features Ċ Ċ import Ġio . kot est . core . spec . Isolation Mode Ċ import Ġio . kot est . core . spec . style . Behavior Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mock k . Called Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġnet . bnb 1 . k rad le . Mocks Ċ import Ġorg . gradle . api . Project Ċ Ċ class ĠFeature Tests Ġ: ĠBehavior Spec ({ ĊĊĠĠĠ Ġisolation Mode Ġ= ĠI sol ation Mode . Instance Per Leaf ĊĊĠĠĠ Ġval Ġproject Ġ= ĠMock s . project () ĊĊĠĠĠ Ġgiven (" Feature Ġwith Ġblue prints Ġand Ġlisteners ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= ĠFeature (). also Ġ{ Ġit . enable () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġblueprint 1 Ġ= Ġspy k ( Blueprint 1 ( project )). also Ġ{ Ġfeature . add Blueprint ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġblueprint 2 Ġ= Ġspy k ( Blueprint 2 ( project )). also Ġ{ Ġfeature . add Blueprint ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlistener 1 Ġ= Ġmock k < Feature Listener >( relax ed Ġ= Ġtrue ). also Ġ{ Ġfeature . addListener ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlistener 2 Ġ= Ġmock k < Feature Listener >( relax ed Ġ= Ġtrue ). also Ġ{ Ġfeature . addListener ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Activate ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" The Ġassigned Ġblue prints Ġare Ġalso Ġactivated ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblueprint 1 . activate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblueprint 2 . activate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" The Ġassigned Ġlisteners Ġare Ġnotified ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener 1 . on Feature Activate ( Feature :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener 2 . on Feature Activate ( Feature :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Activate Ġtwice ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" The Ġsecond Ġattempt Ġis Ġignored ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener 1 . on Feature Activate ( Feature :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Activate Ġdisabled Ġfeature ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . disable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Feature Ġis Ġnot Ġactivated ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener 1 Ġwas Not ĠCalled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġgiven (" Feature ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= ĠFeature (). also Ġ{ Ġit . enable () Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Add Ġblueprint Ġtwice ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblueprint Ġ= Ġspy k ( Blueprint 1 ( project )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . add Blueprint ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . add Blueprint ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" The Ġsecond Ġattempt Ġis Ġignored ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblueprint . activate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Add Ġlistener Ġtwice ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġmock k < Feature Listener >( relax ed Ġ= Ġtrue ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . addListener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . addListener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . activate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" The Ġsecond Ġattempt Ġis Ġignored ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Feature Activate ( Feature :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Disable Ġis Ġcalled ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . disable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . enable () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Enable Ġis Ġno Ġlonger Ġpossible ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . isEnabled ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ Ċ class ĠBlueprint 1 ( project : ĠProject ) Ġ: ĠBlueprint ( project ) Ċ class ĠBlueprint 2 ( project : ĠProject ) Ġ: ĠBlueprint ( project ) Ċ