Este es el segundo ejercicio del día en Java. Es bastante más divertido que el anterior. El programa es un supermercado con varios productos, carritos de compras y cajas. Los productos pueden estar de oferta (valen la mitad). El programa carga los carritos con productos (muy interesante ver lo que contiene un carrito de compras típico en Suiza) y después los pasa por la caja, sacando el ticket:


=========================================
29/12/14
Caisse numéro 2

100% Arabica : 6.9 x 2 = 6,9 Frs (1/2 prix)
Pain d'epautre : 6.9 x 1 = 6,9 Frs
Cremeux 100%MG : 5.8 x 2 = 11,6 Frs

Montant à payer : 25.4 Frs
=========================================


Este es el código:


class Caddie {
  // instance variable
   private ArrayList<Achat> achats = new ArrayList<Achat>();

  
   public void remplir(Article art, int q) {
     Achat ach = new Achat(art, q);
     achats.add(ach);
     
   }
   
   public double getTotal() {
     double result = 0.0;
     for (Achat achat: achats) {
       result += achat.getValue();     
     }
     return result;
   }
   
   public String getAchats() {
     String s = "";
     for (Achat achat: achats) {
       s += achat.afficher() + "\n";     
     }
     return s;
   }
}
    
class Caisse {
  // instance variables
  private int num;
  private double total;
  // constructor
  Caisse(int num, double total) {
    this.num = num;
    this.total = total;
  }
  
  public String totalCaisse() {
    return "La caisse " + num + " a encaisse "+ total + " Frs aujourd'hui.";
  }
  public String scanner(Caddie c) {
    // update total
    total += c.getTotal();
    
    
    // get date
    Date dateCourante = new Date();
    SimpleDateFormat formatDate = new SimpleDateFormat("dd/MM/yy");
    String d = formatDate.format(dateCourante).toString();
    
    // print ticket 
    String s = "=========================================\n";
           s += d + "\n";
           s += "Caisse numéro "+ num + "\n";
           s += "\n";
           s += c.getAchats();
           s += "\n";
           s += "Montant à payer : " + c.getTotal() + " Frs\n";
           s += "=========================================\n";
    return s;
    
  }
  public int getNum() {
    return num;
  }
  
   public double getTotal() {
    return total;
  }
  
}

Lo más novedoso de esto es que usé JUnit para desarrollarlo (estoy usando un IDE que se llama Dr. Java). Escribir tests antes de escribir código me parece una forma muy copada de trabajar. Acá estan los los tests:


import junit.framework.TestCase;

/**
 * A JUnit test case class.
 * Every method starting with the word "test" will be called when running
 * the test with JUnit.
 */
public class testSuper extends TestCase {
  
  /**
   * A test method.
   * (Replace "X" with a name describing the test.  You may write as
   * many "testSomething" methods in this class as you wish, and each
   * one will be called when running JUnit over this class.)
   */  
   public void testNum() {
    Caisse c1 = new Caisse(1, 0.0);
    int actual = c1.getNum();
    int expected = 1;
    assertEquals("Caisse num", expected, actual);
  }
   
   public void testTot() {
    Caisse c1 = new Caisse(1, 0.0);
    double actual = c1.getTotal();
    double expected = 0.0;
    assertEquals("Caisse total", expected, actual); 
   }
  
   
   // test achat
   public void testAchat() {
    // set-up
    Article cafe = new Article("100% Arabica", 6.90, true);
    Achat   a    = new Achat(cafe, 2);
    double actual = a.getValue();
    double expected = 6.9;
    assertEquals("Achat total", expected, actual);
   }
   
   
   
   public void testCaddie() {
     
     // set up
    Caddie c = new Caddie();
    Article cafe = new Article("100% Arabica", 6.90, true);
    c.remplir(cafe, 2);
    
    // 
    double expected = 6.9;
    double actual = c.getTotal();
    assertEquals("Caddie total", expected, actual);
   }
   
