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.
- checksums.yaml +4 -4
- data/.travis.yml +10 -4
- data/Changelog.md +0 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +6 -8
- data/Rakefile +9 -6
- data/Testing.md +0 -0
- data/lib/state_machines/assertions.rb +5 -5
- data/lib/state_machines/error.rb +2 -1
- data/lib/state_machines/integrations.rb +18 -11
- data/lib/state_machines/machine.rb +8 -12
- data/lib/state_machines/version.rb +1 -1
- data/state_machines.gemspec +6 -8
- data/test/files/integrations/event_on_failure_integration.rb +10 -0
- data/test/files/integrations/vehicle.rb +7 -0
- data/{spec/internal/app → test/files}/models/auto_shop.rb +0 -0
- data/{spec/internal/app → test/files}/models/car.rb +2 -0
- data/{spec/internal/app → test/files}/models/model_base.rb +0 -0
- data/{spec/internal/app → test/files}/models/motorcycle.rb +2 -0
- data/{spec/internal/app → test/files}/models/traffic_light.rb +2 -2
- data/{spec/internal/app → test/files}/models/vehicle.rb +9 -5
- data/test/files/node.rb +5 -0
- data/test/files/switch.rb +15 -0
- data/test/functional/auto_shop_available_test.rb +20 -0
- data/test/functional/auto_shop_busy_test.rb +25 -0
- data/test/functional/car_backing_up_test.rb +45 -0
- data/test/functional/car_test.rb +49 -0
- data/test/functional/motorcycle_test.rb +46 -0
- data/test/functional/traffic_light_caution_test.rb +17 -0
- data/test/functional/traffic_light_proceed_test.rb +17 -0
- data/test/functional/traffic_light_stop_test.rb +26 -0
- data/test/functional/vehicle_first_gear_test.rb +42 -0
- data/test/functional/vehicle_idling_test.rb +59 -0
- data/test/functional/vehicle_locked_test.rb +29 -0
- data/test/functional/vehicle_parked_test.rb +53 -0
- data/test/functional/vehicle_repaired_test.rb +20 -0
- data/test/functional/vehicle_second_gear_test.rb +42 -0
- data/test/functional/vehicle_stalled_test.rb +65 -0
- data/test/functional/vehicle_test.rb +20 -0
- data/test/functional/vehicle_third_gear_test.rb +42 -0
- data/test/functional/vehicle_unsaved_test.rb +181 -0
- data/test/functional/vehicle_with_event_attributes_test.rb +30 -0
- data/test/functional/vehicle_with_parallel_events_test.rb +36 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/assertions/assert_exclusive_keys_test.rb +22 -0
- data/test/unit/assertions/assert_valid_key_test.rb +12 -0
- data/test/unit/branch/branch_test.rb +28 -0
- data/test/unit/branch/branch_with_conflicting_conditionals_test.rb +27 -0
- data/test/unit/branch/branch_with_conflicting_from_requirements_test.rb +8 -0
- data/test/unit/branch/branch_with_conflicting_on_requirements_test.rb +8 -0
- data/test/unit/branch/branch_with_conflicting_to_requirements_test.rb +8 -0
- data/test/unit/branch/branch_with_different_requirements_test.rb +41 -0
- data/test/unit/branch/branch_with_except_from_matcher_requirement_test.rb +8 -0
- data/test/unit/branch/branch_with_except_from_requirement_test.rb +36 -0
- data/test/unit/branch/branch_with_except_on_matcher_requirement_test.rb +8 -0
- data/test/unit/branch/branch_with_except_on_requirement_test.rb +36 -0
- data/test/unit/branch/branch_with_except_to_matcher_requirement_test.rb +8 -0
- data/test/unit/branch/branch_with_except_to_requirement_test.rb +36 -0
- data/test/unit/branch/branch_with_from_matcher_requirement_test.rb +20 -0
- data/test/unit/branch/branch_with_from_requirement_test.rb +45 -0
- data/test/unit/branch/branch_with_if_conditional_test.rb +27 -0
- data/test/unit/branch/branch_with_implicit_and_explicit_requirements_test.rb +23 -0
- data/test/unit/branch/branch_with_implicit_from_requirement_matcher_test.rb +20 -0
- data/test/unit/branch/branch_with_implicit_requirement_test.rb +20 -0
- data/test/unit/branch/branch_with_implicit_to_requirement_matcher_test.rb +16 -0
- data/test/unit/branch/branch_with_multiple_except_from_requirements_test.rb +20 -0
- data/test/unit/branch/branch_with_multiple_except_on_requirements_test.rb +16 -0
- data/test/unit/branch/branch_with_multiple_except_to_requirements_test.rb +20 -0
- data/test/unit/branch/branch_with_multiple_from_requirements_test.rb +16 -0
- data/test/unit/branch/branch_with_multiple_if_conditionals_test.rb +20 -0
- data/test/unit/branch/branch_with_multiple_implicit_requirements_test.rb +53 -0
- data/test/unit/branch/branch_with_multiple_on_requirements_test.rb +20 -0
- data/test/unit/branch/branch_with_multiple_to_requirements_test.rb +20 -0
- data/test/unit/branch/branch_with_multiple_unless_conditionals_test.rb +20 -0
- data/test/unit/branch/branch_with_nil_requirements_test.rb +28 -0
- data/test/unit/branch/branch_with_no_requirements_test.rb +36 -0
- data/test/unit/branch/branch_with_on_matcher_requirement_test.rb +16 -0
- data/test/unit/branch/branch_with_on_requirement_test.rb +45 -0
- data/test/unit/branch/branch_with_to_matcher_requirement_test.rb +20 -0
- data/test/unit/branch/branch_with_to_requirement_test.rb +45 -0
- data/test/unit/branch/branch_with_unless_conditional_test.rb +27 -0
- data/test/unit/branch/branch_without_guards_test.rb +27 -0
- data/test/unit/callback/callback_by_default_test.rb +25 -0
- data/test/unit/callback/callback_test.rb +53 -0
- data/test/unit/callback/callback_with_application_bound_object_test.rb +23 -0
- data/test/unit/callback/callback_with_application_terminator_test.rb +24 -0
- data/test/unit/callback/callback_with_arguments_test.rb +14 -0
- data/test/unit/callback/callback_with_around_type_and_arguments_test.rb +25 -0
- data/test/unit/callback/callback_with_around_type_and_block_test.rb +44 -0
- data/test/unit/callback/callback_with_around_type_and_bound_method_test.rb +23 -0
- data/test/unit/callback/callback_with_around_type_and_multiple_methods_test.rb +93 -0
- data/test/unit/callback/callback_with_around_type_and_terminator_test.rb +17 -0
- data/test/unit/callback/callback_with_block_test.rb +20 -0
- data/test/unit/callback/callback_with_bound_method_and_arguments_test.rb +28 -0
- data/test/unit/callback/callback_with_bound_method_test.rb +35 -0
- data/test/unit/callback/callback_with_do_method_test.rb +18 -0
- data/test/unit/callback/callback_with_explicit_requirements_test.rb +32 -0
- data/test/unit/callback/callback_with_if_condition_test.rb +17 -0
- data/test/unit/callback/callback_with_implicit_requirements_test.rb +32 -0
- data/test/unit/callback/callback_with_method_argument_test.rb +18 -0
- data/test/unit/callback/callback_with_mixed_methods_test.rb +31 -0
- data/test/unit/callback/callback_with_multiple_bound_methods_test.rb +21 -0
- data/test/unit/callback/callback_with_multiple_do_methods_test.rb +29 -0
- data/test/unit/callback/callback_with_multiple_method_arguments_test.rb +29 -0
- data/test/unit/callback/callback_with_terminator_test.rb +22 -0
- data/test/unit/callback/callback_with_unbound_method_test.rb +14 -0
- data/test/unit/callback/callback_with_unless_condition_test.rb +17 -0
- data/test/unit/callback/callback_without_arguments_test.rb +14 -0
- data/test/unit/callback/callback_without_terminator_test.rb +12 -0
- data/test/unit/error/error_by_default_test.rb +21 -0
- data/test/unit/error/error_with_message_test.rb +23 -0
- data/test/unit/eval_helper/eval_helpers_base_test.rb +8 -0
- data/test/unit/eval_helper/eval_helpers_proc_block_and_explicit_arguments_test.rb +14 -0
- data/test/unit/eval_helper/eval_helpers_proc_block_and_implicit_arguments_test.rb +14 -0
- data/test/unit/eval_helper/eval_helpers_proc_test.rb +13 -0
- data/test/unit/eval_helper/eval_helpers_proc_with_arguments_test.rb +13 -0
- data/test/unit/eval_helper/eval_helpers_proc_with_block_test.rb +13 -0
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_arguments_test.rb +18 -0
- data/test/unit/eval_helper/eval_helpers_proc_with_block_without_object_test.rb +14 -0
- data/test/unit/eval_helper/eval_helpers_proc_without_arguments_test.rb +19 -0
- data/test/unit/eval_helper/eval_helpers_string_test.rb +25 -0
- data/test/unit/eval_helper/eval_helpers_string_with_block_test.rb +12 -0
- data/test/unit/eval_helper/eval_helpers_symbol_method_missing_test.rb +20 -0
- data/test/unit/eval_helper/eval_helpers_symbol_private_test.rb +17 -0
- data/test/unit/eval_helper/eval_helpers_symbol_protected_test.rb +17 -0
- data/test/unit/eval_helper/eval_helpers_symbol_tainted_method_test.rb +18 -0
- data/test/unit/eval_helper/eval_helpers_symbol_test.rb +16 -0
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_and_block_test.rb +16 -0
- data/test/unit/eval_helper/eval_helpers_symbol_with_arguments_test.rb +16 -0
- data/test/unit/eval_helper/eval_helpers_symbol_with_block_test.rb +16 -0
- data/test/unit/eval_helper/eval_helpers_test.rb +13 -0
- data/test/unit/event/event_after_being_copied_test.rb +17 -0
- data/test/unit/event/event_by_default_test.rb +60 -0
- data/test/unit/event/event_context_test.rb +16 -0
- data/test/unit/event/event_on_failure_test.rb +44 -0
- data/test/unit/event/event_test.rb +34 -0
- data/test/unit/event/event_transitions_test.rb +62 -0
- data/test/unit/event/event_with_conflicting_helpers_after_definition_test.rb +79 -0
- data/test/unit/event/event_with_conflicting_helpers_before_definition_test.rb +58 -0
- data/test/unit/event/event_with_conflicting_machine_test.rb +48 -0
- data/test/unit/event/event_with_dynamic_human_name_test.rb +26 -0
- data/test/unit/event/event_with_human_name_test.rb +13 -0
- data/test/unit/event/event_with_invalid_current_state_test.rb +30 -0
- data/test/unit/event/event_with_machine_action_test.rb +33 -0
- data/test/unit/event/event_with_marshalling_test.rb +47 -0
- data/test/unit/event/event_with_matching_disabled_transitions_test.rb +115 -0
- data/test/unit/event/event_with_matching_enabled_transitions_test.rb +75 -0
- data/test/unit/event/event_with_multiple_transitions_test.rb +61 -0
- data/test/unit/event/event_with_namespace_test.rb +34 -0
- data/test/unit/event/event_with_transition_with_blacklisted_to_state_test.rb +60 -0
- data/test/unit/event/event_with_transition_with_loopback_state_test.rb +36 -0
- data/test/unit/event/event_with_transition_with_nil_to_state_test.rb +36 -0
- data/test/unit/event/event_with_transition_with_whitelisted_to_state_test.rb +51 -0
- data/test/unit/event/event_with_transition_without_to_state_test.rb +36 -0
- data/test/unit/event/event_with_transitions_test.rb +32 -0
- data/test/unit/event/event_without_matching_transitions_test.rb +41 -0
- data/test/unit/event/event_without_transitions_test.rb +28 -0
- data/{spec/state_machines/invalid_event_spec.rb → test/unit/event/invalid_event_test.rb} +8 -7
- data/test/unit/event_collection/event_collection_attribute_with_machine_action_test.rb +62 -0
- data/test/unit/event_collection/event_collection_attribute_with_namespaced_machine_test.rb +36 -0
- data/test/unit/event_collection/event_collection_by_default_test.rb +26 -0
- data/test/unit/event_collection/event_collection_test.rb +39 -0
- data/test/unit/event_collection/event_collection_with_custom_machine_attribute_test.rb +31 -0
- data/test/unit/event_collection/event_collection_with_events_with_transitions_test.rb +76 -0
- data/test/unit/event_collection/event_collection_with_multiple_events_test.rb +27 -0
- data/test/unit/event_collection/event_collection_with_validations_test.rb +75 -0
- data/test/unit/event_collection/event_collection_without_machine_action_test.rb +18 -0
- data/test/unit/event_collection/event_string_collection_test.rb +31 -0
- data/test/unit/helper_module_test.rb +17 -0
- data/test/unit/integrations/integration_finder_test.rb +16 -0
- data/test/unit/integrations/integration_matcher_test.rb +27 -0
- data/test/unit/invalid_transition/invalid_parallel_transition_test.rb +18 -0
- data/test/unit/invalid_transition/invalid_transition_test.rb +47 -0
- data/test/unit/invalid_transition/invalid_transition_with_integration_test.rb +47 -0
- data/test/unit/invalid_transition/invalid_transition_with_namespace_test.rb +32 -0
- data/test/unit/machine/machine_after_being_copied_test.rb +62 -0
- data/test/unit/machine/machine_after_changing_initial_state.rb +28 -0
- data/test/unit/machine/machine_after_changing_owner_class_test.rb +31 -0
- data/test/unit/machine/machine_by_default_test.rb +160 -0
- data/test/unit/machine/machine_finder_custom_options_test.rb +17 -0
- data/test/unit/machine/machine_finder_with_existing_machine_on_superclass_test.rb +86 -0
- data/test/unit/machine/machine_finder_with_existing_on_same_class_test.rb +23 -0
- data/test/unit/machine/machine_finder_without_existing_machine_test.rb +25 -0
- data/test/unit/machine/machine_persistence_test.rb +52 -0
- data/test/unit/machine/machine_state_initialization_test.rb +56 -0
- data/test/unit/machine/machine_test.rb +30 -0
- data/test/unit/machine/machine_with_action_already_overridden_test.rb +23 -0
- data/test/unit/machine/machine_with_action_defined_in_class_test.rb +37 -0
- data/test/unit/machine/machine_with_action_defined_in_included_module_test.rb +46 -0
- data/test/unit/machine/machine_with_action_defined_in_superclass_test.rb +43 -0
- data/test/unit/machine/machine_with_action_undefined_test.rb +33 -0
- data/test/unit/machine/machine_with_cached_state_test.rb +20 -0
- data/test/unit/machine/machine_with_class_helpers_test.rb +179 -0
- data/test/unit/machine/machine_with_conflicting_helpers_after_definition_test.rb +243 -0
- data/test/unit/machine/machine_with_conflicting_helpers_before_definition_test.rb +175 -0
- data/test/unit/machine/machine_with_custom_action_test.rb +11 -0
- data/test/unit/machine/machine_with_custom_attribute_test.rb +103 -0
- data/test/unit/machine/machine_with_custom_initialize_test.rb +24 -0
- data/test/unit/machine/machine_with_custom_integration_test.rb +69 -0
- data/test/unit/machine/machine_with_custom_invalidation_test.rb +40 -0
- data/test/unit/machine/machine_with_custom_name_test.rb +57 -0
- data/test/unit/machine/machine_with_custom_plural_test.rb +53 -0
- data/test/unit/machine/machine_with_dynamic_initial_state_test.rb +65 -0
- data/test/unit/machine/machine_with_event_matchers_test.rb +41 -0
- data/test/unit/machine/machine_with_events_test.rb +52 -0
- data/test/unit/machine/machine_with_events_with_custom_human_names_test.rb +18 -0
- data/test/unit/machine/machine_with_events_with_transitions_test.rb +37 -0
- data/test/unit/machine/machine_with_existing_event_test.rb +17 -0
- data/test/unit/machine/machine_with_existing_machines_on_owner_class_test.rb +20 -0
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb +71 -0
- data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_subclass_test.rb +31 -0
- data/test/unit/machine/machine_with_existing_state_test.rb +27 -0
- data/test/unit/machine/machine_with_failure_callbacks_test.rb +48 -0
- data/test/unit/machine/machine_with_helpers_test.rb +14 -0
- data/test/unit/machine/machine_with_initial_state_with_value_and_owner_default.rb +25 -0
- data/test/unit/machine/machine_with_initialize_and_super_test.rb +17 -0
- data/test/unit/machine/machine_with_initialize_arguments_and_block_test.rb +31 -0
- data/test/unit/machine/machine_with_initialize_without_super_test.rb +17 -0
- data/test/unit/machine/machine_with_instance_helpers_test.rb +179 -0
- data/test/unit/machine/machine_with_integration_test.rb +71 -0
- data/test/unit/machine/machine_with_multiple_events_test.rb +32 -0
- data/test/unit/machine/machine_with_namespace_test.rb +48 -0
- data/test/unit/machine/machine_with_nil_action_test.rb +24 -0
- data/test/unit/machine/machine_with_other_states.rb +22 -0
- data/test/unit/machine/machine_with_owner_subclass_test.rb +18 -0
- data/test/unit/machine/machine_with_paths_test.rb +25 -0
- data/test/unit/machine/machine_with_private_action_test.rb +43 -0
- data/test/unit/machine/machine_with_state_matchers_test.rb +41 -0
- data/test/unit/machine/machine_with_state_with_matchers_test.rb +19 -0
- data/test/unit/machine/machine_with_states_test.rb +55 -0
- data/test/unit/machine/machine_with_states_with_behaviors_test.rb +23 -0
- data/test/unit/machine/machine_with_states_with_custom_human_names_test.rb +18 -0
- data/test/unit/machine/machine_with_states_with_custom_values_test.rb +21 -0
- data/test/unit/machine/machine_with_states_with_runtime_dependencies_test.rb +19 -0
- data/test/unit/machine/machine_with_static_initial_state_test.rb +60 -0
- data/test/unit/machine/machine_with_superclass_conflicting_helpers_after_definition_test.rb +36 -0
- data/test/unit/machine/machine_with_transition_callbacks_test.rb +144 -0
- data/test/unit/machine/machine_with_transitions_test.rb +87 -0
- data/test/unit/machine/machine_without_initialization_test.rb +31 -0
- data/test/unit/machine/machine_without_initialize_test.rb +14 -0
- data/test/unit/machine/machine_without_integration_test.rb +31 -0
- data/test/unit/machine_collection/machine_collection_by_default_test.rb +11 -0
- data/test/unit/machine_collection/machine_collection_fire_attributes_with_validations_test.rb +72 -0
- data/test/unit/machine_collection/machine_collection_fire_test.rb +80 -0
- data/test/unit/machine_collection/machine_collection_fire_with_transactions_test.rb +54 -0
- data/test/unit/machine_collection/machine_collection_fire_with_validations_test.rb +76 -0
- data/test/unit/machine_collection/machine_collection_state_initialization_test.rb +101 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_blank_events_test.rb +25 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_custom_options_test.rb +20 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_different_actions_test.rb +26 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_exisiting_transitions_test.rb +25 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_invalid_events_test.rb +25 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_same_actions_test.rb +31 -0
- data/test/unit/machine_collection/machine_collection_transitions_with_transition_test.rb +26 -0
- data/test/unit/machine_collection/machine_collection_transitions_without_events_test.rb +25 -0
- data/test/unit/machine_collection/machine_collection_transitions_without_transition_test.rb +27 -0
- data/test/unit/matcher/all_matcher_test.rb +29 -0
- data/test/unit/matcher/blacklist_matcher_test.rb +30 -0
- data/test/unit/matcher/loopback_matcher_test.rb +27 -0
- data/test/unit/matcher/matcher_by_default_test.rb +15 -0
- data/test/unit/matcher/matcher_with_multiple_values_test.rb +15 -0
- data/test/unit/matcher/matcher_with_value_test.rb +15 -0
- data/test/unit/matcher/whitelist_matcher_test.rb +30 -0
- data/test/unit/matcher_helpers/matcher_helpers_all_test.rb +14 -0
- data/test/unit/matcher_helpers/matcher_helpers_any_test.rb +14 -0
- data/test/unit/matcher_helpers/matcher_helpers_same_test.rb +13 -0
- data/test/unit/node_collection/node_collection_after_being_copied_test/n.rb +46 -0
- data/test/unit/node_collection/node_collection_after_update_test/n.rb +36 -0
- data/test/unit/node_collection/node_collection_by_default_test.rb +22 -0
- data/test/unit/node_collection/node_collection_test.rb +23 -0
- data/test/unit/node_collection/node_collection_with_indices_test/n.rb +42 -0
- data/test/unit/node_collection/node_collection_with_matcher_contexts_test.rb +25 -0
- data/test/unit/node_collection/node_collection_with_nodes_test/n.rb +46 -0
- data/test/unit/node_collection/node_collection_with_numeric_index_test/n.rb +24 -0
- data/test/unit/node_collection/node_collection_with_postdefined_contexts_test/n.rb +22 -0
- data/test/unit/node_collection/node_collection_with_predefined_contexts_test/n.rb +23 -0
- data/test/unit/node_collection/node_collection_with_string_index_test/n.rb +20 -0
- data/test/unit/node_collection/node_collection_with_symbol_index_test/n.rb +20 -0
- data/test/unit/node_collection/node_collection_without_indices_test/n.rb +30 -0
- data/test/unit/path/path_by_default_test.rb +54 -0
- data/test/unit/path/path_test.rb +14 -0
- data/test/unit/path/path_with_available_transitions_after_reaching_target_test.rb +40 -0
- data/test/unit/path/path_with_available_transitions_test.rb +54 -0
- data/test/unit/path/path_with_deep_target_reached_test.rb +50 -0
- data/test/unit/path/path_with_deep_target_test.rb +40 -0
- data/test/unit/path/path_with_duplicates_test.rb +32 -0
- data/test/unit/path/path_with_encountered_transitions_test.rb +34 -0
- data/test/unit/path/path_with_guarded_transitions_test.rb +42 -0
- data/test/unit/path/path_with_reached_target_test.rb +35 -0
- data/test/unit/path/path_with_transitions_test.rb +54 -0
- data/test/unit/path/path_with_unreached_target_test.rb +31 -0
- data/test/unit/path/path_without_transitions_test.rb +24 -0
- data/test/unit/path_collection/path_collection_by_default_test.rb +46 -0
- data/test/unit/path_collection/path_collection_test.rb +24 -0
- data/test/unit/path_collection/path_collection_with_deep_paths_test.rb +43 -0
- data/test/unit/path_collection/path_collection_with_duplicate_nodes_test.rb +31 -0
- data/test/unit/path_collection/path_collection_with_from_state_test.rb +27 -0
- data/test/unit/path_collection/path_collection_with_paths_test.rb +47 -0
- data/test/unit/path_collection/path_collection_with_to_state_test.rb +29 -0
- data/test/unit/path_collection/path_with_guarded_paths_test.rb +25 -0
- data/test/unit/state/state_after_being_copied_test.rb +19 -0
- data/test/unit/state/state_by_default_test.rb +41 -0
- data/test/unit/state/state_final_test.rb +28 -0
- data/test/unit/state/state_initial_test.rb +13 -0
- data/test/unit/state/state_not_final_test.rb +32 -0
- data/test/unit/state/state_not_initial_test.rb +13 -0
- data/test/unit/state/state_test.rb +44 -0
- data/test/unit/state/state_with_cached_lambda_value_test.rb +29 -0
- data/test/unit/state/state_with_conflicting_helpers_after_definition_test.rb +38 -0
- data/test/unit/state/state_with_conflicting_helpers_before_definition_test.rb +29 -0
- data/test/unit/state/state_with_conflicting_machine_name_test.rb +20 -0
- data/test/unit/state/state_with_conflicting_machine_test.rb +37 -0
- data/test/unit/state/state_with_context_test.rb +60 -0
- data/test/unit/state/state_with_dynamic_human_name_test.rb +25 -0
- data/test/unit/state/state_with_existing_context_method_test.rb +24 -0
- data/test/unit/state/state_with_human_name_test.rb +13 -0
- data/test/unit/state/state_with_integer_value_test.rb +32 -0
- data/test/unit/state/state_with_invalid_method_call_test.rb +21 -0
- data/test/unit/state/state_with_lambda_value_test.rb +37 -0
- data/test/unit/state/state_with_matcher_test.rb +18 -0
- data/test/unit/state/state_with_multiple_contexts_test.rb +57 -0
- data/test/unit/state/state_with_name_test.rb +43 -0
- data/test/unit/state/state_with_namespace_test.rb +22 -0
- data/test/unit/state/state_with_nil_value_test.rb +35 -0
- data/test/unit/state/state_with_redefined_context_method_test.rb +45 -0
- data/test/unit/state/state_with_symbolic_value_test.rb +32 -0
- data/test/unit/state/state_with_valid_inherited_method_call_for_current_state_test.rb +40 -0
- data/test/unit/state/state_with_valid_method_call_for_current_state_test.rb +33 -0
- data/test/unit/state/state_with_valid_method_call_for_different_state_test.rb +41 -0
- data/test/unit/state/state_without_cached_lambda_value_test.rb +25 -0
- data/test/unit/state/state_without_name_test.rb +39 -0
- data/test/unit/state_collection/state_collection_by_default_test.rb +21 -0
- data/test/unit/state_collection/state_collection_string_test.rb +35 -0
- data/test/unit/state_collection/state_collection_test.rb +74 -0
- data/test/unit/state_collection/state_collection_with_custom_state_values_test.rb +29 -0
- data/test/unit/state_collection/state_collection_with_event_transitions_test.rb +39 -0
- data/test/unit/state_collection/state_collection_with_initial_state_test.rb +40 -0
- data/test/unit/state_collection/state_collection_with_namespace_test.rb +21 -0
- data/test/unit/state_collection/state_collection_with_state_behaviors_test.rb +40 -0
- data/test/unit/state_collection/state_collection_with_state_matchers_test.rb +29 -0
- data/test/unit/state_collection/state_collection_with_transition_callbacks_test.rb +40 -0
- data/test/unit/state_context/state_context_proxy_test.rb +26 -0
- data/test/unit/state_context/state_context_proxy_with_if_and_unless_conditions_test.rb +42 -0
- data/test/unit/state_context/state_context_proxy_with_if_condition_test.rb +64 -0
- data/test/unit/state_context/state_context_proxy_with_multiple_if_conditions_test.rb +32 -0
- data/test/unit/state_context/state_context_proxy_with_multiple_unless_conditions_test.rb +32 -0
- data/test/unit/state_context/state_context_proxy_with_unless_condition_test.rb +64 -0
- data/test/unit/state_context/state_context_proxy_without_conditions_test.rb +31 -0
- data/test/unit/state_context/state_context_test.rb +28 -0
- data/test/unit/state_context/state_context_transition_test.rb +104 -0
- data/test/unit/state_context/state_context_with_matching_transition_test.rb +27 -0
- data/test/unit/state_machine/state_machine_by_default_test.rb +12 -0
- data/test/unit/state_machine/state_machine_test.rb +20 -0
- data/test/unit/transition/transition_after_being_performed_test.rb +48 -0
- data/test/unit/transition/transition_after_being_persisted_test.rb +46 -0
- data/test/unit/transition/transition_after_being_rolled_back_test.rb +35 -0
- data/test/unit/transition/transition_equality_test.rb +52 -0
- data/test/unit/transition/transition_loopback_test.rb +18 -0
- data/test/unit/transition/transition_test.rb +96 -0
- data/test/unit/transition/transition_transient_test.rb +20 -0
- data/test/unit/transition/transition_with_action_test.rb +27 -0
- data/test/unit/transition/transition_with_after_callbacks_skipped_test.rb +127 -0
- data/test/unit/transition/transition_with_after_callbacks_test.rb +93 -0
- data/test/unit/transition/transition_with_around_callbacks_test.rb +141 -0
- data/test/unit/transition/transition_with_before_callbacks_skipped_test.rb +30 -0
- data/test/unit/transition/transition_with_before_callbacks_test.rb +104 -0
- data/test/unit/transition/transition_with_custom_machine_attribute_test.rb +28 -0
- data/test/unit/transition/transition_with_different_states_test.rb +18 -0
- data/test/unit/transition/transition_with_dynamic_to_value_test.rb +19 -0
- data/test/unit/transition/transition_with_failure_callbacks_test.rb +84 -0
- data/test/unit/transition/transition_with_invalid_nodes_test.rb +29 -0
- data/test/unit/transition/transition_with_mixed_callbacks_test.rb +105 -0
- data/test/unit/transition/transition_with_multiple_after_callbacks_test.rb +40 -0
- data/test/unit/transition/transition_with_multiple_around_callbacks_test.rb +114 -0
- data/test/unit/transition/transition_with_multiple_before_callbacks_test.rb +40 -0
- data/test/unit/transition/transition_with_multiple_failure_callbacks_test.rb +40 -0
- data/test/unit/transition/transition_with_namespace_test.rb +47 -0
- data/test/unit/transition/transition_with_perform_arguments_test.rb +35 -0
- data/test/unit/transition/transition_with_transactions_test.rb +42 -0
- data/test/unit/transition/transition_without_callbacks_test.rb +33 -0
- data/test/unit/transition/transition_without_reading_state_test.rb +22 -0
- data/test/unit/transition/transition_without_running_action_test.rb +47 -0
- data/test/unit/transition_collection/attribute_transition_collection_by_default_test.rb +23 -0
- data/test/unit/transition_collection/attribute_transition_collection_marshalling_test.rb +64 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_action_error_test.rb +44 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_action_failed_test.rb +44 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_error_test.rb +32 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_after_callback_halt_test.rb +33 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_around_after_yield_callback_error_test.rb +32 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_error_test.rb +32 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_after_yield_halt_test.rb +33 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_around_callback_before_yield_halt_test.rb +33 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_error_test.rb +32 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_before_callback_halt_test.rb +33 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_callbacks_test.rb +68 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_event_transitions_test.rb +41 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_events_test.rb +44 -0
- data/test/unit/transition_collection/attribute_transition_collection_with_skipped_after_callbacks_test.rb +42 -0
- data/test/unit/transition_collection/transition_collection_by_default_test.rb +23 -0
- data/test/unit/transition_collection/transition_collection_empty_with_block_test.rb +23 -0
- data/test/unit/transition_collection/transition_collection_empty_without_block_test.rb +12 -0
- data/test/unit/transition_collection/transition_collection_invalid_test.rb +21 -0
- data/test/unit/transition_collection/transition_collection_partial_invalid_test.rb +69 -0
- data/test/unit/transition_collection/transition_collection_test.rb +26 -0
- data/test/unit/transition_collection/transition_collection_valid_test.rb +57 -0
- data/test/unit/transition_collection/transition_collection_with_action_error_test.rb +66 -0
- data/test/unit/transition_collection/transition_collection_with_action_failed_test.rb +60 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_block_test.rb +17 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_action_test.rb +17 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_and_skipped_after_callbacks_test.rb +37 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_base_test.rb +34 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_error_test.rb +29 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_invalid_test.rb +17 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_multiple_test.rb +79 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_test.rb +45 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_different_actions_test.rb +48 -0
- data/test/unit/transition_collection/transition_collection_with_action_hook_with_nil_action_test.rb +42 -0
- data/test/unit/transition_collection/transition_collection_with_after_callback_halt_test.rb +51 -0
- data/test/unit/transition_collection/transition_collection_with_before_callback_halt_test.rb +47 -0
- data/test/unit/transition_collection/transition_collection_with_block_test.rb +46 -0
- data/test/unit/transition_collection/transition_collection_with_callbacks_test.rb +135 -0
- data/test/unit/transition_collection/transition_collection_with_different_actions_test.rb +189 -0
- data/test/unit/transition_collection/transition_collection_with_duplicate_actions_test.rb +48 -0
- data/test/unit/transition_collection/transition_collection_with_empty_actions_test.rb +41 -0
- data/test/unit/transition_collection/transition_collection_with_mixed_actions_test.rb +41 -0
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_and_block_test.rb +34 -0
- data/test/unit/transition_collection/transition_collection_with_skipped_actions_test.rb +69 -0
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_and_around_callbacks_test.rb +53 -0
- data/test/unit/transition_collection/transition_collection_with_skipped_after_callbacks_test.rb +34 -0
- data/test/unit/transition_collection/transition_collection_with_transactions_test.rb +65 -0
- data/test/unit/transition_collection/transition_collection_without_transactions_test.rb +29 -0
- metadata +888 -101
- data/spec/models/auto_shop_spec.rb +0 -41
- data/spec/models/car_spec.rb +0 -90
- data/spec/models/motorcycle_spec.rb +0 -44
- data/spec/models/traffic_light_spec.rb +0 -56
- data/spec/models/vehicle_spec.rb +0 -580
- data/spec/spec_helper.rb +0 -7
- data/spec/state_machines/assertions_spec.rb +0 -31
- data/spec/state_machines/branch_spec.rb +0 -827
- data/spec/state_machines/callbacks_spec.rb +0 -706
- data/spec/state_machines/errors_spec.rb +0 -1
- data/spec/state_machines/event_collection_spec.rb +0 -401
- data/spec/state_machines/event_spec.rb +0 -1140
- data/spec/state_machines/helper_spec.rb +0 -14
- data/spec/state_machines/integration_base_spec.rb +0 -12
- data/spec/state_machines/integration_spec.rb +0 -132
- data/spec/state_machines/invalid_parallel_transition_spec.rb +0 -18
- data/spec/state_machines/invalid_transition_spec.rb +0 -114
- data/spec/state_machines/machine_collection_spec.rb +0 -606
- data/spec/state_machines/machine_spec.rb +0 -3176
- data/spec/state_machines/matcher_helpers_spec.rb +0 -39
- data/spec/state_machines/matcher_spec.rb +0 -157
- data/spec/state_machines/node_collection_spec.rb +0 -371
- data/spec/state_machines/path_collection_spec.rb +0 -271
- data/spec/state_machines/path_spec.rb +0 -488
- data/spec/state_machines/state_collection_spec.rb +0 -352
- data/spec/state_machines/state_context_spec.rb +0 -442
- data/spec/state_machines/state_machine_spec.rb +0 -29
- data/spec/state_machines/state_spec.rb +0 -970
- data/spec/state_machines/transition_collection_spec.rb +0 -2199
- data/spec/state_machines/transition_spec.rb +0 -1558
- data/spec/support/migration_helpers.rb +0 -59
- data/spec/support/models.rb +0 -6
@@ -0,0 +1,103 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
module MachineWithCustomAttributeIntegration
|
4
|
+
include StateMachines::Integrations::Base
|
5
|
+
|
6
|
+
def self.integration_name
|
7
|
+
:custom_attribute
|
8
|
+
end
|
9
|
+
|
10
|
+
@defaults = { action: :save, use_transactions: false }
|
11
|
+
|
12
|
+
def create_with_scope(_name)
|
13
|
+
-> {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_without_scope(_name)
|
17
|
+
-> {}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class MachineWithCustomAttributeTest < StateMachinesTest
|
22
|
+
def setup
|
23
|
+
StateMachines::Integrations.register(MachineWithCustomAttributeIntegration)
|
24
|
+
|
25
|
+
@klass = Class.new
|
26
|
+
@machine = StateMachines::Machine.new(@klass, :state, attribute: :state_id, initial: :active, integration: :custom_attribute) do
|
27
|
+
event :ignite do
|
28
|
+
transition parked: :idling
|
29
|
+
end
|
30
|
+
end
|
31
|
+
@object = @klass.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_define_a_reader_attribute_for_the_attribute
|
35
|
+
assert @object.respond_to?(:state_id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_define_a_writer_attribute_for_the_attribute
|
39
|
+
assert @object.respond_to?(:state_id=)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_should_define_a_predicate_for_the_attribute
|
43
|
+
assert @object.respond_to?(:state?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_define_a_name_reader_for_the_attribute
|
47
|
+
assert @object.respond_to?(:state_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_define_a_human_name_reader_for_the_attribute
|
51
|
+
assert @object.respond_to?(:state_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_should_define_an_event_reader_for_the_attribute
|
55
|
+
assert @object.respond_to?(:state_events)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_should_define_a_transition_reader_for_the_attribute
|
59
|
+
assert @object.respond_to?(:state_transitions)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_define_a_path_reader_for_the_attribute
|
63
|
+
assert @object.respond_to?(:state_paths)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_should_define_an_event_runner_for_the_attribute
|
67
|
+
assert @object.respond_to?(:fire_state_event)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_should_define_a_human_attribute_name_reader
|
71
|
+
assert @klass.respond_to?(:human_state_name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_should_define_a_human_event_name_reader
|
75
|
+
assert @klass.respond_to?(:human_state_event_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_should_define_singular_with_scope
|
79
|
+
assert @klass.respond_to?(:with_state)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_should_define_singular_without_scope
|
83
|
+
assert @klass.respond_to?(:without_state)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_define_plural_with_scope
|
87
|
+
assert @klass.respond_to?(:with_states)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_define_plural_without_scope
|
91
|
+
assert @klass.respond_to?(:without_states)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_define_state_machines_reader
|
95
|
+
expected = { state: @machine }
|
96
|
+
assert_equal expected, @klass.state_machines
|
97
|
+
end
|
98
|
+
|
99
|
+
def teardown
|
100
|
+
StateMachines::Integrations.reset
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithCustomInitializeTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new do
|
6
|
+
def initialize(state = nil, options = {})
|
7
|
+
@state = state
|
8
|
+
initialize_state_machines(options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
@machine = StateMachines::Machine.new(@klass, initial: :parked)
|
12
|
+
@object = @klass.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_should_initialize_state
|
16
|
+
assert_equal 'parked', @object.state
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_allow_custom_options
|
20
|
+
@machine.state :idling
|
21
|
+
@object = @klass.new('idling', static: :force)
|
22
|
+
assert_equal 'parked', @object.state
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
require_relative '../../../test/files/models/vehicle'
|
3
|
+
|
4
|
+
class MachineWithCustomIntegrationTest < StateMachinesTest
|
5
|
+
def setup
|
6
|
+
StateMachines::Integrations.reset
|
7
|
+
integration = Module.new do
|
8
|
+
include StateMachines::Integrations::Base
|
9
|
+
|
10
|
+
def self.matching_ancestors
|
11
|
+
['Vehicle']
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
StateMachines::Integrations.const_set('Custom', integration)
|
16
|
+
StateMachines::Integrations.register(StateMachines::Integrations::Custom)
|
17
|
+
|
18
|
+
@klass = Vehicle
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_be_extended_by_the_integration_if_explicit
|
22
|
+
machine = StateMachines::Machine.new(@klass, integration: :custom)
|
23
|
+
assert((class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_not_be_extended_by_the_integration_if_implicit_but_not_available
|
27
|
+
StateMachines::Integrations::Custom.class_eval do
|
28
|
+
class << self; remove_method :matching_ancestors; end
|
29
|
+
def self.matching_ancestors
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
machine = StateMachines::Machine.new(@klass)
|
35
|
+
assert(!(class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_not_be_extended_by_the_integration_if_implicit_but_not_matched
|
39
|
+
StateMachines::Integrations::Custom.class_eval do
|
40
|
+
class << self; remove_method :matching_ancestors; end
|
41
|
+
def self.matching_ancestors
|
42
|
+
[]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
machine = StateMachines::Machine.new(@klass)
|
47
|
+
assert(!(class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_be_extended_by_the_integration_if_implicit_and_available_and_matches
|
51
|
+
machine = StateMachines::Machine.new(@klass)
|
52
|
+
assert((class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_should_not_be_extended_by_the_integration_if_nil
|
56
|
+
machine = StateMachines::Machine.new(@klass, integration: nil)
|
57
|
+
assert(!(class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_should_not_be_extended_by_the_integration_if_false
|
61
|
+
machine = StateMachines::Machine.new(@klass, integration: false)
|
62
|
+
assert(!(class << machine; ancestors; end).include?(StateMachines::Integrations::Custom))
|
63
|
+
end
|
64
|
+
|
65
|
+
def teardown
|
66
|
+
StateMachines::Integrations.reset
|
67
|
+
StateMachines::Integrations.send(:remove_const, 'Custom')
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithCustomInvalidationTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@integration = Module.new do
|
6
|
+
include StateMachines::Integrations::Base
|
7
|
+
|
8
|
+
def invalidate(object, _attribute, message, values = [])
|
9
|
+
object.error = generate_message(message, values)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
StateMachines::Integrations.const_set('Custom', @integration)
|
13
|
+
StateMachines::Integrations.register(StateMachines::Integrations::Custom)
|
14
|
+
|
15
|
+
@klass = Class.new do
|
16
|
+
attr_accessor :error
|
17
|
+
end
|
18
|
+
|
19
|
+
@machine = StateMachines::Machine.new(@klass, integration: :custom, messages: { invalid_transition: 'cannot %s' })
|
20
|
+
@machine.state :parked
|
21
|
+
|
22
|
+
@object = @klass.new
|
23
|
+
@object.state = 'parked'
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_generate_custom_message
|
27
|
+
assert_equal 'cannot park', @machine.generate_message(:invalid_transition, [[:event, :park]])
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_use_custom_message
|
31
|
+
@machine.invalidate(@object, :state, :invalid_transition, [[:event, 'park']])
|
32
|
+
assert_equal 'cannot park', @object.error
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown
|
36
|
+
StateMachines::Integrations.reset
|
37
|
+
StateMachines::Integrations.send(:remove_const, 'Custom')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithCustomNameTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass, :status)
|
7
|
+
@object = @klass.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_use_custom_name
|
11
|
+
assert_equal :status, @machine.name
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_use_custom_name_for_attribute
|
15
|
+
assert_equal :status, @machine.attribute
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_prefix_custom_attributes_with_custom_name
|
19
|
+
assert_equal :status_event, @machine.attribute(:event)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_define_a_reader_attribute_for_the_attribute
|
23
|
+
assert @object.respond_to?(:status)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_define_a_writer_attribute_for_the_attribute
|
27
|
+
assert @object.respond_to?(:status=)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_define_a_predicate_for_the_attribute
|
31
|
+
assert @object.respond_to?(:status?)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_define_a_name_reader_for_the_attribute
|
35
|
+
assert @object.respond_to?(:status_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_define_an_event_reader_for_the_attribute
|
39
|
+
assert @object.respond_to?(:status_events)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_should_define_a_transition_reader_for_the_attribute
|
43
|
+
assert @object.respond_to?(:status_transitions)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_define_an_event_runner_for_the_attribute
|
47
|
+
assert @object.respond_to?(:fire_status_event)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_define_a_human_attribute_name_reader_for_the_attribute
|
51
|
+
assert @klass.respond_to?(:human_status_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_should_define_a_human_event_name_reader_for_the_attribute
|
55
|
+
assert @klass.respond_to?(:human_status_event_name)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithCustomPluralTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
StateMachines::Integrations.reset
|
6
|
+
@integration = Module.new do
|
7
|
+
include StateMachines::Integrations::Base
|
8
|
+
|
9
|
+
class << self; attr_accessor :with_scopes, :without_scopes; end
|
10
|
+
@with_scopes = []
|
11
|
+
@without_scopes = []
|
12
|
+
|
13
|
+
def create_with_scope(name)
|
14
|
+
StateMachines::Integrations::Custom.with_scopes << name
|
15
|
+
lambda {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_without_scope(name)
|
19
|
+
StateMachines::Integrations::Custom.without_scopes << name
|
20
|
+
lambda {}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
StateMachines::Integrations.const_set('Custom', @integration)
|
25
|
+
StateMachines::Integrations.register(StateMachines::Integrations::Custom)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_should_define_a_singular_and_plural_with_scope
|
29
|
+
StateMachines::Machine.new(Class.new, integration: :custom, plural: 'staties')
|
30
|
+
assert_equal %w(with_state with_staties), @integration.with_scopes
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_define_a_singular_and_plural_without_scope
|
34
|
+
StateMachines::Machine.new(Class.new, integration: :custom, plural: 'staties')
|
35
|
+
assert_equal %w(without_state without_staties), @integration.without_scopes
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_define_single_with_scope_if_singular_same_as_plural
|
39
|
+
StateMachines::Machine.new(Class.new, integration: :custom, plural: 'state')
|
40
|
+
assert_equal %w(with_state), @integration.with_scopes
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_define_single_without_scope_if_singular_same_as_plural
|
44
|
+
StateMachines::Machine.new(Class.new, integration: :custom, plural: 'state')
|
45
|
+
assert_equal %w(without_state), @integration.without_scopes
|
46
|
+
end
|
47
|
+
|
48
|
+
def teardown
|
49
|
+
StateMachines::Integrations.reset
|
50
|
+
StateMachines::Integrations.send(:remove_const, 'Custom')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithDynamicInitialStateTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new do
|
6
|
+
attr_accessor :initial_state
|
7
|
+
end
|
8
|
+
@machine = StateMachines::Machine.new(@klass, initial: lambda { |object| object.initial_state || :default })
|
9
|
+
@machine.state :parked, :idling, :default
|
10
|
+
@object = @klass.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_have_dynamic_initial_state
|
14
|
+
assert @machine.dynamic_initial_state?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_use_the_record_for_determining_the_initial_state
|
18
|
+
@object.initial_state = :parked
|
19
|
+
assert_equal :parked, @machine.initial_state(@object).name
|
20
|
+
|
21
|
+
@object.initial_state = :idling
|
22
|
+
assert_equal :idling, @machine.initial_state(@object).name
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_write_to_attribute_when_initializing_state
|
26
|
+
object = @klass.allocate
|
27
|
+
object.initial_state = :parked
|
28
|
+
@machine.initialize_state(object)
|
29
|
+
assert_equal 'parked', object.state
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_set_initial_state_on_created_object
|
33
|
+
assert_equal 'default', @object.state
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_not_set_initial_state_even_if_not_empty
|
37
|
+
@klass.class_eval do
|
38
|
+
def initialize(_attributes = {})
|
39
|
+
self.state = 'parked'
|
40
|
+
super()
|
41
|
+
end
|
42
|
+
end
|
43
|
+
object = @klass.new
|
44
|
+
assert_equal 'parked', object.state
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_set_initial_state_after_initialization
|
48
|
+
base = Class.new do
|
49
|
+
attr_accessor :state_on_init
|
50
|
+
|
51
|
+
def initialize
|
52
|
+
self.state_on_init = state
|
53
|
+
end
|
54
|
+
end
|
55
|
+
klass = Class.new(base)
|
56
|
+
machine = StateMachines::Machine.new(klass, initial: lambda { |_object| :parked })
|
57
|
+
machine.state :parked
|
58
|
+
|
59
|
+
assert_nil klass.new.state_on_init
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_not_be_included_in_known_states
|
63
|
+
assert_equal [:parked, :idling, :default], @machine.states.map { |state| state.name }
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithEventMatchersTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_empty_array_for_all_matcher
|
10
|
+
assert_equal [], @machine.event(StateMachines::AllMatcher.instance)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_return_referenced_events_for_blacklist_matcher
|
14
|
+
assert_instance_of StateMachines::Event, @machine.event(StateMachines::BlacklistMatcher.new([:park]))
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_not_allow_configurations
|
18
|
+
exception = assert_raises(ArgumentError) { @machine.event(StateMachines::BlacklistMatcher.new([:park]), human_name: 'Park') }
|
19
|
+
assert_equal 'Cannot configure events when using matchers (using {:human_name=>"Park"})', exception.message
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_track_referenced_events
|
23
|
+
@machine.event(StateMachines::BlacklistMatcher.new([:park]))
|
24
|
+
assert_equal [:park], @machine.events.map { |event| event.name }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_eval_context_for_matching_events
|
28
|
+
contexts_run = []
|
29
|
+
@machine.event(StateMachines::BlacklistMatcher.new([:park])) { contexts_run << name }
|
30
|
+
|
31
|
+
@machine.event :park
|
32
|
+
assert_equal [], contexts_run
|
33
|
+
|
34
|
+
@machine.event :ignite
|
35
|
+
assert_equal [:ignite], contexts_run
|
36
|
+
|
37
|
+
@machine.event :shift_up, :shift_down
|
38
|
+
assert_equal [:ignite, :shift_up, :shift_down], contexts_run
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithEventsTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_return_the_created_event
|
10
|
+
assert_instance_of StateMachines::Event, @machine.event(:ignite)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_create_event_with_given_name
|
14
|
+
event = @machine.event(:ignite) {}
|
15
|
+
assert_equal :ignite, event.name
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_evaluate_block_within_event_context
|
19
|
+
responded = false
|
20
|
+
@machine.event :ignite do
|
21
|
+
responded = respond_to?(:transition)
|
22
|
+
end
|
23
|
+
|
24
|
+
assert responded
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_be_aliased_as_on
|
28
|
+
event = @machine.on(:ignite) {}
|
29
|
+
assert_equal :ignite, event.name
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_have_events
|
33
|
+
event = @machine.event(:ignite)
|
34
|
+
assert_equal [event], @machine.events.to_a
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_allow_human_state_name_lookup
|
38
|
+
@machine.event(:ignite)
|
39
|
+
assert_equal 'ignite', @klass.human_state_event_name(:ignite)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_should_raise_exception_on_invalid_human_state_event_name_lookup
|
43
|
+
exception = assert_raises(IndexError) { @klass.human_state_event_name(:invalid) }
|
44
|
+
assert_equal ':invalid is an invalid name', exception.message
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_raise_exception_if_conflicting_type_used_for_name
|
48
|
+
@machine.event :park
|
49
|
+
exception = assert_raises(ArgumentError) { @machine.event 'ignite' }
|
50
|
+
assert_equal '"ignite" event defined as String, :park defined as Symbol; all events must be consistent', exception.message
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithEventsWithCustomHumanNamesTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass)
|
7
|
+
@event = @machine.event(:ignite, human_name: 'start')
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_use_custom_human_name
|
11
|
+
assert_equal 'start', @event.human_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_allow_human_state_name_lookup
|
15
|
+
assert_equal 'start', @klass.human_state_event_name(:ignite)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithEventsWithTransitionsTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass, initial: :parked)
|
7
|
+
@event = @machine.event(:ignite) do
|
8
|
+
transition parked: :idling
|
9
|
+
transition stalled: :idling
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_have_events
|
14
|
+
assert_equal [@event], @machine.events.to_a
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_track_states_defined_in_event_transitions
|
18
|
+
assert_equal [:parked, :idling, :stalled], @machine.states.map { |state| state.name }
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_not_duplicate_states_defined_in_multiple_event_transitions
|
22
|
+
@machine.event :park do
|
23
|
+
transition idling: :parked
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_equal [:parked, :idling, :stalled], @machine.states.map { |state| state.name }
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_track_state_from_new_events
|
30
|
+
@machine.event :shift_up do
|
31
|
+
transition idling: :first_gear
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_equal [:parked, :idling, :stalled, :first_gear], @machine.states.map { |state| state.name }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithExistingEventTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@machine = StateMachines::Machine.new(Class.new)
|
6
|
+
@event = @machine.event(:ignite)
|
7
|
+
@same_event = @machine.event(:ignite)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_not_create_new_event
|
11
|
+
assert_same @event, @same_event
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_allow_accessing_event_without_block
|
15
|
+
assert_equal @event, @machine.event(:ignite)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithExistingMachinesOnOwnerClassTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass, initial: :parked)
|
7
|
+
@second_machine = StateMachines::Machine.new(@klass, :status, initial: :idling)
|
8
|
+
@object = @klass.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_should_track_each_state_machine
|
12
|
+
expected = { state: @machine, status: @second_machine }
|
13
|
+
assert_equal expected, @klass.state_machines
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_initialize_state_for_both_machines
|
17
|
+
assert_equal 'parked', @object.state
|
18
|
+
assert_equal 'idling', @object.status
|
19
|
+
end
|
20
|
+
end
|
data/test/unit/machine/machine_with_existing_machines_with_same_attributes_on_owner_class_test.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class MachineWithExistingMachinesWithSameAttributesOnOwnerClassTest < StateMachinesTest
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachines::Machine.new(@klass, initial: :parked)
|
7
|
+
@second_machine = StateMachines::Machine.new(@klass, :public_state, initial: :idling, attribute: :state)
|
8
|
+
@object = @klass.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_should_track_each_state_machine
|
12
|
+
expected = { state: @machine, public_state: @second_machine }
|
13
|
+
assert_equal expected, @klass.state_machines
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_write_to_state_only_once
|
17
|
+
@klass.class_eval do
|
18
|
+
attr_reader :write_count
|
19
|
+
|
20
|
+
def state=(_value)
|
21
|
+
@write_count ||= 0
|
22
|
+
@write_count += 1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
object = @klass.new
|
26
|
+
|
27
|
+
assert_equal 1, object.write_count
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_initialize_based_on_first_machine
|
31
|
+
assert_equal 'parked', @object.state
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_not_allow_second_machine_to_initialize_state
|
35
|
+
@object.state = nil
|
36
|
+
@second_machine.initialize_state(@object)
|
37
|
+
assert_nil @object.state
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_allow_transitions_on_both_machines
|
41
|
+
@machine.event :ignite do
|
42
|
+
transition parked: :idling
|
43
|
+
end
|
44
|
+
|
45
|
+
@second_machine.event :park do
|
46
|
+
transition idling: :parked
|
47
|
+
end
|
48
|
+
|
49
|
+
@object.ignite
|
50
|
+
assert_equal 'idling', @object.state
|
51
|
+
|
52
|
+
@object.park
|
53
|
+
assert_equal 'parked', @object.state
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_should_copy_new_states_to_sibling_machines
|
57
|
+
@first_gear = @machine.state :first_gear
|
58
|
+
assert_equal @first_gear, @second_machine.state(:first_gear)
|
59
|
+
|
60
|
+
@second_gear = @second_machine.state :second_gear
|
61
|
+
assert_equal @second_gear, @machine.state(:second_gear)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_should_copy_all_existing_states_to_new_machines
|
65
|
+
third_machine = StateMachines::Machine.new(@klass, :protected_state, attribute: :state)
|
66
|
+
|
67
|
+
assert_equal @machine.state(:parked), third_machine.state(:parked)
|
68
|
+
assert_equal @machine.state(:idling), third_machine.state(:idling)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|