devtoolz-library 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseFactory.d.ts +12 -0
- package/dist/baseFactory.js +33 -0
- package/dist/constants/regexPatterns.d.ts +2 -0
- package/dist/constants/regexPatterns.js +9 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.d.ts +4 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.d.ts +4 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.js +2 -0
- package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.js +2 -0
- package/dist/converters/numeric-systems/numericSystem.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/numericSystem.converter.factory.d.ts +8 -0
- package/dist/converters/numeric-systems/numericSystem.converter.factory.js +17 -0
- package/dist/converters/numeric-systems/numericSystem.converter.js +17 -0
- package/dist/converters/numeric-systems/provider.d.ts +2 -0
- package/dist/converters/numeric-systems/provider.js +11 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.js +16 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/binary/binary.converter.test.js +252 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.js +16 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.js +199 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.js +18 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.js +130 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.d.ts +5 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.js +15 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.js +151 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.d.ts +7 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.js +77 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.test.d.ts +1 -0
- package/dist/converters/numeric-systems/services/roman/roman.converter.test.js +105 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.d.ts +5 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.factory.d.ts +4 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.factory.js +2 -0
- package/dist/converters/serialization/interfaces/ISerialization.converter.js +2 -0
- package/dist/converters/serialization/interfaces/ISerializationOptions.d.ts +4 -0
- package/dist/converters/serialization/interfaces/ISerializationOptions.js +2 -0
- package/dist/converters/serialization/provider.d.ts +2 -0
- package/dist/converters/serialization/provider.js +7 -0
- package/dist/converters/serialization/serialization.converter.d.ts +6 -0
- package/dist/converters/serialization/serialization.converter.factory.d.ts +9 -0
- package/dist/converters/serialization/serialization.converter.factory.js +20 -0
- package/dist/converters/serialization/serialization.converter.js +17 -0
- package/dist/converters/serialization/services/csv/csv.converter.d.ts +6 -0
- package/dist/converters/serialization/services/csv/csv.converter.js +68 -0
- package/dist/converters/serialization/services/csv/csv.converter.test.d.ts +1 -0
- package/dist/converters/serialization/services/csv/csv.converter.test.js +295 -0
- package/dist/converters/serialization/services/json/json.converter.d.ts +5 -0
- package/dist/converters/serialization/services/json/json.converter.js +12 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.d.ts +4 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.d.ts +4 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.js +2 -0
- package/dist/converters/text-format/inteface/ITextFormatConverter.converter.js +2 -0
- package/dist/converters/text-format/provider.d.ts +2 -0
- package/dist/converters/text-format/provider.js +8 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.d.ts +5 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.js +40 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.test.d.ts +1 -0
- package/dist/converters/text-format/services/binary/binary-format.converter.test.js +174 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.d.ts +6 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.js +85 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.test.d.ts +1 -0
- package/dist/converters/text-format/services/morse/morse-format.converter.test.js +518 -0
- package/dist/converters/text-format/services/text/text-format.converter.d.ts +5 -0
- package/dist/converters/text-format/services/text/text-format.converter.js +12 -0
- package/dist/converters/text-format/textFormatConverter.converter.d.ts +5 -0
- package/dist/converters/text-format/textFormatConverter.converter.factory.d.ts +8 -0
- package/dist/converters/text-format/textFormatConverter.converter.factory.js +17 -0
- package/dist/converters/text-format/textFormatConverter.converter.js +17 -0
- package/dist/converters/unit-converter/converter-base.d.ts +19 -0
- package/dist/converters/unit-converter/converter-base.js +56 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverter.d.ts +9 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverter.js +2 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.d.ts +4 -0
- package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.js +2 -0
- package/dist/converters/unit-converter/models/unit.d.ts +7 -0
- package/dist/converters/unit-converter/models/unit.js +2 -0
- package/dist/converters/unit-converter/provider.d.ts +2 -0
- package/dist/converters/unit-converter/provider.js +16 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.js +15 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/angle/angle.converter.test.js +112 -0
- package/dist/converters/unit-converter/services/area/area.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/area/area.converter.js +24 -0
- package/dist/converters/unit-converter/services/area/area.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/area/area.converter.test.js +439 -0
- package/dist/converters/unit-converter/services/data/data.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/data/data.converter.js +30 -0
- package/dist/converters/unit-converter/services/data/data.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/data/data.converter.test.js +209 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.js +20 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/energy/energy.converter.test.js +154 -0
- package/dist/converters/unit-converter/services/length/length.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/length/length.converter.js +31 -0
- package/dist/converters/unit-converter/services/length/length.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/length/length.converter.test.js +186 -0
- package/dist/converters/unit-converter/services/power/power.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/power/power.converter.js +17 -0
- package/dist/converters/unit-converter/services/power/power.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/power/power.converter.test.js +223 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.js +18 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/pressure/pressure.converter.test.js +107 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.js +22 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/speed/speed.converter.test.js +257 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.d.ts +7 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.js +46 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/temperature/temperature.converter.test.js +279 -0
- package/dist/converters/unit-converter/services/time/time.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/time/time.converter.js +26 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.js +39 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/volume/volume.converter.test.js +295 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.d.ts +4 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.js +29 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.d.ts +1 -0
- package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.js +218 -0
- package/dist/converters/unit-converter/unit.converter.factory.d.ts +9 -0
- package/dist/converters/unit-converter/unit.converter.factory.js +20 -0
- package/dist/crypt.d.ts +0 -0
- package/dist/crypt.js +77 -0
- package/dist/documents/cnpj/cnpj.d.ts +14 -0
- package/dist/documents/cnpj/cnpj.formatter.d.ts +5 -0
- package/dist/documents/cnpj/cnpj.formatter.js +12 -0
- package/dist/documents/cnpj/cnpj.generator.d.ts +9 -0
- package/dist/documents/cnpj/cnpj.generator.js +43 -0
- package/dist/documents/cnpj/cnpj.js +47 -0
- package/dist/documents/cnpj/cnpj.validator.d.ts +11 -0
- package/dist/documents/cnpj/cnpj.validator.js +49 -0
- package/dist/documents/cnpj/tests/cnpj.formatter.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.formatter.test.js +62 -0
- package/dist/documents/cnpj/tests/cnpj.generator.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.generator.test.js +51 -0
- package/dist/documents/cnpj/tests/cnpj.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.test.js +162 -0
- package/dist/documents/cnpj/tests/cnpj.validator.test.d.ts +1 -0
- package/dist/documents/cnpj/tests/cnpj.validator.test.js +104 -0
- package/dist/documents/cpf/cpf.d.ts +14 -0
- package/dist/documents/cpf/cpf.formatter.d.ts +5 -0
- package/dist/documents/cpf/cpf.formatter.js +12 -0
- package/dist/documents/cpf/cpf.generator.d.ts +9 -0
- package/dist/documents/cpf/cpf.generator.js +40 -0
- package/dist/documents/cpf/cpf.js +50 -0
- package/dist/documents/cpf/cpf.validator.d.ts +11 -0
- package/dist/documents/cpf/cpf.validator.js +46 -0
- package/dist/documents/cpf/tests/cpf.formatter.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.formatter.test.js +71 -0
- package/dist/documents/cpf/tests/cpf.generator.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.generator.test.js +71 -0
- package/dist/documents/cpf/tests/cpf.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.test.js +151 -0
- package/dist/documents/cpf/tests/cpf.validator.test.d.ts +1 -0
- package/dist/documents/cpf/tests/cpf.validator.test.js +113 -0
- package/dist/documents/interfaces/formatter.interface.d.ts +4 -0
- package/dist/documents/interfaces/formatter.interface.js +2 -0
- package/dist/documents/interfaces/generator.interface.d.ts +3 -0
- package/dist/documents/interfaces/generator.interface.js +2 -0
- package/dist/documents/interfaces/validator.interface.d.ts +4 -0
- package/dist/documents/interfaces/validator.interface.js +2 -0
- package/dist/documents/models/validation-result.model.d.ts +4 -0
- package/dist/documents/models/validation-result.model.js +2 -0
- package/dist/enums/cryptProvider.d.ts +6 -0
- package/dist/enums/cryptProvider.js +10 -0
- package/dist/extensions/array.extensions.d.ts +6 -0
- package/dist/extensions/array.extensions.js +7 -0
- package/dist/extensions/boolean.extensions.d.ts +6 -0
- package/dist/extensions/boolean.extensions.js +5 -0
- package/dist/extensions/number.extensions.d.ts +11 -0
- package/dist/extensions/number.extensions.js +24 -0
- package/dist/extensions/string.extensions.d.ts +13 -0
- package/dist/extensions/string.extensions.js +28 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +39 -0
- package/dist/interfaces/IFactory.d.ts +3 -0
- package/dist/interfaces/IFactory.js +2 -0
- package/dist/interfaces/IServiceCategory.d.ts +3 -0
- package/dist/interfaces/IServiceCategory.js +2 -0
- package/dist/interfaces/validator.d.ts +5 -0
- package/dist/interfaces/validator.js +2 -0
- package/dist/interfaces/value.d.ts +3 -0
- package/dist/interfaces/value.js +2 -0
- package/dist/interfaces/valueGenerator.d.ts +4 -0
- package/dist/interfaces/valueGenerator.js +2 -0
- package/dist/random.d.ts +12 -0
- package/dist/random.js +29 -0
- package/package.json +25 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const decimal_converter_1 = require("./decimal.converter");
|
|
4
|
+
describe('DecimalSystemConverter', () => {
|
|
5
|
+
let converter;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
converter = new decimal_converter_1.DecimalSystemConverter();
|
|
8
|
+
});
|
|
9
|
+
describe('fromDecimal', () => {
|
|
10
|
+
it('deve converter zero para string', () => {
|
|
11
|
+
expect(converter.fromDecimal(0)).toBe('0');
|
|
12
|
+
});
|
|
13
|
+
it('deve converter números positivos para string', () => {
|
|
14
|
+
expect(converter.fromDecimal(1)).toBe('1');
|
|
15
|
+
expect(converter.fromDecimal(42)).toBe('42');
|
|
16
|
+
expect(converter.fromDecimal(123)).toBe('123');
|
|
17
|
+
expect(converter.fromDecimal(9999)).toBe('9999');
|
|
18
|
+
});
|
|
19
|
+
it('deve converter números negativos para string', () => {
|
|
20
|
+
expect(converter.fromDecimal(-1)).toBe('-1');
|
|
21
|
+
expect(converter.fromDecimal(-42)).toBe('-42');
|
|
22
|
+
expect(converter.fromDecimal(-123)).toBe('-123');
|
|
23
|
+
expect(converter.fromDecimal(-9999)).toBe('-9999');
|
|
24
|
+
});
|
|
25
|
+
it('deve converter números decimais para string', () => {
|
|
26
|
+
expect(converter.fromDecimal(3.14)).toBe('3.14');
|
|
27
|
+
expect(converter.fromDecimal(0.5)).toBe('0.5');
|
|
28
|
+
expect(converter.fromDecimal(-2.7)).toBe('-2.7');
|
|
29
|
+
expect(converter.fromDecimal(123.456)).toBe('123.456');
|
|
30
|
+
});
|
|
31
|
+
it('deve lidar com números muito pequenos', () => {
|
|
32
|
+
expect(converter.fromDecimal(0.000001)).toBe('0.000001');
|
|
33
|
+
expect(converter.fromDecimal(Number.MIN_VALUE)).toBe('5e-324');
|
|
34
|
+
});
|
|
35
|
+
it('deve lidar com números muito grandes', () => {
|
|
36
|
+
expect(converter.fromDecimal(1000000)).toBe('1000000');
|
|
37
|
+
expect(converter.fromDecimal(Number.MAX_SAFE_INTEGER)).toBe('9007199254740991');
|
|
38
|
+
expect(converter.fromDecimal(Number.MAX_VALUE)).toBe('1.7976931348623157e+308');
|
|
39
|
+
});
|
|
40
|
+
it('deve lidar com notação científica', () => {
|
|
41
|
+
expect(converter.fromDecimal(1e6)).toBe('1000000');
|
|
42
|
+
expect(converter.fromDecimal(1e-6)).toBe('0.000001');
|
|
43
|
+
expect(converter.fromDecimal(2.5e3)).toBe('2500');
|
|
44
|
+
});
|
|
45
|
+
it('deve lidar com valores especiais', () => {
|
|
46
|
+
expect(converter.fromDecimal(Infinity)).toBe('Infinity');
|
|
47
|
+
expect(converter.fromDecimal(-Infinity)).toBe('-Infinity');
|
|
48
|
+
expect(converter.fromDecimal(NaN)).toBe('NaN');
|
|
49
|
+
});
|
|
50
|
+
it('deve manter precisão de ponto flutuante', () => {
|
|
51
|
+
expect(converter.fromDecimal(0.1 + 0.2)).toBe('0.30000000000000004');
|
|
52
|
+
expect(converter.fromDecimal(9007199254740992)).toBe('9007199254740992');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('toDecimal', () => {
|
|
56
|
+
it('deve converter string zero para número', () => {
|
|
57
|
+
expect(converter.toDecimal('0')).toBe(0);
|
|
58
|
+
});
|
|
59
|
+
it('deve converter strings numéricas positivas', () => {
|
|
60
|
+
expect(converter.toDecimal('1')).toBe(1);
|
|
61
|
+
expect(converter.toDecimal('42')).toBe(42);
|
|
62
|
+
expect(converter.toDecimal('123')).toBe(123);
|
|
63
|
+
expect(converter.toDecimal('9999')).toBe(9999);
|
|
64
|
+
});
|
|
65
|
+
it('deve converter strings numéricas negativas', () => {
|
|
66
|
+
expect(converter.toDecimal('-1')).toBe(-1);
|
|
67
|
+
expect(converter.toDecimal('-42')).toBe(-42);
|
|
68
|
+
expect(converter.toDecimal('-123')).toBe(-123);
|
|
69
|
+
expect(converter.toDecimal('-9999')).toBe(-9999);
|
|
70
|
+
});
|
|
71
|
+
it('deve ignorar decimais ao usar parseInt', () => {
|
|
72
|
+
expect(converter.toDecimal('3.14')).toBe(3);
|
|
73
|
+
expect(converter.toDecimal('42.99')).toBe(42);
|
|
74
|
+
expect(converter.toDecimal('-5.7')).toBe(-5);
|
|
75
|
+
expect(converter.toDecimal('0.9')).toBe(0);
|
|
76
|
+
});
|
|
77
|
+
it('deve lidar com strings com espaços em branco', () => {
|
|
78
|
+
expect(converter.toDecimal(' 42 ')).toBe(42);
|
|
79
|
+
expect(converter.toDecimal('\t123\n')).toBe(123);
|
|
80
|
+
expect(converter.toDecimal(' -456 ')).toBe(-456);
|
|
81
|
+
});
|
|
82
|
+
it('deve parar na primeira parte numérica válida', () => {
|
|
83
|
+
expect(converter.toDecimal('42abc')).toBe(42);
|
|
84
|
+
expect(converter.toDecimal('123xyz789')).toBe(123);
|
|
85
|
+
expect(converter.toDecimal('-456def')).toBe(-456);
|
|
86
|
+
expect(converter.toDecimal('100px')).toBe(100);
|
|
87
|
+
});
|
|
88
|
+
it('deve retornar NaN para strings inválidas', () => {
|
|
89
|
+
expect(converter.toDecimal('abc')).toBeNaN();
|
|
90
|
+
expect(converter.toDecimal('xyz123')).toBeNaN();
|
|
91
|
+
expect(converter.toDecimal('')).toBe(0);
|
|
92
|
+
expect(converter.toDecimal(' ')).toBeNaN();
|
|
93
|
+
expect(converter.toDecimal('invalid')).toBeNaN();
|
|
94
|
+
});
|
|
95
|
+
it('deve lidar com strings numéricas grandes', () => {
|
|
96
|
+
expect(converter.toDecimal('1000000')).toBe(1000000);
|
|
97
|
+
expect(converter.toDecimal('9007199254740991')).toBe(9007199254740991);
|
|
98
|
+
});
|
|
99
|
+
it('deve lidar com zeros à esquerda', () => {
|
|
100
|
+
expect(converter.toDecimal('007')).toBe(7);
|
|
101
|
+
expect(converter.toDecimal('00042')).toBe(42);
|
|
102
|
+
expect(converter.toDecimal('-0123')).toBe(-123);
|
|
103
|
+
});
|
|
104
|
+
it('deve lidar com sinal de mais explícito', () => {
|
|
105
|
+
expect(converter.toDecimal('+42')).toBe(42);
|
|
106
|
+
expect(converter.toDecimal('+123')).toBe(123);
|
|
107
|
+
});
|
|
108
|
+
it('deve lidar com notação científica em strings', () => {
|
|
109
|
+
expect(converter.toDecimal('1e6')).toBe(1);
|
|
110
|
+
expect(converter.toDecimal('2.5e3')).toBe(2);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('conversões bidirecionais', () => {
|
|
114
|
+
it('deve manter consistência para números inteiros', () => {
|
|
115
|
+
const testNumbers = [0, 1, -1, 42, -42, 123, -123, 9999, -9999];
|
|
116
|
+
testNumbers.forEach(num => {
|
|
117
|
+
const str = converter.fromDecimal(num);
|
|
118
|
+
const backToNumber = converter.toDecimal(str);
|
|
119
|
+
expect(backToNumber).toBe(num);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
it('deve perder precisão decimal devido ao parseInt', () => {
|
|
123
|
+
const decimalNumbers = [3.14, -2.7, 123.456];
|
|
124
|
+
decimalNumbers.forEach(num => {
|
|
125
|
+
const str = converter.fromDecimal(num);
|
|
126
|
+
const backToNumber = converter.toDecimal(str);
|
|
127
|
+
expect(backToNumber).toBe(Math.floor(Math.abs(num)) * Math.sign(num));
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it('deve manter consistência com strings numéricas inteiras', () => {
|
|
131
|
+
const testStrings = ['0', '1', '-1', '42', '-42', '123', '-123'];
|
|
132
|
+
testStrings.forEach(str => {
|
|
133
|
+
const num = converter.toDecimal(str);
|
|
134
|
+
const backToString = converter.fromDecimal(num);
|
|
135
|
+
expect(backToString).toBe(str);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('casos extremos', () => {
|
|
140
|
+
it('deve lidar com Number.MAX_SAFE_INTEGER', () => {
|
|
141
|
+
const maxSafe = Number.MAX_SAFE_INTEGER;
|
|
142
|
+
const str = converter.fromDecimal(maxSafe);
|
|
143
|
+
const back = converter.toDecimal(str);
|
|
144
|
+
expect(back).toBe(maxSafe);
|
|
145
|
+
});
|
|
146
|
+
it('deve lidar com Number.MIN_SAFE_INTEGER', () => {
|
|
147
|
+
const minSafe = Number.MIN_SAFE_INTEGER;
|
|
148
|
+
const str = converter.fromDecimal(minSafe);
|
|
149
|
+
const back = converter.toDecimal(str);
|
|
150
|
+
expect(back).toBe(minSafe);
|
|
151
|
+
});
|
|
152
|
+
it('deve lidar com valores que excedem precisão de parseInt', () => {
|
|
153
|
+
const largeNumber = 9007199254740993; // Maior que MAX_SAFE_INTEGER
|
|
154
|
+
const str = converter.fromDecimal(largeNumber);
|
|
155
|
+
expect(str).toBe('9007199254740992'); // JavaScript limita precisão
|
|
156
|
+
});
|
|
157
|
+
it('deve lidar com strings muito longas', () => {
|
|
158
|
+
const longNumberString = '123456789012345678901234567890';
|
|
159
|
+
const result = converter.toDecimal(longNumberString);
|
|
160
|
+
expect(result).toBe(123456789012345680000000000000); // Perda de precisão
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('comportamentos específicos do parseInt', () => {
|
|
164
|
+
it('deve usar base 10 por padrão', () => {
|
|
165
|
+
expect(converter.toDecimal('010')).toBe(10); // Não interpreta como octal
|
|
166
|
+
expect(converter.toDecimal('0x10')).toBe(0); // Para na primeira parte válida
|
|
167
|
+
});
|
|
168
|
+
it('deve parar no primeiro caractere inválido', () => {
|
|
169
|
+
expect(converter.toDecimal('123.456.789')).toBe(123);
|
|
170
|
+
expect(converter.toDecimal('12a34')).toBe(12);
|
|
171
|
+
expect(converter.toDecimal('45 67')).toBe(45);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe('implementação da interface', () => {
|
|
175
|
+
it('deve implementar corretamente INumericSystemConverter', () => {
|
|
176
|
+
expect(typeof converter.fromDecimal).toBe('function');
|
|
177
|
+
expect(typeof converter.toDecimal).toBe('function');
|
|
178
|
+
});
|
|
179
|
+
it('fromDecimal deve retornar string', () => {
|
|
180
|
+
const result = converter.fromDecimal(42);
|
|
181
|
+
expect(typeof result).toBe('string');
|
|
182
|
+
});
|
|
183
|
+
it('toDecimal deve retornar number', () => {
|
|
184
|
+
const result = converter.toDecimal('42');
|
|
185
|
+
expect(typeof result).toBe('number');
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('edge cases importantes', () => {
|
|
189
|
+
it('deve alertar sobre limitações do parseInt com decimais', () => {
|
|
190
|
+
// Teste documentando comportamento que pode ser inesperado
|
|
191
|
+
expect(converter.toDecimal('3.99')).toBe(3);
|
|
192
|
+
expect(converter.toDecimal('-4.99')).toBe(-4);
|
|
193
|
+
});
|
|
194
|
+
it('deve documentar comportamento com strings mistas', () => {
|
|
195
|
+
expect(converter.toDecimal('12px')).toBe(12);
|
|
196
|
+
expect(converter.toDecimal('width: 100')).toBeNaN();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HexadecimalSystemConverter = void 0;
|
|
4
|
+
class HexadecimalSystemConverter {
|
|
5
|
+
fromDecimal(value) {
|
|
6
|
+
return value.toString(16);
|
|
7
|
+
}
|
|
8
|
+
toDecimal(value) {
|
|
9
|
+
if (value === '')
|
|
10
|
+
return 0;
|
|
11
|
+
if (value === 'NaN')
|
|
12
|
+
return 0;
|
|
13
|
+
if (value === 'Infinity')
|
|
14
|
+
return 0;
|
|
15
|
+
return parseInt(value, 16);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.HexadecimalSystemConverter = HexadecimalSystemConverter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const hexadecimal_converter_1 = require("./hexadecimal.converter");
|
|
4
|
+
describe('HexadecimalSystemConverter', () => {
|
|
5
|
+
let converter;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
converter = new hexadecimal_converter_1.HexadecimalSystemConverter();
|
|
8
|
+
});
|
|
9
|
+
describe('fromDecimal', () => {
|
|
10
|
+
it('deve converter zero para hexadecimal', () => {
|
|
11
|
+
expect(converter.fromDecimal(0)).toBe('0');
|
|
12
|
+
});
|
|
13
|
+
it('deve converter números positivos básicos para hexadecimal', () => {
|
|
14
|
+
expect(converter.fromDecimal(1)).toBe('1');
|
|
15
|
+
expect(converter.fromDecimal(9)).toBe('9');
|
|
16
|
+
expect(converter.fromDecimal(10)).toBe('a');
|
|
17
|
+
expect(converter.fromDecimal(15)).toBe('f');
|
|
18
|
+
expect(converter.fromDecimal(16)).toBe('10');
|
|
19
|
+
});
|
|
20
|
+
it('deve converter números maiores para hexadecimal', () => {
|
|
21
|
+
expect(converter.fromDecimal(255)).toBe('ff');
|
|
22
|
+
expect(converter.fromDecimal(256)).toBe('100');
|
|
23
|
+
expect(converter.fromDecimal(4095)).toBe('fff');
|
|
24
|
+
expect(converter.fromDecimal(65535)).toBe('ffff');
|
|
25
|
+
});
|
|
26
|
+
it('deve converter números negativos para hexadecimal', () => {
|
|
27
|
+
expect(converter.fromDecimal(-1)).toBe('-1');
|
|
28
|
+
expect(converter.fromDecimal(-10)).toBe('-a');
|
|
29
|
+
expect(converter.fromDecimal(-255)).toBe('-ff');
|
|
30
|
+
});
|
|
31
|
+
it('deve converter números decimais (com ponto flutuante)', () => {
|
|
32
|
+
expect(converter.fromDecimal(10.5)).toBe('a.8');
|
|
33
|
+
expect(converter.fromDecimal(15.9)).toBe('f.e666666666668');
|
|
34
|
+
});
|
|
35
|
+
it('deve lidar com números muito grandes', () => {
|
|
36
|
+
expect(converter.fromDecimal(1048576)).toBe('100000');
|
|
37
|
+
expect(converter.fromDecimal(Number.MAX_SAFE_INTEGER)).toBe('1fffffffffffff');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('toDecimal', () => {
|
|
41
|
+
it('deve converter zero hexadecimal para decimal', () => {
|
|
42
|
+
expect(converter.toDecimal('0')).toBe(0);
|
|
43
|
+
});
|
|
44
|
+
it('deve converter dígitos hexadecimais básicos para decimal', () => {
|
|
45
|
+
expect(converter.toDecimal('1')).toBe(1);
|
|
46
|
+
expect(converter.toDecimal('9')).toBe(9);
|
|
47
|
+
expect(converter.toDecimal('a')).toBe(10);
|
|
48
|
+
expect(converter.toDecimal('A')).toBe(10);
|
|
49
|
+
expect(converter.toDecimal('f')).toBe(15);
|
|
50
|
+
expect(converter.toDecimal('F')).toBe(15);
|
|
51
|
+
});
|
|
52
|
+
it('deve converter números hexadecimais de múltiplos dígitos', () => {
|
|
53
|
+
expect(converter.toDecimal('10')).toBe(16);
|
|
54
|
+
expect(converter.toDecimal('ff')).toBe(255);
|
|
55
|
+
expect(converter.toDecimal('FF')).toBe(255);
|
|
56
|
+
expect(converter.toDecimal('100')).toBe(256);
|
|
57
|
+
expect(converter.toDecimal('fff')).toBe(4095);
|
|
58
|
+
expect(converter.toDecimal('ffff')).toBe(65535);
|
|
59
|
+
});
|
|
60
|
+
it('deve ser case-insensitive', () => {
|
|
61
|
+
expect(converter.toDecimal('abc')).toBe(2748);
|
|
62
|
+
expect(converter.toDecimal('ABC')).toBe(2748);
|
|
63
|
+
expect(converter.toDecimal('AbC')).toBe(2748);
|
|
64
|
+
});
|
|
65
|
+
it('deve lidar com strings vazias e inválidas', () => {
|
|
66
|
+
expect(converter.toDecimal('')).toBe(0);
|
|
67
|
+
expect(converter.toDecimal('invalid')).toBeNaN();
|
|
68
|
+
expect(converter.toDecimal('xyz')).toBeNaN();
|
|
69
|
+
expect(converter.toDecimal('g')).toBeNaN();
|
|
70
|
+
});
|
|
71
|
+
it('deve converter números hexadecimais grandes', () => {
|
|
72
|
+
expect(converter.toDecimal('100000')).toBe(1048576);
|
|
73
|
+
expect(converter.toDecimal('1fffffffffffff')).toBe(Number.MAX_SAFE_INTEGER);
|
|
74
|
+
});
|
|
75
|
+
it('deve lidar com espaços em branco', () => {
|
|
76
|
+
expect(converter.toDecimal(' ff ')).toBe(255);
|
|
77
|
+
expect(converter.toDecimal('\t10\n')).toBe(16);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('conversões bidirecionais', () => {
|
|
81
|
+
it('deve manter consistência em conversões de ida e volta', () => {
|
|
82
|
+
const testNumbers = [0, 1, 10, 15, 16, 255, 256, 4095, 65535];
|
|
83
|
+
testNumbers.forEach(num => {
|
|
84
|
+
const hex = converter.fromDecimal(num);
|
|
85
|
+
const backToDecimal = converter.toDecimal(hex);
|
|
86
|
+
expect(backToDecimal).toBe(num);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
it('deve manter consistência com strings hexadecimais válidas', () => {
|
|
90
|
+
const testHexValues = ['0', '1', 'a', 'f', '10', 'ff', '100', 'fff', 'ffff'];
|
|
91
|
+
testHexValues.forEach(hex => {
|
|
92
|
+
const decimal = converter.toDecimal(hex);
|
|
93
|
+
const backToHex = converter.fromDecimal(decimal);
|
|
94
|
+
expect(backToHex).toBe(hex.toLowerCase());
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('casos extremos', () => {
|
|
99
|
+
it('deve lidar com Number.MAX_VALUE', () => {
|
|
100
|
+
const result = converter.fromDecimal(Number.MAX_VALUE);
|
|
101
|
+
expect(typeof result).toBe('string');
|
|
102
|
+
expect(result.length).toBeGreaterThan(0);
|
|
103
|
+
});
|
|
104
|
+
it('deve lidar com Number.MIN_VALUE', () => {
|
|
105
|
+
const result = converter.fromDecimal(Number.MIN_VALUE);
|
|
106
|
+
expect(result).toBe('0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004');
|
|
107
|
+
});
|
|
108
|
+
it('deve lidar com Infinity', () => {
|
|
109
|
+
expect(converter.fromDecimal(Infinity)).toBe('Infinity');
|
|
110
|
+
expect(converter.fromDecimal(-Infinity)).toBe('-Infinity');
|
|
111
|
+
});
|
|
112
|
+
it('deve lidar com NaN', () => {
|
|
113
|
+
expect(converter.fromDecimal(NaN)).toBe('NaN');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('implementação da interface', () => {
|
|
117
|
+
it('deve implementar corretamente INumericSystemConverter', () => {
|
|
118
|
+
expect(typeof converter.fromDecimal).toBe('function');
|
|
119
|
+
expect(typeof converter.toDecimal).toBe('function');
|
|
120
|
+
});
|
|
121
|
+
it('fromDecimal deve retornar string', () => {
|
|
122
|
+
const result = converter.fromDecimal(42);
|
|
123
|
+
expect(typeof result).toBe('string');
|
|
124
|
+
});
|
|
125
|
+
it('toDecimal deve retornar number', () => {
|
|
126
|
+
const result = converter.toDecimal('2a');
|
|
127
|
+
expect(typeof result).toBe('number');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OctadecimalSystemConverter = void 0;
|
|
4
|
+
class OctadecimalSystemConverter {
|
|
5
|
+
fromDecimal(value) {
|
|
6
|
+
return value.toString(8);
|
|
7
|
+
}
|
|
8
|
+
toDecimal(value) {
|
|
9
|
+
if (value === '')
|
|
10
|
+
return 0; // parseInt behavior for empty string
|
|
11
|
+
const result = parseInt(value, 8);
|
|
12
|
+
return isNaN(result) ? 0 : result; // Retorna 0 se
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.OctadecimalSystemConverter = OctadecimalSystemConverter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const octadecimal_converter_1 = require("./octadecimal.converter");
|
|
4
|
+
describe('OctadecimalSystemConverter', () => {
|
|
5
|
+
let converter;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
converter = new octadecimal_converter_1.OctadecimalSystemConverter();
|
|
8
|
+
});
|
|
9
|
+
describe('fromDecimal', () => {
|
|
10
|
+
it('should convert decimal 0 to octal "0"', () => {
|
|
11
|
+
const result = converter.fromDecimal(0);
|
|
12
|
+
expect(result).toBe('0');
|
|
13
|
+
});
|
|
14
|
+
it('should convert decimal 8 to octal "10"', () => {
|
|
15
|
+
const result = converter.fromDecimal(8);
|
|
16
|
+
expect(result).toBe('10');
|
|
17
|
+
});
|
|
18
|
+
it('should convert decimal 64 to octal "100"', () => {
|
|
19
|
+
const result = converter.fromDecimal(64);
|
|
20
|
+
expect(result).toBe('100');
|
|
21
|
+
});
|
|
22
|
+
it('should convert decimal 255 to octal "377"', () => {
|
|
23
|
+
const result = converter.fromDecimal(255);
|
|
24
|
+
expect(result).toBe('377');
|
|
25
|
+
});
|
|
26
|
+
it('should convert small decimal numbers correctly', () => {
|
|
27
|
+
expect(converter.fromDecimal(1)).toBe('1');
|
|
28
|
+
expect(converter.fromDecimal(2)).toBe('2');
|
|
29
|
+
expect(converter.fromDecimal(3)).toBe('3');
|
|
30
|
+
expect(converter.fromDecimal(4)).toBe('4');
|
|
31
|
+
expect(converter.fromDecimal(5)).toBe('5');
|
|
32
|
+
expect(converter.fromDecimal(6)).toBe('6');
|
|
33
|
+
expect(converter.fromDecimal(7)).toBe('7');
|
|
34
|
+
});
|
|
35
|
+
it('should convert larger decimal numbers correctly', () => {
|
|
36
|
+
expect(converter.fromDecimal(100)).toBe('144');
|
|
37
|
+
expect(converter.fromDecimal(512)).toBe('1000');
|
|
38
|
+
expect(converter.fromDecimal(1000)).toBe('1750');
|
|
39
|
+
});
|
|
40
|
+
it('should handle negative numbers', () => {
|
|
41
|
+
const result = converter.fromDecimal(-8);
|
|
42
|
+
expect(result).toBe('-10');
|
|
43
|
+
});
|
|
44
|
+
it('should handle floating point numbers by truncating', () => {
|
|
45
|
+
const result = converter.fromDecimal(8.7);
|
|
46
|
+
expect(result).toBe('10.5463146314631463');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('toDecimal', () => {
|
|
50
|
+
it('should convert octal "0" to decimal 0', () => {
|
|
51
|
+
const result = converter.toDecimal('0');
|
|
52
|
+
expect(result).toBe(0);
|
|
53
|
+
});
|
|
54
|
+
it('should convert octal "10" to decimal 8', () => {
|
|
55
|
+
const result = converter.toDecimal('10');
|
|
56
|
+
expect(result).toBe(8);
|
|
57
|
+
});
|
|
58
|
+
it('should convert octal "100" to decimal 64', () => {
|
|
59
|
+
const result = converter.toDecimal('100');
|
|
60
|
+
expect(result).toBe(64);
|
|
61
|
+
});
|
|
62
|
+
it('should convert octal "377" to decimal 255', () => {
|
|
63
|
+
const result = converter.toDecimal('377');
|
|
64
|
+
expect(result).toBe(255);
|
|
65
|
+
});
|
|
66
|
+
it('should convert single digit octal numbers correctly', () => {
|
|
67
|
+
expect(converter.toDecimal('1')).toBe(1);
|
|
68
|
+
expect(converter.toDecimal('2')).toBe(2);
|
|
69
|
+
expect(converter.toDecimal('3')).toBe(3);
|
|
70
|
+
expect(converter.toDecimal('4')).toBe(4);
|
|
71
|
+
expect(converter.toDecimal('5')).toBe(5);
|
|
72
|
+
expect(converter.toDecimal('6')).toBe(6);
|
|
73
|
+
expect(converter.toDecimal('7')).toBe(7);
|
|
74
|
+
});
|
|
75
|
+
it('should convert larger octal numbers correctly', () => {
|
|
76
|
+
expect(converter.toDecimal('144')).toBe(100);
|
|
77
|
+
expect(converter.toDecimal('1000')).toBe(512);
|
|
78
|
+
expect(converter.toDecimal('1750')).toBe(1000);
|
|
79
|
+
});
|
|
80
|
+
it('should handle negative octal numbers', () => {
|
|
81
|
+
const result = converter.toDecimal('-10');
|
|
82
|
+
expect(result).toBe(-8);
|
|
83
|
+
});
|
|
84
|
+
it('should return NaN for invalid octal strings', () => {
|
|
85
|
+
expect(converter.toDecimal('8')).toBe(0);
|
|
86
|
+
expect(converter.toDecimal('9')).toBe(0);
|
|
87
|
+
expect(converter.toDecimal('abc')).toBe(0);
|
|
88
|
+
expect(converter.toDecimal('')).toBe(0); // parseInt behavior
|
|
89
|
+
});
|
|
90
|
+
it('should handle strings with leading zeros', () => {
|
|
91
|
+
expect(converter.toDecimal('010')).toBe(8);
|
|
92
|
+
expect(converter.toDecimal('0100')).toBe(64);
|
|
93
|
+
});
|
|
94
|
+
it('should handle whitespace by ignoring leading/trailing spaces', () => {
|
|
95
|
+
expect(converter.toDecimal(' 10 ')).toBe(8);
|
|
96
|
+
expect(converter.toDecimal(' 100 ')).toBe(64);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('bidirectional conversion', () => {
|
|
100
|
+
it('should maintain consistency in bidirectional conversion', () => {
|
|
101
|
+
const testValues = [0, 1, 7, 8, 15, 64, 100, 255, 512, 1000];
|
|
102
|
+
testValues.forEach(value => {
|
|
103
|
+
const octal = converter.fromDecimal(value);
|
|
104
|
+
const backToDecimal = converter.toDecimal(octal);
|
|
105
|
+
expect(backToDecimal).toBe(value);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('should maintain consistency for negative numbers', () => {
|
|
109
|
+
const testValues = [-1, -8, -64, -100];
|
|
110
|
+
testValues.forEach(value => {
|
|
111
|
+
const octal = converter.fromDecimal(value);
|
|
112
|
+
const backToDecimal = converter.toDecimal(octal);
|
|
113
|
+
expect(backToDecimal).toBe(value);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('interface compliance', () => {
|
|
118
|
+
it('should implement INumericSystemConverter interface', () => {
|
|
119
|
+
expect(converter.fromDecimal).toBeDefined();
|
|
120
|
+
expect(converter.toDecimal).toBeDefined();
|
|
121
|
+
expect(typeof converter.fromDecimal).toBe('function');
|
|
122
|
+
expect(typeof converter.toDecimal).toBe('function');
|
|
123
|
+
});
|
|
124
|
+
it('should return string from fromDecimal', () => {
|
|
125
|
+
const result = converter.fromDecimal(8);
|
|
126
|
+
expect(typeof result).toBe('string');
|
|
127
|
+
});
|
|
128
|
+
it('should return number from toDecimal', () => {
|
|
129
|
+
const result = converter.toDecimal('10');
|
|
130
|
+
expect(typeof result).toBe('number');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('edge cases', () => {
|
|
134
|
+
it('should handle maximum safe integer', () => {
|
|
135
|
+
const maxSafe = Number.MAX_SAFE_INTEGER;
|
|
136
|
+
const octal = converter.fromDecimal(maxSafe);
|
|
137
|
+
const backToDecimal = converter.toDecimal(octal);
|
|
138
|
+
expect(backToDecimal).toBe(maxSafe);
|
|
139
|
+
});
|
|
140
|
+
it('should handle minimum safe integer', () => {
|
|
141
|
+
const minSafe = Number.MIN_SAFE_INTEGER;
|
|
142
|
+
const octal = converter.fromDecimal(minSafe);
|
|
143
|
+
const backToDecimal = converter.toDecimal(octal);
|
|
144
|
+
expect(backToDecimal).toBe(minSafe);
|
|
145
|
+
});
|
|
146
|
+
it('should handle zero correctly', () => {
|
|
147
|
+
expect(converter.fromDecimal(0)).toBe('0');
|
|
148
|
+
expect(converter.toDecimal('0')).toBe(0);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { INumericSystemConverter } from "../../interfaces/INumericSystem.converter";
|
|
2
|
+
export declare class RomanSystemConverter implements INumericSystemConverter {
|
|
3
|
+
private readonly ROMAN_NUMBERS;
|
|
4
|
+
private isValidRoman;
|
|
5
|
+
fromDecimal(value: number): string;
|
|
6
|
+
toDecimal(value: string): number;
|
|
7
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RomanSystemConverter = void 0;
|
|
4
|
+
class RomanSystemConverter {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.ROMAN_NUMBERS = [
|
|
7
|
+
{ symbol: 'M', value: 1000, },
|
|
8
|
+
{ symbol: 'CM', value: 900 },
|
|
9
|
+
{ symbol: 'D', value: 500 },
|
|
10
|
+
{ symbol: 'CD', value: 400 },
|
|
11
|
+
{ symbol: 'C', value: 100 },
|
|
12
|
+
{ symbol: 'XC', value: 90 },
|
|
13
|
+
{ symbol: 'L', value: 50 },
|
|
14
|
+
{ symbol: 'XL', value: 40 },
|
|
15
|
+
{ symbol: 'X', value: 10 },
|
|
16
|
+
{ symbol: 'IX', value: 9 },
|
|
17
|
+
{ symbol: 'V', value: 5 },
|
|
18
|
+
{ symbol: 'IV', value: 4 },
|
|
19
|
+
{ symbol: 'I', value: 1 },
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
isValidRoman(roman) {
|
|
23
|
+
// Regex para validar formato básico de números romanos
|
|
24
|
+
const romanRegex = /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/;
|
|
25
|
+
return romanRegex.test(roman);
|
|
26
|
+
}
|
|
27
|
+
fromDecimal(value) {
|
|
28
|
+
if (!Number.isInteger(value) || value < 1 || value > 3999) {
|
|
29
|
+
throw new Error('Número deve ser um inteiro entre 1 e 3999');
|
|
30
|
+
}
|
|
31
|
+
let result = '';
|
|
32
|
+
let remaining = value;
|
|
33
|
+
for (const romanNumber of this.ROMAN_NUMBERS) {
|
|
34
|
+
const count = Math.floor(remaining / romanNumber.value);
|
|
35
|
+
if (count > 0) {
|
|
36
|
+
result += romanNumber.symbol.repeat(count);
|
|
37
|
+
remaining -= romanNumber.value * count;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
toDecimal(value) {
|
|
43
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
44
|
+
throw new Error('Entrada deve ser uma string não vazia');
|
|
45
|
+
}
|
|
46
|
+
const normalizedRoman = value.toUpperCase().trim();
|
|
47
|
+
if (!this.isValidRoman(normalizedRoman)) {
|
|
48
|
+
throw new Error('Formato de número romano inválido');
|
|
49
|
+
}
|
|
50
|
+
let result = 0;
|
|
51
|
+
let i = 0;
|
|
52
|
+
while (i < normalizedRoman.length) {
|
|
53
|
+
// Verifica primeiro por símbolos de dois caracteres (IV, IX, XL, etc.)
|
|
54
|
+
if (i + 1 < normalizedRoman.length) {
|
|
55
|
+
const twoChar = normalizedRoman.substring(i, i + 2);
|
|
56
|
+
const twoCharValue = this.ROMAN_NUMBERS.find(rn => rn.symbol === twoChar);
|
|
57
|
+
if (twoCharValue) {
|
|
58
|
+
result += twoCharValue.value;
|
|
59
|
+
i += 2;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Símbolos de um caractere
|
|
64
|
+
const oneChar = normalizedRoman[i];
|
|
65
|
+
const oneCharValue = this.ROMAN_NUMBERS.find(rn => rn.symbol === oneChar);
|
|
66
|
+
if (oneCharValue) {
|
|
67
|
+
result += oneCharValue.value;
|
|
68
|
+
i += 1;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new Error(`Caractere romano inválido: ${oneChar}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.RomanSystemConverter = RomanSystemConverter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|