mutators/removeObjPropsMutator.js

  1. const walk = require('babylon-walk')
  2. const debug = require('debug')('mutode:removeObjPropsMutator')
  3. const mutantRunner = require('../mutantRunner')
  4. const lineDiff = require('../util/lineDiff')
  5. /**
  6. * @description Mutates objects by removing single properties
  7. * @function removeObjPropsMutator
  8. * @memberOf module:Mutators
  9. */
  10. module.exports = async function removeObjPropsMutator ({mutodeInstance, filePath, lines, queue, ast}) {
  11. debug('Running remove object properties mutator on %s', filePath)
  12. walk.simple(ast, {
  13. ObjectProperty (node) {
  14. const propertyName = node.key.name
  15. let contentToWrite = ''
  16. let log = ''
  17. if (node.loc.start.line !== node.loc.end.line) {
  18. const line = node.loc.start.line
  19. const mutantId = ++mutodeInstance.mutants
  20. log = `MUTANT ${mutantId}:\tROPM Lines ${node.loc.start.line}-${node.loc.end.line}: Commented property ${propertyName}`
  21. debug(log)
  22. mutodeInstance.mutantLog(log)
  23. const linesCopy = lines.slice()
  24. for (let i = line - 1; i < node.loc.end.line; i++) {
  25. linesCopy[i] = `// ${linesCopy[i]}`
  26. }
  27. contentToWrite = linesCopy.join('\n')
  28. } else {
  29. const line = node.loc.start.line
  30. const lineContent = lines[line - 1]
  31. let trimmed = false
  32. let start = lineContent.substr(0, node.loc.start.column)
  33. if (start.trim().endsWith(',')) {
  34. start = start.substr(0, start.lastIndexOf(','))
  35. trimmed = true
  36. }
  37. let end = lineContent.substr(node.loc.end.column)
  38. if (!trimmed && end.startsWith(',')) end = end.substr(1).trim()
  39. const mutantLineContent = start + end
  40. const mutantId = ++mutodeInstance.mutants
  41. const diff = lineDiff(lineContent, mutantLineContent)
  42. log = `MUTANT ${mutantId}:\tROPM Line ${line}:\t${diff}`
  43. debug(log)
  44. mutodeInstance.mutantLog(`MUTANT ${mutantId}:\tROPM ${filePath} Line ${line}:\t\`${lineContent.trim()}\` > \`${mutantLineContent.trim()}'\``)
  45. const linesCopy = lines.slice()
  46. linesCopy[line - 1] = mutantLineContent
  47. contentToWrite = linesCopy.join('\n')
  48. }
  49. queue.push(mutantRunner({mutodeInstance, filePath, contentToWrite, log}))
  50. }
  51. })
  52. }