From 33b48f794a4a8712f6460c8b335d7b9fec314d2e Mon Sep 17 00:00:00 2001 From: Peter Kofler Date: Tue, 21 Jan 2025 21:51:04 +0100 Subject: [PATCH] BacnkOCR pure ES6 version. --- .github/workflows/javascript.yml | 31 ++++++++++++ javascript/.gitignore | 11 +++++ javascript/jest.config.js | 4 ++ javascript/package.json | 12 +++++ javascript/src/ocr.js | 84 ++++++++++++++++++++++++++++++++ javascript/tests/ocr.spec.js | 63 ++++++++++++++++++++++++ 6 files changed, 205 insertions(+) create mode 100644 .github/workflows/javascript.yml create mode 100644 javascript/.gitignore create mode 100644 javascript/jest.config.js create mode 100644 javascript/package.json create mode 100644 javascript/src/ocr.js create mode 100644 javascript/tests/ocr.spec.js diff --git a/.github/workflows/javascript.yml b/.github/workflows/javascript.yml new file mode 100644 index 0000000..056b526 --- /dev/null +++ b/.github/workflows/javascript.yml @@ -0,0 +1,31 @@ +name: Test JavaScript Jest + +on: + push: + paths: + - 'javascript/**' + - '.github/workflows/javascript.yml' + pull_request: + paths: + - 'javascript/**' + - '.github/workflows/javascript.yml' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: 15.x + + - name: Set up dependencies + working-directory: javascript + run: npm install + + - name: Test + working-directory: javascript + run: npm test diff --git a/javascript/.gitignore b/javascript/.gitignore new file mode 100644 index 0000000..976a605 --- /dev/null +++ b/javascript/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +.idea + +# Node +node_modules/ +npm-debug.log +package-lock.json + +dist/ +coverage/ +.nyc_output/ diff --git a/javascript/jest.config.js b/javascript/jest.config.js new file mode 100644 index 0000000..83fa5eb --- /dev/null +++ b/javascript/jest.config.js @@ -0,0 +1,4 @@ +/** @type {import ('@jest/types').Config.InitialOptions} */ +module.exports = { + +} \ No newline at end of file diff --git a/javascript/package.json b/javascript/package.json new file mode 100644 index 0000000..5c1d6d9 --- /dev/null +++ b/javascript/package.json @@ -0,0 +1,12 @@ +{ + "name": "bank-ocr-refactoring-kata", + "version": "0.0.1", + "scripts": { + "test": "jest", + "test:coverage": "jest --coverage" + }, + "devDependencies": { + "@types/jest": "^27.0.0", + "jest": "^27.0.0" + } +} diff --git a/javascript/src/ocr.js b/javascript/src/ocr.js new file mode 100644 index 0000000..6339548 --- /dev/null +++ b/javascript/src/ocr.js @@ -0,0 +1,84 @@ +const NUMERALS = [ + [' _ ', + '| | ', + '|_| ', + ' '], + [' ', + ' | ', + ' | ', + ' '], + [' _ ', + ' _| ', + '|_ ', + ' '], + [' _ ', + ' _| ', + ' _| ', + ' '], + [' ', + '|_| ', + ' | ', + ' '], + [' _ ', + '|_ ', + ' _| ', + ' '], + [' _ ', + '|_ ', + '|_| ', + ' '], + [' _ ', + ' | ', + ' | ', + ' '], + [' _ ', + '|_| ', + '|_| ', + ' '], + [' _ ', + '|_| ', + ' _| ', + ' ']]; + +class Ocr { + + /** + * @param {string[]} lines + * @returns {string[]} + */ + static parse(lines) { + /** @type {string[]} */ + const result = []; + for (let i = 0; i < lines.length; i += 4) { + let work = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']; + for (let pos = 0; pos < 9; ++pos) { + work[pos] = '?'; + let got1 = false; + for (let numeral = 0; numeral <= 9; ++numeral) { + let ok = true; + for (let row = 0; row < 4; ++row) { + for (let col = 0; col < 4; ++col) { + if (NUMERALS[numeral][row][col] !== lines[i + row][4 * pos + col]) + ok = false; + } + } + if (ok) { + work[pos] = String.fromCharCode(numeral + '0'.charCodeAt(0)); + got1 = true; + break; + } + } + if (!got1) { + work[10] = 'I'; + work[11] = work[12] = 'L'; + } + } + result.push(work.join('')); + } + return result; + } +} + +module.exports = { + Ocr +}; diff --git a/javascript/tests/ocr.spec.js b/javascript/tests/ocr.spec.js new file mode 100644 index 0000000..3604512 --- /dev/null +++ b/javascript/tests/ocr.spec.js @@ -0,0 +1,63 @@ +const { Ocr } = require('../src/ocr'); + +describe('Ocr', () => { + + it('parses_one_record_with_888888888', () => { + expect(Ocr.parse([' _ _ _ _ _ _ _ _ _ ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + ' '])). + toEqual(['888888888 ']); + }); + + it('parses_two_records_with_888888888', () => { + expect(Ocr.parse([' _ _ _ _ _ _ _ _ _ ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + ' ', + ' _ _ _ _ _ _ _ _ _ ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + '|_| |_| |_| |_| |_| |_| |_| |_| |_| ', + ' '])). + toEqual(['888888888 ', + '888888888 ']); + }); + + it('parses_one_record_with_123456790', () => { + expect(Ocr.parse([' _ _ _ _ _ _ _ ', + ' | _| _| |_| |_ |_ | |_| | | ', + ' | |_ _| | _| |_| | _| |_| ', + ' '])). + toEqual(['123456790 ']); + }); + + it('parses_two_records', () => { + expect(Ocr.parse([' _ _ _ _ _ _ _ ', + ' | _| _| |_| |_ |_ | |_| | | ', + ' | |_ _| | _| |_| | _| |_| ', + ' ', + ' _ _ _ _ _ _ _ ', + '|_| |_| | |_| | |_| _| _| _| ', + ' _| | | |_| | | |_ |_ |_ ', + ' '])). + toEqual(['123456790 ', + '947874222 ']); + }); + + it('parses_illegal_digit', () => { + expect(Ocr.parse([' _ _ _ _ _ _ _ ', + ' | _| |_| _| |_ |_ | |_| | | ', + ' | |_ _ | _| |_| | _| |_| ', + ' '])). + toEqual(['12??56790 ILL']); + }); + + // it('checksum_fail_returns_ERR', () => { + // expect(Ocr.parse([' _ _ _ _ _ _ ', + // '|_ |_ |_| _| | | |_| |_| |_ ', + // '|_| |_| | _| | | | _| _| ', + // ' '])). + // toEqual(['664371495 ERR']); + // }); + +});