@@ -122,6 +122,24 @@ let tests_visualization =
122122 Expect.stringContains mermaid " port_unit_parent__in__child[child-port]" " "
123123 Expect.stringContains mermaid " port_unit_parent__in__child-->|child-port|unit_parent" " "
124124
125+ testCase " initial inputs and final outputs are rendered as groups" <| fun () ->
126+ let graph = buildSimpleWorkflowGraph ()
127+ let mermaid = WorkflowGraphSiren.toMermaid graph
128+ Expect.stringContains mermaid " subgraph wg_initial_inputs[Initial Inputs]" " "
129+ Expect.stringContains mermaid " subgraph wg_final_outputs[Workflow Outputs]" " "
130+
131+ testCase " group ordering keeps inputs above processing and outputs below" <| fun () ->
132+ let graph = buildSimpleWorkflowGraph ()
133+ let mermaid = WorkflowGraphSiren.toMermaid graph
134+ let inputGroupIndex = mermaid.IndexOf( " subgraph wg_initial_inputs" , System.StringComparison.Ordinal)
135+ let processingIndex = mermaid.IndexOf( " unit_root__step1__run" , System.StringComparison.Ordinal)
136+ let outputGroupIndex = mermaid.IndexOf( " subgraph wg_final_outputs" , System.StringComparison.Ordinal)
137+ Expect.isTrue ( inputGroupIndex >= 0 ) " Input group missing"
138+ Expect.isTrue ( processingIndex >= 0 ) " Processing node missing"
139+ Expect.isTrue ( outputGroupIndex >= 0 ) " Output group missing"
140+ Expect.isTrue ( inputGroupIndex < processingIndex) " Input group should be emitted before processing nodes"
141+ Expect.isTrue ( processingIndex < outputGroupIndex) " Output group should be emitted after processing nodes"
142+
125143 testCaseCrossAsync " fromGraph workflow fixture contains processing units and labeled dependency edges" ( crossAsync {
126144 let! content = FileSystemHelper.readFileTextAsync workflowFixturePath
127145 let graph = content |> Decode.decodeCWLProcessingUnit |> Builder.build
0 commit comments