diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..3b3b070 Binary files /dev/null and b/.DS_Store differ diff --git a/pom.xml b/pom.xml index 541b012..d296103 100644 --- a/pom.xml +++ b/pom.xml @@ -5,6 +5,14 @@ com.almasb CashMachine 0.1-SNAPSHOT + + + junit + junit + 4.13.1 + test + + jar diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..5f6f01e Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/java/rocks/zipcode/atm/ActionResult.java b/src/main/java/rocks/zipcode/atm/ActionResult.java index 8d41185..420a47d 100644 --- a/src/main/java/rocks/zipcode/atm/ActionResult.java +++ b/src/main/java/rocks/zipcode/atm/ActionResult.java @@ -1,38 +1,38 @@ -package rocks.zipcode.atm; - -/** - * @author ZipCodeWilmington - */ -public class ActionResult { - - private T data; - private String errorMessage; - - private ActionResult(T data) { - this.data = data; - } - - private ActionResult(String errorMessage) { - this.errorMessage = errorMessage; - } - - public T getData() { - return data; - } - - public String getErrorMessage() { - return errorMessage; - } - - public boolean isSuccess() { - return data != null; - } - - public static ActionResult success(E data) { - return new ActionResult(data); - } - - public static ActionResult fail(String errorMessage) { - return new ActionResult(errorMessage); - } -} +package rocks.zipcode.atm; + +/** + * @author ZipCodeWilmington + */ +public class ActionResult { + + private T data; + private String errorMessage; + + private ActionResult(T data) { + this.data = data; + } + + private ActionResult(String errorMessage) { + this.errorMessage = errorMessage; + } + + public T getData() { + return data; + } + + public String getErrorMessage() { + return errorMessage; + } + + public boolean isSuccess() { + return data != null; + } + + public static ActionResult success(E data) { + return new ActionResult(data); + } + + public static ActionResult fail(String errorMessage) { + return new ActionResult(errorMessage); + } +} diff --git a/src/main/java/rocks/zipcode/atm/CashMachine.java b/src/main/java/rocks/zipcode/atm/CashMachine.java index d6f8f74..838ec2d 100644 --- a/src/main/java/rocks/zipcode/atm/CashMachine.java +++ b/src/main/java/rocks/zipcode/atm/CashMachine.java @@ -1,75 +1,80 @@ -package rocks.zipcode.atm; - -import rocks.zipcode.atm.bank.AccountData; -import rocks.zipcode.atm.bank.Bank; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -/** - * @author ZipCodeWilmington - */ -public class CashMachine { - - private final Bank bank; - private AccountData accountData = null; - - public CashMachine(Bank bank) { - this.bank = bank; - } - - private Consumer update = data -> { - accountData = data; - }; - - public void login(int id) { - tryCall( - () -> bank.getAccountById(id), - update - ); - } - - public void deposit(int amount) { - if (accountData != null) { - tryCall( - () -> bank.deposit(accountData, amount), - update - ); - } - } - - public void withdraw(int amount) { - if (accountData != null) { - tryCall( - () -> bank.withdraw(accountData, amount), - update - ); - } - } - - public void exit() { - if (accountData != null) { - accountData = null; - } - } - - @Override - public String toString() { - return accountData != null ? accountData.toString() : "Try account 1000 or 2000 and click submit."; - } - - private void tryCall(Supplier > action, Consumer postAction) { - try { - ActionResult result = action.get(); - if (result.isSuccess()) { - T data = result.getData(); - postAction.accept(data); - } else { - String errorMessage = result.getErrorMessage(); - throw new RuntimeException(errorMessage); - } - } catch (Exception e) { - System.out.println("Error: " + e.getMessage()); - } - } -} +package rocks.zipcode.atm; + +import javafx.scene.control.TextField; +import rocks.zipcode.atm.bank.AccountData; +import rocks.zipcode.atm.bank.Bank; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * @author ZipCodeWilmington + */ +public class CashMachine { + + private final Bank bank; + private AccountData accountData = null; + + public CashMachine(Bank bank) { + this.bank = bank; + } + + private Consumer update = data -> { + accountData = data; + }; + + public Object login(int id) { + tryCall( + () -> bank.getAccountById(id), + update + ); + return null; + } + + public void deposit(Float amount) { + if (accountData != null) { + tryCall( + () -> bank.deposit(accountData, amount), + update + ); + } + } + + public void withdraw(Float amount) { + if (accountData != null) { + tryCall( + () -> bank.withdraw(accountData,amount), + update + + ); + } + } + + public void exit() { + if (accountData != null) { + accountData = null; + } + } + + @Override + public String toString() { + return accountData != null ? accountData.toString() : "Cleared"; + } + + private void tryCall(Supplier > action, Consumer postAction) { + try { + ActionResult result = action.get(); + if (result.isSuccess()) { + T data = result.getData(); + postAction.accept(data); + } else { + String errorMessage = result.getErrorMessage(); + throw new RuntimeException(errorMessage); + } + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + } + } + +} + diff --git a/src/main/java/rocks/zipcode/atm/CashMachineApp.java b/src/main/java/rocks/zipcode/atm/CashMachineApp.java index c0fada8..b8a4db9 100644 --- a/src/main/java/rocks/zipcode/atm/CashMachineApp.java +++ b/src/main/java/rocks/zipcode/atm/CashMachineApp.java @@ -1,78 +1,178 @@ -package rocks.zipcode.atm; - -import rocks.zipcode.atm.bank.Bank; -import javafx.application.Application; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; -import javafx.scene.layout.FlowPane; - -/** - * @author ZipCodeWilmington - */ -public class CashMachineApp extends Application { - - private TextField field = new TextField(); - private CashMachine cashMachine = new CashMachine(new Bank()); - - private Parent createContent() { - VBox vbox = new VBox(10); - vbox.setPrefSize(600, 600); - - TextArea areaInfo = new TextArea(); - - Button btnSubmit = new Button("Set Account ID"); - btnSubmit.setOnAction(e -> { - int id = Integer.parseInt(field.getText()); - cashMachine.login(id); - - areaInfo.setText(cashMachine.toString()); - }); - - Button btnDeposit = new Button("Deposit"); - btnDeposit.setOnAction(e -> { - int amount = Integer.parseInt(field.getText()); - cashMachine.deposit(amount); - - areaInfo.setText(cashMachine.toString()); - }); - - Button btnWithdraw = new Button("Withdraw"); - btnWithdraw.setOnAction(e -> { - int amount = Integer.parseInt(field.getText()); - cashMachine.withdraw(amount); - - areaInfo.setText(cashMachine.toString()); - }); - - Button btnExit = new Button("Exit"); - btnExit.setOnAction(e -> { - cashMachine.exit(); - - areaInfo.setText(cashMachine.toString()); - }); - - FlowPane flowpane = new FlowPane(); - - flowpane.getChildren().add(btnSubmit); - flowpane.getChildren().add(btnDeposit); - flowpane.getChildren().add(btnWithdraw); - flowpane.getChildren().add(btnExit); - vbox.getChildren().addAll(field, flowpane, areaInfo); - return vbox; - } - - @Override - public void start(Stage stage) throws Exception { - stage.setScene(new Scene(createContent())); - stage.show(); - } - - public static void main(String[] args) { - launch(args); - } -} +package rocks.zipcode.atm; +import javafx.scene.control.*; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; +import javafx.scene.text.Text; +import javafx.stage.StageStyle; +import rocks.zipcode.atm.bank.Bank; +import javafx.application.Application; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import javafx.scene.layout.VBox; +import rocks.zipcode.atm.bank.PremiumAccount; + +/** + * @author ZipCodeWilmington + */ +public class CashMachineApp extends Application { + private Button btnSubmit; + private Button btnDeposit; + private Button btnWithdraw; + private Button btnClear; + private Button btnExit; + private PremiumAccount premiumAccount; + +private TextField accountId = new TextField(); +private TextField deposit = new TextField(); +private TextField withdraw = new TextField(); + + +public float getPremiumAcct() { + return premiumAccount.getBalance(); +} +private CashMachine cashMachine = new CashMachine(new Bank()); + + private Parent createContent() { + withdraw.setMaxWidth(180); + withdraw.setTranslateX(575); + withdraw.setTranslateY(25); + deposit.setMaxWidth(175); + deposit.setTranslateX(300); + deposit.setTranslateY(100); + accountId.setTranslateX(30); + accountId.setTranslateY(133); + accountId.setMaxWidth(175); + + // Banner + Text text = new Text("ZipCloud Bank"); + text.setTranslateX(280); + text.setTranslateY(0); + text.setFill(Color.GREEN); + text.setFont(Font.font("Verdana", FontWeight.BOLD, 25)); + + accountId.setStyle("-fx-text-inner-color: Green;"); + accountId.setFont(Font.font("Verdana", FontWeight.BOLD, 12)); + deposit.setStyle("-fx-text-inner-color: Green;"); + deposit.setFont(Font.font("Verdana", FontWeight.BOLD, 12)); + withdraw.setStyle("-fx-text-inner-color: Green;"); + withdraw.setFont(Font.font("Verdana", FontWeight.BOLD, 12)); + VBox vbox = new VBox(10); + vbox.setPrefSize(500, 500); + + TextArea areaInfo = new TextArea(); + + areaInfo.setMaxWidth(500); + areaInfo.setTranslateX(140); + areaInfo.setFont(Font.font("Verdana", FontWeight.BOLD, 15)); + areaInfo.setStyle("-fx-text-inner-color: Green;"); + accountId.setPromptText("Enter Account ID"); + deposit.setPromptText("Enter Deposit Amount"); + withdraw.setPromptText("Enter Withdraw Amount"); + + areaInfo.setPrefHeight(200); + areaInfo.setPrefWidth(200); + + btnSubmit = new Button("Login/Submit"); + btnSubmit.setTranslateX(5); + btnSubmit.setTranslateY(250); + btnSubmit.setStyle("-fx-font: 15 arial; -fx-base: #0A8B54;"); + + btnSubmit.setOnAction(e -> { + areaInfo.setText("Please input account id 10, 20, 30, or 40 to start."); + btnDeposit.setVisible(true); + btnWithdraw.setVisible(true); + btnClear.setVisible(true); + btnExit.setVisible(true); + // btnAllAccounts.setVisible(true); + int id = Integer.parseInt(accountId.getText()); + cashMachine.login(id); + areaInfo.setText(cashMachine.toString()); + }); + btnDeposit = new Button("Deposit"); + btnDeposit.setTranslateX(30); + btnDeposit.setTranslateY(250); + btnDeposit.setStyle("-fx-font: 15 arial; -fx-base: #0A8B54;"); + btnDeposit.setOnAction(e -> { + Float amount = Float.parseFloat(deposit.getText()); + if (amount < 0) { + areaInfo.setText("Input cannot be negative. Please try again."); + deposit.clear(); + } else { + cashMachine.deposit(amount); + areaInfo.setText(cashMachine.toString()); + } + }); + btnWithdraw = new Button("Withdraw"); + btnWithdraw.setTranslateX(380); + btnWithdraw.setTranslateY(250); + btnWithdraw.setStyle("-fx-font: 15 arial; -fx-base: #0A8B54;"); + btnWithdraw.setOnAction(e -> { + Float amount = Float.parseFloat(withdraw.getText()); + if (amount < 0) { + areaInfo.setText("Sorry, you can not withdraw a negative amount"); +// } else if(amount ) +// } else { + cashMachine.withdraw(amount); + areaInfo.setText(cashMachine.toString()); + } + }); + btnClear = new Button("Clear"); + btnClear.setTranslateX(85); + btnClear.setTranslateY(250); + btnClear.setStyle("-fx-font: 15 arial; -fx-base: #0A8B54;"); + btnClear.setOnAction(e -> { + accountId.clear(); + deposit.clear(); + withdraw.clear(); + cashMachine.exit(); + areaInfo.setText(cashMachine.toString()); + }); + btnExit = new Button("Exit"); + btnExit.setTranslateX(35); + btnExit.setTranslateY(300); + btnExit.setStyle("-fx-font: 15 arial; -fx-base: #0A8B54;"); + btnExit.setOnAction(e -> { + System.exit(0); + areaInfo.setText(cashMachine.toString()); + + }); + + FlowPane flowpane = new FlowPane(); + flowpane.getChildren().add(btnSubmit); + flowpane.getChildren().add(btnDeposit); + flowpane.getChildren().add(btnWithdraw); + flowpane.getChildren().add(btnClear); + flowpane.getChildren().add(btnExit); + vbox.getChildren().addAll(accountId, deposit, text, withdraw, flowpane, areaInfo); + return vbox; + + + } + +@Override +public void start(Stage stage) throws Exception { + stage.setTitle("Welcome to ZipCloud Bank"); + stage.setWidth(800); + stage.setHeight(600); + stage.initStyle(StageStyle.DECORATED); + stage.setScene(new Scene(createContent())); + + stage.show(); + + btnDeposit.setVisible(false); + btnWithdraw.setVisible(false); + btnClear.setVisible(false); + btnExit.setVisible(false); + + } +public static void main(String[] args) { + launch(args); + } +} + + +/////************* + diff --git a/src/main/java/rocks/zipcode/atm/bank/Account.java b/src/main/java/rocks/zipcode/atm/bank/Account.java index 53a0fa8..966fcea 100644 --- a/src/main/java/rocks/zipcode/atm/bank/Account.java +++ b/src/main/java/rocks/zipcode/atm/bank/Account.java @@ -1,43 +1,45 @@ -package rocks.zipcode.atm.bank; - -/** - * @author ZipCodeWilmington - */ -public abstract class Account { - - private AccountData accountData; - - public Account(AccountData accountData) { - this.accountData = accountData; - } - - public AccountData getAccountData() { - return accountData; - } - - public void deposit(int amount) { - updateBalance(getBalance() + amount); - } - - public boolean withdraw(int amount) { - if (canWithdraw(amount)) { - updateBalance(getBalance() - amount); - return true; - } else { - return false; - } - } - - protected boolean canWithdraw(int amount) { - return getBalance() >= amount; - } - - public int getBalance() { - return accountData.getBalance(); - } - - private void updateBalance(int newBalance) { - accountData = new AccountData(accountData.getId(), accountData.getName(), accountData.getEmail(), - newBalance); - } -} +package rocks.zipcode.atm.bank; + +/** + * @author ZipCodeWilmington + */ +public abstract class Account { + + private AccountData accountData; + + public Account(AccountData accountData) { + this.accountData = accountData; + } + + public AccountData getAccountData() { + return accountData; + } + + public void deposit(float amount) { + updateBalance(getBalance() + amount); + } + + public boolean withdraw (float amount){ + if (canWithdraw(amount)) { + updateBalance(getBalance() - amount); + return true; + } else { + return false; + } + } + + protected boolean canWithdraw (float amount){ + return getBalance() >= amount; + } + + public float getBalance () { + return accountData.getBalance(); + } + + private void updateBalance (float newBalance){ + accountData = new AccountData(accountData.getId(), accountData.getAcctType(), accountData.getName(), accountData.getEmail(), + newBalance); + } + +} + diff --git a/src/main/java/rocks/zipcode/atm/bank/AccountData.java b/src/main/java/rocks/zipcode/atm/bank/AccountData.java index 0255385..fe2fa44 100644 --- a/src/main/java/rocks/zipcode/atm/bank/AccountData.java +++ b/src/main/java/rocks/zipcode/atm/bank/AccountData.java @@ -1,44 +1,70 @@ -package rocks.zipcode.atm.bank; - -/** - * @author ZipCodeWilmington - */ -public final class AccountData { - - private final int id; - private final String name; - private final String email; - - private final int balance; - - AccountData(int id, String name, String email, int balance) { - this.id = id; - this.name = name; - this.email = email; - this.balance = balance; - } - - public int getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public int getBalance() { - return balance; - } - - @Override - public String toString() { - return "Account id: " + id + '\n' + - "Name: " + name + '\n' + - "Email: " + email + '\n' + - "Balance: " + balance; - } -} +package rocks.zipcode.atm.bank; + + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +import javafx.scene.control.Alert; + + +/** + * @author ZipCodeWilmington + */ +public final class AccountData { + + private final int id; + private final String acctType; + private final String name; + private final String email; + private final Float balance; + + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + + AccountData( int id, String acctType, String name, String email,float balance){ + this.id = id; + this.acctType = acctType; + this.name = name; + this.email = email; + this.balance = balance; + } + + public int getId() { + return id; + } + + public String getAcctType() { + return acctType; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + public Float getBalance() { + return balance; + } + public static Float round(float d,int decimalPlace){ + BigDecimal bd = new BigDecimal(Float.toString(d)); + bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); + return bd.floatValue(); + } + + @Override + public String toString () { + return "Account id: " + id + '\n' + + "Account type: " + acctType + '\n' + + "Name: " + name + '\n' + + "Email: " + email + '\n' + + "Balance: " + String.format("$" + "%,.2f", Float.valueOf(decimalFormat.format(balance))); + + } + + } + + + + + diff --git a/src/main/java/rocks/zipcode/atm/bank/Bank.java b/src/main/java/rocks/zipcode/atm/bank/Bank.java index 5bd5bbf..5573fbd 100644 --- a/src/main/java/rocks/zipcode/atm/bank/Bank.java +++ b/src/main/java/rocks/zipcode/atm/bank/Bank.java @@ -1,52 +1,67 @@ -package rocks.zipcode.atm.bank; - -import rocks.zipcode.atm.ActionResult; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author ZipCodeWilmington - */ -public class Bank { - - private Map accounts = new HashMap<>(); - - public Bank() { - accounts.put(1000, new BasicAccount(new AccountData( - 1000, "Example 1", "example1@gmail.com", 500 - ))); - - accounts.put(2000, new PremiumAccount(new AccountData( - 2000, "Example 2", "example2@gmail.com", 200 - ))); - } - - public ActionResult getAccountById(int id) { - Account account = accounts.get(id); - - if (account != null) { - return ActionResult.success(account.getAccountData()); - } else { - return ActionResult.fail("No account with id: " + id + "\nTry account 1000 or 2000"); - } - } - - public ActionResult deposit(AccountData accountData, int amount) { - Account account = accounts.get(accountData.getId()); - account.deposit(amount); - - return ActionResult.success(account.getAccountData()); - } - - public ActionResult withdraw(AccountData accountData, int amount) { - Account account = accounts.get(accountData.getId()); - boolean ok = account.withdraw(amount); - - if (ok) { - return ActionResult.success(account.getAccountData()); - } else { - return ActionResult.fail("Withdraw failed: " + amount + ". Account has: " + account.getBalance()); - } - } -} +package rocks.zipcode.atm.bank; + +import rocks.zipcode.atm.ActionResult; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ZipCodeWilmington + */ +public class Bank { + + private Map accounts = new HashMap<>(); + + public Bank() { + accounts.put(10, new BasicAccount(new AccountData( + 10,"Basic","Bruce Wayne", "brucewayne.wayneenterprises@google.com", 1045658.89f + ))); + + accounts.put(20, new PremiumAccount(new AccountData( + 20, "Premium","Clark Kent" , "clarkkent.dailyplanet@gmail.com", 51456.58f + ))); + accounts.put(30, new BasicAccount(new AccountData( + 30, "Basic", "Steve Rogers", "steveRogers1.@army.mil", 23423479.23f + ))); + accounts.put(40, new PremiumAccount(new AccountData( + 40, "Premium", "Peter Parker", "peterparker@midtownhigh.edu", 1232146f + + ))); + } + + public ActionResult getAccountById(int id) { + Account account = accounts.get(id); + + if (account != null) { + return ActionResult.success(account.getAccountData()); + + } else { + return ActionResult.fail("No account with id: " + id + "\nPlease input account numbers 10, 20, 30, 40"); + } + } + + public ActionResult deposit(AccountData accountData, Float amount) { + Account account = accounts.get(accountData.getId()); + account.deposit(amount); + + return ActionResult.success(account.getAccountData()); + } + + public ActionResult withdraw(AccountData accountData, Float amount) { + Account account = accounts.get(accountData.getId()); + boolean ok = account.withdraw(amount); + + if (ok) { + return ActionResult.success(account.getAccountData()); + } else { + return ActionResult.fail("Withdraw failed: " + amount + ". Account has: " + account.getBalance()); + } + + } + + public Map getAccounts() { + return accounts; + } +} + diff --git a/src/main/java/rocks/zipcode/atm/bank/BasicAccount.java b/src/main/java/rocks/zipcode/atm/bank/BasicAccount.java index 08e94a3..cd94df1 100644 --- a/src/main/java/rocks/zipcode/atm/bank/BasicAccount.java +++ b/src/main/java/rocks/zipcode/atm/bank/BasicAccount.java @@ -1,11 +1,17 @@ -package rocks.zipcode.atm.bank; - -/** - * @author ZipCodeWilmington - */ -public class BasicAccount extends Account { - - public BasicAccount(AccountData accountData) { - super(accountData); - } -} +package rocks.zipcode.atm.bank; + +/** + * @author ZipCodeWilmington + */ +public class BasicAccount extends Account { + + public BasicAccount(AccountData accountData) { + super(accountData); + } +} + + + + + + diff --git a/src/main/java/rocks/zipcode/atm/bank/PremiumAccount.java b/src/main/java/rocks/zipcode/atm/bank/PremiumAccount.java index e4c9616..25cf2f4 100644 --- a/src/main/java/rocks/zipcode/atm/bank/PremiumAccount.java +++ b/src/main/java/rocks/zipcode/atm/bank/PremiumAccount.java @@ -1,18 +1,19 @@ -package rocks.zipcode.atm.bank; - -/** - * @author ZipCodeWilmington - */ -public class PremiumAccount extends Account { - - private static final int OVERDRAFT_LIMIT = 100; - - public PremiumAccount(AccountData accountData) { - super(accountData); - } - - @Override - protected boolean canWithdraw(int amount) { - return getBalance() + OVERDRAFT_LIMIT >= amount; - } -} +package rocks.zipcode.atm.bank; + +/** + * @author ZipCodeWilmington + */ +public class PremiumAccount extends Account { + + private static final float OVERDRAFT_LIMIT = 100; + + public PremiumAccount(AccountData accountData) { + super(accountData); + } + + @Override + protected boolean canWithdraw(float amount) { + return getBalance() + OVERDRAFT_LIMIT >= amount; + } + +} \ No newline at end of file diff --git a/src/test/java/rocks/zipcode/atm/bank/AccountTest.java b/src/test/java/rocks/zipcode/atm/bank/AccountTest.java new file mode 100644 index 0000000..6476eb3 --- /dev/null +++ b/src/test/java/rocks/zipcode/atm/bank/AccountTest.java @@ -0,0 +1,44 @@ +package rocks.zipcode.atm.bank; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AccountTest { + + @Test + public void deposit() { + // Given + Bank bank = new Bank(); + Account account = bank.getAccounts().get(10); + + //When + account.deposit(100.00f); + + + // Expected + Float expected = 1045658.89f + 100.00f; + Float actual = account.getBalance(); + + Assert.assertEquals(actual, expected); + } + + @Test + public void withdraw() { + // Given + Bank bank = new Bank(); + Account account = bank.getAccounts().get(10); + + //When + account.withdraw(100.00f); + + + // Expected + Float expected = 1045658.89f - 100.00f; + Float actual = account.getBalance(); + + Assert.assertEquals(actual, expected); + + } +}