feat: Implement Levenshtein with tests

This commit is contained in:
Alexander Polynomdivision 2018-09-14 16:43:57 +02:00
parent 91b6d2a955
commit 6e4e127518
5 changed files with 3410 additions and 30 deletions

3317
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "jest",
"start": "parcel src/index.html --public-url '/app/'" "start": "parcel src/index.html --public-url '/app/'"
}, },
"author": "", "author": "",
@ -17,10 +17,27 @@
"react-router-dom": "^4.3.1" "react-router-dom": "^4.3.1"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^23.3.2",
"html-webpack-plugin": "3.2.0", "html-webpack-plugin": "3.2.0",
"jest": "^23.6.0",
"parcel-bundler": "^1.9.7",
"ts-jest": "^23.1.4",
"typescript": "^2.9.2", "typescript": "^2.9.2",
"webpack": "4.17.1", "webpack": "4.17.1",
"webpack-cli": "3.1.0", "webpack-cli": "3.1.0"
"parcel-bundler": "^1.9.7" },
"jest": {
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
]
} }
} }

View File

@ -0,0 +1,16 @@
import { lev, levW } from "../";
test("lev(abc, abd) == 1", () => {
expect(lev("abc", "abd", 3, 3)).toBe(1);
expect(levW("abc", "abd")).toBe(1);
});
test("lev(abc, abcd) == 1", () => {
expect(lev("abc", "abcd", 3, 4)).toBe(1);
expect(levW("abc", "abcd")).toBe(1);
});
test("lev(abcd, bcd) == 1", () => {
expect(lev("abcd", "bcd", 4, 3)).toBe(1);
expect(levW("abcd", "bcd")).toBe(1);
});

View File

@ -0,0 +1,30 @@
export function one(a: string, b: string, i: number, j: number) {
if (a[i] === b[j]) {
return 0;
}
return 1;
}
// Computes the difference between the strings a and b.
// @a, b: The strings to compare
// @i, j: From where to compare (a_i and b_j)
// @ret : The distance in insertions, deletions and changes
export function lev(a: string, b: string, i: number, j: number) {
if (Math.min(i, j) === 0) {
return Math.max(i, j);
} else {
return Math.min(
lev(a, b, i - 1, j) + 1,
lev(a, b, i, j - 1) + 1,
lev(a, b, i - 1, j - 1) + one(a, b, i, j)
);
}
};
// Computes the difference between the strings a and b.
// @a, b: The strings to compare
// @ret : The distance in insertions, deletions and changes
export function levW(a: string, b: string) {
return lev(a, b, a.length, b.length);
}

View File

@ -1,29 +1,29 @@
{ {
"compilerOptions": { "compilerOptions": {
"outDir": "build/dist", "outDir": "build/dist",
"module": "commonjs", "module": "commonjs",
"target": "es6", "target": "es6",
"lib": ["es6", "dom"], "lib": ["es6", "dom"],
"sourceMap": true, "sourceMap": true,
"allowJs": true, "allowJs": true,
"jsx": "react", "jsx": "react",
"moduleResolution": "node", "moduleResolution": "node",
"rootDir": "src", "rootDir": "src",
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"noImplicitReturns": true, "noImplicitReturns": true,
"noImplicitThis": true, "noImplicitThis": true,
"noImplicitAny": true, "noImplicitAny": true,
"strictNullChecks": true, "strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true, "suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true "noUnusedLocals": true,
}, },
"exclude": [ "exclude": [
"node_modules", "node_modules",
"build", "build",
"scripts", "scripts",
"acceptance-tests", "acceptance-tests",
"webpack", "webpack",
"**/__test__/", "**/__test__/",
"src/setupTests.ts" "src/setupTests.ts"
] ]
} }