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;

  } 

}