@@ -13,20 +13,22 @@ interface Callbacks {
1313onFail ( position :T . Position , failSummary :T . TestFail ) :void
1414onRun ( position :T . Position ) :void
1515onError ( position :T . Position ) :void
16+ onLoadSubtasks ( { summary} :{ summary :{ [ testName :string ] :boolean } } ) :void
1617}
1718
1819const failChannelName = 'CodeRoad (Tests)'
1920const logChannelName = 'CodeRoad (Logs)'
2021
2122interface TestRunnerParams {
2223position :T . Position
24+ subtasks ?:boolean
2325onSuccess ?:( ) => void
2426}
2527
2628const createTestRunner = ( data :TT . Tutorial , callbacks :Callbacks ) => {
2729const testRunnerConfig = data . config . testRunner
2830const testRunnerFilterArg = testRunnerConfig . args ?. filter
29- return async ( { position, onSuccess} :TestRunnerParams ) :Promise < void > => {
31+ return async ( { position, onSuccess, subtasks } :TestRunnerParams ) :Promise < void > => {
3032const startTime = throttle ( )
3133// throttle time early
3234if ( ! startTime ) {
@@ -36,7 +38,9 @@ const createTestRunner = (data: TT.Tutorial, callbacks: Callbacks) => {
3638logger ( '------------------- RUN TEST -------------------' )
3739
3840// flag as running
39- callbacks . onRun ( position )
41+ if ( ! subtasks ) {
42+ callbacks . onRun ( position )
43+ }
4044
4145let result :{ stdout :string | undefined ; stderr :string | undefined }
4246try {
@@ -79,6 +83,12 @@ const createTestRunner = (data: TT.Tutorial, callbacks: Callbacks) => {
7983
8084const tap :ParserOutput = parser ( stdout || '' )
8185
86+ if ( subtasks ) {
87+ callbacks . onLoadSubtasks ( { summary :tap . summary } )
88+ // exit early
89+ return
90+ }
91+
8292addOutput ( { channel :logChannelName , text :tap . logs . join ( '\n' ) , show :false } )
8393
8494if ( stderr ) {
@@ -105,7 +115,9 @@ const createTestRunner = (data: TT.Tutorial, callbacks: Callbacks) => {
105115// PASS
106116if ( tap . ok ) {
107117clearOutput ( failChannelName )
118+
108119callbacks . onSuccess ( position )
120+
109121if ( onSuccess ) {
110122onSuccess ( )
111123}