mutest 0.0.1 → 0.0.2

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 (401) hide show
  1. checksums.yaml +4 -4
  2. data/.buildkite/hooks/pre-command +3 -0
  3. data/.buildkite/pipeline.yml +51 -0
  4. data/.gitattributes +1 -0
  5. data/.gitignore +38 -0
  6. data/.rspec +5 -0
  7. data/Gemfile +13 -0
  8. data/Gemfile.lock +216 -0
  9. data/Gemfile.shared +3 -0
  10. data/LICENSE +21 -0
  11. data/README.md +8 -0
  12. data/Rakefile +24 -0
  13. data/bin/mutest +39 -0
  14. data/build/Dockerfile +71 -0
  15. data/build/docker-bootstrap.sh +85 -0
  16. data/build/docker-exec +29 -0
  17. data/build/make-docker +3 -0
  18. data/build/ruby_matrix +1 -0
  19. data/build/run +5 -0
  20. data/build/strict-mode.sh +16 -0
  21. data/circle.yml +7 -0
  22. data/config/devtools.yml +2 -0
  23. data/config/flay.yml +3 -0
  24. data/config/flog.yml +2 -0
  25. data/config/reek.yml +137 -0
  26. data/config/rubocop.yml +395 -0
  27. data/config/triage.yml +2 -0
  28. data/config/yardstick.yml +2 -0
  29. data/lib/mutest.rb +243 -0
  30. data/lib/mutest/actor.rb +52 -0
  31. data/lib/mutest/actor/env.rb +28 -0
  32. data/lib/mutest/actor/mailbox.rb +31 -0
  33. data/lib/mutest/actor/receiver.rb +39 -0
  34. data/lib/mutest/actor/sender.rb +22 -0
  35. data/lib/mutest/ast.rb +44 -0
  36. data/lib/mutest/ast/meta.rb +7 -0
  37. data/lib/mutest/ast/meta/const.rb +22 -0
  38. data/lib/mutest/ast/meta/optarg.rb +24 -0
  39. data/lib/mutest/ast/meta/resbody.rb +15 -0
  40. data/lib/mutest/ast/meta/restarg.rb +15 -0
  41. data/lib/mutest/ast/meta/send.rb +89 -0
  42. data/lib/mutest/ast/meta/symbol.rb +15 -0
  43. data/lib/mutest/ast/named_children.rb +86 -0
  44. data/lib/mutest/ast/node_predicates.rb +17 -0
  45. data/lib/mutest/ast/nodes.rb +22 -0
  46. data/lib/mutest/ast/regexp.rb +50 -0
  47. data/lib/mutest/ast/regexp/transformer.rb +184 -0
  48. data/lib/mutest/ast/regexp/transformer/alternative.rb +39 -0
  49. data/lib/mutest/ast/regexp/transformer/character_set.rb +46 -0
  50. data/lib/mutest/ast/regexp/transformer/direct.rb +101 -0
  51. data/lib/mutest/ast/regexp/transformer/options_group.rb +65 -0
  52. data/lib/mutest/ast/regexp/transformer/quantifier.rb +112 -0
  53. data/lib/mutest/ast/regexp/transformer/recursive.rb +50 -0
  54. data/lib/mutest/ast/regexp/transformer/root.rb +28 -0
  55. data/lib/mutest/ast/regexp/transformer/text.rb +55 -0
  56. data/lib/mutest/ast/sexp.rb +26 -0
  57. data/lib/mutest/ast/types.rb +140 -0
  58. data/lib/mutest/cli.rb +196 -0
  59. data/lib/mutest/color.rb +39 -0
  60. data/lib/mutest/config.rb +28 -0
  61. data/lib/mutest/context.rb +98 -0
  62. data/lib/mutest/diff.rb +111 -0
  63. data/lib/mutest/env.rb +59 -0
  64. data/lib/mutest/env/bootstrap.rb +159 -0
  65. data/lib/mutest/expression.rb +55 -0
  66. data/lib/mutest/expression/method.rb +54 -0
  67. data/lib/mutest/expression/methods.rb +58 -0
  68. data/lib/mutest/expression/namespace.rb +75 -0
  69. data/lib/mutest/expression/parser.rb +64 -0
  70. data/lib/mutest/integration.rb +75 -0
  71. data/lib/mutest/isolation.rb +11 -0
  72. data/lib/mutest/isolation/fork.rb +72 -0
  73. data/lib/mutest/isolation/none.rb +23 -0
  74. data/lib/mutest/loader.rb +27 -0
  75. data/lib/mutest/matcher.rb +14 -0
  76. data/lib/mutest/matcher/chain.rb +19 -0
  77. data/lib/mutest/matcher/compiler.rb +55 -0
  78. data/lib/mutest/matcher/config.rb +81 -0
  79. data/lib/mutest/matcher/filter.rb +19 -0
  80. data/lib/mutest/matcher/method.rb +138 -0
  81. data/lib/mutest/matcher/method/instance.rb +63 -0
  82. data/lib/mutest/matcher/method/singleton.rb +88 -0
  83. data/lib/mutest/matcher/methods.rb +109 -0
  84. data/lib/mutest/matcher/namespace.rb +41 -0
  85. data/lib/mutest/matcher/null.rb +17 -0
  86. data/lib/mutest/matcher/scope.rb +38 -0
  87. data/lib/mutest/matcher/static.rb +15 -0
  88. data/lib/mutest/meta.rb +33 -0
  89. data/lib/mutest/meta/example.rb +32 -0
  90. data/lib/mutest/meta/example/dsl.rb +107 -0
  91. data/lib/mutest/meta/example/verification.rb +85 -0
  92. data/lib/mutest/mutation.rb +101 -0
  93. data/lib/mutest/mutator.rb +117 -0
  94. data/lib/mutest/mutator/node.rb +166 -0
  95. data/lib/mutest/mutator/node/and_asgn.rb +25 -0
  96. data/lib/mutest/mutator/node/argument.rb +68 -0
  97. data/lib/mutest/mutator/node/arguments.rb +90 -0
  98. data/lib/mutest/mutator/node/begin.rb +21 -0
  99. data/lib/mutest/mutator/node/binary.rb +64 -0
  100. data/lib/mutest/mutator/node/block.rb +51 -0
  101. data/lib/mutest/mutator/node/break.rb +21 -0
  102. data/lib/mutest/mutator/node/case.rb +47 -0
  103. data/lib/mutest/mutator/node/class.rb +21 -0
  104. data/lib/mutest/mutator/node/conditional_loop.rb +25 -0
  105. data/lib/mutest/mutator/node/const.rb +23 -0
  106. data/lib/mutest/mutator/node/define.rb +79 -0
  107. data/lib/mutest/mutator/node/defined.rb +24 -0
  108. data/lib/mutest/mutator/node/dstr.rb +20 -0
  109. data/lib/mutest/mutator/node/dsym.rb +20 -0
  110. data/lib/mutest/mutator/node/generic.rb +77 -0
  111. data/lib/mutest/mutator/node/if.rb +57 -0
  112. data/lib/mutest/mutator/node/kwbegin.rb +20 -0
  113. data/lib/mutest/mutator/node/literal.rb +19 -0
  114. data/lib/mutest/mutator/node/literal/array.rb +37 -0
  115. data/lib/mutest/mutator/node/literal/boolean.rb +27 -0
  116. data/lib/mutest/mutator/node/literal/fixnum.rb +36 -0
  117. data/lib/mutest/mutator/node/literal/float.rb +45 -0
  118. data/lib/mutest/mutator/node/literal/hash.rb +52 -0
  119. data/lib/mutest/mutator/node/literal/nil.rb +20 -0
  120. data/lib/mutest/mutator/node/literal/range.rb +38 -0
  121. data/lib/mutest/mutator/node/literal/regex.rb +76 -0
  122. data/lib/mutest/mutator/node/literal/string.rb +21 -0
  123. data/lib/mutest/mutator/node/literal/symbol.rb +26 -0
  124. data/lib/mutest/mutator/node/masgn.rb +21 -0
  125. data/lib/mutest/mutator/node/match_current_line.rb +22 -0
  126. data/lib/mutest/mutator/node/mlhs.rb +21 -0
  127. data/lib/mutest/mutator/node/named_value/access.rb +54 -0
  128. data/lib/mutest/mutator/node/named_value/constant_assignment.rb +42 -0
  129. data/lib/mutest/mutator/node/named_value/variable_assignment.rb +47 -0
  130. data/lib/mutest/mutator/node/next.rb +22 -0
  131. data/lib/mutest/mutator/node/noop.rb +19 -0
  132. data/lib/mutest/mutator/node/nthref.rb +22 -0
  133. data/lib/mutest/mutator/node/op_asgn.rb +50 -0
  134. data/lib/mutest/mutator/node/or_asgn.rb +26 -0
  135. data/lib/mutest/mutator/node/regexp.rb +33 -0
  136. data/lib/mutest/mutator/node/regexp/alternation_meta.rb +21 -0
  137. data/lib/mutest/mutator/node/regexp/capture_group.rb +26 -0
  138. data/lib/mutest/mutator/node/regexp/character_type.rb +29 -0
  139. data/lib/mutest/mutator/node/regexp/end_of_line_anchor.rb +21 -0
  140. data/lib/mutest/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +21 -0
  141. data/lib/mutest/mutator/node/regexp/one_or_more.rb +29 -0
  142. data/lib/mutest/mutator/node/regexp/zero_or_more.rb +29 -0
  143. data/lib/mutest/mutator/node/regopt.rb +28 -0
  144. data/lib/mutest/mutator/node/resbody.rb +34 -0
  145. data/lib/mutest/mutator/node/rescue.rb +69 -0
  146. data/lib/mutest/mutator/node/return.rb +24 -0
  147. data/lib/mutest/mutator/node/send.rb +270 -0
  148. data/lib/mutest/mutator/node/send/attribute_assignment.rb +39 -0
  149. data/lib/mutest/mutator/node/send/binary.rb +45 -0
  150. data/lib/mutest/mutator/node/send/conditional.rb +21 -0
  151. data/lib/mutest/mutator/node/send/index.rb +47 -0
  152. data/lib/mutest/mutator/node/splat.rb +23 -0
  153. data/lib/mutest/mutator/node/super.rb +24 -0
  154. data/lib/mutest/mutator/node/when.rb +60 -0
  155. data/lib/mutest/mutator/node/yield.rb +21 -0
  156. data/lib/mutest/mutator/node/zsuper.rb +20 -0
  157. data/lib/mutest/mutator/util.rb +11 -0
  158. data/lib/mutest/mutator/util/array.rb +42 -0
  159. data/lib/mutest/mutator/util/symbol.rb +19 -0
  160. data/lib/mutest/parallel.rb +89 -0
  161. data/lib/mutest/parallel/master.rb +181 -0
  162. data/lib/mutest/parallel/source.rb +57 -0
  163. data/lib/mutest/parallel/worker.rb +76 -0
  164. data/lib/mutest/parser.rb +22 -0
  165. data/lib/mutest/registry.rb +43 -0
  166. data/lib/mutest/reporter.rb +39 -0
  167. data/lib/mutest/reporter/cli.rb +87 -0
  168. data/lib/mutest/reporter/cli/format.rb +135 -0
  169. data/lib/mutest/reporter/cli/printer.rb +124 -0
  170. data/lib/mutest/reporter/cli/printer/config.rb +24 -0
  171. data/lib/mutest/reporter/cli/printer/env_progress.rb +76 -0
  172. data/lib/mutest/reporter/cli/printer/env_result.rb +20 -0
  173. data/lib/mutest/reporter/cli/printer/mutation_progress_result.rb +31 -0
  174. data/lib/mutest/reporter/cli/printer/mutation_result.rb +127 -0
  175. data/lib/mutest/reporter/cli/printer/status.rb +49 -0
  176. data/lib/mutest/reporter/cli/printer/status_progressive.rb +46 -0
  177. data/lib/mutest/reporter/cli/printer/subject_progress.rb +65 -0
  178. data/lib/mutest/reporter/cli/printer/subject_result.rb +23 -0
  179. data/lib/mutest/reporter/cli/printer/test_result.rb +28 -0
  180. data/lib/mutest/reporter/cli/tput.rb +43 -0
  181. data/lib/mutest/reporter/null.rb +14 -0
  182. data/lib/mutest/reporter/sequence.rb +24 -0
  183. data/lib/mutest/repository.rb +80 -0
  184. data/lib/mutest/require_highjack.rb +24 -0
  185. data/lib/mutest/result.rb +212 -0
  186. data/lib/mutest/runner.rb +81 -0
  187. data/lib/mutest/runner/sink.rb +63 -0
  188. data/lib/mutest/scope.rb +6 -0
  189. data/lib/mutest/selector.rb +13 -0
  190. data/lib/mutest/selector/expression.rb +25 -0
  191. data/lib/mutest/source_file.rb +47 -0
  192. data/lib/mutest/subject.rb +94 -0
  193. data/lib/mutest/subject/method.rb +42 -0
  194. data/lib/mutest/subject/method/instance.rb +43 -0
  195. data/lib/mutest/subject/method/singleton.rb +19 -0
  196. data/lib/mutest/test.rb +14 -0
  197. data/lib/mutest/util.rb +18 -0
  198. data/lib/mutest/version.rb +4 -0
  199. data/lib/mutest/warning_filter.rb +58 -0
  200. data/lib/mutest/zombifier.rb +119 -0
  201. data/meta/and.rb +13 -0
  202. data/meta/and_asgn.rb +12 -0
  203. data/meta/array.rb +28 -0
  204. data/meta/begin.rb +19 -0
  205. data/meta/block.rb +104 -0
  206. data/meta/block_pass.rb +6 -0
  207. data/meta/blockarg.rb +8 -0
  208. data/meta/break.rb +8 -0
  209. data/meta/case.rb +221 -0
  210. data/meta/casgn.rb +26 -0
  211. data/meta/cbase.rb +6 -0
  212. data/meta/class.rb +10 -0
  213. data/meta/const.rb +15 -0
  214. data/meta/csend.rb +8 -0
  215. data/meta/cvar.rb +5 -0
  216. data/meta/cvasgn.rb +8 -0
  217. data/meta/date.rb +57 -0
  218. data/meta/def.rb +260 -0
  219. data/meta/defined.rb +7 -0
  220. data/meta/dstr.rb +11 -0
  221. data/meta/dsym.rb +12 -0
  222. data/meta/ensure.rb +7 -0
  223. data/meta/false.rb +6 -0
  224. data/meta/float.rb +35 -0
  225. data/meta/gvar.rb +5 -0
  226. data/meta/gvasgn.rb +8 -0
  227. data/meta/hash.rb +22 -0
  228. data/meta/if.rb +75 -0
  229. data/meta/int.rb +16 -0
  230. data/meta/ivar.rb +6 -0
  231. data/meta/ivasgn.rb +21 -0
  232. data/meta/kwarg.rb +8 -0
  233. data/meta/kwbegin.rb +7 -0
  234. data/meta/kwoptarg.rb +11 -0
  235. data/meta/kwrestarg.rb +17 -0
  236. data/meta/lvar.rb +14 -0
  237. data/meta/lvasgn.rb +8 -0
  238. data/meta/masgn.rb +5 -0
  239. data/meta/match_current_line.rb +13 -0
  240. data/meta/next.rb +9 -0
  241. data/meta/nil.rb +3 -0
  242. data/meta/nthref.rb +12 -0
  243. data/meta/op_assgn.rb +39 -0
  244. data/meta/or.rb +13 -0
  245. data/meta/or_asgn.rb +48 -0
  246. data/meta/range.rb +37 -0
  247. data/meta/redo.rb +3 -0
  248. data/meta/regexp.rb +84 -0
  249. data/meta/regexp/character_types.rb +20 -0
  250. data/meta/regexp/regexp_alternation_meta.rb +11 -0
  251. data/meta/regexp/regexp_bol_anchor.rb +8 -0
  252. data/meta/regexp/regexp_bos_anchor.rb +16 -0
  253. data/meta/regexp/regexp_capture_group.rb +17 -0
  254. data/meta/regexp/regexp_eol_anchor.rb +8 -0
  255. data/meta/regexp/regexp_eos_anchor.rb +6 -0
  256. data/meta/regexp/regexp_eos_ob_eol_anchor.rb +8 -0
  257. data/meta/regexp/regexp_one_or_more.rb +32 -0
  258. data/meta/regexp/regexp_root_expression.rb +8 -0
  259. data/meta/regexp/regexp_zero_or_more.rb +32 -0
  260. data/meta/regopt.rb +8 -0
  261. data/meta/rescue.rb +87 -0
  262. data/meta/restarg.rb +9 -0
  263. data/meta/return.rb +14 -0
  264. data/meta/self.rb +5 -0
  265. data/meta/send.rb +849 -0
  266. data/meta/str.rb +5 -0
  267. data/meta/super.rb +25 -0
  268. data/meta/sym.rb +6 -0
  269. data/meta/true.rb +6 -0
  270. data/meta/until.rb +15 -0
  271. data/meta/while.rb +24 -0
  272. data/meta/yield.rb +8 -0
  273. data/mutest-rspec.gemspec +22 -0
  274. data/mutest.gemspec +45 -0
  275. data/spec/integration/mutest/corpus_spec.rb +18 -0
  276. data/spec/integration/mutest/isolation/fork_spec.rb +8 -0
  277. data/spec/integration/mutest/null_spec.rb +13 -0
  278. data/spec/integration/mutest/rspec_spec.rb +11 -0
  279. data/spec/integration/mutest/test_mutator_handles_types_spec.rb +7 -0
  280. data/spec/integrations.yml +32 -0
  281. data/spec/rcov.opts +7 -0
  282. data/spec/shared/framework_integration_behavior.rb +44 -0
  283. data/spec/shared/method_matcher_behavior.rb +49 -0
  284. data/spec/spec_helper.rb +70 -0
  285. data/spec/support/compress_helper.rb +9 -0
  286. data/spec/support/corpus.rb +331 -0
  287. data/spec/support/fake_actor.rb +107 -0
  288. data/spec/support/file_system.rb +60 -0
  289. data/spec/support/ice_nine_config.rb +8 -0
  290. data/spec/support/rb_bug.rb +15 -0
  291. data/spec/support/ruby_vm.rb +82 -0
  292. data/spec/support/shared_context.rb +125 -0
  293. data/spec/support/test_app.rb +5 -0
  294. data/spec/support/warning.rb +73 -0
  295. data/spec/support/warnings.yml +5 -0
  296. data/spec/support/xspec.rb +175 -0
  297. data/spec/unit/mutest/actor/binding_spec.rb +32 -0
  298. data/spec/unit/mutest/actor/env_spec.rb +29 -0
  299. data/spec/unit/mutest/actor/mailbox_spec.rb +25 -0
  300. data/spec/unit/mutest/actor/message_spec.rb +22 -0
  301. data/spec/unit/mutest/actor/receiver_spec.rb +56 -0
  302. data/spec/unit/mutest/actor/sender_spec.rb +22 -0
  303. data/spec/unit/mutest/ast/meta/optarg_spec.rb +21 -0
  304. data/spec/unit/mutest/ast/meta/send/proc_predicate_spec.rb +28 -0
  305. data/spec/unit/mutest/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +37 -0
  306. data/spec/unit/mutest/ast/meta/send_spec.rb +42 -0
  307. data/spec/unit/mutest/ast/named_children_spec.rb +87 -0
  308. data/spec/unit/mutest/ast/regexp/parse_spec.rb +5 -0
  309. data/spec/unit/mutest/ast/regexp/supported_predicate_spec.rb +14 -0
  310. data/spec/unit/mutest/ast/regexp/transformer/lookup_table/table_spec.rb +19 -0
  311. data/spec/unit/mutest/ast/regexp/transformer/lookup_table_spec.rb +33 -0
  312. data/spec/unit/mutest/ast/regexp/transformer_spec.rb +19 -0
  313. data/spec/unit/mutest/ast/regexp_spec.rb +625 -0
  314. data/spec/unit/mutest/ast/sexp_spec.rb +36 -0
  315. data/spec/unit/mutest/ast_spec.rb +55 -0
  316. data/spec/unit/mutest/cli_spec.rb +247 -0
  317. data/spec/unit/mutest/context_spec.rb +141 -0
  318. data/spec/unit/mutest/diff_spec.rb +185 -0
  319. data/spec/unit/mutest/env/bootstrap_spec.rb +188 -0
  320. data/spec/unit/mutest/env_spec.rb +100 -0
  321. data/spec/unit/mutest/expression/method_spec.rb +44 -0
  322. data/spec/unit/mutest/expression/methods_spec.rb +59 -0
  323. data/spec/unit/mutest/expression/namespace/exact_spec.rb +26 -0
  324. data/spec/unit/mutest/expression/namespace/recursive_spec.rb +64 -0
  325. data/spec/unit/mutest/expression/parser_spec.rb +67 -0
  326. data/spec/unit/mutest/expression_spec.rb +45 -0
  327. data/spec/unit/mutest/integration/null_spec.rb +28 -0
  328. data/spec/unit/mutest/integration/rspec_spec.rb +197 -0
  329. data/spec/unit/mutest/integration_spec.rb +26 -0
  330. data/spec/unit/mutest/isolation/fork_spec.rb +155 -0
  331. data/spec/unit/mutest/isolation/none_spec.rb +16 -0
  332. data/spec/unit/mutest/loader_spec.rb +42 -0
  333. data/spec/unit/mutest/matcher/chain_spec.rb +24 -0
  334. data/spec/unit/mutest/matcher/compiler/subject_prefix_spec.rb +24 -0
  335. data/spec/unit/mutest/matcher/compiler_spec.rb +76 -0
  336. data/spec/unit/mutest/matcher/config_spec.rb +45 -0
  337. data/spec/unit/mutest/matcher/filter_spec.rb +20 -0
  338. data/spec/unit/mutest/matcher/method/instance_spec.rb +125 -0
  339. data/spec/unit/mutest/matcher/method/singleton_spec.rb +85 -0
  340. data/spec/unit/mutest/matcher/methods/instance_spec.rb +58 -0
  341. data/spec/unit/mutest/matcher/methods/singleton_spec.rb +54 -0
  342. data/spec/unit/mutest/matcher/namespace_spec.rb +35 -0
  343. data/spec/unit/mutest/matcher/null_spec.rb +10 -0
  344. data/spec/unit/mutest/matcher/scope_spec.rb +33 -0
  345. data/spec/unit/mutest/matcher/static_spec.rb +11 -0
  346. data/spec/unit/mutest/meta/example/dsl_spec.rb +123 -0
  347. data/spec/unit/mutest/meta/example/verification_spec.rb +120 -0
  348. data/spec/unit/mutest/meta/example_spec.rb +32 -0
  349. data/spec/unit/mutest/mutation_spec.rb +129 -0
  350. data/spec/unit/mutest/mutator/node_spec.rb +43 -0
  351. data/spec/unit/mutest/mutator_spec.rb +30 -0
  352. data/spec/unit/mutest/parallel/driver_spec.rb +26 -0
  353. data/spec/unit/mutest/parallel/master_spec.rb +335 -0
  354. data/spec/unit/mutest/parallel/source/array_spec.rb +47 -0
  355. data/spec/unit/mutest/parallel/worker_spec.rb +65 -0
  356. data/spec/unit/mutest/parallel_spec.rb +16 -0
  357. data/spec/unit/mutest/parser_spec.rb +24 -0
  358. data/spec/unit/mutest/registry_spec.rb +45 -0
  359. data/spec/unit/mutest/reporter/cli/printer/config_spec.rb +29 -0
  360. data/spec/unit/mutest/reporter/cli/printer/env_progress_spec.rb +74 -0
  361. data/spec/unit/mutest/reporter/cli/printer/env_result_spec.rb +35 -0
  362. data/spec/unit/mutest/reporter/cli/printer/mutation_progress_result_spec.rb +23 -0
  363. data/spec/unit/mutest/reporter/cli/printer/mutation_result_spec.rb +110 -0
  364. data/spec/unit/mutest/reporter/cli/printer/status_progressive_spec.rb +43 -0
  365. data/spec/unit/mutest/reporter/cli/printer/status_spec.rb +119 -0
  366. data/spec/unit/mutest/reporter/cli/printer/subject_progress_spec.rb +34 -0
  367. data/spec/unit/mutest/reporter/cli/printer/subject_result_spec.rb +37 -0
  368. data/spec/unit/mutest/reporter/cli/printer/test_result_spec.rb +14 -0
  369. data/spec/unit/mutest/reporter/cli/printer_spec.rb +161 -0
  370. data/spec/unit/mutest/reporter/cli/tput_spec.rb +48 -0
  371. data/spec/unit/mutest/reporter/cli_spec.rb +212 -0
  372. data/spec/unit/mutest/reporter/null_spec.rb +12 -0
  373. data/spec/unit/mutest/reporter/sequence_spec.rb +29 -0
  374. data/spec/unit/mutest/repository/diff_spec.rb +106 -0
  375. data/spec/unit/mutest/repository/subject_filter_spec.rb +28 -0
  376. data/spec/unit/mutest/require_highjack_spec.rb +71 -0
  377. data/spec/unit/mutest/result/class_methods_spec.rb +49 -0
  378. data/spec/unit/mutest/result/env_spec.rb +82 -0
  379. data/spec/unit/mutest/result/mutation_spec.rb +37 -0
  380. data/spec/unit/mutest/result/subject_spec.rb +109 -0
  381. data/spec/unit/mutest/result_spec.rb +31 -0
  382. data/spec/unit/mutest/runner/sink_spec.rb +172 -0
  383. data/spec/unit/mutest/runner_spec.rb +69 -0
  384. data/spec/unit/mutest/selector/expression_spec.rb +59 -0
  385. data/spec/unit/mutest/source_file_spec.rb +42 -0
  386. data/spec/unit/mutest/subject/method/instance/memoized_spec.rb +78 -0
  387. data/spec/unit/mutest/subject/method/instance_spec.rb +64 -0
  388. data/spec/unit/mutest/subject/method/singleton_spec.rb +51 -0
  389. data/spec/unit/mutest/subject_spec.rb +87 -0
  390. data/spec/unit/mutest/util/one_spec.rb +20 -0
  391. data/spec/unit/mutest/warning_filter_spec.rb +99 -0
  392. data/spec/unit/mutest/zombifier_spec.rb +120 -0
  393. data/spec/unit/mutest_spec.rb +15 -0
  394. data/test_app/.rspec +1 -0
  395. data/test_app/Gemfile.rspec3.4 +7 -0
  396. data/test_app/Gemfile.rspec3.5 +7 -0
  397. data/test_app/lib/test_app.rb +109 -0
  398. data/test_app/lib/test_app/literal.rb +40 -0
  399. data/test_app/spec/spec_helper.rb +9 -0
  400. data/test_app/spec/unit/test_app/literal_spec.rb +20 -0
  401. metadata +784 -9
