@@ -20,6 +20,7 @@ const transformPrefix = getVendorPrefix('transform');
2020const View = require ( '../examples/src/view' ) ;
2121class ViewA extends View { }
2222class ViewB extends View { }
23+ class ViewC extends View { }
2324
2425describe ( 'NavigationController' , ( ) => {
2526 const views = [
@@ -597,6 +598,145 @@ describe('NavigationController', () => {
597598 } ) ;
598599 } ) ;
599600 } ) ;
601+ describe ( '#__popToRootView' , ( ) => {
602+ beforeEach ( done => {
603+ controller = renderIntoDocument (
604+ < NavigationController views = { [ < ViewA /> , < ViewB /> , < ViewC /> ] } />
605+ ) ;
606+ requestAnimationFrame ( ( ) => {
607+ done ( ) ;
608+ } ) ;
609+ } ) ;
610+ it ( 'throws an error if an only one view is in the stack' , ( ) => {
611+ controller . state . views = [ < ViewA /> ] ;
612+ expect ( ( ) => {
613+ controller . __popToRootView ( )
614+ } ) . to . throw ( / s t a c k / ) ;
615+ } ) ;
616+ it ( 'returns early if the controller is already transitioning' , ( ) => {
617+ const spy = sinon . spy ( controller , 'setState' ) ;
618+ controller . __isTransitioning = true ;
619+ controller . __popToRootView ( ) ;
620+ expect ( spy . called ) . not . to . be . true ;
621+ } ) ;
622+ it ( 'shows the view wrappers' , ( ) => {
623+ const spy = sinon . spy ( controller , '__displayViews' ) ;
624+ controller . __popToRootView ( ) ;
625+ expect ( spy . calledWith ( 'block' ) ) . to . be . true ;
626+ } ) ;
627+ it ( 'removes all but the root view from state.views' , ( done ) => {
628+ controller . __popToRootView ( {
629+ onComplete ( ) {
630+ expect ( controller . state . views ) . to . have . length ( 1 ) ;
631+ expect ( controller . state . views [ 0 ] . type ) . to . equal ( ViewA ) ;
632+ done ( ) ;
633+ } ,
634+ transition : Transition . type . NONE
635+ } ) ;
636+ } ) ;
637+ it ( 'sets state.transition' , ( done ) => {
638+ controller . __popToRootView ( {
639+ transition : Transition . type . NONE ,
640+ onComplete ( ) {
641+ done ( ) ;
642+ }
643+ } ) ;
644+ requestAnimationFrame ( ( ) => {
645+ expect ( controller . state . transition ) . to . equal ( Transition . type . NONE ) ;
646+ } ) ;
647+ } ) ;
648+ it ( 'sets state.mountedViews' , ( done ) => {
649+ const [ prev , next ] = controller . __viewIndexes ;
650+ controller . __popToRootView ( {
651+ transition : Transition . type . PUSH_RIGHT ,
652+ onComplete ( ) {
653+ done ( ) ;
654+ }
655+ } ) ;
656+ requestAnimationFrame ( ( ) => {
657+ expect ( controller . state . mountedViews [ prev ] . type ) . to . equal ( ViewC ) ;
658+ expect ( controller . state . mountedViews [ next ] . type ) . to . equal ( ViewA ) ;
659+ } ) ;
660+ } ) ;
661+ it ( 'transitions the views' , ( done ) => {
662+ const spy = sinon . spy ( controller , '__transitionViews' ) ;
663+ controller . __popToRootView ( { transition : Transition . type . NONE } ) ;
664+ requestAnimationFrame ( ( ) => {
665+ expect ( spy . calledOnce ) . to . be . true ;
666+ done ( ) ;
667+ } ) ;
668+ } ) ;
669+ it ( 'sets __isTransitioning=true' , ( ) => {
670+ controller . __popToRootView ( { transition : Transition . type . NONE } ) ;
671+ expect ( controller . __isTransitioning ) . to . be . true ;
672+ } ) ;
673+ it ( 'calls the onComplete callback' , ( done ) => {
674+ controller . __popToRootView ( {
675+ onComplete ( ) {
676+ expect ( true ) . to . be . true ;
677+ done ( ) ;
678+ }
679+ } ) ;
680+ } ) ;
681+ it ( 'does not rehydrate the state' , ( done ) => {
682+ controller = renderIntoDocument (
683+ < NavigationController views = { [ < ViewA /> ] } preserveState = { false } />
684+ ) ;
685+ requestAnimationFrame ( ( ) => {
686+ var rootView = controller . refs [ `view-${ controller . __viewIndexes [ 0 ] } ` ] ;
687+ rootView . setState ( {
688+ foo : 'bar'
689+ } ) ;
690+ controller . pushView ( < ViewB /> , {
691+ transition : Transition . type . NONE ,
692+ onComplete ( ) {
693+ controller . pushView ( < ViewC /> , {
694+ transition : Transition . type . NONE ,
695+ onComplete ( ) {
696+ controller . popToRootView ( {
697+ transition : Transition . type . NONE ,
698+ onComplete ( ) {
699+ rootView = controller . refs [ `view-${ controller . __viewIndexes [ 1 ] } ` ] ;
700+ expect ( rootView . state )
701+ . not . to . have . property ( 'foo' ) ;
702+ done ( ) ;
703+ }
704+ } ) ;
705+ }
706+ } )
707+ }
708+ } ) ;
709+ } ) ;
710+ } ) ;
711+ it ( 'rehydrates the state' , ( done ) => {
712+ controller = renderIntoDocument (
713+ < NavigationController views = { [ < ViewA /> ] } preserveState = { true } />
714+ ) ;
715+ requestAnimationFrame ( ( ) => {
716+ controller . refs [ `view-${ controller . __viewIndexes [ 0 ] } ` ] . setState ( {
717+ foo : 'bar'
718+ } ) ;
719+ controller . pushView ( < ViewB /> , {
720+ transition : Transition . type . NONE ,
721+ onComplete ( ) {
722+ controller . pushView ( < ViewC /> , {
723+ transition : Transition . type . NONE ,
724+ onComplete ( ) {
725+ controller . popToRootView ( {
726+ transition : Transition . type . NONE ,
727+ onComplete ( ) {
728+ expect ( controller . refs [ `view-${ controller . __viewIndexes [ 1 ] } ` ] . state )
729+ . to . have . property ( 'foo' ) ;
730+ done ( ) ;
731+ }
732+ } ) ;
733+ }
734+ } )
735+ }
736+ } ) ;
737+ } ) ;
738+ } ) ;
739+ } ) ;
600740 describe ( '#__setViews' , ( ) => {
601741 beforeEach ( done => {
602742 requestAnimationFrame ( ( ) => {
0 commit comments