@ggflutter/sumo
Advanced tools
Comparing version 2.5.75003785 to 2.5.75003786
{ | ||
"author": "Luigi Allocca", | ||
"name": "@ggflutter/sumo", | ||
"version": "2.5.75003785", | ||
"version": "2.5.75003786", | ||
"description": "A mutation testing tool for Ethereum smart contracts", | ||
@@ -6,0 +6,0 @@ "repository": { |
@@ -10,54 +10,4 @@ const Mutation = require('../../mutation'); | ||
const mutations = []; | ||
let hasMutations = false; | ||
// Funzione per gestire una BinaryOperation | ||
function handleBinaryOperation(node, modifiedFunctionCode, functionStart, functionEnd) { | ||
const start = node.range[0]; | ||
const end = node.range[1] + 1; | ||
if (start >= functionStart && end <= functionEnd && node.operator === '=' && node.right.type === 'FunctionCall') { | ||
// Rimuovi l'assegnazione dall'originale | ||
const original = source.slice(start, end); | ||
const mutatedString = original.replace(/^[^=]+=\s*/, ""); // Rimuove l'assegnazione | ||
// Modifica il codice della funzione con la mutazione | ||
modifiedFunctionCode = modifiedFunctionCode.replace(original, mutatedString); | ||
hasMutations = true; | ||
} | ||
return modifiedFunctionCode; | ||
} | ||
// Funzione ricorsiva per attraversare i nodi | ||
function visitNode(node, modifiedFunctionCode, functionStart, functionEnd) { | ||
if (!node) return modifiedFunctionCode; | ||
// Se il nodo è una BinaryOperation, prova a fare la mutazione | ||
if (node.type === 'ExpressionStatement' && node.expression.type === 'BinaryOperation') { | ||
modifiedFunctionCode = handleBinaryOperation(node.expression, modifiedFunctionCode, functionStart, functionEnd); | ||
} | ||
// Se il nodo è un IfStatement, visita ricorsivamente i corpi true e false | ||
if (node.type === 'IfStatement') { | ||
if (node.trueBody && node.trueBody.statements) { | ||
for (const trueBodyStatement of node.trueBody.statements) { | ||
modifiedFunctionCode = visitNode(trueBodyStatement, modifiedFunctionCode, functionStart, functionEnd); | ||
} | ||
} | ||
if (node.falseBody && node.falseBody.statements) { | ||
for (const falseBodyStatement of node.falseBody.statements) { | ||
modifiedFunctionCode = visitNode(falseBodyStatement, modifiedFunctionCode, functionStart, functionEnd); | ||
} | ||
} | ||
} | ||
// Se il nodo ha un corpo di dichiarazioni (come un blocco di codice), visita ogni dichiarazione | ||
if (node.body && node.body.statements) { | ||
for (const statement of node.body.statements) { | ||
modifiedFunctionCode = visitNode(statement, modifiedFunctionCode, functionStart, functionEnd); | ||
} | ||
} | ||
return modifiedFunctionCode; | ||
} | ||
visit({ | ||
@@ -71,7 +21,21 @@ FunctionDefinition: (functionNode) => { | ||
let modifiedFunctionCode = originalFunctionCode; | ||
hasMutations = false; | ||
let hasMutations = false; | ||
// Visita ricorsivamente ogni nodo del corpo della funzione | ||
modifiedFunctionCode = visitNode(functionNode, modifiedFunctionCode, functionStart, functionEnd); | ||
visit({ | ||
BinaryOperation: (node) => { | ||
const start = node.range[0]; | ||
const end = node.range[1] + 1; | ||
if (start >= functionStart && end <= functionEnd && node.operator === '=' && (node.right.type === 'FunctionCall' || node.right.type === 'MemberAccess')) { | ||
// Rimuovi l'assegnazione dall'originale | ||
const original = source.slice(start, end); | ||
const mutatedString = original.replace(/^[^=]+=\s*/, ""); | ||
// Aggiorna il codice della funzione con la modifica | ||
modifiedFunctionCode = modifiedFunctionCode.replace(original, mutatedString); | ||
hasMutations = true; | ||
} | ||
} | ||
}); | ||
// Se sono state fatte modifiche, crea una mutazione per l'intera funzione | ||
@@ -78,0 +42,0 @@ if (hasMutations) { |
369839
7247