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,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithExistingMachinesWithSameAttributesOnOwnerSubclassTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @second_machine = StateMachines::Machine.new(@klass, :public_state, initial: :idling, attribute: :state)
8
+
9
+ @subclass = Class.new(@klass)
10
+ @object = @subclass.new
11
+ end
12
+
13
+ def test_should_not_copy_sibling_machines_to_subclass_after_initialization
14
+ @subclass.state_machine(:state) {}
15
+ assert_equal @klass.state_machine(:public_state), @subclass.state_machine(:public_state)
16
+ end
17
+
18
+ def test_should_copy_sibling_machines_to_subclass_after_new_state
19
+ subclass_machine = @subclass.state_machine(:state) {}
20
+ subclass_machine.state :first_gear
21
+ refute_equal @klass.state_machine(:public_state), @subclass.state_machine(:public_state)
22
+ end
23
+
24
+ def test_should_copy_new_states_to_sibling_machines
25
+ subclass_machine = @subclass.state_machine(:state) {}
26
+ @first_gear = subclass_machine.state :first_gear
27
+
28
+ second_subclass_machine = @subclass.state_machine(:public_state)
29
+ assert_equal @first_gear, second_subclass_machine.state(:first_gear)
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithExistingStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @state = @machine.state :parked
8
+ @same_state = @machine.state :parked, value: 1
9
+ end
10
+
11
+ def test_should_not_create_a_new_state
12
+ assert_same @state, @same_state
13
+ end
14
+
15
+ def test_should_update_attributes
16
+ assert_equal 1, @state.value
17
+ end
18
+
19
+ def test_should_no_longer_be_able_to_look_up_state_by_original_value
20
+ assert_nil @machine.states['parked', :value]
21
+ end
22
+
23
+ def test_should_be_able_to_look_up_state_by_new_value
24
+ assert_equal @state, @machine.states[1, :value]
25
+ end
26
+ end
27
+
@@ -0,0 +1,48 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithFailureCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_accessor :callbacks
7
+ end
8
+
9
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
10
+ @event = @machine.event :ignite
11
+
12
+ @object = @klass.new
13
+ @object.callbacks = []
14
+ end
15
+
16
+ def test_should_raise_exception_if_implicit_option_specified
17
+ exception = assert_raises(ArgumentError) { @machine.after_failure invalid: :valid, do: lambda {} }
18
+ assert_equal 'Unknown key: :invalid. Valid keys are: :on, :do, :if, :unless', exception.message
19
+ end
20
+
21
+ def test_should_raise_exception_if_method_not_specified
22
+ exception = assert_raises(ArgumentError) { @machine.after_failure on: :ignite }
23
+ assert_equal 'Method(s) for callback must be specified', exception.message
24
+ end
25
+
26
+ def test_should_invoke_callbacks_during_failed_transition
27
+ @machine.after_failure lambda { |object| object.callbacks << 'failure' }
28
+
29
+ @event.fire(@object)
30
+ assert_equal %w(failure), @object.callbacks
31
+ end
32
+
33
+ def test_should_allow_multiple_callbacks
34
+ @machine.after_failure lambda { |object| object.callbacks << 'failure1' }, lambda { |object| object.callbacks << 'failure2' }
35
+
36
+ @event.fire(@object)
37
+ assert_equal %w(failure1 failure2), @object.callbacks
38
+ end
39
+
40
+ def test_should_allow_multiple_callbacks_with_requirements
41
+ @machine.after_failure lambda { |object| object.callbacks << 'failure_ignite1' }, lambda { |object| object.callbacks << 'failure_ignite2' }, on: :ignite
42
+ @machine.after_failure lambda { |object| object.callbacks << 'failure_park1' }, lambda { |object| object.callbacks << 'failure_park2' }, on: :park
43
+
44
+ @event.fire(@object)
45
+ assert_equal %w(failure_ignite1 failure_ignite2), @object.callbacks
46
+ end
47
+ end
48
+
@@ -0,0 +1,14 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithHelpersTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @object = @klass.new
8
+ end
9
+
10
+ def test_should_throw_exception_with_invalid_scope
11
+ assert_raises(RUBY_VERSION < '1.9' ? IndexError : KeyError) { @machine.define_helper(:invalid, :park) {} }
12
+ end
13
+ end
14
+
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithInitialStateWithValueAndOwnerDefault < StateMachinesTest
4
+ def setup
5
+ @original_stderr, $stderr = $stderr, StringIO.new
6
+
7
+ state_machine_with_defaults = Class.new(StateMachines::Machine) do
8
+ def owner_class_attribute_default
9
+ 0
10
+ end
11
+ end
12
+ @klass = Class.new
13
+ @machine = state_machine_with_defaults.new(@klass, initial: :parked) do
14
+ state :parked, value: 0
15
+ end
16
+ end
17
+
18
+ def test_should_not_warn_about_wrong_default
19
+ assert_equal '', $stderr.string
20
+ end
21
+
22
+ def teardown
23
+ $stderr = @original_stderr
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithInitializeAndSuperTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def initialize
7
+ super()
8
+ end
9
+ end
10
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
11
+ @object = @klass.new
12
+ end
13
+
14
+ def test_should_initialize_state
15
+ assert_equal 'parked', @object.state
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithInitializeArgumentsAndBlockTest < StateMachinesTest
4
+ def setup
5
+ @superclass = Class.new do
6
+ attr_reader :args
7
+ attr_reader :block_given
8
+
9
+ def initialize(*args)
10
+ @args = args
11
+ @block_given = block_given?
12
+ end
13
+ end
14
+ @klass = Class.new(@superclass)
15
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
16
+ @object = @klass.new(1, 2, 3) {}
17
+ end
18
+
19
+ def test_should_initialize_state
20
+ assert_equal 'parked', @object.state
21
+ end
22
+
23
+ def test_should_preserve_arguments
24
+ assert_equal [1, 2, 3], @object.args
25
+ end
26
+
27
+ def test_should_preserve_block
28
+ assert @object.block_given
29
+ end
30
+ end
31
+
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithInitializeWithoutSuperTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def initialize
7
+ end
8
+ end
9
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
10
+ @object = @klass.new
11
+ end
12
+
13
+ def test_should_not_initialize_state
14
+ assert_nil @object.state
15
+ end
16
+ end
17
+
@@ -0,0 +1,179 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithInstanceHelpersTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @object = @klass.new
8
+ end
9
+
10
+ def test_should_not_redefine_existing_public_methods
11
+ @klass.class_eval do
12
+ def park
13
+ true
14
+ end
15
+ end
16
+
17
+ @machine.define_helper(:instance, :park) {}
18
+ assert_equal true, @object.park
19
+ end
20
+
21
+ def test_should_not_redefine_existing_protected_methods
22
+ @klass.class_eval do
23
+ protected
24
+ def park
25
+ true
26
+ end
27
+ end
28
+
29
+ @machine.define_helper(:instance, :park) {}
30
+ assert_equal true, @object.send(:park)
31
+ end
32
+
33
+ def test_should_not_redefine_existing_private_methods
34
+ @klass.class_eval do
35
+ private
36
+ def park
37
+ true
38
+ end
39
+ end
40
+
41
+ @machine.define_helper(:instance, :park) {}
42
+ assert_equal true, @object.send(:park)
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 park
50
+ end
51
+ end
52
+ klass = Class.new(superclass)
53
+ machine = StateMachines::Machine.new(klass)
54
+
55
+ machine.define_helper(:instance, :park) {}
56
+ assert_equal "Instance 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 park
66
+ end
67
+ end
68
+ superclass2 = Class.new(superclass1) do
69
+ def park
70
+ end
71
+ end
72
+ klass = Class.new(superclass2)
73
+ machine = StateMachines::Machine.new(klass)
74
+
75
+ machine.define_helper(:instance, :park) {}
76
+ assert_equal "Instance 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
+ include mod
90
+ end
91
+ machine = StateMachines::Machine.new(klass)
92
+
93
+ machine.define_helper(:instance, :park) {}
94
+ assert_equal "Instance 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
+ include mod
111
+ end
112
+
113
+ machine.define_helper(:instance, :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 park
125
+ end
126
+ end
127
+ klass = Class.new(superclass)
128
+ machine = StateMachines::Machine.new(klass)
129
+
130
+ machine.define_helper(:instance, :park) { true }
131
+ assert_equal '', $stderr.string
132
+ assert_equal true, klass.new.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(:instance, :park) { false }
140
+ assert_equal false, @object.park
141
+ end
142
+
143
+ def test_should_warn_if_defined_multiple_times
144
+ @original_stderr, $stderr = $stderr, StringIO.new
145
+
146
+ @machine.define_helper(:instance, :park) {}
147
+ @machine.define_helper(:instance, :park) {}
148
+
149
+ assert_equal "Instance method \"park\" is already defined in #{@klass} :state instance 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(:instance, :park) { |*args| helper_args = args }
157
+ @object.park
158
+ assert_equal 2, helper_args.length
159
+ assert_equal [@machine, @object], helper_args
160
+ end
161
+
162
+ def test_should_pass_method_arguments_through
163
+ helper_args = nil
164
+ @machine.define_helper(:instance, :park) { |*args| helper_args = args }
165
+ @object.park(1, 2, 3)
166
+ assert_equal 5, helper_args.length
167
+ assert_equal [@machine, @object, 1, 2, 3], helper_args
168
+ end
169
+
170
+ def test_should_allow_string_evaluation
171
+ @machine.define_helper :instance, <<-end_eval, __FILE__, __LINE__ + 1
172
+ def park
173
+ false
174
+ end
175
+ end_eval
176
+ assert_equal false, @object.park
177
+ end
178
+ end
179
+
@@ -0,0 +1,71 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithIntegrationTest < StateMachinesTest
4
+ def setup
5
+ StateMachines::Integrations.const_set('Custom', Module.new do
6
+ include StateMachines::Integrations::Base
7
+
8
+ @defaults = { action: :save, use_transactions: false }
9
+
10
+ attr_reader :initialized, :with_scopes, :without_scopes, :ran_transaction
11
+
12
+ def after_initialize
13
+ @initialized = true
14
+ end
15
+
16
+ def create_with_scope(name)
17
+ (@with_scopes ||= []) << name
18
+ lambda {}
19
+ end
20
+
21
+ def create_without_scope(name)
22
+ (@without_scopes ||= []) << name
23
+ lambda {}
24
+ end
25
+
26
+ def transaction(_)
27
+ @ran_transaction = true
28
+ yield
29
+ end
30
+ end)
31
+ StateMachines::Integrations.register(StateMachines::Integrations::Custom)
32
+
33
+
34
+ @machine = StateMachines::Machine.new(Class.new, integration: :custom)
35
+ end
36
+
37
+ def test_should_call_after_initialize_hook
38
+ assert @machine.initialized
39
+ end
40
+
41
+ def test_should_use_the_default_action
42
+ assert_equal :save, @machine.action
43
+ end
44
+
45
+ def test_should_use_the_custom_action_if_specified
46
+ machine = StateMachines::Machine.new(Class.new, integration: :custom, action: :save!)
47
+ assert_equal :save!, machine.action
48
+ end
49
+
50
+ def test_should_use_the_default_use_transactions
51
+ assert_equal false, @machine.use_transactions
52
+ end
53
+
54
+ def test_should_use_the_custom_use_transactions_if_specified
55
+ machine = StateMachines::Machine.new(Class.new, integration: :custom, use_transactions: true)
56
+ assert_equal true, machine.use_transactions
57
+ end
58
+
59
+ def test_should_define_a_singular_and_plural_with_scope
60
+ assert_equal %w(with_state with_states), @machine.with_scopes
61
+ end
62
+
63
+ def test_should_define_a_singular_and_plural_without_scope
64
+ assert_equal %w(without_state without_states), @machine.without_scopes
65
+ end
66
+
67
+ def teardown
68
+ StateMachines::Integrations.reset
69
+ StateMachines::Integrations.send(:remove_const, 'Custom')
70
+ end
71
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithMultipleEventsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @park, @shift_down = @machine.event(:park, :shift_down) do
8
+ transition first_gear: :parked
9
+ end
10
+ end
11
+
12
+ def test_should_have_events
13
+ assert_equal [@park, @shift_down], @machine.events.to_a
14
+ end
15
+
16
+ def test_should_define_transitions_for_each_event
17
+ [@park, @shift_down].each { |event| assert_equal 1, event.branches.size }
18
+ end
19
+
20
+ def test_should_transition_the_same_for_each_event
21
+ object = @klass.new
22
+ object.state = 'first_gear'
23
+ object.park
24
+ assert_equal 'parked', object.state
25
+
26
+ object = @klass.new
27
+ object.state = 'first_gear'
28
+ object.shift_down
29
+ assert_equal 'parked', object.state
30
+ end
31
+ end
32
+
@@ -0,0 +1,48 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithNamespaceTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, namespace: 'alarm', initial: :active) do
7
+ event :enable do
8
+ transition off: :active
9
+ end
10
+
11
+ event :disable do
12
+ transition active: :off
13
+ end
14
+ end
15
+ @object = @klass.new
16
+ end
17
+
18
+ def test_should_namespace_state_predicates
19
+ [:alarm_active?, :alarm_off?].each do |name|
20
+ assert @object.respond_to?(name)
21
+ end
22
+ end
23
+
24
+ def test_should_namespace_event_checks
25
+ [:can_enable_alarm?, :can_disable_alarm?].each do |name|
26
+ assert @object.respond_to?(name)
27
+ end
28
+ end
29
+
30
+ def test_should_namespace_event_transition_readers
31
+ [:enable_alarm_transition, :disable_alarm_transition].each do |name|
32
+ assert @object.respond_to?(name)
33
+ end
34
+ end
35
+
36
+ def test_should_namespace_events
37
+ [:enable_alarm, :disable_alarm].each do |name|
38
+ assert @object.respond_to?(name)
39
+ end
40
+ end
41
+
42
+ def test_should_namespace_bang_events
43
+ [:enable_alarm!, :disable_alarm!].each do |name|
44
+ assert @object.respond_to?(name)
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,24 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithNilActionTest < StateMachinesTest
4
+ def setup
5
+ integration = Module.new do
6
+ include StateMachines::Integrations::Base
7
+
8
+ @defaults = { action: :save }
9
+ end
10
+ StateMachines::Integrations.const_set('Custom', integration)
11
+ StateMachines::Integrations.register(StateMachines::Integrations::Custom)
12
+
13
+ @machine = StateMachines::Machine.new(Class.new, action: nil, integration: :custom)
14
+ end
15
+
16
+ def test_should_have_a_nil_action
17
+ assert_nil @machine.action
18
+ end
19
+
20
+ def teardown
21
+ StateMachines::Integrations.reset
22
+ StateMachines::Integrations.send(:remove_const, 'Custom')
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithOtherStates < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @parked, @idling = @machine.other_states(:parked, :idling)
8
+ end
9
+
10
+ def test_should_include_other_states_in_known_states
11
+ assert_equal [@parked, @idling], @machine.states.to_a
12
+ end
13
+
14
+ def test_should_use_default_value
15
+ assert_equal 'idling', @idling.value
16
+ end
17
+
18
+ def test_should_not_create_matcher
19
+ assert_nil @idling.matcher
20
+ end
21
+ end
22
+
@@ -0,0 +1,18 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithOwnerSubclassTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @subclass = Class.new(@klass)
8
+ end
9
+
10
+ def test_should_have_a_different_collection_of_state_machines
11
+ refute_same @klass.state_machines, @subclass.state_machines
12
+ end
13
+
14
+ def test_should_have_the_same_attribute_associated_state_machines
15
+ assert_equal @klass.state_machines, @subclass.state_machines
16
+ end
17
+ end
18
+
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithPathsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.event :ignite do
8
+ transition parked: :idling
9
+ end
10
+ @machine.event :shift_up do
11
+ transition first_gear: :second_gear
12
+ end
13
+
14
+ @object = @klass.new
15
+ @object.state = 'parked'
16
+ end
17
+
18
+ def test_should_have_paths
19
+ assert_equal [[StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)]], @machine.paths_for(@object)
20
+ end
21
+
22
+ def test_should_allow_requirement_configuration
23
+ assert_equal [[StateMachines::Transition.new(@object, @machine, :shift_up, :first_gear, :second_gear)]], @machine.paths_for(@object, from: :first_gear)
24
+ end
25
+ end
@@ -0,0 +1,43 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithPrivateActionTest < StateMachinesTest
4
+ def setup
5
+ @superclass = Class.new do
6
+ private
7
+ def save
8
+ end
9
+ end
10
+ @klass = Class.new(@superclass)
11
+
12
+ @machine = StateMachines::Machine.new(@klass, action: :save)
13
+ @object = @klass.new
14
+ end
15
+
16
+ def test_should_define_an_event_attribute_reader
17
+ assert @object.respond_to?(:state_event)
18
+ end
19
+
20
+ def test_should_define_an_event_attribute_writer
21
+ assert @object.respond_to?(:state_event=)
22
+ end
23
+
24
+ def test_should_define_an_event_transition_attribute_reader
25
+ assert @object.respond_to?(:state_event_transition, true)
26
+ end
27
+
28
+ def test_should_define_an_event_transition_attribute_writer
29
+ assert @object.respond_to?(:state_event_transition=, true)
30
+ end
31
+
32
+ def test_should_define_action
33
+ assert @klass.ancestors.any? { |ancestor| ![@klass, @superclass].include?(ancestor) && ancestor.private_method_defined?(:save) }
34
+ end
35
+
36
+ def test_should_keep_action_private
37
+ assert @klass.private_method_defined?(:save)
38
+ end
39
+
40
+ def test_should_mark_action_hook_as_defined
41
+ assert @machine.action_hook?
42
+ end
43
+ end