From f445505a18076e7607b36d3f4ae8787d40e5dc61 Mon Sep 17 00:00:00 2001 From: Marton Emese Date: Mon, 20 May 2024 17:21:19 +0200 Subject: [PATCH 1/5] Getter-Setter update --- .../src/Controll/Controller.java | 3 +++ .../src/Controll/WaterCounter.java | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/Controller.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/Controller.java index bf5c1d3..34fbbfe 100644 --- a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/Controller.java +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/Controller.java @@ -56,6 +56,9 @@ public class Controller { * Getter for test * */ public static boolean isTest() {return test;} + + public static void setTest(boolean value){ test = value;} + /** * Name of the used file * */ diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/WaterCounter.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/WaterCounter.java index bb9156f..c73285b 100644 --- a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/WaterCounter.java +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/Controll/WaterCounter.java @@ -61,6 +61,13 @@ public void reset(){ * @return mechanic - Points of the mechanics. */ public int getMechanic() { return mechanic; } + + public ArrayList getCisterns() { return cisterns; } + + public ArrayList getPipes() { return pipes; } + + public boolean getEnd() { return end; } + /** *Adds new Cistern to cisterns. * @param c Cistern that is to be added to cisterns. From 3e35bd0bd549b034e7d1e4d0471490d193e6ef59 Mon Sep 17 00:00:00 2001 From: Marton Emese Date: Mon, 20 May 2024 17:29:09 +0200 Subject: [PATCH 2/5] UnitTests --- .../test/Controll/WaterCounterTest.java | 120 ++++++ .../test/Fields/ActiveFields/CisternTest.java | 79 ++++ .../test/Fields/ActiveFields/PumpTest.java | 73 ++++ .../test/Fields/ActiveFields/SpringTest.java | 73 ++++ .../test/Fields/PipeTest.java | 391 ++++++++++++++++++ .../test/Players/MechanicTest.java | 118 ++++++ .../test/Players/SaboteurTest.java | 88 ++++ 7 files changed, 942 insertions(+) create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java create mode 100644 Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java new file mode 100644 index 0000000..db1d8f7 --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java @@ -0,0 +1,120 @@ +package Controll; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Fields.Pipe; +import Fields.ActiveFields.Cistern; + +class WaterCounterTest { + private WaterCounter waterCounter; + private Cistern cistern; + private Pipe pipe; + + @BeforeEach + void setUp() throws Exception { + waterCounter = new WaterCounter(); + cistern = new Cistern(); + pipe = new Pipe(10); + + waterCounter.addPipe(pipe); + waterCounter.addCistern(cistern); + } + + @Test + void testReset() { + waterCounter.reset(); + + assertEquals(0, waterCounter.getSaboteur()); + assertEquals(0, waterCounter.getMechanic()); + assertFalse(waterCounter.getEnd()); + assertTrue(waterCounter.getCisterns().isEmpty()); + assertTrue(waterCounter.getPipes().isEmpty()); + } + + @Test + void testAddCistern() { + assertTrue(waterCounter.getCisterns().contains(cistern)); + } + + @Test + void testAddPipe() { + assertTrue(waterCounter.getPipes().contains(pipe)); + } + + @Test + void testSetEnd() { + waterCounter.setEnd(); + + assertTrue(waterCounter.getEnd()); + } + + @Test + void testCount_End() { + pipe.fillInWater(-6); + cistern.setWater(10); + waterCounter.setEnd(); + + waterCounter.count(); + + assertEquals(0, waterCounter.getSaboteur()); + assertEquals(10, waterCounter.getMechanic()); + } + + @Test + void testCount_No_End() { + pipe.fillInWater(6); + cistern.setWater(10); + + waterCounter.count(); + + assertEquals(6, waterCounter.getSaboteur()); + assertEquals(0, waterCounter.getMechanic()); + + waterCounter.setEnd(); + + waterCounter.count(); + assertEquals(10, waterCounter.getMechanic()); + } + + @Test + void testToString() { + waterCounter.count(); + + String exp = "saboteur: 0\nmechanic: 0\n"; + assertEquals(exp, waterCounter.toString()); + } + + @Test + void testWinner_Draw() { + waterCounter.setEnd(); + waterCounter.count(); + + assertEquals("Döntetlen", waterCounter.winner()); + } + + @Test + void testWinner_Mechanic() { + pipe.fillInWater(6); + cistern.setWater(10); + + waterCounter.setEnd(); + waterCounter.count(); + + assertEquals("Mechanic", waterCounter.winner()); + } + + @Test + void testWinner_Mechanic_Saboteur() { + pipe.fillInWater(10); + cistern.setWater(6); + + waterCounter.setEnd(); + waterCounter.count(); + + assertEquals("Saboteur", waterCounter.winner()); + } + +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java new file mode 100644 index 0000000..518f64c --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java @@ -0,0 +1,79 @@ +package Fields.ActiveFields; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Controll.Controller; +import Fields.Pipe; + +class CisternTest { + private Cistern cistern; + private Pipe pipe; + private Pump pump; + + @BeforeEach + void setUp() throws Exception { + cistern = new Cistern(); + pipe = new Pipe(10); + pump = new Pump(20); + } + + @Test + void testCreateNewPump_Success() { + pump = cistern.createNewPump(true); + + assertNotNull(pump); + } + + @Test + void testCreateNewPump_No_Success() { + pump = cistern.createNewPump(false); + + assertNull(pump); + } + + @Test + void testGetWater() { + cistern.setWater(10); + int water = cistern.getWater(); + + assertEquals(10, water); + } + + @Test + void testPickUpPipe() { + cistern.step(); + pipe = cistern.pickUpPipe(); + + assertNotNull(pipe); + assertEquals(1, cistern.getPipes().size()); + assertTrue(cistern.getPipes().contains(pipe)); + } + + @Test + void testStep() { + cistern.addPipe(pipe); + cistern.step(); + + assertEquals(0, cistern.getWater()); + assertNotNull(cistern.pickUpPipe()); + assertNotNull(cistern.getPipes()); + } + + @Test + void testToString() { + cistern.setBroken(true); + cistern.setWater(13); + cistern.addPipe(pipe); + String cisternString = cistern.toString(); + + assertTrue(cisternString.contains("occupied: false")); + assertTrue(cisternString.contains("water: 13")); + assertTrue(cisternString.contains("broken: true")); + assertTrue(cisternString.contains("players: null")); + assertTrue(cisternString.contains("pipes: null")); + } + +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java new file mode 100644 index 0000000..c0af24d --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java @@ -0,0 +1,73 @@ +package Fields.ActiveFields; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Fields.Pipe; + +class PumpTest { + private Pump pump; + private ArrayList pipes; + + @BeforeEach + void setUp() throws Exception { + pump = new Pump(100); + pipes = new ArrayList<>(); + pipes.add(new Pipe(50)); + pipes.add(new Pipe(50)); + pump.setPipes(pipes); + } + + @Test + void testSet() { + Pipe inputPipe = pipes.get(0); + Pipe outputPipe = pipes.get(1); + + boolean result = pump.set(inputPipe, outputPipe); + assertTrue(result); + assertEquals(0, pump.getWaterFrom()); + assertEquals(1, pump.getWaterTo()); + } + + @Test + void testRepair() { + boolean repairResult = pump.repair(); + + assertFalse(pump.isBroken()); + assertTrue(repairResult); + } + + @Test + void testStep() { + pump.setWaterFrom(0); + pump.setWaterTo(1); + pump.step(); + + assertEquals(0,pump.getWater()); + assertEquals(0,pipes.get(pump.getWaterTo()).getWater()); + } + + @Test + void testToString() { + pump.setOccupied(true); + pump.setWater(10); + pump.setBroken(true); + pump.setWaterFrom(0); + pump.setWaterTo(1); + String pumpString = pump.toString(); + + assertTrue(pumpString.contains("occupied: true")); + assertTrue(pumpString.contains("water: 10")); + assertTrue(pumpString.contains("broken: true")); + assertTrue(pumpString.contains("players: null")); + assertTrue(pumpString.contains("pipes:")); + assertTrue(pumpString.contains("tank: 100")); + assertTrue(pumpString.contains("waterFrom: null")); + assertTrue(pumpString.contains("waterTo: null")); + } + +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java new file mode 100644 index 0000000..bf88cdc --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java @@ -0,0 +1,73 @@ +package Fields.ActiveFields; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Fields.Pipe; +import Players.Mechanic; + +class SpringTest { + private Spring spring; + private ArrayList pipes; + private Mechanic mechanic; + + @BeforeEach + void setUp() throws Exception { + spring = new Spring(10); + mechanic = new Mechanic(); + pipes = new ArrayList<>(); + pipes.add(new Pipe(30)); + pipes.add(new Pipe(30)); + spring.setPipes(pipes); + } + + @Test + void testStep() { + pipes.get(0).setWater(5); + pipes.get(1).setWater(10); + + spring.step(); + + assertEquals(0, spring.getWaterOut()); + assertEquals(10, spring.getMaxOutWater()); + assertEquals(-10, pipes.get(0).getWater()); + } + + @Test + void testToString() { + pipes.get(0).setWater(20); + pipes.get(1).setWater(10); + + String springString = spring.toString(); + + assertTrue(springString.contains("occupied: false")); + assertTrue(springString.contains("water: 0")); + assertTrue(springString.contains("broken: false")); + assertTrue(springString.contains("players: null")); + assertTrue(springString.contains("pipes: null")); + assertTrue(springString.contains("waterOut: 10")); + assertTrue(springString.contains("maxOutWater: 10")); + } + + @Test + void testGetNeighborFields() { + assertEquals(pipes,spring.getNeighborFields()); + } + + @Test + void testRemovePlayer() { + mechanic.setStandingField(spring); + spring.setOccupied(true); + spring.setPlayers(mechanic); + spring.accept(mechanic); + + boolean removed = spring.removePlayer(mechanic); + + assertTrue(removed); + assertFalse(spring.isOccupied()); + } +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java new file mode 100644 index 0000000..b07a391 --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java @@ -0,0 +1,391 @@ +package Fields; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Controll.Controller; +import Enums.Fluid; +import Fields.ActiveFields.ActiveFields; +import Fields.ActiveFields.Pump; +import Players.Mechanic; +import Players.Player; + +class PipeTest { + private Pipe pipe; + private Player player; + private Pump pump1; + private Pump pump2; + + @BeforeEach + void setUp() throws Exception { + pipe = new Pipe(23); + player = new Mechanic(); + pump1 = new Pump(50); + pump2 = new Pump(50); + } + + @Test + void testAccept_Test() { + Controller.setTest(true); + pipe.setOccupied(false); + pipe.setFields(pump1); + pipe.setFields(pump2); + pipe.setFluid(Fluid.SLIPPERY); + + Field field = pipe.accept(player); + + assertFalse(pipe.isOccupied()); + assertFalse(pipe.getPlayers().contains(player)); + assertNotEquals(pipe, field); + } + + @Test + void testAccept_Occupied() { + pipe.setOccupied(true); + Field field = pipe.accept(player); + + assertTrue(pipe.isOccupied()); + assertFalse(pipe.getPlayers().contains(player)); + assertNotEquals(pipe, field); + } + + @Test + void testAccept_Fluid() { + pipe.setOccupied(false); + pipe.setFields(pump1); + pipe.setFields(pump2); + pipe.setFluid(Fluid.SLIPPERY); + + Field field = pipe.accept(player); + + assertFalse(pipe.isOccupied()); + assertFalse(pipe.getPlayers().contains(player)); + assertNotEquals(pipe, field); + } + + @Test + void testRemovePlayer() { + pipe.accept(player); + + boolean removed = pipe.removePlayer(player); + + assertFalse(pipe.isOccupied()); + assertTrue(pipe.getPlayers().isEmpty()); + assertTrue(removed); + } + + @Test + void testRemovePlayer_Sticky_Leave() { + pipe.setFluid(Fluid.STICKY); + pipe.accept(player); + pipe.setLeave(true); + + boolean removed = pipe.removePlayer(player); + + assertFalse(pipe.isOccupied()); + assertTrue(pipe.getPlayers().isEmpty()); + assertTrue(removed); + } + + @Test + void testRemovePlayer_No_Leave() { + pipe.setFluid(Fluid.STICKY); + pipe.accept(player); + pipe.setLeave(false); + + boolean removed = pipe.removePlayer(player); + + assertTrue(pipe.isOccupied()); + assertFalse(pipe.getPlayers().isEmpty()); + assertFalse(removed); + } + + @Test + void testBreakField_Succes() { + pipe.setBreakable(0); + boolean broken = pipe.breakField(); + + assertTrue(broken); + assertTrue(pipe.isBroken()); + } + + @Test + void testBreakField_No_Succes() { + pipe.setBreakable(10); + boolean broken = pipe.breakField(); + + assertFalse(broken); + assertFalse(pipe.isBroken()); + } + + + + @Test + void testRepair() { + Controller.setTest(false); + pipe.breakField(); + + boolean repaired = pipe.repair(); + + assertTrue(repaired); + assertFalse(pipe.isBroken()); + } + + @Test + void testRepair_Test() { + Controller.setTest(true); + pipe.breakField(); + + boolean repaired = pipe.repair(); + + assertTrue(repaired); + assertFalse(pipe.isBroken()); + assertEquals(5,pipe.getBreakable()); + } + + @Test + void testPlacePump() { + Pump pump = new Pump(20); + pipe.setFields(pump1); + pipe.setFields(pump2); + + Pipe newPipe = pipe.placePump(pump); + + assertNotNull(newPipe); + assertTrue(pipe.getFields().contains(pump)); + assertTrue(newPipe.getFields().contains(pump)); + assertEquals(2, pump.getPipes().size()); + } + + @Test + void testPlacePump_Null() { + pipe.setFields(pump1); + pipe.setFields(pump2); + + Pipe newPipe = pipe.placePump(null); + + assertNull(newPipe); + } + + @Test + void testPlacePump_Test() { + Controller.setTest(true); + Pump pump = new Pump(20); + pipe.setFields(pump1); + pipe.setFields(pump2); + + Pipe newPipe = pipe.placePump(pump); + + assertNotNull(newPipe); + assertTrue(pipe.getFields().contains(pump)); + assertTrue(newPipe.getFields().contains(pump)); + assertEquals(2, pump.getPipes().size()); + assertEquals(50, newPipe.getCapacity()); + } + + @Test + void testGetWater_Success() { + pipe.fillInWater(20); + pipe.setBroken(false); + pipe.connect(pump1); + pipe.connect(pump2); + pump1.addPipe(pipe); + pump2.addPipe(pipe); + + int waterTaken = pipe.getWater(); + + assertEquals(20, waterTaken); + assertEquals(0, pipe.getWaterNoChange()); + } + + @Test + void testGetWater_Broken() { + pipe.fillInWater(20); + pipe.setBroken(true); + + int waterTaken = pipe.getWater(); + + assertEquals(-20, waterTaken); + assertEquals(0, pipe.getWaterNoChange()); + } + + @Test + void testGetWater_Fields() { + pipe.fillInWater(20); + pipe.setBroken(false); + + int waterTaken = pipe.getWater(); + + assertEquals(-20, waterTaken); + assertEquals(0, pipe.getWaterNoChange()); + } + + @Test + void testGetWater_Broken_Fields() { + pipe.fillInWater(20); + pipe.setBroken(true); + pipe.connect(pump1); + pipe.connect(pump2); + pump1.addPipe(pipe); + pump2.addPipe(pipe); + + int waterTaken = pipe.getWater(); + + assertEquals(-20, waterTaken); + assertEquals(0, pipe.getWaterNoChange()); + } + + @Test + void testFillInWater() { + int initialWater = pipe.getWaterNoChange(); + + int remainingWater = pipe.fillInWater(30); + + assertEquals(7, remainingWater); + assertEquals(0, initialWater); + } + + @Test + void testFillInWater_Full() { + pipe.setWater(23); + int initialWater = pipe.getWaterNoChange(); + + int remainingWater = pipe.fillInWater(30); + + assertEquals(30, remainingWater); + assertEquals(23, initialWater); + } + + @Test + void testConnect() { + boolean connected = pipe.connect(pump1); + + assertTrue(connected); + assertTrue(pipe.getFields().contains(pump1)); + } + + @Test + void testDisconnect() { + pipe.connect(pump2); + + boolean disconnected = pipe.disconnect(pump2); + + assertTrue(disconnected); + assertFalse(pipe.getFields().contains(pump2)); + } + + @Test + void testMakeSlippery_Success() { + boolean slippery = pipe.makeSlippery(); + + assertTrue(slippery); + assertEquals(Fluid.SLIPPERY, pipe.getFluid()); + } + + @Test + void testMakeSlippery_No_Success() { + pipe.setFluid(Fluid.STICKY); + boolean slippery = pipe.makeSlippery(); + + assertFalse(slippery); + assertNotEquals(Fluid.SLIPPERY, pipe.getFluid()); + } + + @Test + void testMakeSticky_Success() { + boolean sticky = pipe.makeSticky(); + + assertTrue(sticky); + assertEquals(Fluid.STICKY, pipe.getFluid()); + } + + @Test + void testMakeSticky_Success_Test() { + Controller.setTest(true); + boolean sticky = pipe.makeSticky(); + + assertTrue(sticky); + assertEquals(Fluid.STICKY, pipe.getFluid()); + assertEquals(5,pipe.getRemainingFluidTime()); + } + + @Test + void testMakeSticky_No_Success() { + pipe.setFluidTime(10); + boolean sticky = pipe.makeSticky(); + + assertFalse(sticky); + assertNotEquals(Fluid.STICKY, pipe.getFluid()); + } + + @Test + void testStep_Breakable() { + pipe.setBreakable(10); + int breakable = pipe.getBreakable(); + + pipe.step(); + + assertEquals(breakable - 1, pipe.getBreakable()); + } + + @Test + void testStep_Dry() { + pipe.setFluid(Fluid.STICKY); + pipe.setFluidTime(1); + int fluidTime = pipe.getRemainingFluidTime(); + + pipe.step(); + + assertEquals(fluidTime - 1, pipe.getRemainingFluidTime()); + assertEquals(Fluid.DRY, pipe.getFluid()); + assertTrue(pipe.getLeave()); + } + + @Test + void testStep_Almost_Dry() { + pipe.setFluid(Fluid.STICKY); + pipe.setFluidTime(2); + int fluidTime = pipe.getRemainingFluidTime(); + + pipe.step(); + + assertEquals(fluidTime - 1, pipe.getRemainingFluidTime()); + assertNotEquals(Fluid.DRY, pipe.getFluid()); + assertTrue(pipe.getLeave()); + } + + @Test + void testToString() { + pipe.setFields(pump1); + pipe.setFields(pump2); + pipe.accept(player); + + String pipeString = pipe.toString(); + + assertTrue(pipeString.contains("occupied: true")); + assertTrue(pipeString.contains("water: 0")); + assertTrue(pipeString.contains("broken: false")); + assertTrue(pipeString.contains("players: " + Controller.objectReverseNames.get(player))); + assertTrue(pipeString.contains("fields: " + Controller.objectReverseNames.get(pump1) + ", " + Controller.objectReverseNames.get(pump2))); + assertTrue(pipeString.contains("capacity: 23")); + assertTrue(pipeString.contains("breakable: " + pipe.getBreakable())); + assertTrue(pipeString.contains("rfluidtime: " + pipe.getRemainingFluidTime())); + assertTrue(pipeString.contains("leave: true")); + assertTrue(pipeString.contains("fluid: dry")); + } + + @Test + void testGetNeighborFields() { + ArrayList pumps = new ArrayList<>(); + pumps.add(pump1); + pumps.add(pump2); + + pipe.setFields(pumps); + + assertEquals(pumps,pipe.getNeighborFields()); + } +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java new file mode 100644 index 0000000..314094f --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java @@ -0,0 +1,118 @@ +package Players; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Fields.Pipe; +import Fields.ActiveFields.Cistern; +import Fields.ActiveFields.Pump; + +class MechanicTest { + private Mechanic mechanic; + private Pump pump; + private Pipe pipe; + private Cistern cistern; + + @BeforeEach + void setUp() throws Exception { + mechanic = new Mechanic(); + pump = new Pump(10); + pipe = new Pipe(30); + cistern = new Cistern(); + } + + @Test + void testRepair() { + pump.setBroken(true); + mechanic.setStandingField(pump); + + boolean repaired = mechanic.repair(); + + assertTrue(repaired); + assertFalse(pump.isBroken()); + } + + @Test + void testPlacePump() { + mechanic.setStandingField(pipe); + mechanic.setHoldingPump(pump); + pump.addPipe(pipe); + pipe.connect(pump); + + Pipe newPipe = mechanic.placePump(); + + assertNull(mechanic.getHoldingPump()); + assertNotNull(newPipe); + } + + @Test + void testDisconnect() { + mechanic.setStandingField(pump); + pump.addPipe(pipe); + pipe.connect(pump); + + boolean disconnect= mechanic.disconnect(pipe); + + assertTrue(disconnect); + assertEquals(pipe,mechanic.getHoldingPipe()); + + } + + @Test + void testConnect() { + mechanic.setStandingField(pump); + mechanic.setHoldingPipe(pipe); + + boolean connect = mechanic.connect(); + + assertTrue(connect); + assertNull(mechanic.getHoldingPipe()); + } + + @Test + void testGetPump() { + mechanic.setStandingField(cistern); + Pump newPump = mechanic.getPump(); + + assertNotNull(newPump); + assertEquals(newPump,mechanic.getHoldingPump()); + } + + @Test + void testPickUpPipe() { + mechanic.setStandingField(cistern); + cistern.step(); + + boolean pickedUp = mechanic.pickUpPipe(); + + assertTrue(pickedUp); + assertNotNull(mechanic.getHoldingPipe()); + } + + @Test + void testToString() { + String mechanicString = mechanic.toString(); + + assertTrue(mechanicString.contains("standingField: null")); + assertTrue(mechanicString.contains("holdingPipe: null")); + assertTrue(mechanicString.contains("holdingPump: null")); + } + + @Test + void testSet() { + mechanic.setStandingField(pump); + Pipe input = new Pipe(10); + Pipe output = new Pipe(14); + pump.addPipe(input); + pump.addPipe(output); + input.connect(pump); + output.connect(pump); + + boolean set = mechanic.set(input, output); + + assertTrue(set); + } + +} diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java new file mode 100644 index 0000000..392e328 --- /dev/null +++ b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java @@ -0,0 +1,88 @@ +package Players; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import Enums.Fluid; +import Fields.Pipe; +import Fields.ActiveFields.Pump; + +class SaboteurTest { + private Saboteur saboteur; + private Pipe pipe; + private Pump pump; + + @BeforeEach + void setUp() throws Exception { + saboteur = new Saboteur(); + pipe = new Pipe(10); + pump = new Pump(30); + } + + @Test + void testMakeSlippery() { + saboteur.setStandingField(pipe); + pipe.accept(saboteur); + boolean slippery = saboteur.makeSlippery(); + + assertTrue(slippery); + assertEquals(Fluid.SLIPPERY, pipe.getFluid()); + } + + @Test + void testMakeSticky() { + saboteur.setStandingField(pipe); + pipe.accept(saboteur); + boolean sticky = saboteur.makeSticky(); + + assertTrue(sticky); + assertEquals(Fluid.STICKY, pipe.getFluid()); + } + + @Test + void testToString() { + String saboteurString = saboteur.toString(); + + assertTrue(saboteurString.contains("standingField: null")); + } + + @Test + void testMove_Success() { + saboteur.setStandingField(pipe); + pipe.accept(saboteur); + pipe.connect(pump); + pump.addPipe(pipe); + + boolean moved = saboteur.move(pump); + + assertTrue(moved); + assertEquals(pump, saboteur.getStandingField()); + assertEquals(saboteur, pump.getPlayers().get(0)); + } + + @Test + void testMove_No_Success() { + saboteur.setStandingField(pump); + pipe.accept(saboteur); + pipe.connect(pump); + pump.addPipe(pipe); + pipe.setOccupied(true); + + boolean moved = saboteur.move(pipe); + + assertFalse(moved); + assertEquals(pump, saboteur.getStandingField()); + } + + @Test + void testBreakField() { + saboteur.setStandingField(pipe); + boolean broken = saboteur.breakField(); + + assertTrue(broken); + assertTrue(pipe.isBroken()); + } + +} From cfcb43aa2413ccc7a21d919e2fe6d0dd038cf32e Mon Sep 17 00:00:00 2001 From: Marton Emese Date: Mon, 20 May 2024 20:57:30 +0200 Subject: [PATCH 3/5] Tests --- .../{ => src}/test/Controll/WaterCounterTest.java | 0 .../{ => src}/test/Fields/ActiveFields/CisternTest.java | 0 .../{ => src}/test/Fields/ActiveFields/PumpTest.java | 0 .../{ => src}/test/Fields/ActiveFields/SpringTest.java | 0 .../{ => src}/test/Fields/PipeTest.java | 0 .../{ => src}/test/Players/MechanicTest.java | 0 .../{ => src}/test/Players/SaboteurTest.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Controll/WaterCounterTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Fields/ActiveFields/CisternTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Fields/ActiveFields/PumpTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Fields/ActiveFields/SpringTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Fields/PipeTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Players/MechanicTest.java (100%) rename Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/{ => src}/test/Players/SaboteurTest.java (100%) diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Controll/WaterCounterTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Controll/WaterCounterTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Controll/WaterCounterTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/CisternTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/CisternTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/CisternTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/PumpTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/PumpTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/PumpTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/SpringTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/ActiveFields/SpringTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/ActiveFields/SpringTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/PipeTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Fields/PipeTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Fields/PipeTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Players/MechanicTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/MechanicTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Players/MechanicTest.java diff --git a/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java b/Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Players/SaboteurTest.java similarity index 100% rename from Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/test/Players/SaboteurTest.java rename to Sivatagi vizhalozatok uzemeltetese a gyakorlatban 2/src/test/Players/SaboteurTest.java From 68975d999dfdf2d86d2ba7051947cd0b22d0991b Mon Sep 17 00:00:00 2001 From: Marton Emese Date: Mon, 20 May 2024 20:57:44 +0200 Subject: [PATCH 4/5] UnitTest-doc --- doc/UnitTestCoverage.png | Bin 0 -> 78455 bytes doc/UnitTests.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 doc/UnitTestCoverage.png create mode 100644 doc/UnitTests.md diff --git a/doc/UnitTestCoverage.png b/doc/UnitTestCoverage.png new file mode 100644 index 0000000000000000000000000000000000000000..f45d6ae772c5208e8dd856d99ed3d59c0f3fc30d GIT binary patch literal 78455 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 C=73!Q literal 0 HcmV?d00001 diff --git a/doc/UnitTests.md b/doc/UnitTests.md new file mode 100644 index 0000000..cc6d6c2 --- /dev/null +++ b/doc/UnitTests.md @@ -0,0 +1,39 @@ +# Egységtesztek készítése/kiegészítése + tesztek kódlefedettségének mérése és ez alapján tesztkészlet bővítése - Dokumentáció + +Jelen fájl a választott projekthez készült Unit tesztek dokumentálására szolgál. + +## Tesztelt osztályok + +A játék azon osztályait teszteltem, melyek nem a grafikus megjelenítéshez tartoznak. Hét darab ilyen osztályt tartalmaz a projekt, melyek (a hozzájuk készített teszt osztályokkal) a következők voltak: + +- WaterCounter.java -> WaterCounterTest.java +- Cistern.java -> CisternTest.java +- Pump.java -> PumpTest.java +- Spring.java -> SpringTest.java +- Pipe.java -> PipeTest.java +- Mechanic.java -> MechanicTest.java +- Saboteur.java -> SaboteurTest.java + +Minden tesztelt osztály minden függvényéhez készítettem lgalább egy tesztet, figyelve arra, hogy az összes fontos esetet lefedjem ezekkel. + +## Unit tesztek + +A tesztek elkészítéséhez JUnit-ot használtam. Minden tesztelt osztályhoz egy külön tesztfájlt készítettem, melyben minden függvénynek dedikáltam legalább egy önálló tesztet a Unit tesztelés elveinek megfelelően. A feladat elvégzése során összesen 69 darab tesztet írtam. Ezek mindegyike jól lefut és a várt eredményeket adja. + +## Tesztlefedettség + +A JUnit segítségével a lefedettséget is tudtam mérni. Egy-egy futtatás után a lefedett részek zölddel, a nem lefedettek pirossal, a részben lefedettek pedig sárgával kerültek kiemelésre. Ez segített a megfelelő tesztelésben. Első körben törekedtem arra, hogy a tesztelt osztályok minden függvényéhez legyen egyetlen jól működő tesztem. Már ez is nagy kódlefedettséget eredményezett, de ezután a komplexebb és fontosabb függvények további, eddig kimaradt aleseteihez is írtam teszteket. Ezzel minden tesztelt osztály lefedettsége 80-90% körülre emelkedett, valahol a 100%-ot is eléri. + +A lefedettségek az alábbi ábrán tekinthetőek meg: + +

+

+ +Látható, hogy a tesztelt osztályok lefedettsége mindenhol elég nagy: +- WaterCounter.java: 100% +- Cistern.java: 82% +- Pump.java: 76,5% +- Spring.java: 81,7% +- Pipe.java: 97,8% +- Mechanic.java: 94,5% +- Saboteur.java: 100% \ No newline at end of file From 8d31f027a1191f5c8fc2d296a56fa22425236716 Mon Sep 17 00:00:00 2001 From: Marton Emese Date: Mon, 20 May 2024 21:06:23 +0200 Subject: [PATCH 5/5] UnitTest-doc-update --- doc/UnitTests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/UnitTests.md b/doc/UnitTests.md index cc6d6c2..1654395 100644 --- a/doc/UnitTests.md +++ b/doc/UnitTests.md @@ -14,7 +14,7 @@ A játék azon osztályait teszteltem, melyek nem a grafikus megjelenítéshez t - Mechanic.java -> MechanicTest.java - Saboteur.java -> SaboteurTest.java -Minden tesztelt osztály minden függvényéhez készítettem lgalább egy tesztet, figyelve arra, hogy az összes fontos esetet lefedjem ezekkel. +Minden tesztelt osztály minden függvényéhez készítettem legalább egy tesztet, figyelve arra, hogy az összes fontos esetet lefedjem ezekkel. ## Unit tesztek