state_machines 0.0.2 → 0.1.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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -4
  3. data/Changelog.md +0 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +6 -8
  7. data/Rakefile +9 -6
  8. data/Testing.md +0 -0
  9. data/lib/state_machines/assertions.rb +5 -5
  10. data/lib/state_machines/error.rb +2 -1
  11. data/lib/state_machines/integrations.rb +18 -11
  12. data/lib/state_machines/machine.rb +8 -12
  13. data/lib/state_machines/version.rb +1 -1
  14. data/state_machines.gemspec +6 -8
  15. data/test/files/integrations/event_on_failure_integration.rb +10 -0
  16. data/test/files/integrations/vehicle.rb +7 -0
  17. data/{spec/internal/app → test/files}/models/auto_shop.rb +0 -0
  18. data/{spec/internal/app → test/files}/models/car.rb +2 -0
  19. data/{spec/internal/app → test/files}/models/model_base.rb +0 -0
  20. data/{spec/internal/app → test/files}/models/motorcycle.rb +2 -0
  21. data/{spec/internal/app → test/files}/models/traffic_light.rb +2 -2
  22. data/{spec/internal/app → test/files}/models/vehicle.rb +9 -5
  23. data/test/files/node.rb +5 -0
  24. data/test/files/switch.rb +15 -0
  25. data/test/functional/auto_shop_available_test.rb +20 -0
  26. data/test/functional/auto_shop_busy_test.rb +25 -0
  27. data/test/functional/car_backing_up_test.rb +45 -0
  28. data/test/functional/car_test.rb +49 -0
  29. data/test/functional/motorcycle_test.rb +46 -0
  30. data/test/functional/traffic_light_caution_test.rb +17 -0
  31. data/test/functional/traffic_light_proceed_test.rb +17 -0
  32. data/test/functional/traffic_light_stop_test.rb +26 -0
  33. data/test/functional/vehicle_first_gear_test.rb +42 -0
  34. data/test/functional/vehicle_idling_test.rb +59 -0
  35. data/test/functional/vehicle_locked_test.rb +29 -0
  36. data/test/functional/vehicle_parked_test.rb +53 -0
  37. data/test/functional/vehicle_repaired_test.rb +20 -0
  38. data/test/functional/vehicle_second_gear_test.rb +42 -0
  39. data/test/functional/vehicle_stalled_test.rb +65 -0
  40. data/test/functional/vehicle_test.rb +20 -0
  41. data/test/functional/vehicle_third_gear_test.rb +42 -0
  42. data/test/functional/vehicle_unsaved_test.rb +181 -0
  43. data/test/functional/vehicle_with_event_attributes_test.rb +30 -0
  44. data/test/functional/vehicle_with_parallel_events_test.rb +36 -0
  45. data/test/test_helper.rb +15 -0
  46. data/test/unit/assertions/assert_exclusive_keys_test.rb +22 -0
  47. data/test/unit/assertions/assert_valid_key_test.rb +12 -0
  48. data/test/unit/branch/branch_test.rb +28 -0
  49. data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +27 -0
  50. data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +8 -0
  51. data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +8 -0
  52. data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +8 -0
  53. data/test/unit/branch/branch_with_different_requirements_test.rb +41 -0
  54. data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +8 -0
  55. data/test/unit/branch/branch_with_except_from_requirement_test.rb +36 -0
  56. data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +8 -0
  57. data/test/unit/branch/branch_with_except_on_requirement_test.rb +36 -0
  58. data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +8 -0
  59. data/test/unit/branch/branch_with_except_to_requirement_test.rb +36 -0
  60. data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +20 -0
  61. data/test/unit/branch/branch_with_from_requirement_test.rb +45 -0
  62. data/test/unit/branch/branch_with_if_conditional_test.rb +27 -0
  63. data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +23 -0
  64. data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +20 -0
  65. data/test/unit/branch/branch_with_implicit_requirement_test.rb +20 -0
  66. data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +16 -0
  67. data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +20 -0
  68. data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +16 -0
  69. data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +20 -0
  70. data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +16 -0
  71. data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +20 -0
  72. data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +53 -0
  73. data/test/unit/branch/branch_with_multiple_on_requirements_test.rb +20 -0
  74. data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +20 -0
  75. data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +20 -0
  76. data/test/unit/branch/branch_with_nil_requirements_test.rb +28 -0
  77. data/test/unit/branch/branch_with_no_requirements_test.rb +36 -0
  78. data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +16 -0
  79. data/test/unit/branch/branch_with_on_requirement_test.rb +45 -0
  80. data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +20 -0
  81. data/test/unit/branch/branch_with_to_requirement_test.rb +45 -0
  82. data/test/unit/branch/branch_with_unless_conditional_test.rb +27 -0
  83. data/test/unit/branch/branch_without_guards_test.rb +27 -0
  84. data/test/unit/callback/callback_by_default_test.rb +25 -0
  85. data/test/unit/callback/callback_test.rb +53 -0
  86. data/test/unit/callback/callback_with_application_bound_object_test.rb +23 -0
  87. data/test/unit/callback/callback_with_application_terminator_test.rb +24 -0
  88. data/test/unit/callback/callback_with_arguments_test.rb +14 -0
  89. data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +25 -0
  90. data/test/unit/callback/callback_with_around_type_and_block_test.rb +44 -0
  91. data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +23 -0
  92. data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +93 -0
  93. data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +17 -0
  94. data/test/unit/callback/callback_with_block_test.rb +20 -0
  95. data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +28 -0
  96. data/test/unit/callback/callback_with_bound_method_test.rb +35 -0
  97. data/test/unit/callback/callback_with_do_method_test.rb +18 -0
  98. data/test/unit/callback/callback_with_explicit_requirements_test.rb +32 -0
  99. data/test/unit/callback/callback_with_if_condition_test.rb +17 -0
  100. data/test/unit/callback/callback_with_implicit_requirements_test.rb +32 -0
  101. data/test/unit/callback/callback_with_method_argument_test.rb +18 -0
  102. data/test/unit/callback/callback_with_mixed_methods_test.rb +31 -0
  103. data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +21 -0
  104. data/test/unit/callback/callback_with_multiple_do_methods_test.rb +29 -0
  105. data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +29 -0
  106. data/test/unit/callback/callback_with_terminator_test.rb +22 -0
  107. data/test/unit/callback/callback_with_unbound_method_test.rb +14 -0
  108. data/test/unit/callback/callback_with_unless_condition_test.rb +17 -0
  109. data/test/unit/callback/callback_without_arguments_test.rb +14 -0
  110. data/test/unit/callback/callback_without_terminator_test.rb +12 -0
  111. data/test/unit/error/error_by_default_test.rb +21 -0
  112. data/test/unit/error/error_with_message_test.rb +23 -0
  113. data/test/unit/eval_helper/eval_helpers_base_test.rb +8 -0
  114. data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +14 -0
  115. data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +14 -0
  116. data/test/unit/eval_helper/eval_helpers_proc_test.rb +13 -0
  117. data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +13 -0
  118. data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +13 -0
  119. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +18 -0
  120. data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +14 -0
  121. data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +19 -0
  122. data/test/unit/eval_helper/eval_helpers_string_test.rb +25 -0
  123. data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +12 -0
  124. data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +20 -0
  125. data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +17 -0
  126. data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +17 -0
  127. data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +18 -0
  128. data/test/unit/eval_helper/eval_helpers_symbol_test.rb +16 -0
  129. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +16 -0
  130. data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +16 -0
  131. data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +16 -0
  132. data/test/unit/eval_helper/eval_helpers_test.rb +13 -0
  133. data/test/unit/event/event_after_being_copied_test.rb +17 -0
  134. data/test/unit/event/event_by_default_test.rb +60 -0
  135. data/test/unit/event/event_context_test.rb +16 -0
  136. data/test/unit/event/event_on_failure_test.rb +44 -0
  137. data/test/unit/event/event_test.rb +34 -0
  138. data/test/unit/event/event_transitions_test.rb +62 -0
  139. data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +79 -0
  140. data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +58 -0
  141. data/test/unit/event/event_with_conflicting_machine_test.rb +48 -0
  142. data/test/unit/event/event_with_dynamic_human_name_test.rb +26 -0
  143. data/test/unit/event/event_with_human_name_test.rb +13 -0
  144. data/test/unit/event/event_with_invalid_current_state_test.rb +30 -0
  145. data/test/unit/event/event_with_machine_action_test.rb +33 -0
  146. data/test/unit/event/event_with_marshalling_test.rb +47 -0
  147. data/test/unit/event/event_with_matching_disabled_transitions_test.rb +115 -0
  148. data/test/unit/event/event_with_matching_enabled_transitions_test.rb +75 -0
  149. data/test/unit/event/event_with_multiple_transitions_test.rb +61 -0
  150. data/test/unit/event/event_with_namespace_test.rb +34 -0
  151. data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +60 -0
  152. data/test/unit/event/event_with_transition_with_loopback_state_test.rb +36 -0
  153. data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +36 -0
  154. data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +51 -0
  155. data/test/unit/event/event_with_transition_without_to_state_test.rb +36 -0
  156. data/test/unit/event/event_with_transitions_test.rb +32 -0
  157. data/test/unit/event/event_without_matching_transitions_test.rb +41 -0
  158. data/test/unit/event/event_without_transitions_test.rb +28 -0
  159. data/{spec/state_machines/invalid_event_spec.rb → test/unit/event/invalid_event_test.rb} +8 -7
  160. data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +62 -0
  161. data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +36 -0
  162. data/test/unit/event_collection/event_collection_by_default_test.rb +26 -0
  163. data/test/unit/event_collection/event_collection_test.rb +39 -0
  164. data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +31 -0
  165. data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +76 -0
  166. data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +27 -0
  167. data/test/unit/event_collection/event_collection_with_validations_test.rb +75 -0
  168. data/test/unit/event_collection/event_collection_without_machine_action_test.rb +18 -0
  169. data/test/unit/event_collection/event_string_collection_test.rb +31 -0
  170. data/test/unit/helper_module_test.rb +17 -0
  171. data/test/unit/integrations/integration_finder_test.rb +16 -0
  172. data/test/unit/integrations/integration_matcher_test.rb +27 -0
  173. data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +18 -0
  174. data/test/unit/invalid_transition/invalid_transition_test.rb +47 -0
  175. data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +47 -0
  176. data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +32 -0
  177. data/test/unit/machine/machine_after_being_copied_test.rb +62 -0
  178. data/test/unit/machine/machine_after_changing_initial_state.rb +28 -0
  179. data/test/unit/machine/machine_after_changing_owner_class_test.rb +31 -0
  180. data/test/unit/machine/machine_by_default_test.rb +160 -0
  181. data/test/unit/machine/machine_finder_custom_options_test.rb +17 -0
  182. data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +86 -0
  183. data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +23 -0
  184. data/test/unit/machine/machine_finder_without_existing_machine_test.rb +25 -0
  185. data/test/unit/machine/machine_persistence_test.rb +52 -0
  186. data/test/unit/machine/machine_state_initialization_test.rb +56 -0
  187. data/test/unit/machine/machine_test.rb +30 -0
  188. data/test/unit/machine/machine_with_action_already_overridden_test.rb +23 -0
  189. data/test/unit/machine/machine_with_action_defined_in_class_test.rb +37 -0
  190. data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +46 -0
  191. data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +43 -0
  192. data/test/unit/machine/machine_with_action_undefined_test.rb +33 -0
  193. data/test/unit/machine/machine_with_cached_state_test.rb +20 -0
  194. data/test/unit/machine/machine_with_class_helpers_test.rb +179 -0
  195. data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +243 -0
  196. data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +175 -0
  197. data/test/unit/machine/machine_with_custom_action_test.rb +11 -0
  198. data/test/unit/machine/machine_with_custom_attribute_test.rb +103 -0
  199. data/test/unit/machine/machine_with_custom_initialize_test.rb +24 -0
  200. data/test/unit/machine/machine_with_custom_integration_test.rb +69 -0
  201. data/test/unit/machine/machine_with_custom_invalidation_test.rb +40 -0
  202. data/test/unit/machine/machine_with_custom_name_test.rb +57 -0
  203. data/test/unit/machine/machine_with_custom_plural_test.rb +53 -0
  204. data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +65 -0
  205. data/test/unit/machine/machine_with_event_matchers_test.rb +41 -0
  206. data/test/unit/machine/machine_with_events_test.rb +52 -0
  207. data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +18 -0
  208. data/test/unit/machine/machine_with_events_with_transitions_test.rb +37 -0
  209. data/test/unit/machine/machine_with_existing_event_test.rb +17 -0
  210. data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +20 -0
  211. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +71 -0
  212. data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +31 -0
  213. data/test/unit/machine/machine_with_existing_state_test.rb +27 -0
  214. data/test/unit/machine/machine_with_failure_callbacks_test.rb +48 -0
  215. data/test/unit/machine/machine_with_helpers_test.rb +14 -0
  216. data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +25 -0
  217. data/test/unit/machine/machine_with_initialize_and_super_test.rb +17 -0
  218. data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +31 -0
  219. data/test/unit/machine/machine_with_initialize_without_super_test.rb +17 -0
  220. data/test/unit/machine/machine_with_instance_helpers_test.rb +179 -0
  221. data/test/unit/machine/machine_with_integration_test.rb +71 -0
  222. data/test/unit/machine/machine_with_multiple_events_test.rb +32 -0
  223. data/test/unit/machine/machine_with_namespace_test.rb +48 -0
  224. data/test/unit/machine/machine_with_nil_action_test.rb +24 -0
  225. data/test/unit/machine/machine_with_other_states.rb +22 -0
  226. data/test/unit/machine/machine_with_owner_subclass_test.rb +18 -0
  227. data/test/unit/machine/machine_with_paths_test.rb +25 -0
  228. data/test/unit/machine/machine_with_private_action_test.rb +43 -0
  229. data/test/unit/machine/machine_with_state_matchers_test.rb +41 -0
  230. data/test/unit/machine/machine_with_state_with_matchers_test.rb +19 -0
  231. data/test/unit/machine/machine_with_states_test.rb +55 -0
  232. data/test/unit/machine/machine_with_states_with_behaviors_test.rb +23 -0
  233. data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +18 -0
  234. data/test/unit/machine/machine_with_states_with_custom_values_test.rb +21 -0
  235. data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +19 -0
  236. data/test/unit/machine/machine_with_static_initial_state_test.rb +60 -0
  237. data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +36 -0
  238. data/test/unit/machine/machine_with_transition_callbacks_test.rb +144 -0
  239. data/test/unit/machine/machine_with_transitions_test.rb +87 -0
  240. data/test/unit/machine/machine_without_initialization_test.rb +31 -0
  241. data/test/unit/machine/machine_without_initialize_test.rb +14 -0
  242. data/test/unit/machine/machine_without_integration_test.rb +31 -0
  243. data/test/unit/machine_collection/machine_collection_by_default_test.rb +11 -0
  244. data/test/unit/machine_collection/machine_collection_fire_attributes_with_validations_test.rb +72 -0
  245. data/test/unit/machine_collection/machine_collection_fire_test.rb +80 -0
  246. data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +54 -0
  247. data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +76 -0
  248. data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +101 -0
  249. data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +25 -0
  250. data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +20 -0
  251. data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +26 -0
  252. data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +25 -0
  253. data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +25 -0
  254. data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +31 -0
  255. data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +26 -0
  256. data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +25 -0
  257. data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +27 -0
  258. data/test/unit/matcher/all_matcher_test.rb +29 -0
  259. data/test/unit/matcher/blacklist_matcher_test.rb +30 -0
  260. data/test/unit/matcher/loopback_matcher_test.rb +27 -0
  261. data/test/unit/matcher/matcher_by_default_test.rb +15 -0
  262. data/test/unit/matcher/matcher_with_multiple_values_test.rb +15 -0
  263. data/test/unit/matcher/matcher_with_value_test.rb +15 -0
  264. data/test/unit/matcher/whitelist_matcher_test.rb +30 -0
  265. data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +14 -0
  266. data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +14 -0
  267. data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +13 -0
  268. data/test/unit/node_collection/node_collection_after_being_copied_test/n.rb +46 -0
  269. data/test/unit/node_collection/node_collection_after_update_test/n.rb +36 -0
  270. data/test/unit/node_collection/node_collection_by_default_test.rb +22 -0
  271. data/test/unit/node_collection/node_collection_test.rb +23 -0
  272. data/test/unit/node_collection/node_collection_with_indices_test/n.rb +42 -0
  273. data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +25 -0
  274. data/test/unit/node_collection/node_collection_with_nodes_test/n.rb +46 -0
  275. data/test/unit/node_collection/node_collection_with_numeric_index_test/n.rb +24 -0
  276. data/test/unit/node_collection/node_collection_with_postdefined_contexts_test/n.rb +22 -0
  277. data/test/unit/node_collection/node_collection_with_predefined_contexts_test/n.rb +23 -0
  278. data/test/unit/node_collection/node_collection_with_string_index_test/n.rb +20 -0
  279. data/test/unit/node_collection/node_collection_with_symbol_index_test/n.rb +20 -0
  280. data/test/unit/node_collection/node_collection_without_indices_test/n.rb +30 -0
  281. data/test/unit/path/path_by_default_test.rb +54 -0
  282. data/test/unit/path/path_test.rb +14 -0
  283. data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +40 -0
  284. data/test/unit/path/path_with_available_transitions_test.rb +54 -0
  285. data/test/unit/path/path_with_deep_target_reached_test.rb +50 -0
  286. data/test/unit/path/path_with_deep_target_test.rb +40 -0
  287. data/test/unit/path/path_with_duplicates_test.rb +32 -0
  288. data/test/unit/path/path_with_encountered_transitions_test.rb +34 -0
  289. data/test/unit/path/path_with_guarded_transitions_test.rb +42 -0
  290. data/test/unit/path/path_with_reached_target_test.rb +35 -0
  291. data/test/unit/path/path_with_transitions_test.rb +54 -0
  292. data/test/unit/path/path_with_unreached_target_test.rb +31 -0
  293. data/test/unit/path/path_without_transitions_test.rb +24 -0
  294. data/test/unit/path_collection/path_collection_by_default_test.rb +46 -0
  295. data/test/unit/path_collection/path_collection_test.rb +24 -0
  296. data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +43 -0
  297. data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +31 -0
  298. data/test/unit/path_collection/path_collection_with_from_state_test.rb +27 -0
  299. data/test/unit/path_collection/path_collection_with_paths_test.rb +47 -0
  300. data/test/unit/path_collection/path_collection_with_to_state_test.rb +29 -0
  301. data/test/unit/path_collection/path_with_guarded_paths_test.rb +25 -0
  302. data/test/unit/state/state_after_being_copied_test.rb +19 -0
  303. data/test/unit/state/state_by_default_test.rb +41 -0
  304. data/test/unit/state/state_final_test.rb +28 -0
  305. data/test/unit/state/state_initial_test.rb +13 -0
  306. data/test/unit/state/state_not_final_test.rb +32 -0
  307. data/test/unit/state/state_not_initial_test.rb +13 -0
  308. data/test/unit/state/state_test.rb +44 -0
  309. data/test/unit/state/state_with_cached_lambda_value_test.rb +29 -0
  310. data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +38 -0
  311. data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +29 -0
  312. data/test/unit/state/state_with_conflicting_machine_name_test.rb +20 -0
  313. data/test/unit/state/state_with_conflicting_machine_test.rb +37 -0
  314. data/test/unit/state/state_with_context_test.rb +60 -0
  315. data/test/unit/state/state_with_dynamic_human_name_test.rb +25 -0
  316. data/test/unit/state/state_with_existing_context_method_test.rb +24 -0
  317. data/test/unit/state/state_with_human_name_test.rb +13 -0
  318. data/test/unit/state/state_with_integer_value_test.rb +32 -0
  319. data/test/unit/state/state_with_invalid_method_call_test.rb +21 -0
  320. data/test/unit/state/state_with_lambda_value_test.rb +37 -0
  321. data/test/unit/state/state_with_matcher_test.rb +18 -0
  322. data/test/unit/state/state_with_multiple_contexts_test.rb +57 -0
  323. data/test/unit/state/state_with_name_test.rb +43 -0
  324. data/test/unit/state/state_with_namespace_test.rb +22 -0
  325. data/test/unit/state/state_with_nil_value_test.rb +35 -0
  326. data/test/unit/state/state_with_redefined_context_method_test.rb +45 -0
  327. data/test/unit/state/state_with_symbolic_value_test.rb +32 -0
  328. data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +40 -0
  329. data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +33 -0
  330. data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +41 -0
  331. data/test/unit/state/state_without_cached_lambda_value_test.rb +25 -0
  332. data/test/unit/state/state_without_name_test.rb +39 -0
  333. data/test/unit/state_collection/state_collection_by_default_test.rb +21 -0
  334. data/test/unit/state_collection/state_collection_string_test.rb +35 -0
  335. data/test/unit/state_collection/state_collection_test.rb +74 -0
  336. data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +29 -0
  337. data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +39 -0
  338. data/test/unit/state_collection/state_collection_with_initial_state_test.rb +40 -0
  339. data/test/unit/state_collection/state_collection_with_namespace_test.rb +21 -0
  340. data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +40 -0
  341. data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +29 -0
  342. data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +40 -0
  343. data/test/unit/state_context/state_context_proxy_test.rb +26 -0
  344. data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +42 -0
  345. data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +64 -0
  346. data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +32 -0
  347. data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +32 -0
  348. data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +64 -0
  349. data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +31 -0
  350. data/test/unit/state_context/state_context_test.rb +28 -0
  351. data/test/unit/state_context/state_context_transition_test.rb +104 -0
  352. data/test/unit/state_context/state_context_with_matching_transition_test.rb +27 -0
  353. data/test/unit/state_machine/state_machine_by_default_test.rb +12 -0
  354. data/test/unit/state_machine/state_machine_test.rb +20 -0
  355. data/test/unit/transition/transition_after_being_performed_test.rb +48 -0
  356. data/test/unit/transition/transition_after_being_persisted_test.rb +46 -0
  357. data/test/unit/transition/transition_after_being_rolled_back_test.rb +35 -0
  358. data/test/unit/transition/transition_equality_test.rb +52 -0
  359. data/test/unit/transition/transition_loopback_test.rb +18 -0
  360. data/test/unit/transition/transition_test.rb +96 -0
  361. data/test/unit/transition/transition_transient_test.rb +20 -0
  362. data/test/unit/transition/transition_with_action_test.rb +27 -0
  363. data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +127 -0
  364. data/test/unit/transition/transition_with_after_callbacks_test.rb +93 -0
  365. data/test/unit/transition/transition_with_around_callbacks_test.rb +141 -0
  366. data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +30 -0
  367. data/test/unit/transition/transition_with_before_callbacks_test.rb +104 -0
  368. data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +28 -0
  369. data/test/unit/transition/transition_with_different_states_test.rb +18 -0
  370. data/test/unit/transition/transition_with_dynamic_to_value_test.rb +19 -0
  371. data/test/unit/transition/transition_with_failure_callbacks_test.rb +84 -0
  372. data/test/unit/transition/transition_with_invalid_nodes_test.rb +29 -0
  373. data/test/unit/transition/transition_with_mixed_callbacks_test.rb +105 -0
  374. data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +40 -0
  375. data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +114 -0
  376. data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +40 -0
  377. data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +40 -0
  378. data/test/unit/transition/transition_with_namespace_test.rb +47 -0
  379. data/test/unit/transition/transition_with_perform_arguments_test.rb +35 -0
  380. data/test/unit/transition/transition_with_transactions_test.rb +42 -0
  381. data/test/unit/transition/transition_without_callbacks_test.rb +33 -0
  382. data/test/unit/transition/transition_without_reading_state_test.rb +22 -0
  383. data/test/unit/transition/transition_without_running_action_test.rb +47 -0
  384. data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +23 -0
  385. data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +64 -0
  386. data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +44 -0
  387. data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +44 -0
  388. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +32 -0
  389. data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +33 -0
  390. data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +32 -0
  391. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +32 -0
  392. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +33 -0
  393. data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +33 -0
  394. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +32 -0
  395. data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +33 -0
  396. data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +68 -0
  397. data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +41 -0
  398. data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +44 -0
  399. data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +42 -0
  400. data/test/unit/transition_collection/transition_collection_by_default_test.rb +23 -0
  401. data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +23 -0
  402. data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +12 -0
  403. data/test/unit/transition_collection/transition_collection_invalid_test.rb +21 -0
  404. data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +69 -0
  405. data/test/unit/transition_collection/transition_collection_test.rb +26 -0
  406. data/test/unit/transition_collection/transition_collection_valid_test.rb +57 -0
  407. data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +66 -0
  408. data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +60 -0
  409. data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +17 -0
  410. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +17 -0
  411. data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +37 -0
  412. data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +34 -0
  413. data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +29 -0
  414. data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +17 -0
  415. data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +79 -0
  416. data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +45 -0
  417. data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +48 -0
  418. data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +42 -0
  419. data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +51 -0
  420. data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +47 -0
  421. data/test/unit/transition_collection/transition_collection_with_block_test.rb +46 -0
  422. data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +135 -0
  423. data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +189 -0
  424. data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +48 -0
  425. data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +41 -0
  426. data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +41 -0
  427. data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +34 -0
  428. data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +69 -0
  429. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +53 -0
  430. data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +34 -0
  431. data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +65 -0
  432. data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +29 -0
  433. metadata +888 -101
  434. data/spec/models/auto_shop_spec.rb +0 -41
  435. data/spec/models/car_spec.rb +0 -90
  436. data/spec/models/motorcycle_spec.rb +0 -44
  437. data/spec/models/traffic_light_spec.rb +0 -56
  438. data/spec/models/vehicle_spec.rb +0 -580
  439. data/spec/spec_helper.rb +0 -7
  440. data/spec/state_machines/assertions_spec.rb +0 -31
  441. data/spec/state_machines/branch_spec.rb +0 -827
  442. data/spec/state_machines/callbacks_spec.rb +0 -706
  443. data/spec/state_machines/errors_spec.rb +0 -1
  444. data/spec/state_machines/event_collection_spec.rb +0 -401
  445. data/spec/state_machines/event_spec.rb +0 -1140
  446. data/spec/state_machines/helper_spec.rb +0 -14
  447. data/spec/state_machines/integration_base_spec.rb +0 -12
  448. data/spec/state_machines/integration_spec.rb +0 -132
  449. data/spec/state_machines/invalid_parallel_transition_spec.rb +0 -18
  450. data/spec/state_machines/invalid_transition_spec.rb +0 -114
  451. data/spec/state_machines/machine_collection_spec.rb +0 -606
  452. data/spec/state_machines/machine_spec.rb +0 -3176
  453. data/spec/state_machines/matcher_helpers_spec.rb +0 -39
  454. data/spec/state_machines/matcher_spec.rb +0 -157
  455. data/spec/state_machines/node_collection_spec.rb +0 -371
  456. data/spec/state_machines/path_collection_spec.rb +0 -271
  457. data/spec/state_machines/path_spec.rb +0 -488
  458. data/spec/state_machines/state_collection_spec.rb +0 -352
  459. data/spec/state_machines/state_context_spec.rb +0 -442
  460. data/spec/state_machines/state_machine_spec.rb +0 -29
  461. data/spec/state_machines/state_spec.rb +0 -970
  462. data/spec/state_machines/transition_collection_spec.rb +0 -2199
  463. data/spec/state_machines/transition_spec.rb +0 -1558
  464. data/spec/support/migration_helpers.rb +0 -59
  465. data/spec/support/models.rb +0 -6
