|
|
@@ -0,0 +1,188 @@
|
|
|
+package eu.fibane.parkingtoll.core;
|
|
|
+
|
|
|
+import eu.fibane.parkingtoll.model.CarSlot;
|
|
|
+import eu.fibane.parkingtoll.model.Layout;
|
|
|
+import eu.fibane.parkingtoll.model.ParkingLot;
|
|
|
+import org.junit.jupiter.api.BeforeEach;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+
|
|
|
+import javax.swing.*;
|
|
|
+import java.security.SecureRandom;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.concurrent.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+
|
|
|
+class InMemoryPersistanceManagerTest {
|
|
|
+ private long ids = 0;
|
|
|
+ private final PersistanceManager manager = new InMemoryPersistanceManager();
|
|
|
+ private final SecureRandom random = new SecureRandom();
|
|
|
+ @BeforeEach
|
|
|
+ void clearDatabase() {
|
|
|
+ manager.clearDatabase();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testEmptyDatabase() {
|
|
|
+ assertEquals(0, manager.getAllParkingLots().size());
|
|
|
+ assertNull(manager.getParkingLotById(0L));
|
|
|
+ assertNull(manager.deleteParkingLot(getNewParkingLot()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void addParkingLotTest() {
|
|
|
+ ParkingLot parkingLot = getNewParkingLot();
|
|
|
+ //call the service
|
|
|
+ ParkingLot returnedParkingLot = manager.addParkingLot(parkingLot);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+
|
|
|
+ assertNotNull(returnedParkingLot);
|
|
|
+ assertNotNull(returnedParkingLot.getId());
|
|
|
+
|
|
|
+ //call again
|
|
|
+ parkingLot = getNewParkingLot();
|
|
|
+ returnedParkingLot = manager.addParkingLot(parkingLot);
|
|
|
+ assertNotNull(returnedParkingLot);
|
|
|
+ assertNotNull(returnedParkingLot.getId());
|
|
|
+ assertEquals(2, manager.getAllParkingLots().size());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private ParkingLot getNewParkingLot(){
|
|
|
+ ParkingLot parkingLot = new ParkingLot();
|
|
|
+ List<Layout> layouts = new ArrayList<>();
|
|
|
+ Layout layout = new Layout();
|
|
|
+ layout.setAvailable(random.nextLong());
|
|
|
+ layout.setName("Test Parking Lot " + random.nextLong());
|
|
|
+ layouts.add(layout);
|
|
|
+ layout = new Layout();
|
|
|
+ layout.setAvailable(random.nextLong());
|
|
|
+ layout.setName("Test Parking Lot " + random.nextLong());
|
|
|
+ layouts.add(layout);
|
|
|
+ parkingLot.setLayout(layouts);
|
|
|
+ return parkingLot;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void getAllParkingLots() {
|
|
|
+
|
|
|
+ List<ParkingLot> parkingLots = new ArrayList<>();
|
|
|
+ ParkingLot parkingLot;
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ parkingLot = getNewParkingLot();
|
|
|
+ parkingLots.add(parkingLot);
|
|
|
+ manager.addParkingLot(parkingLot);
|
|
|
+ }
|
|
|
+
|
|
|
+ ArrayList<ParkingLot> lots = new ArrayList<>(manager.getAllParkingLots());
|
|
|
+ assertEquals(10, lots.size());
|
|
|
+
|
|
|
+ for (int i = 0; i < parkingLots.size(); i++) {
|
|
|
+ assertEquals(parkingLots.get(i), lots.get(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void getParkingLotById() {
|
|
|
+ List<ParkingLot> parkingLots = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ parkingLots.add(getNewParkingLot());
|
|
|
+ }
|
|
|
+ for (ParkingLot parkingLot : parkingLots) {
|
|
|
+ manager.addParkingLot(parkingLot);
|
|
|
+ }
|
|
|
+
|
|
|
+ //Call service and check
|
|
|
+ for (ParkingLot parkingLot : parkingLots) {
|
|
|
+ assertEquals(parkingLot, manager.getParkingLotById(parkingLot.getId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void updateParkingLot() {
|
|
|
+ //first scenario, try to update an object that doesn't exist yet in database
|
|
|
+ ParkingLot parkingLot = getNewParkingLot();
|
|
|
+ assertEquals(0, manager.getAllParkingLots().size());
|
|
|
+ assertNull(parkingLot.getId());
|
|
|
+ parkingLot = manager.updateParkingLot(parkingLot);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+ assertNotNull(parkingLot.getId());
|
|
|
+
|
|
|
+ ParkingLot parkingLot2 = getNewParkingLot();
|
|
|
+ //set the id of parking 1
|
|
|
+ parkingLot2.setId(parkingLot.getId());
|
|
|
+ ParkingLot parkingLotUpdated = manager.updateParkingLot(parkingLot2);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+ assertEquals(parkingLotUpdated, parkingLot);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void deleteParkingLot() {
|
|
|
+ ParkingLot parkingLot = getNewParkingLot();
|
|
|
+ assertEquals(0, manager.getAllParkingLots().size());
|
|
|
+ manager.addParkingLot(parkingLot);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+
|
|
|
+ //call the service
|
|
|
+ ParkingLot result = manager.deleteParkingLot(parkingLot);
|
|
|
+ assertEquals(result,parkingLot);
|
|
|
+ assertEquals(0, manager.getAllParkingLots().size());
|
|
|
+
|
|
|
+ result = manager.deleteParkingLot(parkingLot);
|
|
|
+ assertNull(result);
|
|
|
+ assertEquals(0, manager.getAllParkingLots().size());
|
|
|
+
|
|
|
+ manager.addParkingLot(parkingLot);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+ //now try to delete something else
|
|
|
+ ParkingLot parkingLot1 = new ParkingLot();
|
|
|
+ parkingLot1.setId(parkingLot.getId() + 1);
|
|
|
+ result = manager.deleteParkingLot(parkingLot1);
|
|
|
+ assertEquals(1, manager.getAllParkingLots().size());
|
|
|
+ assertNull(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void testIDAllocation() throws ExecutionException, InterruptedException {
|
|
|
+ ExecutorService poolExecutor = Executors.newFixedThreadPool(10);
|
|
|
+
|
|
|
+
|
|
|
+ Callable<Void> myTask = () -> {
|
|
|
+ ParkingLot parkingLot;
|
|
|
+ for (int i = 0; i < 1000; i++) {
|
|
|
+ parkingLot = getNewParkingLot();
|
|
|
+ manager.addParkingLot(parkingLot);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ };
|
|
|
+
|
|
|
+ List<Callable<Void>> callables = new ArrayList<>();
|
|
|
+
|
|
|
+ for (int i = 0; i < 10; i++) {
|
|
|
+ callables.add(myTask);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<Future<Void>> futures = poolExecutor.invokeAll(callables);
|
|
|
+
|
|
|
+ //wait for finish
|
|
|
+ for (Future<Void> future : futures) {
|
|
|
+ future.get();
|
|
|
+ }
|
|
|
+
|
|
|
+ Collection<ParkingLot> parkingLots = manager.getAllParkingLots();
|
|
|
+ assertEquals(10_000, parkingLots.size());
|
|
|
+
|
|
|
+ Set<Long> ids = parkingLots.stream().map(ParkingLot::getId).collect(Collectors.toSet());
|
|
|
+ assertEquals(10_000,ids.size());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|