Jump to content

[Resolvido] Dúvidas no código - Máquina de vendas - Junit


d10s
 Share

Recommended Posts

Boa Tarde, estou a tentar compreender o código ao logo das aulas de programação, já tive P1 e ainda não aprendi que não é a passar código que aprendo a programar, mas sim a retirar as ideias, funcionamento do código.

O código que vou meter é sobre uma máquina de vendas que terá as suas classes de teste da máquina.

-> Sei que dará algum trabalho, mas alguns métodos não entendo de maneira nenhuma, será possível alguém explicar?

-> Ainda me faltam alguns teste para realmente passar, não se preocupem com isso.

Classe Dispenser

/**
* 
*/
package pt.ipbeja.estig.p2;

/**
* @author
* 
*/
public class Dispenser
{
   private MoneyBox        coinBox; // número de dinheiro na máquina
   private int             nProducts; // número de produtos da máquina
   private int             price; // dinheiro

   public static final int COIN10 = 10;
   public static final int COIN20 = 20;
   public static final int COIN50 = 50;
   // As moedas que a máquina recebe e podem ser chamadas em qualquer classe

   public Dispenser(int price)
   {
      this.coinBox = new MoneyBox(price); // coinBox é onde guarda os dinheiro actual
      this.nProducts = 100; // máquina inicia-se com 100 produtos
      // this.totalMoney = 0;
      // this.register = register;
   }

   // public int insertCoin(int value)
   // {
   // this.insertedMoney += value;
   // return this.insertedMoney;
   // }

   public int insertCoin(int value)
   {
      return this.coinBox.insertCoin(value); // devolve o valor do dinheiro que foi inserido no momento
   }

   public int sellProduct() // não entendi este método
   {
      if (this.nProducts > 0)
      {
         int change = this.coinBox.sellProduct();
         if (change >= 0)
         {
            this.nProducts--;
            return change;
         }
      }
      return this.cancel();
   }

   public int getNumProducts()
   {

      return this.nProducts; // devolve o nº de produtos actuais na máquina
   }

   public int getStoredMoney()
   {
      return this.coinBox.getStoredMoney(); // devolve o valor do dinheiro inserido até ao momento

   }

   public int cancel()
   {
      return this.coinBox.cancel(); // cancela a compra? não permite a compra?
   }

   public int ChangePrice()
   {
      return 0;
   }

   public int ChangenProducts()
   {
      return 0;
   }

   public int nProductsQuery()
   {
      return 0;
   }

   public int MoneyBoxQuery()
   {
      return 0;
   }

   public int getProdPrice()
   {
      return this.coinBox.getPrice();
   }

   public void changeProdPrice(int prodPrice)
   {
      this.coinBox.changeProdPrice(prodPrice);
   }

}

Classe DispenserTest

package pt.ipbeja.estig.p2;

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;

public class DispenserTest
{

   private final int PRODUCT_PRICE = 40; // o valor($) dos produtos que estão na máquina
   private Dispenser dispenser; // não entendi o que faz???

   @Before
   public void setUp() throws Exception
   {
      this.dispenser = new Dispenser(PRODUCT_PRICE); // não entendi o que faz???
   }

   @Test
   public void testInsertCoin()
   {

      int value = this.dispenser.insertCoin(Dispenser.COIN50); // insere uma moeda de 50
      value = this.dispenser.insertCoin(Dispenser.COIN20); // insere uma moeda de 20
      value = this.dispenser.insertCoin(Dispenser.COIN20); // insere uma moeda de 20

      assertEquals(90, value); // 90 = valor esperado // value = valor que realmente dará no teste

      value = this.dispenser.insertCoin(Dispenser.COIN20); // insere novamente uma moeda de 20
      assertEquals(110, value); // 110 = valor esperado // value = valor que realmente dará no teste

   }

