Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions exercises/practice/bank-account/.meta/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"TomPradat"
],
"contributors": [
"jagdish-15",
"SleeplessByte"
],
"files": {
Expand Down
61 changes: 61 additions & 0 deletions exercises/practice/bank-account/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[983a1528-4ceb-45e5-8257-8ce01aceb5ed]
description = "Newly opened account has zero balance"

[e88d4ec3-c6bf-4752-8e59-5046c44e3ba7]
description = "Single deposit"

[3d9147d4-63f4-4844-8d2b-1fee2e9a2a0d]
description = "Multiple deposits"

[08f1af07-27ae-4b38-aa19-770bde558064]
description = "Withdraw once"

[6f6d242f-8c31-4ac6-8995-a90d42cad59f]
description = "Withdraw twice"

[45161c94-a094-4c77-9cec-998b70429bda]
description = "Can do multiple operations sequentially"

[f9facfaa-d824-486e-8381-48832c4bbffd]
description = "Cannot check balance of closed account"

[7a65ba52-e35c-4fd2-8159-bda2bde6e59c]
description = "Cannot deposit into closed account"

[a0a1835d-faae-4ad4-a6f3-1fcc2121380b]
description = "Cannot deposit into unopened account"

[570dfaa5-0532-4c1f-a7d3-0f65c3265608]
description = "Cannot withdraw from closed account"

[c396d233-1c49-4272-98dc-7f502dbb9470]
description = "Cannot close an account that was not opened"

[c06f534f-bdc2-4a02-a388-1063400684de]
description = "Cannot open an already opened account"

[0722d404-6116-4f92-ba3b-da7f88f1669c]
description = "Reopened account does not retain balance"

[ec42245f-9361-4341-8231-a22e8d19c52f]
description = "Cannot withdraw more than deposited"

[4f381ef8-10ef-4507-8e1d-0631ecc8ee72]
description = "Cannot withdraw negative"

[d45df9ea-1db0-47f3-b18c-d365db49d938]
description = "Cannot deposit negative"

[ba0c1e0b-0f00-416f-8097-a7dfc97871ff]
description = "Can handle concurrent transactions"
77 changes: 63 additions & 14 deletions exercises/practice/bank-account/bank-account.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,30 @@ describe('Bank Account', () => {
expect(account.balance).toEqual(0);
});

xtest('can deposit money', () => {
xtest('Single deposit', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
expect(account.balance).toEqual(100);
});

xtest('can deposit money sequentially', () => {
xtest('Multiple deposits"', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
account.deposit(50);
expect(account.balance).toEqual(150);
});

xtest('can withdraw money', () => {
xtest('Withdraw once', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
account.withdraw(50);
expect(account.balance).toEqual(50);
});

xtest('can withdraw money sequentially', () => {
xtest('Withdraw twice', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
Expand All @@ -40,14 +40,25 @@ describe('Bank Account', () => {
expect(account.balance).toEqual(0);
});

xtest('checking balance of closed account throws error', () => {
xtest('Can do multiple operations sequentially', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
account.deposit(110);
account.withdraw(200);
account.deposit(60);
account.withdraw(50);
expect(account.balance).toEqual(20);
});

xtest('Cannot check balance of closed account', () => {
const account = new BankAccount();
account.open();
account.close();
expect(() => account.balance).toThrow(ValueError);
});

xtest('deposit into closed account throws error', () => {
xtest('Cannot deposit into closed account', () => {
const account = new BankAccount();
account.open();
account.close();
Expand All @@ -56,7 +67,14 @@ describe('Bank Account', () => {
}).toThrow(ValueError);
});

xtest('withdraw from closed account throws error', () => {
xtest('Cannot deposit into closed account', () => {
const account = new BankAccount();
expect(() => {
account.deposit(50);
}).toThrow(ValueError);
});

xtest('Cannot withdraw from closed account', () => {
const account = new BankAccount();
account.open();
account.close();
Expand All @@ -65,22 +83,22 @@ describe('Bank Account', () => {
}).toThrow(ValueError);
});

xtest('close already closed account throws error', () => {
xtest('Cannot close an account that was not opened', () => {
const account = new BankAccount();
expect(() => {
account.close();
}).toThrow(ValueError);
});

xtest('open already opened account throws error', () => {
xtest('Cannot open an already opened account', () => {
const account = new BankAccount();
account.open();
expect(() => {
account.open();
}).toThrow(ValueError);
});

xtest('reopened account does not retain balance', () => {
xtest('Reopened account does not retain balance', () => {
const account = new BankAccount();
account.open();
account.deposit(50);
Expand All @@ -89,7 +107,7 @@ describe('Bank Account', () => {
expect(account.balance).toEqual(0);
});

xtest('cannot withdraw more than deposited', () => {
xtest('Cannot withdraw more than deposited', () => {
const account = new BankAccount();
account.open();
account.deposit(25);
Expand All @@ -98,7 +116,7 @@ describe('Bank Account', () => {
}).toThrow(ValueError);
});

xtest('cannot withdraw negative amount', () => {
xtest('Cannot withdraw negative', () => {
const account = new BankAccount();
account.open();
account.deposit(100);
Expand All @@ -107,15 +125,46 @@ describe('Bank Account', () => {
}).toThrow(ValueError);
});

xtest('cannot deposit negative amount', () => {
xtest('Cannot deposit negative', () => {
const account = new BankAccount();
account.open();
expect(() => {
account.deposit(-50);
}).toThrow(ValueError);
});

xtest('changing balance directly throws error', () => {
xtest('Can handle concurrent transactions', async () => {
const account = new BankAccount();
account.open();
account.deposit(1000);

for (let i = 0; i < 10; i++) {
await adjustBalanceConcurrently(account);
expect(account.balance).toEqual(1000);
}
});

function adjustBalanceConcurrently(account) {
const random = () => Math.floor(Math.random() * 10);

const tasks = Array.from({ length: 1000 }, () =>
new Promise(resolve => {
try {
account.deposit(5);
setTimeout(() => {
account.withdraw(5);
resolve();
}, random());
} catch (e) {
throw new Error(`Exception should not be thrown: ${e.message}`);
}
})
);

return Promise.all(tasks);
}

xtest('Changing balance directly throws error', () => {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test is an extra one! It isn’t listed in test.toml or in canonical-data.json on the problem-specifications repo.
It comes from the original test file.

Should we keep it, or would it be better to remove it?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my 2 cents: The test should stay, as it's a valid use case and it's not superseded by any of the other tests

const account = new BankAccount();
account.open();
expect(() => {
Expand Down
Loading