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,18 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersSymbolTaintedMethodTest < EvalHelpersBaseTest
5
+ def setup
6
+ class << (@object = Object.new)
7
+ def callback
8
+ true
9
+ end
10
+
11
+ taint
12
+ end
13
+ end
14
+
15
+ def test_should_not_raise_security_error
16
+ evaluate_method(@object, :callback, 1, 2, 3)
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersSymbolTest < EvalHelpersBaseTest
5
+ def setup
6
+ class << (@object = Object.new)
7
+ def callback
8
+ true
9
+ end
10
+ end
11
+ end
12
+
13
+ def test_should_call_method_on_object_with_no_arguments
14
+ assert_equal true, evaluate_method(@object, :callback, 1, 2, 3)
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersSymbolWithArgumentsAndBlockTest < EvalHelpersBaseTest
5
+ def setup
6
+ class << (@object = Object.new)
7
+ def callback(*args)
8
+ args << yield
9
+ end
10
+ end
11
+ end
12
+
13
+ def test_should_call_method_on_object_with_all_arguments_and_block
14
+ assert_equal [1, 2, 3, true], evaluate_method(@object, :callback, 1, 2, 3) { true }
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersSymbolWithArgumentsTest < EvalHelpersBaseTest
5
+ def setup
6
+ class << (@object = Object.new)
7
+ def callback(*args)
8
+ args
9
+ end
10
+ end
11
+ end
12
+
13
+ def test_should_call_method_with_all_arguments
14
+ assert_equal [1, 2, 3], evaluate_method(@object, :callback, 1, 2, 3)
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersSymbolWithBlockTest < EvalHelpersBaseTest
5
+ def setup
6
+ class << (@object = Object.new)
7
+ def callback
8
+ yield
9
+ end
10
+ end
11
+ end
12
+
13
+ def test_should_call_method_on_object_with_block
14
+ assert_equal true, evaluate_method(@object, :callback) { true }
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../unit/eval_helper/eval_helpers_base_test'
3
+
4
+ class EvalHelpersTest < EvalHelpersBaseTest
5
+ def setup
6
+ @object = Object.new
7
+ end
8
+
9
+ def test_should_raise_exception_if_method_is_not_symbol_string_or_proc
10
+ exception = assert_raises(ArgumentError) { evaluate_method(@object, 1) }
11
+ assert_match(/Methods must/, exception.message)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventAfterBeingCopiedTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new)
6
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
7
+ @copied_event = @event.dup
8
+ end
9
+
10
+ def test_should_not_have_the_same_collection_of_branches
11
+ refute_same @event.branches, @copied_event.branches
12
+ end
13
+
14
+ def test_should_not_have_the_same_collection_of_known_states
15
+ refute_same @event.known_states, @copied_event.known_states
16
+ end
17
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../test_helper'
2
+
3
+
4
+ class EventByDefaultTest < StateMachinesTest
5
+ def setup
6
+ @klass = Class.new
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
9
+
10
+ @object = @klass.new
11
+ end
12
+
13
+ def test_should_have_a_machine
14
+ assert_equal @machine, @event.machine
15
+ end
16
+
17
+ def test_should_have_a_name
18
+ assert_equal :ignite, @event.name
19
+ end
20
+
21
+ def test_should_have_a_qualified_name
22
+ assert_equal :ignite, @event.qualified_name
23
+ end
24
+
25
+ def test_should_have_a_human_name
26
+ assert_equal 'ignite', @event.human_name
27
+ end
28
+
29
+ def test_should_not_have_any_branches
30
+ assert @event.branches.empty?
31
+ end
32
+
33
+ def test_should_have_no_known_states
34
+ assert @event.known_states.empty?
35
+ end
36
+
37
+ def test_should_not_be_able_to_fire
38
+ refute @event.can_fire?(@object)
39
+ end
40
+
41
+ def test_should_not_have_a_transition
42
+ assert_nil @event.transition_for(@object)
43
+ end
44
+
45
+ def test_should_define_a_predicate
46
+ assert @object.respond_to?(:can_ignite?)
47
+ end
48
+
49
+ def test_should_define_a_transition_accessor
50
+ assert @object.respond_to?(:ignite_transition)
51
+ end
52
+
53
+ def test_should_define_an_action
54
+ assert @object.respond_to?(:ignite)
55
+ end
56
+
57
+ def test_should_define_a_bang_action
58
+ assert @object.respond_to?(:ignite!)
59
+ end
60
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventContextTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite, human_name: 'start')
8
+ end
9
+
10
+ def test_should_evaluate_within_the_event
11
+ scope = nil
12
+ @event.context { scope = self }
13
+ assert_equal @event, scope
14
+ end
15
+ end
16
+
@@ -0,0 +1,44 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../files/integrations/event_on_failure_integration'
3
+
4
+ class EventOnFailureTest < StateMachinesTest
5
+ def setup
6
+ StateMachines::Integrations.reset
7
+ StateMachines::Integrations.register(EventOnFailureIntegration)
8
+ @klass = Class.new do
9
+ attr_accessor :errors
10
+ end
11
+
12
+ @machine = StateMachines::Machine.new(@klass, integration: :event_on_failure_integration)
13
+ @machine.state :parked
14
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
15
+
16
+ @object = @klass.new
17
+ @object.state = 'parked'
18
+ end
19
+
20
+ def test_should_invalidate_the_state
21
+ @event.fire(@object)
22
+ assert_equal ['cannot transition via "ignite"'], @object.errors
23
+ end
24
+
25
+ def test_should_run_failure_callbacks
26
+ callback_args = nil
27
+ @machine.after_failure { |*args| callback_args = args }
28
+
29
+ @event.fire(@object)
30
+
31
+ object, transition = callback_args
32
+ assert_equal @object, object
33
+ refute_nil transition
34
+ assert_equal @object, transition.object
35
+ assert_equal @machine, transition.machine
36
+ assert_equal :ignite, transition.event
37
+ assert_equal :parked, transition.from_name
38
+ assert_equal :parked, transition.to_name
39
+ end
40
+
41
+ def teardown
42
+ StateMachines::Integrations.reset
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new)
6
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
7
+ @event.transition parked: :idling
8
+ end
9
+
10
+ def test_should_allow_changing_machine
11
+ new_machine = StateMachines::Machine.new(Class.new)
12
+ @event.machine = new_machine
13
+ assert_equal new_machine, @event.machine
14
+ end
15
+
16
+ def test_should_allow_changing_human_name
17
+ @event.human_name = 'Stop'
18
+ assert_equal 'Stop', @event.human_name
19
+ end
20
+
21
+ def test_should_provide_matcher_helpers_during_initialization
22
+ matchers = []
23
+
24
+ @event.instance_eval do
25
+ matchers = [all, any, same]
26
+ end
27
+
28
+ assert_equal [StateMachines::AllMatcher.instance, StateMachines::AllMatcher.instance, StateMachines::LoopbackMatcher.instance], matchers
29
+ end
30
+
31
+ def test_should_use_pretty_inspect
32
+ assert_match '#<StateMachines::Event name=:ignite transitions=[:parked => :idling]>', @event.inspect
33
+ end
34
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new)
6
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
7
+ end
8
+
9
+ def test_should_not_raise_exception_if_implicit_option_specified
10
+ @event.transition(invalid: :valid)
11
+ end
12
+
13
+ def test_should_not_allow_on_option
14
+ exception = assert_raises(ArgumentError) { @event.transition(on: :ignite) }
15
+ assert_equal 'Unknown key: :on. Valid keys are: :from, :to, :except_from, :except_to, :if, :unless', exception.message
16
+ end
17
+
18
+ def test_should_automatically_set_on_option
19
+ branch = @event.transition(to: :idling)
20
+ assert_instance_of StateMachines::WhitelistMatcher, branch.event_requirement
21
+ assert_equal [:ignite], branch.event_requirement.values
22
+ end
23
+
24
+ def test_should_not_allow_except_on_option
25
+ exception = assert_raises(ArgumentError) { @event.transition(except_on: :ignite) }
26
+ assert_equal 'Unknown key: :except_on. Valid keys are: :from, :to, :except_from, :except_to, :if, :unless', exception.message
27
+ end
28
+
29
+ def test_should_allow_transitioning_without_a_to_state
30
+ @event.transition(from: :parked)
31
+ end
32
+
33
+ def test_should_allow_transitioning_without_a_from_state
34
+ @event.transition(to: :idling)
35
+ end
36
+
37
+ def test_should_allow_except_from_option
38
+ @event.transition(except_from: :idling)
39
+ end
40
+
41
+ def test_should_allow_except_to_option
42
+ @event.transition(except_to: :idling)
43
+ end
44
+
45
+ def test_should_allow_transitioning_from_a_single_state
46
+ assert @event.transition(parked: :idling)
47
+ end
48
+
49
+ def test_should_allow_transitioning_from_multiple_states
50
+ assert @event.transition([:parked, :idling] => :idling)
51
+ end
52
+
53
+ def test_should_allow_transitions_to_multiple_states
54
+ assert @event.transition(parked: [:parked, :idling])
55
+ end
56
+
57
+ def test_should_have_transitions
58
+ branch = @event.transition(to: :idling)
59
+ assert_equal [branch], @event.branches
60
+ end
61
+ end
62
+
@@ -0,0 +1,79 @@
1
+ require_relative '../../test_helper'
2
+ require 'stringio'
3
+
4
+ class EventWithConflictingHelpersAfterDefinitionTest < StateMachinesTest
5
+ def setup
6
+ @original_stderr, $stderr = $stderr, StringIO.new
7
+
8
+ @klass = Class.new do
9
+ def can_ignite?
10
+ 0
11
+ end
12
+
13
+ def ignite_transition
14
+ 0
15
+ end
16
+
17
+ def ignite
18
+ 0
19
+ end
20
+
21
+ def ignite!
22
+ 0
23
+ end
24
+ end
25
+ @machine = StateMachines::Machine.new(@klass)
26
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
27
+ @object = @klass.new
28
+ end
29
+
30
+ def test_should_not_redefine_predicate
31
+ assert_equal 0, @object.can_ignite?
32
+ end
33
+
34
+ def test_should_not_redefine_transition_accessor
35
+ assert_equal 0, @object.ignite_transition
36
+ end
37
+
38
+ def test_should_not_redefine_action
39
+ assert_equal 0, @object.ignite
40
+ end
41
+
42
+ def test_should_not_redefine_bang_action
43
+ assert_equal 0, @object.ignite!
44
+ end
45
+
46
+ def test_should_allow_super_chaining
47
+ @klass.class_eval do
48
+ def can_ignite?
49
+ super
50
+ end
51
+
52
+ def ignite_transition
53
+ super
54
+ end
55
+
56
+ def ignite
57
+ super
58
+ end
59
+
60
+ def ignite!
61
+ super
62
+ end
63
+ end
64
+
65
+ assert_equal false, @object.can_ignite?
66
+ assert_equal nil, @object.ignite_transition
67
+ assert_equal false, @object.ignite
68
+ assert_raises(StateMachines::InvalidTransition) { @object.ignite! }
69
+ end
70
+
71
+ def test_should_not_output_warning
72
+ assert_equal '', $stderr.string
73
+ end
74
+
75
+ def teardown
76
+ $stderr = @original_stderr
77
+ end
78
+ end
79
+
@@ -0,0 +1,58 @@
1
+ require_relative '../../test_helper'
2
+ require 'stringio'
3
+
4
+ class EventWithConflictingHelpersBeforeDefinitionTest < StateMachinesTest
5
+ def setup
6
+ @original_stderr, $stderr = $stderr, StringIO.new
7
+
8
+ @superclass = Class.new do
9
+ def can_ignite?
10
+ 0
11
+ end
12
+
13
+ def ignite_transition
14
+ 0
15
+ end
16
+
17
+ def ignite
18
+ 0
19
+ end
20
+
21
+ def ignite!
22
+ 0
23
+ end
24
+ end
25
+ @klass = Class.new(@superclass)
26
+ @machine = StateMachines::Machine.new(@klass)
27
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
28
+ @object = @klass.new
29
+ end
30
+
31
+ def test_should_not_redefine_predicate
32
+ assert_equal 0, @object.can_ignite?
33
+ end
34
+
35
+ def test_should_not_redefine_transition_accessor
36
+ assert_equal 0, @object.ignite_transition
37
+ end
38
+
39
+ def test_should_not_redefine_action
40
+ assert_equal 0, @object.ignite
41
+ end
42
+
43
+ def test_should_not_redefine_bang_action
44
+ assert_equal 0, @object.ignite!
45
+ end
46
+
47
+ def test_should_output_warning
48
+ expected = %w(can_ignite? ignite_transition ignite ignite!).map do |method|
49
+ "Instance method \"#{method}\" is already defined in #{@superclass}, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n"
50
+ end.join
51
+
52
+ assert_equal expected, $stderr.string
53
+ end
54
+
55
+ def teardown
56
+ $stderr = @original_stderr
57
+ end
58
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../../test_helper'
2
+ require 'stringio'
3
+
4
+ class EventWithConflictingMachineTest < StateMachinesTest
5
+ def setup
6
+ @original_stderr, $stderr = $stderr, StringIO.new
7
+
8
+ @klass = Class.new
9
+ @state_machine = StateMachines::Machine.new(@klass, :state)
10
+ @state_machine.state :parked, :idling
11
+ @state_machine.events << @state_event = StateMachines::Event.new(@state_machine, :ignite)
12
+ end
13
+
14
+ def test_should_not_overwrite_first_event
15
+ @status_machine = StateMachines::Machine.new(@klass, :status)
16
+ @status_machine.state :first_gear, :second_gear
17
+ @status_machine.events << @status_event = StateMachines::Event.new(@status_machine, :ignite)
18
+
19
+ @object = @klass.new
20
+ @object.state = 'parked'
21
+ @object.status = 'first_gear'
22
+
23
+ @state_event.transition(parked: :idling)
24
+ @status_event.transition(parked: :first_gear)
25
+
26
+ @object.ignite
27
+ assert_equal 'idling', @object.state
28
+ assert_equal 'first_gear', @object.status
29
+ end
30
+
31
+ def test_should_output_warning
32
+ @status_machine = StateMachines::Machine.new(@klass, :status)
33
+ @status_machine.events << @status_event = StateMachines::Event.new(@status_machine, :ignite)
34
+
35
+ assert_equal "Event :ignite for :status is already defined in :state\n", $stderr.string
36
+ end
37
+
38
+ def test_should_not_output_warning_if_using_different_namespace
39
+ @status_machine = StateMachines::Machine.new(@klass, :status, namespace: 'alarm')
40
+ @status_machine.events << @status_event = StateMachines::Event.new(@status_machine, :ignite)
41
+
42
+ assert_equal '', $stderr.string
43
+ end
44
+
45
+ def teardown
46
+ $stderr = @original_stderr
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithDynamicHumanNameTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite, human_name: lambda { |_event, object| ['start', object] })
8
+ end
9
+
10
+ def test_should_use_custom_human_name
11
+ human_name, klass = @event.human_name
12
+ assert_equal 'start', human_name
13
+ assert_equal @klass, klass
14
+ end
15
+
16
+ def test_should_allow_custom_class_to_be_passed_through
17
+ human_name, klass = @event.human_name(1)
18
+ assert_equal 'start', human_name
19
+ assert_equal 1, klass
20
+ end
21
+
22
+ def test_should_not_cache_value
23
+ refute_same @event.human_name, @event.human_name
24
+ end
25
+ end
26
+
@@ -0,0 +1,13 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithHumanNameTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite, human_name: 'start')
8
+ end
9
+
10
+ def test_should_use_custom_human_name
11
+ assert_equal 'start', @event.human_name
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithInvalidCurrentStateTest < 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 = 'invalid'
14
+ end
15
+
16
+ def test_should_raise_exception_when_checking_availability
17
+ exception = assert_raises(ArgumentError) { @event.can_fire?(@object) }
18
+ assert_equal '"invalid" is not a known state value', exception.message
19
+ end
20
+
21
+ def test_should_raise_exception_when_finding_transition
22
+ exception = assert_raises(ArgumentError) { @event.transition_for(@object) }
23
+ assert_equal '"invalid" is not a known state value', exception.message
24
+ end
25
+
26
+ def test_should_raise_exception_when_firing
27
+ exception = assert_raises(ArgumentError) { @event.fire(@object) }
28
+ assert_equal '"invalid" is not a known state value', exception.message
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithMachineActionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :saved
7
+
8
+ def save
9
+ @saved = true
10
+ end
11
+ end
12
+
13
+ @machine = StateMachines::Machine.new(@klass, action: :save)
14
+ @machine.state :parked, :idling
15
+
16
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
17
+ @event.transition(parked: :idling)
18
+
19
+ @object = @klass.new
20
+ @object.state = 'parked'
21
+ end
22
+
23
+ def test_should_run_action_on_fire
24
+ @event.fire(@object)
25
+ assert @object.saved
26
+ end
27
+
28
+ def test_should_not_run_action_if_configured_to_skip
29
+ @event.fire(@object, false)
30
+ refute @object.saved
31
+ end
32
+ end
33
+
@@ -0,0 +1,47 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class EventWithMarshallingTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def save
7
+ true
8
+ end
9
+ end
10
+ self.class.const_set('Example', @klass)
11
+
12
+ @machine = StateMachines::Machine.new(@klass, action: :save)
13
+ @machine.state :parked, :idling
14
+
15
+ @machine.events << @event = StateMachines::Event.new(@machine, :ignite)
16
+ @event.transition(parked: :idling)
17
+
18
+ @object = @klass.new
19
+ @object.state = 'parked'
20
+ end
21
+
22
+ def test_should_marshal_during_before_callbacks
23
+ @machine.before_transition { |object, _transition| Marshal.dump(object) }
24
+ @event.fire(@object)
25
+ end
26
+
27
+ def test_should_marshal_during_action
28
+ @klass.class_eval do
29
+ remove_method :save
30
+
31
+ def save
32
+ Marshal.dump(self)
33
+ end
34
+ end
35
+
36
+ @event.fire(@object)
37
+ end
38
+
39
+ def test_should_marshal_during_after_callbacks
40
+ @machine.after_transition { |object, _transition| Marshal.dump(object) }
41
+ @event.fire(@object)
42
+ end
43
+
44
+ def teardown
45
+ self.class.send(:remove_const, 'Example')
46
+ end
47
+ end