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,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::MutationProgressResult do
4
- setup_shared_context
5
-
6
- let(:reportable) { mutation_a_result }
7
-
8
- before do
9
- allow(output).to receive(:tty?).and_return(true)
10
- end
11
-
12
- describe '.run' do
13
- context 'on killed mutant' do
14
- with(:mutation_a_test_result) { { passed: true } }
15
-
16
- it_reports Unparser::Color::RED.format('F')
17
- end
18
-
19
- context 'on alive mutant' do
20
- with(:mutation_a_test_result) { { passed: false } }
21
-
22
- it_reports Unparser::Color::GREEN.format('.')
23
- end
24
- end
25
- end
@@ -1,153 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::MutationResult do
4
- setup_shared_context
5
-
6
- let(:reportable) { mutation_a_result }
7
-
8
- describe '.call' do
9
- context 'isolation problem' do
10
- let(:status) do
11
- instance_double(Process::Status)
12
- end
13
-
14
- let(:mutation_a_isolation_result) do
15
- Mutant::Isolation::Fork::ChildError.new(status, 'log message')
16
- end
17
-
18
- it_reports(<<~'REPORT')
19
- evil:subject-a:d27d2
20
- @@ -1 +1 @@
21
- -true
22
- +false
23
- -----------------------
24
- Killfork exited nonzero. Its result (if any) was ignored.
25
- Process status:
26
- #<InstanceDouble(Process::Status) (anonymous)>
27
- Log messages (combined stderr and stdout):
28
- log message
29
- -----------------------
30
- REPORT
31
- end
32
-
33
- context 'unsucessful result' do
34
- with(:mutation_a_test_result) { { passed: true } }
35
-
36
- context 'on evil mutation' do
37
- context 'with a diff' do
38
- context 'on a tty' do
39
- before do
40
- allow(output).to receive(:tty?).and_return(true)
41
- end
42
-
43
- it_reports(
44
- [
45
- [Unparser::Color::NONE, "evil:subject-a:d27d2\n"],
46
- [Unparser::Color::NONE, "@@ -1 +1 @@\n"],
47
- [Unparser::Color::RED, "-true\n"],
48
- [Unparser::Color::GREEN, "+false\n"],
49
- [Unparser::Color::NONE, "-----------------------\n"],
50
- [Unparser::Color::NONE, "- 1 @ runtime: 1.0\n"],
51
- [Unparser::Color::NONE, " - test-a\n"],
52
- [Unparser::Color::NONE, "Test Output:\n"],
53
- [Unparser::Color::NONE, "mutation a test result output\n"],
54
- [Unparser::Color::NONE, "-----------------------\n"]
55
- ].map { |color, text| color.format(text) }.join
56
- )
57
- end
58
-
59
- context 'on non tty' do
60
- it_reports(<<~'STR')
61
- evil:subject-a:d27d2
62
- @@ -1 +1 @@
63
- -true
64
- +false
65
- -----------------------
66
- - 1 @ runtime: 1.0
67
- - test-a
68
- Test Output:
69
- mutation a test result output
70
- -----------------------
71
- STR
72
- end
73
- end
74
-
75
- context 'without a diff' do
76
- # This is intentionally invalid AST mutant might produce
77
- let(:subject_a_node) { s(:lvar, :super) }
78
-
79
- # Unparses exactly the same way as above node
80
- let(:mutation_a_node) { s(:zsuper) }
81
-
82
- it_reports(<<~REPORT)
83
- evil:subject-a:a5bc7
84
- --- Internal failure ---
85
- BUG: A generted mutation did not result in exactly one diff hunk!
86
- This is an invariant violation by the mutation generation engine.
87
- Please report a reproduction to https://github.com/mbj/mutant
88
- Original unparsed source:
89
- super
90
- Original AST:
91
- s(:lvar, :super)
92
- Mutated unparsed source:
93
- super
94
- Mutated AST:
95
- s(:zsuper)
96
- -----------------------
97
- - 1 @ runtime: 1.0
98
- - test-a
99
- Test Output:
100
- mutation a test result output
101
- -----------------------
102
- REPORT
103
- end
104
- end
105
-
106
- context 'on neutral mutation' do
107
- with(:mutation_a_test_result) { { passed: false } }
108
-
109
- let(:mutation_a) do
110
- Mutant::Mutation::Neutral.new(subject_a, s(:true))
111
- end
112
-
113
- it_reports(<<~REPORT)
114
- neutral:subject-a:d5318
115
- --- Neutral failure ---
116
- Original code was inserted unmutated. And the test did NOT PASS.
117
- Your tests do not pass initially or you found a bug in mutant / unparser.
118
- Subject AST:
119
- s(:true)
120
- Unparsed Source:
121
- true
122
- -----------------------
123
- - 1 @ runtime: 1.0
124
- - test-a
125
- Test Output:
126
- mutation a test result output
127
- -----------------------
128
- REPORT
129
- end
130
-
131
- context 'on noop mutation' do
132
- with(:mutation_a_test_result) { { passed: false } }
133
-
134
- let(:mutation_a) do
135
- Mutant::Mutation::Noop.new(subject_a, s(:true))
136
- end
137
-
138
- it_reports(<<~REPORT)
139
- noop:subject-a:d5318
140
- ---- Noop failure -----
141
- No code was inserted. And the test did NOT PASS.
142
- This is typically a problem of your specs not passing unmutated.
143
- -----------------------
144
- - 1 @ runtime: 1.0
145
- - test-a
146
- Test Output:
147
- mutation a test result output
148
- -----------------------
149
- REPORT
150
- end
151
- end
152
- end
153
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::StatusProgressive do
4
- setup_shared_context
5
-
6
- let(:reportable) { status }
7
-
8
- describe '.call' do
9
- context 'with empty scheduler' do
10
- with(:env_result) { { subject_results: [] } }
11
-
12
- it_reports <<~REPORT
13
- progress: 00/02 alive: 0 runtime: 4.00s killtime: 0.00s mutations/s: 0.00
14
- REPORT
15
- end
16
-
17
- context 'with scheduler active on one subject' do
18
- context 'without progress' do
19
- with(:status) { { active_jobs: [].to_set } }
20
-
21
- it_reports(<<~REPORT)
22
- progress: 02/02 alive: 0 runtime: 4.00s killtime: 2.00s mutations/s: 0.50
23
- REPORT
24
- end
25
-
26
- context 'with progress' do
27
- with(:status) { { active_jobs: [job_b, job_a].to_set } }
28
-
29
- context 'on failure' do
30
- with(:mutation_a_test_result) { { passed: true } }
31
-
32
- it_reports(<<~REPORT)
33
- progress: 02/02 alive: 1 runtime: 4.00s killtime: 2.00s mutations/s: 0.50
34
- REPORT
35
- end
36
-
37
- context 'on success' do
38
- it_reports(<<~REPORT)
39
- progress: 02/02 alive: 0 runtime: 4.00s killtime: 2.00s mutations/s: 0.50
40
- REPORT
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::SubjectProgress do
4
- setup_shared_context
5
-
6
- let(:reportable) { subject_a_result }
7
-
8
- describe '.call' do
9
- context 'on full coverage' do
10
- it_reports <<~'STR'
11
- subject-a mutations: 2
12
- ..
13
- (02/02) 100% - killtime: 2.00s runtime: 2.00s overhead: 0.00s
14
- STR
15
- end
16
-
17
- context 'on partial coverage' do
18
- with(:mutation_a_test_result) { { passed: true } }
19
-
20
- it_reports <<~'STR'
21
- subject-a mutations: 2
22
- F.
23
- (01/02) 50% - killtime: 2.00s runtime: 2.00s overhead: 0.00s
24
- STR
25
- end
26
-
27
- context 'without results' do
28
- with(:subject_a_result) { { mutation_results: [] } }
29
-
30
- it_reports <<~'STR'
31
- subject-a mutations: 2
32
- (00/02) 100% - killtime: 0.00s runtime: 0.00s overhead: 0.00s
33
- STR
34
- end
35
- end
36
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::SubjectResult do
4
- setup_shared_context
5
-
6
- let(:reportable) { subject_a_result }
7
-
8
- describe '.call' do
9
- context 'on full coverage' do
10
- it_reports <<~'STR'
11
- subject-a
12
- - test-a
13
- STR
14
- end
15
-
16
- context 'on partial coverage' do
17
- with(:mutation_a_test_result) { { passed: true } }
18
-
19
- it_reports <<~'STR'
20
- subject-a
21
- - test-a
22
- evil:subject-a:d27d2
23
- @@ -1 +1 @@
24
- -true
25
- +false
26
- -----------------------
27
- - 1 @ runtime: 1.0
28
- - test-a
29
- Test Output:
30
- mutation a test result output
31
- -----------------------
32
- STR
33
- end
34
-
35
- context 'without results' do
36
- with(:subject_a_result) { { mutation_results: [] } }
37
-
38
- it_reports <<~'STR'
39
- subject-a
40
- - test-a
41
- STR
42
- end
43
- end
44
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer::TestResult do
4
- setup_shared_context
5
-
6
- let(:reportable) { mutation_a_test_result }
7
-
8
- describe '.call' do
9
- it_reports <<~'STR'
10
- - 1 @ runtime: 1.0
11
- - test-a
12
- Test Output:
13
- mutation a test result output
14
- STR
15
- end
16
- end
@@ -1,163 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI::Printer do
4
- let(:output) { StringIO.new }
5
-
6
- subject { class_under_test.call(output, reportable) }
7
-
8
- def self.it_reports(expectation)
9
- it 'writes expected report' do
10
- allow(output).to receive(:tty?).and_return(tty?)
11
- subject
12
- output.rewind
13
- expect(output.read).to eql(expectation)
14
- end
15
- end
16
-
17
- let(:reportable) { instance_double(Mutant::Result::Env, success?: success?) }
18
- let(:tty?) { true }
19
- let(:success?) { true }
20
-
21
- describe '.call' do
22
- let(:class_under_test) do
23
- Class.new(described_class) do
24
- def run
25
- puts object
26
- end
27
- end
28
- end
29
-
30
- let(:reportable) { 'foo' }
31
-
32
- it_reports "foo\n"
33
- end
34
-
35
- describe '.delegate' do
36
- let(:reportable) { double(foo: :bar, baz: :boz) }
37
-
38
- let(:class_under_test) do
39
- Class.new(described_class) do
40
- delegate :foo, :baz
41
-
42
- def run
43
- puts(foo)
44
- puts(baz)
45
- end
46
- end
47
- end
48
-
49
- it_reports "bar\nboz\n"
50
-
51
- it 'sets delegation methods to private visibility' do
52
- expect(class_under_test.private_instance_methods).to include(:foo, :baz)
53
- end
54
- end
55
-
56
- describe '#status' do
57
- let(:class_under_test) do
58
- Class.new(described_class) do
59
- def run
60
- status('foo %s', 'bar')
61
- end
62
- end
63
- end
64
-
65
- context 'on tty' do
66
- context 'on success' do
67
- it_reports Unparser::Color::GREEN.format('foo bar') + "\n"
68
- end
69
-
70
- context 'on failure' do
71
- let(:success?) { false }
72
- it_reports Unparser::Color::RED.format('foo bar') + "\n"
73
- end
74
- end
75
-
76
- context 'on no tty' do
77
- let(:tty?) { false }
78
-
79
- context 'on success' do
80
- it_reports "foo bar\n"
81
- end
82
-
83
- context 'on failure' do
84
- let(:success?) { false }
85
-
86
- it_reports "foo bar\n"
87
- end
88
- end
89
- end
90
-
91
- describe '#visit_collection' do
92
- let(:class_under_test) do
93
- reporter = nested_reporter
94
- Class.new(described_class) do
95
- define_method(:run) do
96
- visit_collection(reporter, %w[foo bar])
97
- end
98
- end
99
- end
100
-
101
- let(:nested_reporter) do
102
- Class.new(described_class) do
103
- def run
104
- puts object
105
- end
106
- end
107
- end
108
-
109
- it_reports "foo\nbar\n"
110
- end
111
-
112
- describe '#visit' do
113
- let(:class_under_test) do
114
- reporter = nested_reporter
115
- Class.new(described_class) do
116
- define_method(:run) do
117
- visit(reporter, 'foo')
118
- end
119
- end
120
- end
121
-
122
- let(:nested_reporter) do
123
- Class.new(described_class) do
124
- def run
125
- puts object
126
- end
127
- end
128
- end
129
-
130
- it_reports "foo\n"
131
- end
132
-
133
- describe '#info' do
134
- let(:class_under_test) do
135
- Class.new(described_class) do
136
- def run
137
- info('%s - %s', 'foo', 'bar')
138
- end
139
- end
140
- end
141
-
142
- it_reports "foo - bar\n"
143
- end
144
-
145
- describe '#colorize' do
146
- let(:class_under_test) do
147
- Class.new(described_class) do
148
- def run
149
- puts(colorize(Unparser::Color::RED, 'foo'))
150
- end
151
- end
152
- end
153
-
154
- context 'when output is a tty?' do
155
- it_reports Unparser::Color::RED.format('foo') + "\n"
156
- end
157
-
158
- context 'when output is NOT a tty?' do
159
- let(:tty?) { false }
160
- it_reports "foo\n"
161
- end
162
- end
163
- end