   @Test
   public void testSellProduct()
   {

      int storedMoneyBefore = this.dispenser.getStoredMoney(); 
      // o valor de dinheiro que existia antes na máquina (storedMoneyBefore) é igual ao valor devolvido no return do metodo? 
      int nProductsBefore = this.dispenser.getNumProducts(); 
      // o valor de produtos que existia antes na máquina (nProductsBefore) é igual ao valor devolvido no return do metodo?

      int value = this.dispenser.insertCoin(Dispenser.COIN50); // insere uma moeda de 50
      assertEquals(Dispenser.COIN50, value); // 50 = valor esperado // value = valor que realmente dará no teste

      int change = this.dispenser.sellProduct(); // não entendi o que faz???

      assertEquals(Dispenser.COIN10, change); //troco? vai devolver uma moeda de 10?

      int nProductsAfter = this.dispenser.getNumProducts(); 
      assertEquals(nProductsBefore - 1, nProductsAfter);
      // nProductsBefore - 1 = vai ao total do nº de produtos que a máquina tem e desconta um
      // nProductsAfter = o número de produtos que realmente dá
      // e o número de produtos que realmente dá é o =  this.dispenser.getNumProducts

      int storedMoneyAfter = this.dispenser.getStoredMoney();
      assertEquals(storedMoneyBefore - PRODUCT_PRICE, storedMoneyAfter);
      // storedMoneyBefore + PRODUCT_PRICE = vai ao total do dinheiro e retira o valor do produto vendido
      // storedMoneyAfter = o número de dinheiro que estava antes de descontar a compra
      // e o valor em "caixa" é dado depois pelo =  this.dispenser.getNumProducts

      assertEquals(Dispenser.COIN10, change); //troco? vai devolver uma moeda de 10?

      change = this.dispenser.sellProduct(); // não entendi???
      assertEquals(0, change); // não entendi???

      value = this.dispenser.insertCoin(Dispenser.COIN20); // insere uma moeda de 20
      change = this.dispenser.sellProduct(); // não entendi???
      assertEquals(20, change); 

      nProductsAfter = this.dispenser.getNumProducts(); 
      assertEquals(nProductsBefore - 1, nProductsAfter);
      // nProductsBefore - 1 = vai ao total do nº de produtos que a máquina tem e desconta um
      // nProductsAfter = o número de produtos que realmente dá
      // e o número de produtos que realmente dá é o =  this.dispenser.getNumProducts
   }

   @Test
   public void testInsufficientMoney()
   {
      // Este método é semelhante ao de cima, apenas é um teste com uma moeda inválida,
      // acho que se entender o anterior percebo este.

      // final int INVALID_COIN5 = 5;

      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int value = this.dispenser.insertCoin(Dispenser.COIN20);
      // value = this.dispenser.insertCoin(INVALID_COIN5);
      assertEquals(Dispenser.COIN20, value);

      int change = this.dispenser.sellProduct(); // <-----------------------------
      assertEquals(20, change);

      int nProductsAfter = this.dispenser.getNumProducts();
      assertEquals(nProductsBefore, nProductsAfter);

      int storedMoneyAfter = this.dispenser.getStoredMoney();
      assertEquals(storedMoneyBefore, storedMoneyAfter);
   }

   @Test
   public void testCancelledSell()
   {
      // Não entendi quase nada do que faz, deve ser para cancelar uma compra na falta de $$$ ou algo do género.
      
      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int value = this.dispenser.insertCoin(Dispenser.COIN20);
      value = this.dispenser.insertCoin(Dispenser.COIN10);
      assertEquals(Dispenser.COIN20 + Dispenser.COIN10, value);

      int returnedValue = this.dispenser.cancel(); // <---------------------------------

      assertEquals(Dispenser.COIN20 + Dispenser.COIN10, returnedValue);

      int nProductsAfter = this.dispenser.getNumProducts();
      assertEquals(nProductsBefore, nProductsAfter);

      int storedMoneyAfter = this.dispenser.getStoredMoney();
      assertEquals(storedMoneyBefore, storedMoneyAfter);

   }

   @Test
   public void testChangeProductPrice()
   {

      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int NewPrice = this.dispenser.ChangePrice(); 
      // No caso de mudar o valor inicial dos produtos que é 40$

   }

   @Test
   public void testChangenProducts()
   {
      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int NewnProducts = this.dispenser.ChangenProducts(); 
      // No caso de mudar o valor inicial dos produtos na máquina que é 100

   }

   @Test
   public void testnProductsQuery()
   {
      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int NewnProducts = this.dispenser.nProductsQuery(); 
      // Não entedi o que faz???

   }

   @Test
   public void testMoneyBoxQuery()
   {
      int storedMoneyBefore = this.dispenser.getStoredMoney();
      int nProductsBefore = this.dispenser.getNumProducts();

      int MoneyBox = this.dispenser.MoneyBoxQuery(); 
   // Não entendi o que faz???

   }

