chore: merge Fix/742 migrate doctest to jest (#749)

* Remove QuickSelect doctest

There are more Jest test cases already.

* Remove AverageMedian doctest

Already migrated to jest

* Migrate doctest for BinaryExponentiationRecursive.js

(also remove inline "main" test method)

* Migrate doctest for EulersTotient.js

(also remove inline "main" test method)

* Migrate doctest for PrimeFactors.js

(also remove inline "main" test method)

* Migrate doctest for BogoSort.js

Re-write prototype-polluting helper methods, too.

(also remove inline test driver code)

* Migrate doctest for BeadSort.js

(also remove inline test driver code)

* Migrate doctest for BucketSort.js

(also remove inline test driver code)

* Migrate doctest for CocktailShakerSort.js

(also remove inline test driver code)

* Migrate doctest for MergeSort.js

(also remove inline test driver code)

* Migrate doctest for QuickSort.js

(also remove inline test driver code)

* Migrate doctest for ReverseString.js

(also remove inline test driver code)

* Migrate doctest for ReverseString.js

* Migrate doctest for ValidateEmail.js

* Migrate doctest for ConwaysGameOfLife.js

(remove the animate code, too)

* Remove TernarySearch doctest

Already migrated to jest

* Migrate doctest for BubbleSort.js

(also remove inline test driver code)

* Remove doctest from CI and from dependencies

relates to #742
fixes #586

* Migrate doctest for RgbHsvConversion.js

* Add --fix option to "standard" npm script

* Migrate doctest for BreadthFirstSearch.js

(also remove inline test driver code)

* Migrate doctest for BreadthFirstShortestPath.js

(also remove inline test driver code)

* Migrate doctest for EulerMethod.js

(also remove inline test driver code)

Move manual test-code for plotting stuff in the browser in a distinct file, too. Those "*.manual-test.js" files are excluded from the UpdateDirectory.mjs script, as well.

* Migrate doctest for Mandelbrot.js

(also remove inline test driver code & moved manual drawing test into a *.manual-test.js)

* Migrate doctest for FloodFill.js

* Migrate doctest for KochSnowflake.js

(also move manual drawing test into a *.manual-test.js)

* Update npm lockfile

* Update README and COMMITTING with a few bits & bobs regarding testing & code quality
This commit is contained in:
Roland Hummel
2021-10-07 09:03:38 +02:00
committed by GitHub
parent 6eeb989930
commit b13b12e88c
53 changed files with 882 additions and 13514 deletions

View File

@ -1,28 +1,19 @@
/*
In mathematics and computational science, the Euler method (also called forward Euler method) is a first-order numerical procedure for solving ordinary differential equations (ODEs) with a given initial value. It is the most basic explicit method for numerical integration of ordinary differential equations. The method proceeds in a series of steps. At each step the y-value is calculated by evaluating the differential equation at the previous step, multiplying the result with the step-size and adding it to the last y-value: y_n+1 = y_n + stepSize * f(x_n, y_n).
(description adapted from https://en.wikipedia.org/wiki/Euler_method )
(see also: https://www.geeksforgeeks.org/euler-method-solving-differential-equation/ )
*/
/*
Doctests
> eulerStep(0, 0.1, 0, function(x, y){return x})
0
> eulerStep(2, 1, 1, function(x, y){return x * x})
5
> eulerFull(0, 3, 1, 0, function(x, y){return x})
[{"x": 0, "y": 0}, {"x": 1, "y": 0}, {"x": 2, "y": 1}, {"x": 3, "y": 3}]
> eulerFull(3, 4, 0.5, 1, function(x, y){return x * x})
[{"x": 3, "y": 1}, {"x": 3.5, "y": 5.5}, {"x": 4, "y": 11.625}]
*/
function eulerStep (xCurrent, stepSize, yCurrent, differentialEquation) {
/**
* In mathematics and computational science, the Euler method (also called forward Euler method) is a first-order
* numerical procedure for solving ordinary differential equations (ODEs) with a given initial value. It is the most
* basic explicit method for numerical integration of ordinary differential equations. The method proceeds in a series
* of steps. At each step the y-value is calculated by evaluating the differential equation at the previous step,
* multiplying the result with the step-size and adding it to the last y-value: y_n+1 = y_n + stepSize * f(x_n, y_n).
*
* (description adapted from https://en.wikipedia.org/wiki/Euler_method)
* @see https://www.geeksforgeeks.org/euler-method-solving-differential-equation/
*/
export function eulerStep (xCurrent, stepSize, yCurrent, differentialEquation) {
// calculates the next y-value based on the current value of x, y and the stepSize
const yNext = yCurrent + stepSize * differentialEquation(xCurrent, yCurrent)
return yNext
return yCurrent + stepSize * differentialEquation(xCurrent, yCurrent)
}
function eulerFull (xStart, xEnd, stepSize, yStart, differentialEquation) {
export function eulerFull (xStart, xEnd, stepSize, yStart, differentialEquation) {
// loops through all the steps until xEnd is reached, adds a point for each step and then returns all the points
const points = [{ x: xStart, y: yStart }]
let yCurrent = yStart
@ -37,72 +28,3 @@ function eulerFull (xStart, xEnd, stepSize, yStart, differentialEquation) {
return points
}
function plotLine (label, points, width, height) {
// utility function to plot the results
// container needed to control the size of the canvas
const container = document.createElement('div')
container.style.width = width + 'px'
container.style.height = height + 'px'
document.body.append(container)
// the canvas for plotting
const canvas = document.createElement('canvas')
container.append(canvas)
// Chart-class from chartjs
const chart = new Chart(canvas, { // eslint-disable-line
type: 'scatter',
data: {
datasets: [{
label: label,
data: points,
showLine: true,
fill: false,
tension: 0,
borderColor: 'black'
}]
},
options: {
maintainAspectRatio: false,
responsive: true
}
})
}
function exampleEquation1 (x, y) {
return x
}
// example from https://en.wikipedia.org/wiki/Euler_method
function exampleEquation2 (x, y) {
return y
}
// example from https://www.geeksforgeeks.org/euler-method-solving-differential-equation/
function exampleEquation3 (x, y) {
return x + y + x * y
}
const points1 = eulerFull(0, 4, 0.1, 0, exampleEquation1)
const points2 = eulerFull(0, 4, 0.1, 1, exampleEquation2)
const points3 = eulerFull(0, 0.1, 0.025, 1, exampleEquation3)
console.log(points1)
console.log(points2)
console.log(points3)
// plot the results if the script is executed in a browser with a window-object
if (typeof window !== 'undefined') {
const script = document.createElement('script')
// using chartjs
script.src = 'https://www.chartjs.org/dist/2.9.4/Chart.min.js'
script.onload = function () {
plotLine('example 1: dy/dx = x', points1, 600, 400)
plotLine('example 2: dy/dx = y', points2, 600, 400)
plotLine('example 3: dy/dx = x + y + x * y', points3, 600, 400)
}
document.body.append(script)
}