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,41 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStateMatchersTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ end
8
+
9
+ def test_should_empty_array_for_all_matcher
10
+ assert_equal [], @machine.state(StateMachines::AllMatcher.instance)
11
+ end
12
+
13
+ def test_should_return_referenced_states_for_blacklist_matcher
14
+ assert_instance_of StateMachines::State, @machine.state(StateMachines::BlacklistMatcher.new([:parked]))
15
+ end
16
+
17
+ def test_should_not_allow_configurations
18
+ exception = assert_raises(ArgumentError) { @machine.state(StateMachines::BlacklistMatcher.new([:parked]), human_name: 'Parked') }
19
+ assert_equal 'Cannot configure states when using matchers (using {:human_name=>"Parked"})', exception.message
20
+ end
21
+
22
+ def test_should_track_referenced_states
23
+ @machine.state(StateMachines::BlacklistMatcher.new([:parked]))
24
+ assert_equal [nil, :parked], @machine.states.map { |state| state.name }
25
+ end
26
+
27
+ def test_should_eval_context_for_matching_states
28
+ contexts_run = []
29
+ @machine.event(StateMachines::BlacklistMatcher.new([:parked])) { contexts_run << name }
30
+
31
+ @machine.event :parked
32
+ assert_equal [], contexts_run
33
+
34
+ @machine.event :idling
35
+ assert_equal [:idling], contexts_run
36
+
37
+ @machine.event :first_gear, :second_gear
38
+ assert_equal [:idling, :first_gear, :second_gear], contexts_run
39
+ end
40
+ end
41
+
@@ -0,0 +1,19 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStateWithMatchersTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @state = @machine.state :parked, if: ->(value) {!value.nil? }
8
+
9
+ @object = @klass.new
10
+ @object.state = 1
11
+ end
12
+
13
+ def test_should_use_custom_matcher
14
+ refute_nil @state.matcher
15
+ assert @state.matches?(1)
16
+ refute @state.matches?(nil)
17
+ end
18
+ end
19
+
@@ -0,0 +1,55 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStatesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @parked, @idling = @machine.state :parked, :idling
8
+
9
+ @object = @klass.new
10
+ end
11
+
12
+ def test_should_have_states
13
+ assert_equal [nil, :parked, :idling], @machine.states.map { |state| state.name }
14
+ end
15
+
16
+ def test_should_allow_state_lookup_by_name
17
+ assert_equal @parked, @machine.states[:parked]
18
+ end
19
+
20
+ def test_should_allow_state_lookup_by_value
21
+ assert_equal @parked, @machine.states['parked', :value]
22
+ end
23
+
24
+ def test_should_allow_human_state_name_lookup
25
+ assert_equal 'parked', @klass.human_state_name(:parked)
26
+ end
27
+
28
+ def test_should_raise_exception_on_invalid_human_state_name_lookup
29
+ exception = assert_raises(IndexError) { @klass.human_state_name(:invalid) }
30
+ assert_equal ':invalid is an invalid name', exception.message
31
+ end
32
+
33
+ def test_should_use_stringified_name_for_value
34
+ assert_equal 'parked', @parked.value
35
+ end
36
+
37
+ def test_should_not_use_custom_matcher
38
+ assert_nil @parked.matcher
39
+ end
40
+
41
+ def test_should_raise_exception_if_invalid_option_specified
42
+ exception = assert_raises(ArgumentError) { @machine.state(:first_gear, invalid: true) }
43
+ assert_equal 'Unknown key: :invalid. Valid keys are: :value, :cache, :if, :human_name', exception.message
44
+ end
45
+
46
+ def test_should_raise_exception_if_conflicting_type_used_for_name
47
+ exception = assert_raises(ArgumentError) { @machine.state 'first_gear' }
48
+ assert_equal '"first_gear" state defined as String, :parked defined as Symbol; all states must be consistent', exception.message
49
+ end
50
+
51
+ def test_should_not_raise_exception_if_conflicting_type_is_nil_for_name
52
+ @machine.state nil
53
+ end
54
+ end
55
+
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStatesWithBehaviorsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+
8
+ @parked, @idling = @machine.state :parked, :idling do
9
+ def speed
10
+ 0
11
+ end
12
+ end
13
+ end
14
+
15
+ def test_should_define_behaviors_for_each_state
16
+ refute_nil @parked.context_methods[:speed]
17
+ refute_nil @idling.context_methods[:speed]
18
+ end
19
+
20
+ def test_should_define_different_behaviors_for_each_state
21
+ refute_equal @parked.context_methods[:speed], @idling.context_methods[:speed]
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStatesWithCustomHumanNamesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @state = @machine.state :parked, human_name: 'stopped'
8
+ end
9
+
10
+ def test_should_use_custom_human_name
11
+ assert_equal 'stopped', @state.human_name
12
+ end
13
+
14
+ def test_should_allow_human_state_name_lookup
15
+ assert_equal 'stopped', @klass.human_state_name(:parked)
16
+ end
17
+ end
18
+
@@ -0,0 +1,21 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStatesWithCustomValuesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @state = @machine.state :parked, value: 1
8
+
9
+ @object = @klass.new
10
+ @object.state = 1
11
+ end
12
+
13
+ def test_should_use_custom_value
14
+ assert_equal 1, @state.value
15
+ end
16
+
17
+ def test_should_allow_lookup_by_custom_value
18
+ assert_equal @state, @machine.states[1, :value]
19
+ end
20
+ end
21
+
@@ -0,0 +1,19 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStatesWithRuntimeDependenciesTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @machine.state :parked
8
+ end
9
+
10
+ def test_should_not_evaluate_value_during_definition
11
+ @machine.state :parked, value: -> { fail ArgumentError }
12
+ end
13
+
14
+ def test_should_not_evaluate_if_not_initial_state
15
+ @machine.state :parked, value: -> { fail ArgumentError }
16
+ @klass.new
17
+ end
18
+ end
19
+
@@ -0,0 +1,60 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithStaticInitialStateTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ end
8
+
9
+ def test_should_not_have_dynamic_initial_state
10
+ refute @machine.dynamic_initial_state?
11
+ end
12
+
13
+ def test_should_have_an_initial_state
14
+ object = @klass.new
15
+ assert_equal 'parked', @machine.initial_state(object).value
16
+ end
17
+
18
+ def test_should_write_to_attribute_when_initializing_state
19
+ object = @klass.allocate
20
+ @machine.initialize_state(object)
21
+ assert_equal 'parked', object.state
22
+ end
23
+
24
+ def test_should_set_initial_on_state_object
25
+ assert @machine.state(:parked).initial
26
+ end
27
+
28
+ def test_should_set_initial_state_on_created_object
29
+ assert_equal 'parked', @klass.new.state
30
+ end
31
+
32
+ def test_not_set_initial_state_even_if_not_empty
33
+ @klass.class_eval do
34
+ def initialize(_attributes = {})
35
+ self.state = 'idling'
36
+ super()
37
+ end
38
+ end
39
+ object = @klass.new
40
+ assert_equal 'idling', object.state
41
+ end
42
+
43
+ def test_should_set_initial_state_prior_to_initialization
44
+ base = Class.new do
45
+ attr_accessor :state_on_init
46
+
47
+ def initialize
48
+ self.state_on_init = state
49
+ end
50
+ end
51
+ klass = Class.new(base)
52
+ StateMachines::Machine.new(klass, initial: :parked)
53
+
54
+ assert_equal 'parked', klass.new.state_on_init
55
+ end
56
+
57
+ def test_should_be_included_in_known_states
58
+ assert_equal [:parked], @machine.states.keys
59
+ end
60
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../test_helper'
2
+ require 'stringio'
3
+
4
+ class MachineWithSuperclassConflictingHelpersAfterDefinitionTest < StateMachinesTest
5
+ def setup
6
+ @original_stderr, $stderr = $stderr, StringIO.new
7
+
8
+ @superclass = Class.new
9
+ @klass = Class.new(@superclass)
10
+
11
+ @machine = StateMachines::Machine.new(@klass)
12
+ @machine.state :parked, :idling
13
+ @machine.event :ignite
14
+
15
+ @superclass.class_eval do
16
+ def state?
17
+ true
18
+ end
19
+ end
20
+
21
+ @object = @klass.new
22
+ end
23
+
24
+ def test_should_call_superclass_attribute_predicate_without_arguments
25
+ assert @object.state?
26
+ end
27
+
28
+ def test_should_define_attribute_predicate_with_arguments
29
+ refute @object.state?(:parked)
30
+ end
31
+
32
+ def teardown
33
+ $stderr = @original_stderr
34
+ end
35
+ end
36
+
@@ -0,0 +1,144 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithTransitionCallbacksTest < 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 do
11
+ transition parked: :idling
12
+ end
13
+
14
+ @object = @klass.new
15
+ @object.callbacks = []
16
+ end
17
+
18
+ def test_should_not_raise_exception_if_implicit_option_specified
19
+ @machine.before_transition invalid: :valid, do: -> {}
20
+ end
21
+
22
+ def test_should_raise_exception_if_method_not_specified
23
+ exception = assert_raises(ArgumentError) { @machine.before_transition to: :idling }
24
+ assert_equal 'Method(s) for callback must be specified', exception.message
25
+ end
26
+
27
+ def test_should_invoke_callbacks_during_transition
28
+ @machine.before_transition lambda { |object| object.callbacks << 'before' }
29
+ @machine.after_transition lambda { |object| object.callbacks << 'after' }
30
+ @machine.around_transition lambda { |object, _transition, block| object.callbacks << 'before_around'; block.call; object.callbacks << 'after_around' }
31
+
32
+ @event.fire(@object)
33
+ assert_equal %w(before before_around after_around after), @object.callbacks
34
+ end
35
+
36
+ def test_should_allow_multiple_callbacks
37
+ @machine.before_transition lambda { |object| object.callbacks << 'before1' }, lambda { |object| object.callbacks << 'before2' }
38
+ @machine.after_transition lambda { |object| object.callbacks << 'after1' }, lambda { |object| object.callbacks << 'after2' }
39
+ @machine.around_transition(
40
+ lambda { |object, _transition, block| object.callbacks << 'before_around1'; block.call; object.callbacks << 'after_around1' },
41
+ lambda { |object, _transition, block| object.callbacks << 'before_around2'; block.call; object.callbacks << 'after_around2' }
42
+ )
43
+
44
+ @event.fire(@object)
45
+ assert_equal %w(before1 before2 before_around1 before_around2 after_around2 after_around1 after1 after2), @object.callbacks
46
+ end
47
+
48
+ def test_should_allow_multiple_callbacks_with_requirements
49
+ @machine.before_transition lambda { |object| object.callbacks << 'before_parked1' }, lambda { |object| object.callbacks << 'before_parked2' }, from: :parked
50
+ @machine.before_transition lambda { |object| object.callbacks << 'before_idling1' }, lambda { |object| object.callbacks << 'before_idling2' }, from: :idling
51
+ @machine.after_transition lambda { |object| object.callbacks << 'after_parked1' }, lambda { |object| object.callbacks << 'after_parked2' }, from: :parked
52
+ @machine.after_transition lambda { |object| object.callbacks << 'after_idling1' }, lambda { |object| object.callbacks << 'after_idling2' }, from: :idling
53
+ @machine.around_transition(
54
+ lambda { |object, _transition, block| object.callbacks << 'before_around_parked1'; block.call; object.callbacks << 'after_around_parked1' },
55
+ lambda { |object, _transition, block| object.callbacks << 'before_around_parked2'; block.call; object.callbacks << 'after_around_parked2' },
56
+ from: :parked
57
+ )
58
+ @machine.around_transition(
59
+ lambda { |object, _transition, block| object.callbacks << 'before_around_idling1'; block.call; object.callbacks << 'after_around_idling1' },
60
+ lambda { |object, _transition, block| object.callbacks << 'before_around_idling2'; block.call; object.callbacks << 'after_around_idling2' },
61
+ from: :idling
62
+ )
63
+
64
+ @event.fire(@object)
65
+ assert_equal %w(before_parked1 before_parked2 before_around_parked1 before_around_parked2 after_around_parked2 after_around_parked1 after_parked1 after_parked2), @object.callbacks
66
+ end
67
+
68
+ def test_should_support_from_requirement
69
+ @machine.before_transition from: :parked, do: lambda { |object| object.callbacks << :parked }
70
+ @machine.before_transition from: :idling, do: lambda { |object| object.callbacks << :idling }
71
+
72
+ @event.fire(@object)
73
+ assert_equal [:parked], @object.callbacks
74
+ end
75
+
76
+ def test_should_support_except_from_requirement
77
+ @machine.before_transition except_from: :parked, do: lambda { |object| object.callbacks << :parked }
78
+ @machine.before_transition except_from: :idling, do: lambda { |object| object.callbacks << :idling }
79
+
80
+ @event.fire(@object)
81
+ assert_equal [:idling], @object.callbacks
82
+ end
83
+
84
+ def test_should_support_to_requirement
85
+ @machine.before_transition to: :parked, do: lambda { |object| object.callbacks << :parked }
86
+ @machine.before_transition to: :idling, do: lambda { |object| object.callbacks << :idling }
87
+
88
+ @event.fire(@object)
89
+ assert_equal [:idling], @object.callbacks
90
+ end
91
+
92
+ def test_should_support_except_to_requirement
93
+ @machine.before_transition except_to: :parked, do: lambda { |object| object.callbacks << :parked }
94
+ @machine.before_transition except_to: :idling, do: lambda { |object| object.callbacks << :idling }
95
+
96
+ @event.fire(@object)
97
+ assert_equal [:parked], @object.callbacks
98
+ end
99
+
100
+ def test_should_support_on_requirement
101
+ @machine.before_transition on: :park, do: lambda { |object| object.callbacks << :park }
102
+ @machine.before_transition on: :ignite, do: lambda { |object| object.callbacks << :ignite }
103
+
104
+ @event.fire(@object)
105
+ assert_equal [:ignite], @object.callbacks
106
+ end
107
+
108
+ def test_should_support_except_on_requirement
109
+ @machine.before_transition except_on: :park, do: lambda { |object| object.callbacks << :park }
110
+ @machine.before_transition except_on: :ignite, do: lambda { |object| object.callbacks << :ignite }
111
+
112
+ @event.fire(@object)
113
+ assert_equal [:park], @object.callbacks
114
+ end
115
+
116
+ def test_should_support_implicit_requirement
117
+ @machine.before_transition parked: :idling, do: lambda { |object| object.callbacks << :parked }
118
+ @machine.before_transition idling: :parked, do: lambda { |object| object.callbacks << :idling }
119
+
120
+ @event.fire(@object)
121
+ assert_equal [:parked], @object.callbacks
122
+ end
123
+
124
+ def test_should_track_states_defined_in_transition_callbacks
125
+ @machine.before_transition parked: :idling, do: lambda {}
126
+ @machine.after_transition first_gear: :second_gear, do: lambda {}
127
+ @machine.around_transition third_gear: :fourth_gear, do: lambda {}
128
+
129
+ assert_equal [:parked, :idling, :first_gear, :second_gear, :third_gear, :fourth_gear], @machine.states.map { |state| state.name }
130
+ end
131
+
132
+ def test_should_not_duplicate_states_defined_in_multiple_event_transitions
133
+ @machine.before_transition parked: :idling, do: lambda {}
134
+ @machine.after_transition first_gear: :second_gear, do: lambda {}
135
+ @machine.after_transition parked: :idling, do: lambda {}
136
+ @machine.around_transition parked: :idling, do: lambda {}
137
+
138
+ assert_equal [:parked, :idling, :first_gear, :second_gear], @machine.states.map { |state| state.name }
139
+ end
140
+
141
+ def test_should_define_predicates_for_each_state
142
+ [:parked?, :idling?].each { |predicate| assert @object.respond_to?(predicate) }
143
+ end
144
+ end
@@ -0,0 +1,87 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithTransitionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ end
8
+
9
+ def test_should_require_on_event
10
+ exception = assert_raises(ArgumentError) { @machine.transition(parked: :idling) }
11
+ assert_equal 'Must specify :on event', exception.message
12
+ end
13
+
14
+ def test_should_not_allow_except_on_option
15
+ exception = assert_raises(ArgumentError) { @machine.transition(except_on: :ignite, on: :ignite) }
16
+ assert_equal 'Unknown key: :except_on. Valid keys are: :from, :to, :except_from, :except_to, :if, :unless', exception.message
17
+ end
18
+
19
+ def test_should_allow_transitioning_without_a_to_state
20
+ @machine.transition(from: :parked, on: :ignite)
21
+ end
22
+
23
+ def test_should_allow_transitioning_without_a_from_state
24
+ @machine.transition(to: :idling, on: :ignite)
25
+ end
26
+
27
+ def test_should_allow_except_from_option
28
+ @machine.transition(except_from: :idling, on: :ignite)
29
+ end
30
+
31
+ def test_should_allow_except_to_option
32
+ @machine.transition(except_to: :parked, on: :ignite)
33
+ end
34
+
35
+ def test_should_allow_implicit_options
36
+ branch = @machine.transition(first_gear: :second_gear, on: :shift_up)
37
+ assert_instance_of StateMachines::Branch, branch
38
+
39
+ state_requirements = branch.state_requirements
40
+ assert_equal 1, state_requirements.length
41
+
42
+ assert_instance_of StateMachines::WhitelistMatcher, state_requirements[0][:from]
43
+ assert_equal [:first_gear], state_requirements[0][:from].values
44
+ assert_instance_of StateMachines::WhitelistMatcher, state_requirements[0][:to]
45
+ assert_equal [:second_gear], state_requirements[0][:to].values
46
+ assert_instance_of StateMachines::WhitelistMatcher, branch.event_requirement
47
+ assert_equal [:shift_up], branch.event_requirement.values
48
+ end
49
+
50
+ def test_should_allow_multiple_implicit_options
51
+ branch = @machine.transition(first_gear: :second_gear, second_gear: :third_gear, on: :shift_up)
52
+
53
+ state_requirements = branch.state_requirements
54
+ assert_equal 2, state_requirements.length
55
+ end
56
+
57
+ def test_should_allow_verbose_options
58
+ branch = @machine.transition(from: :parked, to: :idling, on: :ignite)
59
+ assert_instance_of StateMachines::Branch, branch
60
+ end
61
+
62
+ def test_should_include_all_transition_states_in_machine_states
63
+ @machine.transition(parked: :idling, on: :ignite)
64
+
65
+ assert_equal [:parked, :idling], @machine.states.map { |state| state.name }
66
+ end
67
+
68
+ def test_should_include_all_transition_events_in_machine_events
69
+ @machine.transition(parked: :idling, on: :ignite)
70
+
71
+ assert_equal [:ignite], @machine.events.map { |event| event.name }
72
+ end
73
+
74
+ def test_should_allow_multiple_events
75
+ branches = @machine.transition(parked: :ignite, on: [:ignite, :shift_up])
76
+
77
+ assert_equal 2, branches.length
78
+ assert_equal [:ignite, :shift_up], @machine.events.map { |event| event.name }
79
+ end
80
+
81
+ def test_should_not_modify_options
82
+ options = { parked: :idling, on: :ignite }
83
+ @machine.transition(options)
84
+
85
+ assert_equal options, parked: :idling, on: :ignite
86
+ end
87
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithoutInitializationTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def initialize(attributes = {})
7
+ attributes.each { |attr, value| send("#{attr}=", value) }
8
+ super()
9
+ end
10
+ end
11
+
12
+ @machine = StateMachines::Machine.new(@klass, initial: :parked, initialize: false)
13
+ end
14
+
15
+ def test_should_not_have_an_initial_state
16
+ object = @klass.new
17
+ assert_nil object.state
18
+ end
19
+
20
+ def test_should_still_allow_manual_initialization
21
+ @klass.send(:include, Module.new do
22
+ def initialize(_attributes = {})
23
+ super()
24
+ initialize_state_machines
25
+ end
26
+ end)
27
+
28
+ object = @klass.new
29
+ assert_equal 'parked', object.state
30
+ end
31
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithoutInitializeTest < StateMachinesTest
4
+ def setup
5
+ klass = Class.new
6
+ StateMachines::Machine.new(klass, initial: :parked)
7
+ @object = klass.new
8
+ end
9
+
10
+ def test_should_initialize_state
11
+ assert_equal 'parked', @object.state
12
+ end
13
+ end
14
+
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithoutIntegrationTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @object = @klass.new
8
+ end
9
+
10
+ def test_transaction_should_yield
11
+ @yielded = false
12
+ @machine.within_transaction(@object) do
13
+ @yielded = true
14
+ end
15
+
16
+ assert @yielded
17
+ end
18
+
19
+ def test_invalidation_should_do_nothing
20
+ assert_nil @machine.invalidate(@object, :state, :invalid_transition, [[:event, 'park']])
21
+ end
22
+
23
+ def test_reset_should_do_nothing
24
+ assert_nil @machine.reset(@object)
25
+ end
26
+
27
+ def test_errors_for_should_be_empty
28
+ assert_equal '', @machine.errors_for(@object)
29
+ end
30
+ end
31
+
@@ -0,0 +1,11 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineCollectionByDefaultTest < StateMachinesTest
4
+ def setup
5
+ @machines = StateMachines::MachineCollection.new
6
+ end
7
+
8
+ def test_should_not_have_any_machines
9
+ assert @machines.empty?
10
+ end
11
+ end