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,62 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineAfterBeingCopiedTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new, :state, initial: :parked)
6
+ @machine.event(:ignite) {}
7
+ @machine.before_transition(lambda {})
8
+ @machine.after_transition(lambda {})
9
+ @machine.around_transition(lambda {})
10
+ @machine.after_failure(lambda {})
11
+
12
+ @copied_machine = @machine.clone
13
+ end
14
+
15
+ def test_should_not_have_the_same_collection_of_states
16
+ refute_same @copied_machine.states, @machine.states
17
+ end
18
+
19
+ def test_should_copy_each_state
20
+ refute_same @copied_machine.states[:parked], @machine.states[:parked]
21
+ end
22
+
23
+ def test_should_update_machine_for_each_state
24
+ assert_equal @copied_machine, @copied_machine.states[:parked].machine
25
+ end
26
+
27
+ def test_should_not_update_machine_for_original_state
28
+ assert_equal @machine, @machine.states[:parked].machine
29
+ end
30
+
31
+ def test_should_not_have_the_same_collection_of_events
32
+ refute_same @copied_machine.events, @machine.events
33
+ end
34
+
35
+ def test_should_copy_each_event
36
+ refute_same @copied_machine.events[:ignite], @machine.events[:ignite]
37
+ end
38
+
39
+ def test_should_update_machine_for_each_event
40
+ assert_equal @copied_machine, @copied_machine.events[:ignite].machine
41
+ end
42
+
43
+ def test_should_not_update_machine_for_original_event
44
+ assert_equal @machine, @machine.events[:ignite].machine
45
+ end
46
+
47
+ def test_should_not_have_the_same_callbacks
48
+ refute_same @copied_machine.callbacks, @machine.callbacks
49
+ end
50
+
51
+ def test_should_not_have_the_same_before_callbacks
52
+ refute_same @copied_machine.callbacks[:before], @machine.callbacks[:before]
53
+ end
54
+
55
+ def test_should_not_have_the_same_after_callbacks
56
+ refute_same @copied_machine.callbacks[:after], @machine.callbacks[:after]
57
+ end
58
+
59
+ def test_should_not_have_the_same_failure_callbacks
60
+ refute_same @copied_machine.callbacks[:failure], @machine.callbacks[:failure]
61
+ end
62
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineAfterChangingInitialState < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @machine.initial_state = :idling
8
+
9
+ @object = @klass.new
10
+ end
11
+
12
+ def test_should_change_the_initial_state
13
+ assert_equal :idling, @machine.initial_state(@object).name
14
+ end
15
+
16
+ def test_should_include_in_known_states
17
+ assert_equal [:parked, :idling], @machine.states.map { |state| state.name }
18
+ end
19
+
20
+ def test_should_reset_original_initial_state
21
+ refute @machine.state(:parked).initial
22
+ end
23
+
24
+ def test_should_set_new_state_to_initial
25
+ assert @machine.state(:idling).initial
26
+ end
27
+ end
28
+
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineAfterChangingOwnerClassTest < StateMachinesTest
4
+ def setup
5
+ @original_class = Class.new
6
+ @machine = StateMachines::Machine.new(@original_class)
7
+
8
+ @new_class = Class.new(@original_class)
9
+ @new_machine = @machine.clone
10
+ @new_machine.owner_class = @new_class
11
+
12
+ @object = @new_class.new
13
+ end
14
+
15
+ def test_should_update_owner_class
16
+ assert_equal @new_class, @new_machine.owner_class
17
+ end
18
+
19
+ def test_should_not_change_original_owner_class
20
+ assert_equal @original_class, @machine.owner_class
21
+ end
22
+
23
+ def test_should_change_the_associated_machine_in_the_new_class
24
+ assert_equal @new_machine, @new_class.state_machines[:state]
25
+ end
26
+
27
+ def test_should_not_change_the_associated_machine_in_the_original_class
28
+ assert_equal @machine, @original_class.state_machines[:state]
29
+ end
30
+ end
31
+
@@ -0,0 +1,160 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineByDefaultTest < 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_have_an_owner_class
11
+ assert_equal @klass, @machine.owner_class
12
+ end
13
+
14
+ def test_should_have_a_name
15
+ assert_equal :state, @machine.name
16
+ end
17
+
18
+ def test_should_have_an_attribute
19
+ assert_equal :state, @machine.attribute
20
+ end
21
+
22
+ def test_should_prefix_custom_attributes_with_attribute
23
+ assert_equal :state_event, @machine.attribute(:event)
24
+ end
25
+
26
+ def test_should_have_an_initial_state
27
+ refute_nil @machine.initial_state(@object)
28
+ end
29
+
30
+ def test_should_have_a_nil_initial_state
31
+ assert_nil @machine.initial_state(@object).value
32
+ end
33
+
34
+ def test_should_not_have_any_events
35
+ refute @machine.events.any?
36
+ end
37
+
38
+ def test_should_not_have_any_before_callbacks
39
+ assert @machine.callbacks[:before].empty?
40
+ end
41
+
42
+ def test_should_not_have_any_after_callbacks
43
+ assert @machine.callbacks[:after].empty?
44
+ end
45
+
46
+ def test_should_not_have_any_failure_callbacks
47
+ assert @machine.callbacks[:failure].empty?
48
+ end
49
+
50
+ def test_should_not_have_an_action
51
+ assert_nil @machine.action
52
+ end
53
+
54
+ def test_should_use_tranactions
55
+ assert_equal true, @machine.use_transactions
56
+ end
57
+
58
+ def test_should_not_have_a_namespace
59
+ assert_nil @machine.namespace
60
+ end
61
+
62
+ def test_should_have_a_nil_state
63
+ assert_equal [nil], @machine.states.keys
64
+ end
65
+
66
+ def test_should_set_initial_on_nil_state
67
+ assert @machine.state(nil).initial
68
+ end
69
+
70
+ def test_should_generate_default_messages
71
+ assert_equal 'is invalid', @machine.generate_message(:invalid)
72
+ assert_equal 'cannot transition when parked', @machine.generate_message(:invalid_event, [[:state, :parked]])
73
+ assert_equal 'cannot transition via "park"', @machine.generate_message(:invalid_transition, [[:event, :park]])
74
+ end
75
+
76
+ def test_should_define_a_reader_attribute_for_the_attribute
77
+ assert @object.respond_to?(:state)
78
+ end
79
+
80
+ def test_should_define_a_writer_attribute_for_the_attribute
81
+ assert @object.respond_to?(:state=)
82
+ end
83
+
84
+ def test_should_define_a_predicate_for_the_attribute
85
+ assert @object.respond_to?(:state?)
86
+ end
87
+
88
+ def test_should_define_a_name_reader_for_the_attribute
89
+ assert @object.respond_to?(:state_name)
90
+ end
91
+
92
+ def test_should_define_an_event_reader_for_the_attribute
93
+ assert @object.respond_to?(:state_events)
94
+ end
95
+
96
+ def test_should_define_a_transition_reader_for_the_attribute
97
+ assert @object.respond_to?(:state_transitions)
98
+ end
99
+
100
+ def test_should_define_a_path_reader_for_the_attribute
101
+ assert @object.respond_to?(:state_paths)
102
+ end
103
+
104
+ def test_should_define_an_event_runner_for_the_attribute
105
+ assert @object.respond_to?(:fire_state_event)
106
+ end
107
+
108
+ def test_should_not_define_an_event_attribute_reader
109
+ refute @object.respond_to?(:state_event)
110
+ end
111
+
112
+ def test_should_not_define_an_event_attribute_writer
113
+ refute @object.respond_to?(:state_event=)
114
+ end
115
+
116
+ def test_should_not_define_an_event_transition_attribute_reader
117
+ refute @object.respond_to?(:state_event_transition)
118
+ end
119
+
120
+ def test_should_not_define_an_event_transition_attribute_writer
121
+ refute @object.respond_to?(:state_event_transition=)
122
+ end
123
+
124
+ def test_should_define_a_human_attribute_name_reader_for_the_attribute
125
+ assert @klass.respond_to?(:human_state_name)
126
+ end
127
+
128
+ def test_should_define_a_human_event_name_reader_for_the_attribute
129
+ assert @klass.respond_to?(:human_state_event_name)
130
+ end
131
+
132
+ def test_should_not_define_singular_with_scope
133
+ refute @klass.respond_to?(:with_state)
134
+ end
135
+
136
+ def test_should_not_define_singular_without_scope
137
+ refute @klass.respond_to?(:without_state)
138
+ end
139
+
140
+ def test_should_not_define_plural_with_scope
141
+ refute @klass.respond_to?(:with_states)
142
+ end
143
+
144
+ def test_should_not_define_plural_without_scope
145
+ refute @klass.respond_to?(:without_states)
146
+ end
147
+
148
+ def test_should_extend_owner_class_with_class_methods
149
+ assert((class << @klass; ancestors; end).include?(StateMachines::ClassMethods))
150
+ end
151
+
152
+ def test_should_include_instance_methods_in_owner_class
153
+ assert @klass.included_modules.include?(StateMachines::InstanceMethods)
154
+ end
155
+
156
+ def test_should_define_state_machines_reader
157
+ expected = { state: @machine }
158
+ assert_equal expected, @klass.state_machines
159
+ end
160
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineFinderCustomOptionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.find_or_create(@klass, :status, initial: :parked)
7
+ @object = @klass.new
8
+ end
9
+
10
+ def test_should_use_custom_attribute
11
+ assert_equal :status, @machine.attribute
12
+ end
13
+
14
+ def test_should_set_custom_initial_state
15
+ assert_equal :parked, @machine.initial_state(@object).name
16
+ end
17
+ end
@@ -0,0 +1,86 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineFinderWithExistingMachineOnSuperclassTest < StateMachinesTest
4
+ def setup
5
+ integration = Module.new do
6
+ include StateMachines::Integrations::Base
7
+
8
+ def self.matches?(_klass)
9
+ false
10
+ end
11
+ end
12
+ StateMachines::Integrations.const_set('Custom', integration)
13
+ StateMachines::Integrations.register(StateMachines::Integrations::Custom)
14
+
15
+ @base_class = Class.new
16
+ @base_machine = StateMachines::Machine.new(@base_class, :status, action: :save, integration: :custom)
17
+ @base_machine.event(:ignite) {}
18
+ @base_machine.before_transition(-> {})
19
+ @base_machine.after_transition(-> {})
20
+ @base_machine.around_transition(-> {})
21
+
22
+ @klass = Class.new(@base_class)
23
+ @machine = StateMachines::Machine.find_or_create(@klass, :status) {}
24
+ end
25
+
26
+ def test_should_accept_a_block
27
+ called = false
28
+ StateMachines::Machine.find_or_create(Class.new(@base_class)) do
29
+ called = respond_to?(:event)
30
+ end
31
+
32
+ assert called
33
+ end
34
+
35
+ def test_should_not_create_a_new_machine_if_no_block_or_options
36
+ machine = StateMachines::Machine.find_or_create(Class.new(@base_class), :status)
37
+
38
+ assert_same machine, @base_machine
39
+ end
40
+
41
+ def test_should_create_a_new_machine_if_given_options
42
+ machine = StateMachines::Machine.find_or_create(@klass, :status, initial: :parked)
43
+
44
+ refute_nil machine
45
+ refute_same machine, @base_machine
46
+ end
47
+
48
+ def test_should_create_a_new_machine_if_given_block
49
+ refute_nil @machine
50
+ refute_same @machine, @base_machine
51
+ end
52
+
53
+ def test_should_copy_the_base_attribute
54
+ assert_equal :status, @machine.attribute
55
+ end
56
+
57
+ def test_should_copy_the_base_configuration
58
+ assert_equal :save, @machine.action
59
+ end
60
+
61
+ def test_should_copy_events
62
+ # Can't assert equal arrays since their machines change
63
+ assert_equal 1, @machine.events.length
64
+ end
65
+
66
+ def test_should_copy_before_callbacks
67
+ assert_equal @base_machine.callbacks[:before], @machine.callbacks[:before]
68
+ end
69
+
70
+ def test_should_copy_after_transitions
71
+ assert_equal @base_machine.callbacks[:after], @machine.callbacks[:after]
72
+ end
73
+
74
+ def test_should_use_the_same_integration
75
+ class_ancestors = class << @machine
76
+ ancestors
77
+ end
78
+
79
+ assert(class_ancestors.include?(StateMachines::Integrations::Custom))
80
+ end
81
+
82
+ def teardown
83
+ StateMachines::Integrations.reset
84
+ StateMachines::Integrations.send(:remove_const, 'Custom')
85
+ end
86
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineFinderWithExistingOnSameClassTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @existing_machine = StateMachines::Machine.new(@klass)
7
+ @machine = StateMachines::Machine.find_or_create(@klass)
8
+ end
9
+
10
+ def test_should_accept_a_block
11
+ called = false
12
+ StateMachines::Machine.find_or_create(@klass) do
13
+ called = respond_to?(:event)
14
+ end
15
+
16
+ assert called
17
+ end
18
+
19
+ def test_should_not_create_a_new_machine
20
+ assert_same @machine, @existing_machine
21
+ end
22
+ end
23
+
@@ -0,0 +1,25 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineFinderWithoutExistingMachineTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.find_or_create(@klass)
7
+ end
8
+
9
+ def test_should_accept_a_block
10
+ called = false
11
+ StateMachines::Machine.find_or_create(Class.new) do
12
+ called = respond_to?(:event)
13
+ end
14
+
15
+ assert called
16
+ end
17
+
18
+ def test_should_create_a_new_machine
19
+ refute_nil @machine
20
+ end
21
+
22
+ def test_should_use_default_state
23
+ assert_equal :state, @machine.attribute
24
+ end
25
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachinePersistenceTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_accessor :state_event
7
+ end
8
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
9
+ @object = @klass.new
10
+ end
11
+
12
+ def test_should_allow_reading_state
13
+ assert_equal 'parked', @machine.read(@object, :state)
14
+ end
15
+
16
+ def test_should_allow_reading_custom_attributes
17
+ assert_nil @machine.read(@object, :event)
18
+
19
+ @object.state_event = 'ignite'
20
+ assert_equal 'ignite', @machine.read(@object, :event)
21
+ end
22
+
23
+ def test_should_allow_reading_custom_instance_variables
24
+ @klass.class_eval do
25
+ attr_writer :state_value
26
+ end
27
+
28
+ @object.state_value = 1
29
+ assert_raises(NoMethodError) { @machine.read(@object, :value) }
30
+ assert_equal 1, @machine.read(@object, :value, true)
31
+ end
32
+
33
+ def test_should_allow_writing_state
34
+ @machine.write(@object, :state, 'idling')
35
+ assert_equal 'idling', @object.state
36
+ end
37
+
38
+ def test_should_allow_writing_custom_attributes
39
+ @machine.write(@object, :event, 'ignite')
40
+ assert_equal 'ignite', @object.state_event
41
+ end
42
+
43
+ def test_should_allow_writing_custom_instance_variables
44
+ @klass.class_eval do
45
+ attr_reader :state_value
46
+ end
47
+
48
+ assert_raises(NoMethodError) { @machine.write(@object, :value, 1) }
49
+ assert_equal 1, @machine.write(@object, :value, 1, true)
50
+ assert_equal 1, @object.state_value
51
+ end
52
+ end
@@ -0,0 +1,56 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineStateInitializationTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, :state, initial: :parked, initialize: false)
7
+
8
+ @object = @klass.new
9
+ @object.state = nil
10
+ end
11
+
12
+ def test_should_set_states_if_nil
13
+ @machine.initialize_state(@object)
14
+
15
+ assert_equal 'parked', @object.state
16
+ end
17
+
18
+ def test_should_set_states_if_empty
19
+ @object.state = ''
20
+ @machine.initialize_state(@object)
21
+
22
+ assert_equal 'parked', @object.state
23
+ end
24
+
25
+ def test_should_not_set_states_if_not_empty
26
+ @object.state = 'idling'
27
+ @machine.initialize_state(@object)
28
+
29
+ assert_equal 'idling', @object.state
30
+ end
31
+
32
+ def test_should_set_states_if_not_empty_and_forced
33
+ @object.state = 'idling'
34
+ @machine.initialize_state(@object, force: true)
35
+
36
+ assert_equal 'parked', @object.state
37
+ end
38
+
39
+ def test_should_not_set_state_if_nil_and_nil_is_valid_state
40
+ @machine.state :initial, value: nil
41
+ @machine.initialize_state(@object)
42
+
43
+ assert_nil @object.state
44
+ end
45
+
46
+ def test_should_write_to_hash_if_specified
47
+ @machine.initialize_state(@object, to: hash = {})
48
+ assert_equal({ 'state' => 'parked' }, hash)
49
+ end
50
+
51
+ def test_should_not_write_to_object_if_writing_to_hash
52
+ @machine.initialize_state(@object, to: {})
53
+ assert_nil @object.state
54
+ end
55
+ end
56
+
@@ -0,0 +1,30 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineTest < StateMachinesTest
4
+ def test_should_raise_exception_if_invalid_option_specified
5
+ assert_raises(ArgumentError) { StateMachines::Machine.new(Class.new, invalid: true) }
6
+ end
7
+
8
+ def test_should_not_raise_exception_if_custom_messages_specified
9
+ StateMachines::Machine.new(Class.new, messages: { invalid_transition: 'custom' })
10
+ end
11
+
12
+ def test_should_evaluate_a_block_during_initialization
13
+ called = true
14
+ StateMachines::Machine.new(Class.new) do
15
+ called = respond_to?(:event)
16
+ end
17
+
18
+ assert called
19
+ end
20
+
21
+ def test_should_provide_matcher_helpers_during_initialization
22
+ matchers = []
23
+
24
+ StateMachines::Machine.new(Class.new) do
25
+ matchers = [all, any, same]
26
+ end
27
+
28
+ assert_equal [StateMachines::AllMatcher.instance, StateMachines::AllMatcher.instance, StateMachines::LoopbackMatcher.instance], matchers
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithActionAlreadyOverriddenTest < StateMachinesTest
4
+ def setup
5
+ @superclass = Class.new do
6
+ def save
7
+ end
8
+ end
9
+ @klass = Class.new(@superclass)
10
+
11
+ StateMachines::Machine.new(@klass, action: :save)
12
+ @machine = StateMachines::Machine.new(@klass, :status, action: :save)
13
+ @object = @klass.new
14
+ end
15
+
16
+ def test_should_not_redefine_action
17
+ assert_equal 1, @klass.ancestors.select { |ancestor| ![@klass, @superclass].include?(ancestor) && ancestor.method_defined?(:save) }.length
18
+ end
19
+
20
+ def test_should_mark_action_hook_as_defined
21
+ assert @machine.action_hook?
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithActionDefinedInClassTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ def save
7
+ end
8
+ end
9
+
10
+ @machine = StateMachines::Machine.new(@klass, action: :save)
11
+ @object = @klass.new
12
+ end
13
+
14
+ def test_should_define_an_event_attribute_reader
15
+ assert @object.respond_to?(:state_event)
16
+ end
17
+
18
+ def test_should_define_an_event_attribute_writer
19
+ assert @object.respond_to?(:state_event=)
20
+ end
21
+
22
+ def test_should_define_an_event_transition_attribute_reader
23
+ assert @object.respond_to?(:state_event_transition, true)
24
+ end
25
+
26
+ def test_should_define_an_event_transition_attribute_writer
27
+ assert @object.respond_to?(:state_event_transition=, true)
28
+ end
29
+
30
+ def test_should_not_define_action
31
+ refute @klass.ancestors.any? { |ancestor| ancestor != @klass && ancestor.method_defined?(:save) }
32
+ end
33
+
34
+ def test_should_not_mark_action_hook_as_defined
35
+ refute @machine.action_hook?
36
+ end
37
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class MachineWithActionDefinedInIncludedModuleTest < StateMachinesTest
4
+ def setup
5
+ @mod = mod = Module.new do
6
+ def save
7
+ end
8
+ end
9
+
10
+ @klass = Class.new do
11
+ include mod
12
+ end
13
+
14
+ @machine = StateMachines::Machine.new(@klass, action: :save)
15
+ @object = @klass.new
16
+ end
17
+
18
+ def test_should_define_an_event_attribute_reader
19
+ assert @object.respond_to?(:state_event)
20
+ end
21
+
22
+ def test_should_define_an_event_attribute_writer
23
+ assert @object.respond_to?(:state_event=)
24
+ end
25
+
26
+ def test_should_define_an_event_transition_attribute_reader
27
+ assert @object.respond_to?(:state_event_transition, true)
28
+ end
29
+
30
+ def test_should_define_an_event_transition_attribute_writer
31
+ assert @object.respond_to?(:state_event_transition=, true)
32
+ end
33
+
34
+ def test_should_define_action
35
+ assert @klass.ancestors.any? { |ancestor| ![@klass, @mod].include?(ancestor) && ancestor.method_defined?(:save) }
36
+ end
37
+
38
+ def test_should_keep_action_public
39
+ assert @klass.public_method_defined?(:save)
40
+ end
41
+
42
+ def test_should_mark_action_hook_as_defined
43
+ assert @machine.action_hook?
44
+ end
45
+ end
46
+