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,20 @@
1
+ RSpec.describe Mutest::Util, '.one' do
2
+ let(:first) { instance_double(Object) }
3
+ let(:array) { instance_double(Array, one?: true, first: first) }
4
+
5
+ it 'returns first element' do
6
+ expect(described_class.one(array)).to be(first)
7
+ end
8
+
9
+ it 'fails if the list is empty' do
10
+ expect { described_class.one([]) }
11
+ .to raise_error(described_class::SizeError)
12
+ .with_message('expected size to be exactly 1 but size was 0')
13
+ end
14
+
15
+ it 'fails if the list has more than one element' do
16
+ expect { described_class.one([1, 2]) }
17
+ .to raise_error(described_class::SizeError)
18
+ .with_message('expected size to be exactly 1 but size was 2')
19
+ end
20
+ end
@@ -0,0 +1,99 @@
1
+ RSpec.describe Mutest::WarningFilter do
2
+ let(:object) { described_class.new(target) }
3
+
4
+ let(:target) do
5
+ acc = writes
6
+ Module.new do
7
+ define_singleton_method(:write, &acc.method(:<<))
8
+ end
9
+ end
10
+
11
+ let(:writes) { [] }
12
+
13
+ describe '#write' do
14
+ subject { object.write(message) }
15
+
16
+ context 'when writing a non warning message' do
17
+ let(:message) { 'foo' }
18
+
19
+ it 'writes message' do
20
+ expect { subject }.to change { writes }.from([]).to([message])
21
+ end
22
+
23
+ it 'does not capture warning' do
24
+ subject
25
+ expect(subject.warnings).to eql([])
26
+ end
27
+ end
28
+
29
+ context 'when writing a warning message' do
30
+ let(:message) { "test.rb:1: warning: some warning\n" }
31
+
32
+ it 'captures warning' do
33
+ expect { subject }.to change { object.warnings }.from([]).to([message])
34
+ end
35
+
36
+ it 'does not write message' do
37
+ subject
38
+ expect(writes).to eql([])
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '.use' do
44
+ let(:object) { described_class }
45
+
46
+ it 'executes block with warning filter enabled' do
47
+ found = false
48
+ object.use do
49
+ found = $stderr.instance_of?(described_class)
50
+ end
51
+ expect(found).to be(true)
52
+ end
53
+
54
+ it 'resets to original stderr after execution with exception ' do
55
+ original = $stderr
56
+ begin
57
+ object.use { fail }
58
+ rescue
59
+ :make_rubo_cop_happy
60
+ end
61
+ expect($stderr).to be(original)
62
+ end
63
+
64
+ it 'returns warnings generated within block' do
65
+ warnings =
66
+ object.use do
67
+ # rubocop:disable Security/Eval
68
+ eval(<<-RUBY)
69
+ Class.new do
70
+ def foo
71
+ end
72
+
73
+ def foo
74
+ end
75
+ end
76
+ RUBY
77
+ end
78
+ expect(warnings).to eql(
79
+ [
80
+ "(eval):5: warning: method redefined; discarding old foo\n",
81
+ "(eval):2: warning: previous definition of foo was here\n"
82
+ ]
83
+ )
84
+ end
85
+
86
+ it 'passes through non warning writes' do
87
+ expect($stderr).to receive(:write).with('foo')
88
+ object.use do
89
+ $stderr.write('foo')
90
+ end
91
+ end
92
+
93
+ it 'resets to original stderr after execution' do
94
+ original = $stderr
95
+ object.use {}
96
+ expect($stderr).to be(original)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,120 @@
1
+ RSpec.describe Mutest::Zombifier do
2
+ let(:root_require) { Pathname.new('project') }
3
+ let(:pathname) { class_double(Pathname) }
4
+
5
+ let(:require_highjack) do
6
+ lambda do |block|
7
+ original = ruby_vm.method(:require)
8
+ allow(ruby_vm).to receive(:require) do |argument|
9
+ return_value = ruby_vm.expected_events.first.return_value
10
+ expect(block.call(argument)).to be(return_value)
11
+ end
12
+ original
13
+ end
14
+ end
15
+
16
+ let(:options) do
17
+ {
18
+ load_path: %w[a b],
19
+ includes: %w[project bar],
20
+ namespace: :Zombie,
21
+ require_highjack: require_highjack,
22
+ root_require: root_require,
23
+ pathname: pathname,
24
+ kernel: ruby_vm
25
+ }
26
+ end
27
+
28
+ let(:ruby_vm) do
29
+ MutestSpec::RubyVM.new(
30
+ [
31
+ MutestSpec::RubyVM::EventExpectation::Require.new(
32
+ expected_payload: {
33
+ logical_name: 'project'
34
+ },
35
+ return_value: true
36
+ ),
37
+ MutestSpec::RubyVM::EventExpectation::Eval.new(
38
+ expected_payload: {
39
+ binding: TOPLEVEL_BINDING,
40
+ source: "module Zombie\n module Project\n end\nend",
41
+ source_location: 'a/project.rb'
42
+ },
43
+ trigger_requires: %w[foo bar],
44
+ return_value: nil
45
+ ),
46
+ MutestSpec::RubyVM::EventExpectation::Require.new(
47
+ expected_payload: {
48
+ logical_name: 'foo'
49
+ },
50
+ trigger_requires: %w[bar],
51
+ return_value: true
52
+ ),
53
+ MutestSpec::RubyVM::EventExpectation::Require.new(
54
+ expected_payload: {
55
+ logical_name: 'bar'
56
+ },
57
+ return_value: true
58
+ ),
59
+ MutestSpec::RubyVM::EventExpectation::Eval.new(
60
+ expected_payload: {
61
+ binding: TOPLEVEL_BINDING,
62
+ source: "module Zombie\n module Bar\n end\nend",
63
+ source_location: 'b/bar.rb'
64
+ },
65
+ trigger_requires: %w[],
66
+ return_value: nil
67
+ ),
68
+ MutestSpec::RubyVM::EventExpectation::Require.new(
69
+ expected_payload: {
70
+ logical_name: 'bar'
71
+ },
72
+ return_value: false
73
+ )
74
+ ]
75
+ )
76
+ end
77
+
78
+ let(:file_entries) do
79
+ {
80
+ 'a/project.rb' => { file: true, contents: 'module Project; end' },
81
+ 'b/bar.rb' => { file: true, contents: 'module Bar; end' }
82
+ }
83
+ end
84
+
85
+ let(:file_system) do
86
+ MutestSpec::FileSystem.new(
87
+ Hash[
88
+ file_entries.map { |key, attributes| [key, MutestSpec::FileState.new(attributes)] }
89
+ ]
90
+ )
91
+ end
92
+
93
+ describe '.call' do
94
+ def apply
95
+ described_class.call(options)
96
+ end
97
+
98
+ before do
99
+ allow(pathname).to receive(:new, &file_system.method(:path))
100
+ end
101
+
102
+ it 'returns self' do
103
+ expect(apply).to be(described_class)
104
+ end
105
+
106
+ it 'walks the VM through expected steps' do
107
+ expect { apply }.to change(ruby_vm, :done?).from(false).to(true)
108
+ end
109
+
110
+ context 'when zombifier require fails' do
111
+ let(:file_entries) do
112
+ {}
113
+ end
114
+
115
+ it 'raises zombifier specific load error' do
116
+ expect { apply }.to raise_error(described_class::LoadError, 'Cannot find file "project.rb" in load path')
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.describe Mutest do
2
+ let(:object) { described_class }
3
+
4
+ describe '.ci?' do
5
+ subject { object.ci? }
6
+
7
+ let(:value) { instance_double(Object, 'value') }
8
+
9
+ before do
10
+ expect(ENV).to receive(:key?).with('CI').and_return(value)
11
+ end
12
+
13
+ it { is_expected.to be(value) }
14
+ end
15
+ end
data/test_app/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gem 'rspec', '~> 3.4.0'
3
+ gem 'rspec-core', '~> 3.4.0'
4
+ gem 'mutest', path: '../'
5
+ gem 'mutest-rspec', path: '../'
6
+ gem 'adamantium'
7
+ eval_gemfile File.expand_path('../../Gemfile.shared', __FILE__)
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gem 'rspec', '~> 3.5.0'
3
+ gem 'rspec-core', '~> 3.5.0'
4
+ gem 'mutest', path: '../'
5
+ gem 'mutest-rspec', path: '../'
6
+ gem 'adamantium'
7
+ eval_gemfile File.expand_path('../../Gemfile.shared', __FILE__)
@@ -0,0 +1,109 @@
1
+ require 'adamantium'
2
+
3
+ original = $VERBOSE
4
+ # Silence intentional violations made to exercise the method matcher edge cases.
5
+ # This is NOT representative for could you should write!
6
+ $VERBOSE = false
7
+ # Namespace for test application
8
+ module TestApp
9
+ module InstanceMethodTests
10
+ class WithMemoizer
11
+ include Adamantium
12
+
13
+ def bar; end; def baz; end
14
+ eval('def boz; end')
15
+ def foo; end;
16
+ memoize :foo
17
+ end
18
+
19
+ module DefinedMultipleTimes
20
+ class DifferentLines
21
+ def foo
22
+ end
23
+
24
+ def foo(_arg)
25
+ end
26
+ end
27
+
28
+ class SameLineSameScope
29
+ def foo; end; def foo(_arg); end
30
+ end
31
+
32
+ class SameLineDifferentScope
33
+ def self.foo; end; def foo(_arg); end
34
+ end
35
+ end
36
+
37
+ class InClassEval
38
+ class_eval do
39
+ def foo
40
+ end
41
+ end
42
+ end
43
+
44
+ class InModuleEval
45
+ module_eval do
46
+ def foo
47
+ end
48
+ end
49
+ end
50
+
51
+ class InInstanceEval
52
+ module_eval do
53
+ def foo
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ module SingletonMethodTests
60
+ module DefinedOnSelf
61
+ def self.foo; end
62
+ end
63
+
64
+ module DefinedOnLvar
65
+ a = self
66
+ def a.foo; end
67
+ end
68
+
69
+ module DefinedOnConstant
70
+ module InsideNamespace
71
+ def InsideNamespace.foo
72
+ end
73
+ end
74
+
75
+ module OutsideNamespace
76
+ end
77
+
78
+ def OutsideNamespace.foo
79
+ end
80
+ end
81
+
82
+ module DefinedMultipleTimes
83
+ module DifferentLines
84
+ def self.foo
85
+ end
86
+
87
+ def self.foo(_arg)
88
+ end
89
+ end
90
+
91
+ module SameLine
92
+ module SameScope
93
+ def self.foo; end; def self.foo(_arg); end
94
+ end
95
+
96
+ module DifferentScope
97
+ def self.foo; end; def DifferentScope.foo(_arg); end; def SingletonMethodTests.foo; end
98
+ end
99
+
100
+ module DifferentName
101
+ def self.foo; end; def self.bar(_arg); end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ require 'test_app/literal'
109
+ $VERBOSE = original
@@ -0,0 +1,40 @@
1
+ module TestApp
2
+ # Class for integration testing literal mutations
3
+ class Literal
4
+ def boolean
5
+ true
6
+ end
7
+
8
+ def command(_foo)
9
+ self
10
+ end
11
+
12
+ def string
13
+ 'string'
14
+ end
15
+
16
+ def uncovered_string
17
+ 'string'
18
+ end
19
+
20
+ # mutest:disable
21
+ def disabled_string
22
+ 'string'
23
+ end
24
+
25
+ def self.string
26
+ 'string'
27
+ end
28
+
29
+ def symbol
30
+ :symbol
31
+ end
32
+
33
+ def float
34
+ 2.4
35
+ end
36
+ end
37
+
38
+ class Empty
39
+ end
40
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '../lib')
2
+
3
+ require 'test_app'
4
+ require 'rspec'
5
+
6
+ # require spec support files and shared behavior
7
+ Dir[File.expand_path('../{support,shared}/**/*.rb', __FILE__)].each do |file|
8
+ require file
9
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe TestApp::Literal do
4
+
5
+ describe '#command' do
6
+ subject { object.command(double) }
7
+
8
+ let(:object) { described_class.new }
9
+
10
+ it { should be(object) }
11
+ end
12
+
13
+ describe '#string' do
14
+ subject { object.string }
15
+
16
+ let(:object) { described_class.new }
17
+
18
+ it { should eql('string') }
19
+ end
20
+ end