mutant 0.9.8 → 0.9.13

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 (335) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +5 -2
  3. data/lib/mutant/ast.rb +0 -9
  4. data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
  5. data/lib/mutant/ast/meta/send.rb +0 -6
  6. data/lib/mutant/bootstrap.rb +14 -37
  7. data/lib/mutant/cli.rb +11 -49
  8. data/lib/mutant/config.rb +0 -8
  9. data/lib/mutant/context.rb +0 -3
  10. data/lib/mutant/env.rb +0 -6
  11. data/lib/mutant/expression/method.rb +6 -6
  12. data/lib/mutant/expression/methods.rb +6 -6
  13. data/lib/mutant/expression/parser.rb +0 -6
  14. data/lib/mutant/integration.rb +0 -18
  15. data/lib/mutant/isolation.rb +1 -1
  16. data/lib/mutant/isolation/fork.rb +2 -24
  17. data/lib/mutant/isolation/none.rb +1 -1
  18. data/lib/mutant/license.rb +11 -0
  19. data/lib/mutant/matcher.rb +0 -14
  20. data/lib/mutant/matcher/config.rb +2 -11
  21. data/lib/mutant/matcher/method.rb +0 -31
  22. data/lib/mutant/matcher/method/instance.rb +0 -8
  23. data/lib/mutant/matcher/method/metaclass.rb +86 -0
  24. data/lib/mutant/matcher/method/singleton.rb +0 -25
  25. data/lib/mutant/matcher/methods.rb +17 -28
  26. data/lib/mutant/matcher/namespace.rb +0 -10
  27. data/lib/mutant/matcher/scope.rb +2 -4
  28. data/lib/mutant/meta/example/dsl.rb +0 -21
  29. data/lib/mutant/meta/example/verification.rb +0 -20
  30. data/lib/mutant/minitest/coverage.rb +53 -0
  31. data/lib/mutant/mutation.rb +0 -3
  32. data/lib/mutant/mutator.rb +1 -29
  33. data/lib/mutant/mutator/node.rb +1 -66
  34. data/lib/mutant/mutator/node/and_asgn.rb +0 -3
  35. data/lib/mutant/mutator/node/argument.rb +0 -15
  36. data/lib/mutant/mutator/node/arguments.rb +0 -20
  37. data/lib/mutant/mutator/node/begin.rb +0 -3
  38. data/lib/mutant/mutator/node/binary.rb +0 -23
  39. data/lib/mutant/mutator/node/block.rb +0 -15
  40. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  41. data/lib/mutant/mutator/node/break.rb +0 -3
  42. data/lib/mutant/mutator/node/case.rb +0 -9
  43. data/lib/mutant/mutator/node/class.rb +0 -3
  44. data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
  45. data/lib/mutant/mutator/node/const.rb +0 -3
  46. data/lib/mutant/mutator/node/define.rb +0 -11
  47. data/lib/mutant/mutator/node/defined.rb +0 -3
  48. data/lib/mutant/mutator/node/dstr.rb +0 -3
  49. data/lib/mutant/mutator/node/dsym.rb +0 -3
  50. data/lib/mutant/mutator/node/generic.rb +0 -3
  51. data/lib/mutant/mutator/node/if.rb +0 -12
  52. data/lib/mutant/mutator/node/index.rb +0 -27
  53. data/lib/mutant/mutator/node/kwbegin.rb +0 -3
  54. data/lib/mutant/mutator/node/literal.rb +0 -3
  55. data/lib/mutant/mutator/node/literal/array.rb +0 -6
  56. data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
  57. data/lib/mutant/mutator/node/literal/float.rb +0 -9
  58. data/lib/mutant/mutator/node/literal/hash.rb +0 -9
  59. data/lib/mutant/mutator/node/literal/integer.rb +0 -9
  60. data/lib/mutant/mutator/node/literal/nil.rb +0 -3
  61. data/lib/mutant/mutator/node/literal/range.rb +4 -7
  62. data/lib/mutant/mutator/node/literal/regex.rb +0 -6
  63. data/lib/mutant/mutator/node/literal/string.rb +0 -3
  64. data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
  65. data/lib/mutant/mutator/node/masgn.rb +0 -3
  66. data/lib/mutant/mutator/node/match_current_line.rb +0 -3
  67. data/lib/mutant/mutator/node/mlhs.rb +0 -3
  68. data/lib/mutant/mutator/node/named_value/access.rb +2 -14
  69. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
  70. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
  71. data/lib/mutant/mutator/node/next.rb +0 -3
  72. data/lib/mutant/mutator/node/noop.rb +1 -4
  73. data/lib/mutant/mutator/node/nthref.rb +0 -3
  74. data/lib/mutant/mutator/node/op_asgn.rb +0 -3
  75. data/lib/mutant/mutator/node/or_asgn.rb +0 -3
  76. data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
  77. data/lib/mutant/mutator/node/regopt.rb +0 -6
  78. data/lib/mutant/mutator/node/resbody.rb +0 -6
  79. data/lib/mutant/mutator/node/rescue.rb +2 -19
  80. data/lib/mutant/mutator/node/return.rb +0 -3
  81. data/lib/mutant/mutator/node/sclass.rb +20 -0
  82. data/lib/mutant/mutator/node/send.rb +26 -61
  83. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
  84. data/lib/mutant/mutator/node/send/binary.rb +0 -11
  85. data/lib/mutant/mutator/node/send/conditional.rb +0 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -3
  87. data/lib/mutant/mutator/node/super.rb +0 -3
  88. data/lib/mutant/mutator/node/when.rb +0 -19
  89. data/lib/mutant/mutator/node/yield.rb +0 -3
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -3
  91. data/lib/mutant/mutator/util/array.rb +0 -6
  92. data/lib/mutant/mutator/util/symbol.rb +0 -3
  93. data/lib/mutant/parallel.rb +0 -13
  94. data/lib/mutant/parallel/driver.rb +0 -10
  95. data/lib/mutant/parallel/worker.rb +0 -22
  96. data/lib/mutant/reporter/cli.rb +0 -5
  97. data/lib/mutant/reporter/cli/format.rb +0 -9
  98. data/lib/mutant/reporter/cli/printer.rb +2 -42
  99. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  100. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
  101. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  102. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  103. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  104. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  105. data/lib/mutant/repository/diff.rb +1 -13
  106. data/lib/mutant/repository/diff/ranges.rb +0 -11
  107. data/lib/mutant/result.rb +0 -3
  108. data/lib/mutant/runner.rb +0 -18
  109. data/lib/mutant/runner/sink.rb +0 -5
  110. data/lib/mutant/subject.rb +0 -8
  111. data/lib/mutant/subject/method.rb +0 -3
  112. data/lib/mutant/subject/method/instance.rb +40 -6
  113. data/lib/mutant/subject/method/metaclass.rb +30 -0
  114. data/lib/mutant/transform.rb +0 -92
  115. data/lib/mutant/version.rb +1 -1
  116. data/lib/mutant/warnings.rb +0 -6
  117. data/lib/mutant/zombifier.rb +2 -34
  118. metadata +61 -333
  119. data/.github/workflows/ci.yml +0 -121
  120. data/.gitignore +0 -38
  121. data/.rspec +0 -5
  122. data/.rubocop.yml +0 -7
  123. data/Changelog.md +0 -75
  124. data/Gemfile +0 -7
  125. data/Gemfile.lock +0 -167
  126. data/Gemfile.shared +0 -10
  127. data/README.md +0 -138
  128. data/Rakefile +0 -5
  129. data/config/devtools.yml +0 -2
  130. data/config/reek.yml +0 -138
  131. data/config/rubocop.yml +0 -205
  132. data/config/yardstick.yml +0 -2
  133. data/docs/commercial-support.md +0 -14
  134. data/docs/concurrency.md +0 -39
  135. data/docs/incremental.md +0 -76
  136. data/docs/known-problems.md +0 -30
  137. data/docs/limitations.md +0 -50
  138. data/docs/mutant-minitest.md +0 -149
  139. data/docs/mutant-rspec.md +0 -130
  140. data/docs/nomenclature.md +0 -82
  141. data/docs/reading-reports.md +0 -74
  142. data/lib/mutant/color.rb +0 -43
  143. data/lib/mutant/diff.rb +0 -114
  144. data/meta/and.rb +0 -15
  145. data/meta/and_asgn.rb +0 -14
  146. data/meta/array.rb +0 -30
  147. data/meta/begin.rb +0 -23
  148. data/meta/block.rb +0 -202
  149. data/meta/block_pass.rb +0 -8
  150. data/meta/blockarg.rb +0 -10
  151. data/meta/break.rb +0 -10
  152. data/meta/case.rb +0 -223
  153. data/meta/casgn.rb +0 -28
  154. data/meta/cbase.rb +0 -8
  155. data/meta/class.rb +0 -12
  156. data/meta/const.rb +0 -17
  157. data/meta/csend.rb +0 -10
  158. data/meta/cvar.rb +0 -7
  159. data/meta/cvasgn.rb +0 -10
  160. data/meta/date.rb +0 -59
  161. data/meta/def.rb +0 -203
  162. data/meta/defined.rb +0 -9
  163. data/meta/dstr.rb +0 -13
  164. data/meta/dsym.rb +0 -14
  165. data/meta/ensure.rb +0 -9
  166. data/meta/false.rb +0 -8
  167. data/meta/file.rb +0 -5
  168. data/meta/float.rb +0 -37
  169. data/meta/gvar.rb +0 -7
  170. data/meta/gvasgn.rb +0 -10
  171. data/meta/hash.rb +0 -24
  172. data/meta/if.rb +0 -77
  173. data/meta/index.rb +0 -133
  174. data/meta/indexasgn.rb +0 -31
  175. data/meta/int.rb +0 -18
  176. data/meta/ivar.rb +0 -8
  177. data/meta/ivasgn.rb +0 -23
  178. data/meta/kwarg.rb +0 -10
  179. data/meta/kwbegin.rb +0 -9
  180. data/meta/kwoptarg.rb +0 -13
  181. data/meta/lambda.rb +0 -23
  182. data/meta/line.rb +0 -5
  183. data/meta/lvar.rb +0 -16
  184. data/meta/lvasgn.rb +0 -25
  185. data/meta/masgn.rb +0 -7
  186. data/meta/match_current_line.rb +0 -15
  187. data/meta/next.rb +0 -11
  188. data/meta/nil.rb +0 -5
  189. data/meta/nthref.rb +0 -14
  190. data/meta/op_assgn.rb +0 -17
  191. data/meta/or.rb +0 -15
  192. data/meta/or_asgn.rb +0 -50
  193. data/meta/range.rb +0 -39
  194. data/meta/redo.rb +0 -5
  195. data/meta/regexp.rb +0 -81
  196. data/meta/regopt.rb +0 -10
  197. data/meta/rescue.rb +0 -90
  198. data/meta/return.rb +0 -16
  199. data/meta/self.rb +0 -7
  200. data/meta/send.rb +0 -604
  201. data/meta/str.rb +0 -7
  202. data/meta/super.rb +0 -27
  203. data/meta/sym.rb +0 -8
  204. data/meta/true.rb +0 -8
  205. data/meta/until.rb +0 -17
  206. data/meta/while.rb +0 -26
  207. data/meta/yield.rb +0 -10
  208. data/mutant-minitest.gemspec +0 -22
  209. data/mutant-rspec.gemspec +0 -22
  210. data/mutant.gemspec +0 -41
  211. data/mutant.yml +0 -6
  212. data/spec/integration/mutant/corpus_spec.rb +0 -15
  213. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  214. data/spec/integration/mutant/minitest_spec.rb +0 -11
  215. data/spec/integration/mutant/null_spec.rb +0 -16
  216. data/spec/integration/mutant/rspec_spec.rb +0 -15
  217. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  218. data/spec/integrations.yml +0 -63
  219. data/spec/shared/base_behavior.rb +0 -45
  220. data/spec/shared/framework_integration_behavior.rb +0 -70
  221. data/spec/shared/method_matcher_behavior.rb +0 -47
  222. data/spec/spec_helper.rb +0 -75
  223. data/spec/support/corpus.rb +0 -318
  224. data/spec/support/file_system.rb +0 -62
  225. data/spec/support/ice_nine_config.rb +0 -10
  226. data/spec/support/ruby_vm.rb +0 -84
  227. data/spec/support/shared_context.rb +0 -169
  228. data/spec/support/test_app.rb +0 -7
  229. data/spec/support/warnings.yml +0 -6
  230. data/spec/support/xspec.rb +0 -183
  231. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  232. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  233. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  234. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  235. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  236. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  237. data/spec/unit/mutant/ast_spec.rb +0 -57
  238. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  239. data/spec/unit/mutant/cli_spec.rb +0 -305
  240. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  241. data/spec/unit/mutant/config_spec.rb +0 -126
  242. data/spec/unit/mutant/context_spec.rb +0 -111
  243. data/spec/unit/mutant/diff_spec.rb +0 -189
  244. data/spec/unit/mutant/env_spec.rb +0 -229
  245. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  246. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  247. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  248. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  249. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  250. data/spec/unit/mutant/expression_spec.rb +0 -45
  251. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  252. data/spec/unit/mutant/integration_spec.rb +0 -150
  253. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  254. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  255. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  256. data/spec/unit/mutant/license_spec.rb +0 -293
  257. data/spec/unit/mutant/loader_spec.rb +0 -79
  258. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  259. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  260. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  261. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  262. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  263. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  264. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  265. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  266. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  267. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  268. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  269. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  270. data/spec/unit/mutant/matcher_spec.rb +0 -102
  271. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  272. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  273. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  274. data/spec/unit/mutant/mutation_spec.rb +0 -140
  275. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  276. data/spec/unit/mutant/mutator_spec.rb +0 -21
  277. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  278. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  279. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  280. data/spec/unit/mutant/parallel_spec.rb +0 -115
  281. data/spec/unit/mutant/parser_spec.rb +0 -26
  282. data/spec/unit/mutant/range_spec.rb +0 -141
  283. data/spec/unit/mutant/registry_spec.rb +0 -74
  284. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  285. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  286. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  287. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  288. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  290. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  291. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  292. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  293. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  294. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  295. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  296. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  297. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  298. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  299. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  300. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  301. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  302. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  303. data/spec/unit/mutant/result/env_spec.rb +0 -161
  304. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  305. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  306. data/spec/unit/mutant/result/test_spec.rb +0 -14
  307. data/spec/unit/mutant/result_spec.rb +0 -33
  308. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  309. data/spec/unit/mutant/runner_spec.rb +0 -121
  310. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  311. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  312. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  313. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  314. data/spec/unit/mutant/subject_spec.rb +0 -93
  315. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  316. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  317. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  318. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  319. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  320. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  321. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  322. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  323. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  324. data/spec/unit/mutant/util/one_spec.rb +0 -22
  325. data/spec/unit/mutant/warnings_spec.rb +0 -89
  326. data/spec/unit/mutant/world_spec.rb +0 -63
  327. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  328. data/test_app/.rspec +0 -1
  329. data/test_app/Gemfile.minitest +0 -4
  330. data/test_app/Gemfile.rspec3.8 +0 -7
  331. data/test_app/lib/test_app.rb +0 -109
  332. data/test_app/lib/test_app/literal.rb +0 -35
  333. data/test_app/spec/spec_helper.rb +0 -9
  334. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  335. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Boolean do
