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,29 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateCollectionWithStateMatchersTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass)
7
+ @states = StateMachines::StateCollection.new(@machine)
8
+
9
+ @states << @state = StateMachines::State.new(@machine, :parked, if: lambda { |value| !value.nil? })
10
+ @machine.states.concat(@states)
11
+
12
+ @object = @klass.new
13
+ @object.state = 1
14
+ end
15
+
16
+ def test_should_match_if_value_matches
17
+ assert @states.matches?(@object, :parked)
18
+ end
19
+
20
+ def test_should_not_match_if_value_does_not_match
21
+ @object.state = nil
22
+ refute @states.matches?(@object, :parked)
23
+ end
24
+
25
+ def test_should_find_state_for_object_if_value_is_known
26
+ assert_equal @state, @states.match(@object)
27
+ end
28
+ end
29
+
@@ -0,0 +1,40 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateCollectionWithTransitionCallbacksTest < StateMachinesTest
4
+ def setup
5
+ @machine = StateMachines::Machine.new(Class.new)
6
+ @states = StateMachines::StateCollection.new(@machine)
7
+
8
+ @states << @parked = StateMachines::State.new(@machine, :parked)
9
+ @states << @idling = StateMachines::State.new(@machine, :idling)
10
+ @machine.states.concat(@states)
11
+
12
+ @machine.before_transition to: :idling, do: lambda {}
13
+ end
14
+
15
+ def test_should_order_states_after_initial_state
16
+ @parked.initial = true
17
+ assert_equal [@parked, @idling], @states.by_priority
18
+ end
19
+
20
+ def test_should_order_states_after_transition_states
21
+ @machine.event :ignite do
22
+ transition from: :parked
23
+ end
24
+ assert_equal [@parked, @idling], @states.by_priority
25
+ end
26
+
27
+ def test_should_order_states_after_states_with_behaviors
28
+ @parked.context do
29
+ def speed
30
+ 0
31
+ end
32
+ end
33
+ assert_equal [@parked, @idling], @states.by_priority
34
+ end
35
+
36
+ def test_should_order_states_after_other_states
37
+ assert_equal [@parked, @idling], @states.by_priority
38
+ end
39
+ end
40
+
@@ -0,0 +1,26 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ end
11
+
12
+ def test_should_call_class_with_same_arguments
13
+ options = {}
14
+ validation = @state_context.validate(:name, options)
15
+
16
+ assert_equal [:name, options], validation
17
+ end
18
+
19
+ def test_should_pass_block_through_to_class
20
+ options = {}
21
+ proxy_block = lambda {}
22
+ validation = @state_context.validate(:name, options, &proxy_block)
23
+
24
+ assert_equal [:name, options, proxy_block], validation
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithIfAndUnlessConditionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @if_condition_result = nil
13
+ @unless_condition_result = nil
14
+ @options = @state_context.validate(if: lambda { @if_condition_result }, unless: lambda { @unless_condition_result })[0]
15
+ end
16
+
17
+ def test_should_be_false_if_if_condition_is_false
18
+ @if_condition_result = false
19
+ @unless_condition_result = false
20
+ refute @options[:if].call(@object)
21
+
22
+ @if_condition_result = false
23
+ @unless_condition_result = true
24
+ refute @options[:if].call(@object)
25
+ end
26
+
27
+ def test_should_be_false_if_unless_condition_is_true
28
+ @if_condition_result = false
29
+ @unless_condition_result = true
30
+ refute @options[:if].call(@object)
31
+
32
+ @if_condition_result = true
33
+ @unless_condition_result = true
34
+ refute @options[:if].call(@object)
35
+ end
36
+
37
+ def test_should_be_true_if_if_condition_is_true_and_unless_condition_is_false
38
+ @if_condition_result = true
39
+ @unless_condition_result = false
40
+ assert @options[:if].call(@object)
41
+ end
42
+ end
@@ -0,0 +1,64 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithIfConditionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @condition_result = nil
13
+ @options = @state_context.validate(if: lambda { @condition_result })[0]
14
+ end
15
+
16
+ def test_should_have_if_option
17
+ refute_nil @options[:if]
18
+ end
19
+
20
+ def test_should_be_false_if_state_is_different
21
+ @object.state = nil
22
+ refute @options[:if].call(@object)
23
+ end
24
+
25
+ def test_should_be_false_if_original_condition_is_false
26
+ @condition_result = false
27
+ refute @options[:if].call(@object)
28
+ end
29
+
30
+ def test_should_be_true_if_state_matches_and_original_condition_is_true
31
+ @condition_result = true
32
+ assert @options[:if].call(@object)
33
+ end
34
+
35
+ def test_should_evaluate_symbol_condition
36
+ @klass.class_eval do
37
+ attr_accessor :callback
38
+ end
39
+
40
+ options = @state_context.validate(if: :callback)[0]
41
+
42
+ object = @klass.new
43
+ object.callback = false
44
+ refute options[:if].call(object)
45
+
46
+ object.callback = true
47
+ assert options[:if].call(object)
48
+ end
49
+
50
+ def test_should_evaluate_string_condition
51
+ @klass.class_eval do
52
+ attr_accessor :callback
53
+ end
54
+
55
+ options = @state_context.validate(if: '@callback')[0]
56
+
57
+ object = @klass.new
58
+ object.callback = false
59
+ refute options[:if].call(object)
60
+
61
+ object.callback = true
62
+ assert options[:if].call(object)
63
+ end
64
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithMultipleIfConditionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @first_condition_result = nil
13
+ @second_condition_result = nil
14
+ @options = @state_context.validate(if: [lambda { @first_condition_result }, lambda { @second_condition_result }])[0]
15
+ end
16
+
17
+ def test_should_be_true_if_all_conditions_are_true
18
+ @first_condition_result = true
19
+ @second_condition_result = true
20
+ assert @options[:if].call(@object)
21
+ end
22
+
23
+ def test_should_be_false_if_any_condition_is_false
24
+ @first_condition_result = true
25
+ @second_condition_result = false
26
+ refute @options[:if].call(@object)
27
+
28
+ @first_condition_result = false
29
+ @second_condition_result = true
30
+ refute @options[:if].call(@object)
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithMultipleUnlessConditionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @first_condition_result = nil
13
+ @second_condition_result = nil
14
+ @options = @state_context.validate(unless: [-> { @first_condition_result }, lambda { @second_condition_result }])[0]
15
+ end
16
+
17
+ def test_should_be_true_if_all_conditions_are_false
18
+ @first_condition_result = false
19
+ @second_condition_result = false
20
+ assert @options[:if].call(@object)
21
+ end
22
+
23
+ def test_should_be_false_if_any_condition_is_true
24
+ @first_condition_result = true
25
+ @second_condition_result = false
26
+ refute @options[:if].call(@object)
27
+
28
+ @first_condition_result = false
29
+ @second_condition_result = true
30
+ refute @options[:if].call(@object)
31
+ end
32
+ end
@@ -0,0 +1,64 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithUnlessConditionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @condition_result = nil
13
+ @options = @state_context.validate(unless: lambda { @condition_result })[0]
14
+ end
15
+
16
+ def test_should_have_if_option
17
+ refute_nil @options[:if]
18
+ end
19
+
20
+ def test_should_be_false_if_state_is_different
21
+ @object.state = nil
22
+ refute @options[:if].call(@object)
23
+ end
24
+
25
+ def test_should_be_false_if_original_condition_is_true
26
+ @condition_result = true
27
+ refute @options[:if].call(@object)
28
+ end
29
+
30
+ def test_should_be_true_if_state_matches_and_original_condition_is_false
31
+ @condition_result = false
32
+ assert @options[:if].call(@object)
33
+ end
34
+
35
+ def test_should_evaluate_symbol_condition
36
+ @klass.class_eval do
37
+ attr_accessor :callback
38
+ end
39
+
40
+ options = @state_context.validate(unless: :callback)[0]
41
+
42
+ object = @klass.new
43
+ object.callback = true
44
+ refute options[:if].call(object)
45
+
46
+ object.callback = false
47
+ assert options[:if].call(object)
48
+ end
49
+
50
+ def test_should_evaluate_string_condition
51
+ @klass.class_eval do
52
+ attr_accessor :callback
53
+ end
54
+
55
+ options = @state_context.validate(unless: '@callback')[0]
56
+
57
+ object = @klass.new
58
+ object.callback = true
59
+ refute options[:if].call(object)
60
+
61
+ object.callback = false
62
+ assert options[:if].call(object)
63
+ end
64
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextProxyWithoutConditionsTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new(Validateable)
6
+ machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ state = machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(state)
10
+ @object = @klass.new
11
+
12
+ @options = @state_context.validate[0]
13
+ end
14
+
15
+ def test_should_have_options_configuration
16
+ assert_instance_of Hash, @options
17
+ end
18
+
19
+ def test_should_have_if_option
20
+ refute_nil @options[:if]
21
+ end
22
+
23
+ def test_should_be_false_if_state_is_different
24
+ @object.state = nil
25
+ refute @options[:if].call(@object)
26
+ end
27
+
28
+ def test_should_be_true_if_state_matches
29
+ assert @options[:if].call(@object)
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class Validateable
4
+ class << self
5
+ def validate(*args, &block)
6
+ args << block if block_given?
7
+ args
8
+ end
9
+ end
10
+ end
11
+
12
+ class StateContextTest < StateMachinesTest
13
+ def setup
14
+ @klass = Class.new(Validateable)
15
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
16
+ @state = @machine.state :parked
17
+
18
+ @state_context = StateMachines::StateContext.new(@state)
19
+ end
20
+
21
+ def test_should_have_a_machine
22
+ assert_equal @machine, @state_context.machine
23
+ end
24
+
25
+ def test_should_have_a_state
26
+ assert_equal @state, @state_context.state
27
+ end
28
+ end
@@ -0,0 +1,104 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextTransitionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @state = @machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(@state)
10
+ end
11
+
12
+ def test_should_not_allow_except_to
13
+ exception = assert_raises(ArgumentError) { @state_context.transition(except_to: :idling) }
14
+ assert_equal 'Unknown key: :except_to. Valid keys are: :from, :to, :on, :if, :unless', exception.message
15
+ end
16
+
17
+ def test_should_not_allow_except_from
18
+ exception = assert_raises(ArgumentError) { @state_context.transition(except_from: :idling) }
19
+ assert_equal 'Unknown key: :except_from. Valid keys are: :from, :to, :on, :if, :unless', exception.message
20
+ end
21
+
22
+ def test_should_not_allow_implicit_transitions
23
+ exception = assert_raises(ArgumentError) { @state_context.transition(parked: :idling) }
24
+ assert_equal 'Unknown key: :parked. Valid keys are: :from, :to, :on, :if, :unless', exception.message
25
+ end
26
+
27
+ def test_should_not_allow_except_on
28
+ exception = assert_raises(ArgumentError) { @state_context.transition(except_on: :park) }
29
+ assert_equal 'Unknown key: :except_on. Valid keys are: :from, :to, :on, :if, :unless', exception.message
30
+ end
31
+
32
+ def test_should_require_on_event
33
+ exception = assert_raises(ArgumentError) { @state_context.transition(to: :idling) }
34
+ assert_equal 'Must specify :on event', exception.message
35
+ end
36
+
37
+ def test_should_not_allow_missing_from_and_to
38
+ exception = assert_raises(ArgumentError) { @state_context.transition(on: :ignite) }
39
+ assert_equal 'Must specify either :to or :from state', exception.message
40
+ end
41
+
42
+ def test_should_not_allow_from_and_to
43
+ exception = assert_raises(ArgumentError) { @state_context.transition(on: :ignite, from: :parked, to: :idling) }
44
+ assert_equal 'Must specify either :to or :from state', exception.message
45
+ end
46
+
47
+ def test_should_allow_to_state_if_missing_from_state
48
+ @state_context.transition(on: :park, from: :parked)
49
+ end
50
+
51
+ def test_should_allow_from_state_if_missing_to_state
52
+ @state_context.transition(on: :ignite, to: :idling)
53
+ end
54
+
55
+ def test_should_automatically_set_to_option_with_from_state
56
+ branch = @state_context.transition(from: :idling, on: :park)
57
+ assert_instance_of StateMachines::Branch, branch
58
+
59
+ state_requirements = branch.state_requirements
60
+ assert_equal 1, state_requirements.length
61
+
62
+ from_requirement = state_requirements[0][:to]
63
+ assert_instance_of StateMachines::WhitelistMatcher, from_requirement
64
+ assert_equal [:parked], from_requirement.values
65
+ end
66
+
67
+ def test_should_automatically_set_from_option_with_to_state
68
+ branch = @state_context.transition(to: :idling, on: :ignite)
69
+ assert_instance_of StateMachines::Branch, branch
70
+
71
+ state_requirements = branch.state_requirements
72
+ assert_equal 1, state_requirements.length
73
+
74
+ from_requirement = state_requirements[0][:from]
75
+ assert_instance_of StateMachines::WhitelistMatcher, from_requirement
76
+ assert_equal [:parked], from_requirement.values
77
+ end
78
+
79
+ def test_should_allow_if_condition
80
+ @state_context.transition(to: :idling, on: :park, if: :seatbelt_on?)
81
+ end
82
+
83
+ def test_should_allow_unless_condition
84
+ @state_context.transition(to: :idling, on: :park, unless: :seatbelt_off?)
85
+ end
86
+
87
+ def test_should_include_all_transition_states_in_machine_states
88
+ @state_context.transition(to: :idling, on: :ignite)
89
+
90
+ assert_equal [:parked, :idling], @machine.states.map { |state| state.name }
91
+ end
92
+
93
+ def test_should_include_all_transition_events_in_machine_events
94
+ @state_context.transition(to: :idling, on: :ignite)
95
+
96
+ assert_equal [:ignite], @machine.events.map { |event| event.name }
97
+ end
98
+
99
+ def test_should_allow_multiple_events
100
+ @state_context.transition(to: :idling, on: [:ignite, :shift_up])
101
+
102
+ assert_equal [:ignite, :shift_up], @machine.events.map { |event| event.name }
103
+ end
104
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateContextWithMatchingTransitionTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, initial: :parked)
7
+ @state = @machine.state :parked
8
+
9
+ @state_context = StateMachines::StateContext.new(@state)
10
+ @state_context.transition(to: :idling, on: :ignite)
11
+
12
+ @event = @machine.event(:ignite)
13
+ @object = @klass.new
14
+ end
15
+
16
+ def test_should_be_able_to_fire
17
+ assert @event.can_fire?(@object)
18
+ end
19
+
20
+ def test_should_have_a_transition
21
+ transition = @event.transition_for(@object)
22
+ refute_nil transition
23
+ assert_equal 'parked', transition.from
24
+ assert_equal 'idling', transition.to
25
+ assert_equal :ignite, transition.event
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateMachineByDefaultTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = @klass.state_machine
7
+ end
8
+
9
+ def test_should_use_state_attribute
10
+ assert_equal :state, @machine.attribute
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class StateMachineTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ end
7
+
8
+ def test_should_allow_state_machines_on_any_class
9
+ assert @klass.respond_to?(:state_machine)
10
+ end
11
+
12
+ def test_should_evaluate_block_within_machine_context
13
+ responded = false
14
+ @klass.state_machine(:state) do
15
+ responded = respond_to?(:event)
16
+ end
17
+
18
+ assert responded
19
+ end
20
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionAfterBeingPerformedTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new do
6
+ attr_reader :saved, :save_state
7
+
8
+ def save
9
+ @save_state = state
10
+ @saved = true
11
+ 1
12
+ end
13
+ end
14
+
15
+ @machine = StateMachines::Machine.new(@klass, action: :save)
16
+ @machine.state :parked, :idling
17
+ @machine.event :ignite
18
+
19
+ @object = @klass.new
20
+ @object.state = 'parked'
21
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
22
+ @result = @transition.perform
23
+ end
24
+
25
+ def test_should_have_empty_args
26
+ assert_equal [], @transition.args
27
+ end
28
+
29
+ def test_should_have_a_result
30
+ assert_equal 1, @transition.result
31
+ end
32
+
33
+ def test_should_be_successful
34
+ assert_equal true, @result
35
+ end
36
+
37
+ def test_should_change_the_current_state
38
+ assert_equal 'idling', @object.state
39
+ end
40
+
41
+ def test_should_run_the_action
42
+ assert @object.saved
43
+ end
44
+
45
+ def test_should_run_the_action_after_saving_the_state
46
+ assert_equal 'idling', @object.save_state
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionAfterBeingPersistedTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, action: :save)
7
+ @machine.state :parked, :idling
8
+ @machine.event :ignite
9
+
10
+ @object = @klass.new
11
+ @object.state = 'parked'
12
+
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ @transition.persist
15
+ end
16
+
17
+ def test_should_update_state_value
18
+ assert_equal 'idling', @object.state
19
+ end
20
+
21
+ def test_should_not_change_from_state
22
+ assert_equal 'parked', @transition.from
23
+ end
24
+
25
+ def test_should_not_change_to_state
26
+ assert_equal 'idling', @transition.to
27
+ end
28
+
29
+ def test_should_not_be_able_to_persist_twice
30
+ @object.state = 'parked'
31
+ @transition.persist
32
+ assert_equal 'parked', @object.state
33
+ end
34
+
35
+ def test_should_be_able_to_persist_again_after_resetting
36
+ @object.state = 'parked'
37
+ @transition.reset
38
+ @transition.persist
39
+ assert_equal 'idling', @object.state
40
+ end
41
+
42
+ def test_should_revert_to_from_state_on_rollback
43
+ @transition.rollback
44
+ assert_equal 'parked', @object.state
45
+ end
46
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class TransitionAfterBeingRolledBackTest < StateMachinesTest
4
+ def setup
5
+ @klass = Class.new
6
+ @machine = StateMachines::Machine.new(@klass, action: :save)
7
+ @machine.state :parked, :idling
8
+ @machine.event :ignite
9
+
10
+ @object = @klass.new
11
+ @object.state = 'parked'
12
+
13
+ @transition = StateMachines::Transition.new(@object, @machine, :ignite, :parked, :idling)
14
+ @object.state = 'idling'
15
+
16
+ @transition.rollback
17
+ end
18
+
19
+ def test_should_update_state_value_to_from_state
20
+ assert_equal 'parked', @object.state
21
+ end
22
+
23
+ def test_should_not_change_from_state
24
+ assert_equal 'parked', @transition.from
25
+ end
26
+
27
+ def test_should_not_change_to_state
28
+ assert_equal 'idling', @transition.to
29
+ end
30
+
31
+ def test_should_still_be_able_to_persist
32
+ @transition.persist
33
+ assert_equal 'idling', @object.state
34
+ end
35
+ end