Java 11 migrate remaining (g,h,i) (#1116)
* Moves game-loop to Java 11 * Moves guarded-suspension to Java 11 * Moves half-sync-half-async to Java 11 * Moves hexagonal to Java 11 * Moves intercepting-filter to Java 11 * Moves interpreter to Java 11 * Moves iterator to Java 11
This commit is contained in:
parent
7d0a5c0edb
commit
f835d3d516
@ -70,7 +70,7 @@ public abstract class GameLoop {
|
||||
* @return {@code true} if the game is running.
|
||||
*/
|
||||
public boolean isGameRunning() {
|
||||
return status == GameStatus.RUNNING ? true : false;
|
||||
return status == GameStatus.RUNNING;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,7 +80,7 @@ public abstract class GameLoop {
|
||||
*/
|
||||
protected void processInput() {
|
||||
try {
|
||||
int lag = new Random().nextInt(200) + 50;
|
||||
var lag = new Random().nextInt(200) + 50;
|
||||
Thread.sleep(lag);
|
||||
} catch (InterruptedException e) {
|
||||
logger.error(e.getMessage());
|
||||
|
@ -32,8 +32,7 @@ public class AppTest {
|
||||
|
||||
@Test
|
||||
public void testMain() {
|
||||
String[] args = {};
|
||||
new App().main(args);
|
||||
new App().main(new String[]{});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ public class GameLoopTest {
|
||||
|
||||
@Test
|
||||
public void testIsGameRunning() {
|
||||
Assert.assertEquals(false, gameLoop.isGameRunning());
|
||||
Assert.assertFalse(gameLoop.isGameRunning());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,7 +23,6 @@
|
||||
|
||||
package com.iluwatar.guarded.suspension;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@ -45,14 +44,11 @@ public class App {
|
||||
* @param args - command line args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
GuardedQueue guardedQueue = new GuardedQueue();
|
||||
ExecutorService executorService = Executors.newFixedThreadPool(3);
|
||||
var guardedQueue = new GuardedQueue();
|
||||
var executorService = Executors.newFixedThreadPool(3);
|
||||
|
||||
//here we create first thread which is supposed to get from guardedQueue
|
||||
executorService.execute(() -> {
|
||||
guardedQueue.get();
|
||||
}
|
||||
);
|
||||
executorService.execute(guardedQueue::get);
|
||||
|
||||
// here we wait two seconds to show that the thread which is trying
|
||||
// to get from guardedQueue will be waiting
|
||||
@ -63,10 +59,7 @@ public class App {
|
||||
}
|
||||
// now we execute second thread which will put number to guardedQueue
|
||||
// and notify first thread that it could get
|
||||
executorService.execute(() -> {
|
||||
guardedQueue.put(20);
|
||||
}
|
||||
);
|
||||
executorService.execute(() -> guardedQueue.put(20));
|
||||
executorService.shutdown();
|
||||
try {
|
||||
executorService.awaitTermination(30, TimeUnit.SECONDS);
|
||||
|
@ -23,13 +23,11 @@
|
||||
|
||||
package com.iluwatar.guarded.suspension;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Test for Guarded Queue
|
||||
@ -39,8 +37,8 @@ public class GuardedQueueTest {
|
||||
|
||||
@Test
|
||||
public void testGet() {
|
||||
GuardedQueue g = new GuardedQueue();
|
||||
ExecutorService executorService = Executors.newFixedThreadPool(2);
|
||||
var g = new GuardedQueue();
|
||||
var executorService = Executors.newFixedThreadPool(2);
|
||||
executorService.submit(() -> value = g.get());
|
||||
executorService.submit(() -> g.put(10));
|
||||
executorService.shutdown();
|
||||
@ -54,7 +52,7 @@ public class GuardedQueueTest {
|
||||
|
||||
@Test
|
||||
public void testPut() {
|
||||
GuardedQueue g = new GuardedQueue();
|
||||
var g = new GuardedQueue();
|
||||
g.put(12);
|
||||
assertEquals(Integer.valueOf(12), g.get());
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ public class App {
|
||||
* @param args command line args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
AsynchronousService service = new AsynchronousService(new LinkedBlockingQueue<>());
|
||||
var service = new AsynchronousService(new LinkedBlockingQueue<>());
|
||||
/*
|
||||
* A new task to calculate sum is received but as this is main thread, it should not block. So
|
||||
* it passes it to the asynchronous task layer to compute and proceeds with handling other
|
||||
|
@ -25,12 +25,8 @@ package com.iluwatar.halfsynchalfasync;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
/**
|
||||
*
|
||||
* Application test
|
||||
*
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
|
@ -57,13 +57,13 @@ public class AsynchronousServiceTest {
|
||||
|
||||
@Test
|
||||
public void testPerfectExecution() throws Exception {
|
||||
final Object result = new Object();
|
||||
final var result = new Object();
|
||||
when(task.call()).thenReturn(result);
|
||||
service.execute(task);
|
||||
|
||||
verify(task, timeout(2000)).onPostCall(eq(result));
|
||||
|
||||
final InOrder inOrder = inOrder(task);
|
||||
final var inOrder = inOrder(task);
|
||||
inOrder.verify(task, times(1)).onPreCall();
|
||||
inOrder.verify(task, times(1)).call();
|
||||
inOrder.verify(task, times(1)).onPostCall(eq(result));
|
||||
@ -73,13 +73,13 @@ public class AsynchronousServiceTest {
|
||||
|
||||
@Test
|
||||
public void testCallException() throws Exception {
|
||||
final IOException exception = new IOException();
|
||||
final var exception = new IOException();
|
||||
when(task.call()).thenThrow(exception);
|
||||
service.execute(task);
|
||||
|
||||
verify(task, timeout(2000)).onError(eq(exception));
|
||||
|
||||
final InOrder inOrder = inOrder(task);
|
||||
final var inOrder = inOrder(task);
|
||||
inOrder.verify(task, times(1)).onPreCall();
|
||||
inOrder.verify(task, times(1)).call();
|
||||
inOrder.verify(task, times(1)).onError(exception);
|
||||
@ -89,13 +89,13 @@ public class AsynchronousServiceTest {
|
||||
|
||||
@Test
|
||||
public void testPreCallException() {
|
||||
final IllegalStateException exception = new IllegalStateException();
|
||||
final var exception = new IllegalStateException();
|
||||
doThrow(exception).when(task).onPreCall();
|
||||
service.execute(task);
|
||||
|
||||
verify(task, timeout(2000)).onError(eq(exception));
|
||||
|
||||
final InOrder inOrder = inOrder(task);
|
||||
final var inOrder = inOrder(task);
|
||||
inOrder.verify(task, times(1)).onPreCall();
|
||||
inOrder.verify(task, times(1)).onError(exception);
|
||||
|
||||
|
@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.domain.LotteryAdministration;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryTestingModule;
|
||||
@ -63,14 +62,14 @@ public class App {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
Injector injector = Guice.createInjector(new LotteryTestingModule());
|
||||
var injector = Guice.createInjector(new LotteryTestingModule());
|
||||
|
||||
// start new lottery round
|
||||
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class);
|
||||
var administration = injector.getInstance(LotteryAdministration.class);
|
||||
administration.resetLottery();
|
||||
|
||||
// submit some lottery tickets
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
SampleData.submitTickets(service, 20);
|
||||
|
||||
// perform lottery
|
||||
|
@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal.administration;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.domain.LotteryAdministration;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryModule;
|
||||
@ -46,17 +45,16 @@ public class ConsoleAdministration {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
Injector injector = Guice.createInjector(new LotteryModule());
|
||||
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class);
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
var injector = Guice.createInjector(new LotteryModule());
|
||||
var administration = injector.getInstance(LotteryAdministration.class);
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
SampleData.submitTickets(service, 20);
|
||||
ConsoleAdministrationSrv consoleAdministration =
|
||||
new ConsoleAdministrationSrvImpl(administration, LOGGER);
|
||||
try (Scanner scanner = new Scanner(System.in)) {
|
||||
boolean exit = false;
|
||||
var consoleAdministration = new ConsoleAdministrationSrvImpl(administration, LOGGER);
|
||||
try (var scanner = new Scanner(System.in)) {
|
||||
var exit = false;
|
||||
while (!exit) {
|
||||
printMainMenu();
|
||||
String cmd = readString(scanner);
|
||||
var cmd = readString(scanner);
|
||||
if ("1".equals(cmd)) {
|
||||
consoleAdministration.getAllSubmittedTickets();
|
||||
} else if ("2".equals(cmd)) {
|
||||
|
@ -50,7 +50,7 @@ public class ConsoleAdministrationSrvImpl implements ConsoleAdministrationSrv {
|
||||
|
||||
@Override
|
||||
public void performLottery() {
|
||||
LotteryNumbers numbers = administration.performLottery();
|
||||
var numbers = administration.performLottery();
|
||||
logger.info("The winning numbers: {}", numbers.getNumbersAsString());
|
||||
logger.info("Time to reset the database for next round, eh?");
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import com.mongodb.client.model.UpdateOptions;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.bson.Document;
|
||||
|
||||
/**
|
||||
@ -107,30 +106,31 @@ public class MongoBank implements WireTransfers {
|
||||
|
||||
@Override
|
||||
public void setFunds(String bankAccount, int amount) {
|
||||
Document search = new Document("_id", bankAccount);
|
||||
Document update = new Document("_id", bankAccount).append("funds", amount);
|
||||
accountsCollection
|
||||
.updateOne(search, new Document("$set", update), new UpdateOptions().upsert(true));
|
||||
var search = new Document("_id", bankAccount);
|
||||
var update = new Document("_id", bankAccount).append("funds", amount);
|
||||
var updateOptions = new UpdateOptions().upsert(true);
|
||||
accountsCollection.updateOne(search, new Document("$set", update), updateOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFunds(String bankAccount) {
|
||||
Document search = new Document("_id", bankAccount);
|
||||
List<Document> results = accountsCollection.find(search).limit(1).into(new ArrayList<>());
|
||||
if (results.size() > 0) {
|
||||
return results.get(0).getInteger("funds");
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
return accountsCollection
|
||||
.find(new Document("_id", bankAccount))
|
||||
.limit(1)
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(x -> x.getInteger("funds"))
|
||||
.orElse(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean transferFunds(int amount, String sourceAccount, String destinationAccount) {
|
||||
int sourceFunds = getFunds(sourceAccount);
|
||||
var sourceFunds = getFunds(sourceAccount);
|
||||
if (sourceFunds < amount) {
|
||||
return false;
|
||||
} else {
|
||||
int destFunds = getFunds(destinationAccount);
|
||||
var destFunds = getFunds(destinationAccount);
|
||||
setFunds(sourceAccount, sourceFunds - amount);
|
||||
setFunds(destinationAccount, destFunds + amount);
|
||||
return true;
|
||||
|
@ -38,17 +38,12 @@ public class InMemoryTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicket> findById(LotteryTicketId id) {
|
||||
LotteryTicket ticket = tickets.get(id);
|
||||
if (ticket == null) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
return Optional.of(ticket);
|
||||
}
|
||||
return Optional.ofNullable(tickets.get(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicketId> save(LotteryTicket ticket) {
|
||||
LotteryTicketId id = new LotteryTicketId();
|
||||
var id = new LotteryTicketId();
|
||||
tickets.put(id, ticket);
|
||||
return Optional.of(id);
|
||||
}
|
||||
|
@ -32,11 +32,9 @@ import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import org.bson.Document;
|
||||
|
||||
@ -95,7 +93,7 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
}
|
||||
|
||||
private void initCounters() {
|
||||
Document doc = new Document("_id", "ticketId").append("seq", 1);
|
||||
var doc = new Document("_id", "ticketId").append("seq", 1);
|
||||
countersCollection.insertOne(doc);
|
||||
}
|
||||
|
||||
@ -105,10 +103,10 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
* @return next ticket id
|
||||
*/
|
||||
public int getNextId() {
|
||||
Document find = new Document("_id", "ticketId");
|
||||
Document increase = new Document("seq", 1);
|
||||
Document update = new Document("$inc", increase);
|
||||
Document result = countersCollection.findOneAndUpdate(find, update);
|
||||
var find = new Document("_id", "ticketId");
|
||||
var increase = new Document("seq", 1);
|
||||
var update = new Document("$inc", increase);
|
||||
var result = countersCollection.findOneAndUpdate(find, update);
|
||||
return result.getInteger("seq");
|
||||
}
|
||||
|
||||
@ -132,20 +130,19 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicket> findById(LotteryTicketId id) {
|
||||
Document find = new Document("ticketId", id.getId());
|
||||
List<Document> results = ticketsCollection.find(find).limit(1).into(new ArrayList<>());
|
||||
if (results.size() > 0) {
|
||||
LotteryTicket lotteryTicket = docToTicket(results.get(0));
|
||||
return Optional.of(lotteryTicket);
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
return ticketsCollection
|
||||
.find(new Document("ticketId", id.getId()))
|
||||
.limit(1)
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(this::docToTicket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicketId> save(LotteryTicket ticket) {
|
||||
int ticketId = getNextId();
|
||||
Document doc = new Document("ticketId", ticketId);
|
||||
var ticketId = getNextId();
|
||||
var doc = new Document("ticketId", ticketId);
|
||||
doc.put("email", ticket.getPlayerDetails().getEmail());
|
||||
doc.put("bank", ticket.getPlayerDetails().getBankAccount());
|
||||
doc.put("phone", ticket.getPlayerDetails().getPhoneNumber());
|
||||
@ -156,13 +153,12 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Map<LotteryTicketId, LotteryTicket> findAll() {
|
||||
Map<LotteryTicketId, LotteryTicket> map = new HashMap<>();
|
||||
List<Document> docs = ticketsCollection.find(new Document()).into(new ArrayList<>());
|
||||
for (Document doc : docs) {
|
||||
LotteryTicket lotteryTicket = docToTicket(doc);
|
||||
map.put(lotteryTicket.getId(), lotteryTicket);
|
||||
}
|
||||
return map;
|
||||
return ticketsCollection
|
||||
.find(new Document())
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.map(this::docToTicket)
|
||||
.collect(Collectors.toMap(LotteryTicket::getId, Function.identity()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -171,13 +167,13 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
}
|
||||
|
||||
private LotteryTicket docToTicket(Document doc) {
|
||||
PlayerDetails playerDetails = new PlayerDetails(doc.getString("email"), doc.getString("bank"),
|
||||
var playerDetails = new PlayerDetails(doc.getString("email"), doc.getString("bank"),
|
||||
doc.getString("phone"));
|
||||
Set<Integer> numbers = Arrays.stream(doc.getString("numbers").split(","))
|
||||
var numbers = Arrays.stream(doc.getString("numbers").split(","))
|
||||
.map(Integer::parseInt)
|
||||
.collect(Collectors.toSet());
|
||||
LotteryNumbers lotteryNumbers = LotteryNumbers.create(numbers);
|
||||
return new LotteryTicket(new LotteryTicketId(doc
|
||||
.getInteger("ticketId")), playerDetails, lotteryNumbers);
|
||||
var lotteryNumbers = LotteryNumbers.create(numbers);
|
||||
var ticketId = new LotteryTicketId(doc.getInteger("ticketId"));
|
||||
return new LotteryTicket(ticketId, playerDetails, lotteryNumbers);
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,9 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.PRIZE_AMOUNT;
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.SERVICE_BANK_ACCOUNT;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
@ -60,23 +63,21 @@ public class LotteryAdministration {
|
||||
* Draw lottery numbers.
|
||||
*/
|
||||
public LotteryNumbers performLottery() {
|
||||
LotteryNumbers numbers = LotteryNumbers.createRandom();
|
||||
Map<LotteryTicketId, LotteryTicket> tickets = getAllSubmittedTickets();
|
||||
for (LotteryTicketId id : tickets.keySet()) {
|
||||
LotteryTicketCheckResult result = LotteryUtils.checkTicketForPrize(repository, id, numbers);
|
||||
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) {
|
||||
boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT,
|
||||
LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails()
|
||||
.getBankAccount());
|
||||
if (transferred) {
|
||||
notifications
|
||||
.ticketWon(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
|
||||
var numbers = LotteryNumbers.createRandom();
|
||||
var tickets = getAllSubmittedTickets();
|
||||
for (var id : tickets.keySet()) {
|
||||
var lotteryTicket = tickets.get(id);
|
||||
var playerDetails = lotteryTicket.getPlayerDetails();
|
||||
var playerAccount = playerDetails.getBankAccount();
|
||||
var result = LotteryUtils.checkTicketForPrize(repository, id, numbers).getResult();
|
||||
if (result == LotteryTicketCheckResult.CheckResult.WIN_PRIZE) {
|
||||
if (wireTransfers.transferFunds(PRIZE_AMOUNT, SERVICE_BANK_ACCOUNT, playerAccount)) {
|
||||
notifications.ticketWon(playerDetails, PRIZE_AMOUNT);
|
||||
} else {
|
||||
notifications
|
||||
.prizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
|
||||
notifications.prizeError(playerDetails, PRIZE_AMOUNT);
|
||||
}
|
||||
} else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) {
|
||||
notifications.ticketDidNotWin(tickets.get(id).getPlayerDetails());
|
||||
} else if (result == LotteryTicketCheckResult.CheckResult.NO_PRIZE) {
|
||||
notifications.ticketDidNotWin(playerDetails);
|
||||
}
|
||||
}
|
||||
return numbers;
|
||||
|
@ -99,9 +99,9 @@ public class LotteryNumbers {
|
||||
*/
|
||||
private void generateRandomNumbers() {
|
||||
numbers.clear();
|
||||
RandomNumberGenerator generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
|
||||
var generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
|
||||
while (numbers.size() < NUM_NUMBERS) {
|
||||
int num = generator.nextInt();
|
||||
var num = generator.nextInt();
|
||||
numbers.add(num);
|
||||
}
|
||||
}
|
||||
@ -141,8 +141,8 @@ public class LotteryNumbers {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((numbers == null) ? 0 : numbers.hashCode());
|
||||
return result;
|
||||
}
|
||||
@ -158,14 +158,11 @@ public class LotteryNumbers {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryNumbers other = (LotteryNumbers) obj;
|
||||
var other = (LotteryNumbers) obj;
|
||||
if (numbers == null) {
|
||||
if (other.numbers != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!numbers.equals(other.numbers)) {
|
||||
return false;
|
||||
return other.numbers == null;
|
||||
} else {
|
||||
return numbers.equals(other.numbers);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,9 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.SERVICE_BANK_ACCOUNT;
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.TICKET_PRIZE;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
@ -53,15 +56,16 @@ public class LotteryService {
|
||||
* Submit lottery ticket to participate in the lottery.
|
||||
*/
|
||||
public Optional<LotteryTicketId> submitTicket(LotteryTicket ticket) {
|
||||
boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE,
|
||||
ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT);
|
||||
var playerDetails = ticket.getPlayerDetails();
|
||||
var playerAccount = playerDetails.getBankAccount();
|
||||
var result = wireTransfers.transferFunds(TICKET_PRIZE, playerAccount, SERVICE_BANK_ACCOUNT);
|
||||
if (!result) {
|
||||
notifications.ticketSubmitError(ticket.getPlayerDetails());
|
||||
notifications.ticketSubmitError(playerDetails);
|
||||
return Optional.empty();
|
||||
}
|
||||
Optional<LotteryTicketId> optional = repository.save(ticket);
|
||||
var optional = repository.save(ticket);
|
||||
if (optional.isPresent()) {
|
||||
notifications.ticketSubmitted(ticket.getPlayerDetails());
|
||||
notifications.ticketSubmitted(playerDetails);
|
||||
}
|
||||
return optional;
|
||||
}
|
||||
|
@ -82,8 +82,8 @@ public class LotteryTicket {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((lotteryNumbers == null) ? 0 : lotteryNumbers.hashCode());
|
||||
result = prime * result + ((playerDetails == null) ? 0 : playerDetails.hashCode());
|
||||
return result;
|
||||
@ -100,7 +100,7 @@ public class LotteryTicket {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryTicket other = (LotteryTicket) obj;
|
||||
var other = (LotteryTicket) obj;
|
||||
if (lotteryNumbers == null) {
|
||||
if (other.lotteryNumbers != null) {
|
||||
return false;
|
||||
@ -109,12 +109,9 @@ public class LotteryTicket {
|
||||
return false;
|
||||
}
|
||||
if (playerDetails == null) {
|
||||
if (other.playerDetails != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!playerDetails.equals(other.playerDetails)) {
|
||||
return false;
|
||||
return other.playerDetails == null;
|
||||
} else {
|
||||
return playerDetails.equals(other.playerDetails);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -76,8 +76,8 @@ public class LotteryTicketCheckResult {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((checkResult == null) ? 0 : checkResult.hashCode());
|
||||
result = prime * result + prizeAmount;
|
||||
return result;
|
||||
@ -94,7 +94,7 @@ public class LotteryTicketCheckResult {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryTicketCheckResult other = (LotteryTicketCheckResult) obj;
|
||||
var other = (LotteryTicketCheckResult) obj;
|
||||
return checkResult == other.checkResult && prizeAmount == other.prizeAmount;
|
||||
}
|
||||
}
|
||||
|
@ -59,10 +59,9 @@ public class LotteryTicketId {
|
||||
return false;
|
||||
}
|
||||
|
||||
LotteryTicketId that = (LotteryTicketId) o;
|
||||
var that = (LotteryTicketId) o;
|
||||
|
||||
return id == that.id;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -25,7 +25,6 @@ package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Lottery utilities.
|
||||
@ -43,7 +42,7 @@ public class LotteryUtils {
|
||||
LotteryTicketId id,
|
||||
LotteryNumbers winningNumbers
|
||||
) {
|
||||
Optional<LotteryTicket> optional = repository.findById(id);
|
||||
var optional = repository.findById(id);
|
||||
if (optional.isPresent()) {
|
||||
if (optional.get().getNumbers().equals(winningNumbers)) {
|
||||
return new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 1000);
|
||||
|
@ -77,8 +77,8 @@ public class PlayerDetails {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((bankAccountNumber == null) ? 0 : bankAccountNumber.hashCode());
|
||||
result = prime * result + ((emailAddress == null) ? 0 : emailAddress.hashCode());
|
||||
result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode());
|
||||
@ -96,7 +96,7 @@ public class PlayerDetails {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
PlayerDetails other = (PlayerDetails) obj;
|
||||
var other = (PlayerDetails) obj;
|
||||
if (bankAccountNumber == null) {
|
||||
if (other.bankAccountNumber != null) {
|
||||
return false;
|
||||
@ -112,12 +112,9 @@ public class PlayerDetails {
|
||||
return false;
|
||||
}
|
||||
if (phoneNumber == null) {
|
||||
if (other.phoneNumber != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!phoneNumber.equals(other.phoneNumber)) {
|
||||
return false;
|
||||
return other.phoneNumber == null;
|
||||
} else {
|
||||
return phoneNumber.equals(other.phoneNumber);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketSubmitted(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document
|
||||
@ -118,7 +118,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketSubmitError(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", "Lottery ticket could not be submitted because lack of funds.");
|
||||
@ -128,7 +128,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketDidNotWin(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", "Lottery ticket was checked and unfortunately did not win this time.");
|
||||
@ -138,7 +138,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketWon(PlayerDetails details, int prizeAmount) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", String
|
||||
@ -150,7 +150,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void prizeError(PlayerDetails details, int prizeAmount) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", String
|
||||
|
@ -42,9 +42,8 @@ public class StdOutEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketDidNotWin(PlayerDetails details) {
|
||||
LOGGER
|
||||
.info("Lottery ticket for {} was checked and unfortunately did not win this time.", details
|
||||
.getEmail());
|
||||
LOGGER.info("Lottery ticket for {} was checked and unfortunately did not win this time.",
|
||||
details.getEmail());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -55,9 +54,8 @@ public class StdOutEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void prizeError(PlayerDetails details, int prizeAmount) {
|
||||
LOGGER
|
||||
.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of"
|
||||
+ " {} failed.", details.getEmail(), prizeAmount);
|
||||
LOGGER.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of"
|
||||
+ " {} failed.", details.getEmail(), prizeAmount);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -38,12 +38,12 @@ public class MongoConnectionPropertiesLoader {
|
||||
* Try to load connection properties from file. Fall back to default connection properties.
|
||||
*/
|
||||
public static void load() {
|
||||
String host = DEFAULT_HOST;
|
||||
int port = DEFAULT_PORT;
|
||||
String path = System.getProperty("hexagonal.properties.path");
|
||||
Properties properties = new Properties();
|
||||
var host = DEFAULT_HOST;
|
||||
var port = DEFAULT_PORT;
|
||||
var path = System.getProperty("hexagonal.properties.path");
|
||||
var properties = new Properties();
|
||||
if (path != null) {
|
||||
try (FileInputStream fin = new FileInputStream(path)) {
|
||||
try (var fin = new FileInputStream(path)) {
|
||||
properties.load(fin);
|
||||
host = properties.getProperty("mongo-host");
|
||||
port = Integer.parseInt(properties.getProperty("mongo-port"));
|
||||
|
@ -30,8 +30,10 @@ import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicket;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
import java.util.AbstractMap.SimpleEntry;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Utilities for creating sample lottery tickets.
|
||||
@ -83,26 +85,28 @@ public class SampleData {
|
||||
new PlayerDetails("xavier@google.com", "143-947", "+375245"),
|
||||
new PlayerDetails("harriet@google.com", "842-404", "+131243252")
|
||||
);
|
||||
InMemoryBank wireTransfers = new InMemoryBank();
|
||||
for (PlayerDetails player : PLAYERS) {
|
||||
wireTransfers.setFunds(player.getBankAccount(),
|
||||
RANDOM.nextInt(LotteryConstants.PLAYER_MAX_BALANCE));
|
||||
}
|
||||
var wireTransfers = new InMemoryBank();
|
||||
PLAYERS.stream()
|
||||
.map(PlayerDetails::getBankAccount)
|
||||
.map(e -> new SimpleEntry<>(e, RANDOM.nextInt(LotteryConstants.PLAYER_MAX_BALANCE)))
|
||||
.collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue))
|
||||
.forEach(wireTransfers::setFunds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts lottery tickets into the database based on the sample data.
|
||||
*/
|
||||
public static void submitTickets(LotteryService lotteryService, int numTickets) {
|
||||
for (int i = 0; i < numTickets; i++) {
|
||||
LotteryTicket ticket = new LotteryTicket(new LotteryTicketId(),
|
||||
getRandomPlayerDetails(), LotteryNumbers.createRandom());
|
||||
for (var i = 0; i < numTickets; i++) {
|
||||
var randomPlayerDetails = getRandomPlayerDetails();
|
||||
var lotteryNumbers = LotteryNumbers.createRandom();
|
||||
var lotteryTicketId = new LotteryTicketId();
|
||||
var ticket = new LotteryTicket(lotteryTicketId, randomPlayerDetails, lotteryNumbers);
|
||||
lotteryService.submitTicket(ticket);
|
||||
}
|
||||
}
|
||||
|
||||
private static PlayerDetails getRandomPlayerDetails() {
|
||||
int idx = RANDOM.nextInt(PLAYERS.size());
|
||||
return PLAYERS.get(idx);
|
||||
return PLAYERS.get(RANDOM.nextInt(PLAYERS.size()));
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal.service;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryModule;
|
||||
@ -45,15 +44,15 @@ public class ConsoleLottery {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
Injector injector = Guice.createInjector(new LotteryModule());
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
WireTransfers bank = injector.getInstance(WireTransfers.class);
|
||||
var injector = Guice.createInjector(new LotteryModule());
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
var bank = injector.getInstance(WireTransfers.class);
|
||||
try (Scanner scanner = new Scanner(System.in)) {
|
||||
boolean exit = false;
|
||||
var exit = false;
|
||||
while (!exit) {
|
||||
printMainMenu();
|
||||
String cmd = readString(scanner);
|
||||
LotteryConsoleService lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER);
|
||||
var cmd = readString(scanner);
|
||||
var lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER);
|
||||
if ("1".equals(cmd)) {
|
||||
lotteryConsoleService.queryLotteryAccountFunds(bank, scanner);
|
||||
} else if ("2".equals(cmd)) {
|
||||
|
@ -31,10 +31,7 @@ import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
@ -55,20 +52,18 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void checkTicket(LotteryService service, Scanner scanner) {
|
||||
logger.info("What is the ID of the lottery ticket?");
|
||||
String id = readString(scanner);
|
||||
var id = readString(scanner);
|
||||
logger.info("Give the 4 comma separated winning numbers?");
|
||||
String numbers = readString(scanner);
|
||||
var numbers = readString(scanner);
|
||||
try {
|
||||
String[] parts = numbers.split(",");
|
||||
Set<Integer> winningNumbers = new HashSet<>();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
winningNumbers.add(Integer.parseInt(parts[i]));
|
||||
}
|
||||
var winningNumbers = Arrays.stream(numbers.split(","))
|
||||
.map(Integer::parseInt)
|
||||
.limit(4)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
final LotteryTicketId lotteryTicketId = new LotteryTicketId(Integer.parseInt(id));
|
||||
final LotteryNumbers lotteryNumbers = LotteryNumbers.create(winningNumbers);
|
||||
LotteryTicketCheckResult result =
|
||||
service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
|
||||
final var lotteryTicketId = new LotteryTicketId(Integer.parseInt(id));
|
||||
final var lotteryNumbers = LotteryNumbers.create(winningNumbers);
|
||||
var result = service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
|
||||
|
||||
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) {
|
||||
logger.info("Congratulations! The lottery ticket has won!");
|
||||
@ -85,26 +80,24 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void submitTicket(LotteryService service, Scanner scanner) {
|
||||
logger.info("What is your email address?");
|
||||
String email = readString(scanner);
|
||||
var email = readString(scanner);
|
||||
logger.info("What is your bank account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("What is your phone number?");
|
||||
String phone = readString(scanner);
|
||||
PlayerDetails details = new PlayerDetails(email, account, phone);
|
||||
var phone = readString(scanner);
|
||||
var details = new PlayerDetails(email, account, phone);
|
||||
logger.info("Give 4 comma separated lottery numbers?");
|
||||
String numbers = readString(scanner);
|
||||
var numbers = readString(scanner);
|
||||
try {
|
||||
String[] parts = numbers.split(",");
|
||||
Set<Integer> chosen = Arrays.stream(parts).map(Integer::parseInt).collect(Collectors.toSet());
|
||||
LotteryNumbers lotteryNumbers = LotteryNumbers.create(chosen);
|
||||
LotteryTicket lotteryTicket =
|
||||
new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers);
|
||||
Optional<LotteryTicketId> id = service.submitTicket(lotteryTicket);
|
||||
if (id.isPresent()) {
|
||||
logger.info("Submitted lottery ticket with id: {}", id.get());
|
||||
} else {
|
||||
logger.info("Failed submitting lottery ticket - please try again.");
|
||||
}
|
||||
var chosen = Arrays.stream(numbers.split(","))
|
||||
.map(Integer::parseInt)
|
||||
.collect(Collectors.toSet());
|
||||
var lotteryNumbers = LotteryNumbers.create(chosen);
|
||||
var lotteryTicket = new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers);
|
||||
service.submitTicket(lotteryTicket).ifPresentOrElse(
|
||||
(id) -> logger.info("Submitted lottery ticket with id: {}", id),
|
||||
() -> logger.info("Failed submitting lottery ticket - please try again.")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
logger.info("Failed submitting lottery ticket - please try again.");
|
||||
}
|
||||
@ -113,9 +106,9 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void addFundsToLotteryAccount(WireTransfers bank, Scanner scanner) {
|
||||
logger.info("What is the account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("How many credits do you want to deposit?");
|
||||
String amount = readString(scanner);
|
||||
var amount = readString(scanner);
|
||||
bank.setFunds(account, Integer.parseInt(amount));
|
||||
logger.info("The account {} now has {} credits.", account, bank.getFunds(account));
|
||||
}
|
||||
@ -123,7 +116,7 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void queryLotteryAccountFunds(WireTransfers bank, Scanner scanner) {
|
||||
logger.info("What is the account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("The account {} has {} credits.", account, bank.getFunds(account));
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,6 @@ class AppTest {
|
||||
|
||||
@Test
|
||||
void testApp() {
|
||||
String[] args = {};
|
||||
App.main(args);
|
||||
App.main(new String[]{});
|
||||
}
|
||||
}
|
||||
|
@ -23,20 +23,18 @@
|
||||
|
||||
package com.iluwatar.hexagonal.banking;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tests for banking
|
||||
*
|
||||
*/
|
||||
class InMemoryBankTest {
|
||||
|
||||
private final WireTransfers bank = new InMemoryBank();
|
||||
|
||||
|
||||
@Test
|
||||
void testInit() {
|
||||
assertEquals(0, bank.getFunds("foo"));
|
||||
|
@ -23,14 +23,14 @@
|
||||
|
||||
package com.iluwatar.hexagonal.banking;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader;
|
||||
import com.mongodb.MongoClient;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* Tests for Mongo banking adapter
|
||||
*/
|
||||
@ -45,7 +45,7 @@ class MongoBankTest {
|
||||
@BeforeEach
|
||||
void init() {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
var mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
Integer.parseInt(System.getProperty("mongo-port")));
|
||||
mongoClient.dropDatabase(TEST_DB);
|
||||
mongoClient.close();
|
||||
|
@ -23,40 +23,34 @@
|
||||
|
||||
package com.iluwatar.hexagonal.database;
|
||||
|
||||
import java.util.Optional;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicket;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.test.LotteryTestUtils;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tests for {@link LotteryTicketRepository}
|
||||
*
|
||||
*/
|
||||
class InMemoryTicketRepositoryTest {
|
||||
|
||||
private final LotteryTicketRepository repository = new InMemoryTicketRepository();
|
||||
|
||||
|
||||
@BeforeEach
|
||||
void clear() {
|
||||
repository.deleteAll();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testCrudOperations() {
|
||||
LotteryTicketRepository repository = new InMemoryTicketRepository();
|
||||
var repository = new InMemoryTicketRepository();
|
||||
assertTrue(repository.findAll().isEmpty());
|
||||
LotteryTicket ticket = LotteryTestUtils.createLotteryTicket();
|
||||
Optional<LotteryTicketId> id = repository.save(ticket);
|
||||
var ticket = LotteryTestUtils.createLotteryTicket();
|
||||
var id = repository.save(ticket);
|
||||
assertTrue(id.isPresent());
|
||||
assertEquals(1, repository.findAll().size());
|
||||
Optional<LotteryTicket> optionalTicket = repository.findById(id.get());
|
||||
var optionalTicket = repository.findById(id.get());
|
||||
assertTrue(optionalTicket.isPresent());
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,9 @@
|
||||
|
||||
package com.iluwatar.hexagonal.database;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.iluwatar.hexagonal.domain.LotteryNumbers;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicket;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
@ -33,11 +36,6 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests for Mongo based ticket repository
|
||||
*/
|
||||
@ -53,7 +51,7 @@ class MongoTicketRepositoryTest {
|
||||
@BeforeEach
|
||||
void init() {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
var mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
Integer.parseInt(System.getProperty("mongo-port")));
|
||||
mongoClient.dropDatabase(TEST_DB);
|
||||
mongoClient.close();
|
||||
@ -77,16 +75,16 @@ class MongoTicketRepositoryTest {
|
||||
@Test
|
||||
void testCrudOperations() {
|
||||
// create new lottery ticket and save it
|
||||
PlayerDetails details = new PlayerDetails("foo@bar.com", "123-123", "07001234");
|
||||
LotteryNumbers random = LotteryNumbers.createRandom();
|
||||
LotteryTicket original = new LotteryTicket(new LotteryTicketId(), details, random);
|
||||
Optional<LotteryTicketId> saved = repository.save(original);
|
||||
var details = new PlayerDetails("foo@bar.com", "123-123", "07001234");
|
||||
var random = LotteryNumbers.createRandom();
|
||||
var original = new LotteryTicket(new LotteryTicketId(), details, random);
|
||||
var saved = repository.save(original);
|
||||
assertEquals(1, repository.getTicketsCollection().count());
|
||||
assertTrue(saved.isPresent());
|
||||
// fetch the saved lottery ticket from database and check its contents
|
||||
Optional<LotteryTicket> found = repository.findById(saved.get());
|
||||
var found = repository.findById(saved.get());
|
||||
assertTrue(found.isPresent());
|
||||
LotteryTicket ticket = found.get();
|
||||
var ticket = found.get();
|
||||
assertEquals("foo@bar.com", ticket.getPlayerDetails().getEmail());
|
||||
assertEquals("123-123", ticket.getPlayerDetails().getBankAccount());
|
||||
assertEquals("07001234", ticket.getPlayerDetails().getPhoneNumber());
|
||||
|
@ -23,47 +23,47 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Unit tests for {@link LotteryNumbers}
|
||||
*
|
||||
*/
|
||||
class LotteryNumbersTest {
|
||||
|
||||
|
||||
@Test
|
||||
void testGivenNumbers() {
|
||||
LotteryNumbers numbers = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var numbers = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
assertEquals(numbers.getNumbers().size(), 4);
|
||||
assertTrue(numbers.getNumbers().contains(1));
|
||||
assertTrue(numbers.getNumbers().contains(2));
|
||||
assertTrue(numbers.getNumbers().contains(3));
|
||||
assertTrue(numbers.getNumbers().contains(4));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testNumbersCantBeModified() {
|
||||
LotteryNumbers numbers = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var numbers = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
assertThrows(UnsupportedOperationException.class, () -> numbers.getNumbers().add(5));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testRandomNumbers() {
|
||||
LotteryNumbers numbers = LotteryNumbers.createRandom();
|
||||
var numbers = LotteryNumbers.createRandom();
|
||||
assertEquals(numbers.getNumbers().size(), LotteryNumbers.NUM_NUMBERS);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
LotteryNumbers numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
LotteryNumbers numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
assertEquals(numbers1, numbers2);
|
||||
LotteryNumbers numbers3 = LotteryNumbers.create(Set.of(11, 12, 13, 14));
|
||||
var numbers3 = LotteryNumbers.create(Set.of(11, 12, 13, 14));
|
||||
assertNotEquals(numbers1, numbers3);
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,10 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
@ -30,17 +34,12 @@ import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
|
||||
import com.iluwatar.hexagonal.module.LotteryTestingModule;
|
||||
import com.iluwatar.hexagonal.test.LotteryTestUtils;
|
||||
import java.util.Set;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* Test the lottery system
|
||||
*
|
||||
*/
|
||||
class LotteryTest {
|
||||
|
||||
@ -62,38 +61,38 @@ class LotteryTest {
|
||||
// add funds to the test player's bank account
|
||||
wireTransfers.setFunds("123-12312", 100);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testLottery() {
|
||||
// admin resets the lottery
|
||||
administration.resetLottery();
|
||||
assertEquals(0, administration.getAllSubmittedTickets().size());
|
||||
|
||||
|
||||
// players submit the lottery tickets
|
||||
Optional<LotteryTicketId> ticket1 = service.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com",
|
||||
var ticket1 = service.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com",
|
||||
"123-12312", "+32425255", Set.of(1, 2, 3, 4)));
|
||||
assertTrue(ticket1.isPresent());
|
||||
Optional<LotteryTicketId> ticket2 = service.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com",
|
||||
var ticket2 = service.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com",
|
||||
"123-12312", "+32423455", Set.of(11, 12, 13, 14)));
|
||||
assertTrue(ticket2.isPresent());
|
||||
Optional<LotteryTicketId> ticket3 = service.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com",
|
||||
var ticket3 = service.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com",
|
||||
"123-12312", "+32421255", Set.of(6, 8, 13, 19)));
|
||||
assertTrue(ticket3.isPresent());
|
||||
assertEquals(3, administration.getAllSubmittedTickets().size());
|
||||
|
||||
|
||||
// perform lottery
|
||||
LotteryNumbers winningNumbers = administration.performLottery();
|
||||
var winningNumbers = administration.performLottery();
|
||||
|
||||
// cheat a bit for testing sake, use winning numbers to submit another ticket
|
||||
Optional<LotteryTicketId> ticket4 = service.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com",
|
||||
var ticket4 = service.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com",
|
||||
"123-12312", "+12421255", winningNumbers.getNumbers()));
|
||||
assertTrue(ticket4.isPresent());
|
||||
assertEquals(4, administration.getAllSubmittedTickets().size());
|
||||
|
||||
|
||||
// check winners
|
||||
Map<LotteryTicketId, LotteryTicket> tickets = administration.getAllSubmittedTickets();
|
||||
for (LotteryTicketId id: tickets.keySet()) {
|
||||
LotteryTicketCheckResult checkResult = service.checkTicketForPrize(id, winningNumbers);
|
||||
var tickets = administration.getAllSubmittedTickets();
|
||||
for (var id : tickets.keySet()) {
|
||||
var checkResult = service.checkTicketForPrize(id, winningNumbers);
|
||||
assertNotEquals(CheckResult.TICKET_NOT_SUBMITTED, checkResult.getResult());
|
||||
if (checkResult.getResult().equals(CheckResult.WIN_PRIZE)) {
|
||||
assertTrue(checkResult.getPrizeAmount() > 0);
|
||||
@ -101,9 +100,9 @@ class LotteryTest {
|
||||
assertEquals(0, checkResult.getPrizeAmount());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check another ticket that has not been submitted
|
||||
LotteryTicketCheckResult checkResult = service.checkTicketForPrize(new LotteryTicketId(), winningNumbers);
|
||||
var checkResult = service.checkTicketForPrize(new LotteryTicketId(), winningNumbers);
|
||||
assertEquals(CheckResult.TICKET_NOT_SUBMITTED, checkResult.getResult());
|
||||
assertEquals(0, checkResult.getPrizeAmount());
|
||||
}
|
||||
|
@ -23,25 +23,23 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Unit tests for {@link LotteryTicketCheckResult}
|
||||
*
|
||||
*/
|
||||
class LotteryTicketCheckResultTest {
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
LotteryTicketCheckResult result1 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
|
||||
LotteryTicketCheckResult result2 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
|
||||
var result1 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
|
||||
var result2 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
|
||||
assertEquals(result1, result2);
|
||||
LotteryTicketCheckResult result3 = new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 300000);
|
||||
var result3 = new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 300000);
|
||||
assertNotEquals(result1, result3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,11 +23,11 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Tests for lottery ticket id
|
||||
*/
|
||||
@ -35,12 +35,12 @@ class LotteryTicketIdTest {
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
LotteryTicketId ticketId1 = new LotteryTicketId();
|
||||
LotteryTicketId ticketId2 = new LotteryTicketId();
|
||||
LotteryTicketId ticketId3 = new LotteryTicketId();
|
||||
var ticketId1 = new LotteryTicketId();
|
||||
var ticketId2 = new LotteryTicketId();
|
||||
var ticketId3 = new LotteryTicketId();
|
||||
assertNotEquals(ticketId1, ticketId2);
|
||||
assertNotEquals(ticketId2, ticketId3);
|
||||
LotteryTicketId ticketId4 = new LotteryTicketId(ticketId1.getId());
|
||||
var ticketId4 = new LotteryTicketId(ticketId1.getId());
|
||||
assertEquals(ticketId1, ticketId4);
|
||||
}
|
||||
}
|
||||
|
@ -23,13 +23,12 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
import java.util.Set;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Test Lottery Tickets for equality
|
||||
*/
|
||||
@ -37,16 +36,16 @@ class LotteryTicketTest {
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
PlayerDetails details1 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
|
||||
LotteryNumbers numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
LotteryTicket ticket1 = new LotteryTicket(new LotteryTicketId(), details1, numbers1);
|
||||
PlayerDetails details2 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
|
||||
LotteryNumbers numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
LotteryTicket ticket2 = new LotteryTicket(new LotteryTicketId(), details2, numbers2);
|
||||
var details1 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
|
||||
var numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var ticket1 = new LotteryTicket(new LotteryTicketId(), details1, numbers1);
|
||||
var details2 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
|
||||
var numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
|
||||
var ticket2 = new LotteryTicket(new LotteryTicketId(), details2, numbers2);
|
||||
assertEquals(ticket1, ticket2);
|
||||
PlayerDetails details3 = new PlayerDetails("elsa@foo.bar", "1223-121212", "+49332322");
|
||||
LotteryNumbers numbers3 = LotteryNumbers.create(Set.of(1, 2, 3, 8));
|
||||
LotteryTicket ticket3 = new LotteryTicket(new LotteryTicketId(), details3, numbers3);
|
||||
var details3 = new PlayerDetails("elsa@foo.bar", "1223-121212", "+49332322");
|
||||
var numbers3 = LotteryNumbers.create(Set.of(1, 2, 3, 8));
|
||||
var ticket3 = new LotteryTicket(new LotteryTicketId(), details3, numbers3);
|
||||
assertNotEquals(ticket1, ticket3);
|
||||
}
|
||||
}
|
||||
|
@ -23,24 +23,22 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Unit tests for {@link PlayerDetails}
|
||||
*
|
||||
*/
|
||||
class PlayerDetailsTest {
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
PlayerDetails details1 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
|
||||
PlayerDetails details2 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
|
||||
var details1 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
|
||||
var details2 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
|
||||
assertEquals(details1, details2);
|
||||
PlayerDetails details3 = new PlayerDetails("john@foo.bar", "16412-123439", "+34323432");
|
||||
var details3 = new PlayerDetails("john@foo.bar", "16412-123439", "+34323432");
|
||||
assertNotEquals(details1, details3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,8 @@
|
||||
|
||||
package com.iluwatar.hexagonal.eventlog;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader;
|
||||
import com.mongodb.MongoClient;
|
||||
@ -30,8 +32,6 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* Tests for Mongo event log
|
||||
*/
|
||||
@ -46,7 +46,7 @@ class MongoEventLogTest {
|
||||
@BeforeEach
|
||||
void init() {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
var mongoClient = new MongoClient(System.getProperty("mongo-host"),
|
||||
Integer.parseInt(System.getProperty("mongo-port")));
|
||||
mongoClient.dropDatabase(TEST_DB);
|
||||
mongoClient.close();
|
||||
@ -60,7 +60,7 @@ class MongoEventLogTest {
|
||||
|
||||
@Test
|
||||
void testFundTransfers() {
|
||||
PlayerDetails playerDetails = new PlayerDetails("john@wayne.com", "000-000", "03432534543");
|
||||
var playerDetails = new PlayerDetails("john@wayne.com", "000-000", "03432534543");
|
||||
mongoEventLog.prizeError(playerDetails, 1000);
|
||||
assertEquals(1, mongoEventLog.getEventsCollection().count());
|
||||
mongoEventLog.prizeError(playerDetails, 1000);
|
||||
|
@ -27,13 +27,10 @@ import com.iluwatar.hexagonal.domain.LotteryNumbers;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicket;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
*
|
||||
* Utilities for lottery tests
|
||||
*
|
||||
*/
|
||||
public class LotteryTestUtils {
|
||||
|
||||
@ -43,14 +40,14 @@ public class LotteryTestUtils {
|
||||
public static LotteryTicket createLotteryTicket() {
|
||||
return createLotteryTicket("foo@bar.com", "12231-213132", "+99324554", Set.of(1, 2, 3, 4));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return lottery ticket
|
||||
*/
|
||||
public static LotteryTicket createLotteryTicket(String email, String account, String phone,
|
||||
Set<Integer> givenNumbers) {
|
||||
PlayerDetails details = new PlayerDetails(email, account, phone);
|
||||
LotteryNumbers numbers = LotteryNumbers.create(givenNumbers);
|
||||
Set<Integer> givenNumbers) {
|
||||
var details = new PlayerDetails(email, account, phone);
|
||||
var numbers = LotteryNumbers.create(givenNumbers);
|
||||
return new LotteryTicket(new LotteryTicketId(), details, numbers);
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ public class AddressFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
var result = super.execute(order);
|
||||
if (order.getAddress() == null || order.getAddress().isEmpty()) {
|
||||
return result + "Invalid address! ";
|
||||
} else {
|
||||
|
@ -54,14 +54,14 @@ public class App {
|
||||
* @param args command line args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
FilterManager filterManager = new FilterManager();
|
||||
var filterManager = new FilterManager();
|
||||
filterManager.addFilter(new NameFilter());
|
||||
filterManager.addFilter(new ContactFilter());
|
||||
filterManager.addFilter(new AddressFilter());
|
||||
filterManager.addFilter(new DepositFilter());
|
||||
filterManager.addFilter(new OrderFilter());
|
||||
|
||||
Client client = new Client();
|
||||
var client = new Client();
|
||||
client.setFilterManager(filterManager);
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,8 @@ package com.iluwatar.intercepting.filter;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.GridLayout;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.util.Arrays;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
@ -65,11 +66,11 @@ public class Client extends JFrame { // NOSONAR
|
||||
setSize(300, 300);
|
||||
jl = new JLabel("RUNNING...");
|
||||
jtFields = new JTextField[3];
|
||||
for (int i = 0; i < 3; i++) {
|
||||
for (var i = 0; i < 3; i++) {
|
||||
jtFields[i] = new JTextField();
|
||||
}
|
||||
jtAreas = new JTextArea[2];
|
||||
for (int i = 0; i < 2; i++) {
|
||||
for (var i = 0; i < 2; i++) {
|
||||
jtAreas[i] = new JTextArea();
|
||||
}
|
||||
clearButton = new JButton("Clear");
|
||||
@ -80,7 +81,7 @@ public class Client extends JFrame { // NOSONAR
|
||||
|
||||
private void setup() {
|
||||
setLayout(new BorderLayout());
|
||||
JPanel panel = new JPanel();
|
||||
var panel = new JPanel();
|
||||
add(jl, BorderLayout.SOUTH);
|
||||
add(panel, BorderLayout.CENTER);
|
||||
panel.setLayout(new GridLayout(6, 2));
|
||||
@ -98,21 +99,11 @@ public class Client extends JFrame { // NOSONAR
|
||||
panel.add(processButton);
|
||||
|
||||
clearButton.addActionListener(e -> {
|
||||
for (JTextArea i : jtAreas) {
|
||||
i.setText("");
|
||||
}
|
||||
for (JTextField i : jtFields) {
|
||||
i.setText("");
|
||||
}
|
||||
Arrays.stream(jtAreas).forEach(i -> i.setText(""));
|
||||
Arrays.stream(jtFields).forEach(i -> i.setText(""));
|
||||
});
|
||||
|
||||
processButton.addActionListener(e -> {
|
||||
Order order =
|
||||
new Order(jtFields[0].getText(), jtFields[1].getText(), jtAreas[0].getText(), jtFields[2]
|
||||
.getText(),
|
||||
jtAreas[1].getText());
|
||||
jl.setText(sendRequest(order));
|
||||
});
|
||||
processButton.addActionListener(this::actionPerformed);
|
||||
|
||||
JRootPane rootPane = SwingUtilities.getRootPane(processButton);
|
||||
rootPane.setDefaultButton(processButton);
|
||||
@ -126,4 +117,14 @@ public class Client extends JFrame { // NOSONAR
|
||||
public String sendRequest(Order order) {
|
||||
return filterManager.filterRequest(order);
|
||||
}
|
||||
|
||||
private void actionPerformed(ActionEvent e) {
|
||||
var fieldText1 = jtFields[0].getText();
|
||||
var fieldText2 = jtFields[1].getText();
|
||||
var areaText1 = jtAreas[0].getText();
|
||||
var fieldText3 = jtFields[2].getText();
|
||||
var areaText2 = jtAreas[1].getText();
|
||||
var order = new Order(fieldText1, fieldText2, areaText1, fieldText3, areaText2);
|
||||
jl.setText(sendRequest(order));
|
||||
}
|
||||
}
|
||||
|
@ -34,10 +34,11 @@ public class ContactFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getContactNumber() == null || order.getContactNumber().isEmpty()
|
||||
|| order.getContactNumber().matches(".*[^\\d]+.*")
|
||||
|| order.getContactNumber().length() != 11) {
|
||||
var result = super.execute(order);
|
||||
var contactNumber = order.getContactNumber();
|
||||
if (contactNumber == null || contactNumber.isEmpty()
|
||||
|| contactNumber.matches(".*[^\\d]+.*")
|
||||
|| contactNumber.length() != 11) {
|
||||
return result + "Invalid contact number! ";
|
||||
} else {
|
||||
return result;
|
||||
|
@ -32,8 +32,9 @@ public class DepositFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getDepositNumber() == null || order.getDepositNumber().isEmpty()) {
|
||||
var result = super.execute(order);
|
||||
var depositNumber = order.getDepositNumber();
|
||||
if (depositNumber == null || depositNumber.isEmpty()) {
|
||||
return result + "Invalid deposit number! ";
|
||||
} else {
|
||||
return result;
|
||||
|
@ -33,9 +33,9 @@ public class NameFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getName() == null || order.getName().isEmpty()
|
||||
|| order.getName().matches(".*[^\\w|\\s]+.*")) {
|
||||
var result = super.execute(order);
|
||||
var name = order.getName();
|
||||
if (name == null || name.isEmpty() || name.matches(".*[^\\w|\\s]+.*")) {
|
||||
return result + "Invalid name! ";
|
||||
} else {
|
||||
return result;
|
||||
|
@ -32,8 +32,9 @@ public class OrderFilter extends AbstractFilter {
|
||||
|
||||
@Override
|
||||
public String execute(Order order) {
|
||||
String result = super.execute(order);
|
||||
if (order.getOrderItem() == null || order.getOrderItem().isEmpty()) {
|
||||
var result = super.execute(order);
|
||||
var orderItem = order.getOrderItem();
|
||||
if (orderItem == null || orderItem.isEmpty()) {
|
||||
return result + "Invalid order! ";
|
||||
} else {
|
||||
return result;
|
||||
|
@ -27,11 +27,10 @@ import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import java.util.stream.IntStream;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRootPane;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.SwingUtilities;
|
||||
@ -58,9 +57,8 @@ public class Target extends JFrame { //NOSONAR
|
||||
super("Order System");
|
||||
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
||||
setSize(640, 480);
|
||||
dtm =
|
||||
new DefaultTableModel(new Object[]{"Name", "Contact Number", "Address", "Deposit Number",
|
||||
"Order"}, 0);
|
||||
dtm = new DefaultTableModel(
|
||||
new Object[]{"Name", "Contact Number", "Address", "Deposit Number", "Order"}, 0);
|
||||
jt = new JTable(dtm);
|
||||
del = new JButton("Delete");
|
||||
setup();
|
||||
@ -68,18 +66,18 @@ public class Target extends JFrame { //NOSONAR
|
||||
|
||||
private void setup() {
|
||||
setLayout(new BorderLayout());
|
||||
JPanel bot = new JPanel();
|
||||
var bot = new JPanel();
|
||||
add(jt.getTableHeader(), BorderLayout.NORTH);
|
||||
bot.setLayout(new BorderLayout());
|
||||
bot.add(del, BorderLayout.EAST);
|
||||
add(bot, BorderLayout.SOUTH);
|
||||
JScrollPane jsp = new JScrollPane(jt);
|
||||
var jsp = new JScrollPane(jt);
|
||||
jsp.setPreferredSize(new Dimension(500, 250));
|
||||
add(jsp, BorderLayout.CENTER);
|
||||
|
||||
del.addActionListener(new DListener());
|
||||
|
||||
JRootPane rootPane = SwingUtilities.getRootPane(del);
|
||||
var rootPane = SwingUtilities.getRootPane(del);
|
||||
rootPane.setDefaultButton(del);
|
||||
setVisible(true);
|
||||
}
|
||||
@ -91,14 +89,12 @@ public class Target extends JFrame { //NOSONAR
|
||||
class DListener implements ActionListener {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
int temp = jt.getSelectedRow();
|
||||
var temp = jt.getSelectedRow();
|
||||
if (temp == -1) {
|
||||
return;
|
||||
}
|
||||
int temp2 = jt.getSelectedRowCount();
|
||||
for (int i = 0; i < temp2; i++) {
|
||||
dtm.removeRow(temp);
|
||||
}
|
||||
var temp2 = jt.getSelectedRowCount();
|
||||
IntStream.range(0, temp2).forEach(i -> dtm.removeRow(temp));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,15 +26,12 @@ package com.iluwatar.intercepting.filter;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Application test.
|
||||
*
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
String[] args = {};
|
||||
App.main(args);
|
||||
App.main(new String[]{});
|
||||
}
|
||||
}
|
||||
|
@ -23,8 +23,6 @@
|
||||
|
||||
package com.iluwatar.intercepting.filter;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@ -33,6 +31,8 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Date: 12/13/15 - 3:01 PM
|
||||
*
|
||||
@ -42,20 +42,20 @@ public class FilterManagerTest {
|
||||
|
||||
@Test
|
||||
public void testFilterRequest() {
|
||||
final Target target = mock(Target.class);
|
||||
final FilterManager filterManager = new FilterManager();
|
||||
final var target = mock(Target.class);
|
||||
final var filterManager = new FilterManager();
|
||||
assertEquals("RUNNING...", filterManager.filterRequest(mock(Order.class)));
|
||||
verifyZeroInteractions(target);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAddFilter() {
|
||||
final Target target = mock(Target.class);
|
||||
final FilterManager filterManager = new FilterManager();
|
||||
final var target = mock(Target.class);
|
||||
final var filterManager = new FilterManager();
|
||||
|
||||
verifyZeroInteractions(target);
|
||||
|
||||
final Filter filter = mock(Filter.class);
|
||||
final var filter = mock(Filter.class);
|
||||
when(filter.execute(any(Order.class))).thenReturn("filter");
|
||||
|
||||
filterManager.addFilter(filter);
|
||||
|
@ -23,17 +23,15 @@
|
||||
|
||||
package com.iluwatar.intercepting.filter;
|
||||
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
|
||||
import java.util.List;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
/**
|
||||
* Date: 12/13/15 - 2:17 PM
|
||||
*
|
||||
@ -41,7 +39,8 @@ import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
*/
|
||||
public class FilterTest {
|
||||
|
||||
private static final Order PERFECT_ORDER = new Order("name", "12345678901", "addr", "dep", "order");
|
||||
private static final Order PERFECT_ORDER =
|
||||
new Order("name", "12345678901", "addr", "dep", "order");
|
||||
private static final Order WRONG_ORDER = new Order("name", "12345678901", "addr", "dep", "");
|
||||
private static final Order WRONG_DEPOSIT = new Order("name", "12345678901", "addr", "", "order");
|
||||
private static final Order WRONG_ADDRESS = new Order("name", "12345678901", "", "dep", "order");
|
||||
@ -49,49 +48,48 @@ public class FilterTest {
|
||||
private static final Order WRONG_NAME = new Order("", "12345678901", "addr", "dep", "order");
|
||||
|
||||
static List<Object[]> getTestData() {
|
||||
final List<Object[]> testData = new ArrayList<>();
|
||||
testData.add(new Object[]{new NameFilter(), PERFECT_ORDER, ""});
|
||||
testData.add(new Object[]{new NameFilter(), WRONG_NAME, "Invalid name!"});
|
||||
testData.add(new Object[]{new NameFilter(), WRONG_CONTACT, ""});
|
||||
testData.add(new Object[]{new NameFilter(), WRONG_ADDRESS, ""});
|
||||
testData.add(new Object[]{new NameFilter(), WRONG_DEPOSIT, ""});
|
||||
testData.add(new Object[]{new NameFilter(), WRONG_ORDER, ""});
|
||||
return List.of(
|
||||
new Object[]{new NameFilter(), PERFECT_ORDER, ""},
|
||||
new Object[]{new NameFilter(), WRONG_NAME, "Invalid name!"},
|
||||
new Object[]{new NameFilter(), WRONG_CONTACT, ""},
|
||||
new Object[]{new NameFilter(), WRONG_ADDRESS, ""},
|
||||
new Object[]{new NameFilter(), WRONG_DEPOSIT, ""},
|
||||
new Object[]{new NameFilter(), WRONG_ORDER, ""},
|
||||
|
||||
testData.add(new Object[]{new ContactFilter(), PERFECT_ORDER, ""});
|
||||
testData.add(new Object[]{new ContactFilter(), WRONG_NAME, ""});
|
||||
testData.add(new Object[]{new ContactFilter(), WRONG_CONTACT, "Invalid contact number!"});
|
||||
testData.add(new Object[]{new ContactFilter(), WRONG_ADDRESS, ""});
|
||||
testData.add(new Object[]{new ContactFilter(), WRONG_DEPOSIT, ""});
|
||||
testData.add(new Object[]{new ContactFilter(), WRONG_ORDER, ""});
|
||||
new Object[]{new ContactFilter(), PERFECT_ORDER, ""},
|
||||
new Object[]{new ContactFilter(), WRONG_NAME, ""},
|
||||
new Object[]{new ContactFilter(), WRONG_CONTACT, "Invalid contact number!"},
|
||||
new Object[]{new ContactFilter(), WRONG_ADDRESS, ""},
|
||||
new Object[]{new ContactFilter(), WRONG_DEPOSIT, ""},
|
||||
new Object[]{new ContactFilter(), WRONG_ORDER, ""},
|
||||
|
||||
testData.add(new Object[]{new AddressFilter(), PERFECT_ORDER, ""});
|
||||
testData.add(new Object[]{new AddressFilter(), WRONG_NAME, ""});
|
||||
testData.add(new Object[]{new AddressFilter(), WRONG_CONTACT, ""});
|
||||
testData.add(new Object[]{new AddressFilter(), WRONG_ADDRESS, "Invalid address!"});
|
||||
testData.add(new Object[]{new AddressFilter(), WRONG_DEPOSIT, ""});
|
||||
testData.add(new Object[]{new AddressFilter(), WRONG_ORDER, ""});
|
||||
new Object[]{new AddressFilter(), PERFECT_ORDER, ""},
|
||||
new Object[]{new AddressFilter(), WRONG_NAME, ""},
|
||||
new Object[]{new AddressFilter(), WRONG_CONTACT, ""},
|
||||
new Object[]{new AddressFilter(), WRONG_ADDRESS, "Invalid address!"},
|
||||
new Object[]{new AddressFilter(), WRONG_DEPOSIT, ""},
|
||||
new Object[]{new AddressFilter(), WRONG_ORDER, ""},
|
||||
|
||||
testData.add(new Object[]{new DepositFilter(), PERFECT_ORDER, ""});
|
||||
testData.add(new Object[]{new DepositFilter(), WRONG_NAME, ""});
|
||||
testData.add(new Object[]{new DepositFilter(), WRONG_CONTACT, ""});
|
||||
testData.add(new Object[]{new DepositFilter(), WRONG_ADDRESS, ""});
|
||||
testData.add(new Object[]{new DepositFilter(), WRONG_DEPOSIT, "Invalid deposit number!"});
|
||||
testData.add(new Object[]{new DepositFilter(), WRONG_ORDER, ""});
|
||||
new Object[]{new DepositFilter(), PERFECT_ORDER, ""},
|
||||
new Object[]{new DepositFilter(), WRONG_NAME, ""},
|
||||
new Object[]{new DepositFilter(), WRONG_CONTACT, ""},
|
||||
new Object[]{new DepositFilter(), WRONG_ADDRESS, ""},
|
||||
new Object[]{new DepositFilter(), WRONG_DEPOSIT, "Invalid deposit number!"},
|
||||
new Object[]{new DepositFilter(), WRONG_ORDER, ""},
|
||||
|
||||
testData.add(new Object[]{new OrderFilter(), PERFECT_ORDER, ""});
|
||||
testData.add(new Object[]{new OrderFilter(), WRONG_NAME, ""});
|
||||
testData.add(new Object[]{new OrderFilter(), WRONG_CONTACT, ""});
|
||||
testData.add(new Object[]{new OrderFilter(), WRONG_ADDRESS, ""});
|
||||
testData.add(new Object[]{new OrderFilter(), WRONG_DEPOSIT, ""});
|
||||
testData.add(new Object[]{new OrderFilter(), WRONG_ORDER, "Invalid order!"});
|
||||
|
||||
return testData;
|
||||
new Object[]{new OrderFilter(), PERFECT_ORDER, ""},
|
||||
new Object[]{new OrderFilter(), WRONG_NAME, ""},
|
||||
new Object[]{new OrderFilter(), WRONG_CONTACT, ""},
|
||||
new Object[]{new OrderFilter(), WRONG_ADDRESS, ""},
|
||||
new Object[]{new OrderFilter(), WRONG_DEPOSIT, ""},
|
||||
new Object[]{new OrderFilter(), WRONG_ORDER, "Invalid order!"}
|
||||
);
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("getTestData")
|
||||
public void testExecute(Filter filter, Order order, String expectedResult) {
|
||||
final String result = filter.execute(order);
|
||||
final var result = filter.execute(order);
|
||||
assertNotNull(result);
|
||||
assertEquals(expectedResult, result.trim());
|
||||
}
|
||||
|
@ -23,10 +23,10 @@
|
||||
|
||||
package com.iluwatar.intercepting.filter;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Date: 12/13/15 - 2:57 PM
|
||||
*
|
||||
@ -38,35 +38,35 @@ public class OrderTest {
|
||||
|
||||
@Test
|
||||
public void testSetName() {
|
||||
final Order order = new Order();
|
||||
final var order = new Order();
|
||||
order.setName(EXPECTED_VALUE);
|
||||
assertEquals(EXPECTED_VALUE, order.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetContactNumber() {
|
||||
final Order order = new Order();
|
||||
final var order = new Order();
|
||||
order.setContactNumber(EXPECTED_VALUE);
|
||||
assertEquals(EXPECTED_VALUE, order.getContactNumber());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetAddress() {
|
||||
final Order order = new Order();
|
||||
final var order = new Order();
|
||||
order.setAddress(EXPECTED_VALUE);
|
||||
assertEquals(EXPECTED_VALUE, order.getAddress());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetDepositNumber() {
|
||||
final Order order = new Order();
|
||||
final var order = new Order();
|
||||
order.setDepositNumber(EXPECTED_VALUE);
|
||||
assertEquals(EXPECTED_VALUE, order.getDepositNumber());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetOrder() {
|
||||
final Order order = new Order();
|
||||
final var order = new Order();
|
||||
order.setOrderItem(EXPECTED_VALUE);
|
||||
assertEquals(EXPECTED_VALUE, order.getOrderItem());
|
||||
}
|
||||
|
@ -49,24 +49,24 @@ public class App {
|
||||
* @param args command line args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
String tokenString = "4 3 2 - 1 + *";
|
||||
Stack<Expression> stack = new Stack<>();
|
||||
var tokenString = "4 3 2 - 1 + *";
|
||||
var stack = new Stack<Expression>();
|
||||
|
||||
String[] tokenList = tokenString.split(" ");
|
||||
for (String s : tokenList) {
|
||||
var tokenList = tokenString.split(" ");
|
||||
for (var s : tokenList) {
|
||||
if (isOperator(s)) {
|
||||
Expression rightExpression = stack.pop();
|
||||
Expression leftExpression = stack.pop();
|
||||
var rightExpression = stack.pop();
|
||||
var leftExpression = stack.pop();
|
||||
LOGGER.info("popped from stack left: {} right: {}",
|
||||
leftExpression.interpret(), rightExpression.interpret());
|
||||
Expression operator = getOperatorInstance(s, leftExpression, rightExpression);
|
||||
var operator = getOperatorInstance(s, leftExpression, rightExpression);
|
||||
LOGGER.info("operator: {}", operator);
|
||||
int result = operator.interpret();
|
||||
NumberExpression resultExpression = new NumberExpression(result);
|
||||
var result = operator.interpret();
|
||||
var resultExpression = new NumberExpression(result);
|
||||
stack.push(resultExpression);
|
||||
LOGGER.info("push result to stack: {}", resultExpression.interpret());
|
||||
} else {
|
||||
Expression i = new NumberExpression(s);
|
||||
var i = new NumberExpression(s);
|
||||
stack.push(i);
|
||||
LOGGER.info("push to stack: {}", i.interpret());
|
||||
}
|
||||
|
@ -26,15 +26,12 @@ package com.iluwatar.interpreter;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* Application test
|
||||
*
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
String[] args = {};
|
||||
App.main(args);
|
||||
App.main(new String[]{});
|
||||
}
|
||||
}
|
||||
|
@ -23,25 +23,23 @@
|
||||
|
||||
package com.iluwatar.interpreter;
|
||||
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.IntBinaryOperator;
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.api.TestInstance;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.IntBinaryOperator;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
/**
|
||||
* Date: 12/14/15 - 11:48 AM
|
||||
*
|
||||
* <p>
|
||||
* Test Case for Expressions
|
||||
*
|
||||
* @param <E> Type of Expression
|
||||
* @author Jeroen Meulemeester
|
||||
*/
|
||||
@ -55,13 +53,13 @@ public abstract class ExpressionTest<E extends Expression> {
|
||||
* @return A stream with test entries
|
||||
*/
|
||||
static Stream<Arguments> prepareParameters(final IntBinaryOperator resultCalc) {
|
||||
final List<Arguments> testData = new ArrayList<>();
|
||||
for (int i = -10; i < 10; i++) {
|
||||
for (int j = -10; j < 10; j++) {
|
||||
final var testData = new ArrayList<Arguments>();
|
||||
for (var i = -10; i < 10; i++) {
|
||||
for (var j = -10; j < 10; j++) {
|
||||
testData.add(Arguments.of(
|
||||
new NumberExpression(i),
|
||||
new NumberExpression(j),
|
||||
resultCalc.applyAsInt(i, j)
|
||||
new NumberExpression(i),
|
||||
new NumberExpression(j),
|
||||
resultCalc.applyAsInt(i, j)
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -104,7 +102,7 @@ public abstract class ExpressionTest<E extends Expression> {
|
||||
@ParameterizedTest
|
||||
@MethodSource("expressionProvider")
|
||||
public void testInterpret(NumberExpression first, NumberExpression second, int result) {
|
||||
final E expression = factory.apply(first, second);
|
||||
final var expression = factory.apply(first, second);
|
||||
assertNotNull(expression);
|
||||
assertEquals(result, expression.interpret());
|
||||
}
|
||||
@ -115,7 +113,7 @@ public abstract class ExpressionTest<E extends Expression> {
|
||||
@ParameterizedTest
|
||||
@MethodSource("expressionProvider")
|
||||
public void testToString(NumberExpression first, NumberExpression second) {
|
||||
final E expression = factory.apply(first, second);
|
||||
final var expression = factory.apply(first, second);
|
||||
assertNotNull(expression);
|
||||
assertEquals(expectedToString, expression.toString());
|
||||
}
|
||||
|
@ -23,9 +23,8 @@
|
||||
|
||||
package com.iluwatar.interpreter;
|
||||
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
/**
|
||||
* Date: 12/14/15 - 12:08 PM
|
||||
|
@ -23,9 +23,8 @@
|
||||
|
||||
package com.iluwatar.interpreter;
|
||||
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
/**
|
||||
* Date: 12/14/15 - 12:08 PM
|
||||
@ -46,7 +45,6 @@ public class MultiplyExpressionTest extends ExpressionTest<MultiplyExpression> {
|
||||
|
||||
/**
|
||||
* Create a new test instance using the given test parameters and expected result
|
||||
*
|
||||
*/
|
||||
public MultiplyExpressionTest() {
|
||||
super("*", MultiplyExpression::new);
|
||||
|
@ -23,14 +23,13 @@
|
||||
|
||||
package com.iluwatar.interpreter;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* Date: 12/14/15 - 12:08 PM
|
||||
*
|
||||
@ -61,9 +60,9 @@ public class NumberExpressionTest extends ExpressionTest<NumberExpression> {
|
||||
@ParameterizedTest
|
||||
@MethodSource("expressionProvider")
|
||||
public void testFromString(NumberExpression first) throws Exception {
|
||||
final int expectedValue = first.interpret();
|
||||
final String testStringValue = String.valueOf(expectedValue);
|
||||
final NumberExpression numberExpression = new NumberExpression(testStringValue);
|
||||
final var expectedValue = first.interpret();
|
||||
final var testStringValue = String.valueOf(expectedValue);
|
||||
final var numberExpression = new NumberExpression(testStringValue);
|
||||
assertEquals(expectedValue, numberExpression.interpret());
|
||||
}
|
||||
|
||||
|
@ -23,9 +23,8 @@
|
||||
|
||||
package com.iluwatar.interpreter;
|
||||
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
|
||||
/**
|
||||
* Date: 12/14/15 - 12:08 PM
|
||||
@ -41,7 +40,7 @@ public class PlusExpressionTest extends ExpressionTest<PlusExpression> {
|
||||
*/
|
||||
@Override
|
||||
public Stream<Arguments> expressionProvider() {
|
||||
return prepareParameters((f, s) -> f + s);
|
||||
return prepareParameters(Integer::sum);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -30,7 +30,6 @@ import static com.iluwatar.iterator.list.ItemType.WEAPON;
|
||||
|
||||
import com.iluwatar.iterator.bst.BstIterator;
|
||||
import com.iluwatar.iterator.bst.TreeNode;
|
||||
import com.iluwatar.iterator.list.Item;
|
||||
import com.iluwatar.iterator.list.ItemType;
|
||||
import com.iluwatar.iterator.list.TreasureChest;
|
||||
import org.slf4j.Logger;
|
||||
@ -53,7 +52,7 @@ public class App {
|
||||
private static void demonstrateTreasureChestIteratorForType(ItemType itemType) {
|
||||
LOGGER.info("------------------------");
|
||||
LOGGER.info("Item Iterator for ItemType " + itemType + ": ");
|
||||
Iterator<Item> itemIterator = TREASURE_CHEST.iterator(itemType);
|
||||
var itemIterator = TREASURE_CHEST.iterator(itemType);
|
||||
while (itemIterator.hasNext()) {
|
||||
LOGGER.info(itemIterator.next().toString());
|
||||
}
|
||||
@ -62,15 +61,15 @@ public class App {
|
||||
private static void demonstrateBstIterator() {
|
||||
LOGGER.info("------------------------");
|
||||
LOGGER.info("BST Iterator: ");
|
||||
TreeNode<Integer> root = buildIntegerBst();
|
||||
BstIterator bstIterator = new BstIterator<>(root);
|
||||
var root = buildIntegerBst();
|
||||
var bstIterator = new BstIterator<Integer>(root);
|
||||
while (bstIterator.hasNext()) {
|
||||
LOGGER.info("Next node: " + bstIterator.next().getVal());
|
||||
}
|
||||
}
|
||||
|
||||
private static TreeNode<Integer> buildIntegerBst() {
|
||||
TreeNode<Integer> root = new TreeNode<>(8);
|
||||
var root = new TreeNode<>(8);
|
||||
|
||||
root.insert(3);
|
||||
root.insert(10);
|
||||
|
@ -78,7 +78,7 @@ public class BstIterator<T extends Comparable<T>> implements Iterator<TreeNode<T
|
||||
if (pathStack.isEmpty()) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
TreeNode<T> next = pathStack.pop();
|
||||
var next = pathStack.pop();
|
||||
pushPathToNextSmallest(next.getRight());
|
||||
return next;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ public TreeNode next() throws IllegalStateException {
|
||||
if (pathStack.isEmpty()) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
TreeNode next = pathStack.pop();
|
||||
var next = pathStack.pop();
|
||||
// follow right child to next smallest node
|
||||
pushPathToNextSmallest(next.getRight());
|
||||
return next;
|
||||
|
@ -72,7 +72,7 @@ public class TreeNode<T extends Comparable<T>> {
|
||||
* @param valToInsert The value to insert as a new TreeNode
|
||||
*/
|
||||
public void insert(T valToInsert) {
|
||||
TreeNode<T> parent = getParentNodeOfValueToBeInserted(valToInsert);
|
||||
var parent = getParentNodeOfValueToBeInserted(valToInsert);
|
||||
parent.insertNewChild(valToInsert);
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ public class TreeNode<T extends Comparable<T>> {
|
||||
*/
|
||||
private TreeNode<T> getParentNodeOfValueToBeInserted(T valToInsert) {
|
||||
TreeNode<T> parent = null;
|
||||
TreeNode<T> curr = this;
|
||||
var curr = this;
|
||||
|
||||
while (curr != null) {
|
||||
parent = curr;
|
||||
|
@ -24,7 +24,6 @@
|
||||
package com.iluwatar.iterator.list;
|
||||
|
||||
import com.iluwatar.iterator.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* TreasureChestItemIterator.
|
||||
@ -59,10 +58,9 @@ public class TreasureChestItemIterator implements Iterator<Item> {
|
||||
}
|
||||
|
||||
private int findNextIdx() {
|
||||
List<Item> items = chest.getItems();
|
||||
boolean found = false;
|
||||
int tempIdx = idx;
|
||||
while (!found) {
|
||||
var items = chest.getItems();
|
||||
var tempIdx = idx;
|
||||
while (true) {
|
||||
tempIdx++;
|
||||
if (tempIdx >= items.size()) {
|
||||
tempIdx = -1;
|
||||
|
@ -32,7 +32,6 @@ class AppTest {
|
||||
|
||||
@Test
|
||||
void testApp() {
|
||||
String[] args = {};
|
||||
App.main(args);
|
||||
App.main(new String[]{});
|
||||
}
|
||||
}
|
@ -28,13 +28,12 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestInstance;
|
||||
import org.junit.jupiter.api.TestInstance.Lifecycle;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
@TestInstance(Lifecycle.PER_CLASS)
|
||||
class BstIteratorTest {
|
||||
|
||||
@ -55,14 +54,14 @@ class BstIteratorTest {
|
||||
|
||||
@Test
|
||||
void nextForEmptyTree() {
|
||||
BstIterator<Integer> iter = new BstIterator<>(emptyRoot);
|
||||
var iter = new BstIterator<>(emptyRoot);
|
||||
assertThrows(NoSuchElementException.class, iter::next,
|
||||
"next() should throw an IllegalStateException if hasNext() is false.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void nextOverEntirePopulatedTree() {
|
||||
BstIterator<Integer> iter = new BstIterator<>(nonEmptyRoot);
|
||||
var iter = new BstIterator<>(nonEmptyRoot);
|
||||
assertEquals(Integer.valueOf(1), iter.next().getVal(), "First Node is 1.");
|
||||
assertEquals(Integer.valueOf(3), iter.next().getVal(), "Second Node is 3.");
|
||||
assertEquals(Integer.valueOf(4), iter.next().getVal(), "Third Node is 4.");
|
||||
@ -73,19 +72,19 @@ class BstIteratorTest {
|
||||
|
||||
@Test
|
||||
void hasNextForEmptyTree() {
|
||||
BstIterator<Integer> iter = new BstIterator<>(emptyRoot);
|
||||
var iter = new BstIterator<>(emptyRoot);
|
||||
assertFalse(iter.hasNext(), "hasNext() should return false for empty tree.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasNextForPopulatedTree() {
|
||||
BstIterator<Integer> iter = new BstIterator<>(nonEmptyRoot);
|
||||
var iter = new BstIterator<>(nonEmptyRoot);
|
||||
assertTrue(iter.hasNext(), "hasNext() should return true for populated tree.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void nextAndHasNextOverEntirePopulatedTree() {
|
||||
BstIterator<Integer> iter = new BstIterator<>(nonEmptyRoot);
|
||||
var iter = new BstIterator<>(nonEmptyRoot);
|
||||
assertTrue(iter.hasNext(), "Iterator hasNext() should be true.");
|
||||
assertEquals(Integer.valueOf(1), iter.next().getVal(), "First Node is 1.");
|
||||
assertTrue(iter.hasNext(), "Iterator hasNext() should be true.");
|
||||
|
@ -27,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import com.iluwatar.iterator.Iterator;
|
||||
import java.util.List;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
@ -46,16 +45,16 @@ public class TreasureChestTest {
|
||||
*/
|
||||
public static List<Object[]> dataProvider() {
|
||||
return List.of(
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of courage")},
|
||||
new Object[]{new Item(ItemType.RING, "Ring of shadows")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of wisdom")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of blood")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Sword of silver +1")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of rust")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of healing")},
|
||||
new Object[]{new Item(ItemType.RING, "Ring of armor")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Steel halberd")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Dagger of poison")}
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of courage")},
|
||||
new Object[]{new Item(ItemType.RING, "Ring of shadows")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of wisdom")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of blood")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Sword of silver +1")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of rust")},
|
||||
new Object[]{new Item(ItemType.POTION, "Potion of healing")},
|
||||
new Object[]{new Item(ItemType.RING, "Ring of armor")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Steel halberd")},
|
||||
new Object[]{new Item(ItemType.WEAPON, "Dagger of poison")}
|
||||
);
|
||||
}
|
||||
|
||||
@ -66,16 +65,16 @@ public class TreasureChestTest {
|
||||
@ParameterizedTest
|
||||
@MethodSource("dataProvider")
|
||||
public void testIterator(Item expectedItem) {
|
||||
final TreasureChest chest = new TreasureChest();
|
||||
final Iterator<Item> iterator = chest.iterator(expectedItem.getType());
|
||||
final var chest = new TreasureChest();
|
||||
final var iterator = chest.iterator(expectedItem.getType());
|
||||
assertNotNull(iterator);
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
final Item item = iterator.next();
|
||||
final var item = iterator.next();
|
||||
assertNotNull(item);
|
||||
assertEquals(expectedItem.getType(), item.getType());
|
||||
|
||||
final String name = item.toString();
|
||||
final var name = item.toString();
|
||||
assertNotNull(name);
|
||||
if (expectedItem.toString().equals(name)) {
|
||||
return;
|
||||
@ -93,17 +92,17 @@ public class TreasureChestTest {
|
||||
@ParameterizedTest
|
||||
@MethodSource("dataProvider")
|
||||
public void testGetItems(Item expectedItem) throws Exception {
|
||||
final TreasureChest chest = new TreasureChest();
|
||||
final List<Item> items = chest.getItems();
|
||||
final var chest = new TreasureChest();
|
||||
final var items = chest.getItems();
|
||||
assertNotNull(items);
|
||||
|
||||
for (final Item item : items) {
|
||||
for (final var item : items) {
|
||||
assertNotNull(item);
|
||||
assertNotNull(item.getType());
|
||||
assertNotNull(item.toString());
|
||||
|
||||
final boolean sameType = expectedItem.getType() == item.getType();
|
||||
final boolean sameName = expectedItem.toString().equals(item.toString());
|
||||
final var sameType = expectedItem.getType() == item.getType();
|
||||
final var sameName = expectedItem.toString().equals(item.toString());
|
||||
if (sameType && sameName) {
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user