@@ -0,0 +1,29 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookErrorTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+
8
+ @superclass.class_eval do
9
+ remove_method :save
10
+
11
+ def save
12
+ fail ArgumentError
13
+ end
14
+ end
15
+
16
+ begin
17
+ ; StateMachines::TransitionCollection.new([@transition]).perform
18
+ rescue
19
+ end
20
+ end
21
+
22
+ def test_should_not_write_event
23
+ assert_nil @object.state_event
24
+ end
25
+
26
+ def test_should_not_write_event_transition
27
+ assert_nil @object.send(:state_event_transition)
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookInvalidTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+ @result = StateMachines::TransitionCollection.new([@transition, nil]).perform
8
+ end
9
+
10
+ def test_should_not_succeed
11
+ assert_equal false, @result
12
+ end
13
+
14
+ def test_should_not_run_action
15
+ refute @object.saved
16
+ end
17
+ end
@@ -0,0 +1,79 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookMultipleTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+
8
+ @status_machine = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
9
+ @status_machine.state :second_gear
10
+ @status_machine.event :shift_up
11
+
12
+ @klass.class_eval do
13
+ attr_reader :status_on_save, :status_event_on_save, :status_event_transition_on_save
14
+
15
+ remove_method :save
16
+
17
+ def save
18
+ @saved = true
19
+ @state_on_save = state
20
+ @state_event_on_save = state_event
21
+ @state_event_transition_on_save = state_event_transition
22
+ @status_on_save = status
23
+ @status_event_on_save = status_event
24
+ @status_event_transition_on_save = status_event_transition
25
+ super
26
+ 1
27
+ end
28
+ end
29
+
30
+ @object = @klass.new
31
+ @state_transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
32
+ @status_transition = StateMachines::Transition.new(@object, @status_machine, :shift_up, :first_gear, :second_gear)
33
+
34
+ @result = StateMachines::TransitionCollection.new([@state_transition, @status_transition]).perform
35
+ end
36
+
37
+ def test_should_succeed
38
+ assert_equal 1, @result
39
+ end
40
+
41
+ def test_should_run_action
42
+ assert @object.saved
43
+ end
44
+
45
+ def test_should_not_have_already_persisted_when_running_action
46
+ assert_equal 'parked', @object.state_on_save
47
+ assert_equal 'first_gear', @object.status_on_save
48
+ end
49
+
50
+ def test_should_persist
51
+ assert_equal 'idling', @object.state
52
+ assert_equal 'second_gear', @object.status
53
+ end
54
+
55
+ def test_should_not_have_events_during_action
56
+ assert_nil @object.state_event_on_save
57
+ assert_nil @object.status_event_on_save
58
+ end
59
+
60
+ def test_should_not_write_events
61
+ assert_nil @object.state_event
62
+ assert_nil @object.status_event
63
+ end
64
+
65
+ def test_should_have_event_transitions_during_action
66
+ assert_equal @state_transition, @object.state_event_transition_on_save
67
+ assert_equal @status_transition, @object.status_event_transition_on_save
68
+ end
69
+
70
+ def test_should_not_write_event_transitions
71
+ assert_nil @object.send(:state_event_transition)
72
+ assert_nil @object.send(:status_event_transition)
73
+ end
74
+
75
+ def test_should_mark_event_transitions_as_transient
76
+ assert @state_transition.transient?
77
+ assert @status_transition.transient?
78
+ end
79
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+ @result = StateMachines::TransitionCollection.new([@transition]).perform
8
+ end
9
+
10
+ def test_should_succeed
11
+ assert_equal true, @result
12
+ end
13
+
14
+ def test_should_run_action
15
+ assert @object.saved
16
+ end
17
+
18
+ def test_should_not_have_already_persisted_when_running_action
19
+ assert_equal 'parked', @object.state_on_save
20
+ end
21
+
22
+ def test_should_persist
23
+ assert_equal 'idling', @object.state
24
+ end
25
+
26
+ def test_should_not_have_event_during_action
27
+ assert_nil @object.state_event_on_save
28
+ end
29
+
30
+ def test_should_not_write_event
31
+ assert_nil @object.state_event
32
+ end
33
+
34
+ def test_should_have_event_transition_during_action
35
+ assert_equal @transition, @object.state_event_transition_on_save
36
+ end
37
+
38
+ def test_should_not_write_event_transition
39
+ assert_nil @object.send(:state_event_transition)
40
+ end
41
+
42
+ def test_should_mark_event_transition_as_transient
43
+ assert @transition.transient?
44
+ end
45
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookWithDifferentActionsTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+
8
+ @klass.class_eval do
9
+ def save_status
10
+ true
11
+ end
12
+ end
13
+
14
+ @machine = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save_status)
15
+ @machine.state :second_gear
16
+ @machine.event :shift_up
17
+
18
+ @result = StateMachines::TransitionCollection.new([@transition, StateMachines::Transition.new(@object, @machine, :shift_up, :first_gear, :second_gear)]).perform
19
+ end
20
+
21
+ def test_should_succeed
22
+ assert_equal true, @result
23
+ end
24
+
25
+ def test_should_run_action
26
+ assert @object.saved
27
+ end
28
+
29
+ def test_should_have_already_persisted_when_running_action
30
+ assert_equal 'idling', @object.state_on_save
31
+ end
32
+
33
+ def test_should_not_have_event_during_action
34
+ assert_nil @object.state_event_on_save
35
+ end
36
+
37
+ def test_should_not_write_event
38
+ assert_nil @object.state_event
39
+ end
40
+
41
+ def test_should_not_have_event_transition_during_save
42
+ assert_nil @object.state_event_transition_on_save
43
+ end
44
+
45
+ def test_should_not_write_event_attribute
46
+ assert_nil @object.send(:state_event_transition)
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookWithNilActionTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+
8
+ @machine = StateMachines::Machine.new(@klass, :status, initial: :first_gear)
9
+ @machine.state :second_gear
10
+ @machine.event :shift_up
11
+
12
+ @result = StateMachines::TransitionCollection.new([@transition, StateMachines::Transition.new(@object, @machine, :shift_up, :first_gear, :second_gear)]).perform
13
+ end
14
+
15
+ def test_should_succeed
16
+ assert_equal true, @result
17
+ end
18
+
19
+ def test_should_run_action
20
+ assert @object.saved
21
+ end
22
+
23
+ def test_should_have_already_persisted_when_running_action
24
+ assert_equal 'idling', @object.state_on_save
25
+ end
26
+
27
+ def test_should_not_have_event_during_action
28
+ assert_nil @object.state_event_on_save
29
+ end
30
+
31
+ def test_should_not_write_event
32
+ assert_nil @object.state_event
33
+ end
34
+
35
+ def test_should_not_have_event_transition_during_save
36
+ assert_nil @object.state_event_transition_on_save
37
+ end
38
+
39
+ def test_should_not_write_event_attribute
40
+ assert_nil @object.send(:state_event_transition)
41
+ end
42
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithBeforeCallbackHaltTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :saved
7
+
8
+ def save
9
+ @saved = true
10
+ end
11
+ end
12
+ @before_count = 0
13
+ @after_count = 0
14
+
15
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
16
+ @machine.state :idling
17
+ @machine.event :ignite
18
+
19
+ @machine.before_transition { @before_count += 1; throw :halt }
20
+ @machine.before_transition { @before_count += 1 }
21
+ @machine.after_transition { @after_count += 1 }
22
+ @machine.around_transition { |block| @before_count += 1; block.call; @after_count += 1 }
23
+
24
+ @object = @klass.new
25
+
26
+ @transitions = StateMachines::TransitionCollection.new([
27
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
28
+ ])
29
+ @result = @transitions.perform
30
+ end
31
+
32
+ def test_should_not_succeed
33
+ assert_equal false, @result
34
+ end
35
+
36
+ def test_should_not_persist_state
37
+ assert_equal 'parked', @object.state
38
+ end
39
+
40
+ def test_should_not_run_action
41
+ refute @object.saved
42
+ end
43
+
44
+ def test_should_not_run_further_before_callbacks
45
+ assert_equal 1, @before_count
46
+ end
47
+
48
+ def test_should_not_run_after_callbacks
49
+ assert_equal 0, @after_count
50
+ end
51
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithAfterCallbackHaltTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :saved
7
+
8
+ def save
9
+ @saved = true
10
+ end
11
+ end
12
+ @before_count = 0
13
+ @after_count = 0
14
+
15
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
16
+ @machine.state :idling
17
+ @machine.event :ignite
18
+
19
+ @machine.before_transition { @before_count += 1 }
20
+ @machine.after_transition { @after_count += 1; throw :halt }
21
+ @machine.after_transition { @after_count += 1 }
22
+ @machine.around_transition { |block| @before_count += 1; block.call; @after_count += 1 }
23
+
24
+ @object = @klass.new
25
+
26
+ @transitions = StateMachines::TransitionCollection.new([
27
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
28
+ ])
29
+ @result = @transitions.perform
30
+ end
31
+
32
+ def test_should_succeed
33
+ assert_equal true, @result
34
+ end
35
+
36
+ def test_should_persist_state
37
+ assert_equal 'idling', @object.state
38
+ end
39
+
40
+ def test_should_run_before_callbacks
41
+ assert_equal 2, @before_count
42
+ end
43
+
44
+ def test_should_not_run_further_after_callbacks
45
+ assert_equal 2, @after_count
46
+ end
47
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithBlockTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :actions
7
+
8
+ def save
9
+ (@actions ||= []) << :save
10
+ end
11
+ end
12
+
13
+ @state = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
14
+ @state.state :idling
15
+ @state.event :ignite
16
+
17
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
18
+ @status.state :second_gear
19
+ @status.event :shift_up
20
+
21
+ @object = @klass.new
22
+ @transitions = StateMachines::TransitionCollection.new([
23
+ @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
24
+ @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
25
+ ])
26
+ @result = @transitions.perform { 1 }
27
+ end
28
+
29
+ def test_should_succeed
30
+ assert_equal 1, @result
31
+ end
32
+
33
+ def test_should_persist_states
34
+ assert_equal 'idling', @object.state
35
+ assert_equal 'second_gear', @object.status
36
+ end
37
+
38
+ def test_should_not_run_machine_actions
39
+ assert_nil @object.actions
40
+ end
41
+
42
+ def test_should_use_result_as_transition_result
43
+ assert_equal 1, @state_transition.result
44
+ assert_equal 1, @status_transition.result
45
+ end
46
+ end
@@ -0,0 +1,135 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :saved
7
+
8
+ def save
9
+ @saved = true
10
+ end
11
+ end
12
+
13
+ @before_callbacks = []
14
+ @after_callbacks = []
15
+
16
+ @state = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
17
+ @state.state :idling
18
+ @state.event :ignite
19
+ @state.before_transition { @before_callbacks << :state_before }
20
+ @state.after_transition { @after_callbacks << :state_after }
21
+ @state.around_transition { |block| @before_callbacks << :state_around; block.call; @after_callbacks << :state_around }
22
+
23
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
24
+ @status.state :second_gear
25
+ @status.event :shift_up
26
+ @status.before_transition { @before_callbacks << :status_before }
27
+ @status.after_transition { @after_callbacks << :status_after }
28
+ @status.around_transition { |block| @before_callbacks << :status_around; block.call; @after_callbacks << :status_around }
29
+
30
+ @object = @klass.new
31
+ @transitions = StateMachines::TransitionCollection.new([
32
+ StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
33
+ StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
34
+ ])
35
+ end
36
+
37
+ def test_should_run_before_callbacks_in_order
38
+ @transitions.perform
39
+ assert_equal [:state_before, :state_around, :status_before, :status_around], @before_callbacks
40
+ end
41
+
42
+ def test_should_halt_if_before_callback_halted_for_first_transition
43
+ @state.before_transition { throw :halt }
44
+
45
+ assert_equal false, @transitions.perform
46
+ assert_equal [:state_before, :state_around], @before_callbacks
47
+ end
48
+
49
+ def test_should_halt_if_before_callback_halted_for_second_transition
50
+ @status.before_transition { throw :halt }
51
+
52
+ assert_equal false, @transitions.perform
53
+ assert_equal [:state_before, :state_around, :status_before, :status_around], @before_callbacks
54
+ end
55
+
56
+ def test_should_halt_if_around_callback_halted_before_yield_for_first_transition
57
+ @state.around_transition { throw :halt }
58
+
59
+ assert_equal false, @transitions.perform
60
+ assert_equal [:state_before, :state_around], @before_callbacks
61
+ end
62
+
63
+ def test_should_halt_if_around_callback_halted_before_yield_for_second_transition
64
+ @status.around_transition { throw :halt }
65
+
66
+ assert_equal false, @transitions.perform
67
+ assert_equal [:state_before, :state_around, :status_before, :status_around], @before_callbacks
68
+ end
69
+
70
+ def test_should_run_after_callbacks_in_reverse_order
71
+ @transitions.perform
72
+ assert_equal [:status_around, :status_after, :state_around, :state_after], @after_callbacks
73
+ end
74
+
75
+ def test_should_not_halt_if_after_callback_halted_for_first_transition
76
+ @state.after_transition { throw :halt }
77
+
78
+ assert_equal true, @transitions.perform
79
+ assert_equal [:status_around, :status_after, :state_around, :state_after], @after_callbacks
80
+ end
81
+
82
+ def test_should_not_halt_if_around_callback_halted_for_second_transition
83
+ @status.around_transition { |block| block.call; throw :halt }
84
+
85
+ assert_equal true, @transitions.perform
86
+ assert_equal [:state_around, :state_after], @after_callbacks
87
+ end
88
+
89
+ def test_should_run_before_callbacks_before_persisting_the_state
90
+ @state.before_transition { |object| @before_state = object.state }
91
+ @state.around_transition { |object, _transition, block| @around_state = object.state; block.call }
92
+ @transitions.perform
93
+
94
+ assert_equal 'parked', @before_state
95
+ assert_equal 'parked', @around_state
96
+ end
97
+
98
+ def test_should_persist_state_before_running_action
99
+ @klass.class_eval do
100
+ attr_reader :saved_on_persist
101
+
102
+ def state=(value)
103
+ @state = value
104
+ @saved_on_persist = saved
105
+ end
106
+ end
107
+
108
+ @transitions.perform
109
+ refute @object.saved_on_persist
110
+ end
111
+
112
+ def test_should_persist_state_before_running_action_block
113
+ @klass.class_eval do
114
+ attr_writer :saved
115
+ attr_reader :saved_on_persist
116
+
117
+ def state=(value)
118
+ @state = value
119
+ @saved_on_persist = saved
120
+ end
121
+ end
122
+
123
+ @transitions.perform { @object.saved = true }
124
+ refute @object.saved_on_persist
125
+ end
126
+
127
+ def test_should_run_after_callbacks_after_running_the_action
128
+ @state.after_transition { |object| @after_saved = object.saved }
129
+ @state.around_transition { |object, _transition, block| block.call; @around_saved = object.saved }
130
+ @transitions.perform
131
+
132
+ assert @after_saved
133
+ assert @around_saved
134
+ end
135
+ end