From 32d1cca2ad91c58d51bb0bacb1b57cb1d75c1f58 Mon Sep 17 00:00:00 2001 From: GabrieleRadice <265572328+GabrieleRadice@users.noreply.github.com> Date: Sat, 2 May 2026 17:24:00 +0200 Subject: [PATCH] Fix: Fixed "buy" Method In BuildingCard.java And Relative Tests In BuildingCardTest.java; Now Correctly Handles Discounts Given By Builders. Fix: Fixed "toString" Method In BuildingCard.java And Relative Tests In BuildingCardTest.java. --- .../ingsw/gc14/Model/Cards/BuildingCard.java | 10 +- .../gc14/Model/Cards/BuildingCardTest.java | 155 +++++++++++++++++- 2 files changed, 162 insertions(+), 3 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java index 24e41a1..d6ab676 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCard.java @@ -159,8 +159,16 @@ public class BuildingCard extends PlayableCard implements Cloneable , BuildingEf * @return {@code true} if the building card is successfully bought, * {@code false} otherwise. */ + // sum reduction value builder=> sconto public boolean buy(Player player) { - if( bought || !player.removeFood(getPrice())) + int discount = 0; + discount = player.builders.stream().mapToInt(x -> x.getReductionValue()).sum(); + + if(discount > this.price){ + discount = this.price; + } + + if(bought || !player.removeFood(this.price - discount)) return false; player.buildingCards.add(this); bought=true; diff --git a/src/test/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCardTest.java b/src/test/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCardTest.java index 0f713fa..c5fd426 100644 --- a/src/test/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCardTest.java +++ b/src/test/java/it/polimi/ingsw/gc14/Model/Cards/BuildingCardTest.java @@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.Model.Cards; import it.polimi.ingsw.gc14.Model.Cards.Building.EffectType; import it.polimi.ingsw.gc14.Model.Cards.Building.Effects.Building13; +import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters.Builder; import it.polimi.ingsw.gc14.Model.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -149,12 +150,162 @@ class BuildingCardTest { assertFalse(bc0.buy(p2)); } + @Test + @DisplayName("Testing the buy method with discounts") + void testBuyDiscount() { + int food = 5; + int price = 5; + int RV = 1; + + Player p = new Player("test"); + p.addFood(food); + p.builders.add(new Builder(1, RV, 1)); + + + + //Testing that to pay == price - 1 + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p.getFoodValue()); + assertTrue(bc.buy(p)); + + int discount = p.builders.stream().mapToInt(x -> x.getReductionValue()).sum(); + assertEquals(food - price + discount, p.getFoodValue()); + + p.removeFood(p.getFoodValue()); + p.addFood(food); + } + + //Testing that to pay == 0 + p.removeFood(p.getFoodValue()); + p.addFood(food); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p.getFoodValue()); + assertTrue(bc.buy(p)); + + assertEquals(food, p.getFoodValue()); + + p.removeFood(p.getFoodValue()); + p.addFood(food); + } + + //Testing that to pay == 0; discount shouldn't go below 0 + p.removeFood(p.getFoodValue()); + p.addFood(food); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + p.builders.add(new Builder(1, RV, 1)); + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p.getFoodValue()); + assertTrue(bc.buy(p)); + + assertEquals(food, p.getFoodValue()); + + p.removeFood(p.getFoodValue()); + p.addFood(food); + } + + //Testing that to pay == 0 if price < builder b * b.RV + food = 6; + price = 3; + RV = 4; + + Player p2 = new Player("test"); + p2.addFood(food); + p2.builders.add(new Builder(1, RV, 1)); + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p2.getFoodValue()); + assertTrue(bc.buy(p2)); + + int discount = p2.builders.stream().mapToInt(x -> x.getReductionValue()).sum(); + assertEquals(food, p2.getFoodValue()); + + p2.removeFood(p2.getFoodValue()); + p2.addFood(food); + } + + p2.removeFood(p2.getFoodValue()); + p2.addFood(food); + + //Testing discount with staggered values + price = 7; + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p2.getFoodValue()); + assertTrue(bc.buy(p2)); + + int discount = p2.builders.stream().mapToInt(x -> x.getReductionValue()).sum(); + assertEquals(food - price + discount, p2.getFoodValue()); + + p2.removeFood(p2.getFoodValue()); + p2.addFood(food); + } + + //Testing discount with staggered values; discount shouldn't go below 0 + p2.builders.add(new Builder(1, RV, 1)); + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard bc = new BuildingCard(ID, 1, price,1); + assertEquals(food, p2.getFoodValue()); + assertTrue(bc.buy(p2)); + + assertEquals(food, p2.getFoodValue()); + + p2.removeFood(p2.getFoodValue()); + p2.addFood(food); + } + } + @Test @DisplayName("Testing toString method") void testToString() { - Building13 b0 = new Building13(1, 2,3); + int era = 2; + int price = 5; + int prestigeValue = 6; - assertEquals("Era:1 Price:2 Prestige:3", b0.toString()); + BuildingCard b0 = new BuildingCard(era, price, prestigeValue); + assertEquals("⎕:" + " ID:0" + " $:"+ b0.getPrice() + " PV:" + b0.getPrestigeValue(), b0.toString()); + + for(int ID = 3; ID < 13; ID++){ + if(ID == 4 || ID == 8 || ID == 10 || ID == 11){ + continue; + } + BuildingCard b = new BuildingCard(ID, era, price, prestigeValue); + assertEquals("⎕:" + " ID:" + ID + " $:"+ b.getPrice() + " PV:" + b.getPrestigeValue(), b.toString()); + } } @Test