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,104 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithBeforeCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_run_before_callbacks
17
+ @machine.before_transition { @run = true }
18
+ result = @transition.run_callbacks
19
+
20
+ assert_equal true, result
21
+ assert_equal true, @run
22
+ end
23
+
24
+ def test_should_only_run_those_that_match_transition_context
25
+ @count = 0
26
+ callback = lambda { @count += 1 }
27
+
28
+ @machine.before_transition from: :parked, to: :idling, on: :park, do: callback
29
+ @machine.before_transition from: :parked, to: :parked, on: :park, do: callback
30
+ @machine.before_transition from: :parked, to: :idling, on: :ignite, do: callback
31
+ @machine.before_transition from: :idling, to: :idling, on: :park, do: callback
32
+ @transition.run_callbacks
33
+
34
+ assert_equal 1, @count
35
+ end
36
+
37
+ def test_should_pass_transition_as_argument
38
+ @machine.before_transition { |*args| @args = args }
39
+ @transition.run_callbacks
40
+
41
+ assert_equal [@object, @transition], @args
42
+ end
43
+
44
+ def test_should_catch_halts
45
+ @machine.before_transition { throw :halt }
46
+
47
+ result = @transition.run_callbacks
48
+ assert_equal false, result
49
+ end
50
+
51
+ def test_should_not_catch_exceptions
52
+ @machine.before_transition { fail ArgumentError }
53
+ assert_raises(ArgumentError) { @transition.run_callbacks }
54
+ end
55
+
56
+ def test_should_not_be_able_to_run_twice
57
+ @count = 0
58
+ @machine.before_transition { @count += 1 }
59
+ @transition.run_callbacks
60
+ @transition.run_callbacks
61
+ assert_equal 1, @count
62
+ end
63
+
64
+ def test_should_be_able_to_run_again_after_halt
65
+ @count = 0
66
+ @machine.before_transition { @count += 1; throw :halt }
67
+ @transition.run_callbacks
68
+ @transition.run_callbacks
69
+ assert_equal 2, @count
70
+ end
71
+
72
+ def test_should_be_able_to_run_again_after_resetting
73
+ @count = 0
74
+ @machine.before_transition { @count += 1 }
75
+ @transition.run_callbacks
76
+ @transition.reset
77
+ @transition.run_callbacks
78
+ assert_equal 2, @count
79
+ end
80
+
81
+ def test_should_succeed_if_block_result_is_false
82
+ @machine.before_transition { @run = true }
83
+ assert_equal true, @transition.run_callbacks { { result: false } }
84
+ assert @run
85
+ end
86
+
87
+ def test_should_succeed_if_block_result_is_true
88
+ @machine.before_transition { @run = true }
89
+ assert_equal true, @transition.run_callbacks { { result: true } }
90
+ assert @run
91
+ end
92
+
93
+ def test_should_succeed_if_block_success_is_false
94
+ @machine.before_transition { @run = true }
95
+ assert_equal true, @transition.run_callbacks { { success: false } }
96
+ assert @run
97
+ end
98
+
99
+ def test_should_succeed_if_block_success_is_true
100
+ @machine.before_transition { @run = true }
101
+ assert_equal true, @transition.run_callbacks { { success: true } }
102
+ assert @run
103
+ end
104
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithCustomMachineAttributeTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, :state, attribute: :state_id)
7
+ @machine.state :off, value: 1
8
+ @machine.state :active, value: 2
9
+ @machine.event :activate
10
+
11
+ @object = @klass.new
12
+ @object.state_id = 1
13
+
14
+ @transition = StateMachines::Transition.new(@object, @machine, :activate, :off, :active)
15
+ end
16
+
17
+ def test_should_persist
18
+ @transition.persist
19
+ assert_equal 2, @object.state_id
20
+ end
21
+
22
+ def test_should_rollback
23
+ @object.state_id = 2
24
+ @transition.rollback
25
+
26
+ assert_equal 1, @object.state_id
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithDifferentStatesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked, :idling
8
+ @machine.event :ignite
9
+
10
+ @object = @klass.new
11
+ @object.state = 'parked'
12
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
13
+ end
14
+
15
+ def test_should_not_be_loopback
16
+ refute @transition.loopback?
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithDynamicToValueTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked
8
+ @machine.state :idling, value: lambda { 1 }
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_evaluate_to_value
17
+ assert_equal 1, @transition.to
18
+ end
19
+ end
@@ -0,0 +1,84 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithFailureCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_only_run_those_that_match_transition_context
17
+ @count = 0
18
+ callback = lambda { @count += 1 }
19
+
20
+ @machine.after_failure do: callback
21
+ @machine.after_failure on: :park, do: callback
22
+ @machine.after_failure on: :ignite, do: callback
23
+ @transition.run_callbacks { { success: false } }
24
+
25
+ assert_equal 2, @count
26
+ end
27
+
28
+ def test_should_run_if_not_successful
29
+ @machine.after_failure { |_object| @run = true }
30
+ @transition.run_callbacks { { success: false } }
31
+ assert @run
32
+ end
33
+
34
+ def test_should_not_run_if_successful
35
+ @run = false
36
+ @machine.after_failure { |_object| @run = true }
37
+ @transition.run_callbacks { { success: true } }
38
+ refute @run
39
+ end
40
+
41
+ def test_should_pass_transition_as_argument
42
+ @machine.after_failure { |*args| @args = args }
43
+
44
+ @transition.run_callbacks { { success: false } }
45
+ assert_equal [@object, @transition], @args
46
+ end
47
+
48
+ def test_should_catch_halts
49
+ @machine.after_failure { throw :halt }
50
+
51
+ result = @transition.run_callbacks { { success: false } }
52
+ assert_equal true, result
53
+ end
54
+
55
+ def test_should_not_catch_exceptions
56
+ @machine.after_failure { fail ArgumentError }
57
+ assert_raises(ArgumentError) { @transition.run_callbacks { { success: false } } }
58
+ end
59
+
60
+ def test_should_not_be_able_to_run_twice
61
+ @count = 0
62
+ @machine.after_failure { @count += 1 }
63
+ @transition.run_callbacks { { success: false } }
64
+ @transition.run_callbacks { { success: false } }
65
+ assert_equal 1, @count
66
+ end
67
+
68
+ def test_should_not_be_able_to_run_twice_if_halted
69
+ @count = 0
70
+ @machine.after_failure { @count += 1; throw :halt }
71
+ @transition.run_callbacks { { success: false } }
72
+ @transition.run_callbacks { { success: false } }
73
+ assert_equal 1, @count
74
+ end
75
+
76
+ def test_should_be_able_to_run_again_after_resetting
77
+ @count = 0
78
+ @machine.after_failure { @count += 1 }
79
+ @transition.run_callbacks { { success: false } }
80
+ @transition.reset
81
+ @transition.run_callbacks { { success: false } }
82
+ assert_equal 2, @count
83
+ end
84
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithInvalidNodesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked, :idling
8
+ @machine.event :ignite
9
+
10
+ @object = @klass.new
11
+ @object.state = 'parked'
12
+ end
13
+
14
+ def test_should_raise_exception_without_event
15
+ assert_raises(IndexError) { StateMachines::Transition.new(@object, @machine, nil, :parked, :idling) }
16
+ end
17
+
18
+ def test_should_raise_exception_with_invalid_event
19
+ assert_raises(IndexError) { StateMachines::Transition.new(@object, @machine, :invalid, :parked, :idling) }
20
+ end
21
+
22
+ def test_should_raise_exception_with_invalid_from_state
23
+ assert_raises(IndexError) { StateMachines::Transition.new(@object, @machine, :ignite, :invalid, :idling) }
24
+ end
25
+
26
+ def test_should_raise_exception_with_invalid_to_state
27
+ assert_raises(IndexError) { StateMachines::Transition.new(@object, @machine, :ignite, :parked, :invalid) }
28
+ end
29
+ end
@@ -0,0 +1,105 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithMixedCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_before_and_around_callbacks_in_order_defined
17
+ @callbacks = []
18
+ @machine.before_transition { @callbacks << :before_1 }
19
+ @machine.around_transition { |block| @callbacks << :around; block.call }
20
+ @machine.before_transition { @callbacks << :before_2 }
21
+
22
+ assert_equal true, @transition.run_callbacks
23
+ assert_equal [:before_1, :around, :before_2], @callbacks
24
+ end
25
+
26
+ def test_should_run_around_callbacks_before_after_callbacks
27
+ @callbacks = []
28
+ @machine.after_transition { @callbacks << :after_1 }
29
+ @machine.around_transition { |block| block.call; @callbacks << :after_2 }
30
+ @machine.after_transition { @callbacks << :after_3 }
31
+
32
+ assert_equal true, @transition.run_callbacks
33
+ assert_equal [:after_2, :after_1, :after_3], @callbacks
34
+ end
35
+
36
+ def test_should_have_access_to_result_for_both_after_and_around_callbacks
37
+ @machine.after_transition { @after_result = @transition.result }
38
+ @machine.around_transition { |block| block.call; @around_result = @transition.result }
39
+
40
+ @transition.run_callbacks { { result: 1, success: true } }
41
+ assert_equal 1, @after_result
42
+ assert_equal 1, @around_result
43
+ end
44
+
45
+ def test_should_not_run_further_callbacks_if_before_callback_halts
46
+ @callbacks = []
47
+ @machine.before_transition { @callbacks << :before_1 }
48
+ @machine.around_transition { |block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1 }
49
+ @machine.before_transition { @callbacks << :before_2; throw :halt }
50
+ @machine.around_transition { |block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2 }
51
+ @machine.after_transition { @callbacks << :after }
52
+
53
+ assert_equal false, @transition.run_callbacks
54
+ assert_equal [:before_1, :before_around_1, :before_2], @callbacks
55
+ end
56
+
57
+ def test_should_not_run_further_callbacks_if_before_yield_halts
58
+ @callbacks = []
59
+ @machine.before_transition { @callbacks << :before_1 }
60
+ @machine.around_transition { |_block| @callbacks << :before_around_1; throw :halt }
61
+ @machine.before_transition { @callbacks << :before_2; throw :halt }
62
+ @machine.around_transition { |block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2 }
63
+ @machine.after_transition { @callbacks << :after }
64
+
65
+ assert_equal false, @transition.run_callbacks
66
+ assert_equal [:before_1, :before_around_1], @callbacks
67
+ end
68
+
69
+ def test_should_not_run_further_callbacks_if_around_callback_fails_to_yield
70
+ @callbacks = []
71
+ @machine.before_transition { @callbacks << :before_1 }
72
+ @machine.around_transition { |_block| @callbacks << :before_around_1 }
73
+ @machine.before_transition { @callbacks << :before_2; throw :halt }
74
+ @machine.around_transition { |block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2 }
75
+ @machine.after_transition { @callbacks << :after }
76
+
77
+ assert_equal false, @transition.run_callbacks
78
+ assert_equal [:before_1, :before_around_1], @callbacks
79
+ end
80
+
81
+ def test_should_not_run_further_callbacks_if_after_yield_halts
82
+ @callbacks = []
83
+ @machine.before_transition { @callbacks << :before_1 }
84
+ @machine.around_transition { |block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1; throw :halt }
85
+ @machine.before_transition { @callbacks << :before_2 }
86
+ @machine.around_transition { |block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2 }
87
+ @machine.after_transition { @callbacks << :after }
88
+
89
+ assert_equal true, @transition.run_callbacks
90
+ assert_equal [:before_1, :before_around_1, :before_2, :before_around_2, :after_around_2, :after_around_1], @callbacks
91
+ end
92
+
93
+ def test_should_not_run_further_callbacks_if_after_callback_halts
94
+ @callbacks = []
95
+ @machine.before_transition { @callbacks << :before_1 }
96
+ @machine.around_transition { |block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1 }
97
+ @machine.before_transition { @callbacks << :before_2 }
98
+ @machine.around_transition { |block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2 }
99
+ @machine.after_transition { @callbacks << :after_1; throw :halt }
100
+ @machine.after_transition { @callbacks << :after_2 }
101
+
102
+ assert_equal true, @transition.run_callbacks
103
+ assert_equal [:before_1, :before_around_1, :before_2, :before_around_2, :after_around_2, :after_around_1, :after_1], @callbacks
104
+ end
105
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithMultipleAfterCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_run_in_the_order_they_were_defined
17
+ @callbacks = []
18
+ @machine.after_transition { @callbacks << 1 }
19
+ @machine.after_transition { @callbacks << 2 }
20
+ @transition.run_callbacks
21
+
22
+ assert_equal [1, 2], @callbacks
23
+ end
24
+
25
+ def test_should_not_run_further_callbacks_if_halted
26
+ @callbacks = []
27
+ @machine.after_transition { @callbacks << 1; throw :halt }
28
+ @machine.after_transition { @callbacks << 2 }
29
+
30
+ assert_equal true, @transition.run_callbacks
31
+ assert_equal [1], @callbacks
32
+ end
33
+
34
+ def test_should_fail_if_any_callback_halted
35
+ @machine.after_transition { true }
36
+ @machine.after_transition { throw :halt }
37
+
38
+ assert_equal true, @transition.run_callbacks
39
+ end
40
+ end
@@ -0,0 +1,114 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithMultipleAroundCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_before_yield_in_the_order_they_were_defined
17
+ @callbacks = []
18
+ @machine.around_transition { |block| @callbacks << 1; block.call }
19
+ @machine.around_transition { |block| @callbacks << 2; block.call }
20
+ @transition.run_callbacks
21
+
22
+ assert_equal [1, 2], @callbacks
23
+ end
24
+
25
+ def test_should_before_yield_multiple_methods_in_the_order_they_were_defined
26
+ @callbacks = []
27
+ @machine.around_transition(lambda { |block| @callbacks << 1; block.call }, lambda { |block| @callbacks << 2; block.call })
28
+ @machine.around_transition(lambda { |block| @callbacks << 3; block.call }, lambda { |block| @callbacks << 4; block.call })
29
+ @transition.run_callbacks
30
+
31
+ assert_equal [1, 2, 3, 4], @callbacks
32
+ end
33
+
34
+ def test_should_after_yield_in_the_reverse_order_they_were_defined
35
+ @callbacks = []
36
+ @machine.around_transition { |block| block.call; @callbacks << 1 }
37
+ @machine.around_transition { |block| block.call; @callbacks << 2 }
38
+ @transition.run_callbacks
39
+
40
+ assert_equal [2, 1], @callbacks
41
+ end
42
+
43
+ def test_should_after_yield_multiple_methods_in_the_reverse_order_they_were_defined
44
+ @callbacks = []
45
+ @machine.around_transition(lambda { |block| block.call; @callbacks << 1 }) { |block| block.call; @callbacks << 2 }
46
+ @machine.around_transition(lambda { |block| block.call; @callbacks << 3 }) { |block| block.call; @callbacks << 4 }
47
+ @transition.run_callbacks
48
+
49
+ assert_equal [4, 3, 2, 1], @callbacks
50
+ end
51
+
52
+ def test_should_run_block_between_callback
53
+ @callbacks = []
54
+ @machine.around_transition { |block| @callbacks << :before_1; block.call; @callbacks << :after_1 }
55
+ @machine.around_transition { |block| @callbacks << :before_2; block.call; @callbacks << :after_2 }
56
+ @transition.run_callbacks { @callbacks << :within; { success: true } }
57
+
58
+ assert_equal [:before_1, :before_2, :within, :after_2, :after_1], @callbacks
59
+ end
60
+
61
+ def test_should_have_access_to_result_after_yield
62
+ @machine.around_transition { |block| @before_result_1 = @transition.result; block.call; @after_result_1 = @transition.result }
63
+ @machine.around_transition { |block| @before_result_2 = @transition.result; block.call; @after_result_2 = @transition.result }
64
+ @transition.run_callbacks { { result: 1, success: true } }
65
+
66
+ assert_nil @before_result_1
67
+ assert_nil @before_result_2
68
+ assert_equal 1, @after_result_1
69
+ assert_equal 1, @after_result_2
70
+ end
71
+
72
+ def test_should_fail_if_any_before_yield_halted
73
+ @machine.around_transition { |block| block.call }
74
+ @machine.around_transition { throw :halt }
75
+
76
+ assert_equal false, @transition.run_callbacks
77
+ end
78
+
79
+ def test_should_not_continue_around_callbacks_if_before_yield_halted
80
+ @callbacks = []
81
+ @machine.around_transition { @callbacks << 1; throw :halt }
82
+ @machine.around_transition { |block| @callbacks << 2; block.call; @callbacks << 3 }
83
+
84
+ assert_equal false, @transition.run_callbacks
85
+ assert_equal [1], @callbacks
86
+ end
87
+
88
+ def test_should_not_continue_around_callbacks_if_later_before_yield_halted
89
+ @callbacks = []
90
+ @machine.around_transition { |block| block.call; @callbacks << 1 }
91
+ @machine.around_transition { throw :halt }
92
+
93
+ @transition.run_callbacks
94
+ assert_equal [], @callbacks
95
+ end
96
+
97
+ def test_should_not_run_further_callbacks_if_after_yield_halted
98
+ @callbacks = []
99
+ @machine.around_transition { |block| block.call; @callbacks << 1 }
100
+ @machine.around_transition { |block| block.call; throw :halt }
101
+
102
+ assert_equal true, @transition.run_callbacks
103
+ assert_equal [], @callbacks
104
+ end
105
+
106
+ def test_should_fail_if_any_fail_to_yield
107
+ @callbacks = []
108
+ @machine.around_transition { @callbacks << 1 }
109
+ @machine.around_transition { |block| @callbacks << 2; block.call; @callbacks << 3 }
110
+
111
+ assert_equal false, @transition.run_callbacks
112
+ assert_equal [1], @callbacks
113
+ end
114
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithMultipleBeforeCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_run_in_the_order_they_were_defined
17
+ @callbacks = []
18
+ @machine.before_transition { @callbacks << 1 }
19
+ @machine.before_transition { @callbacks << 2 }
20
+ @transition.run_callbacks
21
+
22
+ assert_equal [1, 2], @callbacks
23
+ end
24
+
25
+ def test_should_not_run_further_callbacks_if_halted
26
+ @callbacks = []
27
+ @machine.before_transition { @callbacks << 1; throw :halt }
28
+ @machine.before_transition { @callbacks << 2 }
29
+
30
+ assert_equal false, @transition.run_callbacks
31
+ assert_equal [1], @callbacks
32
+ end
33
+
34
+ def test_should_fail_if_any_callback_halted
35
+ @machine.before_transition { true }
36
+ @machine.before_transition { throw :halt }
37
+
38
+ assert_equal false, @transition.run_callbacks
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithMultipleFailureCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.state :parked, :idling
9
+ @machine.event :ignite
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ end
15
+
16
+ def test_should_run_in_the_order_they_were_defined
17
+ @callbacks = []
18
+ @machine.after_failure { @callbacks << 1 }
19
+ @machine.after_failure { @callbacks << 2 }
20
+ @transition.run_callbacks { { success: false } }
21
+
22
+ assert_equal [1, 2], @callbacks
23
+ end
24
+
25
+ def test_should_not_run_further_callbacks_if_halted
26
+ @callbacks = []
27
+ @machine.after_failure { @callbacks << 1; throw :halt }
28
+ @machine.after_failure { @callbacks << 2 }
29
+
30
+ assert_equal true, @transition.run_callbacks { { success: false } }
31
+ assert_equal [1], @callbacks
32
+ end
33
+
34
+ def test_should_fail_if_any_callback_halted
35
+ @machine.after_failure { true }
36
+ @machine.after_failure { throw :halt }
37
+
38
+ assert_equal true, @transition.run_callbacks { { success: false } }
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionWithNamespaceTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, namespace: 'alarm')
7
+ @machine.state :off, :active
8
+ @machine.event :activate
9
+
10
+ @object = @klass.new
11
+ @object.state = 'off'
12
+
13
+ @transition = StateMachines::Transition.new(@object, @machine, :activate, :off, :active)
14
+ end
15
+
16
+ def test_should_have_an_event
17
+ assert_equal :activate, @transition.event
18
+ end
19
+
20
+ def test_should_have_a_qualified_event
21
+ assert_equal :activate_alarm, @transition.qualified_event
22
+ end
23
+
24
+ def test_should_have_a_from_name
25
+ assert_equal :off, @transition.from_name
26
+ end
27
+
28
+ def test_should_have_a_qualified_from_name
29
+ assert_equal :alarm_off, @transition.qualified_from_name
30
+ end
31
+
32
+ def test_should_have_a_human_from_name
33
+ assert_equal 'off', @transition.human_from_name
34
+ end
35
+
36
+ def test_should_have_a_to_name
37
+ assert_equal :active, @transition.to_name
38
+ end
39
+
40
+ def test_should_have_a_qualified_to_name
41
+ assert_equal :alarm_active, @transition.qualified_to_name
42
+ end
43
+
44
+ def test_should_have_a_human_to_name
45
+ assert_equal 'active', @transition.human_to_name
46
+ end
47
+ end