function replaceString(oldS, newS, fullS, ocr) {
var temOcr = arguments.length >= 4;
var parts = fullS.split(oldS);
var substituicoes = [];
for (var i = 0; i < parts.length - 1; i++) {
substituicoes[i] = temOcr ? oldS : newS;
}
if (temOcr) {
for (var e in ocr) {
var idx = ocr[e] - 1;
if (idx >= 0 && idx < substituicoes.length) substituicoes[idx] = newS;
}
}
var result = parts[0];
for (var i = 0; i < substituicoes.length; i++) {
result += substituicoes[i] + parts[i + 1];
}
return result;
}
QUnit.test("Testa a função replaceString", function(assert) {
var testando = 'acima do limite da razão, acima da capacidade do cérebro, acima de tudo.';
var resultadoEsperado = '<span class="myclass">acima</span> do limite da razão, <span class="myclass">acima</span> da capacidade do cérebro, <span class="myclass">acima</span> de tudo.';
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [1, 2, 3]), resultadoEsperado, "Substitui todos os índices");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando), resultadoEsperado, "Omitindo os índices");
resultadoEsperado = '<span class="myclass">acima</span> do limite da razão, acima da capacidade do cérebro, <span class="myclass">acima</span> de tudo.';
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [1, 3]), resultadoEsperado, "Substitui alguns dos índices (1, 3)");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [3, 1]), resultadoEsperado, "Substitui alguns dos índices, mesmo fora de ordem (1, 3)");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [3, 3, 1, 1]), resultadoEsperado, "Substitui alguns dos índices, mesmo com repetição (1, 3)");
resultadoEsperado = 'acima do limite da razão, <span class="myclass">acima</span> da capacidade do cérebro, <span class="myclass">acima</span> de tudo.';
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [2, 3]), resultadoEsperado, "Substitui alguns dos índices (2, 3)");
resultadoEsperado = 'acima do limite da razão, <span class="myclass">acima</span> da capacidade do cérebro, acima de tudo.';
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [2]), resultadoEsperado, "Substitui um dos índices (2)");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, []), testando, "Não substitui nada");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [4]), testando, "Tenta substituir além da última ocorrência");
assert.equal(replaceString('abacaxi', 'banana', testando, []), testando, "Não substitui nada por algo que não existe na frase");
assert.equal(replaceString('abacaxi', 'banana', testando, [1, 2, 3, 4, 5]), testando, "Tenta substituir por algo que não existe na frase");
assert.equal(replaceString('acima', '<span class="myclass">acima</span>', testando, [-4, 7, 2, 0, 2, -2]), resultadoEsperado, "Tenta substituir com índices inválidos (2)");
assert.equal(replaceString('arara', 'papagaio', 'zarararararaz', [1, 2]), 'zpapagaiorpapagaioz', "Verifica se ocorrências não se sobrepõem (1, 2)");
assert.equal(replaceString('arara', 'papagaio', 'zarararararaz', [2]), 'zarararpapagaioz', "Verifica se ocorrências não se sobrepõem (2)");
assert.equal(replaceString('ana', 'banana', 'ana e mariana gostam de banana', [1, 2, 3, 4]), 'banana e maribanana gostam de bbananana', "Verifica se funciona quando o substituído é parte do substituto");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><scriptsrc="http://code.jquery.com/qunit/qunit-1.17.1.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>