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.
Files changed (197) hide show
  1. package/dist/baseFactory.d.ts +12 -0
  2. package/dist/baseFactory.js +33 -0
  3. package/dist/constants/regexPatterns.d.ts +2 -0
  4. package/dist/constants/regexPatterns.js +9 -0
  5. package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.d.ts +4 -0
  6. package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.d.ts +4 -0
  7. package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.factory.js +2 -0
  8. package/dist/converters/numeric-systems/interfaces/INumericSystem.converter.js +2 -0
  9. package/dist/converters/numeric-systems/numericSystem.converter.d.ts +5 -0
  10. package/dist/converters/numeric-systems/numericSystem.converter.factory.d.ts +8 -0
  11. package/dist/converters/numeric-systems/numericSystem.converter.factory.js +17 -0
  12. package/dist/converters/numeric-systems/numericSystem.converter.js +17 -0
  13. package/dist/converters/numeric-systems/provider.d.ts +2 -0
  14. package/dist/converters/numeric-systems/provider.js +11 -0
  15. package/dist/converters/numeric-systems/services/binary/binary.converter.d.ts +5 -0
  16. package/dist/converters/numeric-systems/services/binary/binary.converter.js +16 -0
  17. package/dist/converters/numeric-systems/services/binary/binary.converter.test.d.ts +1 -0
  18. package/dist/converters/numeric-systems/services/binary/binary.converter.test.js +252 -0
  19. package/dist/converters/numeric-systems/services/decimal/decimal.converter.d.ts +5 -0
  20. package/dist/converters/numeric-systems/services/decimal/decimal.converter.js +16 -0
  21. package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.d.ts +1 -0
  22. package/dist/converters/numeric-systems/services/decimal/decimal.converter.test.js +199 -0
  23. package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.d.ts +5 -0
  24. package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.js +18 -0
  25. package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.d.ts +1 -0
  26. package/dist/converters/numeric-systems/services/hexadecimal/hexadecimal.converter.test.js +130 -0
  27. package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.d.ts +5 -0
  28. package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.js +15 -0
  29. package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.d.ts +1 -0
  30. package/dist/converters/numeric-systems/services/octadecimal/octadecimal.converter.test.js +151 -0
  31. package/dist/converters/numeric-systems/services/roman/roman.converter.d.ts +7 -0
  32. package/dist/converters/numeric-systems/services/roman/roman.converter.js +77 -0
  33. package/dist/converters/numeric-systems/services/roman/roman.converter.test.d.ts +1 -0
  34. package/dist/converters/numeric-systems/services/roman/roman.converter.test.js +105 -0
  35. package/dist/converters/serialization/interfaces/ISerialization.converter.d.ts +5 -0
  36. package/dist/converters/serialization/interfaces/ISerialization.converter.factory.d.ts +4 -0
  37. package/dist/converters/serialization/interfaces/ISerialization.converter.factory.js +2 -0
  38. package/dist/converters/serialization/interfaces/ISerialization.converter.js +2 -0
  39. package/dist/converters/serialization/interfaces/ISerializationOptions.d.ts +4 -0
  40. package/dist/converters/serialization/interfaces/ISerializationOptions.js +2 -0
  41. package/dist/converters/serialization/provider.d.ts +2 -0
  42. package/dist/converters/serialization/provider.js +7 -0
  43. package/dist/converters/serialization/serialization.converter.d.ts +6 -0
  44. package/dist/converters/serialization/serialization.converter.factory.d.ts +9 -0
  45. package/dist/converters/serialization/serialization.converter.factory.js +20 -0
  46. package/dist/converters/serialization/serialization.converter.js +17 -0
  47. package/dist/converters/serialization/services/csv/csv.converter.d.ts +6 -0
  48. package/dist/converters/serialization/services/csv/csv.converter.js +68 -0
  49. package/dist/converters/serialization/services/csv/csv.converter.test.d.ts +1 -0
  50. package/dist/converters/serialization/services/csv/csv.converter.test.js +295 -0
  51. package/dist/converters/serialization/services/json/json.converter.d.ts +5 -0
  52. package/dist/converters/serialization/services/json/json.converter.js +12 -0
  53. package/dist/converters/text-format/inteface/ITextFormatConverter.converter.d.ts +4 -0
  54. package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.d.ts +4 -0
  55. package/dist/converters/text-format/inteface/ITextFormatConverter.converter.factory.js +2 -0
  56. package/dist/converters/text-format/inteface/ITextFormatConverter.converter.js +2 -0
  57. package/dist/converters/text-format/provider.d.ts +2 -0
  58. package/dist/converters/text-format/provider.js +8 -0
  59. package/dist/converters/text-format/services/binary/binary-format.converter.d.ts +5 -0
  60. package/dist/converters/text-format/services/binary/binary-format.converter.js +40 -0
  61. package/dist/converters/text-format/services/binary/binary-format.converter.test.d.ts +1 -0
  62. package/dist/converters/text-format/services/binary/binary-format.converter.test.js +174 -0
  63. package/dist/converters/text-format/services/morse/morse-format.converter.d.ts +6 -0
  64. package/dist/converters/text-format/services/morse/morse-format.converter.js +85 -0
  65. package/dist/converters/text-format/services/morse/morse-format.converter.test.d.ts +1 -0
  66. package/dist/converters/text-format/services/morse/morse-format.converter.test.js +518 -0
  67. package/dist/converters/text-format/services/text/text-format.converter.d.ts +5 -0
  68. package/dist/converters/text-format/services/text/text-format.converter.js +12 -0
  69. package/dist/converters/text-format/textFormatConverter.converter.d.ts +5 -0
  70. package/dist/converters/text-format/textFormatConverter.converter.factory.d.ts +8 -0
  71. package/dist/converters/text-format/textFormatConverter.converter.factory.js +17 -0
  72. package/dist/converters/text-format/textFormatConverter.converter.js +17 -0
  73. package/dist/converters/unit-converter/converter-base.d.ts +19 -0
  74. package/dist/converters/unit-converter/converter-base.js +56 -0
  75. package/dist/converters/unit-converter/interfaces/IUnitConverter.d.ts +9 -0
  76. package/dist/converters/unit-converter/interfaces/IUnitConverter.js +2 -0
  77. package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.d.ts +4 -0
  78. package/dist/converters/unit-converter/interfaces/IUnitConverterFactory.js +2 -0
  79. package/dist/converters/unit-converter/models/unit.d.ts +7 -0
  80. package/dist/converters/unit-converter/models/unit.js +2 -0
  81. package/dist/converters/unit-converter/provider.d.ts +2 -0
  82. package/dist/converters/unit-converter/provider.js +16 -0
  83. package/dist/converters/unit-converter/services/angle/angle.converter.d.ts +4 -0
  84. package/dist/converters/unit-converter/services/angle/angle.converter.js +15 -0
  85. package/dist/converters/unit-converter/services/angle/angle.converter.test.d.ts +1 -0
  86. package/dist/converters/unit-converter/services/angle/angle.converter.test.js +112 -0
  87. package/dist/converters/unit-converter/services/area/area.converter.d.ts +4 -0
  88. package/dist/converters/unit-converter/services/area/area.converter.js +24 -0
  89. package/dist/converters/unit-converter/services/area/area.converter.test.d.ts +1 -0
  90. package/dist/converters/unit-converter/services/area/area.converter.test.js +439 -0
  91. package/dist/converters/unit-converter/services/data/data.converter.d.ts +4 -0
  92. package/dist/converters/unit-converter/services/data/data.converter.js +30 -0
  93. package/dist/converters/unit-converter/services/data/data.converter.test.d.ts +1 -0
  94. package/dist/converters/unit-converter/services/data/data.converter.test.js +209 -0
  95. package/dist/converters/unit-converter/services/energy/energy.converter.d.ts +4 -0
  96. package/dist/converters/unit-converter/services/energy/energy.converter.js +20 -0
  97. package/dist/converters/unit-converter/services/energy/energy.converter.test.d.ts +1 -0
  98. package/dist/converters/unit-converter/services/energy/energy.converter.test.js +154 -0
  99. package/dist/converters/unit-converter/services/length/length.converter.d.ts +4 -0
  100. package/dist/converters/unit-converter/services/length/length.converter.js +31 -0
  101. package/dist/converters/unit-converter/services/length/length.converter.test.d.ts +1 -0
  102. package/dist/converters/unit-converter/services/length/length.converter.test.js +186 -0
  103. package/dist/converters/unit-converter/services/power/power.converter.d.ts +4 -0
  104. package/dist/converters/unit-converter/services/power/power.converter.js +17 -0
  105. package/dist/converters/unit-converter/services/power/power.converter.test.d.ts +1 -0
  106. package/dist/converters/unit-converter/services/power/power.converter.test.js +223 -0
  107. package/dist/converters/unit-converter/services/pressure/pressure.converter.d.ts +4 -0
  108. package/dist/converters/unit-converter/services/pressure/pressure.converter.js +18 -0
  109. package/dist/converters/unit-converter/services/pressure/pressure.converter.test.d.ts +1 -0
  110. package/dist/converters/unit-converter/services/pressure/pressure.converter.test.js +107 -0
  111. package/dist/converters/unit-converter/services/speed/speed.converter.d.ts +4 -0
  112. package/dist/converters/unit-converter/services/speed/speed.converter.js +22 -0
  113. package/dist/converters/unit-converter/services/speed/speed.converter.test.d.ts +1 -0
  114. package/dist/converters/unit-converter/services/speed/speed.converter.test.js +257 -0
  115. package/dist/converters/unit-converter/services/temperature/temperature.converter.d.ts +7 -0
  116. package/dist/converters/unit-converter/services/temperature/temperature.converter.js +46 -0
  117. package/dist/converters/unit-converter/services/temperature/temperature.converter.test.d.ts +1 -0
  118. package/dist/converters/unit-converter/services/temperature/temperature.converter.test.js +279 -0
  119. package/dist/converters/unit-converter/services/time/time.converter.d.ts +4 -0
  120. package/dist/converters/unit-converter/services/time/time.converter.js +26 -0
  121. package/dist/converters/unit-converter/services/volume/volume.converter.d.ts +4 -0
  122. package/dist/converters/unit-converter/services/volume/volume.converter.js +39 -0
  123. package/dist/converters/unit-converter/services/volume/volume.converter.test.d.ts +1 -0
  124. package/dist/converters/unit-converter/services/volume/volume.converter.test.js +295 -0
  125. package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.d.ts +4 -0
  126. package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.js +29 -0
  127. package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.d.ts +1 -0
  128. package/dist/converters/unit-converter/services/weight-mass/weight-mass.converter.test.js +218 -0
  129. package/dist/converters/unit-converter/unit.converter.factory.d.ts +9 -0
  130. package/dist/converters/unit-converter/unit.converter.factory.js +20 -0
  131. package/dist/crypt.d.ts +0 -0
  132. package/dist/crypt.js +77 -0
  133. package/dist/documents/cnpj/cnpj.d.ts +14 -0
  134. package/dist/documents/cnpj/cnpj.formatter.d.ts +5 -0
  135. package/dist/documents/cnpj/cnpj.formatter.js +12 -0
  136. package/dist/documents/cnpj/cnpj.generator.d.ts +9 -0
  137. package/dist/documents/cnpj/cnpj.generator.js +43 -0
  138. package/dist/documents/cnpj/cnpj.js +47 -0
  139. package/dist/documents/cnpj/cnpj.validator.d.ts +11 -0
  140. package/dist/documents/cnpj/cnpj.validator.js +49 -0
  141. package/dist/documents/cnpj/tests/cnpj.formatter.test.d.ts +1 -0
  142. package/dist/documents/cnpj/tests/cnpj.formatter.test.js +62 -0
  143. package/dist/documents/cnpj/tests/cnpj.generator.test.d.ts +1 -0
  144. package/dist/documents/cnpj/tests/cnpj.generator.test.js +51 -0
  145. package/dist/documents/cnpj/tests/cnpj.test.d.ts +1 -0
  146. package/dist/documents/cnpj/tests/cnpj.test.js +162 -0
  147. package/dist/documents/cnpj/tests/cnpj.validator.test.d.ts +1 -0
  148. package/dist/documents/cnpj/tests/cnpj.validator.test.js +104 -0
  149. package/dist/documents/cpf/cpf.d.ts +14 -0
  150. package/dist/documents/cpf/cpf.formatter.d.ts +5 -0
  151. package/dist/documents/cpf/cpf.formatter.js +12 -0
  152. package/dist/documents/cpf/cpf.generator.d.ts +9 -0
  153. package/dist/documents/cpf/cpf.generator.js +40 -0
  154. package/dist/documents/cpf/cpf.js +50 -0
  155. package/dist/documents/cpf/cpf.validator.d.ts +11 -0
  156. package/dist/documents/cpf/cpf.validator.js +46 -0
  157. package/dist/documents/cpf/tests/cpf.formatter.test.d.ts +1 -0
  158. package/dist/documents/cpf/tests/cpf.formatter.test.js +71 -0
  159. package/dist/documents/cpf/tests/cpf.generator.test.d.ts +1 -0
  160. package/dist/documents/cpf/tests/cpf.generator.test.js +71 -0
  161. package/dist/documents/cpf/tests/cpf.test.d.ts +1 -0
  162. package/dist/documents/cpf/tests/cpf.test.js +151 -0
  163. package/dist/documents/cpf/tests/cpf.validator.test.d.ts +1 -0
  164. package/dist/documents/cpf/tests/cpf.validator.test.js +113 -0
  165. package/dist/documents/interfaces/formatter.interface.d.ts +4 -0
  166. package/dist/documents/interfaces/formatter.interface.js +2 -0
  167. package/dist/documents/interfaces/generator.interface.d.ts +3 -0
  168. package/dist/documents/interfaces/generator.interface.js +2 -0
  169. package/dist/documents/interfaces/validator.interface.d.ts +4 -0
  170. package/dist/documents/interfaces/validator.interface.js +2 -0
  171. package/dist/documents/models/validation-result.model.d.ts +4 -0
  172. package/dist/documents/models/validation-result.model.js +2 -0
  173. package/dist/enums/cryptProvider.d.ts +6 -0
  174. package/dist/enums/cryptProvider.js +10 -0
  175. package/dist/extensions/array.extensions.d.ts +6 -0
  176. package/dist/extensions/array.extensions.js +7 -0
  177. package/dist/extensions/boolean.extensions.d.ts +6 -0
  178. package/dist/extensions/boolean.extensions.js +5 -0
  179. package/dist/extensions/number.extensions.d.ts +11 -0
  180. package/dist/extensions/number.extensions.js +24 -0
  181. package/dist/extensions/string.extensions.d.ts +13 -0
  182. package/dist/extensions/string.extensions.js +28 -0
  183. package/dist/index.d.ts +22 -0
  184. package/dist/index.js +39 -0
  185. package/dist/interfaces/IFactory.d.ts +3 -0
  186. package/dist/interfaces/IFactory.js +2 -0
  187. package/dist/interfaces/IServiceCategory.d.ts +3 -0
  188. package/dist/interfaces/IServiceCategory.js +2 -0
  189. package/dist/interfaces/validator.d.ts +5 -0
  190. package/dist/interfaces/validator.js +2 -0
  191. package/dist/interfaces/value.d.ts +3 -0
  192. package/dist/interfaces/value.js +2 -0
  193. package/dist/interfaces/valueGenerator.d.ts +4 -0
  194. package/dist/interfaces/valueGenerator.js +2 -0
  195. package/dist/random.d.ts +12 -0
  196. package/dist/random.js +29 -0
  197. 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,5 @@
1
+ import { INumericSystemConverter } from "../../interfaces/INumericSystem.converter";
2
+ export declare class HexadecimalSystemConverter implements INumericSystemConverter {
3
+ fromDecimal(value: number): string;
4
+ toDecimal(value: string): number;
5
+ }
@@ -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,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,5 @@
1
+ import { INumericSystemConverter } from "../../interfaces/INumericSystem.converter";
2
+ export declare class OctadecimalSystemConverter implements INumericSystemConverter {
3
+ fromDecimal(value: number): string;
4
+ toDecimal(value: string): number;
5
+ }
@@ -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,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;