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,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Isolation::None do
4
- describe '.call' do
5
- let(:object) { described_class.new }
6
-
7
- context 'without exception' do
8
- it 'returns success result' do
9
- expect(object.call { :foo })
10
- .to eql(Mutant::Isolation::Result::Success.new(:foo))
11
- end
12
- end
13
-
14
- context 'with exception' do
15
- let(:exception) { RuntimeError.new('foo') }
16
-
17
- it 'returns error result' do
18
- expect(object.call { fail exception })
19
- .to eql(Mutant::Isolation::Result::Exception.new(exception))
20
- end
21
- end
22
- end
23
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Isolation::Result do
4
- describe '#success?' do
5
- let(:value) { double('Object') }
6
-
7
- def apply
8
- effective_class.new(value).success?
9
- end
10
-
11
- context 'on success instance' do
12
- let(:effective_class) { described_class::Success }
13
-
14
- it 'returns true' do
15
- expect(apply).to be(true)
16
- end
17
- end
18
-
19
- context 'on error instance' do
20
- let(:effective_class) { described_class::Exception }
21
-
22
- it 'returns false' do
23
- expect(apply).to be(false)
24
- end
25
- end
26
- end
27
-
28
- describe '#add_error' do
29
- let(:other) { described_class::Success.new(object) }
30
- let(:value) { double('Object') }
31
- let(:object) { described_class::Success.new(value) }
32
-
33
- def apply
34
- object.add_error(other)
35
- end
36
-
37
- it 'returns chain instance' do
38
- expect(apply).to eql(described_class::ErrorChain.new(other, object))
39
- end
40
- end
41
-
42
- describe '#log' do
43
- let(:value) { double('Object') }
44
-
45
- def apply
46
- object.log
47
- end
48
-
49
- context 'on exception result' do
50
- let(:object) { described_class::Exception.new(value) }
51
-
52
- it 'returns the empty string' do
53
- expect(apply).to eql('')
54
- end
55
- end
56
-
57
- context 'on sucess result' do
58
- let(:object) { described_class::Success.new(value) }
59
-
60
- it 'returns the empty string' do
61
- expect(apply).to eql('')
62
- end
63
- end
64
-
65
- context 'on argument' do
66
- let(:object) { described_class::Success.new(value, 'foo') }
67
-
68
- it 'returns the empty string' do
69
- expect(apply).to eql('foo')
70
- end
71
- end
72
- end
73
- end
@@ -1,293 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::License do
4
- def apply
5
- described_class.apply(world)
6
- end
7
-
8
- let(:gem) { class_double(Gem, loaded_specs: loaded_specs) }
9
- let(:gem_method) { instance_double(Method) }
10
- let(:gem_path) { '/path/to/mutant-license' }
11
- let(:gem_pathname) { instance_double(Pathname) }
12
- let(:json) { class_double(JSON) }
13
- let(:kernel) { class_double(Kernel) }
14
- let(:license_pathname) { instance_double(Pathname) }
15
- let(:load_json) { true }
16
- let(:loaded_specs) { { 'mutant-license' => spec } }
17
- let(:path) { instance_double(Pathname) }
18
- let(:pathname) { class_double(Pathname) }
19
- let(:stderr) { instance_double(IO) }
20
-
21
- let(:spec) do
22
- instance_double(
23
- Gem::Specification,
24
- full_gem_path: gem_path
25
- )
26
- end
27
-
28
- let(:world) do
29
- instance_double(
30
- Mutant::World,
31
- gem: gem,
32
- gem_method: gem_method,
33
- json: json,
34
- kernel: kernel,
35
- pathname: pathname,
36
- stderr: stderr
37
- )
38
- end
39
-
40
- before do
41
- allow(gem_method).to receive_messages(call: undefined)
42
- allow(gem_pathname).to receive_messages(join: license_pathname)
43
- allow(json).to receive_messages(load: license_json)
44
- allow(kernel).to receive_messages(sleep: undefined)
45
- allow(pathname).to receive_messages(new: gem_pathname)
46
- allow(world).to receive(:capture_stdout, &commands.method(:fetch))
47
- end
48
-
49
- def self.it_fails(expected)
50
- it 'failse with exception' do
51
- expect { apply }.to raise_error(expected)
52
- end
53
- end
54
-
55
- def self.it_is_successful
56
- include_examples 'license.json lookup'
57
-
58
- it 'allows usage' do
59
- expect(apply).to eql(Mutant::Either::Right.new(true))
60
- end
61
- end
62
-
63
- # rubocop:disable Metrics/AbcSize
64
- # rubocop:disable Metrics/MethodLength
65
- def self.it_fails_with_message(expected)
66
- before do
67
- allow(stderr).to receive(:puts)
68
- end
69
-
70
- it 'performs IO in expected sequence' do
71
- expect(apply).to eql(Mutant::Either::Right.new(true))
72
-
73
- expect(gem_method)
74
- .to have_received(:call)
75
- .with('mutant-license', '~> 0.1.0')
76
- .ordered
77
-
78
- if load_json
79
- expect(json)
80
- .to have_received(:load)
81
- .with(license_pathname)
82
- .ordered
83
- end
84
-
85
- expect(stderr)
86
- .to have_received(:puts)
87
- .with(expected)
88
- .ordered
89
-
90
- expect(stderr)
91
- .to have_received(:puts)
92
- .with('[Mutant-License-Error]: Soft fail, continuing in 40 seconds')
93
- .ordered
94
-
95
- expect(stderr)
96
- .to have_received(:puts)
97
- .with('[Mutant-License-Error]: Next major version will enforce the license')
98
- .ordered
99
-
100
- expect(stderr)
101
- .to have_received(:puts)
102
- .with('[Mutant-License-Error]: See https://github.com/mbj/mutant#licensing')
103
- .ordered
104
-
105
- expect(kernel)
106
- .to have_received(:sleep)
107
- .with(40)
108
- .ordered
109
- end
110
- end
111
-
112
- shared_examples 'license.json lookup' do
113
- it 'builds correct license.json path' do
114
- apply
115
-
116
- expect(pathname).to have_received(:new).with(gem_path)
117
- expect(gem_pathname).to have_received(:join).with('license.json')
118
- end
119
- end
120
-
121
- describe 'on opensource license' do
122
- let(:repository) { 'github.com/mbj/mutant' }
123
-
124
- let(:git_remote) do
125
- <<~REMOTE
126
- origin\tgit@github.com:mbj/mutant (fetch)
127
- origin\tgit@github.com:mbj/mutant (push)
128
- REMOTE
129
- end
130
-
131
- let(:license_json) do
132
- {
133
- 'type' => 'oss',
134
- 'contents' => {
135
- 'repositories' => [repository]
136
- }
137
- }
138
- end
139
-
140
- let(:git_remote_result) { Mutant::Either::Right.new(git_remote) }
141
-
142
- let(:commands) do
143
- {
144
- %w[git remote --verbose] => git_remote_result
145
- }
146
- end
147
-
148
- context 'when repository is whitelisted' do
149
- context 'on ssh url without protocol and without suffx' do
150
- it_is_successful
151
- end
152
-
153
- context 'on ssh url with protocol and without suffx' do
154
- let(:git_remote) do
155
- <<~REMOTE
156
- origin\tssh://git@github.com/mbj/mutant (fetch)
157
- origin\tssh://git@github.com/mbj/mutant (push)
158
- REMOTE
159
- end
160
-
161
- it_is_successful
162
- end
163
-
164
- context 'on ssh url with protocol and suffx' do
165
- let(:git_remote) do
166
- <<~REMOTE
167
- origin\tssh://git@github.com/mbj/mutant.git (fetch)
168
- origin\tssh://git@github.com/mbj/mutant.git (push)
169
- REMOTE
170
- end
171
-
172
- it_is_successful
173
- end
174
-
175
- context 'on https url without suffix' do
176
- let(:git_remote) do
177
- <<~REMOTE
178
- origin\thttps://github.com/mbj/mutant (fetch)
179
- origin\thttps://github.com/mbj/mutant (push)
180
- REMOTE
181
- end
182
-
183
- it_is_successful
184
- end
185
-
186
- context 'on https url with .git suffix' do
187
- let(:git_remote) do
188
- <<~REMOTE
189
- origin\thttps://github.com/mbj/mutant.git (fetch)
190
- origin\thttps://github.com/mbj/mutant.git (push)
191
- REMOTE
192
- end
193
-
194
- it_is_successful
195
- end
196
- end
197
-
198
- context 'when repository is not whitelisted' do
199
- let(:repository) { 'github.com/mbj/unparser' }
200
-
201
- it_fails_with_message(<<~'MESSAGE')
202
- Can not validate opensource license.
203
- Licensed:
204
- github.com/mbj/unparser
205
- Present:
206
- github.com/mbj/mutant
207
- MESSAGE
208
- end
209
-
210
- context 'when git remote line cannot be parsed' do
211
- let(:git_remote) { "some-bad-remote-line\n" }
212
-
213
- it_fails 'Unmatched remote line: "some-bad-remote-line\n"'
214
- end
215
-
216
- context 'when git remote url cannot be parsed' do
217
- let(:git_remote) { "some-unknown\thttp://github.com/mbj/mutant (fetch)\n" }
218
-
219
- it_fails 'Unmatched git remote URL: "http://github.com/mbj/mutant"'
220
- end
221
- end
222
-
223
- describe 'on commercial license' do
224
- let(:licensed_authors) do
225
- %w[
226
- customer-a@example.com
227
- customer-b@example.com
228
- ]
229
- end
230
-
231
- let(:license_json) do
232
- {
233
- 'type' => 'com',
234
- 'contents' => {
235
- 'authors' => licensed_authors
236
- }
237
- }
238
- end
239
-
240
- let(:git_config_author) { "customer-a@example.com\n" }
241
- let(:git_config_result) { Mutant::Either::Right.new(git_config_author) }
242
- let(:git_show_author) { "customer-b@example.com\n" }
243
- let(:git_show_result) { Mutant::Either::Right.new(git_show_author) }
244
-
245
- let(:commands) do
246
- {
247
- %w[git config --get user.email] => git_config_result,
248
- %w[git show --quiet --pretty=format:%ae] => git_show_result
249
- }
250
- end
251
-
252
- context 'when author is whitelisted' do
253
- it_is_successful
254
- end
255
-
256
- context 'when author is not whitelisted' do
257
- let(:licensed_authors) { %w[customer-c@example.com] }
258
-
259
- it_fails_with_message(<<~'MESSAGE')
260
- Can not validate commercial license.
261
- Licensed:
262
- customer-c@example.com
263
- Present:
264
- customer-a@example.com
265
- customer-b@example.com
266
- MESSAGE
267
- end
268
-
269
- context 'when author cannot be found in commit or config' do
270
- let(:git_config_result) { Mutant::Either::Left.new('fatal: error') }
271
- let(:git_show_result) { Mutant::Either::Left.new('fatal: error') }
272
-
273
- it_fails_with_message(<<~'MESSAGE')
274
- Can not validate commercial license.
275
- Licensed:
276
- customer-a@example.com
277
- customer-b@example.com
278
- Present:
279
- [none]
280
- MESSAGE
281
- end
282
-
283
- context 'when mutant-license gem cannot be loaded' do
284
- let(:load_json) { false }
285
-
286
- before do
287
- allow(gem_method).to receive(:call).and_raise(Gem::LoadError, 'test-error')
288
- end
289
-
290
- it_fails_with_message '[Mutant-License-Error]: test-error'
291
- end
292
- end
293
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Loader, '.call' do
4
- def apply
5
- described_class.call(
6
- binding: binding,
7
- kernel: kernel,
8
- source: source,
9
- subject: mutation_subject
10
- )
11
- end
12
-
13
- let(:path) { instance_double(Pathname, to_s: path_str) }
14
- let(:path_str) { instance_double(String) }
15
- let(:line) { instance_double(Integer) }
16
- let(:kernel) { class_double(Kernel) }
17
- let(:binding) { instance_double(Binding) }
18
- let(:source) { instance_double(String) }
19
- let(:node) { instance_double(Parser::AST::Node) }
20
-
21
- let(:mutation_subject) do
22
- instance_double(
23
- Mutant::Subject,
24
- source_path: path,
25
- source_line: line
26
- )
27
- end
28
-
29
- before do
30
- allow(kernel).to receive_messages(eval: nil)
31
- end
32
-
33
- shared_examples 'kernel eval' do
34
- it 'performs eval' do
35
- apply
36
-
37
- expect(kernel).to have_received(:eval)
38
- .with(
39
- "# frozen_string_literal: true\n#[InstanceDouble(String) (anonymous)]",
40
- binding,
41
- path_str,
42
- line
43
- )
44
- end
45
- end
46
-
47
- context 'without exception being raised' do
48
- it 'returns success result' do
49
- expect(apply).to be(described_class::Result::Success.instance)
50
- end
51
-
52
- include_examples 'kernel eval'
53
- end
54
-
55
- context 'with void value syntax error' do
56
- before do
57
- allow(kernel).to receive(:eval)
58
- .and_raise(SyntaxError, '/some/path.rb:1: void value expression')
59
- end
60
-
61
- it 'returns void value result' do
62
- expect(apply).to be(described_class::Result::VoidValue.instance)
63
- end
64
-
65
- include_examples 'kernel eval'
66
- end
67
-
68
- context 'with other syntax error' do
69
- let(:message) { '(eval):1: some other error' }
70
-
71
- before do
72
- allow(kernel).to receive(:eval).and_raise(SyntaxError, message)
73
- end
74
-
75
- it 'raises exception' do
76
- expect { apply }.to raise_error(SyntaxError, message)
77
- end
78
- end
79
- end