Skip to content

Commit 2ebcc80

Browse files
committed
refactor: enforce code robustness
1 parent 5ffcabc commit 2ebcc80

File tree

8 files changed

+39
-11
lines changed

8 files changed

+39
-11
lines changed

β€Žhello.analβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ† πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ† πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ† πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ† πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†πŸ‘πŸ†

β€Žhello.anusβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello

β€Žlib/constants.jsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export const COMPILE = 'compile';
44
export const ANALLIFY = 'anallify';
55
export const STRINGIFY = 'stringify';
66
export const ANAL_CHARACTERS = 'πŸ‘πŸ†';
7+
export const GRAMMAR = `${ANAL_CHARACTERS} `;

β€Žlib/dictionary.jsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export const ERROR = {
22
fileNotFound: 'File not found.',
33
missingArgument: 'Missing argument.',
44
notString: 'Only strings are accepted',
5+
notAcceptedByGrammar: 'There are some characters not accepted by grammar.',
56
};
67

78
export const SUCCESS = {

β€Žlib/regexp.jsβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { ANAL_CHARACTERS, GRAMMAR } from './constants.js';
2+
3+
export const matcher = new RegExp(`^[${GRAMMAR}]+$`, 'u');
4+
export const sequence = new RegExp(`${ANAL_CHARACTERS}`, 'g');

β€Žlib/std.jsβ€Ž

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import fs from 'node:fs';
33
import { checker } from './utils.js';
44
import { ERROR, SUCCESS } from './dictionary.js';
55
import { ANAL_CHARACTERS } from './constants.js';
6+
import { matcher, sequence } from './regexp.js';
67

78
export function anallify(string) {
89
if (!checker(string)) {
@@ -34,38 +35,49 @@ export function stringify(anal) {
3435
throw new Error(ERROR.missingArgument);
3536
}
3637

38+
if (!matcher.test(anal)) {
39+
throw new Error(ERROR.notAcceptedByGrammar);
40+
}
41+
3742
let string = '';
3843
const fragments = anal.split(' ');
39-
const rule = new RegExp(`${ANAL_CHARACTERS}`, 'g');
4044

4145
for (let index = 0; index < fragments.length; index += 1) {
4246
const fragment = fragments[index];
43-
const character = String.fromCharCode(((fragment.match(rule) || []).length));
47+
const character = String.fromCharCode(((fragment.match(sequence)).length));
4448
string = string.concat(character);
4549
}
4650

4751
return string;
4852
}
4953

5054
export function run(file) {
55+
let contents = null;
56+
5157
try {
52-
const contents = fs.readFileSync(file, { encoding: 'utf-8' });
53-
return stringify(contents);
58+
contents = fs.readFileSync(file, { encoding: 'utf-8' });
5459
} catch (error) {
5560
throw new Error(ERROR.fileNotFound);
5661
}
62+
63+
return stringify(contents);
5764
}
5865

5966
export function compile(file) {
67+
let contents = null;
68+
const fileOptions = { encoding: 'utf-8' };
69+
6070
try {
61-
const contents = fs.readFileSync(file, { encoding: 'utf-8' });
62-
let filename = file.split('.');
63-
filename = filename.filter((element, index) => index < filename.length - 1);
64-
filename = filename.join('.');
65-
fs.writeFileSync(`${filename}.anal`, anallify(contents), { encoding: 'utf-8' });
66-
process.stdout.write(`${SUCCESS.compileSuccess}`);
67-
return true;
71+
contents = fs.readFileSync(file, fileOptions);
6872
} catch (error) {
6973
throw new Error(ERROR.fileNotFound);
7074
}
75+
76+
let filename = file.split('.');
77+
filename = filename.filter((element, index) => index < filename.length - 1);
78+
filename = filename.join('.');
79+
80+
fs.writeFileSync(`${filename}.anal`, anallify(contents), fileOptions);
81+
process.stdout.write(`${SUCCESS.compileSuccess}`);
82+
return true;
7183
}

β€Žtests/seeds.jsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export const NUMERIC_INPUT = 1;
22
export const EMPTY_STRING_INPUT = '';
3+
export const NOT_ACCEPTED_INPUT = 'πŸ‘πŸ† a';
34

45
export const STRINGIFY_CORRECT_OUTPUT = 'B';
56
export const STRINGIFY_WRONG_OUTPUT = 'πŸ‘πŸ†πŸ‘πŸ†';

β€Žtests/std.test.jsβ€Ž

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
RUN_WRONG_OUTPUT,
1010
ANAL_FILE_LOCATION,
1111
EMPTY_STRING_INPUT,
12+
NOT_ACCEPTED_INPUT,
1213
RUN_CORRECT_OUTPUT,
1314
ANALLIFY_WRONG_OUTPUT,
1415
STRINGIFY_WRONG_OUTPUT,
@@ -60,6 +61,12 @@ describe('Stringify', () => {
6061
Error(ERROR.missingArgument),
6162
);
6263
});
64+
65+
test('Throw error if there are grammar-refused characters', () => {
66+
expect(() => stringify(NOT_ACCEPTED_INPUT)).toThrowError(
67+
Error(ERROR.notAcceptedByGrammar),
68+
);
69+
});
6370
});
6471

6572
describe('Run', () => {

0 commit comments

Comments
Β (0)