mutant 0.9.10 → 0.10.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 (254) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mutant +16 -11
  3. data/lib/mutant.rb +8 -4
  4. data/lib/mutant/bootstrap.rb +14 -1
  5. data/lib/mutant/cli.rb +9 -162
  6. data/lib/mutant/cli/command.rb +196 -0
  7. data/lib/mutant/cli/command/root.rb +13 -0
  8. data/lib/mutant/cli/command/run.rb +151 -0
  9. data/lib/mutant/cli/command/subscription.rb +54 -0
  10. data/lib/mutant/expression.rb +0 -1
  11. data/lib/mutant/isolation.rb +1 -1
  12. data/lib/mutant/isolation/fork.rb +2 -2
  13. data/lib/mutant/isolation/none.rb +1 -1
  14. data/lib/mutant/license.rb +9 -35
  15. data/lib/mutant/license/subscription.rb +31 -9
  16. data/lib/mutant/license/subscription/commercial.rb +2 -4
  17. data/lib/mutant/license/subscription/opensource.rb +7 -7
  18. data/lib/mutant/matcher/config.rb +2 -0
  19. data/lib/mutant/meta/example.rb +16 -4
  20. data/lib/mutant/meta/example/dsl.rb +33 -16
  21. data/lib/mutant/meta/example/verification.rb +70 -28
  22. data/lib/mutant/minitest/coverage.rb +53 -0
  23. data/lib/mutant/mutator/node.rb +2 -2
  24. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  25. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  26. data/lib/mutant/mutator/node/index.rb +4 -4
  27. data/lib/mutant/mutator/node/literal/range.rb +5 -2
  28. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
  29. data/lib/mutant/mutator/node/noop.rb +1 -1
  30. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  31. data/lib/mutant/mutator/node/send.rb +25 -1
  32. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  33. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  34. data/lib/mutant/subject/method/instance.rb +1 -1
  35. data/lib/mutant/version.rb +1 -1
  36. metadata +18 -336
  37. data/.github/workflows/ci.yml +0 -121
  38. data/.gitignore +0 -38
  39. data/.rspec +0 -5
  40. data/.rubocop.yml +0 -210
  41. data/Changelog.md +0 -87
  42. data/Gemfile +0 -7
  43. data/Gemfile.lock +0 -107
  44. data/Gemfile.shared +0 -10
  45. data/README.md +0 -199
  46. data/Rakefile +0 -5
  47. data/config/devtools.yml +0 -2
  48. data/config/reek.yml +0 -139
  49. data/config/yardstick.yml +0 -2
  50. data/docs/commercial-support.md +0 -14
  51. data/docs/concurrency.md +0 -39
  52. data/docs/incremental.md +0 -76
  53. data/docs/known-problems.md +0 -30
  54. data/docs/limitations.md +0 -50
  55. data/docs/mutant-minitest.md +0 -149
  56. data/docs/mutant-rspec.md +0 -130
  57. data/docs/nomenclature.md +0 -82
  58. data/docs/reading-reports.md +0 -74
  59. data/lib/mutant/mutator/node/dsym.rb +0 -22
  60. data/meta/and.rb +0 -13
  61. data/meta/and_asgn.rb +0 -14
  62. data/meta/array.rb +0 -27
  63. data/meta/begin.rb +0 -20
  64. data/meta/block.rb +0 -199
  65. data/meta/block_pass.rb +0 -8
  66. data/meta/blockarg.rb +0 -10
  67. data/meta/break.rb +0 -9
  68. data/meta/case.rb +0 -217
  69. data/meta/casgn.rb +0 -25
  70. data/meta/cbase.rb +0 -8
  71. data/meta/class.rb +0 -12
  72. data/meta/const.rb +0 -17
  73. data/meta/csend.rb +0 -10
  74. data/meta/cvar.rb +0 -7
  75. data/meta/cvasgn.rb +0 -9
  76. data/meta/date.rb +0 -59
  77. data/meta/def.rb +0 -196
  78. data/meta/defined.rb +0 -9
  79. data/meta/dstr.rb +0 -13
  80. data/meta/dsym.rb +0 -14
  81. data/meta/ensure.rb +0 -8
  82. data/meta/false.rb +0 -7
  83. data/meta/file.rb +0 -5
  84. data/meta/float.rb +0 -37
  85. data/meta/gvar.rb +0 -7
  86. data/meta/gvasgn.rb +0 -9
  87. data/meta/hash.rb +0 -20
  88. data/meta/if.rb +0 -72
  89. data/meta/index.rb +0 -133
  90. data/meta/indexasgn.rb +0 -31
  91. data/meta/int.rb +0 -18
  92. data/meta/ivar.rb +0 -8
  93. data/meta/ivasgn.rb +0 -22
  94. data/meta/kwarg.rb +0 -10
  95. data/meta/kwbegin.rb +0 -8
  96. data/meta/kwoptarg.rb +0 -13
  97. data/meta/lambda.rb +0 -23
  98. data/meta/line.rb +0 -5
  99. data/meta/lvar.rb +0 -16
  100. data/meta/lvasgn.rb +0 -24
  101. data/meta/masgn.rb +0 -7
  102. data/meta/match_current_line.rb +0 -14
  103. data/meta/next.rb +0 -10
  104. data/meta/nil.rb +0 -5
  105. data/meta/nthref.rb +0 -14
  106. data/meta/op_assgn.rb +0 -17
  107. data/meta/or.rb +0 -13
  108. data/meta/or_asgn.rb +0 -50
  109. data/meta/range.rb +0 -65
  110. data/meta/redo.rb +0 -5
  111. data/meta/regexp.rb +0 -80
  112. data/meta/regopt.rb +0 -10
  113. data/meta/rescue.rb +0 -84
  114. data/meta/return.rb +0 -16
  115. data/meta/sclass.rb +0 -12
  116. data/meta/self.rb +0 -7
  117. data/meta/send.rb +0 -600
  118. data/meta/str.rb +0 -7
  119. data/meta/super.rb +0 -27
  120. data/meta/sym.rb +0 -8
  121. data/meta/true.rb +0 -7
  122. data/meta/until.rb +0 -16
  123. data/meta/while.rb +0 -24
  124. data/meta/yield.rb +0 -9
  125. data/mutant-minitest.gemspec +0 -22
  126. data/mutant-rspec.gemspec +0 -22
  127. data/mutant.gemspec +0 -44
  128. data/mutant.sh +0 -12
  129. data/mutant.yml +0 -6
  130. data/spec/integration/mutant/corpus_spec.rb +0 -15
  131. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  132. data/spec/integration/mutant/minitest_spec.rb +0 -11
  133. data/spec/integration/mutant/null_spec.rb +0 -16
  134. data/spec/integration/mutant/rspec_spec.rb +0 -15
  135. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  136. data/spec/integrations.yml +0 -63
  137. data/spec/shared/framework_integration_behavior.rb +0 -70
  138. data/spec/shared/method_matcher_behavior.rb +0 -47
  139. data/spec/spec_helper.rb +0 -90
  140. data/spec/support/corpus.rb +0 -318
  141. data/spec/support/file_system.rb +0 -62
  142. data/spec/support/ice_nine_config.rb +0 -10
  143. data/spec/support/ruby_vm.rb +0 -84
  144. data/spec/support/shared_context.rb +0 -169
  145. data/spec/support/xspec.rb +0 -183
  146. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  147. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  148. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  149. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  150. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  151. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  152. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  153. data/spec/unit/mutant/ast_spec.rb +0 -57
  154. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  155. data/spec/unit/mutant/cli_spec.rb +0 -305
  156. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  157. data/spec/unit/mutant/config_spec.rb +0 -126
  158. data/spec/unit/mutant/context_spec.rb +0 -111
  159. data/spec/unit/mutant/env_spec.rb +0 -229
  160. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  161. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  163. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  164. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  165. data/spec/unit/mutant/expression_spec.rb +0 -45
  166. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  167. data/spec/unit/mutant/integration_spec.rb +0 -150
  168. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  169. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  170. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  171. data/spec/unit/mutant/license_spec.rb +0 -305
  172. data/spec/unit/mutant/loader_spec.rb +0 -79
  173. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  174. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  175. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  176. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  177. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  178. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  179. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  180. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  181. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  182. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  183. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  184. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  185. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  186. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  187. data/spec/unit/mutant/matcher_spec.rb +0 -102
  188. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  189. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  190. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  191. data/spec/unit/mutant/mutation_spec.rb +0 -140
  192. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  193. data/spec/unit/mutant/mutator_spec.rb +0 -21
  194. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  195. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  196. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  197. data/spec/unit/mutant/parallel_spec.rb +0 -115
  198. data/spec/unit/mutant/parser_spec.rb +0 -26
  199. data/spec/unit/mutant/range_spec.rb +0 -141
  200. data/spec/unit/mutant/registry_spec.rb +0 -74
  201. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  202. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  203. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  204. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  205. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  206. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  207. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  208. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  209. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  210. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  211. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  212. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  213. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  214. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  215. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  216. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  217. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  218. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  219. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  220. data/spec/unit/mutant/result/env_spec.rb +0 -161
  221. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  222. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  223. data/spec/unit/mutant/result/test_spec.rb +0 -14
  224. data/spec/unit/mutant/result_spec.rb +0 -33
  225. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  226. data/spec/unit/mutant/runner_spec.rb +0 -121
  227. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  228. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  229. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -276
  230. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  231. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  232. data/spec/unit/mutant/subject_spec.rb +0 -93
  233. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  234. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  235. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  236. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  237. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  238. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  239. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  240. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  241. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  242. data/spec/unit/mutant/util/one_spec.rb +0 -22
  243. data/spec/unit/mutant/warnings_spec.rb +0 -89
  244. data/spec/unit/mutant/world_spec.rb +0 -63
  245. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  246. data/test_app/.rspec +0 -1
  247. data/test_app/Gemfile.minitest +0 -6
  248. data/test_app/Gemfile.rspec3.8 +0 -7
  249. data/test_app/lib/test_app.rb +0 -114
  250. data/test_app/lib/test_app/literal.rb +0 -35
  251. data/test_app/lib/test_app/metaclasses.rb +0 -108
  252. data/test_app/spec/spec_helper.rb +0 -9
  253. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  254. 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::Subject::Method::Metaclass do