@@ -0,0 +1,34 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ # Mutator for resbody nodes
5
+ class Resbody < self
6
+ handle(:resbody)
7
+
8
+ children :captures, :assignment, :body
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ def dispatch
16
+ emit_assignment(nil)
17
+ emit_body_mutations if body
18
+ mutate_captures
19
+ end
20
+
21
+ # Mutate captures
22
+ #
23
+ # @return [undefined]
24
+ def mutate_captures
25
+ return unless captures
26
+ mutate_with(Util::Array::Element, captures.children) do |matchers|
27
+ next if matchers.any?(&method(:n_nil?))
28
+ emit_captures(s(:array, *matchers))
29
+ end
30
+ end
31
+ end # Resbody
32
+ end # Node
33
+ end # Mutator
34
+ end # Mutest
@@ -0,0 +1,69 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ # Mutator for rescue nodes
5
+ class Rescue < self
6
+ handle :rescue
7
+
8
+ children :body
9
+
10
+ define_named_child(:else_body, -1)
11
+
12
+ RESCUE_INDICES = (1..-2).freeze
13
+
14
+ # Emit mutations
15
+ #
16
+ # @return [undefined]
17
+ def dispatch
18
+ mutate_body
19
+ mutate_rescue_bodies
20
+ mutate_else_body
21
+ end
22
+
23
+ private
24
+
25
+ # Mutate child by name
26
+ #
27
+ # @return [undefined]
28
+ def mutate_rescue_bodies
29
+ children_indices(RESCUE_INDICES).each do |index|
30
+ mutate_child(index)
31
+ resbody_body = AST::Meta::Resbody.new(children.fetch(index)).body
32
+ emit_concat(resbody_body) if resbody_body
33
+ end
34
+ end
35
+
36
+ # Emit concatenation with body
37
+ #
38
+ # @param [Parser::AST::Node] child
39
+ #
40
+ # @return [undefined]
41
+ def emit_concat(child)
42
+ if body
43
+ emit(s(:begin, body, child))
44
+ else
45
+ emit(child)
46
+ end
47
+ end
48
+
49
+ # Emit body mutations
50
+ #
51
+ # @return [undefined]
52
+ def mutate_body
53
+ return unless body
54
+ emit_body_mutations
55
+ emit(body)
56
+ end
57
+
58
+ # Emit else body mutations
59
+ #
60
+ # @return [undefined]
61
+ def mutate_else_body
62
+ return unless else_body
63
+ emit_else_body_mutations
64
+ emit_concat(else_body)
65
+ end
66
+ end # Rescue
67
+ end # Node
68
+ end # Mutator
69
+ end # Mutest
@@ -0,0 +1,24 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ # Mutator for return statements
5
+ class Return < self
6
+ handle(:return)
7
+
8
+ children :value
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ def dispatch
16
+ emit_singletons
17
+ return unless value
18
+ emit(value)
19
+ emit_value_mutations
20
+ end
21
+ end # Return
22
+ end # Node
23
+ end # Mutator
24
+ end # Mutest
@@ -0,0 +1,270 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ # Namespace for send mutators
5
+ # rubocop:disable ClassLength
6
+ class Send < self
7
+ include AST::Types
8
+
9
+ handle(:send)
10
+
11
+ children :receiver, :selector
12
+
13
+ SELECTOR_REPLACEMENTS = IceNine.deep_freeze(
14
+ __send__: %i[public_send],
15
+ :[] => %i[at fetch key?],
16
+ :< => %i[== <= eql? equal?],
17
+ :<= => %i[< == eql? equal?],
18
+ :== => %i[eql? equal?],
19
+ :=== => %i[kind_of?],
20
+ :> => %i[== >= eql? equal?],
21
+ :>= => %i[> == eql? equal?],
22
+ '=~': %i[match?],
23
+ at: %i[fetch key?],
24
+ eql?: %i[equal?],
25
+ fetch: %i[key?],
26
+ first: %i[last],
27
+ flat_map: %i[map],
28
+ grep_v: %i[grep],
29
+ grep: %i[grep_v],
30
+ gsub: %i[sub],
31
+ is_a?: %i[instance_of?],
32
+ kind_of?: %i[instance_of?],
33
+ last: %i[first],
34
+ map: %i[each],
35
+ match: %i[match?],
36
+ method: %i[public_method],
37
+ pop: %i[last],
38
+ reject: %i[select],
39
+ reverse_each: %i[each],
40
+ reverse_map: %i[map each],
41
+ reverse_merge: %i[merge],
42
+ sample: %i[first last],
43
+ select: %i[reject],
44
+ send: %i[public_send __send__],
45
+ shift: %i[first],
46
+ to_a: %i[to_ary to_set],
47
+ to_h: %i[to_hash],
48
+ to_i: %i[to_int],
49
+ to_s: %i[to_str],
50
+ values_at: %i[fetch_values]
51
+ )
52
+
53
+ RECEIVER_SELECTOR_REPLACEMENTS = IceNine.deep_freeze(
54
+ Date: {
55
+ parse: %i[jd civil strptime iso8601 rfc3339 xmlschema rfc2822 rfc822 httpdate jisx0301]
56
+ }
57
+ )
58
+
59
+ private
60
+
61
+ # Emit mutations
62
+ #
63
+ # @return [undefined]
64
+ def dispatch
65
+ emit_singletons
66
+ if meta.index_assignment?
67
+ run(Index::Assign)
68
+ else
69
+ non_index_dispatch
70
+ end
71
+ end
72
+
73
+ # Perform non index dispatch
74
+ #
75
+ # @return [undefined]
76
+ def non_index_dispatch
77
+ if meta.binary_method_operator?
78
+ run(Binary)
79
+ elsif meta.attribute_assignment?
80
+ run(AttributeAssignment)
81
+ else
82
+ normal_dispatch
83
+ end
84
+ end
85
+
86
+ # AST metadata for node
87
+ #
88
+ # @return [AST::Meta::Send]
89
+ def meta
90
+ AST::Meta::Send.new(node)
91
+ end
92
+ memoize :meta
93
+
94
+ # Arguments being send
95
+ #
96
+ # @return [Enumerable<Parser::AST::Node>]
97
+ alias_method :arguments, :remaining_children
98
+ private :arguments
99
+
100
+ # Perform normal, non special case dispatch
101
+ #
102
+ # @return [undefined]
103
+ def normal_dispatch
104
+ emit_naked_receiver
105
+ emit_selector_replacement
106
+ emit_selector_specific_mutations
107
+ emit_argument_propagation
108
+ emit_receiver_selector_mutations
109
+ mutate_receiver
110
+ mutate_arguments
111
+ end
112
+
113
+ # Emit mutations which only correspond to one selector
114
+ #
115
+ # @return [undefined]
116
+ def emit_selector_specific_mutations
117
+ emit_const_get_mutation
118
+ emit_integer_mutation
119
+ emit_array_mutation
120
+ emit_dig_mutation
121
+ emit_double_negation_mutation
122
+ emit_lambda_mutation
123
+ emit_drop_mutation
124
+ end
125
+
126
+ # Emit selector mutations specific to top level constants
127
+ #
128
+ # @return [undefined]
129
+ def emit_receiver_selector_mutations
130
+ return unless meta.receiver_possible_top_level_const?
131
+
132
+ RECEIVER_SELECTOR_REPLACEMENTS
133
+ .fetch(receiver.children.last, EMPTY_HASH)
134
+ .fetch(selector, EMPTY_ARRAY)
135
+ .each(&method(:emit_selector))
136
+ end
137
+
138
+ # Emit mutation from `!!foo` to `foo`
139
+ #
140
+ # @return [undefined]
141
+ def emit_double_negation_mutation
142
+ return unless selector.equal?(:!) && n_send?(receiver)
143
+
144
+ negated = AST::Meta::Send.new(meta.receiver)
145
+ emit(negated.receiver) if negated.selector.equal?(:!)
146
+ end
147
+
148
+ # Emit mutation from proc definition to lambda
149
+ #
150
+ # @return [undefined]
151
+ def emit_lambda_mutation
152
+ emit(s(:send, nil, :lambda)) if meta.proc?
153
+ end
154
+
155
+ # Emit mutation for `#dig`
156
+ #
157
+ # - Mutates `foo.dig(a, b)` to `foo.fetch(a).dig(b)`
158
+ # - Mutates `foo.dig(a)` to `foo.fetch(a)`
159
+ #
160
+ # @return [undefined]
161
+ def emit_dig_mutation
162
+ return if !selector.equal?(:dig) || arguments.none?
163
+
164
+ head, *tail = arguments
165
+
166
+ fetch_mutation = s(:send, receiver, :fetch, head)
167
+
168
+ return emit(fetch_mutation) if tail.empty?
169
+
170
+ emit(s(:send, fetch_mutation, :dig, *tail))
171
+ end
172
+
173
+ # Emit mutation `foo[n..-1]` -> `foo.drop(n)`
174
+ #
175
+ # @return [undefined]
176
+ def emit_drop_mutation
177
+ return if !selector.equal?(:[]) || !arguments.one? || !n_irange?(arguments.first)
178
+
179
+ start, ending = *arguments.first
180
+
181
+ return unless ending.eql?(s(:int, -1))
182
+
183
+ emit(s(:send, receiver, :drop, start))
184
+ end
185
+
186
+ # Emit mutation from `to_i` to `Integer(...)`
187
+ #
188
+ # @return [undefined]
189
+ def emit_integer_mutation
190
+ return unless selector.equal?(:to_i)
191
+
192
+ emit(s(:send, nil, :Integer, receiver))
193
+ end
194
+
195
+ # Emit mutation from `Array(a)` to `[a]`
196
+ #
197
+ # @return [undefined]
198
+ def emit_array_mutation
199
+ return unless selector.equal?(:Array) && receiver.nil?
200
+
201
+ emit(s(:array, *arguments))
202
+ end
203
+
204
+ # Emit mutation from `const_get` to const literal
205
+ #
206
+ # @return [undefined]
207
+ def emit_const_get_mutation
208
+ return unless selector.equal?(:const_get) && n_sym?(arguments.first)
209
+
210
+ emit(s(:const, receiver, AST::Meta::Symbol.new(arguments.first).name))
211
+ end
212
+
213
+ # Emit selector replacement
214
+ #
215
+ # @return [undefined]
216
+ def emit_selector_replacement
217
+ SELECTOR_REPLACEMENTS.fetch(selector, EMPTY_ARRAY).each(&method(:emit_selector))
218
+ end
219
+
220
+ # Emit naked receiver mutation
221
+ #
222
+ # @return [undefined]
223
+ def emit_naked_receiver
224
+ emit(receiver) if receiver
225
+ end
226
+
227
+ # Mutate arguments
228
+ #
229
+ # @return [undefined]
230
+ def mutate_arguments
231
+ emit_type(receiver, selector)
232
+ remaining_children_with_index.each do |_node, index|
233
+ mutate_child(index)
234
+ delete_child(index)
235
+ end
236
+ end
237
+
238
+ # Emit argument propagation
239
+ #
240
+ # @return [undefined]
241
+ def emit_argument_propagation
242
+ node = arguments.first
243
+ emit(node) if arguments.one? && !NOT_STANDALONE.include?(node.type)
244
+ end
245
+
246
+ # Emit receiver mutations
247
+ #
248
+ # @return [undefined]
249
+ def mutate_receiver
250
+ return unless receiver
251
+ emit_implicit_self
252
+ emit_receiver_mutations do |node|
253
+ !n_nil?(node)
254
+ end
255
+ end
256
+
257
+ # Emit implicit self mutation
258
+ #
259
+ # @return [undefined]
260
+ def emit_implicit_self
261
+ emit_receiver(nil) if n_self?(receiver) && !(
262
+ KEYWORDS.include?(selector) ||
263
+ METHOD_OPERATORS.include?(selector) ||
264
+ meta.attribute_assignment?
265
+ )
266
+ end
267
+ end # Send
268
+ end # Node
269
+ end # Mutator
270
+ end # Mutest
@@ -0,0 +1,39 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ class Send
5
+ # Mutator for attribute assignments
6
+ class AttributeAssignment < self
7
+ ATTRIBUTE_RANGE = (0..-2).freeze
8
+ private_constant(*constants(false))
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ def dispatch
16
+ normal_dispatch
17
+ emit_attribute_read
18
+ end
19
+
20
+ # Mutate arguments
21
+ #
22
+ # @return [undefined]
23
+ def mutate_arguments
24
+ remaining_children_indices.each do |index|
25
+ mutate_child(index)
26
+ end
27
+ end
28
+
29
+ # Emit attribute read
30
+ #
31
+ # @return [undefined]
32
+ def emit_attribute_read
33
+ emit_type(receiver, selector[ATTRIBUTE_RANGE].to_sym)
34
+ end
35
+ end # AttributeAssignment
36
+ end # Send
37
+ end # Node
38
+ end # Mutator
39
+ end # Mutest
@@ -0,0 +1,45 @@
1
+ module Mutest
2
+ class Mutator
3
+ class Node
4
+ class Send
5
+ # Mutator for sends that correspond to a binary operator
6
+ class Binary < self
7
+ children :left, :operator, :right
8
+
9
+ private
10
+
11
+ # Emit mutations
12
+ #
13
+ # @return [undefined]
14
+ def dispatch
15
+ emit(left)
16
+ emit_left_mutations
17
+ emit_selector_replacement
18
+ emit(right)
19
+ emit_right_mutations
20
+ emit_not_equality_mutations
21
+ end
22
+
23
+ # Emit mutations for `!=`
24
+ #
25
+ # @return [undefined]
26
+ def emit_not_equality_mutations
27
+ return unless operator.equal?(:'!=')
28
+
29
+ emit_not_equality_mutation(:eql?)
30
+ emit_not_equality_mutation(:equal?)
31
+ end
32
+
33
+ # Emit negated method sends with specified operator
34
+ #
35
+ # @param new_operator [Symbol] selector to be negated
36
+ #
37
+ # @return [undefined]
38
+ def emit_not_equality_mutation(new_operator)
39
+ emit(n_not(s(:send, left, new_operator, right)))
40
+ end
41
+ end # Binary
42
+ end # Send
43
+ end # Node
44
+ end # Mutator
45
+ end # Mutest