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,115 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithMatchingDisabledTransitionsTest < 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
+ end
21
+
22
+ @machine = StateMachines::Machine.new(@klass, integration: :custom)
23
+ @machine.state :parked, :idling
24
+
25
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
26
+ @event.transition(parked: :idling, if: lambda { false })
27
+
28
+ @object = @klass.new
29
+ @object.state = 'parked'
30
+ end
31
+
32
+ def test_should_not_be_able_to_fire
33
+ refute @event.can_fire?(@object)
34
+ end
35
+
36
+ def test_should_be_able_to_fire_with_disabled_guards
37
+ assert @event.can_fire?(@object, guard: false)
38
+ end
39
+
40
+ def test_should_not_have_a_transition
41
+ assert_nil @event.transition_for(@object)
42
+ end
43
+
44
+ def test_should_have_a_transition_with_disabled_guards
45
+ refute_nil @event.transition_for(@object, guard: false)
46
+ end
47
+
48
+ def test_should_not_fire
49
+ refute @event.fire(@object)
50
+ end
51
+
52
+ def test_should_not_change_the_current_state
53
+ @event.fire(@object)
54
+ assert_equal 'parked', @object.state
55
+ end
56
+
57
+ def test_should_invalidate_the_state
58
+ @event.fire(@object)
59
+ assert_equal ['cannot transition via "ignite"'], @object.errors
60
+ end
61
+
62
+ def test_should_invalidate_with_human_event_name
63
+ @event.human_name = 'start'
64
+ @event.fire(@object)
65
+ assert_equal ['cannot transition via "start"'], @object.errors
66
+ end
67
+
68
+ def test_should_invalid_with_human_state_name_if_specified
69
+ klass = Class.new do
70
+ attr_accessor :errors
71
+ end
72
+
73
+ machine = StateMachines::Machine.new(klass, integration: :custom, messages: { invalid_transition: 'cannot transition via "%s" from "%s"' })
74
+ parked, idling = machine.state :parked, :idling
75
+ parked.human_name = 'stopped'
76
+
77
+ machine.events << event = StateMachines::Event.new(machine, :ignite)
78
+ event.transition(parked: :idling, if: lambda { false })
79
+
80
+ object = @klass.new
81
+ object.state = 'parked'
82
+
83
+ event.fire(object)
84
+ assert_equal ['cannot transition via "ignite" from "stopped"'], object.errors
85
+ end
86
+
87
+ def test_should_reset_existing_error
88
+ @object.errors = ['invalid']
89
+
90
+ @event.fire(@object)
91
+ assert_equal ['cannot transition via "ignite"'], @object.errors
92
+ end
93
+
94
+ def test_should_run_failure_callbacks
95
+ callback_args = nil
96
+ @machine.after_failure { |*args| callback_args = args }
97
+
98
+ @event.fire(@object)
99
+
100
+ object, transition = callback_args
101
+ assert_equal @object, object
102
+ refute_nil transition
103
+ assert_equal @object, transition.object
104
+ assert_equal @machine, transition.machine
105
+ assert_equal :ignite, transition.event
106
+ assert_equal :parked, transition.from_name
107
+ assert_equal :parked, transition.to_name
108
+ end
109
+
110
+ def teardown
111
+ StateMachines::Integrations.reset
112
+ StateMachines::Integrations.send(:remove_const, 'Custom')
113
+ end
114
+ end
115
+
@@ -0,0 +1,75 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithMatchingEnabledTransitionsTest < 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
+ end
21
+
22
+ @machine = StateMachines::Machine.new(@klass, integration: :custom)
23
+ @machine.state :parked, :idling
24
+
25
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
26
+ @event.transition(parked: :idling)
27
+
28
+ @object = @klass.new
29
+ @object.state = 'parked'
30
+ end
31
+
32
+ def test_should_be_able_to_fire
33
+ assert @event.can_fire?(@object)
34
+ end
35
+
36
+ def test_should_have_a_transition
37
+ transition = @event.transition_for(@object)
38
+ refute_nil transition
39
+ assert_equal 'parked', transition.from
40
+ assert_equal 'idling', transition.to
41
+ assert_equal :ignite, transition.event
42
+ end
43
+
44
+ def test_should_fire
45
+ assert @event.fire(@object)
46
+ end
47
+
48
+ def test_should_change_the_current_state
49
+ @event.fire(@object)
50
+ assert_equal 'idling', @object.state
51
+ end
52
+
53
+ def test_should_reset_existing_error
54
+ @object.errors = ['invalid']
55
+
56
+ @event.fire(@object)
57
+ assert_equal [], @object.errors
58
+ end
59
+
60
+ def test_should_not_invalidate_the_state
61
+ @event.fire(@object)
62
+ assert_equal [], @object.errors
63
+ end
64
+
65
+ def test_should_not_be_able_to_fire_on_reset
66
+ @event.reset
67
+ refute @event.can_fire?(@object)
68
+ end
69
+
70
+ def teardown
71
+ StateMachines::Integrations.reset
72
+ StateMachines::Integrations.send(:remove_const, 'Custom')
73
+ end
74
+ end
75
+
@@ -0,0 +1,61 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithMultipleTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked, :idling
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
10
+ @event.transition(idling: :idling)
11
+ @event.transition(parked: :idling)
12
+ @event.transition(parked: :parked)
13
+
14
+ @object = @klass.new
15
+ @object.state = 'parked'
16
+ end
17
+
18
+ def test_should_be_able_to_fire
19
+ assert @event.can_fire?(@object)
20
+ end
21
+
22
+ def test_should_have_a_transition
23
+ transition = @event.transition_for(@object)
24
+ refute_nil transition
25
+ assert_equal 'parked', transition.from
26
+ assert_equal 'idling', transition.to
27
+ assert_equal :ignite, transition.event
28
+ end
29
+
30
+ def test_should_allow_specific_transition_selection_using_from
31
+ transition = @event.transition_for(@object, from: :idling)
32
+
33
+ refute_nil transition
34
+ assert_equal 'idling', transition.from
35
+ assert_equal 'idling', transition.to
36
+ assert_equal :ignite, transition.event
37
+ end
38
+
39
+ def test_should_allow_specific_transition_selection_using_to
40
+ transition = @event.transition_for(@object, from: :parked, to: :parked)
41
+
42
+ refute_nil transition
43
+ assert_equal 'parked', transition.from
44
+ assert_equal 'parked', transition.to
45
+ assert_equal :ignite, transition.event
46
+ end
47
+
48
+ def test_should_not_allow_specific_transition_selection_using_on
49
+ exception = assert_raises(ArgumentError) { @event.transition_for(@object, on: :park) }
50
+ assert_equal 'Unknown key: :on. Valid keys are: :from, :to, :guard', exception.message
51
+ end
52
+
53
+ def test_should_fire
54
+ assert @event.fire(@object)
55
+ end
56
+
57
+ def test_should_change_the_current_state
58
+ @event.fire(@object)
59
+ assert_equal 'idling', @object.state
60
+ end
61
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithNamespaceTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, namespace: 'alarm')
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :enable)
8
+ @object = @klass.new
9
+ end
10
+
11
+ def test_should_have_a_name
12
+ assert_equal :enable, @event.name
13
+ end
14
+
15
+ def test_should_have_a_qualified_name
16
+ assert_equal :enable_alarm, @event.qualified_name
17
+ end
18
+
19
+ def test_should_namespace_predicate
20
+ assert @object.respond_to?(:can_enable_alarm?)
21
+ end
22
+
23
+ def test_should_namespace_transition_accessor
24
+ assert @object.respond_to?(:enable_alarm_transition)
25
+ end
26
+
27
+ def test_should_namespace_action
28
+ assert @object.respond_to?(:enable_alarm)
29
+ end
30
+
31
+ def test_should_namespace_bang_action
32
+ assert @object.respond_to?(:enable_alarm!)
33
+ end
34
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../test_helper'
2
+ class EventWithTransitionWithBlacklistedToStateTest < StateMachinesTest
3
+ def setup
4
+ @klass = Class.new
5
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
6
+ @machine.state :parked, :idling, :first_gear, :second_gear
7
+
8
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
9
+ @event.transition(from: :parked, to: StateMachines::BlacklistMatcher.new([:parked, :idling]))
10
+
11
+ @object = @klass.new
12
+ @object.state = 'parked'
13
+ end
14
+
15
+ def test_should_be_able_to_fire
16
+ assert @event.can_fire?(@object)
17
+ end
18
+
19
+ def test_should_have_a_transition
20
+ transition = @event.transition_for(@object)
21
+ refute_nil transition
22
+ assert_equal 'parked', transition.from
23
+ assert_equal 'first_gear', transition.to
24
+ assert_equal :ignite, transition.event
25
+ end
26
+
27
+ def test_should_allow_loopback_first_when_possible
28
+ @event.transition(from: :second_gear, to: StateMachines::BlacklistMatcher.new([:parked, :idling]))
29
+ @object.state = 'second_gear'
30
+
31
+ transition = @event.transition_for(@object)
32
+ refute_nil transition
33
+ assert_equal 'second_gear', transition.from
34
+ assert_equal 'second_gear', transition.to
35
+ assert_equal :ignite, transition.event
36
+ end
37
+
38
+ def test_should_allow_specific_transition_selection_using_to
39
+ transition = @event.transition_for(@object, from: :parked, to: :second_gear)
40
+
41
+ refute_nil transition
42
+ assert_equal 'parked', transition.from
43
+ assert_equal 'second_gear', transition.to
44
+ assert_equal :ignite, transition.event
45
+ end
46
+
47
+ def test_should_not_allow_transition_selection_if_not_matching
48
+ transition = @event.transition_for(@object, from: :parked, to: :parked)
49
+ assert_nil transition
50
+ end
51
+
52
+ def test_should_fire
53
+ assert @event.fire(@object)
54
+ end
55
+
56
+ def test_should_change_the_current_state
57
+ @event.fire(@object)
58
+ assert_equal 'first_gear', @object.state
59
+ end
60
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithTransitionWithLoopbackStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :park)
10
+ @event.transition(from: :parked, to: StateMachines::LoopbackMatcher.instance)
11
+
12
+ @object = @klass.new
13
+ @object.state = 'parked'
14
+ end
15
+
16
+ def test_should_be_able_to_fire
17
+ assert @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_have_a_transition
21
+ transition = @event.transition_for(@object)
22
+ refute_nil transition
23
+ assert_equal 'parked', transition.from
24
+ assert_equal 'parked', transition.to
25
+ assert_equal :park, transition.event
26
+ end
27
+
28
+ def test_should_fire
29
+ assert @event.fire(@object)
30
+ end
31
+
32
+ def test_should_not_change_the_current_state
33
+ @event.fire(@object)
34
+ assert_equal 'parked', @object.state
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithTransitionWithNilToStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state nil, :idling
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :park)
10
+ @event.transition(idling: nil)
11
+
12
+ @object = @klass.new
13
+ @object.state = 'idling'
14
+ end
15
+
16
+ def test_should_be_able_to_fire
17
+ assert @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_have_a_transition
21
+ transition = @event.transition_for(@object)
22
+ refute_nil transition
23
+ assert_equal 'idling', transition.from
24
+ assert_equal nil, transition.to
25
+ assert_equal :park, transition.event
26
+ end
27
+
28
+ def test_should_fire
29
+ assert @event.fire(@object)
30
+ end
31
+
32
+ def test_should_not_change_the_current_state
33
+ @event.fire(@object)
34
+ assert_equal nil, @object.state
35
+ end
36
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithTransitionWithWhitelistedToStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @machine.state :parked, :idling, :first_gear, :second_gear
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
10
+ @event.transition(from: :parked, to: StateMachines::WhitelistMatcher.new([:first_gear, :second_gear]))
11
+
12
+ @object = @klass.new
13
+ @object.state = 'parked'
14
+ end
15
+
16
+ def test_should_be_able_to_fire
17
+ assert @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_have_a_transition
21
+ transition = @event.transition_for(@object)
22
+ refute_nil transition
23
+ assert_equal 'parked', transition.from
24
+ assert_equal 'first_gear', transition.to
25
+ assert_equal :ignite, transition.event
26
+ end
27
+
28
+ def test_should_allow_specific_transition_selection_using_to
29
+ transition = @event.transition_for(@object, from: :parked, to: :second_gear)
30
+
31
+ refute_nil transition
32
+ assert_equal 'parked', transition.from
33
+ assert_equal 'second_gear', transition.to
34
+ assert_equal :ignite, transition.event
35
+ end
36
+
37
+ def test_should_not_allow_transition_selection_if_not_matching
38
+ transition = @event.transition_for(@object, from: :parked, to: :parked)
39
+ assert_nil transition
40
+ end
41
+
42
+ def test_should_fire
43
+ assert @event.fire(@object)
44
+ end
45
+
46
+ def test_should_change_the_current_state
47
+ @event.fire(@object)
48
+ assert_equal 'first_gear', @object.state
49
+ end
50
+ end
51
+
@@ -0,0 +1,36 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithTransitionWithoutToStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :park)
10
+ @event.transition(from: :parked)
11
+
12
+ @object = @klass.new
13
+ @object.state = 'parked'
14
+ end
15
+
16
+ def test_should_be_able_to_fire
17
+ assert @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_have_a_transition
21
+ transition = @event.transition_for(@object)
22
+ refute_nil transition
23
+ assert_equal 'parked', transition.from
24
+ assert_equal 'parked', transition.to
25
+ assert_equal :park, transition.event
26
+ end
27
+
28
+ def test_should_fire
29
+ assert @event.fire(@object)
30
+ end
31
+
32
+ def test_should_not_change_the_current_state
33
+ @event.fire(@object)
34
+ assert_equal 'parked', @object.state
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
8
+ @event.transition(parked: :idling)
9
+ @event.transition(first_gear: :idling)
10
+ end
11
+
12
+ def test_should_include_all_transition_states_in_known_states
13
+ assert_equal [:parked, :idling, :first_gear], @event.known_states
14
+ end
15
+
16
+ def test_should_include_new_transition_states_after_calling_known_states
17
+ @event.known_states
18
+ @event.transition(stalled: :idling)
19
+
20
+ assert_equal [:parked, :idling, :first_gear, :stalled], @event.known_states
21
+ end
22
+
23
+ def test_should_clear_known_states_on_reset
24
+ @event.reset
25
+ assert_equal [], @event.known_states
26
+ end
27
+
28
+ def test_should_use_pretty_inspect
29
+ assert_match '#<StateMachines::Event name=:ignite transitions=[:parked => :idling, :first_gear => :idling]>', @event.inspect
30
+ end
31
+ end
32
+
@@ -0,0 +1,41 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithoutMatchingTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked, :idling
8
+
9
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
10
+ @event.transition(parked: :idling)
11
+
12
+ @object = @klass.new
13
+ @object.state = 'idling'
14
+ end
15
+
16
+ def test_should_not_be_able_to_fire
17
+ refute @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_be_able_to_fire_with_custom_from_state
21
+ assert @event.can_fire?(@object, from: :parked)
22
+ end
23
+
24
+ def test_should_not_have_a_transition
25
+ assert_nil @event.transition_for(@object)
26
+ end
27
+
28
+ def test_should_have_a_transition_with_custom_from_state
29
+ refute_nil @event.transition_for(@object, from: :parked)
30
+ end
31
+
32
+ def test_should_not_fire
33
+ refute @event.fire(@object)
34
+ end
35
+
36
+ def test_should_not_change_the_current_state
37
+ @event.fire(@object)
38
+ assert_equal 'idling', @object.state
39
+ end
40
+ end
41
+
@@ -0,0 +1,28 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithoutTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
8
+ @object = @klass.new
9
+ end
10
+
11
+ def test_should_not_be_able_to_fire
12
+ refute @event.can_fire?(@object)
13
+ end
14
+
15
+ def test_should_not_have_a_transition
16
+ assert_nil @event.transition_for(@object)
17
+ end
18
+
19
+ def test_should_not_fire
20
+ refute @event.fire(@object)
21
+ end
22
+
23
+ def test_should_not_change_the_current_state
24
+ @event.fire(@object)
25
+ assert_nil @object.state
26
+ end
27
+ end
28
+
@@ -1,19 +1,20 @@
1
- require 'spec_helper'
2
- describe StateMachines::InvalidEvent do
3
- before(:each) do
1
+ require_relative '../../test_helper'
2
+
3
+ class InvalidEventTest < StateMachinesTest
4
+ def setup
4
5
  @object = Object.new
5
6
  @invalid_event = StateMachines::InvalidEvent.new(@object, :invalid)
6
7
  end
7
8
 
8
- it 'should_have_an_object' do
9
+ def test_should_have_an_object
9
10
  assert_equal @object, @invalid_event.object
10
11
  end
11
12
 
12
- it 'should_have_an_event' do
13
+ def test_should_have_an_event
13
14
  assert_equal :invalid, @invalid_event.event
14
15
  end
15
16
 
16
- it 'should_generate_a_message' do
17
+ def test_should_generate_a_message
17
18
  assert_equal ':invalid is an unknown state machine event', @invalid_event.message
18
19
  end
19
- end
20
+ end