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,43 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithActionDefinedInSuperclassTest < StateMachinesTest
4
+ def setup
5
+ @superclass = Class.new do
6
+ def save
7
+ end
8
+ end
9
+ @klass = Class.new(@superclass)
10
+
11
+ @machine = StateMachines::Machine.new(@klass, action: :save)
12
+ @object = @klass.new
13
+ end
14
+
15
+ def test_should_define_an_event_attribute_reader
16
+ assert @object.respond_to?(:state_event)
17
+ end
18
+
19
+ def test_should_define_an_event_attribute_writer
20
+ assert @object.respond_to?(:state_event=)
21
+ end
22
+
23
+ def test_should_define_an_event_transition_attribute_reader
24
+ assert @object.respond_to?(:state_event_transition, true)
25
+ end
26
+
27
+ def test_should_define_an_event_transition_attribute_writer
28
+ assert @object.respond_to?(:state_event_transition=, true)
29
+ end
30
+
31
+ def test_should_define_action
32
+ assert @klass.ancestors.any? { |ancestor| ![@klass, @superclass].include?(ancestor) && ancestor.method_defined?(:save) }
33
+ end
34
+
35
+ def test_should_keep_action_public
36
+ assert @klass.public_method_defined?(:save)
37
+ end
38
+
39
+ def test_should_mark_action_hook_as_defined
40
+ assert @machine.action_hook?
41
+ end
42
+ end
43
+
@@ -0,0 +1,33 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithActionUndefinedTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, action: :save)
7
+ @object = @klass.new
8
+ end
9
+
10
+ def test_should_define_an_event_attribute_reader
11
+ assert @object.respond_to?(:state_event)
12
+ end
13
+
14
+ def test_should_define_an_event_attribute_writer
15
+ assert @object.respond_to?(:state_event=)
16
+ end
17
+
18
+ def test_should_define_an_event_transition_attribute_reader
19
+ assert @object.respond_to?(:state_event_transition, true)
20
+ end
21
+
22
+ def test_should_define_an_event_transition_attribute_writer
23
+ assert @object.respond_to?(:state_event_transition=, true)
24
+ end
25
+
26
+ def test_should_not_define_action
27
+ refute @object.respond_to?(:save)
28
+ end
29
+
30
+ def test_should_not_mark_action_hook_as_defined
31
+ refute @machine.action_hook?
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithCachedStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @state = @machine.state :parked, value: -> { Object.new }, cache: true
8
+
9
+ @object = @klass.new
10
+ end
11
+
12
+ def test_should_use_evaluated_value
13
+ assert_instance_of Object, @object.state
14
+ end
15
+
16
+ def test_use_same_value_across_multiple_objects
17
+ assert_equal @object.state, @klass.new.state
18
+ end
19
+ end
20
+
@@ -0,0 +1,179 @@
1
+ require_relative '../../test_helper'
2
+ require 'stringio'
3
+
4
+ class MachineWithClassHelpersTest < StateMachinesTest
5
+ def setup
6
+ @klass = Class.new
7
+ @machine = StateMachines::Machine.new(@klass)
8
+ end
9
+
10
+ def test_should_not_redefine_existing_public_methods
11
+ class << @klass
12
+ def states
13
+ []
14
+ end
15
+ end
16
+
17
+ @machine.define_helper(:class, :states) {}
18
+ assert_equal [], @klass.states
19
+ end
20
+
21
+ def test_should_not_redefine_existing_protected_methods
22
+ class << @klass
23
+ protected
24
+ def states
25
+ []
26
+ end
27
+ end
28
+
29
+ @machine.define_helper(:class, :states) {}
30
+ assert_equal [], @klass.send(:states)
31
+ end
32
+
33
+ def test_should_not_redefine_existing_private_methods
34
+ class << @klass
35
+ private
36
+ def states
37
+ []
38
+ end
39
+ end
40
+
41
+ @machine.define_helper(:class, :states) {}
42
+ assert_equal [], @klass.send(:states)
43
+ end
44
+
45
+ def test_should_warn_if_defined_in_superclass
46
+ @original_stderr, $stderr = $stderr, StringIO.new
47
+
48
+ superclass = Class.new do
49
+ def self.park
50
+ end
51
+ end
52
+ klass = Class.new(superclass)
53
+ machine = StateMachines::Machine.new(klass)
54
+
55
+ machine.define_helper(:class, :park) {}
56
+ assert_equal "Class method \"park\" is already defined in #{superclass}, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n", $stderr.string
57
+ ensure
58
+ $stderr = @original_stderr
59
+ end
60
+
61
+ def test_should_warn_if_defined_in_multiple_superclasses
62
+ @original_stderr, $stderr = $stderr, StringIO.new
63
+
64
+ superclass1 = Class.new do
65
+ def self.park
66
+ end
67
+ end
68
+ superclass2 = Class.new(superclass1) do
69
+ def self.park
70
+ end
71
+ end
72
+ klass = Class.new(superclass2)
73
+ machine = StateMachines::Machine.new(klass)
74
+
75
+ machine.define_helper(:class, :park) {}
76
+ assert_equal "Class method \"park\" is already defined in #{superclass1}, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n", $stderr.string
77
+ ensure
78
+ $stderr = @original_stderr
79
+ end
80
+
81
+ def test_should_warn_if_defined_in_module_prior_to_helper_module
82
+ @original_stderr, $stderr = $stderr, StringIO.new
83
+
84
+ mod = Module.new do
85
+ def park
86
+ end
87
+ end
88
+ klass = Class.new do
89
+ extend mod
90
+ end
91
+ machine = StateMachines::Machine.new(klass)
92
+
93
+ machine.define_helper(:class, :park) {}
94
+ assert_equal "Class method \"park\" is already defined in #{mod}, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n", $stderr.string
95
+ ensure
96
+ $stderr = @original_stderr
97
+ end
98
+
99
+ def test_should_not_warn_if_defined_in_module_after_helper_module
100
+ @original_stderr, $stderr = $stderr, StringIO.new
101
+
102
+ klass = Class.new
103
+ machine = StateMachines::Machine.new(klass)
104
+
105
+ mod = Module.new do
106
+ def park
107
+ end
108
+ end
109
+ klass.class_eval do
110
+ extend mod
111
+ end
112
+
113
+ machine.define_helper(:class, :park) {}
114
+ assert_equal '', $stderr.string
115
+ ensure
116
+ $stderr = @original_stderr
117
+ end
118
+
119
+ def test_should_define_if_ignoring_method_conflicts_and_defined_in_superclass
120
+ @original_stderr, $stderr = $stderr, StringIO.new
121
+ StateMachines::Machine.ignore_method_conflicts = true
122
+
123
+ superclass = Class.new do
124
+ def self.park
125
+ end
126
+ end
127
+ klass = Class.new(superclass)
128
+ machine = StateMachines::Machine.new(klass)
129
+
130
+ machine.define_helper(:class, :park) { true }
131
+ assert_equal '', $stderr.string
132
+ assert_equal true, klass.park
133
+ ensure
134
+ StateMachines::Machine.ignore_method_conflicts = false
135
+ $stderr = @original_stderr
136
+ end
137
+
138
+ def test_should_define_nonexistent_methods
139
+ @machine.define_helper(:class, :states) { [] }
140
+ assert_equal [], @klass.states
141
+ end
142
+
143
+ def test_should_warn_if_defined_multiple_times
144
+ @original_stderr, $stderr = $stderr, StringIO.new
145
+
146
+ @machine.define_helper(:class, :states) {}
147
+ @machine.define_helper(:class, :states) {}
148
+
149
+ assert_equal "Class method \"states\" is already defined in #{@klass} :state class helpers, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n", $stderr.string
150
+ ensure
151
+ $stderr = @original_stderr
152
+ end
153
+
154
+ def test_should_pass_context_as_arguments
155
+ helper_args = nil
156
+ @machine.define_helper(:class, :states) { |*args| helper_args = args }
157
+ @klass.states
158
+ assert_equal 2, helper_args.length
159
+ assert_equal [@machine, @klass], helper_args
160
+ end
161
+
162
+ def test_should_pass_method_arguments_through
163
+ helper_args = nil
164
+ @machine.define_helper(:class, :states) { |*args| helper_args = args }
165
+ @klass.states(1, 2, 3)
166
+ assert_equal 5, helper_args.length
167
+ assert_equal [@machine, @klass, 1, 2, 3], helper_args
168
+ end
169
+
170
+ def test_should_allow_string_evaluation
171
+ @machine.define_helper :class, <<-end_eval, __FILE__, __LINE__ + 1
172
+ def states
173
+ []
174
+ end
175
+ end_eval
176
+ assert_equal [], @klass.states
177
+ end
178
+ end
179
+
@@ -0,0 +1,243 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithConflictingHelpersAfterDefinitionTest < StateMachinesTest
4
+ def setup
5
+ @original_stderr, $stderr = $stderr, StringIO.new
6
+
7
+ @klass = Class.new do
8
+ def self.with_state
9
+ :with_state
10
+ end
11
+
12
+ def self.with_states
13
+ :with_states
14
+ end
15
+
16
+ def self.without_state
17
+ :without_state
18
+ end
19
+
20
+ def self.without_states
21
+ :without_states
22
+ end
23
+
24
+ def self.human_state_name
25
+ :human_state_name
26
+ end
27
+
28
+ def self.human_state_event_name
29
+ :human_state_event_name
30
+ end
31
+
32
+ attr_accessor :status
33
+
34
+ def state
35
+ 'parked'
36
+ end
37
+
38
+ def state=(value)
39
+ self.status = value
40
+ end
41
+
42
+ def state?
43
+ true
44
+ end
45
+
46
+ def state_name
47
+ :parked
48
+ end
49
+
50
+ def human_state_name
51
+ 'parked'
52
+ end
53
+
54
+ def state_events
55
+ [:ignite]
56
+ end
57
+
58
+ def state_transitions
59
+ [{ parked: :idling }]
60
+ end
61
+
62
+ def state_paths
63
+ [[{ parked: :idling }]]
64
+ end
65
+
66
+ def fire_state_event
67
+ true
68
+ end
69
+ end
70
+
71
+ StateMachines::Integrations.const_set('Custom', Module.new do
72
+ include StateMachines::Integrations::Base
73
+
74
+ def create_with_scope(_name)
75
+ lambda { |_klass, _values| [] }
76
+ end
77
+
78
+ def create_without_scope(_name)
79
+ lambda { |_klass, _values| [] }
80
+ end
81
+ end)
82
+
83
+ @machine = StateMachines::Machine.new(@klass, integration: :custom)
84
+ @machine.state :parked, :idling
85
+ @machine.event :ignite
86
+ @object = @klass.new
87
+ end
88
+
89
+ def test_should_not_redefine_singular_with_scope
90
+ assert_equal :with_state, @klass.with_state
91
+ end
92
+
93
+ def test_should_not_redefine_plural_with_scope
94
+ assert_equal :with_states, @klass.with_states
95
+ end
96
+
97
+ def test_should_not_redefine_singular_without_scope
98
+ assert_equal :without_state, @klass.without_state
99
+ end
100
+
101
+ def test_should_not_redefine_plural_without_scope
102
+ assert_equal :without_states, @klass.without_states
103
+ end
104
+
105
+ def test_should_not_redefine_human_attribute_name_reader
106
+ assert_equal :human_state_name, @klass.human_state_name
107
+ end
108
+
109
+ def test_should_not_redefine_human_event_name_reader
110
+ assert_equal :human_state_event_name, @klass.human_state_event_name
111
+ end
112
+
113
+ def test_should_not_redefine_attribute_reader
114
+ assert_equal 'parked', @object.state
115
+ end
116
+
117
+ def test_should_not_redefine_attribute_writer
118
+ @object.state = 'parked'
119
+ assert_equal 'parked', @object.status
120
+ end
121
+
122
+ def test_should_not_define_attribute_predicate
123
+ assert @object.state?
124
+ end
125
+
126
+ def test_should_not_redefine_attribute_name_reader
127
+ assert_equal :parked, @object.state_name
128
+ end
129
+
130
+ def test_should_not_redefine_attribute_human_name_reader
131
+ assert_equal 'parked', @object.human_state_name
132
+ end
133
+
134
+ def test_should_not_redefine_attribute_events_reader
135
+ assert_equal [:ignite], @object.state_events
136
+ end
137
+
138
+ def test_should_not_redefine_attribute_transitions_reader
139
+ assert_equal [{ parked: :idling }], @object.state_transitions
140
+ end
141
+
142
+ def test_should_not_redefine_attribute_paths_reader
143
+ assert_equal [[{ parked: :idling }]], @object.state_paths
144
+ end
145
+
146
+ def test_should_not_redefine_event_runner
147
+ assert_equal true, @object.fire_state_event
148
+ end
149
+
150
+ def test_should_allow_super_chaining
151
+ @klass.class_eval do
152
+ def self.with_state(*states)
153
+ super
154
+ end
155
+
156
+ def self.with_states(*states)
157
+ super
158
+ end
159
+
160
+ def self.without_state(*states)
161
+ super
162
+ end
163
+
164
+ def self.without_states(*states)
165
+ super
166
+ end
167
+
168
+ def self.human_state_name(state)
169
+ super
170
+ end
171
+
172
+ def self.human_state_event_name(event)
173
+ super
174
+ end
175
+
176
+ attr_accessor :status
177
+
178
+ def state
179
+ super
180
+ end
181
+
182
+ def state=(value)
183
+ super
184
+ end
185
+
186
+ def state?(state)
187
+ super
188
+ end
189
+
190
+ def state_name
191
+ super
192
+ end
193
+
194
+ def human_state_name
195
+ super
196
+ end
197
+
198
+ def state_events
199
+ super
200
+ end
201
+
202
+ def state_transitions
203
+ super
204
+ end
205
+
206
+ def state_paths
207
+ super
208
+ end
209
+
210
+ def fire_state_event(event)
211
+ super
212
+ end
213
+ end
214
+
215
+ assert_equal [], @klass.with_state
216
+ assert_equal [], @klass.with_states
217
+ assert_equal [], @klass.without_state
218
+ assert_equal [], @klass.without_states
219
+ assert_equal 'parked', @klass.human_state_name(:parked)
220
+ assert_equal 'ignite', @klass.human_state_event_name(:ignite)
221
+
222
+ assert_equal nil, @object.state
223
+ @object.state = 'idling'
224
+ assert_equal 'idling', @object.state
225
+ assert_equal nil, @object.status
226
+ assert_equal false, @object.state?(:parked)
227
+ assert_equal :idling, @object.state_name
228
+ assert_equal 'idling', @object.human_state_name
229
+ assert_equal [], @object.state_events
230
+ assert_equal [], @object.state_transitions
231
+ assert_equal [], @object.state_paths
232
+ assert_equal false, @object.fire_state_event(:ignite)
233
+ end
234
+
235
+ def test_should_not_output_warning
236
+ assert_equal '', $stderr.string
237
+ end
238
+
239
+ def teardown
240
+ $stderr = @original_stderr
241
+ StateMachines::Integrations.send(:remove_const, 'Custom')
242
+ end
243
+ end
@@ -0,0 +1,175 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithConflictingHelpersBeforeDefinitionTest < StateMachinesTest
4
+ def setup
5
+ @original_stderr, $stderr = $stderr, StringIO.new
6
+
7
+ @superclass = Class.new do
8
+ def self.with_state
9
+ :with_state
10
+ end
11
+
12
+ def self.with_states
13
+ :with_states
14
+ end
15
+
16
+ def self.without_state
17
+ :without_state
18
+ end
19
+
20
+ def self.without_states
21
+ :without_states
22
+ end
23
+
24
+ def self.human_state_name
25
+ :human_state_name
26
+ end
27
+
28
+ def self.human_state_event_name
29
+ :human_state_event_name
30
+ end
31
+
32
+ attr_accessor :status
33
+
34
+ def state
35
+ 'parked'
36
+ end
37
+
38
+ def state=(value)
39
+ self.status = value
40
+ end
41
+
42
+ def state?
43
+ true
44
+ end
45
+
46
+ def state_name
47
+ :parked
48
+ end
49
+
50
+ def human_state_name
51
+ 'parked'
52
+ end
53
+
54
+ def state_events
55
+ [:ignite]
56
+ end
57
+
58
+ def state_transitions
59
+ [{ parked: :idling }]
60
+ end
61
+
62
+ def state_paths
63
+ [[{ parked: :idling }]]
64
+ end
65
+
66
+ def fire_state_event
67
+ true
68
+ end
69
+ end
70
+ @klass = Class.new(@superclass)
71
+
72
+ StateMachines::Integrations.const_set('Custom', Module.new do
73
+ include StateMachines::Integrations::Base
74
+
75
+ def create_with_scope(_name)
76
+ lambda { |_klass, _values| [] }
77
+ end
78
+
79
+ def create_without_scope(_name)
80
+ lambda { |_klass, _values| [] }
81
+ end
82
+ end)
83
+
84
+ @machine = StateMachines::Machine.new(@klass, integration: :custom)
85
+ @machine.state :parked, :idling
86
+ @machine.event :ignite
87
+ @object = @klass.new
88
+ end
89
+
90
+ def test_should_not_redefine_singular_with_scope
91
+ assert_equal :with_state, @klass.with_state
92
+ end
93
+
94
+ def test_should_not_redefine_plural_with_scope
95
+ assert_equal :with_states, @klass.with_states
96
+ end
97
+
98
+ def test_should_not_redefine_singular_without_scope
99
+ assert_equal :without_state, @klass.without_state
100
+ end
101
+
102
+ def test_should_not_redefine_plural_without_scope
103
+ assert_equal :without_states, @klass.without_states
104
+ end
105
+
106
+ def test_should_not_redefine_human_attribute_name_reader
107
+ assert_equal :human_state_name, @klass.human_state_name
108
+ end
109
+
110
+ def test_should_not_redefine_human_event_name_reader
111
+ assert_equal :human_state_event_name, @klass.human_state_event_name
112
+ end
113
+
114
+ def test_should_not_redefine_attribute_reader
115
+ assert_equal 'parked', @object.state
116
+ end
117
+
118
+ def test_should_not_redefine_attribute_writer
119
+ @object.state = 'parked'
120
+ assert_equal 'parked', @object.status
121
+ end
122
+
123
+ def test_should_not_define_attribute_predicate
124
+ assert @object.state?
125
+ end
126
+
127
+ def test_should_not_redefine_attribute_name_reader
128
+ assert_equal :parked, @object.state_name
129
+ end
130
+
131
+ def test_should_not_redefine_attribute_human_name_reader
132
+ assert_equal 'parked', @object.human_state_name
133
+ end
134
+
135
+ def test_should_not_redefine_attribute_events_reader
136
+ assert_equal [:ignite], @object.state_events
137
+ end
138
+
139
+ def test_should_not_redefine_attribute_transitions_reader
140
+ assert_equal [{ parked: :idling }], @object.state_transitions
141
+ end
142
+
143
+ def test_should_not_redefine_attribute_paths_reader
144
+ assert_equal [[{ parked: :idling }]], @object.state_paths
145
+ end
146
+
147
+ def test_should_not_redefine_event_runner
148
+ assert_equal true, @object.fire_state_event
149
+ end
150
+
151
+ def test_should_output_warning
152
+ expected = [
153
+ 'Instance method "state_events"',
154
+ 'Instance method "state_transitions"',
155
+ 'Instance method "fire_state_event"',
156
+ 'Instance method "state_paths"',
157
+ 'Class method "human_state_name"',
158
+ 'Class method "human_state_event_name"',
159
+ 'Instance method "state_name"',
160
+ 'Instance method "human_state_name"',
161
+ 'Class method "with_state"',
162
+ 'Class method "with_states"',
163
+ 'Class method "without_state"',
164
+ 'Class method "without_states"'
165
+ ].map { |method| "#{method} is already defined in #{@superclass}, use generic helper instead or set StateMachines::Machine.ignore_method_conflicts = true.\n" }.join
166
+
167
+ assert_equal expected, $stderr.string
168
+ end
169
+
170
+ def teardown
171
+ $stderr = @original_stderr
172
+ StateMachines::Integrations.send(:remove_const, 'Custom')
173
+ end
174
+ end
175
+
@@ -0,0 +1,11 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithCustomActionTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new, action: :save)
6
+ end
7
+
8
+ def test_should_use_the_custom_action
9
+ assert_equal :save, @machine.action
10
+ end
11
+ end