   @Test
   public void testChangeProductPriceToMOD10()
   {
      final int PROD_PRICE = 55;
      this.dispenser.changeProdPrice(PROD_PRICE); // <-----------------------------
      int prodPrice = this.dispenser.getProdPrice();
      assertEquals(PROD_PRICE, prodPrice);
      // Não entendi o que faz???

      // final int NEW_PROD_PRICE = 55;
      // int prodPriceBefore = this.dispenser.getProdPrice();
      // this.dispenser.changeProdPrice(NEW_PROD_PRICE); //
      // <------------------------------
      // int prodPriceAfter = this.dispenser.getProdPrice();
      // assertEquals(prodPriceBefore, prodPriceAfter);

   }

   @Test
   public void testMultiplePurchase()
   {

   }

   @Test
   public void testSeparatedChange()
   {
      int array2[] = new int[] { 1, 0, 0 };
      assertEquals(Arrays.equals(new int[] { 1, 1, 0 }, array2), true);
      // Não entendi o que faz???
      
      // 1 de 50, 1 de 20....
      // Comparar 2 arrays : Arrays.equals(new int [] {n[0], n[1], n[2]},
      // array2, true);

   }

}
Link to comment
Share on other sites

Classe Moneybox

package pt.ipbeja.estig.p2;

public class MoneyBox
{
   private int price; 
   private int currentMoney; // store user inserted money
   private int totalMoney;  // sold products money

   public MoneyBox()
   {
      this(40); // chamar construtor com o price

   }

   public MoneyBox(int price)
   {

      this.price = price;
      this.currentMoney = 0;
      this.totalMoney = 0;
   }

   public int insertCoin(int value)
   {
      this.currentMoney = this.currentMoney += value;
      return this.currentMoney;
   }

   public int sellProduct()
   {
      int change = this.currentMoney - this.price;
      if (change >= 0)
      {
         this.currentMoney = 0;
         this.totalMoney += this.price;
      }

      return change;
   }

   public String getModel()
   {
      return this.getModel();
   }

   public String getBrand()
   {
      return this.getBrand();
   }

   public int getPrice()
   {
      return price;
   }

   public void changeProdPrice(int prodPrice)
   {
      // assert(false);
      assert (prodPrice % 10 == 0);
      // ou assim --> assert(prodPrice / 10.0 == (int)(prodPrice / 10.0));
      this.price = prodPrice;
   }

   public int getStoredMoney()
   {

      return this.totalMoney;
   }

   public int cancel()
   {
      int res = this.currentMoney;
      this.currentMoney = 0;
      return res;
   }

   public int getProdPrice()
   {
      return this.price;
   }
}

* 
*/
package pt.ipbeja.estig.p2;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class MoneyBoxTest
{
   private MoneyBox coinBox;
   final static int PRODUCT_PRICE = 40;

   /**
    * @throws java.lang.Exception
    */
   @Before
   public void setUp() throws Exception
   {
      this.coinBox = new MoneyBox(MoneyBoxTest.PRODUCT_PRICE);
   }

   /**
    * Test method for {@link pt.ipbeja.estig.p2.MoneyBox#MoneyBox(int)}.
    */
   @Test
   public void testMoneyBoxInt()
   {
      int price = coinBox.getPrice();
      assertEquals(MoneyBoxTest.PRODUCT_PRICE, price);
   }

   /**
    * Test method for {@link pt.ipbeja.estig.p2.MoneyBox#insertCoin(int)}.
    */
   @Test
   public void testInsertCoin()
   {
      int value = this.coinBox.insertCoin(Dispenser.COIN50);
      assertEquals(Dispenser.COIN50, value);
      value = this.coinBox.insertCoin(Dispenser.COIN20);
      assertEquals(Dispenser.COIN50 + Dispenser.COIN20, value);

   }

}
Link to comment
Share on other sites

private Dispenser dispenser; isto devia ser básico, não? Estás a criar uma nova instância da classe Dispenser para a poderes usar na classe de testes.

public int sellProduct() // não entendi este método
   {
      if (this.nProducts > 0)
      {
         int change = this.coinBox.sellProduct();
         if (change >= 0)
         {
            this.nProducts--;
            return change;
         }
      }
      return this.cancel();
   }

Também está bem explícito. A variável nProducts tem a quantidade de produtos. Se for > 0, vai vender um produto. Se tiver dinheiro que chegue, vende o produto, e retira-o da variável nProducts.

Na classe de testes, praticamente estás a usar a instância da classe Dispenser para chamar os métodos que definiste nessa mesma classe...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.