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,14 @@
1
+ module Mutest
2
+ # Abstract base class for test that might kill a mutation
3
+ class Test
4
+ include Adamantium::Flat, Anima.new(
5
+ :expression,
6
+ :id
7
+ )
8
+
9
+ # Identification string
10
+ #
11
+ # @return [String]
12
+ alias_method :identification, :id
13
+ end # Test
14
+ end # Mutest
@@ -0,0 +1,18 @@
1
+ module Mutest
2
+ # Utility methods
3
+ module Util
4
+ # Error raised by `Util.one` if size is less than zero or greater than one
5
+ SizeError = Class.new(IndexError)
6
+
7
+ # Return only element in array if it contains exactly one member
8
+ #
9
+ # @param array [Array]
10
+ #
11
+ # @return [Object] first entry
12
+ def self.one(array)
13
+ return array.first if array.one?
14
+
15
+ fail SizeError, "expected size to be exactly 1 but size was #{array.size}"
16
+ end
17
+ end # Util
18
+ end # Mutest
@@ -0,0 +1,4 @@
1
+ module Mutest
2
+ # Current mutest version
3
+ VERSION = '0.0.2'.freeze
4
+ end # Mutest
@@ -0,0 +1,58 @@
1
+ module Mutest
2
+ # Stream filter for warnings
3
+ class WarningFilter
4
+ include Equalizer.new(:target)
5
+
6
+ WARNING_PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/
7
+
8
+ # Initialize object
9
+ #
10
+ # @param [#write] target
11
+ #
12
+ # @return [undefined]
13
+ def initialize(target)
14
+ @target = target
15
+ @warnings = []
16
+ end
17
+
18
+ # Warnings captured by filter
19
+ #
20
+ # @return [Array<String>]
21
+ attr_reader :warnings
22
+
23
+ # Target stream to capture warnings on
24
+ #
25
+ # @return [#write] target
26
+ #
27
+ # @return [undefined]
28
+ attr_reader :target
29
+ protected :target
30
+
31
+ # Write message to target filtering warnings
32
+ #
33
+ # @param [String] message
34
+ #
35
+ # @return [self]
36
+ def write(message)
37
+ if WARNING_PATTERN =~ message
38
+ warnings << message
39
+ else
40
+ target.write(message)
41
+ end
42
+
43
+ self
44
+ end
45
+
46
+ # Use warning filter during block execution
47
+ #
48
+ # @return [Array<String>]
49
+ def self.use
50
+ original = $stderr
51
+ $stderr = filter = new(original)
52
+ yield
53
+ filter.warnings
54
+ ensure
55
+ $stderr = original
56
+ end
57
+ end # WarningFilter
58
+ end # Mutest
@@ -0,0 +1,119 @@
1
+ module Mutest
2
+ # Zombifier namespace
3
+ class Zombifier
4
+ include Anima.new(
5
+ :includes,
6
+ :load_path,
7
+ :kernel,
8
+ :namespace,
9
+ :pathname,
10
+ :require_highjack,
11
+ :root_require
12
+ )
13
+
14
+ private(*anima.attribute_names)
15
+
16
+ include AST::Sexp
17
+
18
+ LoadError = Class.new(::LoadError)
19
+
20
+ # Initialize object
21
+ #
22
+ # @param [Symbol] namespace
23
+ #
24
+ # @return [undefined]
25
+ def initialize(*)
26
+ super
27
+ @includes = %r{\A#{Regexp.union(includes)}(?:/.*)?\z}
28
+ @zombified = Set.new
29
+ end
30
+
31
+ # Call zombifier
32
+ #
33
+ # @return [self]
34
+ def self.call(*args)
35
+ new(*args).__send__(:call)
36
+ self
37
+ end
38
+
39
+ private
40
+
41
+ # Original require method
42
+ #
43
+ # @return [Method]
44
+ attr_reader :original
45
+
46
+ # Run zombifier
47
+ #
48
+ # @return [undefined]
49
+ def call
50
+ @original = require_highjack.call(method(:require))
51
+ require(root_require)
52
+ end
53
+
54
+ # Test if logical name is subjected to zombification
55
+ #
56
+ # @param [String]
57
+ def include?(logical_name)
58
+ !@zombified.include?(logical_name) && includes =~ logical_name
59
+ end
60
+
61
+ # Require file in zombie namespace
62
+ #
63
+ # @param [#to_s] logical_name
64
+ #
65
+ # @return [Bool]
66
+ # true if successful and false if feature already loaded
67
+ def require(logical_name)
68
+ logical_name = logical_name.to_s
69
+ loaded = original.call(logical_name)
70
+ return loaded unless include?(logical_name)
71
+ @zombified << logical_name
72
+ zombify(find(logical_name))
73
+ true
74
+ end
75
+
76
+ # Find file by logical path
77
+ #
78
+ # @param [String] logical_name
79
+ #
80
+ # @return [File]
81
+ #
82
+ # @raise [LoadError]
83
+ # otherwise
84
+ def find(logical_name)
85
+ file_name = "#{logical_name}.rb"
86
+
87
+ load_path.each do |path|
88
+ path = pathname.new(path).join(file_name)
89
+ return path if path.file?
90
+ end
91
+
92
+ fail LoadError, "Cannot find file #{file_name.inspect} in load path"
93
+ end
94
+
95
+ # Zombify contents of file
96
+ #
97
+ # Probably the 2nd valid use of eval ever. (First one is inserting mutests!).
98
+ #
99
+ # @param [Pathname] source_path
100
+ #
101
+ # @return [undefined]
102
+ def zombify(source_path)
103
+ kernel.eval(
104
+ Unparser.unparse(namespaced_node(source_path)),
105
+ TOPLEVEL_BINDING,
106
+ source_path.to_s
107
+ )
108
+ end
109
+
110
+ # Namespaced root node
111
+ #
112
+ # @param [Pathname] source_path
113
+ #
114
+ # @return [Parser::AST::Node]
115
+ def namespaced_node(source_path)
116
+ s(:module, s(:const, nil, namespace), ::Parser::CurrentRuby.parse(source_path.read))
117
+ end
118
+ end # Zombifier
119
+ end # Mutest
data/meta/and.rb ADDED
@@ -0,0 +1,13 @@
1
+ Mutest::Meta::Example.add :and do
2
+ source 'true and false'
3
+
4
+ singleton_mutations
5
+ mutation 'true'
6
+ mutation 'false'
7
+ mutation 'true or false'
8
+ mutation 'true and nil'
9
+ mutation 'nil and false'
10
+ mutation 'false and false'
11
+ mutation 'true and true'
12
+ mutation '!true and false'
13
+ end
data/meta/and_asgn.rb ADDED
@@ -0,0 +1,12 @@
1
+ Mutest::Meta::Example.add :and_asgn do
2
+ source 'a &&= 1'
3
+
4
+ singleton_mutations
5
+
6
+ mutation 'a__mutest__ &&= 1'
7
+ mutation 'a &&= nil'
8
+ mutation 'a &&= 0'
9
+ mutation 'a &&= -1'
10
+ mutation 'a &&= 2'
11
+ mutation 'a &&= self'
12
+ end
data/meta/array.rb ADDED
@@ -0,0 +1,28 @@
1
+ Mutest::Meta::Example.add :array do
2
+ source '[true]'
3
+
4
+ singleton_mutations
5
+ mutation 'true'
6
+ mutation '[false]'
7
+ mutation '[nil]'
8
+ mutation '[]'
9
+ end
10
+
11
+ Mutest::Meta::Example.add :array do
12
+ source '[true, false]'
13
+
14
+ singleton_mutations
15
+
16
+ # Mutation of each element in array
17
+ mutation '[nil, false]'
18
+ mutation '[false, false]'
19
+ mutation '[true, nil]'
20
+ mutation '[true, true]'
21
+
22
+ # Remove each element of array once
23
+ mutation '[true]'
24
+ mutation '[false]'
25
+
26
+ # Empty array
27
+ mutation '[]'
28
+ end
data/meta/begin.rb ADDED
@@ -0,0 +1,19 @@
1
+ Mutest::Meta::Example.add :begin do
2
+ source 'true; false'
3
+ # Mutation of each statement in block
4
+ mutation 'true; true'
5
+ mutation 'false; false'
6
+ mutation 'nil; false'
7
+ mutation 'true; nil'
8
+
9
+ # Delete each statement
10
+ mutation 'true'
11
+ mutation 'false'
12
+ end
13
+
14
+ Mutest::Meta::Example.add :begin do
15
+ source s(:begin, s(:true))
16
+ # Mutation of each statement in block
17
+ mutation s(:begin, s(:nil))
18
+ mutation s(:begin, s(:false))
19
+ end
data/meta/block.rb ADDED
@@ -0,0 +1,104 @@
1
+ Mutest::Meta::Example.add :block do
2
+ source 'foo { a; b }'
3
+
4
+ singleton_mutations
5
+ mutation 'foo { a }'
6
+ mutation 'foo { b }'
7
+ mutation 'foo {}'
8
+ mutation 'foo { raise }'
9
+ mutation 'foo { a; nil }'
10
+ mutation 'foo { a; self }'
11
+ mutation 'foo { nil; b }'
12
+ mutation 'foo { self; b }'
13
+ mutation 'foo'
14
+ mutation 'a; b'
15
+ end
16
+
17
+ Mutest::Meta::Example.add :block do
18
+ source 'foo { |a, b| }'
19
+
20
+ singleton_mutations
21
+ mutation 'foo'
22
+ mutation 'foo { |a, **b| }'
23
+ mutation 'foo { |a, b| raise }'
24
+ mutation 'foo { |a, _b| }'
25
+ mutation 'foo { |_a, b| }'
26
+ mutation 'foo { |a| }'
27
+ mutation 'foo { |b| }'
28
+ mutation 'foo { || }'
29
+ end
30
+
31
+ Mutest::Meta::Example.add :block do
32
+ source 'foo { |(a, b), c| }'
33
+
34
+ singleton_mutations
35
+ mutation 'foo { || }'
36
+ mutation 'foo { |(a, b), **c| }'
37
+ mutation 'foo { |a, b, c| }'
38
+ mutation 'foo { |(a, b), c| raise }'
39
+ mutation 'foo { |(a), c| }'
40
+ mutation 'foo { |(b), c| }'
41
+ mutation 'foo { |(a, b)| }'
42
+ mutation 'foo { |c| }'
43
+ mutation 'foo { |(_a, b), c| }'
44
+ mutation 'foo { |(a, _b), c| }'
45
+ mutation 'foo { |(a, b), _c| }'
46
+ mutation 'foo'
47
+ end
48
+
49
+ Mutest::Meta::Example.add :block do
50
+ source 'foo(a, b) {}'
51
+
52
+ singleton_mutations
53
+ mutation 'foo(a, nil) {}'
54
+ mutation 'foo(nil, b) {}'
55
+ mutation 'foo(self, b) {}'
56
+ mutation 'foo(a, self) {}'
57
+ mutation 'foo(a, b)'
58
+ mutation 'foo(a, b) { raise }'
59
+ mutation 'foo(a) {}'
60
+ mutation 'foo(b) {}'
61
+ mutation 'foo {}'
62
+ end
63
+
64
+ Mutest::Meta::Example.add :block do
65
+ source 'foo { |(a)| }'
66
+
67
+ singleton_mutations
68
+ mutation 'foo { || }'
69
+ mutation 'foo { |a| }'
70
+ mutation 'foo { |(a)| raise }'
71
+ mutation 'foo { |(_a)| }'
72
+ mutation 'foo'
73
+ end
74
+
75
+ Mutest::Meta::Example.add :block do
76
+ source 'foo { bar(nil) }'
77
+
78
+ singleton_mutations
79
+ mutation 'foo'
80
+ mutation 'foo { bar }'
81
+ mutation 'foo { nil }'
82
+ mutation 'foo {}'
83
+ mutation 'foo { self }'
84
+ mutation 'foo { raise }'
85
+ mutation 'foo.bar(nil)'
86
+ mutation 'bar(nil)'
87
+ end
88
+
89
+ Mutest::Meta::Example.add :block do
90
+ source 'foo { self << true }'
91
+
92
+ singleton_mutations
93
+ mutation 'foo { self << false }'
94
+ mutation 'foo { self << nil }'
95
+ mutation 'foo { nil << true }'
96
+ mutation 'foo { nil }'
97
+ mutation 'foo { self }'
98
+ mutation 'foo { true }'
99
+ mutation 'self << true'
100
+ mutation 'foo << true'
101
+ mutation 'foo { raise }'
102
+ mutation 'foo { }'
103
+ mutation 'foo'
104
+ end
@@ -0,0 +1,6 @@
1
+ Mutest::Meta::Example.add :block_pass do
2
+ source 'foo(&bar)'
3
+
4
+ singleton_mutations
5
+ mutation 'foo'
6
+ end
data/meta/blockarg.rb ADDED
@@ -0,0 +1,8 @@
1
+ Mutest::Meta::Example.add :blockarg do
2
+ source 'foo { |&bar| }'
3
+
4
+ singleton_mutations
5
+ mutation 'foo { |&bar| raise }'
6
+ mutation 'foo {}'
7
+ mutation 'foo'
8
+ end
data/meta/break.rb ADDED
@@ -0,0 +1,8 @@
1
+ Mutest::Meta::Example.add :break do
2
+ source 'break true'
3
+
4
+ singleton_mutations
5
+ mutation 'break false'
6
+ mutation 'break nil'
7
+ mutation 'break'
8
+ end
data/meta/case.rb ADDED
@@ -0,0 +1,221 @@
1
+ Mutest::Meta::Example.add :case do
2
+ source <<-RUBY
3
+ case
4
+ when true
5
+ else
6
+ end
7
+ RUBY
8
+
9
+ singleton_mutations
10
+
11
+ mutation <<-RUBY
12
+ case
13
+ when true
14
+ raise
15
+ else
16
+ end
17
+ RUBY
18
+ mutation <<-RUBY
19
+ case
20
+ when false
21
+ else
22
+ end
23
+ RUBY
24
+ mutation <<-RUBY
25
+ case
26
+ when nil
27
+ else
28
+ end
29
+ RUBY
30
+ end
31
+
32
+ # rubocop:disable Metrics/BlockLength
33
+ Mutest::Meta::Example.add :case do
34
+ source <<-RUBY
35
+ case condition
36
+ when A
37
+ when B, C
38
+ C
39
+ else
40
+ D
41
+ end
42
+ RUBY
43
+
44
+ singleton_mutations
45
+
46
+ mutation <<-RUBY
47
+ case nil
48
+ when A
49
+ when B, C
50
+ C
51
+ else
52
+ D
53
+ end
54
+ RUBY
55
+
56
+ mutation <<-RUBY
57
+ case self
58
+ when A
59
+ when B, C
60
+ C
61
+ else
62
+ D
63
+ end
64
+ RUBY
65
+
66
+ mutation <<-RUBY
67
+ case condition
68
+ when A
69
+ raise
70
+ when B, C
71
+ C
72
+ else
73
+ D
74
+ end
75
+ RUBY
76
+
77
+ mutation <<-RUBY
78
+ case condition
79
+ when nil
80
+ when B, C
81
+ C
82
+ else
83
+ D
84
+ end
85
+ RUBY
86
+
87
+ mutation <<-RUBY
88
+ case condition
89
+ when self
90
+ when B, C
91
+ C
92
+ else
93
+ D
94
+ end
95
+ RUBY
96
+
97
+ mutation <<-RUBY
98
+ case condition
99
+ when B, C
100
+ C
101
+ else
102
+ D
103
+ end
104
+ RUBY
105
+
106
+ mutation <<-RUBY
107
+ case condition
108
+ when A
109
+ when B, C
110
+ nil
111
+ else
112
+ D
113
+ end
114
+ RUBY
115
+
116
+ mutation <<-RUBY
117
+ case condition
118
+ when A
119
+ when B, C
120
+ self
121
+ else
122
+ D
123
+ end
124
+ RUBY
125
+
126
+ mutation <<-RUBY
127
+ case condition
128
+ when A
129
+ when C
130
+ C
131
+ else
132
+ D
133
+ end
134
+ RUBY
135
+
136
+ mutation <<-RUBY
137
+ case condition
138
+ when A
139
+ when nil, C
140
+ C
141
+ else
142
+ D
143
+ end
144
+ RUBY
145
+
146
+ mutation <<-RUBY
147
+ case condition
148
+ when A
149
+ when self, C
150
+ C
151
+ else
152
+ D
153
+ end
154
+ RUBY
155
+
156
+ mutation <<-RUBY
157
+ case condition
158
+ when A
159
+ when B
160
+ C
161
+ else
162
+ D
163
+ end
164
+ RUBY
165
+
166
+ mutation <<-RUBY
167
+ case condition
168
+ when A
169
+ when B, nil
170
+ C
171
+ else
172
+ D
173
+ end
174
+ RUBY
175
+
176
+ mutation <<-RUBY
177
+ case condition
178
+ when A
179
+ when B, self
180
+ C
181
+ else
182
+ D
183
+ end
184
+ RUBY
185
+
186
+ mutation <<-RUBY
187
+ case condition
188
+ when A
189
+ else
190
+ D
191
+ end
192
+ RUBY
193
+
194
+ mutation <<-RUBY
195
+ case condition
196
+ when A
197
+ when B, C
198
+ C
199
+ else
200
+ nil
201
+ end
202
+ RUBY
203
+
204
+ mutation <<-RUBY
205
+ case condition
206
+ when A
207
+ when B, C
208
+ C
209
+ else
210
+ self
211
+ end
212
+ RUBY
213
+
214
+ mutation <<-RUBY
215
+ case condition
216
+ when A
217
+ when B, C
218
+ C
219
+ end
220
+ RUBY
221
+ end