@@ -437,6 +437,178 @@ The first step
437437expect ( result . levels [ 0 ] . steps [ 0 ] ) . toEqual ( expected . levels [ 0 ] . steps [ 0 ] ) ;
438438} ) ;
439439
440+ it ( "should load the full config for a step" , ( ) => {
441+ const md = `# Title
442+
443+ Description.
444+
445+ ## L1 Title 1
446+
447+ First level content.
448+
449+ ### L1S1
450+
451+ The first step
452+
453+ ### L1S2
454+
455+ The second step
456+
457+ ## L2 Title 2
458+
459+ Second level content.
460+
461+ ### L2S1
462+
463+ The third step
464+ ` ;
465+ const config = {
466+ levels :[
467+ {
468+ id :"L1" ,
469+ steps :[
470+ {
471+ id :"L1S1" ,
472+ setup :{
473+ commands :[ "npm install" ] ,
474+ files :[ "someFile.js" ] ,
475+ watchers :[ "someFile.js" ] ,
476+ filter :"someFilter" ,
477+ subtasks :true ,
478+ } ,
479+ solution :{
480+ commands :[ "npm install" ] ,
481+ files :[ "someFile.js" ] ,
482+ } ,
483+ } ,
484+ {
485+ id :"L1S2" ,
486+ setup :{
487+ commands :[ "npm install" ] ,
488+ files :[ "someFile.js" ] ,
489+ watchers :[ "someFile.js" ] ,
490+ filter :"someFilter" ,
491+ subtasks :true ,
492+ } ,
493+ solution :{
494+ commands :[ "npm install" ] ,
495+ files :[ "someFile.js" ] ,
496+ } ,
497+ } ,
498+ ] ,
499+ } ,
500+ {
501+ id :"L2" ,
502+ summary :"Second level content." ,
503+ content :"First level content." ,
504+ steps :[
505+ {
506+ id :"L2S1" ,
507+ setup :{
508+ commands :[ "npm install" ] ,
509+ files :[ "someFile.js" ] ,
510+ watchers :[ "someFile.js" ] ,
511+ filter :"someFilter" ,
512+ subtasks :true ,
513+ } ,
514+ solution :{
515+ commands :[ "npm install" ] ,
516+ files :[ "someFile.js" ] ,
517+ } ,
518+ } ,
519+ ] ,
520+ } ,
521+ ] ,
522+ } ;
523+ const result = parse ( {
524+ text :md ,
525+ config,
526+ commits :{
527+ L1S1Q :[ "abcdefg1" , "123456789" ] ,
528+ L1S1A :[ "1gfedcba" , "987654321" ] ,
529+ L1S2Q :[ "2abcdefg" ] ,
530+ L1S2A :[ "3abcdefg" ] ,
531+ L2S1Q :[ "4abcdefg" ] ,
532+ L2S1A :[ "5abcdefg" ] ,
533+ } ,
534+ } ) ;
535+ const expected = {
536+ summary :{
537+ description :"Description." ,
538+ } ,
539+ levels :[
540+ {
541+ id :"L1" ,
542+ title :"Title 1" ,
543+ summary :"First level content." ,
544+ content :"First level content." ,
545+ steps :[
546+ {
547+ id :"L1S1" ,
548+ content :"The first step" ,
549+ setup :{
550+ commits :[ "abcdefg1" , "123456789" ] ,
551+ commands :[ "npm install" ] ,
552+ files :[ "someFile.js" ] ,
553+ watchers :[ "someFile.js" ] ,
554+ filter :"someFilter" ,
555+ subtasks :true ,
556+ } ,
557+ solution :{
558+ commits :[ "1gfedcba" , "987654321" ] ,
559+ commands :[ "npm install" ] ,
560+ files :[ "someFile.js" ] ,
561+ } ,
562+ } ,
563+ {
564+ id :"L1S2" ,
565+ content :"The second step" ,
566+ setup :{
567+ commits :[ "2abcdefg" ] ,
568+ commands :[ "npm install" ] ,
569+ files :[ "someFile.js" ] ,
570+ watchers :[ "someFile.js" ] ,
571+ filter :"someFilter" ,
572+ subtasks :true ,
573+ } ,
574+ solution :{
575+ commits :[ "3abcdefg" ] ,
576+ commands :[ "npm install" ] ,
577+ files :[ "someFile.js" ] ,
578+ } ,
579+ } ,
580+ ] ,
581+ } ,
582+ {
583+ id :"L2" ,
584+ title :"Title 2" ,
585+ summary :"Second level content." ,
586+ content :"Second level content." ,
587+ steps :[
588+ {
589+ id :"L2S1" ,
590+ content :"The third step" ,
591+ setup :{
592+ commits :[ "4abcdefg" ] ,
593+ commands :[ "npm install" ] ,
594+ files :[ "someFile.js" ] ,
595+ watchers :[ "someFile.js" ] ,
596+ filter :"someFilter" ,
597+ subtasks :true ,
598+ } ,
599+ solution :{
600+ commits :[ "5abcdefg" ] ,
601+ commands :[ "npm install" ] ,
602+ files :[ "someFile.js" ] ,
603+ } ,
604+ } ,
605+ ] ,
606+ } ,
607+ ] ,
608+ } ;
609+ expect ( result . levels ) . toEqual ( expected . levels ) ;
610+ } ) ;
611+
440612// config
441613it ( "should parse the tutorial config" , ( ) => {
442614const md = `# Title