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