state_machines 0.5.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +1 -1
  3. data/README.md +99 -16
  4. data/lib/state_machines/branch.rb +88 -82
  5. data/lib/state_machines/callback.rb +24 -21
  6. data/lib/state_machines/core.rb +3 -2
  7. data/lib/state_machines/core_ext/class/state_machine.rb +2 -0
  8. data/lib/state_machines/core_ext.rb +2 -0
  9. data/lib/state_machines/error.rb +2 -0
  10. data/lib/state_machines/eval_helpers.rb +51 -22
  11. data/lib/state_machines/event.rb +53 -35
  12. data/lib/state_machines/event_collection.rb +28 -25
  13. data/lib/state_machines/extensions.rb +3 -1
  14. data/lib/state_machines/helper_module.rb +3 -1
  15. data/lib/state_machines/integrations/base.rb +2 -0
  16. data/lib/state_machines/integrations.rb +10 -8
  17. data/lib/state_machines/machine/class_methods.rb +79 -0
  18. data/lib/state_machines/machine.rb +386 -429
  19. data/lib/state_machines/machine_collection.rb +16 -11
  20. data/lib/state_machines/macro_methods.rb +102 -100
  21. data/lib/state_machines/matcher.rb +26 -23
  22. data/lib/state_machines/matcher_helpers.rb +13 -11
  23. data/lib/state_machines/node_collection.rb +20 -14
  24. data/lib/state_machines/options_validator.rb +72 -0
  25. data/lib/state_machines/path.rb +61 -56
  26. data/lib/state_machines/path_collection.rb +40 -36
  27. data/lib/state_machines/state.rb +72 -43
  28. data/lib/state_machines/state_collection.rb +22 -19
  29. data/lib/state_machines/state_context.rb +38 -36
  30. data/lib/state_machines/stdio_renderer.rb +74 -0
  31. data/lib/state_machines/test_helper.rb +305 -0
  32. data/lib/state_machines/transition.rb +182 -178
  33. data/lib/state_machines/transition_collection.rb +175 -169
  34. data/lib/state_machines/version.rb +3 -1
  35. data/lib/state_machines.rb +4 -1
  36. metadata +12 -440
  37. data/.gitignore +0 -21
  38. data/.rspec +0 -3
  39. data/.ruby-gemset +0 -1
  40. data/.ruby-version +0 -1
  41. data/.travis.yml +0 -16
  42. data/Changelog.md +0 -22
  43. data/Contributors.md +0 -39
  44. data/Gemfile +0 -8
  45. data/Rakefile +0 -12
  46. data/Testing.md +0 -0
  47. data/lib/state_machines/assertions.rb +0 -40
  48. data/state_machines.gemspec +0 -22
  49. data/test/files/integrations/event_on_failure_integration.rb +0 -10
  50. data/test/files/integrations/vehicle.rb +0 -7
  51. data/test/files/models/auto_shop.rb +0 -31
  52. data/test/files/models/car.rb +0 -21
  53. data/test/files/models/driver.rb +0 -13
  54. data/test/files/models/model_base.rb +0 -6
  55. data/test/files/models/motorcycle.rb +0 -16
  56. data/test/files/models/traffic_light.rb +0 -47
  57. data/test/files/models/vehicle.rb +0 -127
  58. data/test/files/node.rb +0 -5
  59. data/test/files/switch.rb +0 -15
  60. data/test/functional/auto_shop_available_test.rb +0 -20
  61. data/test/functional/auto_shop_busy_test.rb +0 -25
  62. data/test/functional/car_backing_up_test.rb +0 -45
  63. data/test/functional/car_test.rb +0 -49
  64. data/test/functional/driver_default_nonstandard_test.rb +0 -13
  65. data/test/functional/motorcycle_test.rb +0 -52
  66. data/test/functional/traffic_light_caution_test.rb +0 -17
  67. data/test/functional/traffic_light_proceed_test.rb +0 -17
  68. data/test/functional/traffic_light_stop_test.rb +0 -26
  69. data/test/functional/vehicle_first_gear_test.rb +0 -42
  70. data/test/functional/vehicle_idling_test.rb +0 -59
  71. data/test/functional/vehicle_locked_test.rb +0 -29
  72. data/test/functional/vehicle_parked_test.rb +0 -53
  73. data/test/functional/vehicle_repaired_test.rb +0 -20
  74. data/test/functional/vehicle_second_gear_test.rb +0 -42
  75. data/test/functional/vehicle_stalled_test.rb +0 -65
  76. data/test/functional/vehicle_test.rb +0 -20
  77. data/test/functional/vehicle_third_gear_test.rb +0 -42
  78. data/test/functional/vehicle_unsaved_test.rb +0 -181
  79. data/test/functional/vehicle_with_event_attributes_test.rb +0 -30
  80. data/test/functional/vehicle_with_parallel_events_test.rb +0 -36
  81. data/test/test_helper.rb +0 -15
  82. data/test/unit/assertions/assert_exclusive_keys_test.rb +0 -22
  83. data/test/unit/assertions/assert_valid_key_test.rb +0 -12
  84. data/test/unit/branch/branch_test.rb +0 -28
  85. data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +0 -27
  86. data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +0 -8
  87. data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +0 -8
  88. data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +0 -8
  89. data/test/unit/branch/branch_with_different_requirements_test.rb +0 -41
  90. data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +0 -8
  91. data/test/unit/branch/branch_with_except_from_requirement_test.rb +0 -36
  92. data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +0 -8
  93. data/test/unit/branch/branch_with_except_on_requirement_test.rb +0 -36
  94. data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +0 -8
  95. data/test/unit/branch/branch_with_except_to_requirement_test.rb +0 -36
  96. data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +0 -20
  97. data/test/unit/branch/branch_with_from_requirement_test.rb +0 -45
  98. data/test/unit/branch/branch_with_if_conditional_test.rb +0 -27
  99. data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +0 -23
  100. data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +0 -20
  101. data/test/unit/branch/branch_with_implicit_requirement_test.rb +0 -20
  102. data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +0 -16
  103. data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +0 -20
  104. data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +0 -16
  105. data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +0 -20
  106. data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +0 -16
  107. data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +0 -20
  108. data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +0 -53
  109. data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +0 -20
  110. data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +0 -20
  111. data/test/unit/branch/branch_with_nil_requirements_test.rb +0 -28
  112. data/test/unit/branch/branch_with_no_requirements_test.rb +0 -36
  113. data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +0 -16
  114. data/test/unit/branch/branch_with_on_requirement_test.rb +0 -45
  115. data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +0 -20
  116. data/test/unit/branch/branch_with_to_requirement_test.rb +0 -45
  117. data/test/unit/branch/branch_with_unless_conditional_test.rb +0 -27
  118. data/test/unit/branch/branch_without_guards_test.rb +0 -27
  119. data/test/unit/callback/callback_by_default_test.rb +0 -25
  120. data/test/unit/callback/callback_test.rb +0 -53
  121. data/test/unit/callback/callback_with_application_bound_object_test.rb +0 -23
  122. data/test/unit/callback/callback_with_application_terminator_test.rb +0 -24
  123. data/test/unit/callback/callback_with_arguments_test.rb +0 -14
  124. data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +0 -25
  125. data/test/unit/callback/callback_with_around_type_and_block_test.rb +0 -44
  126. data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +0 -23
  127. data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +0 -93
  128. data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +0 -17
  129. data/test/unit/callback/callback_with_block_test.rb +0 -20
  130. data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +0 -28
  131. data/test/unit/callback/callback_with_bound_method_test.rb +0 -35
  132. data/test/unit/callback/callback_with_do_method_test.rb +0 -18
  133. data/test/unit/callback/callback_with_explicit_requirements_test.rb +0 -32
  134. data/test/unit/callback/callback_with_if_condition_test.rb +0 -17
  135. data/test/unit/callback/callback_with_implicit_requirements_test.rb +0 -32
  136. data/test/unit/callback/callback_with_method_argument_test.rb +0 -18
  137. data/test/unit/callback/callback_with_mixed_methods_test.rb +0 -31
  138. data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +0 -21
  139. data/test/unit/callback/callback_with_multiple_do_methods_test.rb +0 -29
  140. data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +0 -29
  141. data/test/unit/callback/callback_with_terminator_test.rb +0 -22
  142. data/test/unit/callback/callback_with_unbound_method_test.rb +0 -14
  143. data/test/unit/callback/callback_with_unless_condition_test.rb +0 -17
  144. data/test/unit/callback/callback_without_arguments_test.rb +0 -14
  145. data/test/unit/callback/callback_without_terminator_test.rb +0 -12
  146. data/test/unit/error/error_by_default_test.rb +0 -21
  147. data/test/unit/error/error_with_message_test.rb +0 -23
  148. data/test/unit/eval_helper/eval_helpers_base_test.rb +0 -8
  149. data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +0 -14
  150. data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +0 -14
  151. data/test/unit/eval_helper/eval_helpers_proc_test.rb +0 -13
  152. data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +0 -13
  153. data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +0 -13
  154. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +0 -18
  155. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +0 -14
  156. data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +0 -19
  157. data/test/unit/eval_helper/eval_helpers_string_test.rb +0 -25
  158. data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +0 -12
  159. data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +0 -20
  160. data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +0 -17
  161. data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +0 -17
  162. data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +0 -18
  163. data/test/unit/eval_helper/eval_helpers_symbol_test.rb +0 -16
  164. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +0 -16
  165. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +0 -16
  166. data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +0 -16
  167. data/test/unit/eval_helper/eval_helpers_test.rb +0 -13
  168. data/test/unit/event/event_after_being_copied_test.rb +0 -17
  169. data/test/unit/event/event_by_default_test.rb +0 -60
  170. data/test/unit/event/event_context_test.rb +0 -16
  171. data/test/unit/event/event_on_failure_test.rb +0 -44
  172. data/test/unit/event/event_test.rb +0 -34
  173. data/test/unit/event/event_transitions_test.rb +0 -62
  174. data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +0 -79
  175. data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +0 -58
  176. data/test/unit/event/event_with_conflicting_machine_test.rb +0 -48
  177. data/test/unit/event/event_with_dynamic_human_name_test.rb +0 -26
  178. data/test/unit/event/event_with_human_name_test.rb +0 -13
  179. data/test/unit/event/event_with_invalid_current_state_test.rb +0 -30
  180. data/test/unit/event/event_with_machine_action_test.rb +0 -33
  181. data/test/unit/event/event_with_marshalling_test.rb +0 -47
  182. data/test/unit/event/event_with_matching_disabled_transitions_test.rb +0 -115
  183. data/test/unit/event/event_with_matching_enabled_transitions_test.rb +0 -75
  184. data/test/unit/event/event_with_multiple_transitions_test.rb +0 -61
  185. data/test/unit/event/event_with_namespace_test.rb +0 -34
  186. data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +0 -60
  187. data/test/unit/event/event_with_transition_with_loopback_state_test.rb +0 -36
  188. data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +0 -36
  189. data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +0 -51
  190. data/test/unit/event/event_with_transition_without_to_state_test.rb +0 -36
  191. data/test/unit/event/event_with_transitions_test.rb +0 -32
  192. data/test/unit/event/event_without_matching_transitions_test.rb +0 -41
  193. data/test/unit/event/event_without_transitions_test.rb +0 -28
  194. data/test/unit/event/invalid_event_test.rb +0 -20
  195. data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +0 -62
  196. data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +0 -36
  197. data/test/unit/event_collection/event_collection_by_default_test.rb +0 -26
  198. data/test/unit/event_collection/event_collection_test.rb +0 -39
  199. data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +0 -31
  200. data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +0 -76
  201. data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +0 -27
  202. data/test/unit/event_collection/event_collection_with_validations_test.rb +0 -74
  203. data/test/unit/event_collection/event_collection_without_machine_action_test.rb +0 -18
  204. data/test/unit/event_collection/event_string_collection_test.rb +0 -31
  205. data/test/unit/helper_module_test.rb +0 -17
  206. data/test/unit/integrations/integration_finder_test.rb +0 -16
  207. data/test/unit/integrations/integration_matcher_test.rb +0 -29
  208. data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +0 -18
  209. data/test/unit/invalid_transition/invalid_transition_test.rb +0 -47
  210. data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +0 -45
  211. data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +0 -32
  212. data/test/unit/machine/machine_after_being_copied_test.rb +0 -62
  213. data/test/unit/machine/machine_after_changing_initial_state.rb +0 -28
  214. data/test/unit/machine/machine_after_changing_owner_class_test.rb +0 -31
  215. data/test/unit/machine/machine_by_default_test.rb +0 -160
  216. data/test/unit/machine/machine_finder_custom_options_test.rb +0 -17
  217. data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +0 -85
  218. data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +0 -23
  219. data/test/unit/machine/machine_finder_without_existing_machine_test.rb +0 -25
  220. data/test/unit/machine/machine_persistence_test.rb +0 -52
  221. data/test/unit/machine/machine_state_initialization_test.rb +0 -56
  222. data/test/unit/machine/machine_test.rb +0 -30
  223. data/test/unit/machine/machine_with_action_already_overridden_test.rb +0 -23
  224. data/test/unit/machine/machine_with_action_defined_in_class_test.rb +0 -37
  225. data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +0 -46
  226. data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +0 -43
  227. data/test/unit/machine/machine_with_action_undefined_test.rb +0 -33
  228. data/test/unit/machine/machine_with_cached_state_test.rb +0 -20
  229. data/test/unit/machine/machine_with_class_helpers_test.rb +0 -179
  230. data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +0 -244
  231. data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +0 -175
  232. data/test/unit/machine/machine_with_custom_action_test.rb +0 -11
  233. data/test/unit/machine/machine_with_custom_attribute_test.rb +0 -103
  234. data/test/unit/machine/machine_with_custom_initialize_test.rb +0 -24
  235. data/test/unit/machine/machine_with_custom_integration_test.rb +0 -72
  236. data/test/unit/machine/machine_with_custom_invalidation_test.rb +0 -39
  237. data/test/unit/machine/machine_with_custom_name_test.rb +0 -57
  238. data/test/unit/machine/machine_with_custom_plural_test.rb +0 -52
  239. data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +0 -65
  240. data/test/unit/machine/machine_with_event_matchers_test.rb +0 -41
  241. data/test/unit/machine/machine_with_events_test.rb +0 -52
  242. data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +0 -18
  243. data/test/unit/machine/machine_with_events_with_transitions_test.rb +0 -37
  244. data/test/unit/machine/machine_with_existing_event_test.rb +0 -17
  245. data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +0 -20
  246. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +0 -71
  247. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +0 -31
  248. data/test/unit/machine/machine_with_existing_state_test.rb +0 -27
  249. data/test/unit/machine/machine_with_failure_callbacks_test.rb +0 -48
  250. data/test/unit/machine/machine_with_helpers_test.rb +0 -14
  251. data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +0 -25
  252. data/test/unit/machine/machine_with_initialize_and_super_test.rb +0 -17
  253. data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +0 -31
  254. data/test/unit/machine/machine_with_initialize_without_super_test.rb +0 -17
  255. data/test/unit/machine/machine_with_instance_helpers_test.rb +0 -179
  256. data/test/unit/machine/machine_with_integration_test.rb +0 -72
  257. data/test/unit/machine/machine_with_multiple_events_test.rb +0 -32
  258. data/test/unit/machine/machine_with_namespace_test.rb +0 -48
  259. data/test/unit/machine/machine_with_nil_action_test.rb +0 -27
  260. data/test/unit/machine/machine_with_other_states.rb +0 -22
  261. data/test/unit/machine/machine_with_owner_subclass_test.rb +0 -18
  262. data/test/unit/machine/machine_with_paths_test.rb +0 -25
  263. data/test/unit/machine/machine_with_private_action_test.rb +0 -43
  264. data/test/unit/machine/machine_with_state_matchers_test.rb +0 -41
  265. data/test/unit/machine/machine_with_state_with_matchers_test.rb +0 -19
  266. data/test/unit/machine/machine_with_states_test.rb +0 -55
  267. data/test/unit/machine/machine_with_states_with_behaviors_test.rb +0 -23
  268. data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +0 -18
  269. data/test/unit/machine/machine_with_states_with_custom_values_test.rb +0 -21
  270. data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +0 -19
  271. data/test/unit/machine/machine_with_static_initial_state_test.rb +0 -49
  272. data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +0 -36
  273. data/test/unit/machine/machine_with_transition_callbacks_test.rb +0 -144
  274. data/test/unit/machine/machine_with_transitions_test.rb +0 -87
  275. data/test/unit/machine/machine_without_initialization_test.rb +0 -31
  276. data/test/unit/machine/machine_without_initialize_test.rb +0 -14
  277. data/test/unit/machine/machine_without_integration_test.rb +0 -31
  278. data/test/unit/machine_collection/machine_collection_by_default_test.rb +0 -11
  279. data/test/unit/machine_collection/machine_collection_fire_test.rb +0 -80
  280. data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +0 -54
  281. data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +0 -76
  282. data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +0 -111
  283. data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +0 -25
  284. data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +0 -20
  285. data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +0 -26
  286. data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +0 -25
  287. data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +0 -25
  288. data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +0 -31
  289. data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +0 -26
  290. data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +0 -25
  291. data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +0 -27
  292. data/test/unit/matcher/all_matcher_test.rb +0 -29
  293. data/test/unit/matcher/blacklist_matcher_test.rb +0 -30
  294. data/test/unit/matcher/loopback_matcher_test.rb +0 -27
  295. data/test/unit/matcher/matcher_by_default_test.rb +0 -15
  296. data/test/unit/matcher/matcher_with_multiple_values_test.rb +0 -15
  297. data/test/unit/matcher/matcher_with_value_test.rb +0 -15
  298. data/test/unit/matcher/whitelist_matcher_test.rb +0 -30
  299. data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +0 -14
  300. data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +0 -14
  301. data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +0 -13
  302. data/test/unit/node_collection/node_collection_after_being_copied_test.rb +0 -46
  303. data/test/unit/node_collection/node_collection_after_update_test.rb +0 -36
  304. data/test/unit/node_collection/node_collection_by_default_test.rb +0 -22
  305. data/test/unit/node_collection/node_collection_test.rb +0 -23
  306. data/test/unit/node_collection/node_collection_with_indices_test.rb +0 -42
  307. data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +0 -25
  308. data/test/unit/node_collection/node_collection_with_nodes_test.rb +0 -46
  309. data/test/unit/node_collection/node_collection_with_numeric_index_test.rb +0 -24
  310. data/test/unit/node_collection/node_collection_with_postdefined_contexts_test.rb +0 -22
  311. data/test/unit/node_collection/node_collection_with_predefined_contexts_test.rb +0 -23
  312. data/test/unit/node_collection/node_collection_with_string_index_test.rb +0 -20
  313. data/test/unit/node_collection/node_collection_with_symbol_index_test.rb +0 -20
  314. data/test/unit/node_collection/node_collection_without_indices_test.rb +0 -30
  315. data/test/unit/path/path_by_default_test.rb +0 -54
  316. data/test/unit/path/path_test.rb +0 -14
  317. data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +0 -40
  318. data/test/unit/path/path_with_available_transitions_test.rb +0 -54
  319. data/test/unit/path/path_with_deep_target_reached_test.rb +0 -50
  320. data/test/unit/path/path_with_deep_target_test.rb +0 -40
  321. data/test/unit/path/path_with_duplicates_test.rb +0 -32
  322. data/test/unit/path/path_with_encountered_transitions_test.rb +0 -34
  323. data/test/unit/path/path_with_guarded_transitions_test.rb +0 -42
  324. data/test/unit/path/path_with_reached_target_test.rb +0 -35
  325. data/test/unit/path/path_with_transitions_test.rb +0 -54
  326. data/test/unit/path/path_with_unreached_target_test.rb +0 -31
  327. data/test/unit/path/path_without_transitions_test.rb +0 -24
  328. data/test/unit/path_collection/path_collection_by_default_test.rb +0 -46
  329. data/test/unit/path_collection/path_collection_test.rb +0 -24
  330. data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +0 -43
  331. data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +0 -31
  332. data/test/unit/path_collection/path_collection_with_from_state_test.rb +0 -27
  333. data/test/unit/path_collection/path_collection_with_paths_test.rb +0 -47
  334. data/test/unit/path_collection/path_collection_with_to_state_test.rb +0 -29
  335. data/test/unit/path_collection/path_with_guarded_paths_test.rb +0 -25
  336. data/test/unit/state/state_after_being_copied_test.rb +0 -19
  337. data/test/unit/state/state_by_default_test.rb +0 -41
  338. data/test/unit/state/state_final_test.rb +0 -28
  339. data/test/unit/state/state_initial_test.rb +0 -13
  340. data/test/unit/state/state_not_final_test.rb +0 -32
  341. data/test/unit/state/state_not_initial_test.rb +0 -13
  342. data/test/unit/state/state_test.rb +0 -44
  343. data/test/unit/state/state_with_cached_lambda_value_test.rb +0 -29
  344. data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +0 -38
  345. data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +0 -29
  346. data/test/unit/state/state_with_conflicting_machine_name_test.rb +0 -20
  347. data/test/unit/state/state_with_conflicting_machine_test.rb +0 -37
  348. data/test/unit/state/state_with_context_test.rb +0 -60
  349. data/test/unit/state/state_with_dynamic_human_name_test.rb +0 -25
  350. data/test/unit/state/state_with_existing_context_method_test.rb +0 -24
  351. data/test/unit/state/state_with_human_name_test.rb +0 -13
  352. data/test/unit/state/state_with_integer_value_test.rb +0 -32
  353. data/test/unit/state/state_with_invalid_method_call_test.rb +0 -21
  354. data/test/unit/state/state_with_lambda_value_test.rb +0 -37
  355. data/test/unit/state/state_with_matcher_test.rb +0 -18
  356. data/test/unit/state/state_with_multiple_contexts_test.rb +0 -57
  357. data/test/unit/state/state_with_name_test.rb +0 -43
  358. data/test/unit/state/state_with_namespace_test.rb +0 -22
  359. data/test/unit/state/state_with_nil_value_test.rb +0 -35
  360. data/test/unit/state/state_with_redefined_context_method_test.rb +0 -45
  361. data/test/unit/state/state_with_symbolic_value_test.rb +0 -32
  362. data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +0 -40
  363. data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +0 -33
  364. data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +0 -41
  365. data/test/unit/state/state_without_cached_lambda_value_test.rb +0 -25
  366. data/test/unit/state/state_without_name_test.rb +0 -39
  367. data/test/unit/state_collection/state_collection_by_default_test.rb +0 -21
  368. data/test/unit/state_collection/state_collection_string_test.rb +0 -35
  369. data/test/unit/state_collection/state_collection_test.rb +0 -74
  370. data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +0 -29
  371. data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +0 -39
  372. data/test/unit/state_collection/state_collection_with_initial_state_test.rb +0 -40
  373. data/test/unit/state_collection/state_collection_with_namespace_test.rb +0 -21
  374. data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +0 -40
  375. data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +0 -29
  376. data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +0 -40
  377. data/test/unit/state_context/state_context_proxy_test.rb +0 -26
  378. data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +0 -42
  379. data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +0 -64
  380. data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +0 -32
  381. data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +0 -32
  382. data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +0 -64
  383. data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +0 -31
  384. data/test/unit/state_context/state_context_test.rb +0 -28
  385. data/test/unit/state_context/state_context_transition_test.rb +0 -104
  386. data/test/unit/state_context/state_context_with_matching_transition_test.rb +0 -27
  387. data/test/unit/state_machine/state_machine_by_default_test.rb +0 -12
  388. data/test/unit/state_machine/state_machine_test.rb +0 -20
  389. data/test/unit/transition/transition_after_being_performed_test.rb +0 -48
  390. data/test/unit/transition/transition_after_being_persisted_test.rb +0 -46
  391. data/test/unit/transition/transition_after_being_rolled_back_test.rb +0 -35
  392. data/test/unit/transition/transition_equality_test.rb +0 -52
  393. data/test/unit/transition/transition_loopback_test.rb +0 -18
  394. data/test/unit/transition/transition_test.rb +0 -96
  395. data/test/unit/transition/transition_transient_test.rb +0 -20
  396. data/test/unit/transition/transition_with_action_test.rb +0 -27
  397. data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +0 -127
  398. data/test/unit/transition/transition_with_after_callbacks_test.rb +0 -93
  399. data/test/unit/transition/transition_with_around_callbacks_test.rb +0 -141
  400. data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +0 -30
  401. data/test/unit/transition/transition_with_before_callbacks_test.rb +0 -104
  402. data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +0 -28
  403. data/test/unit/transition/transition_with_different_states_test.rb +0 -18
  404. data/test/unit/transition/transition_with_dynamic_to_value_test.rb +0 -19
  405. data/test/unit/transition/transition_with_failure_callbacks_test.rb +0 -84
  406. data/test/unit/transition/transition_with_invalid_nodes_test.rb +0 -29
  407. data/test/unit/transition/transition_with_mixed_callbacks_test.rb +0 -105
  408. data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +0 -40
  409. data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +0 -114
  410. data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +0 -40
  411. data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +0 -40
  412. data/test/unit/transition/transition_with_namespace_test.rb +0 -47
  413. data/test/unit/transition/transition_with_perform_arguments_test.rb +0 -35
  414. data/test/unit/transition/transition_with_transactions_test.rb +0 -42
  415. data/test/unit/transition/transition_without_callbacks_test.rb +0 -33
  416. data/test/unit/transition/transition_without_reading_state_test.rb +0 -22
  417. data/test/unit/transition/transition_without_running_action_test.rb +0 -47
  418. data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +0 -23
  419. data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +0 -64
  420. data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +0 -44
  421. data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +0 -44
  422. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +0 -32
  423. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +0 -33
  424. data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +0 -32
  425. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +0 -32
  426. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +0 -33
  427. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +0 -33
  428. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +0 -32
  429. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +0 -33
  430. data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +0 -68
  431. data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +0 -41
  432. data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +0 -44
  433. data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +0 -42
  434. data/test/unit/transition_collection/transition_collection_by_default_test.rb +0 -23
  435. data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +0 -23
  436. data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +0 -12
  437. data/test/unit/transition_collection/transition_collection_invalid_test.rb +0 -21
  438. data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +0 -69
  439. data/test/unit/transition_collection/transition_collection_test.rb +0 -26
  440. data/test/unit/transition_collection/transition_collection_valid_test.rb +0 -57
  441. data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +0 -66
  442. data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +0 -60
  443. data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +0 -17
  444. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +0 -17
  445. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +0 -37
  446. data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +0 -34
  447. data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +0 -29
  448. data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +0 -17
  449. data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +0 -79
  450. data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +0 -45
  451. data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +0 -48
  452. data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +0 -42
  453. data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +0 -47
  454. data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +0 -51
  455. data/test/unit/transition_collection/transition_collection_with_block_test.rb +0 -46
  456. data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +0 -135
  457. data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +0 -189
  458. data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +0 -48
  459. data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +0 -41
  460. data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +0 -41
  461. data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +0 -34
  462. data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +0 -69
  463. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +0 -53
  464. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +0 -34
  465. data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +0 -65
  466. data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +0 -29
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StateMachines
4
+ # Test helper module providing assertion methods for state machine testing
5
+ # Designed to work with Minitest, RSpec, and future testing frameworks
6
+ #
7
+ # @example Basic usage with Minitest
8
+ # class MyModelTest < Minitest::Test
9
+ # include StateMachines::TestHelper
10
+ #
11
+ # def test_initial_state
12
+ # model = MyModel.new
13
+ # assert_state(model, :state_machine_name, :initial_state)
14
+ # end
15
+ # end
16
+ #
17
+ # @example Usage with RSpec
18
+ # RSpec.describe MyModel do
19
+ # include StateMachines::TestHelper
20
+ #
21
+ # it "starts in initial state" do
22
+ # model = MyModel.new
23
+ # assert_state(model, :state_machine_name, :initial_state)
24
+ # end
25
+ # end
26
+ #
27
+ # @since 0.10.0
28
+ module TestHelper
29
+ # Assert that an object is in a specific state for a given state machine
30
+ #
31
+ # @param object [Object] The object with state machines
32
+ # @param machine_name [Symbol] The name of the state machine
33
+ # @param expected_state [Symbol] The expected state
34
+ # @param message [String, nil] Custom failure message
35
+ # @return [void]
36
+ # @raise [AssertionError] If the state doesn't match
37
+ #
38
+ # @example
39
+ # user = User.new
40
+ # assert_state(user, :status, :active)
41
+ def assert_state(object, machine_name, expected_state, message = nil)
42
+ actual = object.send("#{machine_name}_name")
43
+ default_message = "Expected #{object.class}##{machine_name} to be #{expected_state}, but was #{actual}"
44
+
45
+ if defined?(::Minitest)
46
+ assert_equal expected_state.to_s, actual.to_s, message || default_message
47
+ elsif defined?(::RSpec)
48
+ expect(actual.to_s).to eq(expected_state.to_s), message || default_message
49
+ else
50
+ raise "Expected #{expected_state}, but got #{actual}" unless expected_state.to_s == actual.to_s
51
+ end
52
+ end
53
+
54
+ # Assert that an object can transition via a specific event
55
+ #
56
+ # @param object [Object] The object with state machines
57
+ # @param event [Symbol] The event name
58
+ # @param message [String, nil] Custom failure message
59
+ # @return [void]
60
+ # @raise [AssertionError] If the transition is not available
61
+ #
62
+ # @example
63
+ # user = User.new
64
+ # assert_can_transition(user, :activate)
65
+ def assert_can_transition(object, event, message = nil)
66
+ can_method = "can_#{event}?"
67
+ default_message = "Expected to be able to trigger event :#{event}, but #{can_method} returned false"
68
+
69
+ if defined?(::Minitest)
70
+ assert object.send(can_method), message || default_message
71
+ elsif defined?(::RSpec)
72
+ expect(object.send(can_method)).to be_truthy, message || default_message
73
+ else
74
+ raise default_message unless object.send(can_method)
75
+ end
76
+ end
77
+
78
+ # Assert that an object cannot transition via a specific event
79
+ #
80
+ # @param object [Object] The object with state machines
81
+ # @param event [Symbol] The event name
82
+ # @param message [String, nil] Custom failure message
83
+ # @return [void]
84
+ # @raise [AssertionError] If the transition is available
85
+ #
86
+ # @example
87
+ # user = User.new
88
+ # assert_cannot_transition(user, :delete)
89
+ def assert_cannot_transition(object, event, message = nil)
90
+ can_method = "can_#{event}?"
91
+ default_message = "Expected not to be able to trigger event :#{event}, but #{can_method} returned true"
92
+
93
+ if defined?(::Minitest)
94
+ refute object.send(can_method), message || default_message
95
+ elsif defined?(::RSpec)
96
+ expect(object.send(can_method)).to be_falsy, message || default_message
97
+ elsif object.send(can_method)
98
+ raise default_message
99
+ end
100
+ end
101
+
102
+ # Assert that triggering an event changes the object to the expected state
103
+ #
104
+ # @param object [Object] The object with state machines
105
+ # @param event [Symbol] The event to trigger
106
+ # @param machine_name [Symbol] The name of the state machine
107
+ # @param expected_state [Symbol] The expected state after transition
108
+ # @param message [String, nil] Custom failure message
109
+ # @return [void]
110
+ # @raise [AssertionError] If the transition fails or results in wrong state
111
+ #
112
+ # @example
113
+ # user = User.new
114
+ # assert_transition(user, :activate, :status, :active)
115
+ def assert_transition(object, event, machine_name, expected_state, message = nil)
116
+ object.send("#{event}!")
117
+ assert_state(object, machine_name, expected_state, message)
118
+ end
119
+
120
+ # === Extended State Machine Assertions ===
121
+
122
+ def assert_sm_states_list(machine, expected_states, message = nil)
123
+ actual_states = machine.states.map(&:name).compact
124
+ default_message = "Expected states #{expected_states} but got #{actual_states}"
125
+
126
+ if defined?(::Minitest)
127
+ assert_equal expected_states.sort, actual_states.sort, message || default_message
128
+ elsif defined?(::RSpec)
129
+ expect(actual_states.sort).to eq(expected_states.sort), message || default_message
130
+ else
131
+ raise default_message unless expected_states.sort == actual_states.sort
132
+ end
133
+ end
134
+
135
+ def refute_sm_state_defined(machine, state, message = nil)
136
+ state_exists = machine.states.any? { |s| s.name == state }
137
+ default_message = "Expected state #{state} to not be defined in machine"
138
+
139
+ if defined?(::Minitest)
140
+ refute state_exists, message || default_message
141
+ elsif defined?(::RSpec)
142
+ expect(state_exists).to be_falsy, message || default_message
143
+ elsif state_exists
144
+ raise default_message
145
+ end
146
+ end
147
+ alias assert_sm_state_not_defined refute_sm_state_defined
148
+
149
+ def assert_sm_initial_state(machine, expected_state, message = nil)
150
+ state_obj = machine.state(expected_state)
151
+ is_initial = state_obj&.initial?
152
+ default_message = "Expected state #{expected_state} to be the initial state"
153
+
154
+ if defined?(::Minitest)
155
+ assert is_initial, message || default_message
156
+ elsif defined?(::RSpec)
157
+ expect(is_initial).to be_truthy, message || default_message
158
+ else
159
+ raise default_message unless is_initial
160
+ end
161
+ end
162
+
163
+ def assert_sm_final_state(machine, state, message = nil)
164
+ state_obj = machine.states[state]
165
+ is_final = state_obj&.final?
166
+ default_message = "Expected state #{state} to be final"
167
+
168
+ if defined?(::Minitest)
169
+ assert is_final, message || default_message
170
+ elsif defined?(::RSpec)
171
+ expect(is_final).to be_truthy, message || default_message
172
+ else
173
+ raise default_message unless is_final
174
+ end
175
+ end
176
+
177
+ def assert_sm_possible_transitions(machine, from:, expected_to_states:, message: nil)
178
+ actual_transitions = machine.events.flat_map do |event|
179
+ event.branches.select { |branch| branch.known_states.include?(from) }
180
+ .map(&:to)
181
+ end.uniq
182
+ default_message = "Expected transitions from #{from} to #{expected_to_states} but got #{actual_transitions}"
183
+
184
+ if defined?(::Minitest)
185
+ assert_equal expected_to_states.sort, actual_transitions.sort, message || default_message
186
+ elsif defined?(::RSpec)
187
+ expect(actual_transitions.sort).to eq(expected_to_states.sort), message || default_message
188
+ else
189
+ raise default_message unless expected_to_states.sort == actual_transitions.sort
190
+ end
191
+ end
192
+
193
+ def refute_sm_transition_allowed(machine, from:, to:, on:, message: nil)
194
+ event = machine.events[on]
195
+ is_allowed = event&.branches&.any? { |branch| branch.known_states.include?(from) && branch.to == to }
196
+ default_message = "Expected transition from #{from} to #{to} on #{on} to not be allowed"
197
+
198
+ if defined?(::Minitest)
199
+ refute is_allowed, message || default_message
200
+ elsif defined?(::RSpec)
201
+ expect(is_allowed).to be_falsy, message || default_message
202
+ elsif is_allowed
203
+ raise default_message
204
+ end
205
+ end
206
+ alias assert_sm_transition_not_allowed refute_sm_transition_allowed
207
+
208
+ def assert_sm_event_triggers(object, event, message = nil)
209
+ initial_state = object.state
210
+ object.send("#{event}!")
211
+ state_changed = initial_state != object.state
212
+ default_message = "Expected event #{event} to trigger state change"
213
+
214
+ if defined?(::Minitest)
215
+ assert state_changed, message || default_message
216
+ elsif defined?(::RSpec)
217
+ expect(state_changed).to be_truthy, message || default_message
218
+ else
219
+ raise default_message unless state_changed
220
+ end
221
+ end
222
+
223
+ def refute_sm_event_triggers(object, event, message = nil)
224
+ initial_state = object.state
225
+ begin
226
+ object.send("#{event}!")
227
+ state_unchanged = initial_state == object.state
228
+ default_message = "Expected event #{event} to not trigger state change"
229
+
230
+ if defined?(::Minitest)
231
+ assert state_unchanged, message || default_message
232
+ elsif defined?(::RSpec)
233
+ expect(state_unchanged).to be_truthy, message || default_message
234
+ else
235
+ raise default_message unless state_unchanged
236
+ end
237
+ rescue StateMachines::InvalidTransition
238
+ # Expected behavior - transition was blocked
239
+ end
240
+ end
241
+ alias assert_sm_event_not_triggers refute_sm_event_triggers
242
+
243
+ def assert_sm_event_raises_error(object, event, error_class, message = nil)
244
+ default_message = "Expected event #{event} to raise #{error_class}"
245
+
246
+ if defined?(::Minitest)
247
+ assert_raises(error_class, message || default_message) do
248
+ object.send("#{event}!")
249
+ end
250
+ elsif defined?(::RSpec)
251
+ expect { object.send("#{event}!") }.to raise_error(error_class), message || default_message
252
+ else
253
+ begin
254
+ object.send("#{event}!")
255
+ raise default_message
256
+ rescue error_class
257
+ # Expected behavior
258
+ end
259
+ end
260
+ end
261
+
262
+ def assert_sm_callback_executed(object, callback_name, message = nil)
263
+ callbacks_executed = object.instance_variable_get(:@_sm_callbacks_executed) || []
264
+ callback_was_executed = callbacks_executed.include?(callback_name)
265
+ default_message = "Expected callback #{callback_name} to be executed"
266
+
267
+ if defined?(::Minitest)
268
+ assert callback_was_executed, message || default_message
269
+ elsif defined?(::RSpec)
270
+ expect(callback_was_executed).to be_truthy, message || default_message
271
+ else
272
+ raise default_message unless callback_was_executed
273
+ end
274
+ end
275
+
276
+ def refute_sm_callback_executed(object, callback_name, message = nil)
277
+ callbacks_executed = object.instance_variable_get(:@_sm_callbacks_executed) || []
278
+ callback_was_executed = callbacks_executed.include?(callback_name)
279
+ default_message = "Expected callback #{callback_name} to not be executed"
280
+
281
+ if defined?(::Minitest)
282
+ refute callback_was_executed, message || default_message
283
+ elsif defined?(::RSpec)
284
+ expect(callback_was_executed).to be_falsy, message || default_message
285
+ elsif callback_was_executed
286
+ raise default_message
287
+ end
288
+ end
289
+ alias assert_sm_callback_not_executed refute_sm_callback_executed
290
+
291
+ def assert_sm_state_persisted(record, expected:, message: nil)
292
+ record.reload if record.respond_to?(:reload)
293
+ actual_state = record.state
294
+ default_message = "Expected persisted state #{expected} but got #{actual_state}"
295
+
296
+ if defined?(::Minitest)
297
+ assert_equal expected, actual_state, message || default_message
298
+ elsif defined?(::RSpec)
299
+ expect(actual_state).to eq(expected), message || default_message
300
+ else
301
+ raise default_message unless expected == actual_state
302
+ end
303
+ end
304
+ end
305
+ end