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:
Anurag Agarwal 2019-12-20 10:41:30 +05:30 committed by Ilkka Seppälä
parent 7d0a5c0edb
commit f835d3d516
68 changed files with 454 additions and 533 deletions

View File

@ -70,7 +70,7 @@ public abstract class GameLoop {
* @return {@code true} if the game is running. * @return {@code true} if the game is running.
*/ */
public boolean isGameRunning() { public boolean isGameRunning() {
return status == GameStatus.RUNNING ? true : false; return status == GameStatus.RUNNING;
} }
/** /**
@ -80,7 +80,7 @@ public abstract class GameLoop {
*/ */
protected void processInput() { protected void processInput() {
try { try {
int lag = new Random().nextInt(200) + 50; var lag = new Random().nextInt(200) + 50;
Thread.sleep(lag); Thread.sleep(lag);
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.error(e.getMessage()); logger.error(e.getMessage());

View File

@ -32,8 +32,7 @@ public class AppTest {
@Test @Test
public void testMain() { public void testMain() {
String[] args = {}; new App().main(new String[]{});
new App().main(args);
} }
} }

View File

@ -65,7 +65,7 @@ public class GameLoopTest {
@Test @Test
public void testIsGameRunning() { public void testIsGameRunning() {
Assert.assertEquals(false, gameLoop.isGameRunning()); Assert.assertFalse(gameLoop.isGameRunning());
} }
} }

View File

@ -23,7 +23,6 @@
package com.iluwatar.guarded.suspension; package com.iluwatar.guarded.suspension;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -45,14 +44,11 @@ public class App {
* @param args - command line args * @param args - command line args
*/ */
public static void main(String[] args) { public static void main(String[] args) {
GuardedQueue guardedQueue = new GuardedQueue(); var guardedQueue = new GuardedQueue();
ExecutorService executorService = Executors.newFixedThreadPool(3); var executorService = Executors.newFixedThreadPool(3);
//here we create first thread which is supposed to get from guardedQueue //here we create first thread which is supposed to get from guardedQueue
executorService.execute(() -> { executorService.execute(guardedQueue::get);
guardedQueue.get();
}
);
// here we wait two seconds to show that the thread which is trying // here we wait two seconds to show that the thread which is trying
// to get from guardedQueue will be waiting // 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 // now we execute second thread which will put number to guardedQueue
// and notify first thread that it could get // and notify first thread that it could get
executorService.execute(() -> { executorService.execute(() -> guardedQueue.put(20));
guardedQueue.put(20);
}
);
executorService.shutdown(); executorService.shutdown();
try { try {
executorService.awaitTermination(30, TimeUnit.SECONDS); executorService.awaitTermination(30, TimeUnit.SECONDS);

View File

@ -23,13 +23,11 @@
package com.iluwatar.guarded.suspension; 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.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Test for Guarded Queue * Test for Guarded Queue
@ -39,8 +37,8 @@ public class GuardedQueueTest {
@Test @Test
public void testGet() { public void testGet() {
GuardedQueue g = new GuardedQueue(); var g = new GuardedQueue();
ExecutorService executorService = Executors.newFixedThreadPool(2); var executorService = Executors.newFixedThreadPool(2);
executorService.submit(() -> value = g.get()); executorService.submit(() -> value = g.get());
executorService.submit(() -> g.put(10)); executorService.submit(() -> g.put(10));
executorService.shutdown(); executorService.shutdown();
@ -54,7 +52,7 @@ public class GuardedQueueTest {
@Test @Test
public void testPut() { public void testPut() {
GuardedQueue g = new GuardedQueue(); var g = new GuardedQueue();
g.put(12); g.put(12);
assertEquals(Integer.valueOf(12), g.get()); assertEquals(Integer.valueOf(12), g.get());
} }

View File

@ -70,7 +70,7 @@ public class App {
* @param args command line args * @param args command line args
*/ */
public static void main(String[] 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 * 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 * it passes it to the asynchronous task layer to compute and proceeds with handling other

View File

@ -25,12 +25,8 @@ package com.iluwatar.halfsynchalfasync;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.concurrent.ExecutionException;
/** /**
*
* Application test * Application test
*
*/ */
public class AppTest { public class AppTest {

View File

@ -57,13 +57,13 @@ public class AsynchronousServiceTest {
@Test @Test
public void testPerfectExecution() throws Exception { public void testPerfectExecution() throws Exception {
final Object result = new Object(); final var result = new Object();
when(task.call()).thenReturn(result); when(task.call()).thenReturn(result);
service.execute(task); service.execute(task);
verify(task, timeout(2000)).onPostCall(eq(result)); 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)).onPreCall();
inOrder.verify(task, times(1)).call(); inOrder.verify(task, times(1)).call();
inOrder.verify(task, times(1)).onPostCall(eq(result)); inOrder.verify(task, times(1)).onPostCall(eq(result));
@ -73,13 +73,13 @@ public class AsynchronousServiceTest {
@Test @Test
public void testCallException() throws Exception { public void testCallException() throws Exception {
final IOException exception = new IOException(); final var exception = new IOException();
when(task.call()).thenThrow(exception); when(task.call()).thenThrow(exception);
service.execute(task); service.execute(task);
verify(task, timeout(2000)).onError(eq(exception)); 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)).onPreCall();
inOrder.verify(task, times(1)).call(); inOrder.verify(task, times(1)).call();
inOrder.verify(task, times(1)).onError(exception); inOrder.verify(task, times(1)).onError(exception);
@ -89,13 +89,13 @@ public class AsynchronousServiceTest {
@Test @Test
public void testPreCallException() { public void testPreCallException() {
final IllegalStateException exception = new IllegalStateException(); final var exception = new IllegalStateException();
doThrow(exception).when(task).onPreCall(); doThrow(exception).when(task).onPreCall();
service.execute(task); service.execute(task);
verify(task, timeout(2000)).onError(eq(exception)); 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)).onPreCall();
inOrder.verify(task, times(1)).onError(exception); inOrder.verify(task, times(1)).onError(exception);

View File

@ -24,7 +24,6 @@
package com.iluwatar.hexagonal; package com.iluwatar.hexagonal;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector;
import com.iluwatar.hexagonal.domain.LotteryAdministration; import com.iluwatar.hexagonal.domain.LotteryAdministration;
import com.iluwatar.hexagonal.domain.LotteryService; import com.iluwatar.hexagonal.domain.LotteryService;
import com.iluwatar.hexagonal.module.LotteryTestingModule; import com.iluwatar.hexagonal.module.LotteryTestingModule;
@ -63,14 +62,14 @@ public class App {
*/ */
public static void main(String[] args) { public static void main(String[] args) {
Injector injector = Guice.createInjector(new LotteryTestingModule()); var injector = Guice.createInjector(new LotteryTestingModule());
// start new lottery round // start new lottery round
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class); var administration = injector.getInstance(LotteryAdministration.class);
administration.resetLottery(); administration.resetLottery();
// submit some lottery tickets // submit some lottery tickets
LotteryService service = injector.getInstance(LotteryService.class); var service = injector.getInstance(LotteryService.class);
SampleData.submitTickets(service, 20); SampleData.submitTickets(service, 20);
// perform lottery // perform lottery

View File

@ -24,7 +24,6 @@
package com.iluwatar.hexagonal.administration; package com.iluwatar.hexagonal.administration;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector;
import com.iluwatar.hexagonal.domain.LotteryAdministration; import com.iluwatar.hexagonal.domain.LotteryAdministration;
import com.iluwatar.hexagonal.domain.LotteryService; import com.iluwatar.hexagonal.domain.LotteryService;
import com.iluwatar.hexagonal.module.LotteryModule; import com.iluwatar.hexagonal.module.LotteryModule;
@ -46,17 +45,16 @@ public class ConsoleAdministration {
*/ */
public static void main(String[] args) { public static void main(String[] args) {
MongoConnectionPropertiesLoader.load(); MongoConnectionPropertiesLoader.load();
Injector injector = Guice.createInjector(new LotteryModule()); var injector = Guice.createInjector(new LotteryModule());
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class); var administration = injector.getInstance(LotteryAdministration.class);
LotteryService service = injector.getInstance(LotteryService.class); var service = injector.getInstance(LotteryService.class);
SampleData.submitTickets(service, 20); SampleData.submitTickets(service, 20);
ConsoleAdministrationSrv consoleAdministration = var consoleAdministration = new ConsoleAdministrationSrvImpl(administration, LOGGER);
new ConsoleAdministrationSrvImpl(administration, LOGGER); try (var scanner = new Scanner(System.in)) {
try (Scanner scanner = new Scanner(System.in)) { var exit = false;
boolean exit = false;
while (!exit) { while (!exit) {
printMainMenu(); printMainMenu();
String cmd = readString(scanner); var cmd = readString(scanner);
if ("1".equals(cmd)) { if ("1".equals(cmd)) {
consoleAdministration.getAllSubmittedTickets(); consoleAdministration.getAllSubmittedTickets();
} else if ("2".equals(cmd)) { } else if ("2".equals(cmd)) {

View File

@ -50,7 +50,7 @@ public class ConsoleAdministrationSrvImpl implements ConsoleAdministrationSrv {
@Override @Override
public void performLottery() { public void performLottery() {
LotteryNumbers numbers = administration.performLottery(); var numbers = administration.performLottery();
logger.info("The winning numbers: {}", numbers.getNumbersAsString()); logger.info("The winning numbers: {}", numbers.getNumbersAsString());
logger.info("Time to reset the database for next round, eh?"); logger.info("Time to reset the database for next round, eh?");
} }

View File

@ -28,7 +28,6 @@ import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.UpdateOptions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.bson.Document; import org.bson.Document;
/** /**
@ -107,30 +106,31 @@ public class MongoBank implements WireTransfers {
@Override @Override
public void setFunds(String bankAccount, int amount) { public void setFunds(String bankAccount, int amount) {
Document search = new Document("_id", bankAccount); var search = new Document("_id", bankAccount);
Document update = new Document("_id", bankAccount).append("funds", amount); var update = new Document("_id", bankAccount).append("funds", amount);
accountsCollection var updateOptions = new UpdateOptions().upsert(true);
.updateOne(search, new Document("$set", update), new UpdateOptions().upsert(true)); accountsCollection.updateOne(search, new Document("$set", update), updateOptions);
} }
@Override @Override
public int getFunds(String bankAccount) { public int getFunds(String bankAccount) {
Document search = new Document("_id", bankAccount); return accountsCollection
List<Document> results = accountsCollection.find(search).limit(1).into(new ArrayList<>()); .find(new Document("_id", bankAccount))
if (results.size() > 0) { .limit(1)
return results.get(0).getInteger("funds"); .into(new ArrayList<>())
} else { .stream()
return 0; .findFirst()
} .map(x -> x.getInteger("funds"))
.orElse(0);
} }
@Override @Override
public boolean transferFunds(int amount, String sourceAccount, String destinationAccount) { public boolean transferFunds(int amount, String sourceAccount, String destinationAccount) {
int sourceFunds = getFunds(sourceAccount); var sourceFunds = getFunds(sourceAccount);
if (sourceFunds < amount) { if (sourceFunds < amount) {
return false; return false;
} else { } else {
int destFunds = getFunds(destinationAccount); var destFunds = getFunds(destinationAccount);
setFunds(sourceAccount, sourceFunds - amount); setFunds(sourceAccount, sourceFunds - amount);
setFunds(destinationAccount, destFunds + amount); setFunds(destinationAccount, destFunds + amount);
return true; return true;

View File

@ -38,17 +38,12 @@ public class InMemoryTicketRepository implements LotteryTicketRepository {
@Override @Override
public Optional<LotteryTicket> findById(LotteryTicketId id) { public Optional<LotteryTicket> findById(LotteryTicketId id) {
LotteryTicket ticket = tickets.get(id); return Optional.ofNullable(tickets.get(id));
if (ticket == null) {
return Optional.empty();
} else {
return Optional.of(ticket);
}
} }
@Override @Override
public Optional<LotteryTicketId> save(LotteryTicket ticket) { public Optional<LotteryTicketId> save(LotteryTicket ticket) {
LotteryTicketId id = new LotteryTicketId(); var id = new LotteryTicketId();
tickets.put(id, ticket); tickets.put(id, ticket);
return Optional.of(id); return Optional.of(id);
} }

View File

@ -32,11 +32,9 @@ import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoDatabase;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.bson.Document; import org.bson.Document;
@ -95,7 +93,7 @@ public class MongoTicketRepository implements LotteryTicketRepository {
} }
private void initCounters() { private void initCounters() {
Document doc = new Document("_id", "ticketId").append("seq", 1); var doc = new Document("_id", "ticketId").append("seq", 1);
countersCollection.insertOne(doc); countersCollection.insertOne(doc);
} }
@ -105,10 +103,10 @@ public class MongoTicketRepository implements LotteryTicketRepository {
* @return next ticket id * @return next ticket id
*/ */
public int getNextId() { public int getNextId() {
Document find = new Document("_id", "ticketId"); var find = new Document("_id", "ticketId");
Document increase = new Document("seq", 1); var increase = new Document("seq", 1);
Document update = new Document("$inc", increase); var update = new Document("$inc", increase);
Document result = countersCollection.findOneAndUpdate(find, update); var result = countersCollection.findOneAndUpdate(find, update);
return result.getInteger("seq"); return result.getInteger("seq");
} }
@ -132,20 +130,19 @@ public class MongoTicketRepository implements LotteryTicketRepository {
@Override @Override
public Optional<LotteryTicket> findById(LotteryTicketId id) { public Optional<LotteryTicket> findById(LotteryTicketId id) {
Document find = new Document("ticketId", id.getId()); return ticketsCollection
List<Document> results = ticketsCollection.find(find).limit(1).into(new ArrayList<>()); .find(new Document("ticketId", id.getId()))
if (results.size() > 0) { .limit(1)
LotteryTicket lotteryTicket = docToTicket(results.get(0)); .into(new ArrayList<>())
return Optional.of(lotteryTicket); .stream()
} else { .findFirst()
return Optional.empty(); .map(this::docToTicket);
}
} }
@Override @Override
public Optional<LotteryTicketId> save(LotteryTicket ticket) { public Optional<LotteryTicketId> save(LotteryTicket ticket) {
int ticketId = getNextId(); var ticketId = getNextId();
Document doc = new Document("ticketId", ticketId); var doc = new Document("ticketId", ticketId);
doc.put("email", ticket.getPlayerDetails().getEmail()); doc.put("email", ticket.getPlayerDetails().getEmail());
doc.put("bank", ticket.getPlayerDetails().getBankAccount()); doc.put("bank", ticket.getPlayerDetails().getBankAccount());
doc.put("phone", ticket.getPlayerDetails().getPhoneNumber()); doc.put("phone", ticket.getPlayerDetails().getPhoneNumber());
@ -156,13 +153,12 @@ public class MongoTicketRepository implements LotteryTicketRepository {
@Override @Override
public Map<LotteryTicketId, LotteryTicket> findAll() { public Map<LotteryTicketId, LotteryTicket> findAll() {
Map<LotteryTicketId, LotteryTicket> map = new HashMap<>(); return ticketsCollection
List<Document> docs = ticketsCollection.find(new Document()).into(new ArrayList<>()); .find(new Document())
for (Document doc : docs) { .into(new ArrayList<>())
LotteryTicket lotteryTicket = docToTicket(doc); .stream()
map.put(lotteryTicket.getId(), lotteryTicket); .map(this::docToTicket)
} .collect(Collectors.toMap(LotteryTicket::getId, Function.identity()));
return map;
} }
@Override @Override
@ -171,13 +167,13 @@ public class MongoTicketRepository implements LotteryTicketRepository {
} }
private LotteryTicket docToTicket(Document doc) { 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")); doc.getString("phone"));
Set<Integer> numbers = Arrays.stream(doc.getString("numbers").split(",")) var numbers = Arrays.stream(doc.getString("numbers").split(","))
.map(Integer::parseInt) .map(Integer::parseInt)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
LotteryNumbers lotteryNumbers = LotteryNumbers.create(numbers); var lotteryNumbers = LotteryNumbers.create(numbers);
return new LotteryTicket(new LotteryTicketId(doc var ticketId = new LotteryTicketId(doc.getInteger("ticketId"));
.getInteger("ticketId")), playerDetails, lotteryNumbers); return new LotteryTicket(ticketId, playerDetails, lotteryNumbers);
} }
} }

View File

@ -23,6 +23,9 @@
package com.iluwatar.hexagonal.domain; 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.google.inject.Inject;
import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.banking.WireTransfers;
import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository;
@ -60,23 +63,21 @@ public class LotteryAdministration {
* Draw lottery numbers. * Draw lottery numbers.
*/ */
public LotteryNumbers performLottery() { public LotteryNumbers performLottery() {
LotteryNumbers numbers = LotteryNumbers.createRandom(); var numbers = LotteryNumbers.createRandom();
Map<LotteryTicketId, LotteryTicket> tickets = getAllSubmittedTickets(); var tickets = getAllSubmittedTickets();
for (LotteryTicketId id : tickets.keySet()) { for (var id : tickets.keySet()) {
LotteryTicketCheckResult result = LotteryUtils.checkTicketForPrize(repository, id, numbers); var lotteryTicket = tickets.get(id);
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { var playerDetails = lotteryTicket.getPlayerDetails();
boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT, var playerAccount = playerDetails.getBankAccount();
LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails() var result = LotteryUtils.checkTicketForPrize(repository, id, numbers).getResult();
.getBankAccount()); if (result == LotteryTicketCheckResult.CheckResult.WIN_PRIZE) {
if (transferred) { if (wireTransfers.transferFunds(PRIZE_AMOUNT, SERVICE_BANK_ACCOUNT, playerAccount)) {
notifications notifications.ticketWon(playerDetails, PRIZE_AMOUNT);
.ticketWon(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
} else { } else {
notifications notifications.prizeError(playerDetails, PRIZE_AMOUNT);
.prizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
} }
} else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { } else if (result == LotteryTicketCheckResult.CheckResult.NO_PRIZE) {
notifications.ticketDidNotWin(tickets.get(id).getPlayerDetails()); notifications.ticketDidNotWin(playerDetails);
} }
} }
return numbers; return numbers;

View File

@ -99,9 +99,9 @@ public class LotteryNumbers {
*/ */
private void generateRandomNumbers() { private void generateRandomNumbers() {
numbers.clear(); numbers.clear();
RandomNumberGenerator generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER); var generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
while (numbers.size() < NUM_NUMBERS) { while (numbers.size() < NUM_NUMBERS) {
int num = generator.nextInt(); var num = generator.nextInt();
numbers.add(num); numbers.add(num);
} }
} }
@ -141,8 +141,8 @@ public class LotteryNumbers {
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final var prime = 31;
int result = 1; var result = 1;
result = prime * result + ((numbers == null) ? 0 : numbers.hashCode()); result = prime * result + ((numbers == null) ? 0 : numbers.hashCode());
return result; return result;
} }
@ -158,14 +158,11 @@ public class LotteryNumbers {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
LotteryNumbers other = (LotteryNumbers) obj; var other = (LotteryNumbers) obj;
if (numbers == null) { if (numbers == null) {
if (other.numbers != null) { return other.numbers == null;
return false; } else {
} return numbers.equals(other.numbers);
} else if (!numbers.equals(other.numbers)) {
return false;
} }
return true;
} }
} }

View File

@ -23,6 +23,9 @@
package com.iluwatar.hexagonal.domain; 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.google.inject.Inject;
import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.banking.WireTransfers;
import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository;
@ -53,15 +56,16 @@ public class LotteryService {
* Submit lottery ticket to participate in the lottery. * Submit lottery ticket to participate in the lottery.
*/ */
public Optional<LotteryTicketId> submitTicket(LotteryTicket ticket) { public Optional<LotteryTicketId> submitTicket(LotteryTicket ticket) {
boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, var playerDetails = ticket.getPlayerDetails();
ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); var playerAccount = playerDetails.getBankAccount();
var result = wireTransfers.transferFunds(TICKET_PRIZE, playerAccount, SERVICE_BANK_ACCOUNT);
if (!result) { if (!result) {
notifications.ticketSubmitError(ticket.getPlayerDetails()); notifications.ticketSubmitError(playerDetails);
return Optional.empty(); return Optional.empty();
} }
Optional<LotteryTicketId> optional = repository.save(ticket); var optional = repository.save(ticket);
if (optional.isPresent()) { if (optional.isPresent()) {
notifications.ticketSubmitted(ticket.getPlayerDetails()); notifications.ticketSubmitted(playerDetails);
} }
return optional; return optional;
} }

View File

@ -82,8 +82,8 @@ public class LotteryTicket {
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final var prime = 31;
int result = 1; var result = 1;
result = prime * result + ((lotteryNumbers == null) ? 0 : lotteryNumbers.hashCode()); result = prime * result + ((lotteryNumbers == null) ? 0 : lotteryNumbers.hashCode());
result = prime * result + ((playerDetails == null) ? 0 : playerDetails.hashCode()); result = prime * result + ((playerDetails == null) ? 0 : playerDetails.hashCode());
return result; return result;
@ -100,7 +100,7 @@ public class LotteryTicket {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
LotteryTicket other = (LotteryTicket) obj; var other = (LotteryTicket) obj;
if (lotteryNumbers == null) { if (lotteryNumbers == null) {
if (other.lotteryNumbers != null) { if (other.lotteryNumbers != null) {
return false; return false;
@ -109,12 +109,9 @@ public class LotteryTicket {
return false; return false;
} }
if (playerDetails == null) { if (playerDetails == null) {
if (other.playerDetails != null) { return other.playerDetails == null;
return false; } else {
} return playerDetails.equals(other.playerDetails);
} else if (!playerDetails.equals(other.playerDetails)) {
return false;
} }
return true;
} }
} }

View File

@ -76,8 +76,8 @@ public class LotteryTicketCheckResult {
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final var prime = 31;
int result = 1; var result = 1;
result = prime * result + ((checkResult == null) ? 0 : checkResult.hashCode()); result = prime * result + ((checkResult == null) ? 0 : checkResult.hashCode());
result = prime * result + prizeAmount; result = prime * result + prizeAmount;
return result; return result;
@ -94,7 +94,7 @@ public class LotteryTicketCheckResult {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
LotteryTicketCheckResult other = (LotteryTicketCheckResult) obj; var other = (LotteryTicketCheckResult) obj;
return checkResult == other.checkResult && prizeAmount == other.prizeAmount; return checkResult == other.checkResult && prizeAmount == other.prizeAmount;
} }
} }

View File

@ -59,10 +59,9 @@ public class LotteryTicketId {
return false; return false;
} }
LotteryTicketId that = (LotteryTicketId) o; var that = (LotteryTicketId) o;
return id == that.id; return id == that.id;
} }
@Override @Override

View File

@ -25,7 +25,6 @@ package com.iluwatar.hexagonal.domain;
import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository;
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
import java.util.Optional;
/** /**
* Lottery utilities. * Lottery utilities.
@ -43,7 +42,7 @@ public class LotteryUtils {
LotteryTicketId id, LotteryTicketId id,
LotteryNumbers winningNumbers LotteryNumbers winningNumbers
) { ) {
Optional<LotteryTicket> optional = repository.findById(id); var optional = repository.findById(id);
if (optional.isPresent()) { if (optional.isPresent()) {
if (optional.get().getNumbers().equals(winningNumbers)) { if (optional.get().getNumbers().equals(winningNumbers)) {
return new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 1000); return new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 1000);

View File

@ -77,8 +77,8 @@ public class PlayerDetails {
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final var prime = 31;
int result = 1; var result = 1;
result = prime * result + ((bankAccountNumber == null) ? 0 : bankAccountNumber.hashCode()); result = prime * result + ((bankAccountNumber == null) ? 0 : bankAccountNumber.hashCode());
result = prime * result + ((emailAddress == null) ? 0 : emailAddress.hashCode()); result = prime * result + ((emailAddress == null) ? 0 : emailAddress.hashCode());
result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode()); result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode());
@ -96,7 +96,7 @@ public class PlayerDetails {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
PlayerDetails other = (PlayerDetails) obj; var other = (PlayerDetails) obj;
if (bankAccountNumber == null) { if (bankAccountNumber == null) {
if (other.bankAccountNumber != null) { if (other.bankAccountNumber != null) {
return false; return false;
@ -112,12 +112,9 @@ public class PlayerDetails {
return false; return false;
} }
if (phoneNumber == null) { if (phoneNumber == null) {
if (other.phoneNumber != null) { return other.phoneNumber == null;
return false; } else {
} return phoneNumber.equals(other.phoneNumber);
} else if (!phoneNumber.equals(other.phoneNumber)) {
return false;
} }
return true;
} }
} }

View File

@ -107,7 +107,7 @@ public class MongoEventLog implements LotteryEventLog {
@Override @Override
public void ticketSubmitted(PlayerDetails details) { 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("phone", details.getPhoneNumber());
document.put("bank", details.getBankAccount()); document.put("bank", details.getBankAccount());
document document
@ -118,7 +118,7 @@ public class MongoEventLog implements LotteryEventLog {
@Override @Override
public void ticketSubmitError(PlayerDetails details) { 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("phone", details.getPhoneNumber());
document.put("bank", details.getBankAccount()); document.put("bank", details.getBankAccount());
document.put("message", "Lottery ticket could not be submitted because lack of funds."); document.put("message", "Lottery ticket could not be submitted because lack of funds.");
@ -128,7 +128,7 @@ public class MongoEventLog implements LotteryEventLog {
@Override @Override
public void ticketDidNotWin(PlayerDetails details) { 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("phone", details.getPhoneNumber());
document.put("bank", details.getBankAccount()); document.put("bank", details.getBankAccount());
document.put("message", "Lottery ticket was checked and unfortunately did not win this time."); document.put("message", "Lottery ticket was checked and unfortunately did not win this time.");
@ -138,7 +138,7 @@ public class MongoEventLog implements LotteryEventLog {
@Override @Override
public void ticketWon(PlayerDetails details, int prizeAmount) { 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("phone", details.getPhoneNumber());
document.put("bank", details.getBankAccount()); document.put("bank", details.getBankAccount());
document.put("message", String document.put("message", String
@ -150,7 +150,7 @@ public class MongoEventLog implements LotteryEventLog {
@Override @Override
public void prizeError(PlayerDetails details, int prizeAmount) { 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("phone", details.getPhoneNumber());
document.put("bank", details.getBankAccount()); document.put("bank", details.getBankAccount());
document.put("message", String document.put("message", String

View File

@ -42,9 +42,8 @@ public class StdOutEventLog implements LotteryEventLog {
@Override @Override
public void ticketDidNotWin(PlayerDetails details) { public void ticketDidNotWin(PlayerDetails details) {
LOGGER LOGGER.info("Lottery ticket for {} was checked and unfortunately did not win this time.",
.info("Lottery ticket for {} was checked and unfortunately did not win this time.", details details.getEmail());
.getEmail());
} }
@Override @Override
@ -55,9 +54,8 @@ public class StdOutEventLog implements LotteryEventLog {
@Override @Override
public void prizeError(PlayerDetails details, int prizeAmount) { public void prizeError(PlayerDetails details, int prizeAmount) {
LOGGER LOGGER.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of"
.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of" + " {} failed.", details.getEmail(), prizeAmount);
+ " {} failed.", details.getEmail(), prizeAmount);
} }
@Override @Override

View File

@ -38,12 +38,12 @@ public class MongoConnectionPropertiesLoader {
* Try to load connection properties from file. Fall back to default connection properties. * Try to load connection properties from file. Fall back to default connection properties.
*/ */
public static void load() { public static void load() {
String host = DEFAULT_HOST; var host = DEFAULT_HOST;
int port = DEFAULT_PORT; var port = DEFAULT_PORT;
String path = System.getProperty("hexagonal.properties.path"); var path = System.getProperty("hexagonal.properties.path");
Properties properties = new Properties(); var properties = new Properties();
if (path != null) { if (path != null) {
try (FileInputStream fin = new FileInputStream(path)) { try (var fin = new FileInputStream(path)) {
properties.load(fin); properties.load(fin);
host = properties.getProperty("mongo-host"); host = properties.getProperty("mongo-host");
port = Integer.parseInt(properties.getProperty("mongo-port")); port = Integer.parseInt(properties.getProperty("mongo-port"));

View File

@ -30,8 +30,10 @@ import com.iluwatar.hexagonal.domain.LotteryService;
import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicket;
import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.LotteryTicketId;
import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.domain.PlayerDetails;
import java.util.AbstractMap.SimpleEntry;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.stream.Collectors;
/** /**
* Utilities for creating sample lottery tickets. * Utilities for creating sample lottery tickets.
@ -83,26 +85,28 @@ public class SampleData {
new PlayerDetails("xavier@google.com", "143-947", "+375245"), new PlayerDetails("xavier@google.com", "143-947", "+375245"),
new PlayerDetails("harriet@google.com", "842-404", "+131243252") new PlayerDetails("harriet@google.com", "842-404", "+131243252")
); );
InMemoryBank wireTransfers = new InMemoryBank(); var wireTransfers = new InMemoryBank();
for (PlayerDetails player : PLAYERS) { PLAYERS.stream()
wireTransfers.setFunds(player.getBankAccount(), .map(PlayerDetails::getBankAccount)
RANDOM.nextInt(LotteryConstants.PLAYER_MAX_BALANCE)); .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. * Inserts lottery tickets into the database based on the sample data.
*/ */
public static void submitTickets(LotteryService lotteryService, int numTickets) { public static void submitTickets(LotteryService lotteryService, int numTickets) {
for (int i = 0; i < numTickets; i++) { for (var i = 0; i < numTickets; i++) {
LotteryTicket ticket = new LotteryTicket(new LotteryTicketId(), var randomPlayerDetails = getRandomPlayerDetails();
getRandomPlayerDetails(), LotteryNumbers.createRandom()); var lotteryNumbers = LotteryNumbers.createRandom();
var lotteryTicketId = new LotteryTicketId();
var ticket = new LotteryTicket(lotteryTicketId, randomPlayerDetails, lotteryNumbers);
lotteryService.submitTicket(ticket); lotteryService.submitTicket(ticket);
} }
} }
private static PlayerDetails getRandomPlayerDetails() { private static PlayerDetails getRandomPlayerDetails() {
int idx = RANDOM.nextInt(PLAYERS.size()); return PLAYERS.get(RANDOM.nextInt(PLAYERS.size()));
return PLAYERS.get(idx);
} }
} }

View File

@ -24,7 +24,6 @@
package com.iluwatar.hexagonal.service; package com.iluwatar.hexagonal.service;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector;
import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.banking.WireTransfers;
import com.iluwatar.hexagonal.domain.LotteryService; import com.iluwatar.hexagonal.domain.LotteryService;
import com.iluwatar.hexagonal.module.LotteryModule; import com.iluwatar.hexagonal.module.LotteryModule;
@ -45,15 +44,15 @@ public class ConsoleLottery {
*/ */
public static void main(String[] args) { public static void main(String[] args) {
MongoConnectionPropertiesLoader.load(); MongoConnectionPropertiesLoader.load();
Injector injector = Guice.createInjector(new LotteryModule()); var injector = Guice.createInjector(new LotteryModule());
LotteryService service = injector.getInstance(LotteryService.class); var service = injector.getInstance(LotteryService.class);
WireTransfers bank = injector.getInstance(WireTransfers.class); var bank = injector.getInstance(WireTransfers.class);
try (Scanner scanner = new Scanner(System.in)) { try (Scanner scanner = new Scanner(System.in)) {
boolean exit = false; var exit = false;
while (!exit) { while (!exit) {
printMainMenu(); printMainMenu();
String cmd = readString(scanner); var cmd = readString(scanner);
LotteryConsoleService lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER); var lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER);
if ("1".equals(cmd)) { if ("1".equals(cmd)) {
lotteryConsoleService.queryLotteryAccountFunds(bank, scanner); lotteryConsoleService.queryLotteryAccountFunds(bank, scanner);
} else if ("2".equals(cmd)) { } else if ("2".equals(cmd)) {

View File

@ -31,10 +31,7 @@ import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult;
import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.LotteryTicketId;
import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.domain.PlayerDetails;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Optional;
import java.util.Scanner; import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -55,20 +52,18 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
@Override @Override
public void checkTicket(LotteryService service, Scanner scanner) { public void checkTicket(LotteryService service, Scanner scanner) {
logger.info("What is the ID of the lottery ticket?"); 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?"); logger.info("Give the 4 comma separated winning numbers?");
String numbers = readString(scanner); var numbers = readString(scanner);
try { try {
String[] parts = numbers.split(","); var winningNumbers = Arrays.stream(numbers.split(","))
Set<Integer> winningNumbers = new HashSet<>(); .map(Integer::parseInt)
for (int i = 0; i < 4; i++) { .limit(4)
winningNumbers.add(Integer.parseInt(parts[i])); .collect(Collectors.toSet());
}
final LotteryTicketId lotteryTicketId = new LotteryTicketId(Integer.parseInt(id)); final var lotteryTicketId = new LotteryTicketId(Integer.parseInt(id));
final LotteryNumbers lotteryNumbers = LotteryNumbers.create(winningNumbers); final var lotteryNumbers = LotteryNumbers.create(winningNumbers);
LotteryTicketCheckResult result = var result = service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) {
logger.info("Congratulations! The lottery ticket has won!"); logger.info("Congratulations! The lottery ticket has won!");
@ -85,26 +80,24 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
@Override @Override
public void submitTicket(LotteryService service, Scanner scanner) { public void submitTicket(LotteryService service, Scanner scanner) {
logger.info("What is your email address?"); logger.info("What is your email address?");
String email = readString(scanner); var email = readString(scanner);
logger.info("What is your bank account number?"); logger.info("What is your bank account number?");
String account = readString(scanner); var account = readString(scanner);
logger.info("What is your phone number?"); logger.info("What is your phone number?");
String phone = readString(scanner); var phone = readString(scanner);
PlayerDetails details = new PlayerDetails(email, account, phone); var details = new PlayerDetails(email, account, phone);
logger.info("Give 4 comma separated lottery numbers?"); logger.info("Give 4 comma separated lottery numbers?");
String numbers = readString(scanner); var numbers = readString(scanner);
try { try {
String[] parts = numbers.split(","); var chosen = Arrays.stream(numbers.split(","))
Set<Integer> chosen = Arrays.stream(parts).map(Integer::parseInt).collect(Collectors.toSet()); .map(Integer::parseInt)
LotteryNumbers lotteryNumbers = LotteryNumbers.create(chosen); .collect(Collectors.toSet());
LotteryTicket lotteryTicket = var lotteryNumbers = LotteryNumbers.create(chosen);
new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers); var lotteryTicket = new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers);
Optional<LotteryTicketId> id = service.submitTicket(lotteryTicket); service.submitTicket(lotteryTicket).ifPresentOrElse(
if (id.isPresent()) { (id) -> logger.info("Submitted lottery ticket with id: {}", id),
logger.info("Submitted lottery ticket with id: {}", id.get()); () -> logger.info("Failed submitting lottery ticket - please try again.")
} else { );
logger.info("Failed submitting lottery ticket - please try again.");
}
} catch (Exception e) { } catch (Exception e) {
logger.info("Failed submitting lottery ticket - please try again."); logger.info("Failed submitting lottery ticket - please try again.");
} }
@ -113,9 +106,9 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
@Override @Override
public void addFundsToLotteryAccount(WireTransfers bank, Scanner scanner) { public void addFundsToLotteryAccount(WireTransfers bank, Scanner scanner) {
logger.info("What is the account number?"); 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?"); logger.info("How many credits do you want to deposit?");
String amount = readString(scanner); var amount = readString(scanner);
bank.setFunds(account, Integer.parseInt(amount)); bank.setFunds(account, Integer.parseInt(amount));
logger.info("The account {} now has {} credits.", account, bank.getFunds(account)); logger.info("The account {} now has {} credits.", account, bank.getFunds(account));
} }
@ -123,7 +116,7 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
@Override @Override
public void queryLotteryAccountFunds(WireTransfers bank, Scanner scanner) { public void queryLotteryAccountFunds(WireTransfers bank, Scanner scanner) {
logger.info("What is the account number?"); 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)); logger.info("The account {} has {} credits.", account, bank.getFunds(account));
} }

View File

@ -32,7 +32,6 @@ class AppTest {
@Test @Test
void testApp() { void testApp() {
String[] args = {}; App.main(new String[]{});
App.main(args);
} }
} }

View File

@ -23,20 +23,18 @@
package com.iluwatar.hexagonal.banking; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
/** /**
*
* Tests for banking * Tests for banking
*
*/ */
class InMemoryBankTest { class InMemoryBankTest {
private final WireTransfers bank = new InMemoryBank(); private final WireTransfers bank = new InMemoryBank();
@Test @Test
void testInit() { void testInit() {
assertEquals(0, bank.getFunds("foo")); assertEquals(0, bank.getFunds("foo"));

View File

@ -23,14 +23,14 @@
package com.iluwatar.hexagonal.banking; package com.iluwatar.hexagonal.banking;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader; import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader;
import com.mongodb.MongoClient; import com.mongodb.MongoClient;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Tests for Mongo banking adapter * Tests for Mongo banking adapter
*/ */
@ -45,7 +45,7 @@ class MongoBankTest {
@BeforeEach @BeforeEach
void init() { void init() {
MongoConnectionPropertiesLoader.load(); MongoConnectionPropertiesLoader.load();
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), var mongoClient = new MongoClient(System.getProperty("mongo-host"),
Integer.parseInt(System.getProperty("mongo-port"))); Integer.parseInt(System.getProperty("mongo-port")));
mongoClient.dropDatabase(TEST_DB); mongoClient.dropDatabase(TEST_DB);
mongoClient.close(); mongoClient.close();

View File

@ -23,40 +23,34 @@
package com.iluwatar.hexagonal.database; 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 com.iluwatar.hexagonal.test.LotteryTestUtils;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; 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} * Tests for {@link LotteryTicketRepository}
*
*/ */
class InMemoryTicketRepositoryTest { class InMemoryTicketRepositoryTest {
private final LotteryTicketRepository repository = new InMemoryTicketRepository(); private final LotteryTicketRepository repository = new InMemoryTicketRepository();
@BeforeEach @BeforeEach
void clear() { void clear() {
repository.deleteAll(); repository.deleteAll();
} }
@Test @Test
void testCrudOperations() { void testCrudOperations() {
LotteryTicketRepository repository = new InMemoryTicketRepository(); var repository = new InMemoryTicketRepository();
assertTrue(repository.findAll().isEmpty()); assertTrue(repository.findAll().isEmpty());
LotteryTicket ticket = LotteryTestUtils.createLotteryTicket(); var ticket = LotteryTestUtils.createLotteryTicket();
Optional<LotteryTicketId> id = repository.save(ticket); var id = repository.save(ticket);
assertTrue(id.isPresent()); assertTrue(id.isPresent());
assertEquals(1, repository.findAll().size()); assertEquals(1, repository.findAll().size());
Optional<LotteryTicket> optionalTicket = repository.findById(id.get()); var optionalTicket = repository.findById(id.get());
assertTrue(optionalTicket.isPresent()); assertTrue(optionalTicket.isPresent());
} }
} }

View File

@ -23,6 +23,9 @@
package com.iluwatar.hexagonal.database; 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.LotteryNumbers;
import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicket;
import com.iluwatar.hexagonal.domain.LotteryTicketId; 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.Disabled;
import org.junit.jupiter.api.Test; 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 * Tests for Mongo based ticket repository
*/ */
@ -53,7 +51,7 @@ class MongoTicketRepositoryTest {
@BeforeEach @BeforeEach
void init() { void init() {
MongoConnectionPropertiesLoader.load(); MongoConnectionPropertiesLoader.load();
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), var mongoClient = new MongoClient(System.getProperty("mongo-host"),
Integer.parseInt(System.getProperty("mongo-port"))); Integer.parseInt(System.getProperty("mongo-port")));
mongoClient.dropDatabase(TEST_DB); mongoClient.dropDatabase(TEST_DB);
mongoClient.close(); mongoClient.close();
@ -77,16 +75,16 @@ class MongoTicketRepositoryTest {
@Test @Test
void testCrudOperations() { void testCrudOperations() {
// create new lottery ticket and save it // create new lottery ticket and save it
PlayerDetails details = new PlayerDetails("foo@bar.com", "123-123", "07001234"); var details = new PlayerDetails("foo@bar.com", "123-123", "07001234");
LotteryNumbers random = LotteryNumbers.createRandom(); var random = LotteryNumbers.createRandom();
LotteryTicket original = new LotteryTicket(new LotteryTicketId(), details, random); var original = new LotteryTicket(new LotteryTicketId(), details, random);
Optional<LotteryTicketId> saved = repository.save(original); var saved = repository.save(original);
assertEquals(1, repository.getTicketsCollection().count()); assertEquals(1, repository.getTicketsCollection().count());
assertTrue(saved.isPresent()); assertTrue(saved.isPresent());
// fetch the saved lottery ticket from database and check its contents // 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()); assertTrue(found.isPresent());
LotteryTicket ticket = found.get(); var ticket = found.get();
assertEquals("foo@bar.com", ticket.getPlayerDetails().getEmail()); assertEquals("foo@bar.com", ticket.getPlayerDetails().getEmail());
assertEquals("123-123", ticket.getPlayerDetails().getBankAccount()); assertEquals("123-123", ticket.getPlayerDetails().getBankAccount());
assertEquals("07001234", ticket.getPlayerDetails().getPhoneNumber()); assertEquals("07001234", ticket.getPlayerDetails().getPhoneNumber());

View File

@ -23,47 +23,47 @@
package com.iluwatar.hexagonal.domain; 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 java.util.Set;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
/** /**
*
* Unit tests for {@link LotteryNumbers} * Unit tests for {@link LotteryNumbers}
*
*/ */
class LotteryNumbersTest { class LotteryNumbersTest {
@Test @Test
void testGivenNumbers() { 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); assertEquals(numbers.getNumbers().size(), 4);
assertTrue(numbers.getNumbers().contains(1)); assertTrue(numbers.getNumbers().contains(1));
assertTrue(numbers.getNumbers().contains(2)); assertTrue(numbers.getNumbers().contains(2));
assertTrue(numbers.getNumbers().contains(3)); assertTrue(numbers.getNumbers().contains(3));
assertTrue(numbers.getNumbers().contains(4)); assertTrue(numbers.getNumbers().contains(4));
} }
@Test @Test
void testNumbersCantBeModified() { 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)); assertThrows(UnsupportedOperationException.class, () -> numbers.getNumbers().add(5));
} }
@Test @Test
void testRandomNumbers() { void testRandomNumbers() {
LotteryNumbers numbers = LotteryNumbers.createRandom(); var numbers = LotteryNumbers.createRandom();
assertEquals(numbers.getNumbers().size(), LotteryNumbers.NUM_NUMBERS); assertEquals(numbers.getNumbers().size(), LotteryNumbers.NUM_NUMBERS);
} }
@Test @Test
void testEquals() { void testEquals() {
LotteryNumbers numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4)); var numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
LotteryNumbers numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4)); var numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
assertEquals(numbers1, numbers2); 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); assertNotEquals(numbers1, numbers3);
} }
} }

View File

@ -23,6 +23,10 @@
package com.iluwatar.hexagonal.domain; 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.Guice;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Injector; 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.domain.LotteryTicketCheckResult.CheckResult;
import com.iluwatar.hexagonal.module.LotteryTestingModule; import com.iluwatar.hexagonal.module.LotteryTestingModule;
import com.iluwatar.hexagonal.test.LotteryTestUtils; import com.iluwatar.hexagonal.test.LotteryTestUtils;
import java.util.Set;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
/** /**
*
* Test the lottery system * Test the lottery system
*
*/ */
class LotteryTest { class LotteryTest {
@ -62,38 +61,38 @@ class LotteryTest {
// add funds to the test player's bank account // add funds to the test player's bank account
wireTransfers.setFunds("123-12312", 100); wireTransfers.setFunds("123-12312", 100);
} }
@Test @Test
void testLottery() { void testLottery() {
// admin resets the lottery // admin resets the lottery
administration.resetLottery(); administration.resetLottery();
assertEquals(0, administration.getAllSubmittedTickets().size()); assertEquals(0, administration.getAllSubmittedTickets().size());
// players submit the lottery tickets // 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))); "123-12312", "+32425255", Set.of(1, 2, 3, 4)));
assertTrue(ticket1.isPresent()); 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))); "123-12312", "+32423455", Set.of(11, 12, 13, 14)));
assertTrue(ticket2.isPresent()); 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))); "123-12312", "+32421255", Set.of(6, 8, 13, 19)));
assertTrue(ticket3.isPresent()); assertTrue(ticket3.isPresent());
assertEquals(3, administration.getAllSubmittedTickets().size()); assertEquals(3, administration.getAllSubmittedTickets().size());
// perform lottery // perform lottery
LotteryNumbers winningNumbers = administration.performLottery(); var winningNumbers = administration.performLottery();
// cheat a bit for testing sake, use winning numbers to submit another ticket // 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())); "123-12312", "+12421255", winningNumbers.getNumbers()));
assertTrue(ticket4.isPresent()); assertTrue(ticket4.isPresent());
assertEquals(4, administration.getAllSubmittedTickets().size()); assertEquals(4, administration.getAllSubmittedTickets().size());
// check winners // check winners
Map<LotteryTicketId, LotteryTicket> tickets = administration.getAllSubmittedTickets(); var tickets = administration.getAllSubmittedTickets();
for (LotteryTicketId id: tickets.keySet()) { for (var id : tickets.keySet()) {
LotteryTicketCheckResult checkResult = service.checkTicketForPrize(id, winningNumbers); var checkResult = service.checkTicketForPrize(id, winningNumbers);
assertNotEquals(CheckResult.TICKET_NOT_SUBMITTED, checkResult.getResult()); assertNotEquals(CheckResult.TICKET_NOT_SUBMITTED, checkResult.getResult());
if (checkResult.getResult().equals(CheckResult.WIN_PRIZE)) { if (checkResult.getResult().equals(CheckResult.WIN_PRIZE)) {
assertTrue(checkResult.getPrizeAmount() > 0); assertTrue(checkResult.getPrizeAmount() > 0);
@ -101,9 +100,9 @@ class LotteryTest {
assertEquals(0, checkResult.getPrizeAmount()); assertEquals(0, checkResult.getPrizeAmount());
} }
} }
// check another ticket that has not been submitted // 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(CheckResult.TICKET_NOT_SUBMITTED, checkResult.getResult());
assertEquals(0, checkResult.getPrizeAmount()); assertEquals(0, checkResult.getPrizeAmount());
} }

View File

@ -23,25 +23,23 @@
package com.iluwatar.hexagonal.domain; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals; 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} * Unit tests for {@link LotteryTicketCheckResult}
*
*/ */
class LotteryTicketCheckResultTest { class LotteryTicketCheckResultTest {
@Test @Test
void testEquals() { void testEquals() {
LotteryTicketCheckResult result1 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE); var result1 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
LotteryTicketCheckResult result2 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE); var result2 = new LotteryTicketCheckResult(CheckResult.NO_PRIZE);
assertEquals(result1, result2); assertEquals(result1, result2);
LotteryTicketCheckResult result3 = new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 300000); var result3 = new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 300000);
assertNotEquals(result1, result3); assertNotEquals(result1, result3);
} }
} }

View File

@ -23,11 +23,11 @@
package com.iluwatar.hexagonal.domain; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals;
import org.junit.jupiter.api.Test;
/** /**
* Tests for lottery ticket id * Tests for lottery ticket id
*/ */
@ -35,12 +35,12 @@ class LotteryTicketIdTest {
@Test @Test
void testEquals() { void testEquals() {
LotteryTicketId ticketId1 = new LotteryTicketId(); var ticketId1 = new LotteryTicketId();
LotteryTicketId ticketId2 = new LotteryTicketId(); var ticketId2 = new LotteryTicketId();
LotteryTicketId ticketId3 = new LotteryTicketId(); var ticketId3 = new LotteryTicketId();
assertNotEquals(ticketId1, ticketId2); assertNotEquals(ticketId1, ticketId2);
assertNotEquals(ticketId2, ticketId3); assertNotEquals(ticketId2, ticketId3);
LotteryTicketId ticketId4 = new LotteryTicketId(ticketId1.getId()); var ticketId4 = new LotteryTicketId(ticketId1.getId());
assertEquals(ticketId1, ticketId4); assertEquals(ticketId1, ticketId4);
} }
} }

View File

@ -23,13 +23,12 @@
package com.iluwatar.hexagonal.domain; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals;
import java.util.Set;
import org.junit.jupiter.api.Test;
/** /**
* Test Lottery Tickets for equality * Test Lottery Tickets for equality
*/ */
@ -37,16 +36,16 @@ class LotteryTicketTest {
@Test @Test
void testEquals() { void testEquals() {
PlayerDetails details1 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322"); var details1 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
LotteryNumbers numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4)); var numbers1 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
LotteryTicket ticket1 = new LotteryTicket(new LotteryTicketId(), details1, numbers1); var ticket1 = new LotteryTicket(new LotteryTicketId(), details1, numbers1);
PlayerDetails details2 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322"); var details2 = new PlayerDetails("bob@foo.bar", "1212-121212", "+34332322");
LotteryNumbers numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4)); var numbers2 = LotteryNumbers.create(Set.of(1, 2, 3, 4));
LotteryTicket ticket2 = new LotteryTicket(new LotteryTicketId(), details2, numbers2); var ticket2 = new LotteryTicket(new LotteryTicketId(), details2, numbers2);
assertEquals(ticket1, ticket2); assertEquals(ticket1, ticket2);
PlayerDetails details3 = new PlayerDetails("elsa@foo.bar", "1223-121212", "+49332322"); var details3 = new PlayerDetails("elsa@foo.bar", "1223-121212", "+49332322");
LotteryNumbers numbers3 = LotteryNumbers.create(Set.of(1, 2, 3, 8)); var numbers3 = LotteryNumbers.create(Set.of(1, 2, 3, 8));
LotteryTicket ticket3 = new LotteryTicket(new LotteryTicketId(), details3, numbers3); var ticket3 = new LotteryTicket(new LotteryTicketId(), details3, numbers3);
assertNotEquals(ticket1, ticket3); assertNotEquals(ticket1, ticket3);
} }
} }

View File

@ -23,24 +23,22 @@
package com.iluwatar.hexagonal.domain; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals;
import org.junit.jupiter.api.Test;
/** /**
*
* Unit tests for {@link PlayerDetails} * Unit tests for {@link PlayerDetails}
*
*/ */
class PlayerDetailsTest { class PlayerDetailsTest {
@Test @Test
void testEquals() { void testEquals() {
PlayerDetails details1 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425"); var details1 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
PlayerDetails details2 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425"); var details2 = new PlayerDetails("tom@foo.bar", "11212-123434", "+12323425");
assertEquals(details1, details2); 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); assertNotEquals(details1, details3);
} }
} }

View File

@ -23,6 +23,8 @@
package com.iluwatar.hexagonal.eventlog; package com.iluwatar.hexagonal.eventlog;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.domain.PlayerDetails;
import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader; import com.iluwatar.hexagonal.mongo.MongoConnectionPropertiesLoader;
import com.mongodb.MongoClient; 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.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/** /**
* Tests for Mongo event log * Tests for Mongo event log
*/ */
@ -46,7 +46,7 @@ class MongoEventLogTest {
@BeforeEach @BeforeEach
void init() { void init() {
MongoConnectionPropertiesLoader.load(); MongoConnectionPropertiesLoader.load();
MongoClient mongoClient = new MongoClient(System.getProperty("mongo-host"), var mongoClient = new MongoClient(System.getProperty("mongo-host"),
Integer.parseInt(System.getProperty("mongo-port"))); Integer.parseInt(System.getProperty("mongo-port")));
mongoClient.dropDatabase(TEST_DB); mongoClient.dropDatabase(TEST_DB);
mongoClient.close(); mongoClient.close();
@ -60,7 +60,7 @@ class MongoEventLogTest {
@Test @Test
void testFundTransfers() { 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); mongoEventLog.prizeError(playerDetails, 1000);
assertEquals(1, mongoEventLog.getEventsCollection().count()); assertEquals(1, mongoEventLog.getEventsCollection().count());
mongoEventLog.prizeError(playerDetails, 1000); mongoEventLog.prizeError(playerDetails, 1000);

View File

@ -27,13 +27,10 @@ import com.iluwatar.hexagonal.domain.LotteryNumbers;
import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicket;
import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.LotteryTicketId;
import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.domain.PlayerDetails;
import java.util.Set; import java.util.Set;
/** /**
*
* Utilities for lottery tests * Utilities for lottery tests
*
*/ */
public class LotteryTestUtils { public class LotteryTestUtils {
@ -43,14 +40,14 @@ public class LotteryTestUtils {
public static LotteryTicket createLotteryTicket() { public static LotteryTicket createLotteryTicket() {
return createLotteryTicket("foo@bar.com", "12231-213132", "+99324554", Set.of(1, 2, 3, 4)); return createLotteryTicket("foo@bar.com", "12231-213132", "+99324554", Set.of(1, 2, 3, 4));
} }
/** /**
* @return lottery ticket * @return lottery ticket
*/ */
public static LotteryTicket createLotteryTicket(String email, String account, String phone, public static LotteryTicket createLotteryTicket(String email, String account, String phone,
Set<Integer> givenNumbers) { Set<Integer> givenNumbers) {
PlayerDetails details = new PlayerDetails(email, account, phone); var details = new PlayerDetails(email, account, phone);
LotteryNumbers numbers = LotteryNumbers.create(givenNumbers); var numbers = LotteryNumbers.create(givenNumbers);
return new LotteryTicket(new LotteryTicketId(), details, numbers); return new LotteryTicket(new LotteryTicketId(), details, numbers);
} }
} }

View File

@ -33,7 +33,7 @@ public class AddressFilter extends AbstractFilter {
@Override @Override
public String execute(Order order) { public String execute(Order order) {
String result = super.execute(order); var result = super.execute(order);
if (order.getAddress() == null || order.getAddress().isEmpty()) { if (order.getAddress() == null || order.getAddress().isEmpty()) {
return result + "Invalid address! "; return result + "Invalid address! ";
} else { } else {

View File

@ -54,14 +54,14 @@ public class App {
* @param args command line args * @param args command line args
*/ */
public static void main(String[] args) { public static void main(String[] args) {
FilterManager filterManager = new FilterManager(); var filterManager = new FilterManager();
filterManager.addFilter(new NameFilter()); filterManager.addFilter(new NameFilter());
filterManager.addFilter(new ContactFilter()); filterManager.addFilter(new ContactFilter());
filterManager.addFilter(new AddressFilter()); filterManager.addFilter(new AddressFilter());
filterManager.addFilter(new DepositFilter()); filterManager.addFilter(new DepositFilter());
filterManager.addFilter(new OrderFilter()); filterManager.addFilter(new OrderFilter());
Client client = new Client(); var client = new Client();
client.setFilterManager(filterManager); client.setFilterManager(filterManager);
} }
} }

View File

@ -25,7 +25,8 @@ package com.iluwatar.intercepting.filter;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
@ -65,11 +66,11 @@ public class Client extends JFrame { // NOSONAR
setSize(300, 300); setSize(300, 300);
jl = new JLabel("RUNNING..."); jl = new JLabel("RUNNING...");
jtFields = new JTextField[3]; jtFields = new JTextField[3];
for (int i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
jtFields[i] = new JTextField(); jtFields[i] = new JTextField();
} }
jtAreas = new JTextArea[2]; jtAreas = new JTextArea[2];
for (int i = 0; i < 2; i++) { for (var i = 0; i < 2; i++) {
jtAreas[i] = new JTextArea(); jtAreas[i] = new JTextArea();
} }
clearButton = new JButton("Clear"); clearButton = new JButton("Clear");
@ -80,7 +81,7 @@ public class Client extends JFrame { // NOSONAR
private void setup() { private void setup() {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
JPanel panel = new JPanel(); var panel = new JPanel();
add(jl, BorderLayout.SOUTH); add(jl, BorderLayout.SOUTH);
add(panel, BorderLayout.CENTER); add(panel, BorderLayout.CENTER);
panel.setLayout(new GridLayout(6, 2)); panel.setLayout(new GridLayout(6, 2));
@ -98,21 +99,11 @@ public class Client extends JFrame { // NOSONAR
panel.add(processButton); panel.add(processButton);
clearButton.addActionListener(e -> { clearButton.addActionListener(e -> {
for (JTextArea i : jtAreas) { Arrays.stream(jtAreas).forEach(i -> i.setText(""));
i.setText(""); Arrays.stream(jtFields).forEach(i -> i.setText(""));
}
for (JTextField i : jtFields) {
i.setText("");
}
}); });
processButton.addActionListener(e -> { processButton.addActionListener(this::actionPerformed);
Order order =
new Order(jtFields[0].getText(), jtFields[1].getText(), jtAreas[0].getText(), jtFields[2]
.getText(),
jtAreas[1].getText());
jl.setText(sendRequest(order));
});
JRootPane rootPane = SwingUtilities.getRootPane(processButton); JRootPane rootPane = SwingUtilities.getRootPane(processButton);
rootPane.setDefaultButton(processButton); rootPane.setDefaultButton(processButton);
@ -126,4 +117,14 @@ public class Client extends JFrame { // NOSONAR
public String sendRequest(Order order) { public String sendRequest(Order order) {
return filterManager.filterRequest(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));
}
} }

View File

@ -34,10 +34,11 @@ public class ContactFilter extends AbstractFilter {
@Override @Override
public String execute(Order order) { public String execute(Order order) {
String result = super.execute(order); var result = super.execute(order);
if (order.getContactNumber() == null || order.getContactNumber().isEmpty() var contactNumber = order.getContactNumber();
|| order.getContactNumber().matches(".*[^\\d]+.*") if (contactNumber == null || contactNumber.isEmpty()
|| order.getContactNumber().length() != 11) { || contactNumber.matches(".*[^\\d]+.*")
|| contactNumber.length() != 11) {
return result + "Invalid contact number! "; return result + "Invalid contact number! ";
} else { } else {
return result; return result;

View File

@ -32,8 +32,9 @@ public class DepositFilter extends AbstractFilter {
@Override @Override
public String execute(Order order) { public String execute(Order order) {
String result = super.execute(order); var result = super.execute(order);
if (order.getDepositNumber() == null || order.getDepositNumber().isEmpty()) { var depositNumber = order.getDepositNumber();
if (depositNumber == null || depositNumber.isEmpty()) {
return result + "Invalid deposit number! "; return result + "Invalid deposit number! ";
} else { } else {
return result; return result;

View File

@ -33,9 +33,9 @@ public class NameFilter extends AbstractFilter {
@Override @Override
public String execute(Order order) { public String execute(Order order) {
String result = super.execute(order); var result = super.execute(order);
if (order.getName() == null || order.getName().isEmpty() var name = order.getName();
|| order.getName().matches(".*[^\\w|\\s]+.*")) { if (name == null || name.isEmpty() || name.matches(".*[^\\w|\\s]+.*")) {
return result + "Invalid name! "; return result + "Invalid name! ";
} else { } else {
return result; return result;

View File

@ -32,8 +32,9 @@ public class OrderFilter extends AbstractFilter {
@Override @Override
public String execute(Order order) { public String execute(Order order) {
String result = super.execute(order); var result = super.execute(order);
if (order.getOrderItem() == null || order.getOrderItem().isEmpty()) { var orderItem = order.getOrderItem();
if (orderItem == null || orderItem.isEmpty()) {
return result + "Invalid order! "; return result + "Invalid order! ";
} else { } else {
return result; return result;

View File

@ -27,11 +27,10 @@ import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.stream.IntStream;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@ -58,9 +57,8 @@ public class Target extends JFrame { //NOSONAR
super("Order System"); super("Order System");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(640, 480); setSize(640, 480);
dtm = dtm = new DefaultTableModel(
new DefaultTableModel(new Object[]{"Name", "Contact Number", "Address", "Deposit Number", new Object[]{"Name", "Contact Number", "Address", "Deposit Number", "Order"}, 0);
"Order"}, 0);
jt = new JTable(dtm); jt = new JTable(dtm);
del = new JButton("Delete"); del = new JButton("Delete");
setup(); setup();
@ -68,18 +66,18 @@ public class Target extends JFrame { //NOSONAR
private void setup() { private void setup() {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
JPanel bot = new JPanel(); var bot = new JPanel();
add(jt.getTableHeader(), BorderLayout.NORTH); add(jt.getTableHeader(), BorderLayout.NORTH);
bot.setLayout(new BorderLayout()); bot.setLayout(new BorderLayout());
bot.add(del, BorderLayout.EAST); bot.add(del, BorderLayout.EAST);
add(bot, BorderLayout.SOUTH); add(bot, BorderLayout.SOUTH);
JScrollPane jsp = new JScrollPane(jt); var jsp = new JScrollPane(jt);
jsp.setPreferredSize(new Dimension(500, 250)); jsp.setPreferredSize(new Dimension(500, 250));
add(jsp, BorderLayout.CENTER); add(jsp, BorderLayout.CENTER);
del.addActionListener(new DListener()); del.addActionListener(new DListener());
JRootPane rootPane = SwingUtilities.getRootPane(del); var rootPane = SwingUtilities.getRootPane(del);
rootPane.setDefaultButton(del); rootPane.setDefaultButton(del);
setVisible(true); setVisible(true);
} }
@ -91,14 +89,12 @@ public class Target extends JFrame { //NOSONAR
class DListener implements ActionListener { class DListener implements ActionListener {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
int temp = jt.getSelectedRow(); var temp = jt.getSelectedRow();
if (temp == -1) { if (temp == -1) {
return; return;
} }
int temp2 = jt.getSelectedRowCount(); var temp2 = jt.getSelectedRowCount();
for (int i = 0; i < temp2; i++) { IntStream.range(0, temp2).forEach(i -> dtm.removeRow(temp));
dtm.removeRow(temp);
}
} }
} }
} }

View File

@ -26,15 +26,12 @@ package com.iluwatar.intercepting.filter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** /**
*
* Application test. * Application test.
*
*/ */
public class AppTest { public class AppTest {
@Test @Test
public void test() { public void test() {
String[] args = {}; App.main(new String[]{});
App.main(args);
} }
} }

View File

@ -23,8 +23,6 @@
package com.iluwatar.intercepting.filter; package com.iluwatar.intercepting.filter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock; 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.verifyZeroInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import org.junit.jupiter.api.Test;
/** /**
* Date: 12/13/15 - 3:01 PM * Date: 12/13/15 - 3:01 PM
* *
@ -42,20 +42,20 @@ public class FilterManagerTest {
@Test @Test
public void testFilterRequest() { public void testFilterRequest() {
final Target target = mock(Target.class); final var target = mock(Target.class);
final FilterManager filterManager = new FilterManager(); final var filterManager = new FilterManager();
assertEquals("RUNNING...", filterManager.filterRequest(mock(Order.class))); assertEquals("RUNNING...", filterManager.filterRequest(mock(Order.class)));
verifyZeroInteractions(target); verifyZeroInteractions(target);
} }
@Test @Test
public void testAddFilter() { public void testAddFilter() {
final Target target = mock(Target.class); final var target = mock(Target.class);
final FilterManager filterManager = new FilterManager(); final var filterManager = new FilterManager();
verifyZeroInteractions(target); verifyZeroInteractions(target);
final Filter filter = mock(Filter.class); final var filter = mock(Filter.class);
when(filter.execute(any(Order.class))).thenReturn("filter"); when(filter.execute(any(Order.class))).thenReturn("filter");
filterManager.addFilter(filter); filterManager.addFilter(filter);

View File

@ -23,17 +23,15 @@
package com.iluwatar.intercepting.filter; 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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame; 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 * Date: 12/13/15 - 2:17 PM
* *
@ -41,7 +39,8 @@ import static org.junit.jupiter.api.Assertions.assertSame;
*/ */
public class FilterTest { 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_ORDER = new Order("name", "12345678901", "addr", "dep", "");
private static final Order WRONG_DEPOSIT = new Order("name", "12345678901", "addr", "", "order"); private static final Order WRONG_DEPOSIT = new Order("name", "12345678901", "addr", "", "order");
private static final Order WRONG_ADDRESS = new Order("name", "12345678901", "", "dep", "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"); private static final Order WRONG_NAME = new Order("", "12345678901", "addr", "dep", "order");
static List<Object[]> getTestData() { static List<Object[]> getTestData() {
final List<Object[]> testData = new ArrayList<>(); return List.of(
testData.add(new Object[]{new NameFilter(), PERFECT_ORDER, ""}); new Object[]{new NameFilter(), PERFECT_ORDER, ""},
testData.add(new Object[]{new NameFilter(), WRONG_NAME, "Invalid name!"}); new Object[]{new NameFilter(), WRONG_NAME, "Invalid name!"},
testData.add(new Object[]{new NameFilter(), WRONG_CONTACT, ""}); new Object[]{new NameFilter(), WRONG_CONTACT, ""},
testData.add(new Object[]{new NameFilter(), WRONG_ADDRESS, ""}); new Object[]{new NameFilter(), WRONG_ADDRESS, ""},
testData.add(new Object[]{new NameFilter(), WRONG_DEPOSIT, ""}); new Object[]{new NameFilter(), WRONG_DEPOSIT, ""},
testData.add(new Object[]{new NameFilter(), WRONG_ORDER, ""}); new Object[]{new NameFilter(), WRONG_ORDER, ""},
testData.add(new Object[]{new ContactFilter(), PERFECT_ORDER, ""}); new Object[]{new ContactFilter(), PERFECT_ORDER, ""},
testData.add(new Object[]{new ContactFilter(), WRONG_NAME, ""}); new Object[]{new ContactFilter(), WRONG_NAME, ""},
testData.add(new Object[]{new ContactFilter(), WRONG_CONTACT, "Invalid contact number!"}); new Object[]{new ContactFilter(), WRONG_CONTACT, "Invalid contact number!"},
testData.add(new Object[]{new ContactFilter(), WRONG_ADDRESS, ""}); new Object[]{new ContactFilter(), WRONG_ADDRESS, ""},
testData.add(new Object[]{new ContactFilter(), WRONG_DEPOSIT, ""}); new Object[]{new ContactFilter(), WRONG_DEPOSIT, ""},
testData.add(new Object[]{new ContactFilter(), WRONG_ORDER, ""}); new Object[]{new ContactFilter(), WRONG_ORDER, ""},
testData.add(new Object[]{new AddressFilter(), PERFECT_ORDER, ""}); new Object[]{new AddressFilter(), PERFECT_ORDER, ""},
testData.add(new Object[]{new AddressFilter(), WRONG_NAME, ""}); new Object[]{new AddressFilter(), WRONG_NAME, ""},
testData.add(new Object[]{new AddressFilter(), WRONG_CONTACT, ""}); new Object[]{new AddressFilter(), WRONG_CONTACT, ""},
testData.add(new Object[]{new AddressFilter(), WRONG_ADDRESS, "Invalid address!"}); new Object[]{new AddressFilter(), WRONG_ADDRESS, "Invalid address!"},
testData.add(new Object[]{new AddressFilter(), WRONG_DEPOSIT, ""}); new Object[]{new AddressFilter(), WRONG_DEPOSIT, ""},
testData.add(new Object[]{new AddressFilter(), WRONG_ORDER, ""}); new Object[]{new AddressFilter(), WRONG_ORDER, ""},
testData.add(new Object[]{new DepositFilter(), PERFECT_ORDER, ""}); new Object[]{new DepositFilter(), PERFECT_ORDER, ""},
testData.add(new Object[]{new DepositFilter(), WRONG_NAME, ""}); new Object[]{new DepositFilter(), WRONG_NAME, ""},
testData.add(new Object[]{new DepositFilter(), WRONG_CONTACT, ""}); new Object[]{new DepositFilter(), WRONG_CONTACT, ""},
testData.add(new Object[]{new DepositFilter(), WRONG_ADDRESS, ""}); new Object[]{new DepositFilter(), WRONG_ADDRESS, ""},
testData.add(new Object[]{new DepositFilter(), WRONG_DEPOSIT, "Invalid deposit number!"}); new Object[]{new DepositFilter(), WRONG_DEPOSIT, "Invalid deposit number!"},
testData.add(new Object[]{new DepositFilter(), WRONG_ORDER, ""}); new Object[]{new DepositFilter(), WRONG_ORDER, ""},
testData.add(new Object[]{new OrderFilter(), PERFECT_ORDER, ""}); new Object[]{new OrderFilter(), PERFECT_ORDER, ""},
testData.add(new Object[]{new OrderFilter(), WRONG_NAME, ""}); new Object[]{new OrderFilter(), WRONG_NAME, ""},
testData.add(new Object[]{new OrderFilter(), WRONG_CONTACT, ""}); new Object[]{new OrderFilter(), WRONG_CONTACT, ""},
testData.add(new Object[]{new OrderFilter(), WRONG_ADDRESS, ""}); new Object[]{new OrderFilter(), WRONG_ADDRESS, ""},
testData.add(new Object[]{new OrderFilter(), WRONG_DEPOSIT, ""}); new Object[]{new OrderFilter(), WRONG_DEPOSIT, ""},
testData.add(new Object[]{new OrderFilter(), WRONG_ORDER, "Invalid order!"}); new Object[]{new OrderFilter(), WRONG_ORDER, "Invalid order!"}
);
return testData;
} }
@ParameterizedTest @ParameterizedTest
@MethodSource("getTestData") @MethodSource("getTestData")
public void testExecute(Filter filter, Order order, String expectedResult) { public void testExecute(Filter filter, Order order, String expectedResult) {
final String result = filter.execute(order); final var result = filter.execute(order);
assertNotNull(result); assertNotNull(result);
assertEquals(expectedResult, result.trim()); assertEquals(expectedResult, result.trim());
} }

View File

@ -23,10 +23,10 @@
package com.iluwatar.intercepting.filter; package com.iluwatar.intercepting.filter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
/** /**
* Date: 12/13/15 - 2:57 PM * Date: 12/13/15 - 2:57 PM
* *
@ -38,35 +38,35 @@ public class OrderTest {
@Test @Test
public void testSetName() { public void testSetName() {
final Order order = new Order(); final var order = new Order();
order.setName(EXPECTED_VALUE); order.setName(EXPECTED_VALUE);
assertEquals(EXPECTED_VALUE, order.getName()); assertEquals(EXPECTED_VALUE, order.getName());
} }
@Test @Test
public void testSetContactNumber() { public void testSetContactNumber() {
final Order order = new Order(); final var order = new Order();
order.setContactNumber(EXPECTED_VALUE); order.setContactNumber(EXPECTED_VALUE);
assertEquals(EXPECTED_VALUE, order.getContactNumber()); assertEquals(EXPECTED_VALUE, order.getContactNumber());
} }
@Test @Test
public void testSetAddress() { public void testSetAddress() {
final Order order = new Order(); final var order = new Order();
order.setAddress(EXPECTED_VALUE); order.setAddress(EXPECTED_VALUE);
assertEquals(EXPECTED_VALUE, order.getAddress()); assertEquals(EXPECTED_VALUE, order.getAddress());
} }
@Test @Test
public void testSetDepositNumber() { public void testSetDepositNumber() {
final Order order = new Order(); final var order = new Order();
order.setDepositNumber(EXPECTED_VALUE); order.setDepositNumber(EXPECTED_VALUE);
assertEquals(EXPECTED_VALUE, order.getDepositNumber()); assertEquals(EXPECTED_VALUE, order.getDepositNumber());
} }
@Test @Test
public void testSetOrder() { public void testSetOrder() {
final Order order = new Order(); final var order = new Order();
order.setOrderItem(EXPECTED_VALUE); order.setOrderItem(EXPECTED_VALUE);
assertEquals(EXPECTED_VALUE, order.getOrderItem()); assertEquals(EXPECTED_VALUE, order.getOrderItem());
} }

View File

@ -49,24 +49,24 @@ public class App {
* @param args command line args * @param args command line args
*/ */
public static void main(String[] args) { public static void main(String[] args) {
String tokenString = "4 3 2 - 1 + *"; var tokenString = "4 3 2 - 1 + *";
Stack<Expression> stack = new Stack<>(); var stack = new Stack<Expression>();
String[] tokenList = tokenString.split(" "); var tokenList = tokenString.split(" ");
for (String s : tokenList) { for (var s : tokenList) {
if (isOperator(s)) { if (isOperator(s)) {
Expression rightExpression = stack.pop(); var rightExpression = stack.pop();
Expression leftExpression = stack.pop(); var leftExpression = stack.pop();
LOGGER.info("popped from stack left: {} right: {}", LOGGER.info("popped from stack left: {} right: {}",
leftExpression.interpret(), rightExpression.interpret()); leftExpression.interpret(), rightExpression.interpret());
Expression operator = getOperatorInstance(s, leftExpression, rightExpression); var operator = getOperatorInstance(s, leftExpression, rightExpression);
LOGGER.info("operator: {}", operator); LOGGER.info("operator: {}", operator);
int result = operator.interpret(); var result = operator.interpret();
NumberExpression resultExpression = new NumberExpression(result); var resultExpression = new NumberExpression(result);
stack.push(resultExpression); stack.push(resultExpression);
LOGGER.info("push result to stack: {}", resultExpression.interpret()); LOGGER.info("push result to stack: {}", resultExpression.interpret());
} else { } else {
Expression i = new NumberExpression(s); var i = new NumberExpression(s);
stack.push(i); stack.push(i);
LOGGER.info("push to stack: {}", i.interpret()); LOGGER.info("push to stack: {}", i.interpret());
} }

View File

@ -26,15 +26,12 @@ package com.iluwatar.interpreter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** /**
*
* Application test * Application test
*
*/ */
public class AppTest { public class AppTest {
@Test @Test
public void test() { public void test() {
String[] args = {}; App.main(new String[]{});
App.main(args);
} }
} }

View File

@ -23,25 +23,23 @@
package com.iluwatar.interpreter; 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.api.TestInstance;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; 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 * Date: 12/14/15 - 11:48 AM
* * <p>
* Test Case for Expressions * Test Case for Expressions
*
* @param <E> Type of Expression * @param <E> Type of Expression
* @author Jeroen Meulemeester * @author Jeroen Meulemeester
*/ */
@ -55,13 +53,13 @@ public abstract class ExpressionTest<E extends Expression> {
* @return A stream with test entries * @return A stream with test entries
*/ */
static Stream<Arguments> prepareParameters(final IntBinaryOperator resultCalc) { static Stream<Arguments> prepareParameters(final IntBinaryOperator resultCalc) {
final List<Arguments> testData = new ArrayList<>(); final var testData = new ArrayList<Arguments>();
for (int i = -10; i < 10; i++) { for (var i = -10; i < 10; i++) {
for (int j = -10; j < 10; j++) { for (var j = -10; j < 10; j++) {
testData.add(Arguments.of( testData.add(Arguments.of(
new NumberExpression(i), new NumberExpression(i),
new NumberExpression(j), new NumberExpression(j),
resultCalc.applyAsInt(i, j) resultCalc.applyAsInt(i, j)
)); ));
} }
} }
@ -104,7 +102,7 @@ public abstract class ExpressionTest<E extends Expression> {
@ParameterizedTest @ParameterizedTest
@MethodSource("expressionProvider") @MethodSource("expressionProvider")
public void testInterpret(NumberExpression first, NumberExpression second, int result) { 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); assertNotNull(expression);
assertEquals(result, expression.interpret()); assertEquals(result, expression.interpret());
} }
@ -115,7 +113,7 @@ public abstract class ExpressionTest<E extends Expression> {
@ParameterizedTest @ParameterizedTest
@MethodSource("expressionProvider") @MethodSource("expressionProvider")
public void testToString(NumberExpression first, NumberExpression second) { public void testToString(NumberExpression first, NumberExpression second) {
final E expression = factory.apply(first, second); final var expression = factory.apply(first, second);
assertNotNull(expression); assertNotNull(expression);
assertEquals(expectedToString, expression.toString()); assertEquals(expectedToString, expression.toString());
} }

View File

@ -23,9 +23,8 @@
package com.iluwatar.interpreter; package com.iluwatar.interpreter;
import org.junit.jupiter.params.provider.Arguments;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.params.provider.Arguments;
/** /**
* Date: 12/14/15 - 12:08 PM * Date: 12/14/15 - 12:08 PM

View File

@ -23,9 +23,8 @@
package com.iluwatar.interpreter; package com.iluwatar.interpreter;
import org.junit.jupiter.params.provider.Arguments;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.params.provider.Arguments;
/** /**
* Date: 12/14/15 - 12:08 PM * 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 * Create a new test instance using the given test parameters and expected result
*
*/ */
public MultiplyExpressionTest() { public MultiplyExpressionTest() {
super("*", MultiplyExpression::new); super("*", MultiplyExpression::new);

View File

@ -23,14 +23,13 @@
package com.iluwatar.interpreter; 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.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; 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 * Date: 12/14/15 - 12:08 PM
* *
@ -61,9 +60,9 @@ public class NumberExpressionTest extends ExpressionTest<NumberExpression> {
@ParameterizedTest @ParameterizedTest
@MethodSource("expressionProvider") @MethodSource("expressionProvider")
public void testFromString(NumberExpression first) throws Exception { public void testFromString(NumberExpression first) throws Exception {
final int expectedValue = first.interpret(); final var expectedValue = first.interpret();
final String testStringValue = String.valueOf(expectedValue); final var testStringValue = String.valueOf(expectedValue);
final NumberExpression numberExpression = new NumberExpression(testStringValue); final var numberExpression = new NumberExpression(testStringValue);
assertEquals(expectedValue, numberExpression.interpret()); assertEquals(expectedValue, numberExpression.interpret());
} }

View File

@ -23,9 +23,8 @@
package com.iluwatar.interpreter; package com.iluwatar.interpreter;
import org.junit.jupiter.params.provider.Arguments;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.params.provider.Arguments;
/** /**
* Date: 12/14/15 - 12:08 PM * Date: 12/14/15 - 12:08 PM
@ -41,7 +40,7 @@ public class PlusExpressionTest extends ExpressionTest<PlusExpression> {
*/ */
@Override @Override
public Stream<Arguments> expressionProvider() { public Stream<Arguments> expressionProvider() {
return prepareParameters((f, s) -> f + s); return prepareParameters(Integer::sum);
} }
/** /**

View File

@ -30,7 +30,6 @@ import static com.iluwatar.iterator.list.ItemType.WEAPON;
import com.iluwatar.iterator.bst.BstIterator; import com.iluwatar.iterator.bst.BstIterator;
import com.iluwatar.iterator.bst.TreeNode; import com.iluwatar.iterator.bst.TreeNode;
import com.iluwatar.iterator.list.Item;
import com.iluwatar.iterator.list.ItemType; import com.iluwatar.iterator.list.ItemType;
import com.iluwatar.iterator.list.TreasureChest; import com.iluwatar.iterator.list.TreasureChest;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -53,7 +52,7 @@ public class App {
private static void demonstrateTreasureChestIteratorForType(ItemType itemType) { private static void demonstrateTreasureChestIteratorForType(ItemType itemType) {
LOGGER.info("------------------------"); LOGGER.info("------------------------");
LOGGER.info("Item Iterator for ItemType " + itemType + ": "); LOGGER.info("Item Iterator for ItemType " + itemType + ": ");
Iterator<Item> itemIterator = TREASURE_CHEST.iterator(itemType); var itemIterator = TREASURE_CHEST.iterator(itemType);
while (itemIterator.hasNext()) { while (itemIterator.hasNext()) {
LOGGER.info(itemIterator.next().toString()); LOGGER.info(itemIterator.next().toString());
} }
@ -62,15 +61,15 @@ public class App {
private static void demonstrateBstIterator() { private static void demonstrateBstIterator() {
LOGGER.info("------------------------"); LOGGER.info("------------------------");
LOGGER.info("BST Iterator: "); LOGGER.info("BST Iterator: ");
TreeNode<Integer> root = buildIntegerBst(); var root = buildIntegerBst();
BstIterator bstIterator = new BstIterator<>(root); var bstIterator = new BstIterator<Integer>(root);
while (bstIterator.hasNext()) { while (bstIterator.hasNext()) {
LOGGER.info("Next node: " + bstIterator.next().getVal()); LOGGER.info("Next node: " + bstIterator.next().getVal());
} }
} }
private static TreeNode<Integer> buildIntegerBst() { private static TreeNode<Integer> buildIntegerBst() {
TreeNode<Integer> root = new TreeNode<>(8); var root = new TreeNode<>(8);
root.insert(3); root.insert(3);
root.insert(10); root.insert(10);

View File

@ -78,7 +78,7 @@ public class BstIterator<T extends Comparable<T>> implements Iterator<TreeNode<T
if (pathStack.isEmpty()) { if (pathStack.isEmpty()) {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
TreeNode<T> next = pathStack.pop(); var next = pathStack.pop();
pushPathToNextSmallest(next.getRight()); pushPathToNextSmallest(next.getRight());
return next; return next;
} }

View File

@ -63,7 +63,7 @@ public TreeNode next() throws IllegalStateException {
if (pathStack.isEmpty()) { if (pathStack.isEmpty()) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
TreeNode next = pathStack.pop(); var next = pathStack.pop();
// follow right child to next smallest node // follow right child to next smallest node
pushPathToNextSmallest(next.getRight()); pushPathToNextSmallest(next.getRight());
return next; return next;

View File

@ -72,7 +72,7 @@ public class TreeNode<T extends Comparable<T>> {
* @param valToInsert The value to insert as a new TreeNode * @param valToInsert The value to insert as a new TreeNode
*/ */
public void insert(T valToInsert) { public void insert(T valToInsert) {
TreeNode<T> parent = getParentNodeOfValueToBeInserted(valToInsert); var parent = getParentNodeOfValueToBeInserted(valToInsert);
parent.insertNewChild(valToInsert); parent.insertNewChild(valToInsert);
} }
@ -84,7 +84,7 @@ public class TreeNode<T extends Comparable<T>> {
*/ */
private TreeNode<T> getParentNodeOfValueToBeInserted(T valToInsert) { private TreeNode<T> getParentNodeOfValueToBeInserted(T valToInsert) {
TreeNode<T> parent = null; TreeNode<T> parent = null;
TreeNode<T> curr = this; var curr = this;
while (curr != null) { while (curr != null) {
parent = curr; parent = curr;

View File

@ -24,7 +24,6 @@
package com.iluwatar.iterator.list; package com.iluwatar.iterator.list;
import com.iluwatar.iterator.Iterator; import com.iluwatar.iterator.Iterator;
import java.util.List;
/** /**
* TreasureChestItemIterator. * TreasureChestItemIterator.
@ -59,10 +58,9 @@ public class TreasureChestItemIterator implements Iterator<Item> {
} }
private int findNextIdx() { private int findNextIdx() {
List<Item> items = chest.getItems(); var items = chest.getItems();
boolean found = false; var tempIdx = idx;
int tempIdx = idx; while (true) {
while (!found) {
tempIdx++; tempIdx++;
if (tempIdx >= items.size()) { if (tempIdx >= items.size()) {
tempIdx = -1; tempIdx = -1;

View File

@ -32,7 +32,6 @@ class AppTest {
@Test @Test
void testApp() { void testApp() {
String[] args = {}; App.main(new String[]{});
App.main(args);
} }
} }

View File

@ -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.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.NoSuchElementException;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import java.util.NoSuchElementException;
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class BstIteratorTest { class BstIteratorTest {
@ -55,14 +54,14 @@ class BstIteratorTest {
@Test @Test
void nextForEmptyTree() { void nextForEmptyTree() {
BstIterator<Integer> iter = new BstIterator<>(emptyRoot); var iter = new BstIterator<>(emptyRoot);
assertThrows(NoSuchElementException.class, iter::next, assertThrows(NoSuchElementException.class, iter::next,
"next() should throw an IllegalStateException if hasNext() is false."); "next() should throw an IllegalStateException if hasNext() is false.");
} }
@Test @Test
void nextOverEntirePopulatedTree() { 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(1), iter.next().getVal(), "First Node is 1.");
assertEquals(Integer.valueOf(3), iter.next().getVal(), "Second Node is 3."); assertEquals(Integer.valueOf(3), iter.next().getVal(), "Second Node is 3.");
assertEquals(Integer.valueOf(4), iter.next().getVal(), "Third Node is 4."); assertEquals(Integer.valueOf(4), iter.next().getVal(), "Third Node is 4.");
@ -73,19 +72,19 @@ class BstIteratorTest {
@Test @Test
void hasNextForEmptyTree() { void hasNextForEmptyTree() {
BstIterator<Integer> iter = new BstIterator<>(emptyRoot); var iter = new BstIterator<>(emptyRoot);
assertFalse(iter.hasNext(), "hasNext() should return false for empty tree."); assertFalse(iter.hasNext(), "hasNext() should return false for empty tree.");
} }
@Test @Test
void hasNextForPopulatedTree() { void hasNextForPopulatedTree() {
BstIterator<Integer> iter = new BstIterator<>(nonEmptyRoot); var iter = new BstIterator<>(nonEmptyRoot);
assertTrue(iter.hasNext(), "hasNext() should return true for populated tree."); assertTrue(iter.hasNext(), "hasNext() should return true for populated tree.");
} }
@Test @Test
void nextAndHasNextOverEntirePopulatedTree() { void nextAndHasNextOverEntirePopulatedTree() {
BstIterator<Integer> iter = new BstIterator<>(nonEmptyRoot); var iter = new BstIterator<>(nonEmptyRoot);
assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); assertTrue(iter.hasNext(), "Iterator hasNext() should be true.");
assertEquals(Integer.valueOf(1), iter.next().getVal(), "First Node is 1."); assertEquals(Integer.valueOf(1), iter.next().getVal(), "First Node is 1.");
assertTrue(iter.hasNext(), "Iterator hasNext() should be true."); assertTrue(iter.hasNext(), "Iterator hasNext() should be true.");

View File

@ -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.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
import com.iluwatar.iterator.Iterator;
import java.util.List; import java.util.List;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.MethodSource;
@ -46,16 +45,16 @@ public class TreasureChestTest {
*/ */
public static List<Object[]> dataProvider() { public static List<Object[]> dataProvider() {
return List.of( return List.of(
new Object[]{new Item(ItemType.POTION, "Potion of courage")}, new Object[]{new Item(ItemType.POTION, "Potion of courage")},
new Object[]{new Item(ItemType.RING, "Ring of shadows")}, 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 wisdom")},
new Object[]{new Item(ItemType.POTION, "Potion of blood")}, new Object[]{new Item(ItemType.POTION, "Potion of blood")},
new Object[]{new Item(ItemType.WEAPON, "Sword of silver +1")}, 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 rust")},
new Object[]{new Item(ItemType.POTION, "Potion of healing")}, new Object[]{new Item(ItemType.POTION, "Potion of healing")},
new Object[]{new Item(ItemType.RING, "Ring of armor")}, new Object[]{new Item(ItemType.RING, "Ring of armor")},
new Object[]{new Item(ItemType.WEAPON, "Steel halberd")}, new Object[]{new Item(ItemType.WEAPON, "Steel halberd")},
new Object[]{new Item(ItemType.WEAPON, "Dagger of poison")} new Object[]{new Item(ItemType.WEAPON, "Dagger of poison")}
); );
} }
@ -66,16 +65,16 @@ public class TreasureChestTest {
@ParameterizedTest @ParameterizedTest
@MethodSource("dataProvider") @MethodSource("dataProvider")
public void testIterator(Item expectedItem) { public void testIterator(Item expectedItem) {
final TreasureChest chest = new TreasureChest(); final var chest = new TreasureChest();
final Iterator<Item> iterator = chest.iterator(expectedItem.getType()); final var iterator = chest.iterator(expectedItem.getType());
assertNotNull(iterator); assertNotNull(iterator);
while (iterator.hasNext()) { while (iterator.hasNext()) {
final Item item = iterator.next(); final var item = iterator.next();
assertNotNull(item); assertNotNull(item);
assertEquals(expectedItem.getType(), item.getType()); assertEquals(expectedItem.getType(), item.getType());
final String name = item.toString(); final var name = item.toString();
assertNotNull(name); assertNotNull(name);
if (expectedItem.toString().equals(name)) { if (expectedItem.toString().equals(name)) {
return; return;
@ -93,17 +92,17 @@ public class TreasureChestTest {
@ParameterizedTest @ParameterizedTest
@MethodSource("dataProvider") @MethodSource("dataProvider")
public void testGetItems(Item expectedItem) throws Exception { public void testGetItems(Item expectedItem) throws Exception {
final TreasureChest chest = new TreasureChest(); final var chest = new TreasureChest();
final List<Item> items = chest.getItems(); final var items = chest.getItems();
assertNotNull(items); assertNotNull(items);
for (final Item item : items) { for (final var item : items) {
assertNotNull(item); assertNotNull(item);
assertNotNull(item.getType()); assertNotNull(item.getType());
assertNotNull(item.toString()); assertNotNull(item.toString());
final boolean sameType = expectedItem.getType() == item.getType(); final var sameType = expectedItem.getType() == item.getType();
final boolean sameName = expectedItem.toString().equals(item.toString()); final var sameName = expectedItem.toString().equals(item.toString());
if (sameType && sameName) { if (sameType && sameName) {
return; return;
} }