From 57b481e54b71fbe023ebd7810e682925143ad675 Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 13:10:11 -0500 Subject: [PATCH 01/13] Initial commit --- .gitignore | 1 + Access_Control_Lab.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .gitignore create mode 100755 Access_Control_Lab.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/Access_Control_Lab.md b/Access_Control_Lab.md new file mode 100755 index 0000000..f290a1a --- /dev/null +++ b/Access_Control_Lab.md @@ -0,0 +1,41 @@ +# Access Control Lab - Bank Account + +## Description + +This lab focuses on implementing a simulated bank account and practicing using access control features of the Java language. By the end of this lab students should feel comfortable setting class members to be private or public, creating accessor and mutator functions for fields as needed, and using those methods to access the underlying fields. + +The bank account functionality produced in this lab will be integrated into the weekly project and may be further enhanced during the project. + +## Testing + +All features should be developed following a Test-Driven Development methodology. All features should be thoroughly tested and demonstrated through unit tests. + +## Instructions + +Create a class for bank accounts. + +Accounts must have: + +- Account type (Checking, Savings, Investment, etc.) +- Account number (Must be unique for each account created) +- Balance +- Account Holder's name +- Interest rate (some accounts may not draw interest) +- Status (Open, Closed, [OFAC](https://www.treasury.gov/about/organizational-structure/offices/Pages/Office-of-Foreign-Assets-Control.aspx) Freeze...) +- Overdraft prevention (enabled, disabled, or automatic account transfer*) +- A record of all transactions that have taken place on the accounts (withdrawals, deposits, transfers, and changes to the status, name, or interest rate) + + +Code that uses the Account class should not be able to change the properties of an account directly; this should be something handled by methods provided by the account class. The methods should enforce the following behavior: + +- Account type and account number must be set during account creation (in the constructor) and cannot be changed afterward. +- Balance inquiries are allowed at any time except while an account is under an OFAC freeze +- The balance can be changed with a credit (add money) or debit (remove money) + - Balance changes can only occur on `Open` accounts. + - The `debit` and `credit` methods should return an approval status indicating whether the transaction was approved. + - Accounts can transfer funds to or from another account with the same account holder -- Neither account's balance should fall below zero as a result of a transfer. +- Account holder's name must be set during account creation. It can be changed later (but not on closed accounts) +- Accounts with overdraft prevention enabled cannot over-draw (a debit that is greater than the account balance will be declined and the balance will not change) +- Accounts, once closed, cannot be reopened (frozen accounts can be unfrozen). + - No changes to the balance of an account can take place while it is closed or frozen + - Accounts must have a zero balance before they can be closed. \ No newline at end of file From 7a34ba624ea3bf02ac2313e18f93bbe5961a8404 Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 14:01:36 -0500 Subject: [PATCH 02/13] Began filling out classes --- .idea/.name | 1 + .idea/compiler.xml | 16 + .idea/libraries/Maven__junit_junit_4_12.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 + .idea/misc.xml | 13 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 730 ++++++++++++++++++ AccessControl.iml | 17 + pom.xml | 34 + .../john/accessControl/BankAccount.java | 16 + .../john/accessControl/BankAccountStatus.java | 6 + .../john/accessControl/BankAccountType.java | 7 + .../accessControl/OverdraftProtection.java | 6 + .../john/accessControl/BankAccountTest.java | 20 + 15 files changed, 906 insertions(+) create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_12.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 AccessControl.iml create mode 100644 pom.xml create mode 100644 src/main/java/squier/john/accessControl/BankAccount.java create mode 100644 src/main/java/squier/john/accessControl/BankAccountStatus.java create mode 100644 src/main/java/squier/john/accessControl/BankAccountType.java create mode 100644 src/main/java/squier/john/accessControl/OverdraftProtection.java create mode 100644 src/test/java/squier/john/accessControl/BankAccountTest.java diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..2a1782b --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +AccessControlLab \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..1c66e39 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 0000000..d411041 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5755a99 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..d0f80ed --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..8b97037 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1484677864162 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AccessControl.iml b/AccessControl.iml new file mode 100644 index 0000000..5cf6df2 --- /dev/null +++ b/AccessControl.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6775867 --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + squier.john + AccessControlLab + 1.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + + + junit + junit + 4.12 + + + + \ No newline at end of file diff --git a/src/main/java/squier/john/accessControl/BankAccount.java b/src/main/java/squier/john/accessControl/BankAccount.java new file mode 100644 index 0000000..d4864a3 --- /dev/null +++ b/src/main/java/squier/john/accessControl/BankAccount.java @@ -0,0 +1,16 @@ +package squier.john.accessControl; + +/** + * Created by johnsquier on 1/17/17. + */ +public class BankAccount { + + private BankAccountType accountType; + private int accountNumber; + private static int nextAccoutNumber = 1; + private double balance; + private String accountHoldersName; + private double interestRate; + private BankAccountStatus accountStatus; + +} diff --git a/src/main/java/squier/john/accessControl/BankAccountStatus.java b/src/main/java/squier/john/accessControl/BankAccountStatus.java new file mode 100644 index 0000000..72afbb2 --- /dev/null +++ b/src/main/java/squier/john/accessControl/BankAccountStatus.java @@ -0,0 +1,6 @@ +package squier.john.accessControl; + +/** + * Created by johnsquier on 1/17/17. + */ +public enum BankAccountStatus {OPEN, CLOSED, OFAC_FROZEN;} \ No newline at end of file diff --git a/src/main/java/squier/john/accessControl/BankAccountType.java b/src/main/java/squier/john/accessControl/BankAccountType.java new file mode 100644 index 0000000..9eef353 --- /dev/null +++ b/src/main/java/squier/john/accessControl/BankAccountType.java @@ -0,0 +1,7 @@ +package squier.john.accessControl; + +/** + * Created by johnsquier on 1/17/17. + */ +public enum BankAccountType { CHECKING, SAVINGS, INVESTMENT; } + diff --git a/src/main/java/squier/john/accessControl/OverdraftProtection.java b/src/main/java/squier/john/accessControl/OverdraftProtection.java new file mode 100644 index 0000000..da3a19b --- /dev/null +++ b/src/main/java/squier/john/accessControl/OverdraftProtection.java @@ -0,0 +1,6 @@ +package squier.john.accessControl; + +/** + * Created by johnsquier on 1/17/17. + */ +public enum OverdraftProtection {ENABLED, DISABLED, AUTOMATIC_ACCT_TRANSFER;} diff --git a/src/test/java/squier/john/accessControl/BankAccountTest.java b/src/test/java/squier/john/accessControl/BankAccountTest.java new file mode 100644 index 0000000..79f6c91 --- /dev/null +++ b/src/test/java/squier/john/accessControl/BankAccountTest.java @@ -0,0 +1,20 @@ +package squier.john.accessControl; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by johnsquier on 1/17/17. + */ +public class BankAccountTest { + + BankAccount bankAccount; + + @Before + bankAccount = new BankAccount(); + + @Test + + +} From 03582a28ee837e4d7e582d8b00b55aa9dbfe3f8f Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 14:12:17 -0500 Subject: [PATCH 03/13] continued expanding classes --- .idea/workspace.xml | 62 +++++++++++++++---- .../john/accessControl/BankAccount.java | 5 ++ .../accessControl/BankAccountTransaction.java | 19 ++++++ .../john/accessControl/TransactionType.java | 7 +++ 4 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 src/main/java/squier/john/accessControl/BankAccountTransaction.java create mode 100644 src/main/java/squier/john/accessControl/TransactionType.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8b97037..8156ba4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,9 @@ - + + + @@ -624,12 +648,12 @@ @@ -272,7 +285,7 @@ - + @@ -299,7 +312,85 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -719,23 +816,44 @@ - + + + + + + + + + + - + - - + + + + + + + + + + + + + + - @@ -750,7 +868,7 @@ - + @@ -779,7 +897,9 @@ - + + @@ -795,15 +915,15 @@ - + - - + + - + @@ -811,10 +931,18 @@ - + - - + + + + + + + + + + @@ -827,37 +955,38 @@ - + - + - - + + - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/main/java/squier/john/accessControl/ApprovalStatus.java b/src/main/java/squier/john/accessControl/ApprovalStatus.java index 391c8c4..f19a6b8 100644 --- a/src/main/java/squier/john/accessControl/ApprovalStatus.java +++ b/src/main/java/squier/john/accessControl/ApprovalStatus.java @@ -3,4 +3,4 @@ /** * Created by johnsquier on 1/17/17. */ -public enum ApprovalStatus {APPROVED, NOT_APPROVED, ZERO_TRANSACTION;} +public enum ApprovalStatus {APPROVED, NOT_APPROVED, ZERO_TRANSACTION, CANT_COMPLETE_DUE_TO_ACCT_STATUS;} diff --git a/src/main/java/squier/john/accessControl/BankAccount.java b/src/main/java/squier/john/accessControl/BankAccount.java index 2ddd6ca..e64cb5e 100644 --- a/src/main/java/squier/john/accessControl/BankAccount.java +++ b/src/main/java/squier/john/accessControl/BankAccount.java @@ -9,7 +9,7 @@ public class BankAccount { private BankAccountType accountType; private int accountNumber; - private static int nextAccoutNumber = 1; + private static int nextAccountNumber = 1; private double balance; private String accountHoldersName; private double interestRate; @@ -20,7 +20,7 @@ public class BankAccount { public BankAccount(BankAccountType accountType, double balance, String accountHoldersName, double interestRate, BankAccountStatus accountStatus, OverdraftProtection overdraftProtection) { this.accountType = accountType; - accountNumber = nextAccoutNumber++; + accountNumber = nextAccountNumber++; this.balance = balance; this.accountHoldersName = accountHoldersName; this.interestRate = interestRate; @@ -31,7 +31,6 @@ public BankAccount(BankAccountType accountType, double balance, String accountHo public Double getBalance() { if ( accountStatus.equals(BankAccountStatus.OFAC_FROZEN) ) { - // do nothing probably throw an expection at some point return null; } else { @@ -39,22 +38,140 @@ public Double getBalance() { } } + public String getAccountHoldersName() { + return accountHoldersName; + } + + public void setAccountHoldersName(String newName) { + if ( accountStatus.equals(BankAccountStatus.OPEN) ) { + accountHoldersName = newName; + } + + return; + } + + public BankAccountStatus getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(BankAccountStatus accountStatus) { + if ( isAccountOpenOrFrozen() ) { + // check balance if trying to close + if ( isNewAccountStatusClose(accountStatus) ) { + if ( this.balance == 0.0 ) { + this.accountStatus = accountStatus; + } + } + else { + this.accountStatus = accountStatus; + } + } + + return; + } + + private boolean isAccountOpenOrFrozen() { + return !accountStatus.equals(BankAccountStatus.CLOSED); + } + + private boolean isNewAccountStatusClose(BankAccountStatus newStatus) { + return newStatus.equals(BankAccountStatus.CLOSED); + } + public ApprovalStatus updateBalanceWithCreditOrDebit(double amount) { + if ( accountStatus.equals(BankAccountStatus.OPEN) ) { + + if ( overdraftProtection.equals(OverdraftProtection.ENABLED) ) { + if ( isTransactionAnOverDraft(amount) ) { + return ApprovalStatus.NOT_APPROVED; + } + } + if ( amount > 0.0 ) { - credit(amount); + return credit(amount); + } + else if ( amount < 0.0 ) { + return debit(amount); } else { - debit(amount); + return ApprovalStatus.ZERO_TRANSACTION; } } + else { + return ApprovalStatus.CANT_COMPLETE_DUE_TO_ACCT_STATUS; + } } - private ApprovalStatus credit(double amount) { + private ApprovalStatus credit(double amountToCredit) { + Double previousBalance = getBalance(); + balance += amountToCredit; + // check if balance updated + if ( (previousBalance + amountToCredit) == getBalance() ) { + return ApprovalStatus.APPROVED; + } + else { + return ApprovalStatus.NOT_APPROVED; + } } - private ApprovalStatus debit(double amount) { + private ApprovalStatus debit(double amountToDebit) { + // add overdraft logic + balance += amountToDebit; + return ApprovalStatus.APPROVED; + } + + + private boolean isTransactionAnOverDraft(double amount) { + return (Math.abs(amount) > this.getBalance()); + } + + // refactor this and transferBalanceTo, gotta be some reapeat code + public ApprovalStatus transferBalanceFrom(BankAccount transferFrom, double amountToTransfer) { + if ( bothAccountsHaveSameOwner(this, transferFrom) ) { + + if ( doesAccountHaveSufficientBalance(transferFrom, amountToTransfer) ) { + ApprovalStatus debitApproval = transferFrom.updateBalanceWithCreditOrDebit(-amountToTransfer); + ApprovalStatus creditApproval = this.updateBalanceWithCreditOrDebit(amountToTransfer); + + // pull out into check approvals method + if ( (debitApproval.equals(ApprovalStatus.APPROVED)) + && creditApproval.equals(ApprovalStatus.APPROVED) ) { + return ApprovalStatus.APPROVED; + } + } + } + + return ApprovalStatus.NOT_APPROVED; + } + + public ApprovalStatus transferBalanceTo(BankAccount transferTo, double amountToTransfer) { + // check if both accts have the same owener + if ( bothAccountsHaveSameOwner(this, transferTo) ) { + + // check if from has enough money + if (doesAccountHaveSufficientBalance(this, amountToTransfer)) { + + // do the transfer + ApprovalStatus debitApproval = this.updateBalanceWithCreditOrDebit(-amountToTransfer); + ApprovalStatus creditApproval = transferTo.updateBalanceWithCreditOrDebit(amountToTransfer); + + if ((debitApproval.equals(ApprovalStatus.APPROVED)) + && creditApproval.equals(ApprovalStatus.APPROVED)) { + return ApprovalStatus.APPROVED; + } + } + } + + return ApprovalStatus.NOT_APPROVED; + } + + private boolean bothAccountsHaveSameOwner(BankAccount transferFrom, BankAccount transferTo) { + return transferFrom.getAccountHoldersName().equals(transferTo.accountHoldersName); + } + private boolean doesAccountHaveSufficientBalance(BankAccount acct, double amount) { + return acct.getBalance() >= amount; } } diff --git a/src/test/java/squier/john/accessControl/BankAccountTest.java b/src/test/java/squier/john/accessControl/BankAccountTest.java index 8967c33..c92c2fc 100644 --- a/src/test/java/squier/john/accessControl/BankAccountTest.java +++ b/src/test/java/squier/john/accessControl/BankAccountTest.java @@ -29,19 +29,57 @@ public void getBalanceAccountFrozenTest() { bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, "John", 10.0, BankAccountStatus.OFAC_FROZEN, OverdraftProtection.ENABLED); - Double expected = null; + + // using null to indicate frozen acct status Double actual = bankAccount.getBalance(); - Assert.assertEquals(expected, actual, delta); + Assert.assertNull(actual); } @Test - public void updateBalanceAccountClosedTest() { + public void getAccountHoldersNameTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OFAC_FROZEN, + OverdraftProtection.ENABLED); + + String expected = "John"; + String actual = bankAccount.getAccountHoldersName(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setAccountHoldersNameOpenTest() { bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, "John", 10.0, BankAccountStatus.OPEN, OverdraftProtection.ENABLED); + + String expected = "Bob"; + bankAccount.setAccountHoldersName("Bob"); + String actual = bankAccount.getAccountHoldersName(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setAccountHoldersNameClosedTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.CLOSED, + OverdraftProtection.ENABLED); + + String expected = "John"; + bankAccount.setAccountHoldersName("Bob"); + String actual = bankAccount.getAccountHoldersName(); + Assert.assertEquals(expected, actual); + } + + @Test + public void updateBalanceAccountClosedTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.CLOSED, + OverdraftProtection.ENABLED); + Double expected = 100.0; bankAccount.updateBalanceWithCreditOrDebit(5.0); Double actual = bankAccount.getBalance(); + Assert.assertEquals(expected, actual, delta); } @Test @@ -49,9 +87,220 @@ public void updateBalancePositiveTest() { bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, "John", 10.0, BankAccountStatus.OPEN, OverdraftProtection.ENABLED); + Double expected = 200.0; bankAccount.updateBalanceWithCreditOrDebit(100.0); Double actual = bankAccount.getBalance(); + Assert.assertEquals(expected, actual, delta); + } + + @Test + public void updateBalanceNegativeTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + Double expected = 50.0; + bankAccount.updateBalanceWithCreditOrDebit(-50.0); + Double actual = bankAccount.getBalance(); + Assert.assertEquals(expected, actual, delta); + } + + @Test + public void transferBalanceFromTestBothEndAboveZeroTest() { + BankAccount transferFrom = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + BankAccount transferTo = new BankAccount(BankAccountType.CHECKING, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + transferTo.transferBalanceFrom(transferFrom, 50.0); + + Double[] expected = {150.0, 50.0}; + Double[] actual = {transferTo.getBalance(), transferFrom.getBalance()}; + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void transferBalanceToTestBothEndAboveZeroTest() { + BankAccount transferFrom = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + BankAccount transferTo = new BankAccount(BankAccountType.CHECKING, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + transferFrom.transferBalanceTo(transferTo, 50.0); + + Double[] expected = {150.0, 50.0}; + Double[] actual = {transferTo.getBalance(), transferFrom.getBalance()}; + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void transferBalanceFromTestNotEnoughInFromTest() { + BankAccount transferFrom = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + BankAccount transferTo = new BankAccount(BankAccountType.CHECKING, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + transferTo.transferBalanceFrom(transferFrom, 500.0); + + Double[] expected = {100.0, 100.0}; + Double[] actual = {transferTo.getBalance(), transferFrom.getBalance()}; + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void transferBalanceToTestNotEnoughInFromTest() { + BankAccount transferFrom = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + BankAccount transferTo = new BankAccount(BankAccountType.CHECKING, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + transferFrom.transferBalanceTo(transferTo, 500.0); + + Double[] expected = {100.0, 100.0}; + Double[] actual = {transferTo.getBalance(), transferFrom.getBalance()}; + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void overdrawWithProtectionOnTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + Double expected = 100.0; + bankAccount.updateBalanceWithCreditOrDebit(-500.0); + Double actual = bankAccount.getBalance(); + + Assert.assertEquals(expected, actual); + } + + @Test + public void overdrawWithProtectOffTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.DISABLED); + + Double expected = -400.0; + bankAccount.updateBalanceWithCreditOrDebit(-500.0); + Double actual = bankAccount.getBalance(); + + Assert.assertEquals(expected, actual); + } + + @Test + public void getBankAccountStatusTest() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 100.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.OPEN; + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusClosedFromOpen() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.CLOSED; + bankAccount.setAccountStatus(BankAccountStatus.CLOSED); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); } + @Test + public void setBankAccountStatusClosedFromFrozen() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.OFAC_FROZEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.CLOSED; + bankAccount.setAccountStatus(BankAccountStatus.CLOSED); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusOpenFromFrozen() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.OFAC_FROZEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.OPEN; + bankAccount.setAccountStatus(BankAccountStatus.OPEN); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusOpenFromClosed() { + // needs to fail + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.CLOSED, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.CLOSED; + bankAccount.setAccountStatus(BankAccountStatus.OPEN); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusFrozenFromOpen() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.OFAC_FROZEN; + bankAccount.setAccountStatus(BankAccountStatus.OFAC_FROZEN); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusFrozenFromClosed() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.CLOSED, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.CLOSED; + bankAccount.setAccountStatus(BankAccountStatus.OFAC_FROZEN); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusClosedWithZeroBalance() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 0.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.CLOSED; + bankAccount.setAccountStatus(BankAccountStatus.CLOSED); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void setBankAccountStatusClosedWithNonZeroBalance() { + bankAccount = new BankAccount(BankAccountType.SAVINGS, 10.0, + "John", 10.0, BankAccountStatus.OPEN, + OverdraftProtection.ENABLED); + + BankAccountStatus expected = BankAccountStatus.OPEN; + bankAccount.setAccountStatus(BankAccountStatus.CLOSED); + BankAccountStatus actual = bankAccount.getAccountStatus(); + Assert.assertEquals(expected, actual); + } } diff --git a/target/classes/squier/john/accessControl/ApprovalStatus.class b/target/classes/squier/john/accessControl/ApprovalStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..e4a65af3b951a68df179d974ca8941db22ea12c2 GIT binary patch literal 1198 zcmb7D?@!ZU5PsgRYr9ckj9-GNh@jgLCJJh@h0v6lkj$0PvSj+9DYZgLX|db*yL2RC zG#WnpM;Y&}i)_&k&?a}i_ny0Z?%wOqUtfO!SjWpW1Qat^#$yT75>_(EVwH=MjIj(k zOC0e;#yHn&GA6iwDr1uCXA;&KWOa9UPj6JW8H%;mhmPk)rQ`4@DA|tVwpv;kw4=~3 zsi&t=cxL-X+irJSWd^0Lo7Poq_Dyw9x6D1YZm62Mqt_YcHMMS9n*MsXRyC{E_I}ke zbxYMW(=tre+&37c#fDnjuhQ4@+nW>@iAl$8F|6bZHwqNA@SV#rTJr+8-Z?pNBhxhBpg^R;99%r5zMa9A?hkry163pXK`tA&p3H|)scseAc_z&@cexqovrh!rpJ z+M5hh|0%swXfO!vBagaG8{T0+^N%P~GS3}y#qoQ=mA=%~pmS2WKIcuk&x{dvBFBB@ z@o9_?UiT^=h=M7;WYY>Z@SGuk-Ca>IhZhR&V?n_fatg+|nBZa(Ifjv|X>-~PDaQ{3 zA~BIK^tGfP9J@}Nh;H-`N%QSitK0|sdtrlF%Uf%-@mcz9Qd={e20)sa#G1&&n)m?O zS>7li1*CBcGhmn{Yk@R>GF`CGNL(WMkt~MWB*oY#5`GSMdiZrD;?qn{D1Jfe5(393 z2Jm<3MEQflJvAe(ARk(x)oH`a`%o1cg#8QulPmS=$ z{05mWO#Ml^>zEe=LOPkjex)?H=sV;_%rr5=(aSp~g Q4UQnu3;W~b6?*M|Niga z{|VqRe3nEX=3CHeHAlN?@5;yZXrwl60s z^<5dhC)@A0;1&EJ$$=uhc(nzu;dNR4P=+7L_6-@{lGRfXCC#6VYBg(B9NQ|V zkLr~RnTGIyf>!@-t~NJi*b0>63N}=X%Z@J=oX4m1vR)}szcQ?#!@qURDo-1BHK)(< zhmNuH`huRO*tvAUvCYak>Q~K*W7tO3na~}|1m+5k?$oLZ_N@)9Cr)*p)`DSA+xm<% zZd;B~a!jkDAiau~{M{F*XMQJ_&V4kZG zu1);M?1^d--b5X$8@& zHBIvC$IOc1B}7r5D!U=KN_zRUZkw|A52Mbk$EazfMej($JFnN%u&a7+@vc_NZ-LHJJWQsXb>EY&NSotE zrl_oi`~##9*XE~Lynck9Hl5k5ZA_a^-X1olOov6B8eYvInfZC!TF}cr6DGbsC+&)h zlB-BTn|D&QJk3nCdD~bpty;C77vb*WXGI)~3S!e9h}J-b4{D29Ej9`+Q<2;rmd3$! zCSG#vbbG*zVf!}d&N&6eHO6J&!8o_NFauX8&{oNyK&tMrHqTGNIlF2A-NW1-aCaG# zQPAKTT79qziExRFw|k~7BS>G@Ty18? zESW~7QTqLBHS2~is+UR(W@4~Z_WLO7fK`$#ST(z3jGEG*+Cwn*%k!k-5av{*ut&vS z^sCTh*oXZp(m0^v%d+|k9##2WaF99TK52J82`V1PSL3*@;$4w@5AQP(RouX@ReT^P zCy`T;$GD0Q@n{?$srU^Js(23HjN`W|eg~pBg@TH+GW=e)H)Y7+sER+}k19Tf9>*st zKEV^6%)Tp0NRmeVo-_Gx9Sc!Ln%ps<-!Oe%#fR9m^L+_<^zS{&4Q` zNYTPbE^~BDZl>;kGpL_{g__G3Co|*Y6Zz9}v;FMIM1Hb3k;xS@+2Zj$ne}8dx#DCt ze{y_mq&PA;d}?H}n4ipKv&G3mF;hHM;K$dr`$U}mJ!psqswU4w#1eZ*Sh1& zNNC-OWwdDjK=RCOtXqcq7gza{95n(2x~O&&6>sLa1>4X~LR(2_8%yjV!rP9+c$oiy zV~BG+!oNeDWhHbKcO?WP?n)>|-Ib7xxhtXR-4&t<-eKYRv?h2@bZplChQtzDSJ1YI zm~xBT*ymV(i$66%;I?rF!L?#1)?>E|N%gM!kg~3h!?1yWkSy{ATfE7}$OSOQVCGNPM-)yH@vAC%t!oN_~hO zTpq^>-%1!_;)@U;zbC|RV9dXKncfzNy-bS@i`b#{-$utGHj4k+u3bmFpiSIlCdk}C zy%o*8b%=2pq&uHv><^=dQQ1xU4FZGHtBObkp zXw#=W_8jH;{6vUQXDD(pL^cd5)WbgPYaQfHxF!0RASy*wIDEMf(nK9;0#CU}73sdd zrjO|*NuSYhAfMo-WeFQs(6xy5THkGKT10#an{V~CUAw`m;mH=R-+9klci&pVR{q=8 zNJ_7U3XJ_JR?TUq=F@Bk&$95JqraYKDNhpP6#Y6A!a7>VI*KBz#LJ6jM0?k*Ya&BF zH9qcFSV2-vDQyK0<+L*lYF~+kzHbHF`$}@i1*1&V4-?tu2C_|V?OotlW_&Hib{@M> zby4)VzDU(kq=;Nl#PA65Kf_-oPg$q`!LB&Y5E0)!AJHhK#FK3eFk+i0USyJ-fh+7S zS3`{3>bBbG9kCUW*VWfq^rO?&_c^{4kh*c7{CO#)wyUnTE96LKQsx>Na*PVsC%y(h7DSVgr>a)*U6C6+E(tj_z2nyxYAy=^pUE2wLze zi~cnR|8@4JH~2O3CVTi>?AmX;I3J_Cw(^%3pc8_$)+w&Mw%BN-B@7X$wA5)jCla&? zY5m4(95kPU=5y%(KR8??hwJ3s;u`gGRILYCMc^crwKPOM5&6XO^*&4IN}Y62uardU+Pn8jpU*M?VROLEXrqBx~UR+PUJbN@GJuBe=~47j{pDw delta 889 zcmaJ;J#$h)6g~TZJb0`?f)Evrq9J@Gk{~fgj1fhR1~qC->KB5FLqG{Qri%Uq=M_#G zTMH{cMrSN+?CdOU?EDiJj`!X$i8IbvymQaqxA&a0yRQ@9gPUJ}fBFodfMpANaoUG4 ziVSBMW*E*g%rcx~C^4KjalwMMy}#_kMO?B7E?bzx6<%JoXxBVL#l$re*A@JBwc6@7 zJBu3+YYN%Q`lD{W_WVcD3N>p_Iwk)3Zdh#@PRbJ>a;M7aC51kFjYo)7+qKm?5zlIE zrS5z&3u{SCX+#j!*pGc0gA4}{(>RDj8bizuk?8kPl+o?BlrFPrisMOax z8pkkf;)cco@4JaxCT?pi;*Q1=cM8aBOd_w4aBNq?`RR?QtnAPeXri%o8FgP7CgR@b!IH;^Crc_EQmBLD;yizH$RLTc37e0bM;z^_k z)6OqzL1mnIe{MNTf9GHl&SDf}RGG1}62@MJFm`hbV?U2DcHEw2PcO|JM@}5R`BR%2 z+7p0_FpfQRTS1I~{j_Kg_WZ`Fh x8(?+5Jz(lDF|{M6dSV8@_O8T?oZugg;(s-~I7u%2Mo$N#kzHrLvs030`VURXW;Xx; diff --git a/target/test-classes/squier/john/accessControl/BankAccountTest.class b/target/test-classes/squier/john/accessControl/BankAccountTest.class index 57ee278824366ff8b817374ed8415a35824d873d..d7539f1aec8d729361ea3af98f98b004719ffaa3 100644 GIT binary patch literal 7122 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 delta 586 zcmZ{hJ#W)c6o#K0k~pz%LJ<%kX-rBR7YMES=m(!|T3T94C{U;nVsaxx1(hQ~%D@5x z1N)Wu3(O!@s0blg8M`ttz#m{^LL4U*Ojz>ud+&MtzQ@N~W@|laD+U`TuU?ni;p6sP*q#p7f~Xm8SC^xEk6KT|$ZV;* zsSaU=69w}j? zg@)!Ti<)a(x45BM;-=;nv*u0ut656=YDjF0=6Pnf*|fgx>Uj`634H18zCY7iUs(&y ztBmpJlMgP)C=zmucV{TllstE!B(hi5ve|UXHCN8;4(E_0&q3L1sm5zXd=Py|_=NCE zH Date: Tue, 17 Jan 2017 17:57:50 -0500 Subject: [PATCH 08/13] added transaction records and storage in a transaction arrayList --- .idea/workspace.xml | 86 +++++++++--------- .../john/accessControl/BankAccount.java | 32 ++++++- .../john/accessControl/BankAccount.class | Bin 4779 -> 5231 bytes 3 files changed, 72 insertions(+), 46 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 35c0aec..b963efe 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,7 @@ - - @@ -34,17 +32,17 @@ - - + + - - - - - - + + + + + + @@ -93,7 +91,7 @@ - + @@ -285,7 +283,7 @@ - + @@ -798,8 +796,8 @@ - - + + @@ -816,14 +814,11 @@ - - - @@ -839,6 +834,9 @@ + + + @@ -853,7 +851,7 @@ - @@ -923,22 +921,6 @@ - - - - - - - - - - - - - - - - @@ -965,7 +947,7 @@ - + @@ -973,19 +955,35 @@ + + + + + + + + + + + + + + + + - - + + - - - - - - + + + + + + diff --git a/src/main/java/squier/john/accessControl/BankAccount.java b/src/main/java/squier/john/accessControl/BankAccount.java index e64cb5e..44ed400 100644 --- a/src/main/java/squier/john/accessControl/BankAccount.java +++ b/src/main/java/squier/john/accessControl/BankAccount.java @@ -45,6 +45,9 @@ public String getAccountHoldersName() { public void setAccountHoldersName(String newName) { if ( accountStatus.equals(BankAccountStatus.OPEN) ) { accountHoldersName = newName; + + transactionRecord.add(new BankAccountTransaction(TransactionType.NAME_CHANGE, 0.0, + accountStatus, this.accountHoldersName)); } return; @@ -60,10 +63,16 @@ public void setAccountStatus(BankAccountStatus accountStatus) { if ( isNewAccountStatusClose(accountStatus) ) { if ( this.balance == 0.0 ) { this.accountStatus = accountStatus; + + transactionRecord.add(new BankAccountTransaction(TransactionType.STATUS_CHANGE, 0.0, + this.accountStatus, accountHoldersName)); } } else { this.accountStatus = accountStatus; + + transactionRecord.add(new BankAccountTransaction(TransactionType.STATUS_CHANGE, 0.0, + this.accountStatus, accountHoldersName)); } } @@ -109,6 +118,9 @@ private ApprovalStatus credit(double amountToCredit) { // check if balance updated if ( (previousBalance + amountToCredit) == getBalance() ) { + // create new transaction record and add to list + transactionRecord.add(new BankAccountTransaction(TransactionType.DEPOSIT, + amountToCredit, accountStatus, accountHoldersName)); return ApprovalStatus.APPROVED; } else { @@ -117,9 +129,18 @@ private ApprovalStatus credit(double amountToCredit) { } private ApprovalStatus debit(double amountToDebit) { - // add overdraft logic + Double previousBalance = getBalance(); balance += amountToDebit; - return ApprovalStatus.APPROVED; + + if ( (previousBalance - amountToDebit) == getBalance() ) { + // create new transaction record + transactionRecord.add(new BankAccountTransaction(TransactionType.WITHDRAWL, amountToDebit, + accountStatus, accountHoldersName)); + return ApprovalStatus.APPROVED; + } + else { + return ApprovalStatus.NOT_APPROVED; + } } @@ -135,6 +156,9 @@ public ApprovalStatus transferBalanceFrom(BankAccount transferFrom, double amoun ApprovalStatus debitApproval = transferFrom.updateBalanceWithCreditOrDebit(-amountToTransfer); ApprovalStatus creditApproval = this.updateBalanceWithCreditOrDebit(amountToTransfer); + transactionRecord.add(new BankAccountTransaction(TransactionType.TRANSFER, amountToTransfer, + accountStatus, accountHoldersName)); + // pull out into check approvals method if ( (debitApproval.equals(ApprovalStatus.APPROVED)) && creditApproval.equals(ApprovalStatus.APPROVED) ) { @@ -157,6 +181,10 @@ public ApprovalStatus transferBalanceTo(BankAccount transferTo, double amountToT ApprovalStatus debitApproval = this.updateBalanceWithCreditOrDebit(-amountToTransfer); ApprovalStatus creditApproval = transferTo.updateBalanceWithCreditOrDebit(amountToTransfer); + transactionRecord.add(new BankAccountTransaction(TransactionType.TRANSFER, amountToTransfer, + accountStatus, accountHoldersName)); + + if ((debitApproval.equals(ApprovalStatus.APPROVED)) && creditApproval.equals(ApprovalStatus.APPROVED)) { return ApprovalStatus.APPROVED; diff --git a/target/classes/squier/john/accessControl/BankAccount.class b/target/classes/squier/john/accessControl/BankAccount.class index 748b685b8d6c9f299153579f7c17cfba2d0eec21..3fc47ced54f90d5ab0d576e2985d78dbe3800eb0 100644 GIT binary patch literal 5231 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 KeU&yJ_Wld&ZwBK4 From 80cb9f140581abc99a66c0855b8edfbac4f0aba7 Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 20:12:15 -0500 Subject: [PATCH 09/13] added testing to transaction record --- .idea/workspace.xml | 234 +++++++----------- .../accessControl/BankAccountTransaction.java | 7 +- .../BankAccountTransactionTest.java | 47 ++++ .../john/accessControl/BankAccount.class | Bin 5231 -> 5461 bytes .../BankAccountTransaction.class | Bin 789 -> 1344 bytes .../BankAccountTransactionTest.class | Bin 0 -> 2090 bytes 6 files changed, 147 insertions(+), 141 deletions(-) create mode 100644 src/test/java/squier/john/accessControl/BankAccountTransactionTest.java create mode 100644 target/test-classes/squier/john/accessControl/BankAccountTransactionTest.class diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b963efe..7962d75 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + @@ -19,70 +19,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -91,7 +32,7 @@ - + @@ -100,8 +41,8 @@ - - + + @@ -110,12 +51,14 @@ - - + + - - - + + + + + @@ -125,8 +68,8 @@ @@ -145,11 +88,12 @@ @@ -167,8 +111,8 @@ - @@ -283,7 +227,7 @@ - + @@ -310,7 +254,7 @@ - + - + - + - + - - - - + + + + - - - - - + + + + + @@ -814,20 +758,11 @@ - - - - - - - - - @@ -837,11 +772,11 @@ - - + + - - + + @@ -849,12 +784,21 @@ + + + + + + + + + - - + @@ -866,13 +810,13 @@ - + - + @@ -905,49 +849,66 @@ - + - - + + - + - + - + - - + + - + - + - + - - + + + + + + + + + + + + + + + + + + + - + @@ -955,10 +916,10 @@ - + - - + + @@ -971,19 +932,12 @@ - + - - + + - - - - - - - - + diff --git a/src/main/java/squier/john/accessControl/BankAccountTransaction.java b/src/main/java/squier/john/accessControl/BankAccountTransaction.java index eb0b243..def2f3c 100644 --- a/src/main/java/squier/john/accessControl/BankAccountTransaction.java +++ b/src/main/java/squier/john/accessControl/BankAccountTransaction.java @@ -5,7 +5,7 @@ */ public class BankAccountTransaction { private TransactionType transactionType; - private double transactionAmount; + private Double transactionAmount; private BankAccountStatus newStatus; private String newName; @@ -16,4 +16,9 @@ public BankAccountTransaction(TransactionType transactionType, double transactio this.newStatus = newStatus; this.newName = newName; } + + public TransactionType getTransactionType() { return transactionType; } + public Double getTransactionAmount() { return transactionAmount; } + public BankAccountStatus getBankAccountStatus() { return newStatus; } + public String getName() { return newName; } } diff --git a/src/test/java/squier/john/accessControl/BankAccountTransactionTest.java b/src/test/java/squier/john/accessControl/BankAccountTransactionTest.java new file mode 100644 index 0000000..b6952eb --- /dev/null +++ b/src/test/java/squier/john/accessControl/BankAccountTransactionTest.java @@ -0,0 +1,47 @@ +package squier.john.accessControl; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by johnsquier on 1/17/17. + */ +public class BankAccountTransactionTest { + + BankAccountTransaction bankAccountTransaction; + + @Before + public void setup() { + bankAccountTransaction = new BankAccountTransaction(TransactionType.DEPOSIT, 100.0, + BankAccountStatus.OPEN, "John"); + } + + @Test + public void getTransactionTypeTest() { + TransactionType expected = TransactionType.DEPOSIT; + TransactionType actual = bankAccountTransaction.getTransactionType(); + Assert.assertEquals(expected, actual); + } + + @Test + public void getTransactionAmountTest() { + Double expected = 100.0; + Double actual = bankAccountTransaction.getTransactionAmount(); + Assert.assertEquals(expected, actual); + } + + @Test + public void getBankAccountStatusTest() { + BankAccountStatus expected = BankAccountStatus.OPEN; + BankAccountStatus actual = bankAccountTransaction.getBankAccountStatus(); + Assert.assertEquals(expected, actual); + } + + @Test + public void getNameTest() { + String expected = "John"; + String actual = bankAccountTransaction.getName(); + Assert.assertEquals(expected, actual); + } +} diff --git a/target/classes/squier/john/accessControl/BankAccount.class b/target/classes/squier/john/accessControl/BankAccount.class index 3fc47ced54f90d5ab0d576e2985d78dbe3800eb0..befddc36984fcf077fc9598f81cf600c149186a8 100644 GIT binary patch literal 5461 zcmb_f4ObM`8GZ(KSy+Y-A*dKNYO1V@u(nOxBoK977Qx~!VOOYVONM2DRoundSx}oc zX&alSY16N?1~sOwNo{SK7$RU}n|?P<`vdx8+SAkLotgcB0A0^1=WyrFo%_D`dEU>v zfB(;W?*n)QA9@kM`6{&If(#dB_@WF?%kU)`zAVEtGCb?SSG@4r`@dR+ui-f_hf7|3 z9nZ__H#~Tu3g5(wUTna(Wb3!RlzT~r@5qPm%C7HK;rsZ3mjfl+@p2V@h#$%9vJ9`t z>zoW%!^cP^~2r z>1@i3UzpYvwDx7rWs|xQIGvtM1^7wNWJ2kbX{4tDhqct1U}1BIf*MCQl07@B8w!+O z1shWOdDGdJTlb7=Q(7uP{YsaD21lwVJvF8qnTU3l9~$~jYcpDa+a>}r(@3T!s9#N{ zOx@5k=745$Pwu#wshQb~g0|AY+S{qFF+HOjV}>?v_8VzaPngMcNhJNDZ({~zjw7go$DN5Z1KX89S5kl zqBEIFng9=4 zsX@(1%Dc1ZGAEOCZOb|b66J?wb zT^5AP#q(jW!*w|7{srqs!RcuuJ)=!IOc?muSt(bXBrHV=YVDPH+Sbfan>O^B zWICJ4$3<~3J28YWF}rnxL`_RyGsfO!k$Xvy?wGkT0gJUW{a;U`PA!8#<0Q(UaQV=S%b!q+-3J3gLFB=uAw^;=6l)^eXq zOC;#b%Fe`;Q%9Kx%o1-boi!4AcTx&eeG!ayX-_H+BdcORKCbe9@JSV)kl|DKw2IH* zQ5BEL>~VCc=)@C@5v!#wZwV?6;GhS;RPmdg!-HR|cn?pg7=!M?Jr%z}QpM+SQpKnYzm?bb zW$49G6~DvpRs2DO|0rvJ!W|F(tl}^DtBN$HRh)yNVpt?UkX?N^=E2_->@EpDZChyf z(b3cF#mkoL9OZSSByG7`QyuLNhDN#vqQl_`>w|tSt4*<&EGyIYVI2}w9+s7?9vzn* z%*O(teBW?I`$f~(mNSx<0jD2(R3JpMAT)uBcI! zYh%2+)WqV!`0-dCbVaBy8VmEH*0wh9Rhm5w8jb`H_lcx$ZOL36$~jGqMB^jD{{DgJ zph(sahXja0me<7PaFW)j+h7S7tRmGHN*NNqAg^4~$_JZctEI|sLN zo3HM>sJqQiTF{Q*8jzncmxL|d7qt-@OL z7in=jS`sFkmxehH0>cwk6OY-4V)Owmrv z0W>f++Snk(lpAfWc~iEdpJr3wFlgiSNenn3iWyX{WboLk3}T2o!ix@rQ;eFXISlz* zm#}dT0m60HUcQ2EAtT@&GMiSCxe1H!dRq#7ckwjP#U2Jn9piX2f()P#-QUBvqc};+ z7Wkja^FJk>(&6tyS;s@P5BrwGp@(nc!bY+4JT}t{SKx8ogsc3`ys2%6#){0*SQHj+ zlx;YqP!AiSqqUQ7;@iqrTcxNfj*X!rq?LK3l{jG`RixiJnr_j{5}VyNK08Vt&pfu?ZmGR|ohiwcZJfVy&7N<+J&%X@zoQWGc7mQ_^n8ISIl{Pq z3VYbI_d#ccnP9|BGC9w%Mx=|dcIUBn;}lcSj;ac{_EcAwlOfx@gZl=(C8-+nFJfoJ ze}W;=l3*2STg0xGge-Ex7}-?_kB3`?BmZ-;K97$P^wt9CEvTSMlbN4o2%N_bT%^IC zWV$^jN-;aQqIQdeY-3C zlRgxK5BnvvTjtR3Z}ly~H-{swzS%|WeVm;^9#a3D9QXTHII-D9H!h-e4h_xj+?27p z!nJ#>{xiq%Dy!Kw#^kH4$FK2%dxHh{br!5Qn6tMm8jsMPTli%XN!nm1>)vV3q#X?B zsSPuBd&oo9rfAbL%k^$3|FTm5?0O{q4oSa5vi1K<@@Z7DZ$QQ&&|rmP&P!$Whj=q$re~dlw(%){ZWnJP R(i4=TPAi>yhHGV*{V&2H6v_Yq literal 5231 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 DBIY%R delta 293 zcmW-bO-{ow6ofxJNkfC%hEjgw^3(3Xl?sbq010sfu7fxNRETqQ5g}M0)*K2k&$2W# zPoA0geww$z_3z);H?U#ZP}2<=5Dn%AX9njr7d4kJ>qqbIckg#@`{`G)Wf9n87--lJ z1V(`|6UXhVi`zwU^Tbl&THPhyoKoJ*ndQ%{h}h}190;eHo+*@sdHTSmRgX_sJw@uu zo-%b+PqoY8Lt)I;k(P|LVj^srsVY9GYbL{n%DOn>SZvB}aaq|lJ}bMY%*rmR^naqs GbNUaa4i}IB diff --git a/target/test-classes/squier/john/accessControl/BankAccountTransactionTest.class b/target/test-classes/squier/john/accessControl/BankAccountTransactionTest.class new file mode 100644 index 0000000000000000000000000000000000000000..29052cb7f99740f8e39a61e860c3559aadc29c21 GIT binary patch literal 2090 zcmb7_3r`zI6otR?(dq^Omu#hH+$W|!h1=+iLh)4I3KnX!u5;v~M}TR@-eibb^*= zIlk2nY}XOE(ePh{w)D(H_qk(Q?Y8v&E!PP=w_|Re8nYpgyJI_ca93cYT-g)IZn;mT zz<9%U@44I|5DWAEXWMJt)roFd*KbA^TU{wBgEZc#6DzH2xt5n@o ztf~X67+M{Hi4-qMbEcnGJ&H;n@r=fy_0lpsmUCd%+>psrOYKh;e3xEAKhAG;NKykK zlp3Sdwsn-aOVf4(&vp*DrLgOUUR&O`)iGU8iKI<3*)^4^jv}T6uAjA2G~CtkE#@@b z(^16&JLM6(Ov!EPFz~UCEz~sBb==2y8Xo9)h(|iUM?=SBZ0l%ZM_~P|+_-8Jy&^aF z4|%=E(<0;}c95b2X?u#bD!rt16BW6g9cn$%yg(Rs5L%PD+Z*K|V3ib^O||G3Fn z)0b8!l+9-XQ{`GECDgqI#eNs@tq~~FNAEcMb`R7?z#Qs&Ab{6FOK!|bQc_=B;hT1n zuV2A0`<7#lbKVM$B|e$_tA0DT^bX<=PBNHIHUS09aIVK2FpE$4ByfSjnJBo9(df77 zrN5AQ@(LqGWM3g?Xzwuk2KkeVjwmxMY+ zGw-1%;EzrRUxbEB7^irVqRLtfo=U)41fC~&JOa-TfUkAIDZ9CZdj53kJndeil?B>e zOi_(Ky9-^r3j@@}F7>Cx?xdk5(DBou%dF@M#`sTt0&6L#s<>*5k;rP9(6PvBc>r4B It_+s`11lTyjQ{`u literal 0 HcmV?d00001 From 8c7c923cddac6c7470fb909fa1bbac2bf98c3f6f Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 20:49:22 -0500 Subject: [PATCH 10/13] added updated uml --- .idea/workspace.xml | 142 ++++++++++++------ AccessControlLab.png | Bin 0 -> 132815 bytes .../john/accessControl/BankAccount.java | 3 +- .../accessControl/BankAccountTransaction.java | 2 +- 4 files changed, 94 insertions(+), 53 deletions(-) create mode 100644 AccessControlLab.png diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7962d75..2cb7a09 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,6 +2,7 @@ + @@ -22,8 +23,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + @@ -51,7 +72,17 @@ - + + + + + + + + + + + @@ -63,6 +94,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -91,9 +142,9 @@ @@ -758,7 +809,7 @@ @@ -795,7 +846,7 @@ - @@ -810,13 +861,13 @@ - + - + @@ -849,27 +900,31 @@ - + - - - + + + + + - + - - + + - + - - - + + + + + @@ -881,50 +936,39 @@ - + - - - - - - - - - - - - + + + - - + + - + - - - - - + + + - + - - + + - + @@ -932,13 +976,11 @@ - + - - - - - + + + diff --git a/AccessControlLab.png b/AccessControlLab.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0f8b39c9b4269e5eb621a89165bd535f906fb9 GIT binary patch literal 132815 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