    public void testAchat1() {
     
     // set up
   
    Article boisson = new Article("Petit-lait", 2.50, true);
    Achat achat = new Achat(boisson, 6);
    String actual = achat.afficher();
    String expected = "Petit-lait : 2.5 x 6 = 7,5 Frs (1/2 prix)";
    assertEquals("Print Achat ", expected, actual);
    // test if prints ok
    Article biscuits = new Article("Cookies de grand-mere", 3.20, false);
    Achat achat1 = new Achat(biscuits, 6);
    String actual1 = achat1.afficher();
    String expected1 = "Cookies de grand-mere : 3.2 x 6 = 19,2 Frs";
    assertEquals("Print Achat ", expected1, actual1);
   }
   
    public void testTotalCaisse() {
      // set-up
      Article choufleur = new Article("Chou-fleur extra", 3.50, false);
      Article roman = new Article("Les malheurs de Sophie", 16.50, true);
      Caddie caddie1 = new Caddie();
      Caisse caisse1 = new Caisse(1, 0.0);
      
      caddie1.remplir(choufleur, 2);
      caddie1.remplir(roman, 1);  
      caisse1.scanner(caddie1);
      String actual = caisse1.totalCaisse();
      String expected =  "La caisse 1 a encaisse 15.25 Frs aujourd'hui.";
      assertEquals("Print Caisse ", expected, actual);
    }
    
    public void testScanner() {
      // set-up arts
      Article cafe = new Article("100% Arabica", 6.90, true);
      Article pain = new Article("Pain d'epautre", 6.90, false);
      Article camembert = new Article("Cremeux 100%MG", 5.80, false);
      // set up caddie and caisse
      Caddie caddie1 = new Caddie();
      Caisse caisse2 = new Caisse(2, 0.0);
      // fill it in
      caddie1.remplir(cafe, 2);
      caddie1.remplir(pain, 1);
      caddie1.remplir(camembert, 2);
      
      
      
      String actual = caisse2.scanner(caddie1);
      String expected = "=========================================\n"   + 
                        "29/12/14\n"                                    + 
                        "Caisse numéro 2\n"                             + 
                        "\n"                                            +
                        "100% Arabica : 6.9 x 2 = 6,9 Frs (1/2 prix)\n" +
                        "Pain d'epautre : 6.9 x 1 = 6,9 Frs\n"          +
                        "Cremeux 100%MG : 5.8 x 2 = 11,6 Frs\n"         +  
                        "\n"                                            +
                        "Montant à payer : 25.4 Frs\n"                  +
                        "=========================================\n" ;  
      assertEquals("Print Caisse ", expected, actual);
    }
  
    
    public void testAchats() {
      
      Article cafe = new Article("100% Arabica", 6.90, true);
      Article pain = new Article("Pain d'epautre", 6.90, false);
      Article camembert = new Article("Cremeux 100%MG", 5.80, false);
      // set up caddie and caisse
      Caddie caddie1 = new Caddie();
      // fill it in
      caddie1.remplir(cafe, 2);
      caddie1.remplir(pain, 1);
      caddie1.remplir(camembert, 2);
      
      String actual = caddie1.getAchats();
      String expected = "100% Arabica : 6.9 x 2 = 6,9 Frs (1/2 prix)\n" +
                        "Pain d'epautre : 6.9 x 1 = 6,9 Frs\n"          +
                        "Cremeux 100%MG : 5.8 x 2 = 11,6 Frs\n";
      assertEquals("get caddie's achats", expected, actual);
    }
    
}

Otra dificultad que encontré fue como mantener un Array sin saber su tamaño antes de correr el programa. La sugerencia fue usar un ArrayList, así que cada caddie tiene un ArrayList para guardar las compras (achats). Para cualquiera que haya programado es Python tener que luchar con estas cosas es una tortura, pero el curso de Sedgewick es en Java, así que hay que apechugar!

Anuncios