@@ -146,29 +146,44 @@ explore_simple_workflow_test() ->
146146% %====================================================================
147147
148148check_dead_transitions_none_test_ () ->
149- {skip , " collect_states_simple has infinite loop bug - needs visited states tracking" }.
149+ Bytecode = mock_bytecode_simple (),
150+ States = collect_states_simple (Bytecode , 10 ),
151+ [? _assertEqual ([], wf_validate :check_dead_transitions (States , Bytecode ))].
150152
151153check_dead_transitions_unreachable_test_ () ->
152- {skip , " collect_states_simple has infinite loop bug - needs visited states tracking" }.
154+ Bytecode = mock_bytecode_unreachable (),
155+ States = collect_states_simple (Bytecode , 10 ),
156+ Issues = wf_validate :check_dead_transitions (States , Bytecode ),
157+ [? _assert (length (Issues ) > 0 )].
153158
154159check_proper_completion_valid_test_ () ->
155- {skip , " collect_states_simple has infinite loop bug - needs visited states tracking" }.
160+ Bytecode = mock_bytecode_simple (),
161+ States = collect_states_simple (Bytecode , 10 ),
162+ Issues = wf_validate :check_proper_completion (States ),
163+ [? _assertEqual ([], Issues )].
156164
157165check_deadlock_par_fork_test_ () ->
158- {skip , " collect_states_simple has infinite loop bug - needs visited states tracking" }.
166+ Bytecode = mock_bytecode_deadlock (),
167+ States = collect_states_simple (Bytecode , 10 ),
168+ Issues = wf_validate :check_proper_completion (States ),
169+ [? _assert (length (Issues ) > 0 )].
159170
160171% %====================================================================
161172% % Tests: Phase 4 - Public API
162173% %====================================================================
163174
164175validate_simple_workflow_test_ () ->
165- {skip , " wf_validate:validate has infinite loop bug in collect_states - needs visited states tracking" }.
176+ Bytecode = mock_bytecode_simple (),
177+ [? _assertMatch ({ok , _ }, wf_validate :validate (Bytecode ))].
166178
167179validate_deadlock_workflow_test_ () ->
168- {skip , " wf_validate:validate has infinite loop bug in collect_states - needs visited states tracking" }.
180+ Bytecode = mock_bytecode_deadlock (),
181+ [? _assertMatch ({error , _ }, wf_validate :validate (Bytecode ))].
169182
170183validate_with_custom_options_test_ () ->
171- {skip , " wf_validate:validate has infinite loop bug in collect_states - needs visited states tracking" }.
184+ Bytecode = mock_bytecode_simple (),
185+ Options = #{depth => 5 , token_bound => 2 },
186+ [? _assertMatch ({ok , _ }, wf_validate :validate (Bytecode , Options ))].
172187
173188% %====================================================================
174189% % Helper Functions
@@ -177,18 +192,21 @@ validate_with_custom_options_test_() ->
177192% % Simple state collector for testing
178193collect_states_simple (Bytecode , MaxSteps ) ->
179194 InitialState = wf_validate :new (Bytecode ),
180- collect_states_simple ([InitialState ], MaxSteps , []).
195+ collect_states_simple ([InitialState ], MaxSteps , [], sets : new ([{ version , 2 }]) ).
181196
182- collect_states_simple ([], _MaxSteps , Acc ) ->
197+ collect_states_simple ([], _MaxSteps , Acc , _Visited ) ->
183198 lists :usort (Acc );
184- collect_states_simple ([State | Rest ], MaxSteps , Acc ) when State # validation_state .step_count >= MaxSteps ->
185- collect_states_simple (Rest , MaxSteps , [State | Acc ]);
186- collect_states_simple ([State | Rest ], MaxSteps , Acc ) ->
187- Enabled = wf_validate :enabled_transitions (State ),
188- case Enabled of
189- [] ->
190- collect_states_simple (Rest , MaxSteps , [State | Acc ]);
191- _ ->
192- Successors = [wf_validate :fire_transition (State , Action ) || Action <- Enabled ],
193- collect_states_simple (Rest ++ Successors , MaxSteps , [State | Acc ])
199+ collect_states_simple ([State | Rest ], MaxSteps , Acc , Visited ) ->
200+ Hash = wf_validate :state_hash (State ),
201+ case sets :is_element (Hash , Visited ) of
202+ true -> collect_states_simple (Rest , MaxSteps , Acc , Visited );
203+ false ->
204+ NewVisited = sets :add_element (Hash , Visited ),
205+ if State # validation_state .step_count >= MaxSteps ->
206+ collect_states_simple (Rest , MaxSteps , [State | Acc ], NewVisited );
207+ true ->
208+ Enabled = wf_validate :enabled_transitions (State ),
209+ Successors = [wf_validate :fire_transition (State , Action ) || Action <- Enabled ],
210+ collect_states_simple (Rest ++ Successors , MaxSteps , [State | Acc ], NewVisited )
211+ end
194212 end .
0 commit comments