@@ -19,7 +19,7 @@ import {createKeyDownEvent} from './test_helpers/user_input.js';
1919suite ( 'Keyboard Shortcut Items' , function ( ) {
2020 setup ( function ( ) {
2121 sharedTestSetup . call ( this ) ;
22- const toolbox = document . getElementById ( 'toolbox-categories ' ) ;
22+ const toolbox = document . getElementById ( 'toolbox-test ' ) ;
2323 this . workspace = Blockly . inject ( 'blocklyDiv' , { toolbox} ) ;
2424 this . injectionDiv = this . workspace . getInjectionDiv ( ) ;
2525 Blockly . ContextMenuRegistry . registry . reset ( ) ;
@@ -799,4 +799,158 @@ suite('Keyboard Shortcut Items', function () {
799799 ) ;
800800 } ) ;
801801 } ) ;
802+
803+ suite ( 'Stack navigation (N / B)' , function ( ) {
804+ const keyNextStack = ( ) => createKeyDownEvent ( Blockly . utils . KeyCodes . N ) ;
805+ const keyPrevStack = ( ) => createKeyDownEvent ( Blockly . utils . KeyCodes . B ) ;
806+
807+ setup ( function ( ) {
808+ this . block1 = this . workspace . newBlock ( 'controls_if' ) ;
809+ this . block2 = this . workspace . newBlock ( 'stack_block' ) ;
810+ this . block3 = this . workspace . newBlock ( 'stack_block' ) ;
811+ this . block2 . moveBy ( 0 , 100 ) ;
812+ this . block3 . moveBy ( 0 , 400 ) ;
813+
814+ this . comment1 = this . workspace . newComment ( ) ;
815+ this . comment2 = this . workspace . newComment ( ) ;
816+ this . comment1 . moveBy ( 0 , 200 ) ;
817+ this . comment2 . moveBy ( 0 , 300 ) ;
818+ } ) ;
819+
820+ test ( 'First stack navigating back is a no-op' , function ( ) {
821+ Blockly . getFocusManager ( ) . focusNode ( this . block1 ) ;
822+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
823+ assert . strictEqual (
824+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
825+ this . block1 ,
826+ ) ;
827+ } ) ;
828+
829+ test ( 'Last stack navigating forward is a no-op' , function ( ) {
830+ Blockly . getFocusManager ( ) . focusNode ( this . block3 ) ;
831+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
832+ assert . strictEqual (
833+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
834+ this . block3 ,
835+ ) ;
836+ } ) ;
837+
838+ test ( 'Block forward to block' , function ( ) {
839+ Blockly . getFocusManager ( ) . focusNode ( this . block1 ) ;
840+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
841+ assert . strictEqual (
842+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
843+ this . block2 ,
844+ ) ;
845+ } ) ;
846+
847+ test ( 'Block back to block' , function ( ) {
848+ Blockly . getFocusManager ( ) . focusNode ( this . block2 ) ;
849+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
850+ assert . strictEqual (
851+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
852+ this . block1 ,
853+ ) ;
854+ } ) ;
855+
856+ test ( 'Block forward to workspace comment' , function ( ) {
857+ Blockly . getFocusManager ( ) . focusNode ( this . block2 ) ;
858+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
859+ assert . strictEqual (
860+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
861+ this . comment1 ,
862+ ) ;
863+ } ) ;
864+
865+ test ( 'Block back to workspace comment' , function ( ) {
866+ Blockly . getFocusManager ( ) . focusNode ( this . block3 ) ;
867+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
868+ assert . strictEqual (
869+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
870+ this . comment2 ,
871+ ) ;
872+ } ) ;
873+
874+ test ( 'Workspace comment forward to workspace comment' , function ( ) {
875+ Blockly . getFocusManager ( ) . focusNode ( this . comment1 ) ;
876+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
877+ assert . strictEqual (
878+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
879+ this . comment2 ,
880+ ) ;
881+ } ) ;
882+
883+ test ( 'Workspace comment back to workspace comment' , function ( ) {
884+ Blockly . getFocusManager ( ) . focusNode ( this . comment2 ) ;
885+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
886+ assert . strictEqual (
887+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
888+ this . comment1 ,
889+ ) ;
890+ } ) ;
891+
892+ test ( 'Workspace comment forward to block' , function ( ) {
893+ Blockly . getFocusManager ( ) . focusNode ( this . comment2 ) ;
894+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
895+ assert . strictEqual (
896+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
897+ this . block3 ,
898+ ) ;
899+ } ) ;
900+
901+ test ( 'Workspace comment back to block' , function ( ) {
902+ Blockly . getFocusManager ( ) . focusNode ( this . comment1 ) ;
903+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
904+ assert . strictEqual (
905+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
906+ this . block2 ,
907+ ) ;
908+ } ) ;
909+
910+ test ( 'Block forward to block in mutator workspace' , async function ( ) {
911+ const icon = this . block1 . getIcon ( Blockly . icons . MutatorIcon . TYPE ) ;
912+ await icon . setBubbleVisible ( true ) ;
913+ this . clock . runAll ( ) ;
914+ const mutatorWorkspace = icon . getWorkspace ( ) ;
915+ const stack1 = mutatorWorkspace . newBlock ( 'controls_if_elseif' ) ;
916+ const stack2 = mutatorWorkspace . newBlock ( 'controls_if_elseif' ) ;
917+ stack1 . initSvg ( ) ;
918+ stack2 . initSvg ( ) ;
919+ stack1 . render ( ) ;
920+ stack2 . render ( ) ;
921+ stack1 . moveBy ( 0 , 100 ) ;
922+ stack2 . moveBy ( 0 , 200 ) ;
923+ Blockly . getFocusManager ( ) . focusNode ( stack1 ) ;
924+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
925+ assert . strictEqual ( Blockly . getFocusManager ( ) . getFocusedNode ( ) , stack2 ) ;
926+ } ) ;
927+
928+ test ( 'Block back to block in mutator workspace' , async function ( ) {
929+ const icon = this . block1 . getIcon ( Blockly . icons . MutatorIcon . TYPE ) ;
930+ await icon . setBubbleVisible ( true ) ;
931+ this . clock . runAll ( ) ;
932+ const mutatorWorkspace = icon . getWorkspace ( ) ;
933+ const stack1 = mutatorWorkspace . newBlock ( 'controls_if_elseif' ) ;
934+ const stack2 = mutatorWorkspace . newBlock ( 'controls_if_elseif' ) ;
935+ stack1 . initSvg ( ) ;
936+ stack2 . initSvg ( ) ;
937+ stack1 . render ( ) ;
938+ stack2 . render ( ) ;
939+ stack1 . moveBy ( 0 , 100 ) ;
940+ stack2 . moveBy ( 0 , 200 ) ;
941+ Blockly . getFocusManager ( ) . focusNode ( stack2 ) ;
942+ this . injectionDiv . dispatchEvent ( keyPrevStack ( ) ) ;
943+ assert . strictEqual ( Blockly . getFocusManager ( ) . getFocusedNode ( ) , stack1 ) ;
944+ } ) ;
945+
946+ test ( 'Next stack from nested element' , async function ( ) {
947+ const icon = this . block1 . getIcon ( Blockly . icons . MutatorIcon . TYPE ) ;
948+ Blockly . getFocusManager ( ) . focusNode ( icon ) ;
949+ this . injectionDiv . dispatchEvent ( keyNextStack ( ) ) ;
950+ assert . strictEqual (
951+ Blockly . getFocusManager ( ) . getFocusedNode ( ) ,
952+ this . block2 ,
953+ ) ;
954+ } ) ;
955+ } ) ;
802956} ) ;
0 commit comments