4
- subject { described_class.new }
5
-
6
- let(:primitive) { String }
7
-
8
- describe '#apply' do
9
- def apply
10
- subject.apply(input)
11
- end
12
-
13
- context 'on true' do
14
- let(:input) { true }
15
-
16
- it 'returns sucess' do
17
- expect(apply).to eql(Mutant::Either::Right.new(input))
18
- end
19
- end
20
-
21
- context 'on false' do
22
- let(:input) { false }
23
-
24
- it 'returns sucess' do
25
- expect(apply).to eql(Mutant::Either::Right.new(input))
26
- end
27
- end
28
-
29
- context 'on nil input' do
30
- let(:input) { nil }
31
-
32
- let(:error) do
33
- Mutant::Transform::Error.new(
34
- cause: nil,
35
- input: input,
36
- message: 'Expected: boolean but got: nil',
37
- transform: subject
38
- )
39
- end
40
-
41
- it 'returns failure' do
42
- expect(apply).to eql(Mutant::Either::Left.new(error))
43
- end
44
- end
45
-
46
- context 'on truthy input' do
47
- let(:input) { '' }
48
-
49
- let(:error) do
50
- Mutant::Transform::Error.new(
51
- cause: nil,
52
- input: input,
53
- message: 'Expected: boolean but got: ""',
54
- transform: subject
55
- )
56
- end
57
-
58
- it 'returns failure' do
59
- expect(apply).to eql(Mutant::Either::Left.new(error))
60
- end
61
- end
62
- end
63
- end
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Error do
4
- subject { described_class.new(attributes) }
5
-
6
- let(:message) { 'root-message' }
7
- let(:direct_cause) { nil }
8
- let(:indirect_cause) { nil }
9
-
10
- let(:attributes) do
11
- transform =
12
- if direct_cause
13
- Mutant::Transform::Named.new('root', direct_cause.transform)
14
- else
15
- Mutant::Transform::Boolean.new
16
- end
17
-
18
- {
19
- cause: direct_cause,
20
- input: nil,
21
- message: message,
22
- transform: transform
23
- }
24
- end
25
-
26
- shared_context 'direct cause' do
27
- let(:direct_cause) do
28
- transform =
29
- if indirect_cause
30
- Mutant::Transform::Named.new('direct-cause', indirect_cause.transform)
31
- else
32
- Mutant::Transform::Boolean.new
33
- end
34
-
35
- described_class.new(
36
- cause: indirect_cause,
37
- input: nil,
38
- message: 'direct-cause-message',
39
- transform: transform
40
- )
41
- end
42
- end
43
-
44
- shared_examples 'indirect cause' do
45
- let(:indirect_cause) do
46
- described_class.new(
47
- cause: nil,
48
- input: nil,
49
- message: 'indirect-cause-message',
50
- transform: Mutant::Transform::Boolean.new
51
- )
52
- end
53
- end
54
-
55
- describe '#trace' do
56
- def apply
57
- subject.trace
58
- end
59
-
60
- context 'without cause' do
61
- it 'returns path to self' do
62
- expect(apply).to eql([subject])
63
- end
64
- end
65
-
66
- context 'with direct cause' do
67
- include_context 'direct cause'
68
-
69
- it 'returns path to direct cause' do
70
- expect(apply).to eql([subject, direct_cause])
71
- end
72
- end
73
-
74
- context 'with indirect cause' do
75
- include_context 'direct cause'
76
- include_context 'indirect cause'
77
-
78
- it 'returns path to direct cause' do
79
- expect(apply).to eql([subject, direct_cause, indirect_cause])
80
- end
81
- end
82
- end
83
-
84
- describe '#compact_message' do
85
- def apply
86
- subject.compact_message
87
- end
88
-
89
- context 'root cause' do
90
- it 'returns expected message' do
91
- expect(apply).to eql('Mutant::Transform::Boolean: root-message')
92
- end
93
- end
94
-
95
- context 'with direct cause' do
96
- include_context 'direct cause'
97
-
98
- it 'returns expected message' do
99
- expect(apply).to eql(<<~'MESSAGE'.chomp)
100
- root/Mutant::Transform::Boolean: direct-cause-message
101
- MESSAGE
102
- end
103
- end
104
-
105
- context 'with indirect cause' do
106
- include_context 'direct cause'
107
- include_context 'indirect cause'
108
-
109
- context 'with present slugs' do
110
- it 'returns expected message' do
111
- expect(apply).to eql(<<~'MESSAGE'.chomp)
112
- root/direct-cause/Mutant::Transform::Boolean: indirect-cause-message
113
- MESSAGE
114
- end
115
- end
116
-
117
- context 'with empty slug' do
118
- let(:direct_cause) do
119
- super().with(
120
- transform: Mutant::Transform::Named.new('', indirect_cause.transform)
121
- )
122
- end
123
-
124
- it 'returns expected message' do
125
- expect(apply).to eql(<<~'MESSAGE'.chomp)
126
- root/Mutant::Transform::Boolean: indirect-cause-message
127
- MESSAGE
128
- end
129
- end
130
- end
131
- end
132
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Exception do
4
- subject { described_class.new(error_class, block) }
5
-
6
- let(:error_class) do
7
- Class.new(RuntimeError)
8
- end
9
-
10
- describe '#apply' do
11
- def apply
12
- subject.apply(input)
13
- end
14
-
15
- let(:input) { 2 }
16
-
17
- context 'block that does not raise' do
18
- let(:block) { ->(input) { input*input } }
19
-
20
- it 'returns expected success value' do
21
- expect(apply).to eql(Mutant::Either::Right.new(4))
22
- end
23
- end
24
-
25
- context 'on block that raises' do
26
- context 'a covered exception' do
27
- let(:block) { ->(_input) { fail(error_class, 'some message') } }
28
-
29
- let(:error) do
30
- Mutant::Transform::Error.new(
31
- cause: nil,
32
- input: input,
33
- message: 'some message',
34
- transform: subject
35
- )
36
- end
37
-
38
- it 'returns expected error' do
39
- expect(apply).to eql(Mutant::Either::Left.new(error))
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,236 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Hash do
4
- subject { described_class.new(attributes) }
5
-
6
- let(:required) { [] }
7
- let(:optional) { [] }
8
- let(:symbol) { Mutant::Transform::Primitive.new(Symbol) }
9
-
10
- let(:attributes) do
11
- {
12
- required: required,
13
- optional: optional
14
- }
15
- end
16
-
17
- describe '#apply' do
18
- def apply
19
- subject.apply(input)
20
- end
21
-
22
- context 'on Hash input' do
23
- context 'empty' do
24
- let(:input) { {} }
25
-
26
- it 'returns sucess' do
27
- expect(apply).to eql(Mutant::Either::Right.new(input))
28
- end
29
- end
30
-
31
- context 'missing key' do
32
- let(:input) { {} }
33
- let(:required) { [described_class::Key.new(:foo, symbol)] }
34
-
35
- let(:error) do
36
- Mutant::Transform::Error.new(
37
- cause: nil,
38
- input: input,
39
- message: 'Missing keys: [:foo], Unexpected keys: []',
40
- transform: subject
41
- )
42
- end
43
-
44
- it 'returns error' do
45
- expect(apply).to eql(Mutant::Either::Left.new(error))
46
- end
47
- end
48
-
49
- context 'extra key' do
50
- let(:input) { { foo: :bar } }
51
-
52
- let(:error) do
53
- Mutant::Transform::Error.new(
54
- cause: nil,
55
- input: input,
56
- message: 'Missing keys: [], Unexpected keys: [:foo]',
57
- transform: subject
58
- )
59
- end
60
-
61
- it 'returns error' do
62
- expect(apply).to eql(Mutant::Either::Left.new(error))
63
- end
64
- end
65
-
66
- context 'using required' do
67
- let(:input) { { foo: :bar } }
68
- let(:required) { [described_class::Key.new(:foo, symbol)] }
69
-
70
- it 'returns success' do
71
- expect(apply).to eql(Mutant::Either::Right.new(input))
72
- end
73
- end
74
-
75
- context 'using optional' do
76
- let(:optional) { [described_class::Key.new(:foo, symbol)] }
77
-
78
- context 'not providing the optional key' do
79
- let(:input) { {} }
80
-
81
- it 'returns success' do
82
- expect(apply).to eql(Mutant::Either::Right.new(input))
83
- end
84
- end
85
-
86
- context 'providing the optional key' do
87
- let(:input) { { foo: :bar } }
88
-
89
- it 'returns success' do
90
- expect(apply).to eql(Mutant::Either::Right.new(input))
91
- end
92
- end
93
- end
94
-
95
- shared_examples 'key transform error' do
96
- let(:innermost_error) do
97
- Mutant::Transform::Error.new(
98
- cause: nil,
99
- input: 'bar',
100
- message: 'Expected: Symbol but got: String',
101
- transform: symbol
102
- )
103
- end
104
-
105
- let(:inner_error) do
106
- Mutant::Transform::Error.new(
107
- cause: innermost_error,
108
- input: 'bar',
109
- message: nil,
110
- transform: key_transform
111
- )
112
- end
113
-
114
- let(:error) do
115
- Mutant::Transform::Error.new(
116
- cause: inner_error,
117
- input: input,
118
- message: nil,
119
- transform: subject
120
- )
121
- end
122
-
123
- it 'returns failure' do
124
- expect(apply).to eql(Mutant::Either::Left.new(error))
125
- end
126
- end
127
-
128
- context 'key transform error' do
129
- let(:input) { { foo: 'bar' } }
130
-
131
- let(:key_transform) { described_class::Key.new(:foo, symbol) }
132
-
133
- context 'on optional key' do
134
- let(:optional) { [key_transform] }
135
-
136
- include_examples 'key transform error'
137
- end
138
-
139
- context 'on required key' do
140
- let(:required) { [key_transform] }
141
-
142
- include_examples 'key transform error'
143
- end
144
- end
145
- end
146
-
147
- context 'on other input' do
148
- let(:input) { [] }
149
-
150
- let(:error) do
151
- Mutant::Transform::Error.new(
152
- cause: nil,
153
- input: input,
154
- message: 'Expected: Hash but got: Array',
155
- transform: subject
156
- )
157
- end
158
-
159
- it 'returns failure' do
160
- expect(apply).to eql(Mutant::Either::Left.new(error))
161
- end
162
- end
163
- end
164
- end
165
-
166
- RSpec.describe Mutant::Transform::Hash::Symbolize do
167
- subject { described_class.new }
168
-
169
- describe '#apply' do
170
- def apply
171
- subject.apply(input)
172
- end
173
-
174
- let(:input) { { 'foo' => 'bar' } }
175
-
176
- it 'returns success' do
177
- expect(apply).to eql(Mutant::Either::Right.new(foo: 'bar'))
178
- end
179
- end
180
- end
181
-
182
- RSpec.describe Mutant::Transform::Hash::Key do
183
- subject { described_class.new(:foo, boolean) }
184
-
185
- let(:boolean) { Mutant::Transform::Boolean.new }
186
-
187
- describe '#slug' do
188
- def apply
189
- subject.slug
190
- end
191
-
192
- it 'returns expected slug' do
193
- expect(apply).to eql('[:foo]')
194
- end
195
- end
196
-
197
- describe '#apply' do
198
- def apply
199
- subject.apply(input)
200
- end
201
-
202
- context 'on valid input' do
203
- let(:input) { true }
204
-
205
- it 'returns success' do
206
- expect(apply).to eql(Mutant::Either::Right.new(true))
207
- end
208
- end
209
-
210
- context 'on invalid input' do
211
- let(:input) { 1 }
212
-
213
- let(:inner_error) do
214
- Mutant::Transform::Error.new(
215
- cause: nil,
216
- input: 1,
217
- message: 'Expected: boolean but got: 1',
218
- transform: boolean
219
- )
220
- end
221
-
222
- let(:error) do
223
- Mutant::Transform::Error.new(
224
- cause: inner_error,
225
- input: 1,
226
- message: nil,
227
- transform: subject
228
- )
229
- end
230
-
231
- it 'returns failure' do
232
- expect(apply).to eql(Mutant::Either::Left.new(error))
233
- end
234
- end
235
- end
236
- end