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.
Files changed (460) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/CURRICULUM.md +86 -0
  4. data/README.md +77 -0
  5. data/THIRD_PARTY_NOTICES.md +30 -0
  6. data/exercises/about-array-assignment/about_array_assignment.rb +45 -0
  7. data/exercises/about-array-assignment/brief.md +11 -0
  8. data/exercises/about-array-assignment/hint.md +11 -0
  9. data/exercises/about-arrays/about_arrays.rb +77 -0
  10. data/exercises/about-arrays/brief.md +16 -0
  11. data/exercises/about-arrays/hint.md +13 -0
  12. data/exercises/about-asserts/about_asserts.rb +22 -0
  13. data/exercises/about-asserts/brief.md +22 -0
  14. data/exercises/about-asserts/hint.md +10 -0
  15. data/exercises/about-blocks/about_blocks.rb +76 -0
  16. data/exercises/about-blocks/brief.md +44 -0
  17. data/exercises/about-blocks/hint.md +7 -0
  18. data/exercises/about-class-methods/about_class_methods.rb +105 -0
  19. data/exercises/about-class-methods/brief.md +73 -0
  20. data/exercises/about-class-methods/hint.md +8 -0
  21. data/exercises/about-classes/about_classes.rb +131 -0
  22. data/exercises/about-classes/brief.md +73 -0
  23. data/exercises/about-classes/hint.md +7 -0
  24. data/exercises/about-constants/about_constants.rb +49 -0
  25. data/exercises/about-constants/brief.md +51 -0
  26. data/exercises/about-constants/hint.md +7 -0
  27. data/exercises/about-control-statements/about_control_statements.rb +152 -0
  28. data/exercises/about-control-statements/brief.md +9 -0
  29. data/exercises/about-control-statements/hint.md +7 -0
  30. data/exercises/about-dice-project/about_dice_project.rb +27 -0
  31. data/exercises/about-dice-project/brief.md +12 -0
  32. data/exercises/about-dice-project/hint.md +5 -0
  33. data/exercises/about-exceptions/about_exceptions.rb +84 -0
  34. data/exercises/about-exceptions/brief.md +19 -0
  35. data/exercises/about-exceptions/hint.md +8 -0
  36. data/exercises/about-extra-credit/about_extra_credit.rb +117 -0
  37. data/exercises/about-extra-credit/brief.md +28 -0
  38. data/exercises/about-extra-credit/hint.md +5 -0
  39. data/exercises/about-hashes/about_hashes.rb +160 -0
  40. data/exercises/about-hashes/brief.md +9 -0
  41. data/exercises/about-hashes/hint.md +8 -0
  42. data/exercises/about-inheritance/about_inheritance.rb +63 -0
  43. data/exercises/about-inheritance/brief.md +50 -0
  44. data/exercises/about-inheritance/hint.md +8 -0
  45. data/exercises/about-iteration/about_iteration.rb +96 -0
  46. data/exercises/about-iteration/brief.md +26 -0
  47. data/exercises/about-iteration/hint.md +6 -0
  48. data/exercises/about-keyword-arguments/about_keyword_arguments.rb +56 -0
  49. data/exercises/about-keyword-arguments/brief.md +28 -0
  50. data/exercises/about-keyword-arguments/hint.md +7 -0
  51. data/exercises/about-message-passing/about_message_passing.rb +112 -0
  52. data/exercises/about-message-passing/brief.md +59 -0
  53. data/exercises/about-message-passing/hint.md +8 -0
  54. data/exercises/about-methods/about_methods.rb +104 -0
  55. data/exercises/about-methods/brief.md +55 -0
  56. data/exercises/about-methods/hint.md +8 -0
  57. data/exercises/about-modules/about_modules.rb +43 -0
  58. data/exercises/about-modules/brief.md +44 -0
  59. data/exercises/about-modules/hint.md +8 -0
  60. data/exercises/about-nil/about_nil.rb +29 -0
  61. data/exercises/about-nil/brief.md +12 -0
  62. data/exercises/about-nil/hint.md +11 -0
  63. data/exercises/about-objects/about_objects.rb +51 -0
  64. data/exercises/about-objects/brief.md +14 -0
  65. data/exercises/about-objects/hint.md +12 -0
  66. data/exercises/about-open-classes/about_open_classes.rb +38 -0
  67. data/exercises/about-open-classes/brief.md +34 -0
  68. data/exercises/about-open-classes/hint.md +7 -0
  69. data/exercises/about-pattern-matching/about_pattern_matching.rb +106 -0
  70. data/exercises/about-pattern-matching/brief.md +124 -0
  71. data/exercises/about-pattern-matching/hint.md +8 -0
  72. data/exercises/about-proxy-object-project/about_proxy_object_project.rb +43 -0
  73. data/exercises/about-proxy-object-project/brief.md +10 -0
  74. data/exercises/about-proxy-object-project/hint.md +5 -0
  75. data/exercises/about-regular-expressions/about_regular_expressions.rb +174 -0
  76. data/exercises/about-regular-expressions/brief.md +9 -0
  77. data/exercises/about-regular-expressions/hint.md +8 -0
  78. data/exercises/about-sandwich-code/about_sandwich_code.rb +58 -0
  79. data/exercises/about-sandwich-code/brief.md +14 -0
  80. data/exercises/about-sandwich-code/hint.md +5 -0
  81. data/exercises/about-scope/about_scope.rb +76 -0
  82. data/exercises/about-scope/brief.md +35 -0
  83. data/exercises/about-scope/hint.md +8 -0
  84. data/exercises/about-scoring-project/about_scoring_project.rb +16 -0
  85. data/exercises/about-scoring-project/brief.md +10 -0
  86. data/exercises/about-scoring-project/hint.md +5 -0
  87. data/exercises/about-strings/about_strings.rb +142 -0
  88. data/exercises/about-strings/brief.md +22 -0
  89. data/exercises/about-strings/hint.md +11 -0
  90. data/exercises/about-symbols/about_symbols.rb +53 -0
  91. data/exercises/about-symbols/brief.md +21 -0
  92. data/exercises/about-symbols/hint.md +12 -0
  93. data/exercises/about-to-str/about_to_str.rb +49 -0
  94. data/exercises/about-to-str/brief.md +37 -0
  95. data/exercises/about-to-str/hint.md +7 -0
  96. data/exercises/about-triangle-project/about_triangle_project.rb +15 -0
  97. data/exercises/about-triangle-project/brief.md +11 -0
  98. data/exercises/about-triangle-project/hint.md +5 -0
  99. data/exercises/about-triangle-project-two/about_triangle_project_two.rb +22 -0
  100. data/exercises/about-triangle-project-two/brief.md +10 -0
  101. data/exercises/about-triangle-project-two/hint.md +5 -0
  102. data/exercises/about-true-and-false/about_true_and_false.rb +26 -0
  103. data/exercises/about-true-and-false/brief.md +22 -0
  104. data/exercises/about-true-and-false/hint.md +7 -0
  105. data/exercises/blocks-and-methods/blocks_and_methods.rb +14 -0
  106. data/exercises/blocks-and-methods/brief.md +8 -0
  107. data/exercises/blocks-and-methods/hint.md +6 -0
  108. data/exercises/catalog.json +61 -0
  109. data/exercises/class-state/brief.md +8 -0
  110. data/exercises/class-state/class_state.rb +39 -0
  111. data/exercises/class-state/hint.md +5 -0
  112. data/exercises/closure-capture/brief.md +8 -0
  113. data/exercises/closure-capture/closure_capture.rb +21 -0
  114. data/exercises/closure-capture/hint.md +5 -0
  115. data/exercises/collection-basics/brief.md +8 -0
  116. data/exercises/collection-basics/collection_basics.rb +16 -0
  117. data/exercises/collection-basics/hint.md +6 -0
  118. data/exercises/constant-scope/brief.md +8 -0
  119. data/exercises/constant-scope/constant_scope.rb +18 -0
  120. data/exercises/constant-scope/hint.md +5 -0
  121. data/exercises/core-protocols/brief.md +8 -0
  122. data/exercises/core-protocols/core_protocols.rb +43 -0
  123. data/exercises/core-protocols/hint.md +5 -0
  124. data/exercises/delegation/brief.md +8 -0
  125. data/exercises/delegation/delegation.rb +20 -0
  126. data/exercises/delegation/hint.md +5 -0
  127. data/exercises/dynamic-methods/brief.md +8 -0
  128. data/exercises/dynamic-methods/dynamic_methods.rb +33 -0
  129. data/exercises/dynamic-methods/hint.md +5 -0
  130. data/exercises/exception-flow/brief.md +8 -0
  131. data/exercises/exception-flow/exception_flow.rb +27 -0
  132. data/exercises/exception-flow/hint.md +5 -0
  133. data/exercises/heredoc-layout/brief.md +14 -0
  134. data/exercises/heredoc-layout/heredoc_layout.rb +25 -0
  135. data/exercises/heredoc-layout/hint.md +9 -0
  136. data/exercises/keyword-forwarding/brief.md +8 -0
  137. data/exercises/keyword-forwarding/hint.md +5 -0
  138. data/exercises/keyword-forwarding/keyword_forwarding.rb +27 -0
  139. data/exercises/lazy-enumeration/brief.md +8 -0
  140. data/exercises/lazy-enumeration/hint.md +5 -0
  141. data/exercises/lazy-enumeration/lazy_enumeration.rb +16 -0
  142. data/exercises/literals-and-operators/brief.md +20 -0
  143. data/exercises/literals-and-operators/hint.md +5 -0
  144. data/exercises/literals-and-operators/literals_and_operators.rb +15 -0
  145. data/exercises/method-contracts/brief.md +8 -0
  146. data/exercises/method-contracts/hint.md +5 -0
  147. data/exercises/method-contracts/method_contracts.rb +22 -0
  148. data/exercises/method-lookup/brief.md +8 -0
  149. data/exercises/method-lookup/hint.md +5 -0
  150. data/exercises/method-lookup/method_lookup.rb +26 -0
  151. data/exercises/nonlocal-exit/brief.md +8 -0
  152. data/exercises/nonlocal-exit/hint.md +5 -0
  153. data/exercises/nonlocal-exit/nonlocal_exit.rb +29 -0
  154. data/exercises/numbered-parameters/brief.md +18 -0
  155. data/exercises/numbered-parameters/hint.md +5 -0
  156. data/exercises/numbered-parameters/numbered_parameters.rb +18 -0
  157. data/exercises/numeric-precision/brief.md +8 -0
  158. data/exercises/numeric-precision/hint.md +5 -0
  159. data/exercises/numeric-precision/numeric_precision.rb +17 -0
  160. data/exercises/pattern-matching/brief.md +8 -0
  161. data/exercises/pattern-matching/hint.md +5 -0
  162. data/exercises/pattern-matching/pattern_matching.rb +22 -0
  163. data/exercises/refinement-scope/brief.md +8 -0
  164. data/exercises/refinement-scope/hint.md +5 -0
  165. data/exercises/refinement-scope/refinement_scope.rb +33 -0
  166. data/exercises/regexp-captures/brief.md +8 -0
  167. data/exercises/regexp-captures/hint.md +5 -0
  168. data/exercises/regexp-captures/regexp_captures.rb +25 -0
  169. data/exercises/runtime-context/brief.md +20 -0
  170. data/exercises/runtime-context/hint.md +8 -0
  171. data/exercises/runtime-context/runtime_context.rb +11 -0
  172. data/exercises/shared-rows/brief.md +8 -0
  173. data/exercises/shared-rows/hint.md +7 -0
  174. data/exercises/shared-rows/shared_rows.rb +13 -0
  175. data/exercises/singleton-pattern/brief.md +8 -0
  176. data/exercises/singleton-pattern/hint.md +5 -0
  177. data/exercises/singleton-pattern/singleton_pattern.rb +20 -0
  178. data/exercises/time-and-date/brief.md +8 -0
  179. data/exercises/time-and-date/hint.md +5 -0
  180. data/exercises/time-and-date/time_and_date.rb +21 -0
  181. data/exercises/visibility/brief.md +8 -0
  182. data/exercises/visibility/hint.md +5 -0
  183. data/exercises/visibility/visibility.rb +32 -0
  184. data/lib/rkoans/catalog.rb +31 -0
  185. data/lib/rkoans/checker.rb +62 -0
  186. data/lib/rkoans/cli.rb +79 -0
  187. data/lib/rkoans/error.rb +6 -0
  188. data/lib/rkoans/exercise.rb +50 -0
  189. data/lib/rkoans/keyboard.rb +51 -0
  190. data/lib/rkoans/progress.rb +39 -0
  191. data/lib/rkoans/selection.rb +31 -0
  192. data/lib/rkoans/session.rb +127 -0
  193. data/lib/rkoans/terminal_view.rb +99 -0
  194. data/lib/rkoans/version.rb +1 -1
  195. data/lib/rkoans/watcher.rb +58 -0
  196. data/lib/rkoans.rb +13 -3
  197. data/sig/about_array_assignment_acceptance_test.rbs +3 -0
  198. data/sig/about_arrays_acceptance_test.rbs +3 -0
  199. data/sig/about_asserts_command_test.rbs +4 -0
  200. data/sig/about_blocks_acceptance_test.rbs +3 -0
  201. data/sig/about_class_methods_acceptance_test.rbs +3 -0
  202. data/sig/about_classes_acceptance_test.rbs +3 -0
  203. data/sig/about_constants_acceptance_test.rbs +3 -0
  204. data/sig/about_control_statements_acceptance_test.rbs +3 -0
  205. data/sig/about_dice_project_acceptance_test.rbs +3 -0
  206. data/sig/about_exceptions_acceptance_test.rbs +3 -0
  207. data/sig/about_extra_credit_acceptance_test.rbs +5 -0
  208. data/sig/about_hashes_acceptance_test.rbs +3 -0
  209. data/sig/about_inheritance_acceptance_test.rbs +3 -0
  210. data/sig/about_iteration_acceptance_test.rbs +3 -0
  211. data/sig/about_keyword_arguments_acceptance_test.rbs +3 -0
  212. data/sig/about_message_passing_acceptance_test.rbs +3 -0
  213. data/sig/about_methods_acceptance_test.rbs +3 -0
  214. data/sig/about_modules_acceptance_test.rbs +3 -0
  215. data/sig/about_nil_acceptance_test.rbs +3 -0
  216. data/sig/about_objects_acceptance_test.rbs +3 -0
  217. data/sig/about_open_classes_acceptance_test.rbs +3 -0
  218. data/sig/about_pattern_matching_acceptance_test.rbs +3 -0
  219. data/sig/about_proxy_object_project_acceptance_test.rbs +3 -0
  220. data/sig/about_regular_expressions_acceptance_test.rbs +3 -0
  221. data/sig/about_sandwich_code_acceptance_test.rbs +3 -0
  222. data/sig/about_scope_acceptance_test.rbs +3 -0
  223. data/sig/about_scoring_project_acceptance_test.rbs +3 -0
  224. data/sig/about_strings_acceptance_test.rbs +3 -0
  225. data/sig/about_symbols_acceptance_test.rbs +3 -0
  226. data/sig/about_to_str_acceptance_test.rbs +3 -0
  227. data/sig/about_triangle_project_acceptance_test.rbs +3 -0
  228. data/sig/about_triangle_project_two_acceptance_test.rbs +3 -0
  229. data/sig/about_true_and_false_command_test.rbs +4 -0
  230. data/sig/catalog_error_command_test.rbs +4 -0
  231. data/sig/checker_test.rbs +9 -0
  232. data/sig/class_state_acceptance_test.rbs +3 -0
  233. data/sig/closure_capture_acceptance_test.rbs +3 -0
  234. data/sig/command_support.rbs +18 -0
  235. data/sig/command_test.rbs +5 -0
  236. data/sig/constant_scope_acceptance_test.rbs +3 -0
  237. data/sig/core_protocols_acceptance_test.rbs +3 -0
  238. data/sig/curriculum_cop_test.rbs +9 -0
  239. data/sig/delegation_acceptance_test.rbs +3 -0
  240. data/sig/dynamic_methods_acceptance_test.rbs +3 -0
  241. data/sig/exception_flow_acceptance_test.rbs +3 -0
  242. data/sig/exercise_test.rbs +3 -0
  243. data/sig/exercises/about_array_assignment.rbs +36 -0
  244. data/sig/exercises/about_arrays.rbs +51 -0
  245. data/sig/exercises/about_asserts.rbs +23 -0
  246. data/sig/exercises/about_blocks.rbs +40 -0
  247. data/sig/exercises/about_class_methods.rbs +62 -0
  248. data/sig/exercises/about_classes.rbs +88 -0
  249. data/sig/exercises/about_constants.rbs +53 -0
  250. data/sig/exercises/about_control_statements.rbs +46 -0
  251. data/sig/exercises/about_dice_project.rbs +16 -0
  252. data/sig/exercises/about_exceptions.rbs +36 -0
  253. data/sig/exercises/about_extra_credit.rbs +36 -0
  254. data/sig/exercises/about_hashes.rbs +62 -0
  255. data/sig/exercises/about_inheritance.rbs +50 -0
  256. data/sig/exercises/about_iteration.rbs +37 -0
  257. data/sig/exercises/about_keyword_arguments.rbs +33 -0
  258. data/sig/exercises/about_message_passing.rbs +68 -0
  259. data/sig/exercises/about_methods.rbs +68 -0
  260. data/sig/exercises/about_modules.rbs +38 -0
  261. data/sig/exercises/about_nil.rbs +23 -0
  262. data/sig/exercises/about_objects.rbs +38 -0
  263. data/sig/exercises/about_open_classes.rbs +31 -0
  264. data/sig/exercises/about_pattern_matching.rbs +65 -0
  265. data/sig/exercises/about_proxy_object_project.rbs +31 -0
  266. data/sig/exercises/about_regular_expressions.rbs +83 -0
  267. data/sig/exercises/about_sandwich_code.rbs +17 -0
  268. data/sig/exercises/about_scope.rbs +59 -0
  269. data/sig/exercises/about_scoring_project.rbs +16 -0
  270. data/sig/exercises/about_strings.rbs +85 -0
  271. data/sig/exercises/about_symbols.rbs +46 -0
  272. data/sig/exercises/about_to_str.rbs +36 -0
  273. data/sig/exercises/about_triangle_project.rbs +11 -0
  274. data/sig/exercises/about_triangle_project_two.rbs +12 -0
  275. data/sig/exercises/about_true_and_false.rbs +27 -0
  276. data/sig/exercises/blocks_and_methods.rbs +11 -0
  277. data/sig/exercises/class_state.rbs +19 -0
  278. data/sig/exercises/closure_capture.rbs +10 -0
  279. data/sig/exercises/collection_basics.rbs +6 -0
  280. data/sig/exercises/collection_basics_test.rbs +4 -0
  281. data/sig/exercises/constant_scope.rbs +11 -0
  282. data/sig/exercises/core_protocols.rbs +20 -0
  283. data/sig/exercises/delegation.rbs +14 -0
  284. data/sig/exercises/dynamic_methods.rbs +13 -0
  285. data/sig/exercises/exception_flow.rbs +11 -0
  286. data/sig/exercises/heredoc_layout.rbs +11 -0
  287. data/sig/exercises/keyword_forwarding.rbs +12 -0
  288. data/sig/exercises/lazy_enumeration.rbs +10 -0
  289. data/sig/exercises/literals_and_operators.rbs +12 -0
  290. data/sig/exercises/method_contracts.rbs +11 -0
  291. data/sig/exercises/method_lookup.rbs +16 -0
  292. data/sig/exercises/nonlocal_exit.rbs +14 -0
  293. data/sig/exercises/numbered_parameters.rbs +11 -0
  294. data/sig/exercises/numeric_precision.rbs +11 -0
  295. data/sig/exercises/pattern_matching.rbs +10 -0
  296. data/sig/exercises/refinement_scope.rbs +18 -0
  297. data/sig/exercises/regexp_captures.rbs +11 -0
  298. data/sig/exercises/runtime_context.rbs +23 -0
  299. data/sig/exercises/shared_rows.rbs +11 -0
  300. data/sig/exercises/singleton_pattern.rbs +14 -0
  301. data/sig/exercises/time_and_date.rbs +11 -0
  302. data/sig/exercises/visibility.rbs +18 -0
  303. data/sig/fixture_support.rbs +11 -0
  304. data/sig/help_hint_command_test.rbs +8 -0
  305. data/sig/heredoc_layout_acceptance_test.rbs +3 -0
  306. data/sig/keyboard_session_test.rbs +9 -0
  307. data/sig/keyword_forwarding_acceptance_test.rbs +3 -0
  308. data/sig/lazy_enumeration_acceptance_test.rbs +3 -0
  309. data/sig/literals_and_operators_acceptance_test.rbs +3 -0
  310. data/sig/method_contracts_acceptance_test.rbs +3 -0
  311. data/sig/method_lookup_acceptance_test.rbs +3 -0
  312. data/sig/nonlocal_exit_acceptance_test.rbs +3 -0
  313. data/sig/numbered_parameters_acceptance_test.rbs +3 -0
  314. data/sig/numeric_precision_acceptance_test.rbs +4 -0
  315. data/sig/packaging_test.rbs +3 -0
  316. data/sig/pattern_matching_acceptance_test.rbs +3 -0
  317. data/sig/reference_solutions_test.rbs +3 -0
  318. data/sig/refinement_scope_acceptance_test.rbs +3 -0
  319. data/sig/regexp_captures_acceptance_test.rbs +4 -0
  320. data/sig/rkoans/catalog.rbs +11 -0
  321. data/sig/rkoans/checker.rbs +22 -0
  322. data/sig/rkoans/cli.rbs +21 -0
  323. data/sig/rkoans/exercise.rbs +18 -0
  324. data/sig/rkoans/keyboard.rbs +13 -0
  325. data/sig/rkoans/progress.rbs +9 -0
  326. data/sig/rkoans/selection.rbs +9 -0
  327. data/sig/rkoans/session.rbs +30 -0
  328. data/sig/rkoans/terminal_view.rbs +24 -0
  329. data/sig/rkoans/watcher.rbs +18 -0
  330. data/sig/rkoans.rbs +2 -0
  331. data/sig/runtime_context_command_test.rbs +4 -0
  332. data/sig/selection_command_test.rbs +5 -0
  333. data/sig/session_command_test.rbs +12 -0
  334. data/sig/session_edge_cases_test.rbs +4 -0
  335. data/sig/shared_rows_acceptance_test.rbs +3 -0
  336. data/sig/singleton_pattern_acceptance_test.rbs +3 -0
  337. data/sig/time_and_date_acceptance_test.rbs +4 -0
  338. data/sig/visibility_acceptance_test.rbs +4 -0
  339. data/sig/watcher_test.rbs +3 -0
  340. data/solutions/about-array-assignment/about_array_assignment.rb +36 -0
  341. data/solutions/about-arrays/about_arrays.rb +53 -0
  342. data/solutions/about-asserts/about_asserts.rb +22 -0
  343. data/solutions/about-blocks/about_blocks.rb +30 -0
  344. data/solutions/about-class-methods/about_class_methods.rb +36 -0
  345. data/solutions/about-classes/about_classes.rb +40 -0
  346. data/solutions/about-constants/about_constants.rb +26 -0
  347. data/solutions/about-control-statements/about_control_statements.rb +35 -0
  348. data/solutions/about-dice-project/about_dice_project.rb +27 -0
  349. data/solutions/about-exceptions/about_exceptions.rb +30 -0
  350. data/solutions/about-extra-credit/about_extra_credit.rb +114 -0
  351. data/solutions/about-hashes/about_hashes.rb +52 -0
  352. data/solutions/about-inheritance/about_inheritance.rb +27 -0
  353. data/solutions/about-iteration/about_iteration.rb +31 -0
  354. data/solutions/about-keyword-arguments/about_keyword_arguments.rb +28 -0
  355. data/solutions/about-message-passing/about_message_passing.rb +38 -0
  356. data/solutions/about-methods/about_methods.rb +39 -0
  357. data/solutions/about-modules/about_modules.rb +23 -0
  358. data/solutions/about-nil/about_nil.rb +23 -0
  359. data/solutions/about-objects/about_objects.rb +34 -0
  360. data/solutions/about-open-classes/about_open_classes.rb +23 -0
  361. data/solutions/about-pattern-matching/about_pattern_matching.rb +39 -0
  362. data/solutions/about-proxy-object-project/about_proxy_object_project.rb +44 -0
  363. data/solutions/about-regular-expressions/about_regular_expressions.rb +60 -0
  364. data/solutions/about-sandwich-code/about_sandwich_code.rb +60 -0
  365. data/solutions/about-scope/about_scope.rb +33 -0
  366. data/solutions/about-scoring-project/about_scoring_project.rb +19 -0
  367. data/solutions/about-strings/about_strings.rb +56 -0
  368. data/solutions/about-symbols/about_symbols.rb +35 -0
  369. data/solutions/about-to-str/about_to_str.rb +24 -0
  370. data/solutions/about-triangle-project/about_triangle_project.rb +19 -0
  371. data/solutions/about-triangle-project-two/about_triangle_project_two.rb +25 -0
  372. data/solutions/about-true-and-false/about_true_and_false.rb +25 -0
  373. data/solutions/blocks-and-methods/blocks_and_methods.rb +14 -0
  374. data/solutions/class-state/class_state.rb +33 -0
  375. data/solutions/closure-capture/closure_capture.rb +12 -0
  376. data/solutions/collection-basics/collection_basics.rb +14 -0
  377. data/solutions/constant-scope/constant_scope.rb +18 -0
  378. data/solutions/core-protocols/core_protocols.rb +44 -0
  379. data/solutions/delegation/delegation.rb +17 -0
  380. data/solutions/dynamic-methods/dynamic_methods.rb +32 -0
  381. data/solutions/exception-flow/exception_flow.rb +34 -0
  382. data/solutions/heredoc-layout/heredoc_layout.rb +24 -0
  383. data/solutions/keyword-forwarding/keyword_forwarding.rb +26 -0
  384. data/solutions/lazy-enumeration/lazy_enumeration.rb +11 -0
  385. data/solutions/literals-and-operators/literals_and_operators.rb +22 -0
  386. data/solutions/method-contracts/method_contracts.rb +18 -0
  387. data/solutions/method-lookup/method_lookup.rb +26 -0
  388. data/solutions/nonlocal-exit/nonlocal_exit.rb +46 -0
  389. data/solutions/numbered-parameters/numbered_parameters.rb +18 -0
  390. data/solutions/numeric-precision/numeric_precision.rb +17 -0
  391. data/solutions/pattern-matching/pattern_matching.rb +17 -0
  392. data/solutions/refinement-scope/refinement_scope.rb +34 -0
  393. data/solutions/regexp-captures/regexp_captures.rb +24 -0
  394. data/solutions/runtime-context/runtime_context.rb +19 -0
  395. data/solutions/shared-rows/shared_rows.rb +13 -0
  396. data/solutions/singleton-pattern/singleton_pattern.rb +19 -0
  397. data/solutions/time-and-date/time_and_date.rb +16 -0
  398. data/solutions/visibility/visibility.rb +34 -0
  399. data/test/exercises/about_array_assignment_test.rb +87 -0
  400. data/test/exercises/about_arrays_test.rb +119 -0
  401. data/test/exercises/about_asserts_test.rb +41 -0
  402. data/test/exercises/about_blocks_test.rb +140 -0
  403. data/test/exercises/about_class_methods_test.rb +232 -0
  404. data/test/exercises/about_classes_test.rb +261 -0
  405. data/test/exercises/about_constants_test.rb +111 -0
  406. data/test/exercises/about_control_statements_test.rb +188 -0
  407. data/test/exercises/about_dice_project_test.rb +40 -0
  408. data/test/exercises/about_exceptions_test.rb +98 -0
  409. data/test/exercises/about_extra_credit_test.rb +74 -0
  410. data/test/exercises/about_hashes_test.rb +163 -0
  411. data/test/exercises/about_inheritance_test.rb +121 -0
  412. data/test/exercises/about_iteration_test.rb +148 -0
  413. data/test/exercises/about_keyword_arguments_test.rb +80 -0
  414. data/test/exercises/about_message_passing_test.rb +230 -0
  415. data/test/exercises/about_methods_test.rb +208 -0
  416. data/test/exercises/about_modules_test.rb +98 -0
  417. data/test/exercises/about_nil_test.rb +35 -0
  418. data/test/exercises/about_objects_test.rb +74 -0
  419. data/test/exercises/about_open_classes_test.rb +60 -0
  420. data/test/exercises/about_pattern_matching_test.rb +257 -0
  421. data/test/exercises/about_proxy_object_project_test.rb +75 -0
  422. data/test/exercises/about_regular_expressions_test.rb +243 -0
  423. data/test/exercises/about_sandwich_code_test.rb +82 -0
  424. data/test/exercises/about_scope_test.rb +123 -0
  425. data/test/exercises/about_scoring_project_test.rb +62 -0
  426. data/test/exercises/about_strings_test.rb +255 -0
  427. data/test/exercises/about_symbols_test.rb +120 -0
  428. data/test/exercises/about_to_str_test.rb +89 -0
  429. data/test/exercises/about_triangle_project_test.rb +29 -0
  430. data/test/exercises/about_triangle_project_two_test.rb +28 -0
  431. data/test/exercises/about_true_and_false_test.rb +43 -0
  432. data/test/exercises/blocks_and_methods_test.rb +22 -0
  433. data/test/exercises/class_state_test.rb +29 -0
  434. data/test/exercises/closure_capture_test.rb +29 -0
  435. data/test/exercises/collection_basics_test.rb +18 -0
  436. data/test/exercises/constant_scope_test.rb +18 -0
  437. data/test/exercises/core_protocols_test.rb +28 -0
  438. data/test/exercises/delegation_test.rb +23 -0
  439. data/test/exercises/dynamic_methods_test.rb +28 -0
  440. data/test/exercises/exception_flow_test.rb +17 -0
  441. data/test/exercises/heredoc_layout_test.rb +18 -0
  442. data/test/exercises/keyword_forwarding_test.rb +22 -0
  443. data/test/exercises/lazy_enumeration_test.rb +15 -0
  444. data/test/exercises/literals_and_operators_test.rb +25 -0
  445. data/test/exercises/method_contracts_test.rb +28 -0
  446. data/test/exercises/method_lookup_test.rb +14 -0
  447. data/test/exercises/nonlocal_exit_test.rb +22 -0
  448. data/test/exercises/numbered_parameters_test.rb +15 -0
  449. data/test/exercises/numeric_precision_test.rb +24 -0
  450. data/test/exercises/pattern_matching_test.rb +18 -0
  451. data/test/exercises/refinement_scope_test.rb +14 -0
  452. data/test/exercises/regexp_captures_test.rb +20 -0
  453. data/test/exercises/runtime_context_test.rb +59 -0
  454. data/test/exercises/shared_rows_test.rb +34 -0
  455. data/test/exercises/singleton_pattern_test.rb +16 -0
  456. data/test/exercises/time_and_date_test.rb +22 -0
  457. data/test/exercises/visibility_test.rb +22 -0
  458. metadata +471 -4
  459. data/Rakefile +0 -12
  460. 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