diff --git a/.gitignore b/.gitignore
index 3c8b8dd5..946b0332 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@
.idea/**/dictionaries
.idea/**/shelf
+target/
# Generated files
.idea/**/contentModel.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
index d87af9ac..5d282d4d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,9 @@
+
+
+
-
+
\ No newline at end of file
diff --git a/src/main/java/edu/ithaca/dragon/bank/BankAccount.java b/src/main/java/edu/ithaca/dragon/bank/BankAccount.java
index e340e0ea..57ad7a6e 100644
--- a/src/main/java/edu/ithaca/dragon/bank/BankAccount.java
+++ b/src/main/java/edu/ithaca/dragon/bank/BankAccount.java
@@ -1,5 +1,11 @@
package edu.ithaca.dragon.bank;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
public class BankAccount {
private String email;
@@ -8,39 +14,192 @@ public class BankAccount {
/**
* @throws IllegalArgumentException if email is invalid
*/
- public BankAccount(String email, double startingBalance){
- if (isEmailValid(email)){
+ public BankAccount(String email, double startingBalance) {
+ if (isEmailValid(email) && isAmountValid(startingBalance)){
this.email = email;
this.balance = startingBalance;
}
+
else {
- throw new IllegalArgumentException("Email address: " + email + " is invalid, cannot create account");
+ throw new IllegalArgumentException("Email address or starting balance is invalid");
}
}
- public double getBalance(){
- return balance;
- }
+ public double getBalance(){ return balance; }
public String getEmail(){
return email;
}
/**
+ * @throws InsufficientFundsException if withdraw amount is greater than balance
+ * @throws IllegalArgumentException if withdraw amount is negative or has more than 2 decimals
* @post reduces the balance by amount if amount is non-negative and smaller than balance
*/
- public void withdraw (double amount) {
- balance -= amount;
+ public void withdraw (double amount) throws InsufficientFundsException, IllegalArgumentException {
+ if (amount <= balance && isAmountValid(amount)){
+
+ balance -= amount;
+ }
+
+ else if(!isAmountValid(amount)){
+ throw new IllegalArgumentException("invalid amount to withdraw");
+ }
+
+ else {
+ throw new InsufficientFundsException("Not enough money");
+ }
+
+
+ }
+
+
+ /**
+ * @throws InsufficientFundsException if amount is more than is available
+ * @param amount
+ * @post subtracts from account1 to account2
+ */
+
+ public void transfer(double amount, BankAccount toAccount) throws IllegalArgumentException, InsufficientFundsException {
+ if(amount > balance){
+ throw new InsufficientFundsException("Not enough money to transfer");
+ }
+ if(isAmountValid(amount)){
+
+ balance = balance - amount;
+
+
+ toAccount.deposit(amount);
+
+ DecimalFormat newFormat = new DecimalFormat("#. ##");
+
+
+ balance = Double.valueOf(newFormat.format(balance));
+
+ toAccount.balance = Double.valueOf(newFormat.format(toAccount.balance));
+ }
+
+
+ else if(!isAmountValid(amount)){
+ throw new IllegalArgumentException("Not a valid amount to transfer");
+ }
+
+
+
+ }
+
+
+
+
+
+ /**
+ * @throws IllegalArgumentException if amount is negative or contains more than two decimals
+ * @param amount
+ * @post adds the amount to the balance of the bankAccount, should increase
+ */
+
+ public void deposit(double amount){
+ if(isAmountValid(amount)){
+ balance+=amount;
+
+ DecimalFormat newFormat = new DecimalFormat("#. ##");
+
+ balance = Double.valueOf(newFormat.format(balance));
+
+
+
+ }
+ else{
+ throw new IllegalArgumentException("Invalid deposit amount");
+ }
+ }
+
+ /**
+ * @param amount
+ * @return true if amount is not negative and two decimals or less
+ */
+
+ public static boolean isAmountValid(double amount) {
+ if(amount < 0) {
+ return false;
+ }
+
+ String s = ""+amount;
+
+ int i = s.lastIndexOf('.');
+
+ if(s.length()-i-1 > 2){
+ return false;
+ }
+
+ return true;
}
+
+
+
+
public static boolean isEmailValid(String email){
- if (email.indexOf('@') == -1){
+ if (email.indexOf('@') == -1 || email.indexOf('@') == 0) {
return false;
}
- else {
- return true;
+ if (email.indexOf('.') == -1) {
+ return false;
+ }
+ int count = 0;
+ for (int i = email.indexOf('@'); i < email.length(); i++) {
+ if (email.charAt(i) == ('.')) {
+ count++;
+ }
+ }
+ if (count != 1) {
+ return false;
}
+
+ for (int i = 0; i < email.indexOf('@'); i++) {
+ if (email.charAt(i) == ('.')) {
+ if (email.charAt(i + 1) == ('.')) {
+ return false;
+ }
+ }
+ }
+
+ int count3 = 0;
+ for (int j = email.indexOf('.'); j < email.length(); j++) {
+ if (email.charAt(j) != (' ')) {
+ count3++;
+ }
+ }
+
+
+ if (count3 <= 1) {
+ return false;
+ }
+
+
+ int count2=0;
+ for(int i=0; i= 2;
+
}
+
+
+
+
+
}
diff --git a/src/test/java/edu/ithaca/dragon/bank/BankAccountTest.java b/src/test/java/edu/ithaca/dragon/bank/BankAccountTest.java
index d19ecb02..a6c314e0 100644
--- a/src/test/java/edu/ithaca/dragon/bank/BankAccountTest.java
+++ b/src/test/java/edu/ithaca/dragon/bank/BankAccountTest.java
@@ -7,24 +7,74 @@
class BankAccountTest {
@Test
- void getBalanceTest() {
+ void getBalanceTest() throws InsufficientFundsException, IllegalArgumentException{
BankAccount bankAccount = new BankAccount("a@b.com", 200);
-
- assertEquals(200, bankAccount.getBalance());
+ assertEquals(200, bankAccount.getBalance()); //check get balance == starting balance
+ bankAccount.withdraw(50);
+ assertEquals(150,bankAccount.getBalance()); //check balance after withdraw
+ assertThrows(InsufficientFundsException.class, () -> bankAccount.withdraw(200)); //check if throws exception for invalid withfraw
+ assertEquals(150, bankAccount.getBalance()); //check if balance remains same
+ assertThrows(IllegalArgumentException.class, () -> bankAccount.withdraw(-200));
+ assertEquals(150, bankAccount.getBalance()); //check for withdraw negative amount
+ bankAccount.withdraw(0);
+ assertEquals(150, bankAccount.getBalance()); //balance after withdraw 0
}
@Test
- void withdrawTest() {
+ void withdrawTest() throws InsufficientFundsException, IllegalArgumentException {
BankAccount bankAccount = new BankAccount("a@b.com", 200);
bankAccount.withdraw(100);
-
- assertEquals(100, bankAccount.getBalance());
+ assertEquals(100, bankAccount.getBalance()); // check if withdraw decreased in account
+ assertThrows(InsufficientFundsException.class, () -> bankAccount.withdraw(300)); //check if withdraw amount greater than amount in bank account/ test exception
+ assertThrows(IllegalArgumentException.class, () -> bankAccount.withdraw(100.0001));
+ bankAccount.withdraw(100.0000);
+ assertEquals(0, bankAccount.getBalance()); //check if amount of total withdraw equal to balance
+ bankAccount.withdraw(0);
+ assertEquals(0, bankAccount.getBalance());
+ assertThrows(IllegalArgumentException.class, () -> bankAccount.withdraw(-100)); //check if withdraw negative number
+ assertEquals(0, bankAccount.getBalance()); //shouldn't equal 100 and remain at balance it was before
+ assertThrows(IllegalArgumentException.class, () ->bankAccount.withdraw(10.103234));
+ assertEquals(0, bankAccount.getBalance()); //should still remain 0
}
@Test
void isEmailValidTest(){
+ //Email should be true if starts with character or number, includes @ and ends with .'character'
+
assertTrue(BankAccount.isEmailValid( "a@b.com"));
assertFalse( BankAccount.isEmailValid(""));
+ assertTrue(BankAccount.isEmailValid("23s@b.com"));
+ assertTrue(BankAccount.isEmailValid("a1@b.com"));
+ assertFalse(BankAccount.isEmailValid("@n.com"));
+ assertFalse(BankAccount.isEmailValid("n.com"));
+ assertFalse(BankAccount.isEmailValid("n!!@Gcom"));
+ assertTrue(BankAccount.isEmailValid("n@gmail.com"));
+ assertTrue(BankAccount.isEmailValid("n@gyi.org"));
+ assertFalse(BankAccount.isEmailValid(".n@Gcom"));
+ assertFalse(BankAccount.isEmailValid(".#Gcom"));
+ assertFalse(BankAccount.isEmailValid("n$@@G$$com"));
+ assertFalse(BankAccount.isEmailValid("n12.2@gyi.g"));
+ }
+
+ @Test
+ void isAmountValidTest(){
+
+ /*Equivalence tests would : test negative number no decimals, test positive number no decimals, test negative float, test positive float
+ test float with more than two decimals positive and negative, test float with one decimal positive and negative, test 0 */
+
+ assertTrue(BankAccount.isAmountValid(10)); //positive int
+ assertTrue(BankAccount.isAmountValid(0.01)); //positive float
+ assertTrue(BankAccount.isAmountValid(.01)); //positive float without leading number
+ assertTrue(BankAccount.isAmountValid(1.1)); //positive float with one decimal
+ assertTrue(BankAccount.isAmountValid(0)); //testing 0
+
+
+ assertFalse(BankAccount.isAmountValid(-10)); //negative int
+ assertFalse(BankAccount.isAmountValid(-0.01)); //negative float
+ assertFalse(BankAccount.isAmountValid(-.01)); //negative float without leading number
+ assertFalse(BankAccount.isAmountValid(0.009)); //positive float with more than 2 decimals
+ assertFalse(BankAccount.isAmountValid(-0.00242423)); //negative float with more than 2 decimals
+
}
@Test
@@ -35,6 +85,71 @@ void constructorTest() {
assertEquals(200, bankAccount.getBalance());
//check for exception thrown correctly
assertThrows(IllegalArgumentException.class, ()-> new BankAccount("", 100));
+ assertThrows(IllegalArgumentException.class, () -> bankAccount.withdraw(-100)); //illegal arguement negative withdraw
+
+ BankAccount bankAccount2 = new BankAccount("a@be.com", 200);
+ assertThrows(IllegalArgumentException.class, ()-> bankAccount2.withdraw(.00012));
+ assertThrows(InsufficientFundsException.class, () ->bankAccount2.withdraw(200.01)); //throw insufficient funds exception
+ assertThrows(IllegalArgumentException.class, () ->bankAccount2.withdraw(200.0001));
+ assertThrows(IllegalArgumentException.class, ()-> new BankAccount("a32@gt.com", -100)); //invalid starting negative throw illegal argument
+ assertThrows(IllegalArgumentException.class, ()-> new BankAccount("a32@gt.com", 100.5345)); //invalid starting float throw illegal argument
+
+
+ }
+
+ @Test
+ void depositTest(){
+ BankAccount bankAccount = new BankAccount("a@bana.com", 100);
+
+ //Test valid amount to deposit (throws exceptions), test valid amounts deposit to increase the account amount
+
+
+ bankAccount.deposit(.01);
+ assertEquals(100.01, bankAccount.getBalance());
+ bankAccount.deposit(1.01);
+ assertEquals(101.02, bankAccount.getBalance());
+ assertThrows(IllegalArgumentException.class, () ->bankAccount.deposit(0.034234));
+ assertThrows(IllegalArgumentException.class, () ->bankAccount.deposit(-130));
+ bankAccount.deposit(1000);
+ assertEquals(1101.02, bankAccount.getBalance());
+ }
+
+ @Test
+ void transferTest() throws InsufficientFundsException{
+
+
+ BankAccount bankAccount1 = new BankAccount("bob@12.com", 500);
+ BankAccount bankAccount2 = new BankAccount("ang@2.com", 600);
+
+
+ bankAccount1.transfer(100, bankAccount2); //check if normal transfer works (positive number)
+
+ assertEquals(400, bankAccount1.getBalance());
+
+ assertEquals(700, bankAccount2.getBalance());
+
+ assertThrows(InsufficientFundsException.class, () ->bankAccount1.transfer(10000, bankAccount2)); //throw insufficient funds
+
+ assertThrows(IllegalArgumentException.class, () ->bankAccount1.transfer(-120, bankAccount2)); //throw illegal argument negative
+
+ assertThrows(IllegalArgumentException.class, () ->bankAccount1.transfer(.43234, bankAccount2)); //throw illegal argument more than 2 decimals
+
+ assertEquals(400, bankAccount1.getBalance()); //make sure amount didn't change
+
+ assertEquals(700, bankAccount2.getBalance()); //make sure amount didn't change
+
+ bankAccount1.transfer(1.04, bankAccount2); //check transfer with decimal number
+
+ assertEquals(398.96, bankAccount1.getBalance());
+
+ assertEquals(701.04, bankAccount2.getBalance());
+
+ bankAccount2.transfer(.04, bankAccount1); //check transfer amount of just cents in reverse order
+
+ assertEquals(399, bankAccount1.getBalance());
+
+ assertEquals(701.00, bankAccount2.getBalance());
+
}
}
\ No newline at end of file