ERRATA: Artigo Testes Eficazes na Java Magazine 50
Caros leitores, no artigo “Testes Unitários Eficazes”, por André Dantas Rocha e Sérgio Oliveira Kubota, publicado na Edição 50, detectamos um erro grave: a última listagem (Listagem 6) não foi incluída na revista. Pedimos nossas sinceras desculpas e afirmamos que o erro foi da Editora e não dos autores. A seguir, são fornecidas a listagem original (para dar contexto) e a faltante.
Listagem 1. Conversão de números em extenso (contendo defeitos)
package br.com.jm.extenso;
public abstract class Extenso {
private static String[] unidades = { "", "um", "dois", "três", "quatro",
"cinco", "seis", "sete", "oito", "nove" };
private static String[] dezenas1 = { "", "onze", "doze", "treze", "catorze",
"quinze", "dezesseis", "dezesete", "dezoito", "dezenove" };
private static String[] dezenas2 = { "", "dez", "vinte", "trinta",
"quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa" };
private static String[] centenas = { "", "cem", "duzentos", "trezentos",
"quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos",
"novecentos" };
private int[] particao;
private String[] texto;
public abstract String extenso(String valor) throws ValorInvalidoException;
protected boolean numeroValido(String numero) {
boolean ok = true;
if (numero.length() > 4) {
ok = false;
} else {
if (!"".equals(numero)) {
try {
Integer.parseInt(numero);
} catch (NumberFormatException e) {
ok = false;
}
}
}
return ok;
}
protected String numeroExtenso(String numero) {
if (numero == null || numero.trim().equals("")) {
throw new ValorInvalidoException(numero);
}
int tam = numero.length();
particao = new int[]{ 0, 0, 0, 0 };
texto = new String[]{ "", "", "", "" };
for (int i = 0, j = 4 - tam; i < tam; i++, j++) {
particao[j] = numero.charAt(i) - 48;
}
extensoMilhar();
extensoCentena();
extensoDezena();
tratarMilhar();
tratarCentena();
tratarUnidade();
return texto[0] + texto[1] + texto[2] + texto[3];
}
private void tratarMilhar() {
if (particao[0] > 0) {
// milhar e unidade
if (particao[1] == 0 && particao[2] == 0 && particao[3] > 0) {
texto[0] += " e ";
}
// milhar e dezena
else if (particao[1] == 0 && particao[2] > 0 && particao[3] == 0) {
texto[0] += " e ";
}
// milhar e centena
else if (particao[1] > 0 && particao[2] == 0 && particao[3] == 0) {
texto[0] += " e ";
}
// milhar, dezena e unidade
else if (particao[1] == 0 && particao[2] > 0 && particao[3] > 0) {
texto[0] += " e ";
}
// milhar, centena e dezena
else if (particao[1] > 0 && particao[2] > 0 && particao[3] == 0) {
texto[0] += " e ";
}
// milhar, centena, dezena e unidade
else if (particao[1] > 0 && particao[2] > 0 && particao[3] > 0) {
texto[0] += " ";
}
}
}
private void tratarCentena() {
if (particao[1] > 0) {
// centena e unidade
if (particao[2] == 0 && particao[3] > 0) {
texto[1] += " e ";
}
// centena e dezena
else if (particao[2] > 0 && particao[3] == 0) {
texto[1] += " e ";
}
// centena, dezena e unidade
else if (particao[2] > 0 && particao[3] > 0) {
texto[1] += " e ";
}
}
}
private void tratarUnidade() {
if (particao[2] > 0) {
// dezena e unidade
if (particao[3] > 0 && !"".equals(texto[3])) {
texto[2] += " e ";
}
}
}
private void extensoMilhar() {
if (particao[0] > 0) {
if (particao[0] == 1) {
texto[0] = "mil";
} else {
texto[0] = unidades[particao[0]] + " mil";
}
}
}
private void extensoCentena() {
if (particao[1] > 0) {
if (particao[1] == 1 && (particao[2] > 0 || particao[3] > 0)) {
texto[1] = "cento";
} else {
texto[1] = centenas[particao[1]];
}
}
}
private void extensoDezena() {
if (particao[2] > 0) {
if (particao[2] == 1) {
texto[3] = "";
if (particao[3] == 0) {
texto[2] = dezenas2[particao[2]];
} else {
texto[2] = dezenas1[particao[3]];
}
} else {
texto[2] = dezenas2[particao[2]];
texto[3] = unidades[particao[3]];
}
} else {
texto[2] = dezenas2[particao[2]];
texto[3] = unidades[particao[3]];
}
}
}
Listagem 2. Conversão de valores monetários em extenso
package br.com.jm.extenso;
public class MoedaExtenso extends Extenso {
public String extenso(String valor) {
String reais = "";
String centavos = "";
String texto_reais = "";
String texto_centavos = "";
int valor_reais = 0;
int valor_centavos = 0;
if (valor == null) {
throw new ValorInvalidoException(valor);
}
int indice = valor.indexOf(",");
if (indice >= 0) {
reais = valor.substring(0, indice);
centavos = valor.substring(indice + 1);
if (!numeroValido(reais)) {
throw new ValorInvalidoException(reais);
}
if (!numeroValido(centavos)
|| (centavos.length() == 1 && !"0".equals(centavos))
|| centavos.length() > 2) {
throw new ValorInvalidoException(centavos);
}
try {
valor_reais = Integer.parseInt(reais);
if (valor_reais > 0) {
texto_reais = numeroExtenso(reais);
}
} catch (NumberFormatException e) {
// tratar
}
try {
valor_centavos = Integer.parseInt(centavos);
if (valor_centavos > 0) {
texto_centavos = numeroExtenso(centavos);
}
} catch (NumberFormatException e) {
// tratar
}
} else {
reais = valor;
if (!numeroValido(reais) || "".equals(reais)) {
throw new ValorInvalidoException(reais);
}
if (reais != null) {
try {
valor_reais = Integer.parseInt(reais);
if (valor_reais > 0) {
texto_reais = numeroExtenso(reais);
}
} catch (NumberFormatException e) {
throw new ValorInvalidoException(reais);
}
}
else {
throw new ValorInvalidoException(reais);
}
}
return unir(valor_reais, valor_centavos,
texto_reais, texto_centavos);
}
private String unir(int valor_reais, int valor_centavos,
String texto_reais, String texto_centavos)
{
if (valor_reais > 1) {
texto_reais += " reais";
}
if (valor_centavos > 1) {
texto_centavos += " centavos";
}
if (valor_reais > 0 && valor_centavos > 0) {
texto_reais += " e ";
}
return texto_reais + texto_centavos;
}
}
Listagem 6. Conversão de números em extenso (corrigida)
package br.com.jm.extenso;
public abstract class Extenso {
/* implementação original dos métodos e atributos */
private String unir(int valor_reais, int valor_centavos, String texto_reais,
String texto_centavos) {
if (valor_reais == 0 && valor_centavos == 0) {
texto_reais = "zero";
} else {
if (valor_reais == 1) {
texto_reais += " real";
} else if (valor_reais > 1) {
texto_reais += " reais";
}
if (valor_centavos == 1) {
texto_centavos += " centavo";
} else if (valor_centavos > 1) {
texto_centavos += " centavos";
}
if (valor_reais > 0 && valor_centavos > 0) {
texto_reais += " e ";
}
}
return texto_reais + texto_centavos;
}
}