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,68 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AttributeTransitionCollectionWithCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @state = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
8
+ @state.state :idling
9
+ @state.event :ignite
10
+
11
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
12
+ @status.state :second_gear
13
+ @status.event :shift_up
14
+
15
+ @object = @klass.new
16
+
17
+ @transitions = StateMachines::AttributeTransitionCollection.new([
18
+ @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
19
+ @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
20
+ ])
21
+ end
22
+
23
+ def test_should_not_have_events_during_before_callbacks
24
+ @state.before_transition { |object, _transition| @before_state_event = object.state_event }
25
+ @state.around_transition { |object, _transition, block| @around_state_event = object.state_event; block.call }
26
+ @transitions.perform
27
+
28
+ assert_nil @before_state_event
29
+ assert_nil @around_state_event
30
+ end
31
+
32
+ def test_should_not_have_events_during_action
33
+ @transitions.perform { @state_event = @object.state_event }
34
+
35
+ assert_nil @state_event
36
+ end
37
+
38
+ def test_should_not_have_events_during_after_callbacks
39
+ @state.after_transition { |object, _transition| @after_state_event = object.state_event }
40
+ @state.around_transition { |object, _transition, block| block.call; @around_state_event = object.state_event }
41
+ @transitions.perform
42
+
43
+ assert_nil @after_state_event
44
+ assert_nil @around_state_event
45
+ end
46
+
47
+ def test_should_not_have_event_transitions_during_before_callbacks
48
+ @state.before_transition { |object, _transition| @state_event_transition = object.send(:state_event_transition) }
49
+ @transitions.perform
50
+
51
+ assert_nil @state_event_transition
52
+ end
53
+
54
+ def test_should_not_have_event_transitions_during_action
55
+ @transitions.perform { @state_event_transition = @object.send(:state_event_transition) }
56
+
57
+ assert_nil @state_event_transition
58
+ end
59
+
60
+ def test_should_not_have_event_transitions_during_after_callbacks
61
+ @state.after_transition { |object, _transition| @after_state_event_transition = object.send(:state_event_transition) }
62
+ @state.around_transition { |object, _transition, block| block.call; @around_state_event_transition = object.send(:state_event_transition) }
63
+ @transitions.perform
64
+
65
+ assert_nil @after_state_event_transition
66
+ assert_nil @around_state_event_transition
67
+ end
68
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AttributeTransitionCollectionWithEventTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @state = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
8
+ @state.state :idling
9
+ @state.event :ignite
10
+
11
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
12
+ @status.state :second_gear
13
+ @status.event :shift_up
14
+
15
+ @object = @klass.new
16
+ @object.send(:state_event_transition=, @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling))
17
+ @object.send(:status_event_transition=, @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear))
18
+
19
+ @transitions = StateMachines::AttributeTransitionCollection.new([@state_transition, @status_transition])
20
+ @result = @transitions.perform
21
+ end
22
+
23
+ def test_should_succeed
24
+ assert_equal true, @result
25
+ end
26
+
27
+ def test_should_persist_states
28
+ assert_equal 'idling', @object.state
29
+ assert_equal 'second_gear', @object.status
30
+ end
31
+
32
+ def test_should_not_write_events
33
+ assert_nil @object.state_event
34
+ assert_nil @object.status_event
35
+ end
36
+
37
+ def test_should_clear_event_transitions
38
+ assert_nil @object.send(:state_event_transition)
39
+ assert_nil @object.send(:status_event_transition)
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AttributeTransitionCollectionWithEventsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @state = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
8
+ @state.state :idling
9
+ @state.event :ignite
10
+
11
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
12
+ @status.state :second_gear
13
+ @status.event :shift_up
14
+
15
+ @object = @klass.new
16
+ @object.state_event = 'ignite'
17
+ @object.status_event = 'shift_up'
18
+
19
+ @transitions = StateMachines::AttributeTransitionCollection.new([
20
+ @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
21
+ @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
22
+ ])
23
+ @result = @transitions.perform
24
+ end
25
+
26
+ def test_should_succeed
27
+ assert_equal true, @result
28
+ end
29
+
30
+ def test_should_persist_states
31
+ assert_equal 'idling', @object.state
32
+ assert_equal 'second_gear', @object.status
33
+ end
34
+
35
+ def test_should_clear_events
36
+ assert_nil @object.state_event
37
+ assert_nil @object.status_event
38
+ end
39
+
40
+ def test_should_not_write_event_transitions
41
+ assert_nil @object.send(:state_event_transition)
42
+ assert_nil @object.send(:status_event_transition)
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AttributeTransitionCollectionWithSkippedAfterCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @state = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
8
+ @state.state :idling
9
+ @state.event :ignite
10
+
11
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
12
+ @status.state :second_gear
13
+ @status.event :shift_up
14
+
15
+ @object = @klass.new
16
+ @object.state_event = 'ignite'
17
+ @object.status_event = 'shift_up'
18
+
19
+ @transitions = StateMachines::AttributeTransitionCollection.new([
20
+ @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
21
+ @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
22
+ ], after: false)
23
+ end
24
+
25
+ def test_should_clear_events
26
+ @transitions.perform
27
+ assert_nil @object.state_event
28
+ assert_nil @object.status_event
29
+ end
30
+
31
+ def test_should_write_event_transitions_if_success
32
+ @transitions.perform { true }
33
+ assert_equal @state_transition, @object.send(:state_event_transition)
34
+ assert_equal @status_transition, @object.send(:status_event_transition)
35
+ end
36
+
37
+ def test_should_not_write_event_transitions_if_failed
38
+ @transitions.perform { false }
39
+ assert_nil @object.send(:state_event_transition)
40
+ assert_nil @object.send(:status_event_transition)
41
+ end
42
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionByDefaultTest < StateMachinesTest
4
+ def setup
5
+ @transitions = StateMachines::TransitionCollection.new
6
+ end
7
+
8
+ def test_should_not_skip_actions
9
+ refute @transitions.skip_actions
10
+ end
11
+
12
+ def test_should_not_skip_after
13
+ refute @transitions.skip_after
14
+ end
15
+
16
+ def test_should_use_transaction
17
+ assert @transitions.use_transaction
18
+ end
19
+
20
+ def test_should_be_empty
21
+ assert @transitions.empty?
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionEmptyWithBlockTest < StateMachinesTest
4
+ def setup
5
+ @transitions = StateMachines::TransitionCollection.new
6
+ end
7
+
8
+ def test_should_raise_exception_if_perform_raises_exception
9
+ assert_raises(ArgumentError) { @transitions.perform { fail ArgumentError } }
10
+ end
11
+
12
+ def test_should_use_block_result_if_non_boolean
13
+ assert_equal 1, @transitions.perform { 1 }
14
+ end
15
+
16
+ def test_should_use_block_result_if_false
17
+ assert_equal false, @transitions.perform { false }
18
+ end
19
+
20
+ def test_should_use_block_reslut_if_nil
21
+ assert_equal nil, @transitions.perform { nil }
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionEmptyWithoutBlockTest < StateMachinesTest
4
+ def setup
5
+ @transitions = StateMachines::TransitionCollection.new
6
+ @result = @transitions.perform
7
+ end
8
+
9
+ def test_should_succeed
10
+ assert_equal true, @result
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionInvalidTest < StateMachinesTest
4
+ def setup
5
+ @transitions = StateMachines::TransitionCollection.new([false])
6
+ end
7
+
8
+ def test_should_be_empty
9
+ assert @transitions.empty?
10
+ end
11
+
12
+ def test_should_not_succeed
13
+ assert_equal false, @transitions.perform
14
+ end
15
+
16
+ def test_should_not_run_perform_block
17
+ ran_block = false
18
+ @transitions.perform { ran_block = true }
19
+ refute ran_block
20
+ end
21
+ end
@@ -0,0 +1,69 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionPartialInvalidTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_accessor :ran_transaction
7
+ end
8
+
9
+ @callbacks = []
10
+
11
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
12
+ @machine.state :idling
13
+ @machine.event :ignite
14
+ @machine.before_transition { @callbacks << :before }
15
+ @machine.after_transition { @callbacks << :after }
16
+ @machine.around_transition { |block| @callbacks << :around_before; block.call; @callbacks << :around_after }
17
+
18
+ class << @machine
19
+ def within_transaction(object)
20
+ object.ran_transaction = true
21
+ end
22
+ end
23
+
24
+ @object = @klass.new
25
+
26
+ @transitions = StateMachines::TransitionCollection.new([
27
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling),
28
+ false
29
+ ])
30
+ end
31
+
32
+ def test_should_not_store_invalid_values
33
+ assert_equal 1, @transitions.length
34
+ end
35
+
36
+ def test_should_not_succeed
37
+ assert_equal false, @transitions.perform
38
+ end
39
+
40
+ def test_should_not_start_transaction
41
+ refute @object.ran_transaction
42
+ end
43
+
44
+ def test_should_not_run_perform_block
45
+ ran_block = false
46
+ @transitions.perform { ran_block = true }
47
+ refute ran_block
48
+ end
49
+
50
+ def test_should_not_run_before_callbacks
51
+ refute @callbacks.include?(:before)
52
+ end
53
+
54
+ def test_should_not_persist_states
55
+ assert_equal 'parked', @object.state
56
+ end
57
+
58
+ def test_should_not_run_after_callbacks
59
+ refute @callbacks.include?(:after)
60
+ end
61
+
62
+ def test_should_not_run_around_callbacks_before_yield
63
+ refute @callbacks.include?(:around_before)
64
+ end
65
+
66
+ def test_should_not_run_around_callbacks_after_yield
67
+ refute @callbacks.include?(:around_after)
68
+ end
69
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionTest < StateMachinesTest
4
+ def test_should_raise_exception_if_invalid_option_specified
5
+ exception = assert_raises(ArgumentError) { StateMachines::TransitionCollection.new([], invalid: true) }
6
+ assert_equal 'Unknown key: :invalid. Valid keys are: :actions, :after, :transaction', exception.message
7
+ end
8
+
9
+ def test_should_raise_exception_if_multiple_transitions_for_same_attribute_specified
10
+ @klass = Class.new
11
+
12
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
13
+ @machine.state :parked, :idling
14
+ @machine.event :ignite
15
+
16
+ @object = @klass.new
17
+
18
+ exception = assert_raises(ArgumentError) do
19
+ StateMachines::TransitionCollection.new([
20
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling),
21
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
22
+ ])
23
+ end
24
+ assert_equal 'Cannot perform multiple transitions in parallel for the same state machine attribute', exception.message
25
+ end
26
+ end
@@ -0,0 +1,57 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionValidTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :persisted
7
+
8
+ def initialize
9
+ @persisted = nil
10
+ super
11
+ @persisted = []
12
+ end
13
+
14
+ def state=(value)
15
+ @persisted << 'state' if @persisted
16
+ @state = value
17
+ end
18
+
19
+ def status=(value)
20
+ @persisted << 'status' if @persisted
21
+ @status = value
22
+ end
23
+ end
24
+
25
+ @state = StateMachines::Machine.new(@klass, initial: :parked)
26
+ @state.state :idling
27
+ @state.event :ignite
28
+ @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear)
29
+ @status.state :second_gear
30
+ @status.event :shift_up
31
+
32
+ @object = @klass.new
33
+
34
+ @result = StateMachines::TransitionCollection.new([
35
+ @state_transition = StateMachines::Transition.new(@object, @state, :ignite, :parked, :idling),
36
+ @status_transition = StateMachines::Transition.new(@object, @status, :shift_up, :first_gear, :second_gear)
37
+ ]).perform
38
+ end
39
+
40
+ def test_should_succeed
41
+ assert_equal true, @result
42
+ end
43
+
44
+ def test_should_persist_each_state
45
+ assert_equal 'idling', @object.state
46
+ assert_equal 'second_gear', @object.status
47
+ end
48
+
49
+ def test_should_persist_in_order
50
+ assert_equal %w(state status), @object.persisted
51
+ end
52
+
53
+ def test_should_store_results_in_transitions
54
+ assert_nil @state_transition.result
55
+ assert_nil @status_transition.result
56
+ end
57
+ end
@@ -0,0 +1,66 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithActionErrorTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def save
7
+ fail ArgumentError
8
+ end
9
+ end
10
+ @before_count = 0
11
+ @around_before_count = 0
12
+ @after_count = 0
13
+ @around_after_count = 0
14
+ @failure_count = 0
15
+
16
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
17
+ @machine.state :idling
18
+ @machine.event :ignite
19
+
20
+ @machine.before_transition { @before_count += 1 }
21
+ @machine.after_transition { @after_count += 1 }
22
+ @machine.around_transition { |block| @around_before_count += 1; block.call; @around_after_count += 1 }
23
+ @machine.after_failure { @failure_count += 1 }
24
+
25
+ @object = @klass.new
26
+
27
+ @transitions = StateMachines::TransitionCollection.new([
28
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
29
+ ])
30
+
31
+ @raised = true
32
+ begin
33
+ @transitions.perform
34
+ @raised = false
35
+ rescue ArgumentError
36
+ end
37
+ end
38
+
39
+ def test_should_not_catch_exception
40
+ assert @raised
41
+ end
42
+
43
+ def test_should_not_persist_state
44
+ assert_equal 'parked', @object.state
45
+ end
46
+
47
+ def test_should_run_before_callbacks
48
+ assert_equal 1, @before_count
49
+ end
50
+
51
+ def test_should_run_around_callbacks_before_yield
52
+ assert_equal 1, @around_before_count
53
+ end
54
+
55
+ def test_should_not_run_after_callbacks
56
+ assert_equal 0, @after_count
57
+ end
58
+
59
+ def test_should_not_run_around_callbacks_after_yield
60
+ assert_equal 0, @around_after_count
61
+ end
62
+
63
+ def test_should_not_run_failure_callbacks
64
+ assert_equal 0, @failure_count
65
+ end
66
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithActionFailedTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def save
7
+ false
8
+ end
9
+ end
10
+ @before_count = 0
11
+ @around_before_count = 0
12
+ @after_count = 0
13
+ @around_after_count = 0
14
+ @failure_count = 0
15
+
16
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
17
+ @machine.state :idling
18
+ @machine.event :ignite
19
+
20
+ @machine.before_transition { @before_count += 1 }
21
+ @machine.after_transition { @after_count += 1 }
22
+ @machine.around_transition { |block| @around_before_count += 1; block.call; @around_after_count += 1 }
23
+ @machine.after_failure { @failure_count += 1 }
24
+
25
+ @object = @klass.new
26
+
27
+ @transitions = StateMachines::TransitionCollection.new([
28
+ StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
29
+ ])
30
+ @result = @transitions.perform
31
+ end
32
+
33
+ def test_should_not_succeed
34
+ assert_equal false, @result
35
+ end
36
+
37
+ def test_should_not_persist_state
38
+ assert_equal 'parked', @object.state
39
+ end
40
+
41
+ def test_should_run_before_callbacks
42
+ assert_equal 1, @before_count
43
+ end
44
+
45
+ def test_should_run_around_callbacks_before_yield
46
+ assert_equal 1, @around_before_count
47
+ end
48
+
49
+ def test_should_not_run_after_callbacks
50
+ assert_equal 0, @after_count
51
+ end
52
+
53
+ def test_should_not_run_around_callbacks
54
+ assert_equal 0, @around_after_count
55
+ end
56
+
57
+ def test_should_run_failure_callbacks
58
+ assert_equal 1, @failure_count
59
+ end
60
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test'
3
+
4
+ class TransitionCollectionWithActionHookAndBlockTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+ @result = StateMachines::TransitionCollection.new([@transition]).perform { true }
8
+ end
9
+
10
+ def test_should_succeed
11
+ assert_equal true, @result
12
+ end
13
+
14
+ def test_should_not_run_action
15
+ refute @object.saved
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookAndSkippedActionTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+ @result = StateMachines::TransitionCollection.new([@transition], actions: false).perform
8
+ end
9
+
10
+ def test_should_succeed
11
+ assert_equal true, @result
12
+ end
13
+
14
+ def test_should_not_run_action
15
+ refute @object.saved
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../test_helper'
2
+ require_relative 'transition_collection_with_action_hook_base_test.rb'
3
+
4
+ class TransitionCollectionWithActionHookAndSkippedAfterCallbacksTest < TransitionCollectionWithActionHookBaseTest
5
+ def setup
6
+ super
7
+ @result = StateMachines::TransitionCollection.new([@transition], after: false).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_have_already_persisted_when_running_action
19
+ assert_equal 'idling', @object.state_on_save
20
+ end
21
+
22
+ def test_should_not_have_event_during_action
23
+ assert_nil @object.state_event_on_save
24
+ end
25
+
26
+ def test_should_not_write_event
27
+ assert_nil @object.state_event
28
+ end
29
+
30
+ def test_should_not_have_event_transition_during_save
31
+ assert_nil @object.state_event_transition_on_save
32
+ end
33
+
34
+ def test_should_not_write_event_attribute
35
+ assert_nil @object.send(:state_event_transition)
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionCollectionWithActionHookBaseTest < StateMachinesTest
4
+ def setup
5
+ @superclass = Class.new do
6
+ def save
7
+ true
8
+ end
9
+ end
10
+
11
+ @klass = Class.new(@superclass) do
12
+ attr_reader :saved, :state_on_save, :state_event_on_save, :state_event_transition_on_save
13
+
14
+ def save
15
+ @saved = true
16
+ @state_on_save = state
17
+ @state_event_on_save = state_event
18
+ @state_event_transition_on_save = state_event_transition
19
+ super
20
+ end
21
+ end
22
+
23
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, action: :save)
24
+ @machine.state :idling
25
+ @machine.event :ignite
26
+
27
+ @object = @klass.new
28
+
29
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
30
+ end
31
+
32
+ def default_test
33
+ end
34
+ end