diff --git a/README.md b/README.md index 92d73b7..d99ef06 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Week 2 project: ATM Simulator Every feature must have corresponding unit tests Tests should demonstrate proper behavior, and proper handling of misuse (eg. attempts to deposit/transfer/withdraw negative amounts -- User interface: CLI (Command line interface) Only +- atmproject.User interface: CLI (Command line interface) Only - Direct Input - Numbered options (instead of on-screen buttons) - ASCII art welcome but not required @@ -17,19 +17,19 @@ Tests should demonstrate proper behavior, and proper handling of misuse (eg. att - Account Actions - Withdraw from acct - Deposit to acct - - Transfer across accounts (self) + - Transfer across atmproject.accounts (self) - Open new account - Close account (must be empty) - Print transaction history - Check balance - **Challenge:** Transfer to another user's account (but not from) - Support multiple users - - Users have associated accounts + - Users have associated atmproject.accounts - Can create new user - Users are authenticated with a password (generated or provided on user creation) - Can exit a user and enter another user - **BONUS** Persistence - - Users and accounts remain persistent + - Users and atmproject.accounts remain persistent - Opportunity for research diff --git a/pom.xml b/pom.xml index 9901415..943b707 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,20 @@ io.zipcoder project-2-atm 1.0-SNAPSHOT + + + junit + junit + 4.12 + compile + + + junit + junit + 4.12 + test + + \ No newline at end of file diff --git a/src/main/java/atmproject/ATM.java b/src/main/java/atmproject/ATM.java new file mode 100644 index 0000000..11ce5bb --- /dev/null +++ b/src/main/java/atmproject/ATM.java @@ -0,0 +1,177 @@ +package atmproject; + + +import atmproject.accounts.Account; +import atmproject.accounts.InvestmentsAccount; +import atmproject.accounts.SavingsAccount; + + +public class ATM { + private Console console = new Console(System.in, System.out); + private UserLogin userLogin = new UserLogin(); + private User currentUser; + private boolean running = true; + private AccountMenu accountMenu = new AccountMenu(); + private Language language = new Language(); + + public void turnOnATM(){ + userLogin.runLoginMenu(); + } + + + public void runMainMenu(User currentUser) { + setCurrentUser(currentUser); + while (running) { + console.println(language.getLang(Language.LangKey.MAINMENU)); + Integer userInput = console.getIntegerInput(":"); + mainMenuLogic(userInput); + } + } + + public void mainMenuLogic(Integer userInput){ + switch (userInput) { + case 1: + String transaction = callDeposit(); + console.println(transaction); + currentUser.addToHistory(transaction + "\n"); + break; + case 2: + transaction = callWithdraw(); + console.println(transaction); + currentUser.addToHistory(transaction + "\n"); + break; + case 3: + if (currentUser.getAccountList().size() >= 2) { + transaction = callTransfer(); + console.println(transaction); + currentUser.addToHistory(transaction + "\n"); + } else { + console.println("ERROR: Not enough accounts to transfer money. Please create a new one."); + } + break; + case 4: + console.println(checkBalance()); + break; + case 5: + console.println(displayHistory(currentUser)); + break; + case 6: + callCreateAccount(); + break; + case 7: + callRemoveAccount(); + break; + case 8: + returnToLoginMenu(); + break; + } + giveInterest(); + } + + public String callDeposit() { + Account chosenAccount = accountMenu.selectAccount(currentUser); + console.println("How much would you like to deposit?"); + Double userInput = console.getDoubleInput("$"); + chosenAccount.deposit(userInput); + return String.format("You deposited $%.2f to %s.", userInput, chosenAccount.getAccountName()); + } + + public String callWithdraw() { + Account chosenAccount = accountMenu.selectAccount(currentUser); + console.println("How much would you like to withdraw?"); + Double userInput = console.getDoubleInput("$"); + if(userInput <= chosenAccount.getBalance()){ + chosenAccount.withdraw(userInput); + return String.format("You withdrew $%.2f from %s.\n", userInput, chosenAccount.getAccountName()); + } + return "ERROR: insufficient funds for withdraw.\n"; + } + + public String callTransfer(){ + Account chosenAccount = accountMenu.selectAccount(currentUser); + Account destinationAccount = accountMenu.selectAccount(currentUser); + if(chosenAccount.equals(destinationAccount)){ + return "ERROR: Incorrect account entry\n"; + } else { + console.println("How much would you like to transfer?"); + Double userInput = console.getDoubleInput("$"); + if(userInput <= chosenAccount.getBalance()){ + chosenAccount.transfer(destinationAccount, userInput); + return String.format("You transferred $%.2f from %s to %s.\n",userInput, chosenAccount.getAccountName(), destinationAccount.getAccountName()); + } + return "ERROR: Insufficient funds for transfer.\n"; + } + } + + public void callCreateAccount(){ + console.println("What kind of account would you like to create?\n(1) - Checkings\n(2) - Savings\n(3) - Investments"); + Integer typeOfAccount = console.getIntegerInput(":"); + switch(typeOfAccount) { + case 1: + Account account = new Account(currentUser, 0.0, "Checkings Account#" + (currentUser.getAccountList().size() + 1)); + currentUser.addAccount(account); + break; + case 2: + SavingsAccount savingsAccount = new SavingsAccount(currentUser, 0.0, "Savings Account#" + (currentUser.getAccountList().size() + 1)); + currentUser.addAccount(savingsAccount); + break; + case 3: + createInvestmentAccount(); + break; + + } + } + + public void callRemoveAccount() { + Account chosenAccount = accountMenu.selectAccount(currentUser); + if(currentUser.getAccountList().containsValue(chosenAccount)){ + currentUser.removeAccount(chosenAccount); + } else { + console.println("ERROR: Chosen account not found."); + } + } + + private void createInvestmentAccount() { + console.println("At this bank, you'll need an initial deposit of $15,000 to open an investment account.\nHow " + + "much would you like to deposit?"); + Integer input = console.getIntegerInput(":"); + if(input > 14999) { + InvestmentsAccount investmentsAccount = new InvestmentsAccount(currentUser, (double)input, "Investment Account#" + (currentUser.getAccountList().size() + 1)); + currentUser.addAccount(investmentsAccount); + } else { + console.println("That is not enough of an initial deposit"); + } + } + + public String checkBalance() { + Account chosenAccount = accountMenu.selectAccount(currentUser); + return String.format("The balance in %s is $%.2f\n", chosenAccount.getAccountName(), chosenAccount.getBalance()); + } + + public String displayHistory(User currentUser) { + if(currentUser.getTransactionHistory().isEmpty()){ + return "You currently have no history."; + } + return currentUser.displayHistory(); + } + + public void returnToLoginMenu() { + running = false; + } + + public void giveInterest(){ + for(String name : currentUser.getAccountList().keySet()){ + if(currentUser.getAccountList().get(name) instanceof SavingsAccount){ + ((SavingsAccount) currentUser.getAccountList().get(name)).addInterest(); + } + } + } + + public void setCurrentUser(User currentUser) { + this.currentUser = currentUser; + } + + public boolean isRunning() { + return running; + } +} \ No newline at end of file diff --git a/src/main/java/atmproject/AccountMenu.java b/src/main/java/atmproject/AccountMenu.java new file mode 100644 index 0000000..604009b --- /dev/null +++ b/src/main/java/atmproject/AccountMenu.java @@ -0,0 +1,54 @@ +package atmproject; + +import atmproject.accounts.Account; +import atmproject.accounts.InvestmentsAccount; +import atmproject.accounts.SavingsAccount; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class AccountMenu { + Account returnedAccount; + Console console = new Console(System.in, System.out); + + public Account selectAccount(User user) { + Map returnedMap = new LinkedHashMap<>(); + returnedAccount = null; + Integer counter = 1; + printAndStoreAccounts(user, returnedMap, counter); + returnedAccount = getUserSelectedAccount(returnedMap, returnedAccount); + + + return returnedAccount; + } + + public Account getUserSelectedAccount(Map returnedMap, Account returnedAccount) { + while (returnedAccount == null) { + console.println("\nPlease select an account."); + Integer input = console.getIntegerInput(":"); + + returnedAccount = getUsersInput(returnedMap, returnedAccount, input); + + } + return returnedAccount; + } + + public Account getUsersInput(Map returnedMap, Account returnedAccount, Integer input) { + if (returnedMap.containsKey(input)) { + returnedAccount = returnedMap.get(input); + } else { + console.println("\nAccount does not exist. Try again: "); + } + return returnedAccount; + } + + public void printAndStoreAccounts(User user, Map returnedMap, Integer counter) { + console.println("\n"); + for (String s : user.accountList.keySet()) { + console.println("(" + counter + ")" + " - " + s); + returnedMap.put(counter, user.accountList.get(s)); + counter++; + + } + } +} diff --git a/src/main/java/atmproject/Console.java b/src/main/java/atmproject/Console.java new file mode 100644 index 0000000..997735e --- /dev/null +++ b/src/main/java/atmproject/Console.java @@ -0,0 +1,62 @@ +package atmproject; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class Console { + + private final Scanner input; + private final PrintStream output; + + public Console(InputStream in, PrintStream out) { + this.input = new Scanner(in); + this.output = out; + } + + public void print(String val, Object... args) { + output.format(val, args); + } + + public void newln() { + print("\n"); + } + + public void println(String val, Object... vals) { + print(val + "\n", vals); + } + + public String getStringInput(String prompt, Object... args) { + print(prompt, args); + return input.nextLine(); + } + + public Double getDoubleInput(String prompt, Object... args) { + String stringInput = getStringInput(prompt, args); + try { + Double doubleInput = Double.parseDouble(stringInput); + return doubleInput; + } catch (NumberFormatException nfe) { // TODO - Eliminate recursive nature + println("[ %s ] is an invalid user input!", stringInput); + println("Try inputting a numeric value!"); + return getDoubleInput(prompt, args); + } + } + + public Long getLongInput(String prompt, Object... args) { + String stringInput = getStringInput(prompt, args); + try { + Long longInput = Long.parseLong(stringInput); + return longInput; + } catch (NumberFormatException nfe) { // TODO - Eliminate recursive nature + println("[ %s ] is an invalid user input!", stringInput); + println("Try inputting an integer value!"); + return getLongInput(prompt, args); + } + } + + public Integer getIntegerInput(String prompt, Object... args) { + return getLongInput(prompt, args).intValue(); + } + +} diff --git a/src/main/java/atmproject/Language.java b/src/main/java/atmproject/Language.java new file mode 100644 index 0000000..bbc9aca --- /dev/null +++ b/src/main/java/atmproject/Language.java @@ -0,0 +1,26 @@ +package atmproject; + +import java.util.HashMap; +import java.util.Map; + +public class Language { + + private Map langMap; + public enum LangKey { EXAMPLE1, EXAMPLE2,MAINMENU } + + public Language() { + + langMap = new HashMap(); + langMap.put(LangKey.EXAMPLE1, "This is an example"); + langMap.put(LangKey.EXAMPLE2, "This is another Example"); + langMap.put(LangKey.MAINMENU, "Please select your option:\n" + "(1) - Deposit\n" + "(2) - Withdraw\n" + + "(3) - Transfer\n" + "(4) - Balance\n" + "(5) - View History\n" + "(6) - Create New Account\n" + "(7) - Remove Account\n" + + "(8) - Exit ATM"); + + } + + public String getLang(LangKey key) { + return langMap.get(key); + } + +} diff --git a/src/main/java/Main.java b/src/main/java/atmproject/Main.java similarity index 61% rename from src/main/java/Main.java rename to src/main/java/atmproject/Main.java index 05e41a9..9404c95 100644 --- a/src/main/java/Main.java +++ b/src/main/java/atmproject/Main.java @@ -1,9 +1,12 @@ +package atmproject; + /** * Created by iyasuwatts on 10/17/17. */ public class Main { public static void main(String[] args){ - + ATM atm = new ATM(); + atm.turnOnATM(); } } diff --git a/src/main/java/atmproject/User.java b/src/main/java/atmproject/User.java new file mode 100644 index 0000000..cd6bf48 --- /dev/null +++ b/src/main/java/atmproject/User.java @@ -0,0 +1,101 @@ +package atmproject; + +import atmproject.accounts.Account; +import atmproject.accounts.SavingsAccount; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.TreeMap; + +public class User { + private Console console = new Console(System.in,System.out); + private String firstName; + private String lastName; + private Integer pinNumber; + private Integer userID; + private ArrayList transactionHistory; + TreeMap accountList; + TreeMap savingsAccountList; + + public User(String firstName, String lastName, Integer userID){ + this.firstName = firstName; + this.lastName = lastName; + this.userID = userID; + this.pinNumber = 0; + this.accountList = new TreeMap(); + this.transactionHistory = new ArrayList(); + + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Integer getPinNumber() { + return pinNumber; + } + + public void setPinNumber(Integer pinNumber) { + this.pinNumber = pinNumber; + } + + public Integer getUserID() { + return userID; + } + + public void setUserID(Integer accountNumber) { + this.userID = accountNumber; + } + + public TreeMap getAccountList() { + return accountList; + } + + public void setAccountList(TreeMap accountList) { + this.accountList = accountList; + } + + public ArrayList getTransactionHistory() { + return transactionHistory; + } + + public void setTransactionHistory(ArrayList transactionHistory) { + this.transactionHistory = transactionHistory; + } + public void addToHistory(String transaction){ + transactionHistory.add(transaction); + } + + public void removeAccount(Account account){ + if (account.getBalance() > 0.0){ + console.println("Please empty your account before attempting to close."); + } else { + accountList.remove(account.getAccountName()); + } + } + + public void addAccount(Account account) { + accountList.put(account.getAccountName(), account); + } + + public String displayHistory(){ + StringBuilder sb = new StringBuilder(); + for(String s : transactionHistory){ + sb.append("**").append(s); + } + return sb.toString(); + } +} diff --git a/src/main/java/atmproject/UserLogin.java b/src/main/java/atmproject/UserLogin.java new file mode 100644 index 0000000..ef3c389 --- /dev/null +++ b/src/main/java/atmproject/UserLogin.java @@ -0,0 +1,157 @@ +package atmproject; + +import atmproject.accounts.Account; + +public class UserLogin { + private User currentUser; + private Console console = new Console(System.in, System.out); + private boolean running; + private UserRepository userRepository; + + public UserLogin() { + userRepository = UserRepository.getUserRepository(); + } + + public void runLoginMenu() { + running = true; + while (running) { + assignUser(); + if (currentUser != null) { + startMainMenu(); + } + exit(); + } + } + + public void assignUser() { + while (currentUser == null) { + console.println("Welcome to the ATM!\n(1) - Create New Account\n(2) - Login to Existing Account\n(0) - Exit ATM"); + Integer userInput = console.getIntegerInput(":"); + Boolean exit = false; + switch (userInput) { + case 0: + exit = true; + break; + case 1: + getUserInfo(); + console.println("Hello, %s! Thank you for creating an account. Your user ID is %d.", currentUser.getFirstName(),currentUser.getUserID()); + initialAccount(currentUser); + break; + case 2: + getLoginInfo(); + break; + } + if (exit) { + break; + } + } + } + + protected String getFirstNameInput() { + console.println("Please enter your First name :"); + return console.getStringInput(":"); + } + + protected String getLastNameInput() { + console.println("Please enter Last name :"); + return console.getStringInput(":"); + } + + protected void setPin() { + Boolean isPINSet = false; + while(!isPINSet) { + console.println("Please select 4 digit PIN :"); + Integer pin = console.getIntegerInput(":"); + if(pin < 10000 && pin > -1) { + currentUser.setPinNumber(pin); + isPINSet = true; + }else{ console.println("Please try again.");} + } + } + + public void getUserInfo(){ + String firstInput = getFirstNameInput(); + String lastInput = getLastNameInput(); + currentUser = createUser(firstInput,lastInput); + setPin(); + } + + protected Integer getUserIDInput(){ + console.println("Please enter your 4 digit Account Number :"); + return console.getIntegerInput(":"); + + } + + protected Integer getPINInput(){ + console.println("Please enter your PIN :"); + return console.getIntegerInput(":"); + } + + protected Integer tryAgainInput(){ + console.println("User Info doesn't match. Try again?\n(1) - Yes\n(2) - No\n"); + return console.getIntegerInput(":"); + } + + public void getLoginInfo(){ + Boolean exit = false; + while (currentUser == null) { + Integer userID = getUserIDInput(); + Integer pin = getPINInput(); + login(userID, pin); + if(currentUser == null){ + Integer userInput = tryAgainInput(); + switch(userInput){ + case 1: + break; + case 2: + exit = true; + break; + } + if(exit){break;} + } + } + + } + + public User createUser (String firstName, String lastName){ + Integer userID = userRepository.getIDNums(); + userRepository.saveUser(new User(firstName,lastName, userID), userID); + + return userRepository.getUser(userID); + } + + public void login(Integer userID,Integer pinNumber ){ + User user = userRepository.getUser(userID); + if(user != null && user.getPinNumber().equals(pinNumber)){ + currentUser = user; + } + } + + public void startMainMenu(){ + ATM ATM = new ATM(); + ATM.runMainMenu(currentUser); + } + + + public void initialAccount(User currentUser){ + Account account = new Account(currentUser, 0.0, "Checkings Account#" + (currentUser.getAccountList().size() + 1)); + currentUser.addAccount(account); + } + + public void exit(){ + Integer userInput = 0; + console.println("Are you sure you want to Exit?\n(1) - Yes\n(2) - No\n"); + while (!userInput.equals(1) && !userInput.equals(2)) { + userInput = console.getIntegerInput(":"); + switch (userInput) { + case 1: + running = false; + break; + case 2: + break; + default: + console.print("Please enter (1) or (2)"); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/atmproject/UserRepository.java b/src/main/java/atmproject/UserRepository.java new file mode 100644 index 0000000..df7b486 --- /dev/null +++ b/src/main/java/atmproject/UserRepository.java @@ -0,0 +1,40 @@ +package atmproject; + +import atmproject.accounts.Account; + +import java.util.Map; +import java.util.TreeMap; + +public class UserRepository { + + // Singleton Eager Initialization + protected static final UserRepository userRepository = new UserRepository(); + + private int idNums; + private Map repo; + + protected UserRepository(){ + idNums = 1000; + repo = new TreeMap(); + } + public static UserRepository getUserRepository(){ + return userRepository; + } + + public Integer createNewUserID(){ + Integer userID = idNums; + idNums++; + return userID; + } + public void saveUser(User user, Integer userID){ + repo.put(String.format("%04d",userID),user); + } + + public User getUser(Integer userID){ + return repo.get(String.format("%4d",userID)); + } + + public int getIDNums() { + return idNums; + } +} diff --git a/src/main/java/atmproject/accounts/Account.java b/src/main/java/atmproject/accounts/Account.java new file mode 100644 index 0000000..5a1f15f --- /dev/null +++ b/src/main/java/atmproject/accounts/Account.java @@ -0,0 +1,79 @@ +package atmproject.accounts; + +import atmproject.Console; +import atmproject.User; + +import java.security.InvalidParameterException; + +public class Account { + + private User currentUser; + protected Double balance; + private String accountName; + Console console = new Console(System.in,System.out); + + public Account(User currentUser, Double balance, String accountName){ + this.currentUser = currentUser; + this.balance = balance; + this.accountName = accountName; + } + + public Account(Double balance){ + this.balance = balance; + } + + public User getCurrentUser() { + return currentUser; + } + + public void setCurrentUser(User currentUser) { + this.currentUser = currentUser; + } + + public Double getBalance() { + return balance; + } + + public void setBalance(Double balance) { + this.balance = balance; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public Double withdraw(Double amount) { + if (amount < 0) { + throw new InvalidParameterException(); + } + if(this.balance >= amount) { + this.balance = balance - amount; + return balance; + } + return balance; + } + + public Double deposit(Double amount) { + if (amount < 0) { + throw new InvalidParameterException(); + } + this.balance = balance + amount; + return balance; + } + + public Double transfer(Account destinationAccount, Double amount) { + if (amount < 0) { + throw new InvalidParameterException(); + } + if(this.balance >= amount) { + this.withdraw(amount); + destinationAccount.deposit(amount); + } + return this.balance; + } + +} diff --git a/src/main/java/atmproject/accounts/InvestmentsAccount.java b/src/main/java/atmproject/accounts/InvestmentsAccount.java new file mode 100644 index 0000000..af1849b --- /dev/null +++ b/src/main/java/atmproject/accounts/InvestmentsAccount.java @@ -0,0 +1,12 @@ +package atmproject.accounts; + +import atmproject.User; +import atmproject.accounts.SavingsAccount; + +public class InvestmentsAccount extends SavingsAccount { + + public InvestmentsAccount(User currentUser, Double balance, String accountName) { + super(currentUser, balance, accountName); + super.setInterestRate(0.001); + } +} diff --git a/src/main/java/atmproject/accounts/SavingsAccount.java b/src/main/java/atmproject/accounts/SavingsAccount.java new file mode 100644 index 0000000..302911b --- /dev/null +++ b/src/main/java/atmproject/accounts/SavingsAccount.java @@ -0,0 +1,27 @@ +package atmproject.accounts; + +import atmproject.User; +import atmproject.accounts.Account; + +public class SavingsAccount extends Account { + + protected Double interestRate; + + public SavingsAccount(User currentUser, Double balance, String accountName) { + super(currentUser, balance, accountName); + this.interestRate = 0.0005; + } + + public Double addInterest(){ + balance += (balance * interestRate); + return balance; + } + + public Double getInterestRate() { + return interestRate; + } + + public void setInterestRate(Double interestRate) { + this.interestRate = interestRate; + } +} diff --git a/src/main/test/AccountTest.java b/src/main/test/AccountTest.java deleted file mode 100644 index cbea4ad..0000000 --- a/src/main/test/AccountTest.java +++ /dev/null @@ -1,83 +0,0 @@ - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import static org.junit.Assert.assertEquals; - - -// Test the expected Account class from ATM. -public class AccountTest { - - @Test - public void testA0() { - Account a = new Account(0.0); - assertEquals(0.0, a.balance(), 0.0001); - } - - @Test - public void testA00() { - Account a = new Account(10.0); - assertEquals(10.0, a.balance(), 0.0001); - } - - @Test - public void testA01() { - Account a = new Account(0.0); - assertEquals(true, a.closeAccount()); - } - - @Test - public void testA02() { - Account a = new Account(10.0); - assertEquals(false, a.closeAccount()); - } - - @Test - public void testA1() { - Account a = new Account(0.0); - a.deposit(100.0); - assertEquals(100.0, a.balance(), 0.0001); - } - - @Test - public void testA2() { - Account a = new Account(10.0); - a.deposit(100.0); - assertEquals(110.0, a.balance(), 0.0001); - } - - @Test - public void testA3() { - Account a = new Account(200.0); - Double actual = a.withdraw(100.0); - assertEquals(100.0, actual, 0.0001); - } - - @Test - public void testA4() { - Account a = new Account(0.0); - Double actual = a.withdraw(1.0); - assertEquals(0.0, actual, 0.0001); - } - - @Test - public void testA5() { - Account a = new Account(10.0); - Account b = new Account(0.0); - a.transfer(b, 10.0); - assertEquals(0.0, a.balance(), 0.0001); - assertEquals(10.0, b.balance(), 0.0001); - } - - @Test - public void testA6() { - Account a = new Account(10.0); - Account b = new Account(0.0); - a.transfer(b, 100.0); // nothing should happen - assertEquals(10.0, a.balance(), 0.0001); - assertEquals(0.0, b.balance(), 0.0001); - } - - -} diff --git a/src/test/java/atmproject/ATMTest.java b/src/test/java/atmproject/ATMTest.java new file mode 100644 index 0000000..a2724d6 --- /dev/null +++ b/src/test/java/atmproject/ATMTest.java @@ -0,0 +1,81 @@ +package atmproject; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.junit.Assert.*; + +public class ATMTest { + + @Test + public void runMainMenu() { + String input = "8"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + ATM atm = new ATM(); + User currentUser = new User("Jow","Byeden",0000); + + atm.runMainMenu(currentUser); + + assertFalse(atm.isRunning()); + + } + + @Test + public void checkBalance() { + + ATM atm = new ATM(); + UserLogin userLogin = new UserLogin(); + User currentUser = new User("Jow","Byeden",0000); + + userLogin.initialAccount(currentUser); + atm.setCurrentUser(currentUser); + + + + Double actual = currentUser.getAccountList().get("Checkings Account#1").getBalance(); + Double expected = 0.0; + + Assert.assertEquals(actual,expected); + + } + + @Test + public void displayHistoryTest1() { + ATM atm = new ATM(); + User currentUser = new User(null,null,null); + String expected = "You currently have no history."; + Assert.assertEquals(expected,atm.displayHistory(currentUser)); + } + + @Test + public void displayHistoryTest2() { + ATM atm = new ATM(); + User currentUser = new User(null,null,null); + String expected = "This is only a test."; + currentUser.addToHistory("This is only a test."); + + Assert.assertEquals("**" + expected,atm.displayHistory(currentUser)); + } + + @Test + public void returnTOLoginMenu() { + ATM ATM = new ATM(); + + ATM.returnToLoginMenu(); + + assertFalse(ATM.isRunning()); + + + } + + + + + + +} \ No newline at end of file diff --git a/src/test/java/atmproject/AccountMenuTest.java b/src/test/java/atmproject/AccountMenuTest.java new file mode 100644 index 0000000..1db407e --- /dev/null +++ b/src/test/java/atmproject/AccountMenuTest.java @@ -0,0 +1,43 @@ +package atmproject; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.junit.Assert.*; + +public class AccountMenuTest { + @Test + public void selectAccount() { + String input = "1"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + AccountMenu accountmenu = new AccountMenu(); + ATM atm = new ATM(); + UserLogin userLogin = new UserLogin(); + User user = new User("mich", "kin", 1000); + + userLogin.initialAccount(user); + + atm.setCurrentUser(user); + + + accountmenu.selectAccount(user); + Double actual = accountmenu.returnedAccount.getBalance(); + assertTrue(actual == 0.0); + } + + @Test + public void getUserSelectedAccount() { + } + + @Test + public void getUsersInput() { + } + + @Test + public void printAndStoreAccounts() { + } +} \ No newline at end of file diff --git a/src/test/java/atmproject/LanguageTest.java b/src/test/java/atmproject/LanguageTest.java new file mode 100644 index 0000000..b4ccce0 --- /dev/null +++ b/src/test/java/atmproject/LanguageTest.java @@ -0,0 +1,27 @@ +package atmproject; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class LanguageTest { + + @Test + public void getLangTest() { + Language language = new Language(); + String expected = "This is an example"; + String actual = language.getLang(Language.LangKey.EXAMPLE1); + Assert.assertEquals(expected,actual); + } + + @Test + public void getLangTest2() { + Language language = new Language(); + String expected = "Please select your option:\n" + "(1) - Deposit\n" + "(2) - Withdraw\n" + + "(3) - Transfer\n" + "(4) - Balance\n" + "(5) - View History\n" + "(6) - Create New Account\n" + "(7) - Remove Account\n" + + "(8) - Exit ATM"; + String actual = language.getLang(Language.LangKey.MAINMENU); + Assert.assertEquals(expected,actual); + } +} \ No newline at end of file diff --git a/src/test/java/atmproject/UserLoginTest.java b/src/test/java/atmproject/UserLoginTest.java new file mode 100644 index 0000000..b63038f --- /dev/null +++ b/src/test/java/atmproject/UserLoginTest.java @@ -0,0 +1,92 @@ +package atmproject; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.junit.Assert.*; + +public class UserLoginTest { + + @Test + public void getFirstName(){ + String input = "Shadow"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + UserLogin login = new UserLogin(); + String actual = login.getFirstNameInput(); + Assert.assertEquals(input,actual); + } + + @Test + public void getLastName(){ + String input = "???"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + UserLogin login = new UserLogin(); + String actual = login.getLastNameInput(); + Assert.assertEquals(input,actual); + } + + @Test + public void getUserInfo() { + } + + @Test + public void getLoginInfo() { + } + + @Test + public void getUserIDinput(){ + String input = "3453"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + UserLogin login = new UserLogin(); + String actual = login.getUserIDInput().toString(); + Assert.assertEquals(input,actual); + } + + @Test + public void getPINInputTest(){ + String input = "3453"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + UserLogin login = new UserLogin(); + String actual = login.getPINInput().toString(); + Assert.assertEquals(input,actual); + } + + @Test + public void tryAgaininput(){ + String input = "1"; + InputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + UserLogin login = new UserLogin(); + String actual = login.tryAgainInput().toString(); + Assert.assertEquals(input,actual); + } + + @Test + public void createUser() { + } + + @Test + public void initialAccountTest(){ + UserLogin login = new UserLogin(); + User currentUser = new User(null,null,null); + login.initialAccount(currentUser); + + Assert.assertTrue(currentUser.getAccountList().containsKey("Checkings Account#1")); + } + + @Test + public void login() { + } +} \ No newline at end of file diff --git a/src/test/java/atmproject/UserRepositoryTest.java b/src/test/java/atmproject/UserRepositoryTest.java new file mode 100644 index 0000000..47adb12 --- /dev/null +++ b/src/test/java/atmproject/UserRepositoryTest.java @@ -0,0 +1,50 @@ +package atmproject; + +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import static org.junit.Assert.*; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserRepositoryTest { + + @Test + public void Test01CreateNewAccountNum() { + UserRepository userRepository = UserRepository.getUserRepository(); + + Integer expectedAccountNum = 1000; + Integer actualAccountNum = userRepository.createNewUserID(); + + Integer expectedIncrement = expectedAccountNum + 1; + Integer actualIncrement = userRepository.getIDNums(); + + assertEquals(expectedAccountNum, actualAccountNum); + assertEquals(expectedIncrement, actualIncrement); + } + @Test + public void Test02CreateNewAccountNum(){ + UserRepository userRepository = UserRepository.getUserRepository(); + + Integer expectedAccountNum = 1001; + Integer actualAccountNum = userRepository.createNewUserID(); + + Integer expectedIncrement = expectedAccountNum + 1; + Integer actualIncrement = userRepository.getIDNums(); + + assertEquals(expectedAccountNum, actualAccountNum); + assertEquals(expectedIncrement, actualIncrement); + } + @Test + public void Test03saveUser() { + UserRepository userRepository = UserRepository.getUserRepository(); + Integer accountNum = userRepository.createNewUserID(); + User expected = new User("Jaime","Diamond", accountNum); + + userRepository.saveUser(expected, accountNum); + User actual = userRepository.getUser(accountNum); + + assertEquals(expected, actual); + } + +} diff --git a/src/test/java/atmproject/UserTest.java b/src/test/java/atmproject/UserTest.java new file mode 100644 index 0000000..c283447 --- /dev/null +++ b/src/test/java/atmproject/UserTest.java @@ -0,0 +1,157 @@ +package atmproject; + +import atmproject.accounts.Account; +import atmproject.accounts.SavingsAccount; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.TreeMap; + +import static org.junit.Assert.*; + +public class UserTest { + + @Test + public void getFirstName() { + User currentUser = new User("Shadow", "???", 3454); + String expected = "Shadow"; + String actual = currentUser.getFirstName(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setFirstName() { + User currentUser = new User("Shadow", "???", 3454); + String expected = "Shadow"; + currentUser.setFirstName(expected); + Assert.assertEquals(expected,currentUser.getFirstName()); + } + + @Test + public void getLastName() { + User currentUser = new User("Shadow", "???", 3454); + String expected = "???"; + String actual = currentUser.getLastName(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setLastName() { + User currentUser = new User("Shadow", "???", 3454); + String expected = "???"; + currentUser.setLastName(expected); + Assert.assertEquals(expected,currentUser.getLastName()); + + } + + @Test + public void getPinNumber() { + User currentUser = new User("Shadow", "???", 3454); + Integer expected = 7777; + currentUser.setPinNumber(expected); + Assert.assertEquals(expected,currentUser.getPinNumber()); + } + + @Test + public void setPinNumber() { + User currentUser = new User("Shadow", "???", 3454); + Integer expected = 7777; + currentUser.setPinNumber(expected); + Assert.assertEquals(expected,currentUser.getPinNumber()); + } + + @Test + public void getUserID() { + User currentUser = new User("Shadow", "???", 3454); + Integer expected = 3454; + Integer actual = currentUser.getUserID(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setUserID() { + User currentUser = new User("Shadow", "???", 3454); + Integer expected = 3454; + currentUser.setUserID(expected); + Assert.assertEquals(expected,currentUser.getUserID()); + } + + @Test + public void getAccountList() { + User currentUser = new User("Shadow", "???", 3454); + Account account = new Account(currentUser, 500.0, "Checking Account 1"); + String expected = "{" + account.getAccountName() + "=" + account.toString() + "}"; + currentUser.addAccount(account); + Assert.assertEquals(expected,currentUser.getAccountList().toString()); + } + + @Test + public void setAccountList() { + User currentUser = new User("Shadow", "???", 3454); + Account account = new Account(currentUser, 500.0, "Checking Account 1"); + TreeMap expected = new TreeMap(); + expected.put(account.getAccountName(),account); + currentUser.setAccountList(expected); + Assert.assertEquals(expected.toString(),currentUser.getAccountList().toString()); + } + + @Test + public void getTransactionHistory() { + User currentUser = new User("Shadow", "???", 3454); + String expected = "BLAH BLAH BLAH"; + currentUser.addToHistory(expected); + Assert.assertEquals(("[" + expected + "]"),currentUser.getTransactionHistory().toString()); + } + + @Test + public void setTransactionHistory() { + User currentUser = new User("Shadow", "???", 3454); + String transaction = "BLAH BLAH BLAH"; + ArrayList expected = new ArrayList(); + expected.add(transaction); + currentUser.setTransactionHistory(expected); + Assert.assertEquals(expected.toString(), currentUser.getTransactionHistory().toString()); + } + + @Test + public void addAccount() { + User currentUser = new User("Shadow", "???", 3454); + Account account = new Account(currentUser, 500.0, "Checking Account 1"); + currentUser.addAccount(account); + Assert.assertTrue(currentUser.getAccountList().containsKey("Checking Account 1")); + + } + + @Test + public void removeAccount() { + User currentUser = new User("Shadow", "???", 3454); + Account account = new Account(currentUser, 500.0, "Savings Account 1"); + currentUser.addAccount(account); + currentUser.removeAccount(account); + assertEquals(1, currentUser.getAccountList().size()); + } + + @Test + public void removeAccount2() { + User currentUser = new User("Shadow", "???", 3454); + Account account = new Account(currentUser, 0.0, "Savings Account 1"); + currentUser.addAccount(account); + currentUser.removeAccount(account); + Assert.assertTrue(currentUser.getAccountList().isEmpty()); + } + + @Test + public void displayHistory() { + User currentUser = new User("Shadow", "???", 3454); + String transaction = "BLAH BLAH BLAH"; + String transaction2 = "Snip snat snoogle snork"; + String transaction3 = "Fiddle flop flee!"; + currentUser.addToHistory(transaction); + currentUser.addToHistory(transaction2); + currentUser.addToHistory(transaction3); + Assert.assertTrue(currentUser.displayHistory().contains(transaction2)); + } + + +} \ No newline at end of file diff --git a/src/test/java/atmproject/accounts/AccountTest.java b/src/test/java/atmproject/accounts/AccountTest.java new file mode 100644 index 0000000..bb1bd96 --- /dev/null +++ b/src/test/java/atmproject/accounts/AccountTest.java @@ -0,0 +1,177 @@ +package atmproject.accounts; + +import atmproject.User; +import atmproject.accounts.Account; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.security.InvalidParameterException; + +import static org.junit.Assert.assertEquals; + + +// Test the expected Account class from ATM. +public class AccountTest { + + @Test + public void testA0() { + Account a = new Account(0.0); + assertEquals(0.0, a.getBalance(), 0.0001); + } + + @Test + public void testA00() { + Account a = new Account(10.0); + assertEquals(10.0, a.getBalance(), 0.0001); + } + + @Test + public void testA1() { + Account a = new Account(0.0); + a.deposit(100.0); + assertEquals(100.0, a.getBalance(), 0.0001); + } + + @Test + public void testA2() { + Account a = new Account(10.0); + a.deposit(100.0); + assertEquals(110.0, a.getBalance(), 0.0001); + } + + @Test + public void testA3() { + Account a = new Account(200.0); + Double actual = a.withdraw(100.0); + assertEquals(100.0, actual, 0.0001); + } + + @Test + public void testA4() { + Account a = new Account(0.0); + Double actual = a.withdraw(1.0); + assertEquals(0.0, actual, 0.0001); + } + + @Test + public void testA5() { + Account a = new Account(10.0); + Account b = new Account(0.0); + a.transfer(b, 10.0); + assertEquals(0.0, a.getBalance(), 0.0001); + assertEquals(10.0, b.getBalance(), 0.0001); + } + + @Test + public void testA6() { + Account a = new Account(10.0); + Account b = new Account(0.0); + a.transfer(b, 100.0); // nothing should happen + assertEquals(10.0, a.getBalance(), 0.0001); + assertEquals(0.0, b.getBalance(), 0.0001); + } + + @Test + public void getCurrentUserTest() { + User currentUser = new User("Sabin", "Figaro", 456456); + Account account = new Account(currentUser, 0.0,null); + User expected = new User("Sabin", "Figaro", 456456); + User actual = account.getCurrentUser(); + + Assert.assertEquals(actual.getFirstName(),expected.getFirstName()); + } + + @Test + public void setCurrentUser() { + User currentUser = new User("Sabin", "Figaro", 456456); + Account account = new Account(0.0); + account.setCurrentUser(currentUser); + + Assert.assertEquals(account.getCurrentUser(), currentUser); + } + + @Test + public void getBalance() { + Account account = new Account(0.0); + Double expected = 0.0; + Double actual = account.getBalance(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setBalance() { + Account account = new Account(0.0); + Double expected = 100.0; + account.setBalance(expected); + + Assert.assertEquals(expected,account.getBalance()); + } + + @Test + public void depositTest() { + Account account = new Account(0.0); + account.setBalance(100.0); + Double input = 80.0; + account.deposit(input); + + + Double expected = 180.0; + + Assert.assertEquals(expected,account.getBalance()); + } + + @Test (expected = InvalidParameterException.class) + public void depositTestFalse() throws InvalidParameterException { + Account account = new Account(0.0); + Double input = -80.0; + account.deposit(input); + } + + @Test + public void withdrawTest() { + Account account = new Account(0.0); + account.setBalance(100.0); + Double input = 80.0; + account.withdraw(input); + + + Double expected = 20.0; + + Assert.assertEquals(expected,account.getBalance()); + } + + @Test (expected = InvalidParameterException.class) + public void withdrawTestFalse() throws InvalidParameterException{ + Account account = new Account(0.0); + Double input = -80.0; + account.withdraw(input); + } + + @Test + public void getAccountName() { + Account account = new Account(null,null,"testAccount"); + String expected = "testAccount"; + String actual = account.getAccountName(); + + Assert.assertEquals(expected,actual); + } + + @Test + public void setAccountName() { + Account account = new Account(null,null,null); + String expected = "testAccount"; + account.setAccountName(expected); + + Assert.assertEquals(expected,account.getAccountName()); + } + + @Test (expected = InvalidParameterException.class) + public void transferTestFalse() throws InvalidParameterException{ + Account account = new Account(0.0); + Account account2 = new Account(0.0); + Double input = -80.0; + account.transfer(account2, input); + } +} diff --git a/src/test/java/atmproject/accounts/InvestmentsAccountTest.java b/src/test/java/atmproject/accounts/InvestmentsAccountTest.java new file mode 100644 index 0000000..98b8508 --- /dev/null +++ b/src/test/java/atmproject/accounts/InvestmentsAccountTest.java @@ -0,0 +1,59 @@ +package atmproject.accounts; + +import atmproject.User; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class InvestmentsAccountTest { + + @Test + public void constructorTest(){ + User currentUser = new User("Shadow",null,null); + Double expectedBalance = 15000.0; + String expectedName = "Investments Account 1"; + InvestmentsAccount account = new InvestmentsAccount(currentUser, expectedBalance, expectedName); + + Double actualBalance = account.getBalance(); + String actualName = account.getAccountName(); + + Assert.assertEquals(expectedBalance,actualBalance); + Assert.assertEquals(expectedName,actualName); + } + +/* @Test + public void getMinimumDepositTest() { + InvestmentsAccount investmentsAccount = new InvestmentsAccount(null,null,null); + Double expected = 15000.0; + Double actual = investmentsAccount.getMinimumDeposit(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setMinimumDepositTest() { + InvestmentsAccount investmentsAccount = new InvestmentsAccount(null,null,null); + Double expected = 35000.0; + investmentsAccount.setMinimumDeposit(expected); + assertEquals(expected,investmentsAccount.getMinimumDeposit()); + } + + @Test + public void enoughForInitialBalanceFalseTest() { + InvestmentsAccount investmentsAccount = new InvestmentsAccount(null,null,null); + Double input = 13000.0; + String expected = String.format("We apologize. Your starting balance must be at least $%f0", investmentsAccount.getMinimumDeposit()); + String actual = investmentsAccount.enoughForInitialBalance(input); + Assert.assertEquals(expected,actual); + } + + @Test + public void enoughForInitialBalanceTrueTest() { + InvestmentsAccount investmentsAccount = new InvestmentsAccount(null,null,null); + Double input = 17000.0; + String expected = "Thank you! Enjoy your new investment account."; + String actual = investmentsAccount.enoughForInitialBalance(input); + Assert.assertEquals(expected,actual); + } +*/ +} \ No newline at end of file diff --git a/src/test/java/atmproject/accounts/SavingsAccountTest.java b/src/test/java/atmproject/accounts/SavingsAccountTest.java new file mode 100644 index 0000000..74bdbd6 --- /dev/null +++ b/src/test/java/atmproject/accounts/SavingsAccountTest.java @@ -0,0 +1,44 @@ +package atmproject.accounts; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class SavingsAccountTest { + + @Test + public void addInterestTest() { + SavingsAccount savingsAccount = new SavingsAccount(null,null,null); + savingsAccount.setBalance(500.0); + Double expected = savingsAccount.getBalance() + (savingsAccount.getBalance() * (savingsAccount).getInterestRate()); + Double actual = savingsAccount.addInterest(); + Assert.assertEquals(expected,actual); + } + + @Test + public void addInterestTest2() { + SavingsAccount savingsAccount = new SavingsAccount(null,null,null); + savingsAccount.setBalance(10.0); + Double expected = savingsAccount.getBalance() + (savingsAccount.getBalance() * (savingsAccount).getInterestRate()); + Double actual = savingsAccount.addInterest(); + Assert.assertEquals(expected,actual); + } + + @Test + public void getInterestRate() { + SavingsAccount savingsAccount = new SavingsAccount(null,null,null); + Double expected = 0.0005; + Double actual = savingsAccount.getInterestRate(); + Assert.assertEquals(expected,actual); + } + + @Test + public void setInterestRate() { + SavingsAccount savingsAccount = new SavingsAccount(null,null,null); + Double expected = 0.0007; + savingsAccount.setInterestRate(0.0007); + + assertEquals(expected,savingsAccount.getInterestRate()); + } +} \ No newline at end of file