##### Automated test in JS
```javascript=
// Actual Code
const sum = (a, b) => a - b;
// Testing Code
const result = sum(3, 7);
let expected = 10;
// Assertion
if (result !== expected) {
throw new Error(`${result} is not equal to ${expected}`);
}
```
---
##### Output

---
##### Abstract functionalty in separate file
```javascript=
//math.js
const sum = (a, b) => a - b;
const subtract = (a, b) => a - b;
module.exports = { sum, subtract };
```
---
##### Assertion library: v1.1
```javascript=
//assertion-library.js
const {sum, subtract} = require('../math')
// Testing sum function
let result = sum(3, 7);
let expected = 10;
if (result !== expected) {
throw new Error(`${result} is not equal to ${expected}`);
}
// Testing subtract function
result = subtract(7, 3)
expected = 4
// duplicate code (candidate for abstraction)
if (result !== expected) {
throw new Error(`${result} is not equal to ${expected}`);
}
```
---
##### Assertion library: v1.2
```javascript=
//assertion-library.js
...
function expect(actual){
}
```
---
##### Assertion library: v1.3
```javascript=
//assertion-library.js
...
// usage
expect(result).toBe(expected)
...
function expect(actual) {
return {
toBe(expected) {
}
}
}
```
---
##### Assertion library: v1.4
```javascript=
//assertion-library.js
...
function expect(actual) {
return {
toBe(expected) {
if (actual !== expected) {
throw new Error(`${actual} is not equal to ${expected}`)
}
}
}
}
```
---
##### Assertion library: v1.5
```javascript=
//assertion-library.js
...
// test sum
result = sum(3, 7)
expected = 10
expect(result).toBe(expected)
// test subtract
result = subtract(7, 3)
expected = 4
expect(result).toBe(expected)
...
```
---
##### Output

---
##### Extending Assertion library
```javascript=
//assertion-library.js
...
function expect(actual) {
return {
toBe(expected) {
if (actual !== expected) {
throw new Error(`${actual} is not equal to ${expected}`);
}
},
toBeGreaterThan(expected) {
if (actual <= expected) {
throw new Error(`${actual} is not greater than ${expected}`);
}
}
}
}
```
---
##### Improve Assertion Library 1.1
```javascript=
//assertion-library.js
...
// test sum
result = sum(3, 7)
expected = 10
expect(result).toBe(expected)
// this should fail
// test subtract
result = subtract(7, 3)
expected = 4
expect(result).toBe(expected
// this should also fail
...
```
---
##### Output (only 1 fail and code breaks)

---
##### Improve Assertion Library V1.2
```javascript=
//assertion-library.js
...
function test(title, callback) {
}
...
```
---
##### Improve Assertion Library V1.3
```javascript=
//assertion-library.js
...
function test(title, callback) {
try {
callback();
} catch (error) {
console.error(error);
}
}
...
```
---
##### Improve Assertion Library V1.4
```javascript=
//assertion-library.js
...
function test(title, callback) {
try {
callback();
console.log(`✓ ${title}`);
} catch (error) {
console.error(`✕ ${title}`);
console.error(error);
}
}
...
```
---
##### Improve Assertion Library V1.5
```javascript=
//assertion-library.js
...
// test sum
test("sum adds numbers", () => {
const result = sum(3, 7);
const expected = 10;
expect(result).toBe(expected);
});
// test subtract
test("subtract subtracts numbers", () => {
result = subtract(7, 3);
expected = 5;
expect(result).toBe(expected);
});
...
```
---
##### Output (shows all test result failed)

---
##### Improve Assertion Library V1.6
```javascript=
//assertion-library.js
...
// test sum
test("sum adds numbers", () => {
const result = sum(3, 7);
const expected = 10;
expect(result).toBe(expected); // this should fail
});
// test subtract
test("subtract subtracts numbers", () => {
result = subtract(7, 3);
expected = 4;
expect(result).toBe(expected); // this should pass
});
...
```
---
##### Output (shows all test results. 1 failed, 1 passed)

{"metaMigratedAt":"2023-06-16T13:37:54.900Z","metaMigratedFrom":"Content","title":"Untitled","breaks":true,"contributors":"[{\"id\":\"0bff8528-4948-4f28-beba-6673971ebc61\",\"add\":6882,\"del\":2610}]"}