rkoans 0.0.1 → 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/CHANGELOG.md +13 -0
- data/CURRICULUM.md +86 -0
- data/README.md +77 -0
- data/THIRD_PARTY_NOTICES.md +30 -0
- data/exercises/about-array-assignment/about_array_assignment.rb +45 -0
- data/exercises/about-array-assignment/brief.md +11 -0
- data/exercises/about-array-assignment/hint.md +11 -0
- data/exercises/about-arrays/about_arrays.rb +77 -0
- data/exercises/about-arrays/brief.md +16 -0
- data/exercises/about-arrays/hint.md +13 -0
- data/exercises/about-asserts/about_asserts.rb +22 -0
- data/exercises/about-asserts/brief.md +22 -0
- data/exercises/about-asserts/hint.md +10 -0
- data/exercises/about-blocks/about_blocks.rb +76 -0
- data/exercises/about-blocks/brief.md +44 -0
- data/exercises/about-blocks/hint.md +7 -0
- data/exercises/about-class-methods/about_class_methods.rb +105 -0
- data/exercises/about-class-methods/brief.md +73 -0
- data/exercises/about-class-methods/hint.md +8 -0
- data/exercises/about-classes/about_classes.rb +131 -0
- data/exercises/about-classes/brief.md +73 -0
- data/exercises/about-classes/hint.md +7 -0
- data/exercises/about-constants/about_constants.rb +49 -0
- data/exercises/about-constants/brief.md +51 -0
- data/exercises/about-constants/hint.md +7 -0
- data/exercises/about-control-statements/about_control_statements.rb +152 -0
- data/exercises/about-control-statements/brief.md +9 -0
- data/exercises/about-control-statements/hint.md +7 -0
- data/exercises/about-dice-project/about_dice_project.rb +27 -0
- data/exercises/about-dice-project/brief.md +12 -0
- data/exercises/about-dice-project/hint.md +5 -0
- data/exercises/about-exceptions/about_exceptions.rb +84 -0
- data/exercises/about-exceptions/brief.md +19 -0
- data/exercises/about-exceptions/hint.md +8 -0
- data/exercises/about-extra-credit/about_extra_credit.rb +117 -0
- data/exercises/about-extra-credit/brief.md +28 -0
- data/exercises/about-extra-credit/hint.md +5 -0
- data/exercises/about-hashes/about_hashes.rb +160 -0
- data/exercises/about-hashes/brief.md +9 -0
- data/exercises/about-hashes/hint.md +8 -0
- data/exercises/about-inheritance/about_inheritance.rb +63 -0
- data/exercises/about-inheritance/brief.md +50 -0
- data/exercises/about-inheritance/hint.md +8 -0
- data/exercises/about-iteration/about_iteration.rb +96 -0
- data/exercises/about-iteration/brief.md +26 -0
- data/exercises/about-iteration/hint.md +6 -0
- data/exercises/about-keyword-arguments/about_keyword_arguments.rb +56 -0
- data/exercises/about-keyword-arguments/brief.md +28 -0
- data/exercises/about-keyword-arguments/hint.md +7 -0
- data/exercises/about-message-passing/about_message_passing.rb +112 -0
- data/exercises/about-message-passing/brief.md +59 -0
- data/exercises/about-message-passing/hint.md +8 -0
- data/exercises/about-methods/about_methods.rb +104 -0
- data/exercises/about-methods/brief.md +55 -0
- data/exercises/about-methods/hint.md +8 -0
- data/exercises/about-modules/about_modules.rb +43 -0
- data/exercises/about-modules/brief.md +44 -0
- data/exercises/about-modules/hint.md +8 -0
- data/exercises/about-nil/about_nil.rb +29 -0
- data/exercises/about-nil/brief.md +12 -0
- data/exercises/about-nil/hint.md +11 -0
- data/exercises/about-objects/about_objects.rb +51 -0
- data/exercises/about-objects/brief.md +14 -0
- data/exercises/about-objects/hint.md +12 -0
- data/exercises/about-open-classes/about_open_classes.rb +38 -0
- data/exercises/about-open-classes/brief.md +34 -0
- data/exercises/about-open-classes/hint.md +7 -0
- data/exercises/about-pattern-matching/about_pattern_matching.rb +106 -0
- data/exercises/about-pattern-matching/brief.md +124 -0
- data/exercises/about-pattern-matching/hint.md +8 -0
- data/exercises/about-proxy-object-project/about_proxy_object_project.rb +43 -0
- data/exercises/about-proxy-object-project/brief.md +10 -0
- data/exercises/about-proxy-object-project/hint.md +5 -0
- data/exercises/about-regular-expressions/about_regular_expressions.rb +174 -0
- data/exercises/about-regular-expressions/brief.md +9 -0
- data/exercises/about-regular-expressions/hint.md +8 -0
- data/exercises/about-sandwich-code/about_sandwich_code.rb +58 -0
- data/exercises/about-sandwich-code/brief.md +14 -0
- data/exercises/about-sandwich-code/hint.md +5 -0
- data/exercises/about-scope/about_scope.rb +76 -0
- data/exercises/about-scope/brief.md +35 -0
- data/exercises/about-scope/hint.md +8 -0
- data/exercises/about-scoring-project/about_scoring_project.rb +16 -0
- data/exercises/about-scoring-project/brief.md +10 -0
- data/exercises/about-scoring-project/hint.md +5 -0
- data/exercises/about-strings/about_strings.rb +142 -0
- data/exercises/about-strings/brief.md +22 -0
- data/exercises/about-strings/hint.md +11 -0
- data/exercises/about-symbols/about_symbols.rb +53 -0
- data/exercises/about-symbols/brief.md +21 -0
- data/exercises/about-symbols/hint.md +12 -0
- data/exercises/about-to-str/about_to_str.rb +49 -0
- data/exercises/about-to-str/brief.md +37 -0
- data/exercises/about-to-str/hint.md +7 -0
- data/exercises/about-triangle-project/about_triangle_project.rb +15 -0
- data/exercises/about-triangle-project/brief.md +11 -0
- data/exercises/about-triangle-project/hint.md +5 -0
- data/exercises/about-triangle-project-two/about_triangle_project_two.rb +22 -0
- data/exercises/about-triangle-project-two/brief.md +10 -0
- data/exercises/about-triangle-project-two/hint.md +5 -0
- data/exercises/about-true-and-false/about_true_and_false.rb +26 -0
- data/exercises/about-true-and-false/brief.md +22 -0
- data/exercises/about-true-and-false/hint.md +7 -0
- data/exercises/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/exercises/blocks-and-methods/brief.md +8 -0
- data/exercises/blocks-and-methods/hint.md +6 -0
- data/exercises/catalog.json +61 -0
- data/exercises/class-state/brief.md +8 -0
- data/exercises/class-state/class_state.rb +39 -0
- data/exercises/class-state/hint.md +5 -0
- data/exercises/closure-capture/brief.md +8 -0
- data/exercises/closure-capture/closure_capture.rb +21 -0
- data/exercises/closure-capture/hint.md +5 -0
- data/exercises/collection-basics/brief.md +8 -0
- data/exercises/collection-basics/collection_basics.rb +16 -0
- data/exercises/collection-basics/hint.md +6 -0
- data/exercises/constant-scope/brief.md +8 -0
- data/exercises/constant-scope/constant_scope.rb +18 -0
- data/exercises/constant-scope/hint.md +5 -0
- data/exercises/core-protocols/brief.md +8 -0
- data/exercises/core-protocols/core_protocols.rb +43 -0
- data/exercises/core-protocols/hint.md +5 -0
- data/exercises/delegation/brief.md +8 -0
- data/exercises/delegation/delegation.rb +20 -0
- data/exercises/delegation/hint.md +5 -0
- data/exercises/dynamic-methods/brief.md +8 -0
- data/exercises/dynamic-methods/dynamic_methods.rb +33 -0
- data/exercises/dynamic-methods/hint.md +5 -0
- data/exercises/exception-flow/brief.md +8 -0
- data/exercises/exception-flow/exception_flow.rb +27 -0
- data/exercises/exception-flow/hint.md +5 -0
- data/exercises/heredoc-layout/brief.md +14 -0
- data/exercises/heredoc-layout/heredoc_layout.rb +25 -0
- data/exercises/heredoc-layout/hint.md +9 -0
- data/exercises/keyword-forwarding/brief.md +8 -0
- data/exercises/keyword-forwarding/hint.md +5 -0
- data/exercises/keyword-forwarding/keyword_forwarding.rb +27 -0
- data/exercises/lazy-enumeration/brief.md +8 -0
- data/exercises/lazy-enumeration/hint.md +5 -0
- data/exercises/lazy-enumeration/lazy_enumeration.rb +16 -0
- data/exercises/literals-and-operators/brief.md +20 -0
- data/exercises/literals-and-operators/hint.md +5 -0
- data/exercises/literals-and-operators/literals_and_operators.rb +15 -0
- data/exercises/method-contracts/brief.md +8 -0
- data/exercises/method-contracts/hint.md +5 -0
- data/exercises/method-contracts/method_contracts.rb +22 -0
- data/exercises/method-lookup/brief.md +8 -0
- data/exercises/method-lookup/hint.md +5 -0
- data/exercises/method-lookup/method_lookup.rb +26 -0
- data/exercises/nonlocal-exit/brief.md +8 -0
- data/exercises/nonlocal-exit/hint.md +5 -0
- data/exercises/nonlocal-exit/nonlocal_exit.rb +29 -0
- data/exercises/numbered-parameters/brief.md +18 -0
- data/exercises/numbered-parameters/hint.md +5 -0
- data/exercises/numbered-parameters/numbered_parameters.rb +18 -0
- data/exercises/numeric-precision/brief.md +8 -0
- data/exercises/numeric-precision/hint.md +5 -0
- data/exercises/numeric-precision/numeric_precision.rb +17 -0
- data/exercises/pattern-matching/brief.md +8 -0
- data/exercises/pattern-matching/hint.md +5 -0
- data/exercises/pattern-matching/pattern_matching.rb +22 -0
- data/exercises/refinement-scope/brief.md +8 -0
- data/exercises/refinement-scope/hint.md +5 -0
- data/exercises/refinement-scope/refinement_scope.rb +33 -0
- data/exercises/regexp-captures/brief.md +8 -0
- data/exercises/regexp-captures/hint.md +5 -0
- data/exercises/regexp-captures/regexp_captures.rb +25 -0
- data/exercises/runtime-context/brief.md +20 -0
- data/exercises/runtime-context/hint.md +8 -0
- data/exercises/runtime-context/runtime_context.rb +11 -0
- data/exercises/shared-rows/brief.md +8 -0
- data/exercises/shared-rows/hint.md +7 -0
- data/exercises/shared-rows/shared_rows.rb +13 -0
- data/exercises/singleton-pattern/brief.md +8 -0
- data/exercises/singleton-pattern/hint.md +5 -0
- data/exercises/singleton-pattern/singleton_pattern.rb +20 -0
- data/exercises/time-and-date/brief.md +8 -0
- data/exercises/time-and-date/hint.md +5 -0
- data/exercises/time-and-date/time_and_date.rb +21 -0
- data/exercises/visibility/brief.md +8 -0
- data/exercises/visibility/hint.md +5 -0
- data/exercises/visibility/visibility.rb +32 -0
- data/lib/rkoans/catalog.rb +31 -0
- data/lib/rkoans/checker.rb +62 -0
- data/lib/rkoans/cli.rb +79 -0
- data/lib/rkoans/error.rb +6 -0
- data/lib/rkoans/exercise.rb +50 -0
- data/lib/rkoans/keyboard.rb +51 -0
- data/lib/rkoans/progress.rb +39 -0
- data/lib/rkoans/selection.rb +31 -0
- data/lib/rkoans/session.rb +127 -0
- data/lib/rkoans/terminal_view.rb +99 -0
- data/lib/rkoans/version.rb +1 -1
- data/lib/rkoans/watcher.rb +58 -0
- data/lib/rkoans.rb +13 -3
- data/sig/about_array_assignment_acceptance_test.rbs +3 -0
- data/sig/about_arrays_acceptance_test.rbs +3 -0
- data/sig/about_asserts_command_test.rbs +4 -0
- data/sig/about_blocks_acceptance_test.rbs +3 -0
- data/sig/about_class_methods_acceptance_test.rbs +3 -0
- data/sig/about_classes_acceptance_test.rbs +3 -0
- data/sig/about_constants_acceptance_test.rbs +3 -0
- data/sig/about_control_statements_acceptance_test.rbs +3 -0
- data/sig/about_dice_project_acceptance_test.rbs +3 -0
- data/sig/about_exceptions_acceptance_test.rbs +3 -0
- data/sig/about_extra_credit_acceptance_test.rbs +5 -0
- data/sig/about_hashes_acceptance_test.rbs +3 -0
- data/sig/about_inheritance_acceptance_test.rbs +3 -0
- data/sig/about_iteration_acceptance_test.rbs +3 -0
- data/sig/about_keyword_arguments_acceptance_test.rbs +3 -0
- data/sig/about_message_passing_acceptance_test.rbs +3 -0
- data/sig/about_methods_acceptance_test.rbs +3 -0
- data/sig/about_modules_acceptance_test.rbs +3 -0
- data/sig/about_nil_acceptance_test.rbs +3 -0
- data/sig/about_objects_acceptance_test.rbs +3 -0
- data/sig/about_open_classes_acceptance_test.rbs +3 -0
- data/sig/about_pattern_matching_acceptance_test.rbs +3 -0
- data/sig/about_proxy_object_project_acceptance_test.rbs +3 -0
- data/sig/about_regular_expressions_acceptance_test.rbs +3 -0
- data/sig/about_sandwich_code_acceptance_test.rbs +3 -0
- data/sig/about_scope_acceptance_test.rbs +3 -0
- data/sig/about_scoring_project_acceptance_test.rbs +3 -0
- data/sig/about_strings_acceptance_test.rbs +3 -0
- data/sig/about_symbols_acceptance_test.rbs +3 -0
- data/sig/about_to_str_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_two_acceptance_test.rbs +3 -0
- data/sig/about_true_and_false_command_test.rbs +4 -0
- data/sig/catalog_error_command_test.rbs +4 -0
- data/sig/checker_test.rbs +9 -0
- data/sig/class_state_acceptance_test.rbs +3 -0
- data/sig/closure_capture_acceptance_test.rbs +3 -0
- data/sig/command_support.rbs +18 -0
- data/sig/command_test.rbs +5 -0
- data/sig/constant_scope_acceptance_test.rbs +3 -0
- data/sig/core_protocols_acceptance_test.rbs +3 -0
- data/sig/curriculum_cop_test.rbs +9 -0
- data/sig/delegation_acceptance_test.rbs +3 -0
- data/sig/dynamic_methods_acceptance_test.rbs +3 -0
- data/sig/exception_flow_acceptance_test.rbs +3 -0
- data/sig/exercise_test.rbs +3 -0
- data/sig/exercises/about_array_assignment.rbs +36 -0
- data/sig/exercises/about_arrays.rbs +51 -0
- data/sig/exercises/about_asserts.rbs +23 -0
- data/sig/exercises/about_blocks.rbs +40 -0
- data/sig/exercises/about_class_methods.rbs +62 -0
- data/sig/exercises/about_classes.rbs +88 -0
- data/sig/exercises/about_constants.rbs +53 -0
- data/sig/exercises/about_control_statements.rbs +46 -0
- data/sig/exercises/about_dice_project.rbs +16 -0
- data/sig/exercises/about_exceptions.rbs +36 -0
- data/sig/exercises/about_extra_credit.rbs +36 -0
- data/sig/exercises/about_hashes.rbs +62 -0
- data/sig/exercises/about_inheritance.rbs +50 -0
- data/sig/exercises/about_iteration.rbs +37 -0
- data/sig/exercises/about_keyword_arguments.rbs +33 -0
- data/sig/exercises/about_message_passing.rbs +68 -0
- data/sig/exercises/about_methods.rbs +68 -0
- data/sig/exercises/about_modules.rbs +38 -0
- data/sig/exercises/about_nil.rbs +23 -0
- data/sig/exercises/about_objects.rbs +38 -0
- data/sig/exercises/about_open_classes.rbs +31 -0
- data/sig/exercises/about_pattern_matching.rbs +65 -0
- data/sig/exercises/about_proxy_object_project.rbs +31 -0
- data/sig/exercises/about_regular_expressions.rbs +83 -0
- data/sig/exercises/about_sandwich_code.rbs +17 -0
- data/sig/exercises/about_scope.rbs +59 -0
- data/sig/exercises/about_scoring_project.rbs +16 -0
- data/sig/exercises/about_strings.rbs +85 -0
- data/sig/exercises/about_symbols.rbs +46 -0
- data/sig/exercises/about_to_str.rbs +36 -0
- data/sig/exercises/about_triangle_project.rbs +11 -0
- data/sig/exercises/about_triangle_project_two.rbs +12 -0
- data/sig/exercises/about_true_and_false.rbs +27 -0
- data/sig/exercises/blocks_and_methods.rbs +11 -0
- data/sig/exercises/class_state.rbs +19 -0
- data/sig/exercises/closure_capture.rbs +10 -0
- data/sig/exercises/collection_basics.rbs +6 -0
- data/sig/exercises/collection_basics_test.rbs +4 -0
- data/sig/exercises/constant_scope.rbs +11 -0
- data/sig/exercises/core_protocols.rbs +20 -0
- data/sig/exercises/delegation.rbs +14 -0
- data/sig/exercises/dynamic_methods.rbs +13 -0
- data/sig/exercises/exception_flow.rbs +11 -0
- data/sig/exercises/heredoc_layout.rbs +11 -0
- data/sig/exercises/keyword_forwarding.rbs +12 -0
- data/sig/exercises/lazy_enumeration.rbs +10 -0
- data/sig/exercises/literals_and_operators.rbs +12 -0
- data/sig/exercises/method_contracts.rbs +11 -0
- data/sig/exercises/method_lookup.rbs +16 -0
- data/sig/exercises/nonlocal_exit.rbs +14 -0
- data/sig/exercises/numbered_parameters.rbs +11 -0
- data/sig/exercises/numeric_precision.rbs +11 -0
- data/sig/exercises/pattern_matching.rbs +10 -0
- data/sig/exercises/refinement_scope.rbs +18 -0
- data/sig/exercises/regexp_captures.rbs +11 -0
- data/sig/exercises/runtime_context.rbs +23 -0
- data/sig/exercises/shared_rows.rbs +11 -0
- data/sig/exercises/singleton_pattern.rbs +14 -0
- data/sig/exercises/time_and_date.rbs +11 -0
- data/sig/exercises/visibility.rbs +18 -0
- data/sig/fixture_support.rbs +11 -0
- data/sig/help_hint_command_test.rbs +8 -0
- data/sig/heredoc_layout_acceptance_test.rbs +3 -0
- data/sig/keyboard_session_test.rbs +9 -0
- data/sig/keyword_forwarding_acceptance_test.rbs +3 -0
- data/sig/lazy_enumeration_acceptance_test.rbs +3 -0
- data/sig/literals_and_operators_acceptance_test.rbs +3 -0
- data/sig/method_contracts_acceptance_test.rbs +3 -0
- data/sig/method_lookup_acceptance_test.rbs +3 -0
- data/sig/nonlocal_exit_acceptance_test.rbs +3 -0
- data/sig/numbered_parameters_acceptance_test.rbs +3 -0
- data/sig/numeric_precision_acceptance_test.rbs +4 -0
- data/sig/packaging_test.rbs +3 -0
- data/sig/pattern_matching_acceptance_test.rbs +3 -0
- data/sig/reference_solutions_test.rbs +3 -0
- data/sig/refinement_scope_acceptance_test.rbs +3 -0
- data/sig/regexp_captures_acceptance_test.rbs +4 -0
- data/sig/rkoans/catalog.rbs +11 -0
- data/sig/rkoans/checker.rbs +22 -0
- data/sig/rkoans/cli.rbs +21 -0
- data/sig/rkoans/exercise.rbs +18 -0
- data/sig/rkoans/keyboard.rbs +13 -0
- data/sig/rkoans/progress.rbs +9 -0
- data/sig/rkoans/selection.rbs +9 -0
- data/sig/rkoans/session.rbs +30 -0
- data/sig/rkoans/terminal_view.rbs +24 -0
- data/sig/rkoans/watcher.rbs +18 -0
- data/sig/rkoans.rbs +2 -0
- data/sig/runtime_context_command_test.rbs +4 -0
- data/sig/selection_command_test.rbs +5 -0
- data/sig/session_command_test.rbs +12 -0
- data/sig/session_edge_cases_test.rbs +4 -0
- data/sig/shared_rows_acceptance_test.rbs +3 -0
- data/sig/singleton_pattern_acceptance_test.rbs +3 -0
- data/sig/time_and_date_acceptance_test.rbs +4 -0
- data/sig/visibility_acceptance_test.rbs +4 -0
- data/sig/watcher_test.rbs +3 -0
- data/solutions/about-array-assignment/about_array_assignment.rb +36 -0
- data/solutions/about-arrays/about_arrays.rb +53 -0
- data/solutions/about-asserts/about_asserts.rb +22 -0
- data/solutions/about-blocks/about_blocks.rb +30 -0
- data/solutions/about-class-methods/about_class_methods.rb +36 -0
- data/solutions/about-classes/about_classes.rb +40 -0
- data/solutions/about-constants/about_constants.rb +26 -0
- data/solutions/about-control-statements/about_control_statements.rb +35 -0
- data/solutions/about-dice-project/about_dice_project.rb +27 -0
- data/solutions/about-exceptions/about_exceptions.rb +30 -0
- data/solutions/about-extra-credit/about_extra_credit.rb +114 -0
- data/solutions/about-hashes/about_hashes.rb +52 -0
- data/solutions/about-inheritance/about_inheritance.rb +27 -0
- data/solutions/about-iteration/about_iteration.rb +31 -0
- data/solutions/about-keyword-arguments/about_keyword_arguments.rb +28 -0
- data/solutions/about-message-passing/about_message_passing.rb +38 -0
- data/solutions/about-methods/about_methods.rb +39 -0
- data/solutions/about-modules/about_modules.rb +23 -0
- data/solutions/about-nil/about_nil.rb +23 -0
- data/solutions/about-objects/about_objects.rb +34 -0
- data/solutions/about-open-classes/about_open_classes.rb +23 -0
- data/solutions/about-pattern-matching/about_pattern_matching.rb +39 -0
- data/solutions/about-proxy-object-project/about_proxy_object_project.rb +44 -0
- data/solutions/about-regular-expressions/about_regular_expressions.rb +60 -0
- data/solutions/about-sandwich-code/about_sandwich_code.rb +60 -0
- data/solutions/about-scope/about_scope.rb +33 -0
- data/solutions/about-scoring-project/about_scoring_project.rb +19 -0
- data/solutions/about-strings/about_strings.rb +56 -0
- data/solutions/about-symbols/about_symbols.rb +35 -0
- data/solutions/about-to-str/about_to_str.rb +24 -0
- data/solutions/about-triangle-project/about_triangle_project.rb +19 -0
- data/solutions/about-triangle-project-two/about_triangle_project_two.rb +25 -0
- data/solutions/about-true-and-false/about_true_and_false.rb +25 -0
- data/solutions/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/solutions/class-state/class_state.rb +33 -0
- data/solutions/closure-capture/closure_capture.rb +12 -0
- data/solutions/collection-basics/collection_basics.rb +14 -0
- data/solutions/constant-scope/constant_scope.rb +18 -0
- data/solutions/core-protocols/core_protocols.rb +44 -0
- data/solutions/delegation/delegation.rb +17 -0
- data/solutions/dynamic-methods/dynamic_methods.rb +32 -0
- data/solutions/exception-flow/exception_flow.rb +34 -0
- data/solutions/heredoc-layout/heredoc_layout.rb +24 -0
- data/solutions/keyword-forwarding/keyword_forwarding.rb +26 -0
- data/solutions/lazy-enumeration/lazy_enumeration.rb +11 -0
- data/solutions/literals-and-operators/literals_and_operators.rb +22 -0
- data/solutions/method-contracts/method_contracts.rb +18 -0
- data/solutions/method-lookup/method_lookup.rb +26 -0
- data/solutions/nonlocal-exit/nonlocal_exit.rb +46 -0
- data/solutions/numbered-parameters/numbered_parameters.rb +18 -0
- data/solutions/numeric-precision/numeric_precision.rb +17 -0
- data/solutions/pattern-matching/pattern_matching.rb +17 -0
- data/solutions/refinement-scope/refinement_scope.rb +34 -0
- data/solutions/regexp-captures/regexp_captures.rb +24 -0
- data/solutions/runtime-context/runtime_context.rb +19 -0
- data/solutions/shared-rows/shared_rows.rb +13 -0
- data/solutions/singleton-pattern/singleton_pattern.rb +19 -0
- data/solutions/time-and-date/time_and_date.rb +16 -0
- data/solutions/visibility/visibility.rb +34 -0
- data/test/exercises/about_array_assignment_test.rb +87 -0
- data/test/exercises/about_arrays_test.rb +119 -0
- data/test/exercises/about_asserts_test.rb +41 -0
- data/test/exercises/about_blocks_test.rb +140 -0
- data/test/exercises/about_class_methods_test.rb +232 -0
- data/test/exercises/about_classes_test.rb +261 -0
- data/test/exercises/about_constants_test.rb +111 -0
- data/test/exercises/about_control_statements_test.rb +188 -0
- data/test/exercises/about_dice_project_test.rb +40 -0
- data/test/exercises/about_exceptions_test.rb +98 -0
- data/test/exercises/about_extra_credit_test.rb +74 -0
- data/test/exercises/about_hashes_test.rb +163 -0
- data/test/exercises/about_inheritance_test.rb +121 -0
- data/test/exercises/about_iteration_test.rb +148 -0
- data/test/exercises/about_keyword_arguments_test.rb +80 -0
- data/test/exercises/about_message_passing_test.rb +230 -0
- data/test/exercises/about_methods_test.rb +208 -0
- data/test/exercises/about_modules_test.rb +98 -0
- data/test/exercises/about_nil_test.rb +35 -0
- data/test/exercises/about_objects_test.rb +74 -0
- data/test/exercises/about_open_classes_test.rb +60 -0
- data/test/exercises/about_pattern_matching_test.rb +257 -0
- data/test/exercises/about_proxy_object_project_test.rb +75 -0
- data/test/exercises/about_regular_expressions_test.rb +243 -0
- data/test/exercises/about_sandwich_code_test.rb +82 -0
- data/test/exercises/about_scope_test.rb +123 -0
- data/test/exercises/about_scoring_project_test.rb +62 -0
- data/test/exercises/about_strings_test.rb +255 -0
- data/test/exercises/about_symbols_test.rb +120 -0
- data/test/exercises/about_to_str_test.rb +89 -0
- data/test/exercises/about_triangle_project_test.rb +29 -0
- data/test/exercises/about_triangle_project_two_test.rb +28 -0
- data/test/exercises/about_true_and_false_test.rb +43 -0
- data/test/exercises/blocks_and_methods_test.rb +22 -0
- data/test/exercises/class_state_test.rb +29 -0
- data/test/exercises/closure_capture_test.rb +29 -0
- data/test/exercises/collection_basics_test.rb +18 -0
- data/test/exercises/constant_scope_test.rb +18 -0
- data/test/exercises/core_protocols_test.rb +28 -0
- data/test/exercises/delegation_test.rb +23 -0
- data/test/exercises/dynamic_methods_test.rb +28 -0
- data/test/exercises/exception_flow_test.rb +17 -0
- data/test/exercises/heredoc_layout_test.rb +18 -0
- data/test/exercises/keyword_forwarding_test.rb +22 -0
- data/test/exercises/lazy_enumeration_test.rb +15 -0
- data/test/exercises/literals_and_operators_test.rb +25 -0
- data/test/exercises/method_contracts_test.rb +28 -0
- data/test/exercises/method_lookup_test.rb +14 -0
- data/test/exercises/nonlocal_exit_test.rb +22 -0
- data/test/exercises/numbered_parameters_test.rb +15 -0
- data/test/exercises/numeric_precision_test.rb +24 -0
- data/test/exercises/pattern_matching_test.rb +18 -0
- data/test/exercises/refinement_scope_test.rb +14 -0
- data/test/exercises/regexp_captures_test.rb +20 -0
- data/test/exercises/runtime_context_test.rb +59 -0
- data/test/exercises/shared_rows_test.rb +34 -0
- data/test/exercises/singleton_pattern_test.rb +16 -0
- data/test/exercises/time_and_date_test.rb +22 -0
- data/test/exercises/visibility_test.rb +22 -0
- metadata +471 -4
- data/Rakefile +0 -12
- data/sig/test_rkoans.rbs +0 -3
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
# Preserve assignment syntax rather than rewriting the expressions being taught.
|
|
8
|
+
# rubocop:disable Style/WordArray, Style/ParallelAssignment
|
|
9
|
+
|
|
10
|
+
require ARGV.shift
|
|
11
|
+
|
|
12
|
+
# Observes how assignment distributes, collects, and preserves array values.
|
|
13
|
+
class AboutArrayAssignmentTest < Minitest::Test
|
|
14
|
+
# Assigning to one variable keeps the entire array.
|
|
15
|
+
def test_non_parallel_assignment
|
|
16
|
+
names = ['John', 'Smith']
|
|
17
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
18
|
+
|
|
19
|
+
assert_equal answers[:names], names
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Parallel assignment distributes values in order.
|
|
23
|
+
def test_parallel_assignments
|
|
24
|
+
first_name, last_name = ['John', 'Smith']
|
|
25
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
26
|
+
|
|
27
|
+
assert_equal answers[:first_name], first_name
|
|
28
|
+
assert_equal answers[:last_name], last_name
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Extra values are discarded without a splat.
|
|
32
|
+
def test_parallel_assignments_with_extra_values
|
|
33
|
+
first_name, last_name = ['John', 'Smith', 'III']
|
|
34
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
35
|
+
|
|
36
|
+
assert_equal answers[:extra_first], first_name
|
|
37
|
+
assert_equal answers[:extra_last], last_name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# A splat collects the remaining values in an array.
|
|
41
|
+
def test_parallel_assignments_with_splat_operator
|
|
42
|
+
first_name, *last_name = ['John', 'Smith', 'III']
|
|
43
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
44
|
+
|
|
45
|
+
assert_equal answers[:splat_first], first_name
|
|
46
|
+
assert_equal answers[:splat_last], last_name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Missing values become nil.
|
|
50
|
+
def test_parallel_assignments_with_too_few_values
|
|
51
|
+
first_name, last_name = ['Cher']
|
|
52
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
53
|
+
|
|
54
|
+
assert_equal answers[:short_first], first_name
|
|
55
|
+
assert_equal answers[:short_last], last_name
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# An inner array remains a single assigned value.
|
|
59
|
+
def test_parallel_assignments_with_subarrays
|
|
60
|
+
first_name, last_name = [['Willie', 'Rae'], 'Johnson']
|
|
61
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
62
|
+
|
|
63
|
+
assert_equal answers[:nested_first], first_name
|
|
64
|
+
assert_equal answers[:nested_last], last_name
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# A trailing comma requests parallel assignment with one variable.
|
|
68
|
+
def test_parallel_assignment_with_one_variable
|
|
69
|
+
first_name, = ['John', 'Smith']
|
|
70
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
71
|
+
|
|
72
|
+
assert_equal answers[:single_first], first_name
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Right-hand values are evaluated before the assignments.
|
|
76
|
+
def test_swapping_with_parallel_assignment
|
|
77
|
+
first_name = 'Roy'
|
|
78
|
+
last_name = 'Rob'
|
|
79
|
+
first_name, last_name = last_name, first_name
|
|
80
|
+
answers = Exercises::AboutArrayAssignment.koans
|
|
81
|
+
|
|
82
|
+
assert_equal answers[:swapped_first], first_name
|
|
83
|
+
assert_equal answers[:swapped_last], last_name
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# rubocop:enable Style/WordArray, Style/ParallelAssignment
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Explicit array literals preserve the introductory examples.
|
|
4
|
+
# rubocop:disable Style/SymbolArray
|
|
5
|
+
|
|
6
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
7
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
8
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
9
|
+
|
|
10
|
+
require ARGV.shift
|
|
11
|
+
|
|
12
|
+
# Observes array values before and after indexing, slicing, and mutations.
|
|
13
|
+
class AboutArraysTest < Minitest::Test
|
|
14
|
+
# A new array has a type and an initial size.
|
|
15
|
+
def test_creating_arrays
|
|
16
|
+
empty_array = Array.new # rubocop:disable Style/EmptyLiteral
|
|
17
|
+
answers = Exercises::AboutArrays.koans
|
|
18
|
+
|
|
19
|
+
assert_equal answers[:empty_type], empty_array.class
|
|
20
|
+
assert_equal answers[:empty_size], empty_array.size
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Indexed assignment and appending build an array incrementally.
|
|
24
|
+
def test_array_literals
|
|
25
|
+
array = Array.new # rubocop:disable Style/EmptyLiteral
|
|
26
|
+
|
|
27
|
+
assert_equal [], array
|
|
28
|
+
|
|
29
|
+
array[0] = 1
|
|
30
|
+
|
|
31
|
+
assert_equal [1], array
|
|
32
|
+
|
|
33
|
+
answers = Exercises::AboutArrays.koans
|
|
34
|
+
array[1] = 2
|
|
35
|
+
|
|
36
|
+
assert_equal [1, answers[:second_literal]], array
|
|
37
|
+
|
|
38
|
+
array << 333
|
|
39
|
+
|
|
40
|
+
assert_equal answers[:after_append], array
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Positive indexes count from the start; negative indexes count from the end.
|
|
44
|
+
def test_accessing_array_elements
|
|
45
|
+
array = [:peanut, :butter, :and, :jelly]
|
|
46
|
+
answers = Exercises::AboutArrays.koans
|
|
47
|
+
|
|
48
|
+
assert_equal answers[:first_index], array[0]
|
|
49
|
+
assert_equal answers[:first_method], array.first
|
|
50
|
+
assert_equal answers[:last_index], array[3]
|
|
51
|
+
assert_equal answers[:last_method], array.last
|
|
52
|
+
assert_equal answers[:negative_last], array[-1]
|
|
53
|
+
assert_equal answers[:negative_third], array[-3]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Slices distinguish a starting index at the end from one beyond the end.
|
|
57
|
+
def test_slicing_arrays
|
|
58
|
+
array = [:peanut, :butter, :and, :jelly]
|
|
59
|
+
answers = Exercises::AboutArrays.koans
|
|
60
|
+
|
|
61
|
+
assert_equal answers[:slice_one], array[0, 1]
|
|
62
|
+
assert_equal answers[:slice_two], array[0, 2]
|
|
63
|
+
assert_equal answers[:slice_tail], array[2, 2]
|
|
64
|
+
assert_equal answers[:slice_long_tail], array[2, 20]
|
|
65
|
+
assert_equal answers[:slice_at_end_zero], array[4, 0]
|
|
66
|
+
assert_equal answers[:slice_at_end_long], array[4, 100]
|
|
67
|
+
assert_equal answers[:slice_beyond_end], array[5, 0]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# A range differs from an array and can include or exclude its endpoint.
|
|
71
|
+
def test_arrays_and_ranges
|
|
72
|
+
answers = Exercises::AboutArrays.koans
|
|
73
|
+
|
|
74
|
+
assert_equal answers[:range_type], (1..5).class
|
|
75
|
+
refute_equal [1, 2, 3, 4, 5], (1..5)
|
|
76
|
+
assert_equal answers[:inclusive_range], (1..5).to_a
|
|
77
|
+
assert_equal answers[:exclusive_range], (1...5).to_a
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Ranges select slices and can end at a negative index.
|
|
81
|
+
def test_slicing_with_ranges
|
|
82
|
+
array = [:peanut, :butter, :and, :jelly]
|
|
83
|
+
answers = Exercises::AboutArrays.koans
|
|
84
|
+
|
|
85
|
+
assert_equal answers[:inclusive_slice], array[0..2]
|
|
86
|
+
assert_equal answers[:exclusive_slice], array[0...2]
|
|
87
|
+
assert_equal answers[:negative_range_slice], array[2..-1] # rubocop:disable Style/SlicingWithRange
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Push and pop change the end of an array; pop returns the removed element.
|
|
91
|
+
def test_pushing_and_popping_arrays
|
|
92
|
+
array = [1, 2]
|
|
93
|
+
array.push(:last)
|
|
94
|
+
answers = Exercises::AboutArrays.koans
|
|
95
|
+
|
|
96
|
+
assert_equal answers[:after_push], array
|
|
97
|
+
|
|
98
|
+
popped_value = array.pop
|
|
99
|
+
|
|
100
|
+
assert_equal answers[:popped_value], popped_value
|
|
101
|
+
assert_equal answers[:after_pop], array
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Unshift and shift change the start; shift returns the removed element.
|
|
105
|
+
def test_shifting_arrays
|
|
106
|
+
array = [1, 2]
|
|
107
|
+
array.unshift(:first)
|
|
108
|
+
answers = Exercises::AboutArrays.koans
|
|
109
|
+
|
|
110
|
+
assert_equal answers[:after_unshift], array
|
|
111
|
+
|
|
112
|
+
shifted_value = array.shift
|
|
113
|
+
|
|
114
|
+
assert_equal answers[:shifted_value], shifted_value
|
|
115
|
+
assert_equal answers[:after_shift], array
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# rubocop:enable Style/SymbolArray
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
require ARGV.shift
|
|
8
|
+
|
|
9
|
+
# Introduces assertion truth, failure messages, equality, and expected values.
|
|
10
|
+
class AboutAssertsTest < Minitest::Test
|
|
11
|
+
# We shall contemplate truth by testing reality, via asserts.
|
|
12
|
+
def test_assert_truth
|
|
13
|
+
assert Exercises::AboutAsserts.koans[:truth]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Enlightenment may be more easily achieved with appropriate messages.
|
|
17
|
+
def test_assert_with_message
|
|
18
|
+
assert Exercises::AboutAsserts.koans[:with_message], 'This should be true -- Please fix this'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Compare expectations with reality using bare assert before the better diagnostic below.
|
|
22
|
+
def test_assert_equality
|
|
23
|
+
expected_value = Exercises::AboutAsserts.koans[:expected_value]
|
|
24
|
+
actual_value = 1 + 1
|
|
25
|
+
|
|
26
|
+
assert expected_value == actual_value # rubocop:disable Minitest/AssertEqual, Minitest/AssertOperator
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Some ways of asserting equality are better than others.
|
|
30
|
+
def test_a_better_way_of_asserting_equality
|
|
31
|
+
expected_value = Exercises::AboutAsserts.koans[:better_expected_value]
|
|
32
|
+
actual_value = 1 + 1
|
|
33
|
+
|
|
34
|
+
assert_equal expected_value, actual_value
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Sometimes we will ask you to fill in the values.
|
|
38
|
+
def test_fill_in_values
|
|
39
|
+
assert_equal Exercises::AboutAsserts.koans[:filled_value], 1 + 1
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# The original descriptive check identifiers and example strings remain intact.
|
|
4
|
+
# The examples contrast block forms and their behavior.
|
|
5
|
+
# The example preserves the callable syntax being taught.
|
|
6
|
+
# Explicit callable arguments demonstrate block and proc behavior.
|
|
7
|
+
# rubocop:disable Layout/LineLength, Style/BlockDelimiters, Style/Lambda, Style/SymbolProc
|
|
8
|
+
|
|
9
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
10
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
11
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
12
|
+
|
|
13
|
+
require ARGV.shift
|
|
14
|
+
class AboutBlocksTest < Minitest::Test
|
|
15
|
+
# Demonstrates method with block.
|
|
16
|
+
def method_with_block
|
|
17
|
+
yield
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Checks methods can take blocks.
|
|
21
|
+
def test_methods_can_take_blocks
|
|
22
|
+
yielded_result = method_with_block { 1 + 2 }
|
|
23
|
+
|
|
24
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:methods_can_take_blocks_one), yielded_result
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Checks blocks can be defined with do end too.
|
|
28
|
+
def test_blocks_can_be_defined_with_do_end_too
|
|
29
|
+
yielded_result = method_with_block do
|
|
30
|
+
1 + 2
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:blocks_can_be_defined_with_do_end_too_one), yielded_result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# ------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
# Demonstrates method with block arguments.
|
|
39
|
+
def method_with_block_arguments
|
|
40
|
+
yield('Jim')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Checks blocks can take arguments.
|
|
44
|
+
def test_blocks_can_take_arguments
|
|
45
|
+
method_with_block_arguments do |argument|
|
|
46
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:blocks_can_take_arguments_one), argument
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# ------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
# Demonstrates many yields.
|
|
53
|
+
def many_yields
|
|
54
|
+
yield(:peanut)
|
|
55
|
+
yield(:butter)
|
|
56
|
+
yield(:and)
|
|
57
|
+
yield(:jelly)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Checks methods can call yield many times.
|
|
61
|
+
def test_methods_can_call_yield_many_times
|
|
62
|
+
result = []
|
|
63
|
+
many_yields { |item| result << item }
|
|
64
|
+
|
|
65
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:methods_can_call_yield_many_times_one), result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# ------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
# Demonstrates yield tester.
|
|
71
|
+
def yield_tester
|
|
72
|
+
if block_given?
|
|
73
|
+
yield
|
|
74
|
+
else
|
|
75
|
+
:no_block
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Checks methods can see if they have been called with a block.
|
|
80
|
+
def test_methods_can_see_if_they_have_been_called_with_a_block
|
|
81
|
+
assert_equal(Exercises::AboutBlocks.koans.fetch(:methods_can_see_if_they_have_been_called_with_a_block_one), yield_tester {
|
|
82
|
+
:with_block
|
|
83
|
+
})
|
|
84
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:methods_can_see_if_they_have_been_called_with_a_block_two),
|
|
85
|
+
yield_tester
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# ------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
# Checks block can affect variables in the code where they are created.
|
|
91
|
+
def test_block_can_affect_variables_in_the_code_where_they_are_created
|
|
92
|
+
value = :initial_value
|
|
93
|
+
method_with_block { value = :modified_in_a_block }
|
|
94
|
+
|
|
95
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:block_can_affect_variables_in_the_code_where_they_are_created_one),
|
|
96
|
+
value
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Checks blocks can be assigned to variables and called explicitly.
|
|
100
|
+
def test_blocks_can_be_assigned_to_variables_and_called_explicitly
|
|
101
|
+
add_one = lambda { |n| n + 1 }
|
|
102
|
+
|
|
103
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:blocks_can_be_assigned_to_variables_and_called_explicitly_one),
|
|
104
|
+
add_one.call(10)
|
|
105
|
+
|
|
106
|
+
# Alternative calling syntax
|
|
107
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:blocks_can_be_assigned_to_variables_and_called_explicitly_two),
|
|
108
|
+
add_one[10]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Checks stand alone blocks can be passed to methods expecting blocks.
|
|
112
|
+
def test_stand_alone_blocks_can_be_passed_to_methods_expecting_blocks
|
|
113
|
+
make_upper = lambda { |n| n.upcase }
|
|
114
|
+
result = method_with_block_arguments(&make_upper)
|
|
115
|
+
|
|
116
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:stand_alone_blocks_can_be_passed_to_methods_expecting_blocks_one),
|
|
117
|
+
result
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# ------------------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
# Demonstrates method with explicit block.
|
|
123
|
+
def method_with_explicit_block(&block)
|
|
124
|
+
block.call(10)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Checks methods can take an explicit block argument.
|
|
128
|
+
def test_methods_can_take_an_explicit_block_argument
|
|
129
|
+
assert_equal(Exercises::AboutBlocks.koans.fetch(:methods_can_take_an_explicit_block_argument_one), method_with_explicit_block { |n|
|
|
130
|
+
n * 2
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
add_one = lambda { |n| n + 1 }
|
|
134
|
+
|
|
135
|
+
assert_equal Exercises::AboutBlocks.koans.fetch(:methods_can_take_an_explicit_block_argument_two),
|
|
136
|
+
method_with_explicit_block(&add_one)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# rubocop:enable Layout/LineLength, Style/BlockDelimiters, Style/Lambda, Style/SymbolProc
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# An empty class demonstrates construction without custom methods.
|
|
4
|
+
# These original names demonstrate constants and class objects.
|
|
5
|
+
# The lesson contrasts explicit class receivers with self and singleton-class syntax.
|
|
6
|
+
# Explicit getter definitions are compared with attr_reader and attr_accessor.
|
|
7
|
+
# rubocop:disable Lint/EmptyClass, Naming/ConstantName, Style/ClassMethods, Style/TrivialAccessors
|
|
8
|
+
|
|
9
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
10
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
11
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
12
|
+
|
|
13
|
+
require ARGV.shift
|
|
14
|
+
class AboutClassMethodsTest < Minitest::Test
|
|
15
|
+
class Dog
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Checks objects are objects.
|
|
19
|
+
def test_objects_are_objects
|
|
20
|
+
fido = Dog.new
|
|
21
|
+
|
|
22
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:objects_are_objects_one), fido.is_a?(Object)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Checks classes are classes.
|
|
26
|
+
def test_classes_are_classes
|
|
27
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:classes_are_classes_one), Dog.is_a?(Class)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Checks classes are objects too.
|
|
31
|
+
def test_classes_are_objects_too
|
|
32
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:classes_are_objects_too_one), Dog.is_a?(Object)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Checks objects have methods.
|
|
36
|
+
def test_objects_have_methods
|
|
37
|
+
fido = Dog.new
|
|
38
|
+
|
|
39
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:objects_have_methods_one), fido.methods.any?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Checks classes have methods.
|
|
43
|
+
def test_classes_have_methods
|
|
44
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:classes_have_methods_one), Dog.methods.any?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Checks you can define methods on individual objects.
|
|
48
|
+
def test_you_can_define_methods_on_individual_objects
|
|
49
|
+
fido = Dog.new
|
|
50
|
+
# Demonstrates fido.wag.
|
|
51
|
+
def fido.wag
|
|
52
|
+
:fidos_wag
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:you_can_define_methods_on_individual_objects_one), fido.wag
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Checks other objects are not affected by these singleton methods.
|
|
59
|
+
def test_other_objects_are_not_affected_by_these_singleton_methods
|
|
60
|
+
fido = Dog.new
|
|
61
|
+
rover = Dog.new
|
|
62
|
+
# Demonstrates fido.wag.
|
|
63
|
+
def fido.wag
|
|
64
|
+
:fidos_wag
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
assert_predicted_error(:other_objects_are_not_affected_by_these_singleton_methods_one, ::NoMethodError) do
|
|
68
|
+
rover.wag
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# ------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
class Dog2
|
|
75
|
+
# Demonstrates wag.
|
|
76
|
+
def wag
|
|
77
|
+
:instance_level_wag
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Demonstrates Dog2.wag.
|
|
82
|
+
def Dog2.wag
|
|
83
|
+
:class_level_wag
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Checks since classes are objects you can define singleton methods on them too.
|
|
87
|
+
def test_since_classes_are_objects_you_can_define_singleton_methods_on_them_too
|
|
88
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:since_classes_are_objects_you_can_define_singleton_methods_on_them_too_one),
|
|
89
|
+
Dog2.wag
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Checks class methods are independent of instance methods.
|
|
93
|
+
def test_class_methods_are_independent_of_instance_methods
|
|
94
|
+
fido = Dog2.new
|
|
95
|
+
|
|
96
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:class_methods_are_independent_of_instance_methods_one),
|
|
97
|
+
fido.wag
|
|
98
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:class_methods_are_independent_of_instance_methods_two),
|
|
99
|
+
Dog2.wag
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# ------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
class Dog
|
|
105
|
+
attr_accessor :name
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Demonstrates Dog.name.
|
|
109
|
+
def Dog.name
|
|
110
|
+
@name
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Checks classes and instances do not share instance variables.
|
|
114
|
+
def test_classes_and_instances_do_not_share_instance_variables
|
|
115
|
+
fido = Dog.new
|
|
116
|
+
fido.name = 'Fido'
|
|
117
|
+
|
|
118
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:classes_and_instances_do_not_share_instance_variables_one),
|
|
119
|
+
fido.name
|
|
120
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:classes_and_instances_do_not_share_instance_variables_two),
|
|
121
|
+
Dog.name
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# ------------------------------------------------------------------
|
|
125
|
+
|
|
126
|
+
class Dog
|
|
127
|
+
# Demonstrates Dog.a class method.
|
|
128
|
+
def Dog.a_class_method
|
|
129
|
+
:dogs_class_method
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Checks you can define class methods inside the class.
|
|
134
|
+
def test_you_can_define_class_methods_inside_the_class
|
|
135
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:you_can_define_class_methods_inside_the_class_one),
|
|
136
|
+
Dog.a_class_method
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# ------------------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
LastExpressionInClassStatement = class Dog
|
|
142
|
+
21
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Checks class statements return the value of their last expression.
|
|
146
|
+
def test_class_statements_return_the_value_of_their_last_expression
|
|
147
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:class_statements_return_the_value_of_their_last_expression_one),
|
|
148
|
+
LastExpressionInClassStatement
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# ------------------------------------------------------------------
|
|
152
|
+
|
|
153
|
+
SelfInsideOfClassStatement = class Dog
|
|
154
|
+
self
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Checks self while inside class is class object not instance.
|
|
158
|
+
def test_self_while_inside_class_is_class_object_not_instance
|
|
159
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:self_while_inside_class_is_class_object_not_instance_one),
|
|
160
|
+
(Dog == SelfInsideOfClassStatement)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# ------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
class Dog
|
|
166
|
+
# Demonstrates self.class method2.
|
|
167
|
+
def self.class_method2
|
|
168
|
+
:another_way_to_write_class_methods
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Checks you can use self instead of an explicit reference to dog.
|
|
173
|
+
def test_you_can_use_self_instead_of_an_explicit_reference_to_dog
|
|
174
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:you_can_use_self_instead_of_an_explicit_reference_to_dog_one),
|
|
175
|
+
Dog.class_method2
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# ------------------------------------------------------------------
|
|
179
|
+
|
|
180
|
+
class Dog
|
|
181
|
+
class << self
|
|
182
|
+
# Demonstrates another class method.
|
|
183
|
+
def another_class_method
|
|
184
|
+
:still_another_way
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Checks heres still another way to write class methods.
|
|
190
|
+
def test_heres_still_another_way_to_write_class_methods
|
|
191
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:heres_still_another_way_to_write_class_methods_one),
|
|
192
|
+
Dog.another_class_method
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# THINK ABOUT IT:
|
|
196
|
+
#
|
|
197
|
+
# The two major ways to write class methods are:
|
|
198
|
+
# class Demo
|
|
199
|
+
# def self.method
|
|
200
|
+
# end
|
|
201
|
+
#
|
|
202
|
+
# class << self
|
|
203
|
+
# def class_methods
|
|
204
|
+
# end
|
|
205
|
+
# end
|
|
206
|
+
# end
|
|
207
|
+
#
|
|
208
|
+
# Which do you prefer and why?
|
|
209
|
+
# Are there times you might prefer one over the other?
|
|
210
|
+
|
|
211
|
+
# ------------------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
# Checks heres an easy way to call class methods from instance methods.
|
|
214
|
+
def test_heres_an_easy_way_to_call_class_methods_from_instance_methods
|
|
215
|
+
fido = Dog.new
|
|
216
|
+
|
|
217
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(:heres_an_easy_way_to_call_class_methods_from_instance_methods_one),
|
|
218
|
+
fido.class.another_class_method
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Checks the predicted exception class while returning the captured error.
|
|
222
|
+
# @param key [Symbol] answer field
|
|
223
|
+
# @param klass [Class<Exception>] exception raised by the example
|
|
224
|
+
# @return [Exception]
|
|
225
|
+
def assert_predicted_error(key, ...)
|
|
226
|
+
error = assert_raises(...)
|
|
227
|
+
assert_equal Exercises::AboutClassMethods.koans.fetch(key), error.class
|
|
228
|
+
error
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# rubocop:enable Lint/EmptyClass, Naming/ConstantName, Style/ClassMethods, Style/TrivialAccessors
|