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,7 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ end # Meta
6
+ end # AST
7
+ end # Mutest
@@ -0,0 +1,22 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for const nodes
6
+ class Const
7
+ include NamedChildren, Concord.new(:node), NodePredicates
8
+
9
+ children :base, :name
10
+
11
+ public :base, :name
12
+
13
+ # Test if AST node is possibly a top level constant
14
+ #
15
+ # @return [Boolean]
16
+ def possible_top_level?
17
+ base.nil? || n_cbase?(base)
18
+ end
19
+ end # Const
20
+ end # Meta
21
+ end # AST
22
+ end # Mutest
@@ -0,0 +1,24 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for optional argument nodes
6
+ class Optarg
7
+ include NamedChildren, Concord.new(:node)
8
+
9
+ UNDERSCORE = '_'.freeze
10
+
11
+ children :name, :default_value
12
+
13
+ public :name, :default_value
14
+
15
+ # Test if optarg definition intends to be used
16
+ #
17
+ # @return [Boolean]
18
+ def used?
19
+ !name.to_s.start_with?(UNDERSCORE)
20
+ end
21
+ end # Optarg
22
+ end # Meta
23
+ end # AST
24
+ end # Mutest
@@ -0,0 +1,15 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for resbody nodes
6
+ class Resbody
7
+ include NamedChildren, Concord.new(:node)
8
+
9
+ children :captures, :assignment, :body
10
+
11
+ public :captures, :assignment, :body
12
+ end # Resbody
13
+ end # Meta
14
+ end # AST
15
+ end # Mutest
@@ -0,0 +1,15 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for restarg nodes
6
+ class Restarg
7
+ include NamedChildren, Concord.new(:node)
8
+
9
+ children :name
10
+
11
+ public :name
12
+ end # Restarg
13
+ end # Meta
14
+ end # AST
15
+ end # Mutest
@@ -0,0 +1,89 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for send nodes
6
+ class Send
7
+ include NamedChildren, Concord.new(:node), NodePredicates
8
+
9
+ children :receiver, :selector
10
+
11
+ public :receiver, :selector
12
+
13
+ INDEX_ASSIGNMENT_SELECTOR = :[]=
14
+ ATTRIBUTE_ASSIGNMENT_SELECTOR_SUFFIX = '='.freeze
15
+
16
+ # Arguments of mutated node
17
+ #
18
+ # @return [Enumerable<Parser::AST::Node>]
19
+ alias_method :arguments, :remaining_children
20
+
21
+ public :arguments
22
+
23
+ # Test if node is defining a proc
24
+ #
25
+ # @return [Boolean]
26
+ def proc?
27
+ naked_proc? || proc_new?
28
+ end
29
+
30
+ # Test if AST node is a valid assignment target
31
+ #
32
+ # @return [Boolean]
33
+ def assignment?
34
+ index_assignment? || attribute_assignment?
35
+ end
36
+
37
+ # Test if AST node is an attribute assignment?
38
+ #
39
+ # @return [Boolean]
40
+ def attribute_assignment?
41
+ !Types::METHOD_OPERATORS.include?(selector) &&
42
+ selector.to_s.end_with?(ATTRIBUTE_ASSIGNMENT_SELECTOR_SUFFIX)
43
+ end
44
+
45
+ # Test if AST node is an index assign
46
+ #
47
+ # @return [Boolean]
48
+ def index_assignment?
49
+ selector.equal?(INDEX_ASSIGNMENT_SELECTOR)
50
+ end
51
+
52
+ # Test for binary operator implemented as method
53
+ #
54
+ # @return [Boolean]
55
+ def binary_method_operator?
56
+ Types::BINARY_METHOD_OPERATORS.include?(selector)
57
+ end
58
+
59
+ # Test if receiver is possibly a top level constant
60
+ #
61
+ # @return [Boolean]
62
+ def receiver_possible_top_level_const?
63
+ return false unless receiver && n_const?(receiver)
64
+
65
+ Const.new(receiver).possible_top_level?
66
+ end
67
+
68
+ private
69
+
70
+ # Test if node is `proc { ... }`
71
+ #
72
+ # @return [Boolean]
73
+ def naked_proc?
74
+ !receiver && selector.equal?(:proc)
75
+ end
76
+
77
+ # Test if node is `Proc.new { ... }`
78
+ #
79
+ # @return [Boolean]
80
+ def proc_new?
81
+ receiver &&
82
+ selector.equal?(:new) &&
83
+ n_const?(receiver) &&
84
+ Const.new(receiver).name.equal?(:Proc)
85
+ end
86
+ end # Send
87
+ end # Meta
88
+ end # AST
89
+ end # Mutest
@@ -0,0 +1,15 @@
1
+ module Mutest
2
+ module AST
3
+ # Node meta information mixin
4
+ module Meta
5
+ # Metadata for symbol nodes
6
+ class Symbol
7
+ include NamedChildren, Concord.new(:node)
8
+
9
+ children :name
10
+
11
+ public :name
12
+ end # Symbol
13
+ end # Meta
14
+ end # AST
15
+ end # Mutest
@@ -0,0 +1,86 @@
1
+ module Mutest
2
+ module AST
3
+ # Helper methods to define named children
4
+ module NamedChildren
5
+ # Hook called when module gets included
6
+ #
7
+ # @param [Class, Module] host
8
+ #
9
+ # @return [undefined]
10
+ def self.included(host)
11
+ host.class_eval do
12
+ include InstanceMethods
13
+ extend ClassMethods
14
+ end
15
+ end
16
+
17
+ # Methods mixed int ot instance level
18
+ module InstanceMethods
19
+ private
20
+
21
+ # Mutated nodes children
22
+ #
23
+ # @return [Array<Parser::AST::Node]
24
+ def children
25
+ node.children
26
+ end
27
+ end # InstanceMethods
28
+
29
+ # Methods mixed in at class level
30
+ module ClassMethods
31
+ private
32
+
33
+ # Define named child
34
+ #
35
+ # @param [Symbol] name
36
+ # @param [Fixnum] index
37
+ #
38
+ # @return [undefined]
39
+ def define_named_child(name, index)
40
+ define_private_method(name) do
41
+ children.at(index)
42
+ end
43
+ end
44
+
45
+ # Define remaining children
46
+ #
47
+ # @param [Array<Symbol>] names
48
+ #
49
+ # @return [undefined]
50
+ def define_remaining_children(names)
51
+ define_private_method(:remaining_children_with_index) do
52
+ children.each_with_index.drop(names.length)
53
+ end
54
+
55
+ define_private_method(:remaining_children_indices) do
56
+ children.each_index.drop(names.length)
57
+ end
58
+
59
+ define_private_method(:remaining_children) do
60
+ children.drop(names.length)
61
+ end
62
+ end
63
+
64
+ # Create name helpers
65
+ #
66
+ # @return [undefined]
67
+ def children(*names)
68
+ names.each_with_index do |name, index|
69
+ define_named_child(name, index)
70
+ end
71
+ define_remaining_children(names)
72
+ end
73
+
74
+ # Define private method
75
+ #
76
+ # @param [Symbol] name
77
+ #
78
+ # @return [undefined]
79
+ def define_private_method(name, &block)
80
+ define_method(name, &block)
81
+ private(name)
82
+ end
83
+ end # ClassMethods
84
+ end # NamedChildren
85
+ end # AST
86
+ end # Mutest
@@ -0,0 +1,17 @@
1
+ module Mutest
2
+ module AST
3
+ # Module for node predicates
4
+ module NodePredicates
5
+ Types::ALL.each do |type|
6
+ fail "method: #{type} is already defined" if instance_methods(true).include?(type)
7
+
8
+ name = "n_#{type.to_s.chomp('?')}?"
9
+
10
+ define_method(name) do |node|
11
+ node.type.equal?(type)
12
+ end
13
+ private name
14
+ end
15
+ end # NodePredicates
16
+ end # AST
17
+ end # Mutest
@@ -0,0 +1,22 @@
1
+ module Mutest
2
+ module AST
3
+ # Singleton nodes
4
+ #
5
+ # :reek:TooManyConstants
6
+ module Nodes
7
+ extend Sexp
8
+
9
+ N_NAN = s(:send, s(:float, 0.0), :/, s(:float, 0.0))
10
+ N_INFINITY = s(:send, s(:float, 1.0), :/, s(:float, 0.0))
11
+ N_NEGATIVE_INFINITY = s(:send, s(:float, -1.0), :/, s(:float, 0.0))
12
+ N_RAISE = s(:send, nil, :raise)
13
+ N_TRUE = s(:true)
14
+ N_FALSE = s(:false)
15
+ N_NIL = s(:nil)
16
+ N_EMPTY = s(:empty)
17
+ N_SELF = s(:self)
18
+ N_ZSUPER = s(:zsuper)
19
+ N_EMPTY_SUPER = s(:super)
20
+ end # Nodes
21
+ end # AST
22
+ end # Mutest
@@ -0,0 +1,50 @@
1
+ module Mutest
2
+ module AST
3
+ # Regexp source mapper
4
+ module Regexp
5
+ UNSUPPORTED_EXPRESSION_TYPE = :conditional
6
+
7
+ private_constant(*constants(false))
8
+
9
+ # Parse regex string into expression
10
+ #
11
+ # @param regexp [String]
12
+ #
13
+ # @return [Regexp::Expression]
14
+ def self.parse(regexp)
15
+ ::Regexp::Parser.parse(regexp)
16
+ end
17
+
18
+ # Check if expression is supported by mapper
19
+ #
20
+ # @param expression [Regexp::Expression]
21
+ #
22
+ # @return [Boolean]
23
+ def self.supported?(expression)
24
+ expression.terminal? || expression.all? do |subexp|
25
+ !subexp.type.equal?(UNSUPPORTED_EXPRESSION_TYPE) && supported?(subexp)
26
+ end
27
+ end
28
+
29
+ # Convert expression into ast node
30
+ #
31
+ # @param expression [Regexp::Expression]
32
+ #
33
+ # @return [Parser::AST::Node]
34
+ def self.to_ast(expression)
35
+ ast_type = :"regexp_#{expression.token}_#{expression.type}"
36
+
37
+ Transformer.lookup(ast_type).to_ast(expression)
38
+ end
39
+
40
+ # Convert node into expression
41
+ #
42
+ # @param node [Parser::AST::Node]
43
+ #
44
+ # @return [Regexp::Expression]
45
+ def self.to_expression(node)
46
+ Transformer.lookup(node.type).to_expression(node)
47
+ end
48
+ end # Regexp
49
+ end # AST
50
+ end # Mutest
@@ -0,0 +1,184 @@
1
+ module Mutest
2
+ module AST
3
+ module Regexp
4
+ # Regexp bijective mapper
5
+ #
6
+ # Transforms parsed regular expression representation from
7
+ # `Regexp::Expression` instances (provided by `regexp_parser`) into
8
+ # equivalent representations using `Parser::AST::Node`
9
+ class Transformer
10
+ include AbstractType
11
+
12
+ REGISTRY = Registry.new
13
+
14
+ # Lookup transformer class for regular expression node type
15
+ #
16
+ # @param type [Symbol]
17
+ #
18
+ # @return [Class<Transformer>]
19
+ def self.lookup(type)
20
+ REGISTRY.lookup(type)
21
+ end
22
+
23
+ # Register transformer class as responsible for handling node type
24
+ #
25
+ # @param type [Symbol]
26
+ #
27
+ # @return [undefined]
28
+ def self.register(type)
29
+ REGISTRY.register(type, self)
30
+ end
31
+ private_class_method :register
32
+
33
+ # Transform expression
34
+ #
35
+ # @param expression [Regexp::Expression]
36
+ #
37
+ # @return [Parser::AST::Node]
38
+ def self.to_ast(expression)
39
+ self::ExpressionToAST.call(expression)
40
+ end
41
+
42
+ # Transform node
43
+ #
44
+ # @param node [Parser::AST::Node]
45
+ #
46
+ # @return [Regexp::Expression]
47
+ def self.to_expression(node)
48
+ self::ASTToExpression.call(node)
49
+ end
50
+
51
+ # Abstract expression transformer
52
+ class ExpressionToAST
53
+ PREFIX = :regexp
54
+
55
+ include Concord.new(:expression), Procto.call, AST::Sexp, AbstractType, Adamantium
56
+
57
+ private
58
+
59
+ # Node with provided children using node type constructed in `type`
60
+ #
61
+ # @param [Object,Parser::AST::Node] child of node
62
+ #
63
+ # @return [Parser::AST::Node]
64
+ def ast(*children)
65
+ s(type, *children)
66
+ end
67
+
68
+ # Wrap provided node in a quantifier
69
+ #
70
+ # @param node [Parser::AST::Node]
71
+ #
72
+ # @return [Parser::AST::Node]
73
+ # quantifier node wrapping provided node if expression is quantified
74
+ #
75
+ # @return [Parser::AST::Node]
76
+ # original node otherwise
77
+ def quantify(node)
78
+ return node unless expression.quantified?
79
+
80
+ Quantifier.to_ast(expression.quantifier).append(node)
81
+ end
82
+
83
+ # Transformed children of expression
84
+ #
85
+ # @return [Array<Parser::AST::Node>]
86
+ def children
87
+ expression.expressions.map(&Regexp.method(:to_ast))
88
+ end
89
+
90
+ # Node type constructed from token and type of `Regexp::Expression`
91
+ #
92
+ # @return [Symbol]
93
+ def type
94
+ :"#{PREFIX}_#{expression.token}_#{expression.type}"
95
+ end
96
+ end # ExpressionToAST
97
+
98
+ # Abstract node transformer
99
+ class ASTToExpression
100
+ include Concord.new(:node), Procto.call, AbstractType, Adamantium
101
+
102
+ # Call generic transform method and freeze result
103
+ #
104
+ # @return [Regexp::Expression]
105
+ def call
106
+ transform.freeze
107
+ end
108
+
109
+ private
110
+
111
+ # Transformation of ast into expression
112
+ #
113
+ # @return [Regexp::Expression]
114
+ abstract_method :transform
115
+
116
+ # Transformed children of node
117
+ #
118
+ # @return [Array<Regexp::Expression>]
119
+ def subexpressions
120
+ node.children.map(&Regexp.public_method(:to_expression))
121
+ end
122
+ end # ASTToExpression
123
+
124
+ # Mixin for node transformers
125
+ #
126
+ # Helps construct a mapping from Parser::AST::Node domain to
127
+ # Regexp::Expression domain
128
+ module LookupTable
129
+ Mapping = Class.new.include(Concord::Public.new(:token, :regexp_class))
130
+
131
+ # Table mapping ast types to object information for regexp domain
132
+ class Table
133
+ # Coerce array of mapping information into structured table
134
+ #
135
+ # @param [Array(Symbol, Array, Class<Regexp::Expression>)]
136
+ #
137
+ # @return [Table]
138
+ def self.create(*rows)
139
+ table = rows.map do |ast_type, token, klass|
140
+ [ast_type, Mapping.new(::Regexp::Token.new(*token), klass)]
141
+ end.to_h
142
+
143
+ new(table)
144
+ end
145
+
146
+ include Concord.new(:table), Adamantium
147
+
148
+ # Types defined by the table
149
+ #
150
+ # @return [Array<Symbol>]
151
+ def types
152
+ table.keys
153
+ end
154
+
155
+ # Lookup mapping information given an ast node type
156
+ #
157
+ # @param type [Symbol]
158
+ #
159
+ # @return [Mapping]
160
+ def lookup(type)
161
+ table.fetch(type)
162
+ end
163
+ end # Table
164
+
165
+ private
166
+
167
+ # Lookup expression token given node type
168
+ #
169
+ # @return [Regexp::Token]
170
+ def expression_token
171
+ self.class::TABLE.lookup(node.type).token
172
+ end
173
+
174
+ # Lookup regexp class given node type
175
+ #
176
+ # @return [Class<Regexp::Expression>]
177
+ def expression_class
178
+ self.class::TABLE.lookup(node.type).regexp_class
179
+ end
180
+ end # LookupTable
181
+ end # Transformer
182
+ end # Regexp
183
+ end # AST
184
+ end # Mutest