From 1aadb78cd1c46868193d6c55a687852cc7e3578a Mon Sep 17 00:00:00 2001 From: John Squier Date: Tue, 17 Jan 2017 17:26:56 -0500 Subject: [PATCH 1/4] code implemented? --- .idea/workspace.xml | 223 +++++++++++---- .../john/accessControl/ApprovalStatus.java | 2 +- .../john/accessControl/BankAccount.java | 131 ++++++++- .../john/accessControl/BankAccountTest.java | 255 +++++++++++++++++- .../john/accessControl/ApprovalStatus.class | Bin 0 -> 1198 bytes .../john/accessControl/BankAccount.class | Bin 2009 -> 4779 bytes .../john/accessControl/BankAccountTest.class | Bin 1729 -> 7122 bytes 7 files changed, 553 insertions(+), 58 deletions(-) create mode 100644 target/classes/squier/john/accessControl/ApprovalStatus.class diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 942940a..35c0aec 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,11 @@ - + + + + + @@ -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 2/4] 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 3/4] 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 zcmbVP{aX~*6@CYHSy%@|5ETz6V1&b_USBNGp8FmL4U3YMH7BxxJ z)HeM}Khh+vVp98I8xw0%g8^)8)Bf82O?~?GJu|brqXD|s=i%Nvckempeb3ju{_8)V zd;5;ereoWq3h`7iD-!hHr)Nau{Lv{I~1y3ceHOa4C%M;(PM> zYM7_KFT)Sy^M`f#5q=!zz$0CFtqwoIPi6Hp8GbIGugmZY`FumPycxn3z=G^u4dZRRBS(KN!!;Rx6Xvgu^52H>J6sCk_aR(Yut7_w%|gyjU7XVubPeav z6%5_#K5fqCy7`ly&&SN1ZJF8bqgw7vw0yWnLA@tCQaC%MTMCpR1)FmE1=~AT+z(A@ zSuK~QekHD;$&(s1vl-pWk7#H4L(}kSZC>l4>Q{}Nty_BD9@A`|DVj^# znq9~%*k2h~_c+xxoAbJrv9xJ>)G}>7Z5w7zLH9aZ5}y^Io=vu;PY~*w|AyV2@)(N?p*0ST8WyrU;8L(#!hPGoJ zLq4z25#br#K3Yt#&7FIF4C7{jig~7<=+kG8Yjd8F7Rq=jdS4RWFJ4N+mi+3+TRMHl zywk!sl+(|0GRR7~1#LaeC9N@?3zHeXcoScO6NbO@*xBkxg8%;~v=HDH-9=uH3W z&b_A;Y&G&D`g!kwD;3L{c}D4BO;K4L`4^GyEX-wCyk3MR40|?a=^4XLSaE&Iuvx^N z@%0=Motv}Fc`fTPVd86NrCo86b`&XSaCcIstC^`bXX*2XS;&|2!rxuItO(%`3W6CI zM14_(2Wp#j)OXFZV6E8V7J3U}pw>%qk=UD}*3ggoAaGdKMm_=78h^&)A z#Zx7RHMo8%?z5{Fp}UwHi`*T?WK?W$WpXK#byk#;kJc&Ep7pXNKd8;?NjCAs`J4zp zU8xV&A>l7^@pfCr)Qjosm@7?QnOC@0$MuFVAl4gvtA!%9k5EmNwZ+3 z^#MZ~RHF~Z0lA)3^ubcG9|u%?5s#_pmf=hIvdZ_t6DppR)mLy(#aD5NIpSPt_g@Jr zde9rfA62|7=WgIVCZdY>aZ|;gWM>RX6)BuhaSI1S_&~*nIHW?uR0w}oaU0VrPT?69 zlQMiHpNldK;A<-G;A2*7MeW6jwtI(#u%u!cD?;zCiof7J6`zRCdsqqKuPXkAPgP`b zRz(h`iV3kigkvH6UBRA;tkId}`#mvrnwRf=TW(SE{ZWy&VsqJ$7>LFu2gVYo`bXFh z^m7F*%gf`wzU&(7kt_VYP*}pcNRjxZ)=pTt5 z9Tv&XwIz#{SY)A&BvO;n(b2KQxJWjh>K{u?rpBTp$!IJ!lpwRVSac*c8A}`=9qv!{ zPsUI5Po@%+(O4`snM_4fCz5=|Wt_`yTo^h{otpNpjlmav_u&_c_m3u$L#g$jfDefA zYR#=zb`KtZ$hSs0K)%bhTFYcuxMhFUO$?<5<73f@VO|Agk>i>@OGju^ObF@O;@R@A zu0rhM!+0NG_jRa}s^+RnYMOIc3f%c-c{?*J+?iSA&dfS@W|q1$v#z1wDQA5co4D@7 z5sp#r{1XA%0Qw>;P$FGRsERD2`efkwJE&elAkw*nV5Bv$gqp~<;1WWS*3c4aBdxVd zsEgb~_~Z&UEJ6LqQGS$TgaCmSs@+1xTRCpSBWNX|?dafYKOQB_9XQPY9K?8X5Fw6z zh@+pgtc0%Otb|~dvl5B{XC)+q&Pr&yvO=_$GVC-Stue}pj;)c8QM-uxWi%`xsNCjf z@Gdsq=1Q5lZ&smxMC$=HRCw_qR@vTr8IFl zf`n(q53%+^h)=ExaTHH`!WZamf!NNp*tCFMk**aqEnu_wui^4lGz!|<8_Wcm%c!@b zhEj(ZmtMN_DaQUV+US}+j7^zAdx=52TuL4TT5J=myk|TVgZvUNdyZ2N>Swx--r)sZ3$^D#vP=JTr!@f zoAi>T&wxLW2l-LAh|SArS-{3f#|pMAAhd|Bw>ugxUt`s9XB*d7-f`Ehw->RUe~*-t z(ygH+V}F8GGtShUKs%mgLwJsv@J-^Fq+h4#*J&TtffCjMoMe@_c~OHv`-TnGWXQYO z!+o9ABGnX&EaTCU$VmpZBh5nJzlOJf{xrono2uJ?ate|ZfyCxQ~ zo1nLrLA#+p!{W>`^d`f8jxUNl3wquG+2*(^RstC#ApsdAmFMsc{witAGX6LELL^xw z?}$nO&#Vgg^A!SqkpNyI;Fk&b6#~9Qz^|?W`1$_+vW<3bb+q9=HPss4%^OObS7WG zY3nmwxh=We#An&grF8pX&}mi07S+Se)9Z1FcpM@ghpzvF!*z0ammJlGvlfRcd2)JjI7V{P1Jtf%?A^!uSVrW*jH85+8VnZ=Ngdz)K{_L& zC4okR?2g-Y>jG;`U0JDH5 zLpkud9CJHxJlT8yMldux55s6DucLU#%1KQ3% zb)*wKW01xY;(6`uCAo_t5-m;ZHZB>oGw&s-Dt8VF#4 zf-8r*fBb)i6MCsf)+W+{2olkFTrH!qgl{gLh^n(Bzh_n@nv|)j?1jT%u$C5G0H_fX zQ9Q!gN`Hn}>UyDXix-YMzS{|kL<>hsp^gna(osaIfR>IUSUOgr>sZ6Ojxs6?$N#>; z>BJ0`zs+Cthr*_7oHf*l6C3eere3bO8;Xlp3^k*ja%|YA7q&vLP(w!PBrl^RMk}d| zRuW2U4)lbuN%jW)eLxm@T6fJaU}kfIjA?vDb^^_;YZK(mdTxUJrwCsqdn?LbqdMzU zr%X&0Y?Iv~#v1LP5I?bDi=yh=jnuHnTg6RMrD95v7I{jOQdB4ASdm4m%Fmgfk@-kY z2C8sA3Ra^cdYmvVLbJmiil}yyU~L{;O9k(co<(qO9=w$b-oxD#aDE=VoeJKMn!EQ4 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 4/4] 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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