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,72 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionFireWithValidationsTest < StateMachinesTest
4
+ def setup
5
+ StateMachines::Integrations.const_set('Custom', Module.new do
6
+ include StateMachines::Integrations::Base
7
+
8
+ def invalidate(object, _attribute, message, values = [])
9
+ (object.errors ||= []) << generate_message(message, values)
10
+ end
11
+
12
+ def reset(object)
13
+ object.errors = []
14
+ end
15
+ end)
16
+ StateMachines::Integrations.register(StateMachines::Integrations::Custom)
17
+
18
+ @klass = Class.new do
19
+ attr_accessor :errors
20
+
21
+ def initialize
22
+ @errors = []
23
+ super
24
+ end
25
+ end
26
+
27
+ @machines = StateMachines::MachineCollection.new
28
+ @machines[:state] = @state = StateMachines::Machine.new(@klass, :state, initial: :parked, integration: :custom)
29
+ @state.event :ignite do
30
+ transition parked: :idling
31
+ end
32
+
33
+ @machines[:alarm_state] = @alarm_state = StateMachines::Machine.new(@klass, :alarm_state, initial: :active, namespace: 'alarm', integration: :custom)
34
+ @alarm_state.event :disable do
35
+ transition active: :off
36
+ end
37
+
38
+ @object = @klass.new
39
+ end
40
+
41
+ def test_should_not_invalidate_if_transitions_exist
42
+ assert @machines.fire_events(@object, :ignite, :disable_alarm)
43
+ assert_equal [], @object.errors
44
+ end
45
+
46
+ def test_should_invalidate_if_no_transitions_exist
47
+ @object.state = 'idling'
48
+ @object.alarm_state = 'off'
49
+
50
+ refute @machines.fire_events(@object, :ignite, :disable_alarm)
51
+ assert_equal ['cannot transition via "ignite"', 'cannot transition via "disable"'], @object.errors
52
+ end
53
+
54
+ def test_should_run_failure_callbacks_if_no_transitions_exist
55
+ @object.state = 'idling'
56
+ @object.alarm_state = 'off'
57
+ @state_failure_run = @alarm_state_failure_run = false
58
+
59
+ @machines[:state].after_failure { @state_failure_run = true }
60
+ @machines[:alarm_state].after_failure { @alarm_state_failure_run = true }
61
+
62
+ refute @machines.fire_events(@object, :ignite, :disable_alarm)
63
+ assert @state_failure_run
64
+ assert @alarm_state_failure_run
65
+ end
66
+
67
+ def teardown
68
+ StateMachines::Integrations.reset
69
+ StateMachines::Integrations.send(:remove_const, 'Custom')
70
+ end
71
+ end
72
+
@@ -0,0 +1,80 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionFireTest < StateMachinesTest
4
+ def setup
5
+ @machines = StateMachines::MachineCollection.new
6
+
7
+ @klass = Class.new do
8
+ attr_reader :saved
9
+
10
+ def save
11
+ @saved = true
12
+ end
13
+ end
14
+
15
+ # First machine
16
+ @machines[:state] = @state = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
17
+ @state.event :ignite do
18
+ transition parked: :idling
19
+ end
20
+ @state.event :park do
21
+ transition idling: :parked
22
+ end
23
+
24
+ # Second machine
25
+ @machines[:alarm_state] = @alarm_state = StateMachines::Machine.new(@klass, :alarm_state, initial: :active, action: :save, namespace: 'alarm')
26
+ @alarm_state.event :enable do
27
+ transition off: :active
28
+ end
29
+ @alarm_state.event :disable do
30
+ transition active: :off
31
+ end
32
+
33
+ @object = @klass.new
34
+ end
35
+
36
+ def test_should_raise_exception_if_invalid_event_specified
37
+ exception = assert_raises(StateMachines::InvalidEvent) { @machines.fire_events(@object, :invalid) }
38
+ assert_equal :invalid, exception.event
39
+
40
+ exception = assert_raises(StateMachines::InvalidEvent) { @machines.fire_events(@object, :ignite, :invalid) }
41
+ assert_equal :invalid, exception.event
42
+ end
43
+
44
+ def test_should_fail_if_any_event_cannot_transition
45
+ refute @machines.fire_events(@object, :park, :disable_alarm)
46
+ assert_equal 'parked', @object.state
47
+ assert_equal 'active', @object.alarm_state
48
+ refute @object.saved
49
+
50
+ refute @machines.fire_events(@object, :ignite, :enable_alarm)
51
+ assert_equal 'parked', @object.state
52
+ assert_equal 'active', @object.alarm_state
53
+ refute @object.saved
54
+ end
55
+
56
+ def test_should_run_failure_callbacks_if_any_event_cannot_transition
57
+ @state_failure_run = @alarm_state_failure_run = false
58
+
59
+ @machines[:state].after_failure { @state_failure_run = true }
60
+ @machines[:alarm_state].after_failure { @alarm_state_failure_run = true }
61
+
62
+ refute @machines.fire_events(@object, :park, :disable_alarm)
63
+ assert @state_failure_run
64
+ refute @alarm_state_failure_run
65
+ end
66
+
67
+ def test_should_be_successful_if_all_events_transition
68
+ assert @machines.fire_events(@object, :ignite, :disable_alarm)
69
+ assert_equal 'idling', @object.state
70
+ assert_equal 'off', @object.alarm_state
71
+ assert @object.saved
72
+ end
73
+
74
+ def test_should_not_save_if_skipping_action
75
+ assert @machines.fire_events(@object, :ignite, :disable_alarm, false)
76
+ assert_equal 'idling', @object.state
77
+ assert_equal 'off', @object.alarm_state
78
+ refute @object.saved
79
+ end
80
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionFireAttributesWithValidationsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_accessor :errors
7
+
8
+ def initialize
9
+ @errors = []
10
+ super
11
+ end
12
+ end
13
+
14
+ @machines = StateMachines::MachineCollection.new
15
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
16
+ @machine.event :ignite do
17
+ transition parked: :idling
18
+ end
19
+
20
+ class << @machine
21
+ def invalidate(object, _attribute, message, values = [])
22
+ (object.errors ||= []) << generate_message(message, values)
23
+ end
24
+
25
+ def reset(object)
26
+ object.errors = []
27
+ end
28
+ end
29
+
30
+ @object = @klass.new
31
+ end
32
+
33
+ def test_should_invalidate_if_event_is_invalid
34
+ @object.state_event = 'invalid'
35
+ @machines.transitions(@object, :save)
36
+
37
+ refute @object.errors.empty?
38
+ end
39
+
40
+ def test_should_invalidate_if_no_transition_exists
41
+ @object.state = 'idling'
42
+ @object.state_event = 'ignite'
43
+ @machines.transitions(@object, :save)
44
+
45
+ refute @object.errors.empty?
46
+ end
47
+
48
+ def test_should_not_invalidate_if_transition_exists
49
+ @object.state_event = 'ignite'
50
+ @machines.transitions(@object, :save)
51
+
52
+ assert @object.errors.empty?
53
+ end
54
+ end
@@ -0,0 +1,76 @@
1
+ require_relative '../../test_helper'
2
+
3
+ module MachineCollectionFireWithValidationsIntegration
4
+ include StateMachines::Integrations::Base
5
+
6
+ def self.integration_name
7
+ :custom_validation
8
+ end
9
+
10
+ def invalidate(object, _attribute, message, values = [])
11
+ (object.errors ||= []) << generate_message(message, values)
12
+ end
13
+
14
+ def reset(object)
15
+ object.errors = []
16
+ end
17
+ end
18
+
19
+ class MachineCollectionFireWithValidationsTest < StateMachinesTest
20
+ def setup
21
+ StateMachines::Integrations.reset
22
+ StateMachines::Integrations.register(MachineCollectionFireWithValidationsIntegration)
23
+
24
+ @klass = Class.new do
25
+ attr_accessor :errors
26
+
27
+ def initialize
28
+ @errors = []
29
+ super
30
+ end
31
+ end
32
+
33
+ @machines = StateMachines::MachineCollection.new
34
+ @machines[:state] = @state = StateMachines::Machine.new(@klass, :state, initial: :parked, integration: :custom_validation)
35
+ @state.event :ignite do
36
+ transition parked: :idling
37
+ end
38
+
39
+ @machines[:alarm_state] = @alarm_state = StateMachines::Machine.new(@klass, :alarm_state, initial: :active, namespace: 'alarm', integration: :custom_validation)
40
+ @alarm_state.event :disable do
41
+ transition active: :off
42
+ end
43
+
44
+ @object = @klass.new
45
+ end
46
+
47
+ def test_should_not_invalidate_if_transitions_exist
48
+ assert @machines.fire_events(@object, :ignite, :disable_alarm)
49
+ assert_equal [], @object.errors
50
+ end
51
+
52
+ def test_should_invalidate_if_no_transitions_exist
53
+ @object.state = 'idling'
54
+ @object.alarm_state = 'off'
55
+
56
+ refute @machines.fire_events(@object, :ignite, :disable_alarm)
57
+ assert_equal ['cannot transition via "ignite"', 'cannot transition via "disable"'], @object.errors
58
+ end
59
+
60
+ def test_should_run_failure_callbacks_if_no_transitions_exist
61
+ @object.state = 'idling'
62
+ @object.alarm_state = 'off'
63
+ @state_failure_run = @alarm_state_failure_run = false
64
+
65
+ @machines[:state].after_failure { @state_failure_run = true }
66
+ @machines[:alarm_state].after_failure { @alarm_state_failure_run = true }
67
+
68
+ refute @machines.fire_events(@object, :ignite, :disable_alarm)
69
+ assert @state_failure_run
70
+ assert @alarm_state_failure_run
71
+ end
72
+
73
+ def teardown
74
+ StateMachines::Integrations.reset
75
+ end
76
+ end
@@ -0,0 +1,101 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionStateInitializationTest < StateMachinesTest
4
+ def setup
5
+ @machines = StateMachines::MachineCollection.new
6
+
7
+ @klass = Class.new
8
+
9
+ @machines[:state] = StateMachines::Machine.new(@klass, :state, initial: :parked)
10
+ @machines[:alarm_state] = StateMachines::Machine.new(@klass, :alarm_state, initial: lambda { |_object| :active })
11
+ @machines[:alarm_state].state :active, value: lambda { 'active' }
12
+
13
+ # Prevent the auto-initialization hook from firing
14
+ @klass.class_eval do
15
+ def initialize
16
+ end
17
+ end
18
+
19
+ @object = @klass.new
20
+ @object.state = nil
21
+ @object.alarm_state = nil
22
+ end
23
+
24
+ def test_should_raise_exception_if_invalid_option_specified
25
+ assert_raises(ArgumentError) { @machines.initialize_states(@object, invalid: true) }
26
+ end
27
+
28
+ def test_should_only_initialize_static_states_prior_to_block
29
+ @machines.initialize_states(@object) do
30
+ @state_in_block = @object.state
31
+ @alarm_state_in_block = @object.alarm_state
32
+ end
33
+
34
+ assert_equal 'parked', @state_in_block
35
+ assert_nil @alarm_state_in_block
36
+ end
37
+
38
+ def test_should_only_initialize_dynamic_states_after_block
39
+ @machines.initialize_states(@object) do
40
+ @alarm_state_in_block = @object.alarm_state
41
+ end
42
+
43
+ assert_nil @alarm_state_in_block
44
+ assert_equal 'active', @object.alarm_state
45
+ end
46
+
47
+ def test_should_initialize_all_states_without_block
48
+ @machines.initialize_states(@object)
49
+
50
+ assert_equal 'parked', @object.state
51
+ assert_equal 'active', @object.alarm_state
52
+ end
53
+
54
+ def test_should_skip_static_states_if_disabled
55
+ @machines.initialize_states(@object, static: false)
56
+ assert_nil @object.state
57
+ assert_equal 'active', @object.alarm_state
58
+ end
59
+
60
+ def test_should_not_initialize_existing_static_states_by_default
61
+ @object.state = 'idling'
62
+ @machines.initialize_states(@object)
63
+ assert_equal 'idling', @object.state
64
+ end
65
+
66
+ def test_should_initialize_existing_static_states_if_forced
67
+ @object.state = 'idling'
68
+ @machines.initialize_states(@object, static: :force)
69
+ assert_equal 'parked', @object.state
70
+ end
71
+
72
+ def test_should_not_initialize_existing_static_states_if_not_forced
73
+ @object.state = 'idling'
74
+ @machines.initialize_states(@object, static: true)
75
+ assert_equal 'idling', @object.state
76
+ end
77
+
78
+ def test_should_skip_dynamic_states_if_disabled
79
+ @machines.initialize_states(@object, dynamic: false)
80
+ assert_equal 'parked', @object.state
81
+ assert_nil @object.alarm_state
82
+ end
83
+
84
+ def test_should_not_initialize_existing_dynamic_states_by_default
85
+ @object.alarm_state = 'inactive'
86
+ @machines.initialize_states(@object)
87
+ assert_equal 'inactive', @object.alarm_state
88
+ end
89
+
90
+ def test_should_initialize_existing_dynamic_states_if_forced
91
+ @object.alarm_state = 'inactive'
92
+ @machines.initialize_states(@object, dynamic: :force)
93
+ assert_equal 'active', @object.alarm_state
94
+ end
95
+
96
+ def test_should_not_initialize_existing_dynamic_states_if_not_forced
97
+ @object.alarm_state = 'inactive'
98
+ @machines.initialize_states(@object, dynamic: true)
99
+ assert_equal 'inactive', @object.alarm_state
100
+ end
101
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithBlankEventsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.state_event = ''
15
+ @transitions = @machines.transitions(@object, :save)
16
+ end
17
+
18
+ def test_should_be_empty
19
+ assert @transitions.empty?
20
+ end
21
+
22
+ def test_should_perform
23
+ assert_equal true, @transitions.perform
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithCustomOptionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @transitions = @machines.transitions(@object, :save, after: false)
15
+ end
16
+
17
+ def test_should_use_custom_options
18
+ assert @transitions.skip_after
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithDifferentActionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @state = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @state.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+ @machines[:status] = @status = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :persist)
13
+ @status.event :shift_up do
14
+ transition first_gear: :second_gear
15
+ end
16
+
17
+ @object = @klass.new
18
+ @object.state_event = 'ignite'
19
+ @object.status_event = 'shift_up'
20
+ @transitions = @machines.transitions(@object, :save)
21
+ end
22
+
23
+ def test_should_only_select_matching_actions
24
+ assert_equal 1, @transitions.length
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithExisitingTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.send(:state_event_transition=, StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling))
15
+ @transitions = @machines.transitions(@object, :save)
16
+ end
17
+
18
+ def test_should_not_be_empty
19
+ assert_equal 1, @transitions.length
20
+ end
21
+
22
+ def test_should_perform
23
+ assert_equal true, @transitions.perform
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithInvalidEventsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.state_event = 'invalid'
15
+ @transitions = @machines.transitions(@object, :save)
16
+ end
17
+
18
+ def test_should_be_empty
19
+ assert @transitions.empty?
20
+ end
21
+
22
+ def test_should_not_perform
23
+ assert_equal false, @transitions.perform
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithSameActionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+ @machines[:status] = @machine = StateMachines::Machine.new(@klass, :status, initial: :first_gear, action: :save)
13
+ @machine.event :shift_up do
14
+ transition first_gear: :second_gear
15
+ end
16
+
17
+ @object = @klass.new
18
+ @object.state_event = 'ignite'
19
+ @object.status_event = 'shift_up'
20
+ @transitions = @machines.transitions(@object, :save)
21
+ end
22
+
23
+ def test_should_not_be_empty
24
+ assert_equal 2, @transitions.length
25
+ end
26
+
27
+ def test_should_perform
28
+ assert_equal true, @transitions.perform
29
+ end
30
+ end
31
+
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithTransitionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.state_event = 'ignite'
15
+ @transitions = @machines.transitions(@object, :save)
16
+ end
17
+
18
+ def test_should_not_be_empty
19
+ assert_equal 1, @transitions.length
20
+ end
21
+
22
+ def test_should_perform
23
+ assert_equal true, @transitions.perform
24
+ end
25
+ end
26
+
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithoutEventsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.state_event = nil
15
+ @transitions = @machines.transitions(@object, :save)
16
+ end
17
+
18
+ def test_should_be_empty
19
+ assert @transitions.empty?
20
+ end
21
+
22
+ def test_should_perform
23
+ assert_equal true, @transitions.perform
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionTransitionsWithoutTransitionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+
7
+ @machines = StateMachines::MachineCollection.new
8
+ @machines[:state] = @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, action: :save)
9
+ @machine.event :ignite do
10
+ transition parked: :idling
11
+ end
12
+
13
+ @object = @klass.new
14
+ @object.state = 'idling'
15
+ @object.state_event = 'ignite'
16
+ @transitions = @machines.transitions(@object, :save)
17
+ end
18
+
19
+ def test_should_be_empty
20
+ assert @transitions.empty?
21
+ end
22
+
23
+ def test_should_not_perform
24
+ assert_equal false, @transitions.perform
25
+ end
26
+ end
27
+
@@ -0,0 +1,29 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class AllMatcherTest < StateMachinesTest
4
+ def setup
5
+ @matcher = StateMachines::AllMatcher.instance
6
+ end
7
+
8
+ def test_should_have_no_values
9
+ assert_equal [], @matcher.values
10
+ end
11
+
12
+ def test_should_always_match
13
+ [nil, :parked, :idling].each { |value| assert @matcher.matches?(value) }
14
+ end
15
+
16
+ def test_should_not_filter_any_values
17
+ assert_equal [:parked, :idling], @matcher.filter([:parked, :idling])
18
+ end
19
+
20
+ def test_should_generate_blacklist_matcher_after_subtraction
21
+ matcher = @matcher - [:parked, :idling]
22
+ assert_instance_of StateMachines::BlacklistMatcher, matcher
23
+ assert_equal [:parked, :idling], matcher.values
24
+ end
25
+
26
+ def test_should_have_a_description
27
+ assert_equal 'all', @matcher.description
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class BlacklistMatcherTest < StateMachinesTest
4
+ def setup
5
+ @matcher = StateMachines::BlacklistMatcher.new([:parked, :idling])
6
+ end
7
+
8
+ def test_should_have_values
9
+ assert_equal [:parked, :idling], @matcher.values
10
+ end
11
+
12
+ def test_should_filter_known_values
13
+ assert_equal [:first_gear], @matcher.filter([:parked, :idling, :first_gear])
14
+ end
15
+
16
+ def test_should_match_unknown_values
17
+ assert @matcher.matches?(:first_gear)
18
+ end
19
+
20
+ def test_should_not_match_known_values
21
+ refute @matcher.matches?(:parked)
22
+ end
23
+
24
+ def test_should_have_a_description
25
+ assert_equal 'all - [:parked, :idling]', @matcher.description
26
+
27
+ matcher = StateMachines::BlacklistMatcher.new([:parked])
28
+ assert_equal 'all - :parked', matcher.description
29
+ end
30
+ end