4
- let(:object) do
5
- described_class.new(
6
- context: context,
7
- node: node,
8
- warnings: warnings
9
- )
10
- end
11
-
12
- let(:node) { s(:def, :foo, s(:args)) }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:context) do
16
- Mutant::Context.new(scope, instance_double(Pathname))
17
- end
18
-
19
- let(:scope) do
20
- Class.new do
21
- class << self
22
- def foo; end
23
-
24
- def name
25
- 'Test'
26
- end
27
- end
28
- end
29
- end
30
-
31
- describe '#expression' do
32
- subject { object.expression }
33
-
34
- it { should eql(parse_expression('Test.foo')) }
35
-
36
- it_should_behave_like 'an idempotent method'
37
- end
38
-
39
- describe '#match_expression' do
40
- subject { object.match_expressions }
41
-
42
- it { should eql(%w[Test.foo Test*].map(&method(:parse_expression))) }
43
-
44
- it_should_behave_like 'an idempotent method'
45
- end
46
-
47
- describe '#prepare' do
48
-
49
- subject { object.prepare }
50
-
51
- it 'undefines method on scope' do
52
- expect { subject }.to change { scope.methods.include?(:foo) }.from(true).to(false)
53
- end
54
-
55
- it_should_behave_like 'a command method'
56
- end
57
-
58
- describe '#source' do
59
- subject { object.source }
60
-
61
- it { should eql("class << self\n def foo\n end\nend") }
62
- end
63
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Subject::Method::Singleton do
4
- let(:object) do
5
- described_class.new(
6
- context: context,
7
- node: node,
8
- warnings: warnings
9
- )
10
- end
11
-
12
- let(:node) { s(:defs, s(:self), :foo, s(:args)) }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:context) do
16
- Mutant::Context.new(scope, instance_double(Pathname))
17
- end
18
-
19
- let(:scope) do
20
- Class.new do
21
- def self.foo; end
22
-
23
- def self.name
24
- 'Test'
25
- end
26
- end
27
- end
28
-
29
- describe '#expression' do
30
- subject { object.expression }
31
-
32
- it { should eql(parse_expression('Test.foo')) }
33
-
34
- it_should_behave_like 'an idempotent method'
35
- end
36
-
37
- describe '#match_expression' do
38
- subject { object.match_expressions }
39
-
40
- it { should eql(%w[Test.foo Test*].map(&method(:parse_expression))) }
41
-
42
- it_should_behave_like 'an idempotent method'
43
- end
44
-
45
- describe '#prepare' do
46
-
47
- subject { object.prepare }
48
-
49
- it 'undefines method on scope' do
50
- expect { subject }.to change { scope.methods.include?(:foo) }.from(true).to(false)
51
- end
52
-
53
- it_should_behave_like 'a command method'
54
- end
55
-
56
- describe '#source' do
57
- subject { object.source }
58
-
59
- it { should eql("def self.foo\nend") }
60
- end
61
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Subject do
4
- let(:class_under_test) do
5
- Class.new(described_class) do
6
- def expression
7
- Mutant::Expression::Namespace::Exact.new(scope_name: 'SubjectA')
8
- end
9
-
10
- def match_expressions
11
- [
12
- expression,
13
- Mutant::Expression::Namespace::Exact.new(scope_name: 'SubjectB')
14
- ]
15
- end
16
- end
17
- end
18
-
19
- let(:object) do
20
- class_under_test.new(
21
- context: context,
22
- node: node,
23
- warnings: warnings
24
- )
25
- end
26
-
27
- let(:node) do
28
- Unparser.parse(<<-RUBY)
29
- def foo
30
- end
31
- RUBY
32
- end
33
-
34
- let(:context) do
35
- double(
36
- 'Context',
37
- source_path: 'source_path'
38
- )
39
- end
40
-
41
- let(:warnings) { instance_double(Mutant::Warnings) }
42
-
43
- describe '#identification' do
44
- subject { object.identification }
45
-
46
- it { should eql('SubjectA:source_path:1') }
47
- end
48
-
49
- describe '#source_line' do
50
- subject { object.source_line }
51
-
52
- it { should be(1) }
53
- end
54
-
55
- describe '#source_lines' do
56
- subject { object.source_lines }
57
-
58
- it { should eql(1..2) }
59
- end
60
-
61
- describe '#prepare' do
62
- subject { object.prepare }
63
-
64
- it_should_behave_like 'a command method'
65
- end
66
-
67
- describe '#node' do
68
- subject { object.node }
69
-
70
- it { should be(node) }
71
-
72
- it_should_behave_like 'an idempotent method'
73
- end
74
-
75
- describe '#mutations' do
76
- subject { object.mutations }
77
-
78
- before do
79
- expect(Mutant::Mutator).to receive(:mutate).with(node).and_return([mutation_a, mutation_b])
80
- end
81
-
82
- let(:mutation_a) { instance_double(Parser::AST::Node, :mutation_a) }
83
- let(:mutation_b) { instance_double(Parser::AST::Node, :mutation_b) }
84
-
85
- it 'generates neutral and evil mutations' do
86
- should eql([
87
- Mutant::Mutation::Neutral.new(object, node),
88
- Mutant::Mutation::Evil.new(object, mutation_a),
89
- Mutant::Mutation::Evil.new(object, mutation_b)
90
- ])
91
- end
92
- end
93
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Array do
4
- subject { described_class.new(transform) }
5
-
6
- let(:transform) { Mutant::Transform::Boolean.new }
7
-
8
- describe '#apply' do
9
- def apply
10
- subject.apply(input)
11
- end
12
-
13
- context 'on array input' do
14
- context 'empty' do
15
- let(:input) { [] }
16
-
17
- it 'returns sucess' do
18
- expect(apply).to eql(Mutant::Either::Right.new(input))
19
- end
20
- end
21
-
22
- context 'valid elements' do
23
- let(:input) { [true, true] }
24
-
25
- it 'returns sucess' do
26
- expect(apply).to eql(Mutant::Either::Right.new(input))
27
- end
28
- end
29
-
30
- context 'invalid elements' do
31
- let(:input) { [true, 1] }
32
-
33
- let(:boolean_error) do
34
- Mutant::Transform::Error.new(
35
- cause: nil,
36
- input: 1,
37
- message: 'Expected: boolean but got: 1',
38
- transform: transform
39
- )
40
- end
41
-
42
- let(:index_error) do
43
- Mutant::Transform::Error.new(
44
- cause: boolean_error,
45
- input: 1,
46
- message: nil,
47
- transform: Mutant::Transform::Index.new(index: 1, transform: transform)
48
- )
49
- end
50
-
51
- let(:error) do
52
- Mutant::Transform::Error.new(
53
- cause: index_error,
54
- input: input,
55
- message: 'Failed to coerce array at index: 1',
56
- transform: subject
57
- )
58
- end
59
-
60
- it 'returns failure' do
61
- expect(apply).to eql(Mutant::Either::Left.new(error))
62
- end
63
- end
64
-
65
- context 'transformed elements' do
66
- let(:input) { [{ 'foo' => 'bar' }] }
67
- let(:transform) { Mutant::Transform::Hash::Symbolize.new }
68
-
69
- it 'returns transformed elements' do
70
- expect(apply).to eql(Mutant::Either::Right.new([foo: 'bar']))
71
- end
72
- end
73
- end
74
-
75
- context 'on other input' do
76
- let(:input) { false }
77
-
78
- let(:error) do
79
- Mutant::Transform::Error.new(
80
- cause: nil,
81
- input: input,
82
- message: 'Expected: Array but got: FalseClass',
83
- transform: subject
84
- )
85
- end
86
-
87
- it 'returns failure' do
88
- expect(apply).to eql(Mutant::Either::Left.new(error))
89
- end
90
- end
91
- end
92
- end
@@ -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