Files
JavaScript/Dynamic-Programming/tests/MaxProductOfThree.test.js
Roland Hummel 86d333ee94 feat: Test running overhaul, switch to Prettier & reformat everything (#1407)
* chore: Switch to Node 20 + Vitest

* chore: migrate to vitest mock functions

* chore: code style (switch to prettier)

* test: re-enable long-running test

Seems the switch to Node 20 and Vitest has vastly improved the code's and / or the test's runtime!

see #1193

* chore: code style

* chore: fix failing tests

* Updated Documentation in README.md

* Update contribution guidelines to state usage of Prettier

* fix: set prettier printWidth back to 80

* chore: apply updated code style automatically

* fix: set prettier line endings to lf again

* chore: apply updated code style automatically

---------

Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
2023-10-04 02:38:19 +05:30

79 lines
2.7 KiB
JavaScript

import { maxProductOfThree } from '../MaxProductOfThree'
describe('MaxProductOfThree', () => {
it('expects to throw error for array with only 2 numbers', () => {
expect(() => {
maxProductOfThree([1, 3])
}).toThrow('Triplet cannot exist with the given array')
})
it('expects to return 300 as the maximum product', () => {
expect(maxProductOfThree([10, 6, 5, 3, 1, -10])).toBe(300)
})
it('expects to return 300 as the maximum product', () => {
expect(maxProductOfThree([10, -6, 5, 3, 1, -10])).toBe(600)
})
})
// Tests using random arrays of size 3 to 5, with values rangin from -4 to 4
// The output is compared to a slower function that calculates all possible products of 3 numbers in the array and returns the largest one
describe('MaxProductOfThree, random arrays of size 3 to 5', () => {
// Slower function that operates in O(n^3), where n is the length of the input array.
// Calculates all possible products of 3 numbers in the array and returns the largest
function completeMaxThree(array) {
let maximumProduct = null
for (let i = 0; i < array.length - 2; i++) {
for (let j = i + 1; j < array.length - 1; j++) {
for (let k = j + 1; k < array.length; k++) {
const currentProduct = array[i] * array[j] * array[k]
if (maximumProduct === null || currentProduct > maximumProduct) {
maximumProduct = currentProduct
}
}
}
}
return maximumProduct
}
// Set up consts for the tests
const maxValue = 4
const minValue = -4
const maxLength = 5
const minLength = 3
const numberOfRandomTests = 5000
// Run each test
for (let i = 0; i < numberOfRandomTests; i++) {
const arr = []
// Randomize the length of the array in the current test
const length = Math.floor(
Math.random() * (maxLength - minLength) + minLength
)
// Fill the array with random values in the specified range
for (let j = 0; j < length + 1; j++) {
arr.push(Math.floor(Math.random() * (maxValue - minValue) + minValue))
}
// Calculate the actual max product, slow but completely
const expectedProduct = completeMaxThree(arr)
// Set up the expectation
it(
'Expect the array ' +
arr.toString() +
' to return the maximum three product of ' +
expectedProduct,
() => {
// Calculate the max three product using the function being tested
const actualProduct = maxProductOfThree(arr)
// Was unable to use expect().toBe(), since it sometimes compared 0 to -0, and that would not pass
// At the same time, standardjs forbid me from checking for === -0 to convert to 0
expect(actualProduct === expectedProduct).toBeTruthy()
}
)
}
})