@designliquido/foles 0.9.4 → 0.9.6

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 (133) hide show
  1. package/execucao.js +9 -2
  2. package/execucao.js.map +1 -1
  3. package/fontes/avaliador-sintatico/avaliador-sintatico-reverso.js +288 -211
  4. package/fontes/avaliador-sintatico/avaliador-sintatico-reverso.js.map +1 -1
  5. package/fontes/avaliador-sintatico/avaliador-sintatico.js +87 -0
  6. package/fontes/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  7. package/fontes/estruturas/estrutura.d.ts +1 -0
  8. package/fontes/estruturas/estrutura.js.map +1 -1
  9. package/fontes/foles.js +5 -4
  10. package/fontes/foles.js.map +1 -1
  11. package/fontes/lexador/palavras-reservadas/css.d.ts +21 -13
  12. package/fontes/lexador/palavras-reservadas/css.js +21 -13
  13. package/fontes/lexador/palavras-reservadas/css.js.map +1 -1
  14. package/fontes/lexador/palavras-reservadas/foles.d.ts +10 -0
  15. package/fontes/lexador/palavras-reservadas/foles.js +10 -0
  16. package/fontes/lexador/palavras-reservadas/foles.js.map +1 -1
  17. package/fontes/modificadores/borda-mascara.js +3 -3
  18. package/fontes/modificadores/caminho-recorte.d.ts +9 -0
  19. package/fontes/modificadores/caminho-recorte.js +39 -0
  20. package/fontes/modificadores/caminho-recorte.js.map +1 -0
  21. package/fontes/modificadores/conteudo.js +2 -2
  22. package/fontes/modificadores/conteudo.js.map +1 -1
  23. package/fontes/modificadores/dicionario/dicionario-modificadores.js +2 -0
  24. package/fontes/modificadores/dicionario/dicionario-modificadores.js.map +1 -1
  25. package/fontes/modificadores/dicionario/dicionario-reverso-modificadores.js +16 -0
  26. package/fontes/modificadores/dicionario/dicionario-reverso-modificadores.js.map +1 -1
  27. package/fontes/modificadores/imagem-borda.d.ts +3 -1
  28. package/fontes/modificadores/imagem-borda.js +1 -1
  29. package/fontes/modificadores/imagem-borda.js.map +1 -1
  30. package/fontes/modificadores/imagem-fundo.d.ts +2 -1
  31. package/fontes/modificadores/imagem-fundo.js.map +1 -1
  32. package/fontes/modificadores/limite-forma-imagem.js +1 -1
  33. package/fontes/modificadores/sombra-caixa.d.ts +3 -1
  34. package/fontes/modificadores/sombra-caixa.js +1 -1
  35. package/fontes/modificadores/sombra-caixa.js.map +1 -1
  36. package/fontes/modificadores/superclasse/modificador.d.ts +2 -1
  37. package/fontes/modificadores/superclasse/modificador.js.map +1 -1
  38. package/fontes/modificadores/superclasse/seletor-modificador.d.ts +2 -1
  39. package/fontes/modificadores/superclasse/seletor-modificador.js.map +1 -1
  40. package/fontes/modificadores/transformar.js +1 -0
  41. package/fontes/modificadores/transformar.js.map +1 -1
  42. package/fontes/modificadores/validacoes/atribuicao-abreviada.d.ts +3 -1
  43. package/fontes/modificadores/validacoes/atribuicao-abreviada.js +18 -6
  44. package/fontes/modificadores/validacoes/atribuicao-abreviada.js.map +1 -1
  45. package/fontes/modificadores/validacoes/comum.d.ts +3 -1
  46. package/fontes/modificadores/validacoes/comum.js +15 -3
  47. package/fontes/modificadores/validacoes/comum.js.map +1 -1
  48. package/fontes/modificadores/validacoes/condicao-extra.d.ts +3 -1
  49. package/fontes/modificadores/validacoes/condicao-extra.js +16 -4
  50. package/fontes/modificadores/validacoes/condicao-extra.js.map +1 -1
  51. package/fontes/modificadores/validacoes/cor.d.ts +2 -1
  52. package/fontes/modificadores/validacoes/cor.js +17 -6
  53. package/fontes/modificadores/validacoes/cor.js.map +1 -1
  54. package/fontes/modificadores/validacoes/fonte.d.ts +3 -1
  55. package/fontes/modificadores/validacoes/fonte.js +15 -3
  56. package/fontes/modificadores/validacoes/fonte.js.map +1 -1
  57. package/fontes/modificadores/validacoes/identificacao-personalizada.d.ts +3 -1
  58. package/fontes/modificadores/validacoes/identificacao-personalizada.js.map +1 -1
  59. package/fontes/modificadores/validacoes/multiplos-qualitativos.d.ts +3 -1
  60. package/fontes/modificadores/validacoes/multiplos-qualitativos.js +27 -16
  61. package/fontes/modificadores/validacoes/multiplos-qualitativos.js.map +1 -1
  62. package/fontes/modificadores/validacoes/numerica.d.ts +3 -1
  63. package/fontes/modificadores/validacoes/numerica.js +21 -9
  64. package/fontes/modificadores/validacoes/numerica.js.map +1 -1
  65. package/fontes/modificadores/validacoes/quantificador.js +3 -3
  66. package/fontes/modificadores/variacao-fonte-alternativa.d.ts +3 -1
  67. package/fontes/modificadores/variacao-fonte-alternativa.js +14 -1
  68. package/fontes/modificadores/variacao-fonte-alternativa.js.map +1 -1
  69. package/fontes/seletores/seletor-estrutura.js.map +1 -1
  70. package/fontes/serializadores/serializador.js +39 -22
  71. package/fontes/serializadores/serializador.js.map +1 -1
  72. package/fontes/tradutores/tradutor.js +3 -2
  73. package/fontes/tradutores/tradutor.js.map +1 -1
  74. package/fontes/valores/dicionario-valores.js +18 -0
  75. package/fontes/valores/dicionario-valores.js.map +1 -1
  76. package/fontes/valores/metodos/css/annotation.d.ts +8 -0
  77. package/fontes/valores/metodos/css/annotation.js +25 -0
  78. package/fontes/valores/metodos/css/annotation.js.map +1 -0
  79. package/fontes/valores/metodos/css/character-variant.d.ts +8 -0
  80. package/fontes/valores/metodos/css/character-variant.js +19 -0
  81. package/fontes/valores/metodos/css/character-variant.js.map +1 -0
  82. package/fontes/valores/metodos/css/counter.d.ts +10 -0
  83. package/fontes/valores/metodos/css/counter.js +55 -0
  84. package/fontes/valores/metodos/css/counter.js.map +1 -0
  85. package/fontes/valores/metodos/css/ornaments.d.ts +8 -0
  86. package/fontes/valores/metodos/css/ornaments.js +25 -0
  87. package/fontes/valores/metodos/css/ornaments.js.map +1 -0
  88. package/fontes/valores/metodos/css/rotate3d.d.ts +12 -0
  89. package/fontes/valores/metodos/css/rotate3d.js +26 -0
  90. package/fontes/valores/metodos/css/rotate3d.js.map +1 -0
  91. package/fontes/valores/metodos/css/styleset.d.ts +10 -0
  92. package/fontes/valores/metodos/css/styleset.js +29 -0
  93. package/fontes/valores/metodos/css/styleset.js.map +1 -0
  94. package/fontes/valores/metodos/css/stylistic.d.ts +8 -0
  95. package/fontes/valores/metodos/css/stylistic.js +19 -0
  96. package/fontes/valores/metodos/css/stylistic.js.map +1 -0
  97. package/fontes/valores/metodos/css/swash.d.ts +8 -0
  98. package/fontes/valores/metodos/css/swash.js +19 -0
  99. package/fontes/valores/metodos/css/swash.js.map +1 -0
  100. package/fontes/valores/metodos/foles/anotacao.d.ts +8 -0
  101. package/fontes/valores/metodos/foles/anotacao.js +25 -0
  102. package/fontes/valores/metodos/foles/anotacao.js.map +1 -0
  103. package/fontes/valores/metodos/foles/conjunto-estilos.d.ts +10 -0
  104. package/fontes/valores/metodos/foles/conjunto-estilos.js +29 -0
  105. package/fontes/valores/metodos/foles/conjunto-estilos.js.map +1 -0
  106. package/fontes/valores/metodos/foles/contador.d.ts +10 -0
  107. package/fontes/valores/metodos/foles/contador.js +70 -0
  108. package/fontes/valores/metodos/foles/contador.js.map +1 -0
  109. package/fontes/valores/metodos/foles/espirrar.d.ts +8 -0
  110. package/fontes/valores/metodos/foles/espirrar.js +19 -0
  111. package/fontes/valores/metodos/foles/espirrar.js.map +1 -0
  112. package/fontes/valores/metodos/foles/estilistico.d.ts +8 -0
  113. package/fontes/valores/metodos/foles/estilistico.js +19 -0
  114. package/fontes/valores/metodos/foles/estilistico.js.map +1 -0
  115. package/fontes/valores/metodos/foles/ornamentos.d.ts +8 -0
  116. package/fontes/valores/metodos/foles/ornamentos.js +25 -0
  117. package/fontes/valores/metodos/foles/ornamentos.js.map +1 -0
  118. package/fontes/valores/metodos/foles/rotacionar-3d.d.ts +12 -0
  119. package/fontes/valores/metodos/foles/rotacionar-3d.js +29 -0
  120. package/fontes/valores/metodos/foles/rotacionar-3d.js.map +1 -0
  121. package/fontes/valores/metodos/foles/variar-caractere.d.ts +8 -0
  122. package/fontes/valores/metodos/foles/variar-caractere.js +19 -0
  123. package/fontes/valores/metodos/foles/variar-caractere.js.map +1 -0
  124. package/package.json +1 -1
  125. package/testes/modificadores/atribuicao-abreviada.test.js.map +1 -1
  126. package/testes/modificadores/metodos-reversos.test.js +69 -0
  127. package/testes/modificadores/metodos-reversos.test.js.map +1 -1
  128. package/testes/modificadores/metodos.test.js +545 -0
  129. package/testes/modificadores/metodos.test.js.map +1 -1
  130. package/testes/serializador.test.js +102 -6
  131. package/testes/serializador.test.js.map +1 -1
  132. package/testes/tradutor.test.js +1 -1
  133. package/testes/tradutor.test.js.map +1 -1
@@ -11,6 +11,7 @@ const serializadores_1 = require("../../fontes/serializadores");
11
11
  const metodos_1 = require("../listas/metodos");
12
12
  const declaracoes_1 = require("../../fontes/declaracoes");
13
13
  const seletor_valor_1 = require("../../fontes/valores/seletor-valor");
14
+ const contador_1 = require("../../fontes/valores/metodos/foles/contador");
14
15
  describe('Testando Seletores que recebem MÉTODOS como valor', () => {
15
16
  describe('Testes Unitários', () => {
16
17
  let lexador;
@@ -23,6 +24,111 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
23
24
  avaliador = new avaliador_sintatico_1.AvaliadorSintatico(importador);
24
25
  tradutor = new serializadores_1.Serializador();
25
26
  });
27
+ it('Atribuindo Método "anotação()" com valor numérico - caso de sucesso', () => {
28
+ const formasAceitas = ['anotação', 'anotacao'];
29
+ const valoresAceitos = ['1', '2', '12', '20'];
30
+ for (let valIndex = 0; valIndex < formasAceitas.length; valIndex += 1) {
31
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
32
+ // Lexador
33
+ const resultadoLexador = lexador.mapear([
34
+ "lmht {",
35
+ `variacao-fonte-alternativa: ${formasAceitas[valIndex]}(${valoresAceitos[index]});`,
36
+ "}"
37
+ ]);
38
+ // O Lexador não deve encontrar erros
39
+ expect(resultadoLexador.erros).toHaveLength(0);
40
+ // O valor recebido deve ser mapeado como METODO
41
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
42
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
43
+ ]));
44
+ // O Lexador deve montar um objeto de comprimento 10, incluindo mapeamento de valores numéricos
45
+ expect(resultadoLexador.simbolos).toHaveLength(10);
46
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
47
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
48
+ ]));
49
+ // Avaliador Sintático
50
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
51
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
52
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
53
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
54
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
55
+ const primeiroResultadoTipado = primeiroResultado;
56
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
57
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
58
+ // Tradutor
59
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
60
+ // O Tradutor deve serializar de acordo e traduzir anotação para annotation
61
+ expect(resultadoTradutor).toContain('font-variant-alternates');
62
+ expect(resultadoTradutor).toContain(`annotation(${valoresAceitos[index]});`);
63
+ }
64
+ }
65
+ });
66
+ it('Atribuindo Método "anotação()" com valor numérico - caso de falha', () => {
67
+ const valoresAceitos = ['0', '100', '300'];
68
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
69
+ // Lexador
70
+ const resultadoLexador = lexador.mapear([
71
+ "lmht {",
72
+ `variacao-fonte-alternativa: anotação(${valoresAceitos[index]});`,
73
+ "}"
74
+ ]);
75
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
76
+ expect(() => {
77
+ tradutor.serializar(resultadoAvaliadorSintatico);
78
+ }).toThrow('O valor da função anotação() deve estar entre 1 e 99');
79
+ }
80
+ });
81
+ it('Atribuindo Método "anotação()" com valor string - caso de sucesso', () => {
82
+ const formasAceitas = ['anotação', 'anotacao'];
83
+ const valoresAceitos = ['floral', 'ruby', 'circle'];
84
+ for (let valIndex = 0; valIndex < formasAceitas.length; valIndex += 1) {
85
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
86
+ // Lexador
87
+ const resultadoLexador = lexador.mapear([
88
+ "lmht {",
89
+ `variacao-fonte-alternativa: ${formasAceitas[valIndex]}('${valoresAceitos[index]}');`,
90
+ "}"
91
+ ]);
92
+ // O Lexador não deve encontrar erros
93
+ expect(resultadoLexador.erros).toHaveLength(0);
94
+ // O valor recebido deve ser mapeado como METODO
95
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
96
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
97
+ ]));
98
+ // O Lexador deve montar um objeto de comprimento 10
99
+ expect(resultadoLexador.simbolos).toHaveLength(10);
100
+ // Avaliador Sintático
101
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
102
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
103
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
104
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
105
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
106
+ const primeiroResultadoTipado = primeiroResultado;
107
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
108
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
109
+ // Tradutor
110
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
111
+ // O Tradutor deve serializar de acordo e traduzir anotação para annotation e conter o valor string
112
+ expect(resultadoTradutor).toContain('font-variant-alternates');
113
+ expect(resultadoTradutor).toContain(`annotation('${valoresAceitos[index]}');`);
114
+ }
115
+ }
116
+ });
117
+ it('Atribuindo Método "anotação()" com valor string - caso de falha', () => {
118
+ const valoresAceitos = ['--valorPersonalizado', 'herdar', 'inicial'];
119
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
120
+ // Lexador
121
+ const resultadoLexador = lexador.mapear([
122
+ "lmht {",
123
+ `variacao-fonte-alternativa: anotação(${valoresAceitos[index]});`,
124
+ "}"
125
+ ]);
126
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
127
+ expect(() => {
128
+ tradutor.serializar(resultadoAvaliadorSintatico);
129
+ }).toThrow(`Propriedade 'variação-fonte-alternativa' com valor personalizado ${valoresAceitos[index]} inválido.`);
130
+ }
131
+ });
26
132
  it('Atribuindo Método "borrar()"', () => {
27
133
  for (let index = 0; index < metodos_1.MetodoBorrar.length; index += 1) {
28
134
  const valoresAceitos = ['100px', '100%', '0.1', '0', '1', '1.75'];
@@ -154,6 +260,119 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
154
260
  expect(resultadoTradutor).toContain('calc(100px - 80px);');
155
261
  }
156
262
  });
263
+ it('Atribuindo Método "conjunto-estilos()" - caso de sucesso', () => {
264
+ const valoresAceitos = ['1', '1, 2', '6, 12, 18'];
265
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
266
+ // Lexador
267
+ const resultadoLexador = lexador.mapear([
268
+ "lmht {",
269
+ `variacao-fonte-alternativa: conjunto-estilos(${valoresAceitos[index]});`,
270
+ "}"
271
+ ]);
272
+ // O Lexador não deve encontrar erros
273
+ expect(resultadoLexador.erros).toHaveLength(0);
274
+ // O valor recebido deve ser mapeado como METODO
275
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
276
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
277
+ ]));
278
+ // O Lexador deve montar um objeto contendo valores numéricos
279
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
280
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
281
+ ]));
282
+ // Avaliador Sintático
283
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
284
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
285
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
286
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
287
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
288
+ const primeiroResultadoTipado = primeiroResultado;
289
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
290
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
291
+ // Tradutor
292
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
293
+ // O Tradutor deve serializar de acordo e traduzir escalamento-vertical para scaleY
294
+ expect(resultadoTradutor).toContain('font-variant-alternates');
295
+ expect(resultadoTradutor).toContain(`styleset(${valoresAceitos[index]});`);
296
+ }
297
+ });
298
+ it('Atribuindo Método "conjunto-estilos()" - caso de falha', () => {
299
+ const valoresAceitos = ['0', '1, 21, 12', '3, 13, 30'];
300
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
301
+ // Lexador
302
+ const resultadoLexador = lexador.mapear([
303
+ "lmht {",
304
+ `variacao-fonte-alternativa: conjunto-estilos(${valoresAceitos[index]});`,
305
+ "}"
306
+ ]);
307
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
308
+ expect(() => {
309
+ tradutor.serializar(resultadoAvaliadorSintatico);
310
+ }).toThrow('Os valores da função conjunto-estilos() devem estar entre 1 e 20');
311
+ }
312
+ });
313
+ it('Atribuindo Método "contador()"', () => {
314
+ const nomeSimbolo = new lexador_1.Simbolo('IDENTIFICADOR', 'contador', 'any', 1, 2, 3);
315
+ const estiloSimbolo = new lexador_1.Simbolo('IDENTIFICADOR', 'romano-maiusculo', 'any', 1, 2, 3);
316
+ const instanciaContador = new contador_1.Contador(nomeSimbolo, estiloSimbolo);
317
+ const estilosAceitos = [];
318
+ Object.keys(instanciaContador.estilosAceitos).forEach((valor) => estilosAceitos.push(valor));
319
+ const estilosTraduzidos = [];
320
+ Object.values(instanciaContador.estilosAceitos).forEach((valor) => estilosTraduzidos.push(valor));
321
+ for (let index = 0; index < estilosAceitos.length; index += 1) {
322
+ // Lexador
323
+ const resultadoLexador = lexador.mapear([
324
+ "lmht {",
325
+ `conteúdo: contador(contador1, ${estilosAceitos[index]});`,
326
+ "}"
327
+ ]);
328
+ // O Lexador deve montar um objeto de comprimento 12 sem retornar erros
329
+ expect(resultadoLexador.simbolos).toHaveLength(12);
330
+ expect(resultadoLexador.erros).toHaveLength(0);
331
+ // O Lexador deve mapear METODO e IDENTIFICADOR no processo
332
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
333
+ expect.objectContaining({ tipo: foles_1.default.IDENTIFICADOR }),
334
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
335
+ ]));
336
+ // Avaliador Sintático
337
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
338
+ // O Avaliador deve montar um objeto com o devido nome CSS
339
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
340
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
341
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
342
+ const primeiroResultadoTipado = primeiroResultado;
343
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
344
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('content');
345
+ // Tradutor
346
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
347
+ expect(resultadoTradutor).toContain('content');
348
+ expect(resultadoTradutor).toContain(`counter(contador1, ${estilosTraduzidos[index]});`);
349
+ }
350
+ });
351
+ it('Caso de Falha - Método "contador()" com valor de estilo inválido', () => {
352
+ const nomeSimbolo = new lexador_1.Simbolo('IDENTIFICADOR', 'contador', 'any', 1, 2, 3);
353
+ const estiloSimbolo = new lexador_1.Simbolo('IDENTIFICADOR', 'romano-maiusculo', 'any', 1, 2, 3);
354
+ const instanciaContador = new contador_1.Contador(nomeSimbolo, estiloSimbolo);
355
+ const estilosAceitos = [];
356
+ Object.keys(instanciaContador.estilosAceitos).forEach((valor) => estilosAceitos.push(valor));
357
+ for (let index = 0; index < estilosAceitos.length; index += 1) {
358
+ const estiloErroDigitacao = estilosAceitos[index].replace(/./, "x");
359
+ // Lexador
360
+ const resultadoLexador = lexador.mapear([
361
+ "lmht {",
362
+ `conteúdo: contador(contador1, ${estiloErroDigitacao});`,
363
+ "}"
364
+ ]);
365
+ // O Lexador deve montar um objeto de comprimento 12 sem retornar erros
366
+ expect(resultadoLexador.simbolos).toHaveLength(12);
367
+ expect(resultadoLexador.erros).toHaveLength(0);
368
+ // O Avaliador Sintático também deve retornar o seu objeto sem retornar erros
369
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
370
+ // O Serializador deve retornar o erro de estilo inválido uma vez que não consegue traduzir o valor
371
+ expect(() => {
372
+ tradutor.serializar(resultadoAvaliadorSintatico);
373
+ }).toThrow(`Valor de estilo ${estiloErroDigitacao} inválido para a função contador().`);
374
+ }
375
+ });
157
376
  it('Atribuindo Método "contraste()"', () => {
158
377
  for (let index = 0; index < metodos_1.MetodoContraste.length; index += 1) {
159
378
  const valoresAceitos = ['100px', '100%', '0.1', '0', '1', '1.75'];
@@ -538,6 +757,108 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
538
757
  }
539
758
  }
540
759
  });
760
+ it('Atribuindo Método "espirrar()" - caso de sucesso', () => {
761
+ const valoresAceitos = ['1', '2', '12', '20'];
762
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
763
+ // Lexador
764
+ const resultadoLexador = lexador.mapear([
765
+ "lmht {",
766
+ `variacao-fonte-alternativa: espirrar(${valoresAceitos[index]});`,
767
+ "}"
768
+ ]);
769
+ // O Lexador não deve encontrar erros
770
+ expect(resultadoLexador.erros).toHaveLength(0);
771
+ // O valor recebido deve ser mapeado como METODO
772
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
773
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
774
+ ]));
775
+ // O Lexador deve montar um objeto de comprimento 10, incluindo mapeamento de valores numéricos
776
+ expect(resultadoLexador.simbolos).toHaveLength(10);
777
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
778
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
779
+ ]));
780
+ // Avaliador Sintático
781
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
782
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
783
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
784
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
785
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
786
+ const primeiroResultadoTipado = primeiroResultado;
787
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
788
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
789
+ // Tradutor
790
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
791
+ // O Tradutor deve serializar de acordo e traduzir espirrar para swash
792
+ expect(resultadoTradutor).toContain('font-variant-alternates');
793
+ expect(resultadoTradutor).toContain(`swash(${valoresAceitos[index]});`);
794
+ }
795
+ });
796
+ it('Atribuindo Método "espirrar()" - caso de falha', () => {
797
+ const valoresAceitos = ['0', '100', '300'];
798
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
799
+ // Lexador
800
+ const resultadoLexador = lexador.mapear([
801
+ "lmht {",
802
+ `variacao-fonte-alternativa: espirrar(${valoresAceitos[index]});`,
803
+ "}"
804
+ ]);
805
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
806
+ expect(() => {
807
+ tradutor.serializar(resultadoAvaliadorSintatico);
808
+ }).toThrow('O valor da função espirrar() deve estar entre 1 e 99');
809
+ }
810
+ });
811
+ it('Atribuindo Método "estilistico()" - caso de sucesso', () => {
812
+ const valoresAceitos = ['1', '2', '12', '20'];
813
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
814
+ // Lexador
815
+ const resultadoLexador = lexador.mapear([
816
+ "lmht {",
817
+ `variacao-fonte-alternativa: estilistico(${valoresAceitos[index]});`,
818
+ "}"
819
+ ]);
820
+ // O Lexador não deve encontrar erros
821
+ expect(resultadoLexador.erros).toHaveLength(0);
822
+ // O valor recebido deve ser mapeado como METODO
823
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
824
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
825
+ ]));
826
+ // O Lexador deve montar um objeto de comprimento 10, incluindo mapeamento de valores numéricos
827
+ expect(resultadoLexador.simbolos).toHaveLength(10);
828
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
829
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
830
+ ]));
831
+ // Avaliador Sintático
832
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
833
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
834
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
835
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
836
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
837
+ const primeiroResultadoTipado = primeiroResultado;
838
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
839
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
840
+ // Tradutor
841
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
842
+ // O Tradutor deve serializar de acordo e traduzir estilístico para stylistic
843
+ expect(resultadoTradutor).toContain('font-variant-alternates');
844
+ expect(resultadoTradutor).toContain(`stylistic(${valoresAceitos[index]});`);
845
+ }
846
+ });
847
+ it('Atribuindo Método "estilistico()" - caso de falha', () => {
848
+ const valoresAceitos = ['0', '21', '30'];
849
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
850
+ // Lexador
851
+ const resultadoLexador = lexador.mapear([
852
+ "lmht {",
853
+ `variacao-fonte-alternativa: estilistico(${valoresAceitos[index]});`,
854
+ "}"
855
+ ]);
856
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
857
+ expect(() => {
858
+ tradutor.serializar(resultadoAvaliadorSintatico);
859
+ }).toThrow('O valor da função estilistico() deve estar entre 1 e 20');
860
+ }
861
+ });
541
862
  it('Atribuindo Método "gradiente-linear()" com valor de ângulo deg', () => {
542
863
  for (let index = 0; index < metodos_1.MetodoGradienteLinear.length; index += 1) {
543
864
  // Lexador
@@ -1050,6 +1371,105 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
1050
1371
  }
1051
1372
  }
1052
1373
  });
1374
+ it('Atribuindo Método "ornamentos()" com valor numérico - caso de sucesso', () => {
1375
+ const valoresAceitos = ['1', '2', '12', '20'];
1376
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
1377
+ // Lexador
1378
+ const resultadoLexador = lexador.mapear([
1379
+ "lmht {",
1380
+ `variacao-fonte-alternativa: ornamentos(${valoresAceitos[index]});`,
1381
+ "}"
1382
+ ]);
1383
+ // O Lexador não deve encontrar erros
1384
+ expect(resultadoLexador.erros).toHaveLength(0);
1385
+ // O valor recebido deve ser mapeado como METODO
1386
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1387
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
1388
+ ]));
1389
+ // O Lexador deve montar um objeto de comprimento 10, incluindo mapeamento de valores numéricos
1390
+ expect(resultadoLexador.simbolos).toHaveLength(10);
1391
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1392
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
1393
+ ]));
1394
+ // Avaliador Sintático
1395
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1396
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
1397
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
1398
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
1399
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
1400
+ const primeiroResultadoTipado = primeiroResultado;
1401
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
1402
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
1403
+ // Tradutor
1404
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
1405
+ // O Tradutor deve serializar de acordo e traduzir ornamentos para ornaments
1406
+ expect(resultadoTradutor).toContain('font-variant-alternates');
1407
+ expect(resultadoTradutor).toContain(`ornaments(${valoresAceitos[index]});`);
1408
+ }
1409
+ });
1410
+ it('Atribuindo Método "ornamentos()" com valor numérico - caso de falha', () => {
1411
+ const valoresAceitos = ['0', '100', '300'];
1412
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
1413
+ // Lexador
1414
+ const resultadoLexador = lexador.mapear([
1415
+ "lmht {",
1416
+ `variacao-fonte-alternativa: ornamentos(${valoresAceitos[index]});`,
1417
+ "}"
1418
+ ]);
1419
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1420
+ expect(() => {
1421
+ tradutor.serializar(resultadoAvaliadorSintatico);
1422
+ }).toThrow('O valor da função ornamentos() deve estar entre 1 e 99');
1423
+ }
1424
+ });
1425
+ it('Atribuindo Método "ornamentos()" com valor string - caso de sucesso', () => {
1426
+ const valoresAceitos = ['floral', 'ruby', 'circle'];
1427
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
1428
+ // Lexador
1429
+ const resultadoLexador = lexador.mapear([
1430
+ "lmht {",
1431
+ `variacao-fonte-alternativa: ornamentos('${valoresAceitos[index]}');`,
1432
+ "}"
1433
+ ]);
1434
+ // O Lexador não deve encontrar erros
1435
+ expect(resultadoLexador.erros).toHaveLength(0);
1436
+ // O valor recebido deve ser mapeado como METODO
1437
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1438
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
1439
+ ]));
1440
+ // O Lexador deve montar um objeto de comprimento 10
1441
+ expect(resultadoLexador.simbolos).toHaveLength(10);
1442
+ // Avaliador Sintático
1443
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1444
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
1445
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
1446
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
1447
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
1448
+ const primeiroResultadoTipado = primeiroResultado;
1449
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
1450
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
1451
+ // Tradutor
1452
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
1453
+ // O Tradutor deve serializar de acordo e traduzir ornamentos para ornaments e conter o valor string
1454
+ expect(resultadoTradutor).toContain('font-variant-alternates');
1455
+ expect(resultadoTradutor).toContain(`ornaments('${valoresAceitos[index]}');`);
1456
+ }
1457
+ });
1458
+ it('Atribuindo Método "ornamentos()" com valor string - caso de falha', () => {
1459
+ const valoresAceitos = ['--valorPersonalizado', 'herdar', 'inicial'];
1460
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
1461
+ // Lexador
1462
+ const resultadoLexador = lexador.mapear([
1463
+ "lmht {",
1464
+ `variacao-fonte-alternativa: ornamentos(${valoresAceitos[index]});`,
1465
+ "}"
1466
+ ]);
1467
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1468
+ expect(() => {
1469
+ tradutor.serializar(resultadoAvaliadorSintatico);
1470
+ }).toThrow(`Propriedade 'variação-fonte-alternativa' com valor personalizado ${valoresAceitos[index]} inválido.`);
1471
+ }
1472
+ });
1053
1473
  it('Atribuindo Método "passos" (steps)', () => {
1054
1474
  for (let index = 0; index < metodos_1.MetodoPassos.length; index += 1) {
1055
1475
  // Lexador
@@ -1342,6 +1762,80 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
1342
1762
  }
1343
1763
  }
1344
1764
  });
1765
+ it('Atribuindo Método "rotacionar-3d()" - caso de sucesso', () => {
1766
+ for (let index = 0; index < metodos_1.MetodosRotacionar.length; index += 1) {
1767
+ const valoresAceitos = ['0, 0, 0, 0', '1, 2, 0, 45deg', '1, 1, 1, 90graus'];
1768
+ for (let valIndex = 0; valIndex < valoresAceitos.length; valIndex += 1) {
1769
+ // Lexador
1770
+ const resultadoLexador = lexador.mapear([
1771
+ "lmht {",
1772
+ `${metodos_1.MetodosRotacionar[index]}: rotacionar-3d(${valoresAceitos[valIndex]});`,
1773
+ "}"
1774
+ ]);
1775
+ // O Lexador não deve encontrar erros
1776
+ expect(resultadoLexador.erros).toHaveLength(0);
1777
+ // O valor recebido deve ser mapeado como METODO
1778
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1779
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
1780
+ ]));
1781
+ // O Lexador deve montar um objeto de comprimento 17 caso haja quantificador e 16 caso não haja
1782
+ if (valIndex > 0) {
1783
+ expect(resultadoLexador.simbolos).toHaveLength(17);
1784
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1785
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
1786
+ expect.objectContaining({ tipo: foles_1.default.QUANTIFICADOR }),
1787
+ ]));
1788
+ }
1789
+ else {
1790
+ expect(resultadoLexador.simbolos).toHaveLength(16);
1791
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1792
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
1793
+ ]));
1794
+ }
1795
+ // Avaliador Sintático
1796
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1797
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
1798
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
1799
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
1800
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
1801
+ const primeiroResultadoTipado = primeiroResultado;
1802
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
1803
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual(metodos_1.TraducaoValoresMetodos[metodos_1.MetodosRotacionar[index]]);
1804
+ // Tradutor
1805
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
1806
+ // O Tradutor deve serializar de acordo e traduzir rotacionar-3d para rotate3d
1807
+ expect(resultadoTradutor).toContain(metodos_1.TraducaoValoresMetodos[metodos_1.MetodosRotacionar[index]]);
1808
+ if (valIndex < 2) {
1809
+ expect(resultadoTradutor).toContain(`rotate3d(${valoresAceitos[valIndex]});`);
1810
+ }
1811
+ else {
1812
+ expect(resultadoTradutor).toContain(`rotate3d(1, 1, 1, 90deg);`);
1813
+ }
1814
+ }
1815
+ }
1816
+ });
1817
+ it('Atribuindo Método "rotacionar-3d()" - caso de falha', () => {
1818
+ for (let index = 0; index < metodos_1.MetodosRotacionar.length; index += 1) {
1819
+ // Lexador
1820
+ const resultadoLexador = lexador.mapear([
1821
+ "lmht {",
1822
+ `${metodos_1.MetodosRotacionar[index]}: rotacionar-3d(1, 1, 1, 20px);`,
1823
+ "}"
1824
+ ]);
1825
+ // O Lexador não deve encontrar erros
1826
+ expect(resultadoLexador.erros).toHaveLength(0);
1827
+ // O valor recebido deve ser mapeado como METODO
1828
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
1829
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
1830
+ ]));
1831
+ // Avaliador Sintático
1832
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
1833
+ // Serializador não deve aceitar 'px' como quantificador válido
1834
+ expect(() => {
1835
+ tradutor.serializar(resultadoAvaliadorSintatico);
1836
+ }).toThrow("Propriedade 'transformar' com quantificador inválido");
1837
+ }
1838
+ });
1345
1839
  it('Atribuindo Método "rotacionar-eixo-z()"', () => {
1346
1840
  for (let index = 0; index < metodos_1.MetodosRotacionar.length; index += 1) {
1347
1841
  const valoresAceitos = ['45graus', '45deg', '3.142rad', '0.1', '0', '1', '1.75'];
@@ -2132,6 +2626,57 @@ describe('Testando Seletores que recebem MÉTODOS como valor', () => {
2132
2626
  }
2133
2627
  }
2134
2628
  });
2629
+ it('Atribuindo Método "variar-caractere()" - caso de sucesso', () => {
2630
+ const valoresAceitos = ['1', '2', '12', '20'];
2631
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
2632
+ // Lexador
2633
+ const resultadoLexador = lexador.mapear([
2634
+ "lmht {",
2635
+ `variacao-fonte-alternativa: variar-caractere(${valoresAceitos[index]});`,
2636
+ "}"
2637
+ ]);
2638
+ // O Lexador não deve encontrar erros
2639
+ expect(resultadoLexador.erros).toHaveLength(0);
2640
+ // O valor recebido deve ser mapeado como METODO
2641
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
2642
+ expect.objectContaining({ tipo: foles_1.default.METODO }),
2643
+ ]));
2644
+ // O Lexador deve montar um objeto de comprimento 10, incluindo mapeamento de valores numéricos
2645
+ expect(resultadoLexador.simbolos).toHaveLength(10);
2646
+ expect(resultadoLexador.simbolos).toEqual(expect.arrayContaining([
2647
+ expect.objectContaining({ tipo: foles_1.default.NUMERO }),
2648
+ ]));
2649
+ // Avaliador Sintático
2650
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
2651
+ // O Avaliador deve montar um objeto com os devidos nomes FolEs e CSS
2652
+ expect(resultadoAvaliadorSintatico.length).toBeGreaterThanOrEqual(1);
2653
+ const primeiroResultado = resultadoAvaliadorSintatico[0];
2654
+ expect(primeiroResultado).toBeInstanceOf(declaracoes_1.BlocoDeclaracao);
2655
+ const primeiroResultadoTipado = primeiroResultado;
2656
+ expect(primeiroResultadoTipado.modificadores.length).toBeGreaterThanOrEqual(1);
2657
+ expect(primeiroResultadoTipado.modificadores[0].propriedadeCss).toStrictEqual('font-variant-alternates');
2658
+ // Tradutor
2659
+ const resultadoTradutor = tradutor.serializar(resultadoAvaliadorSintatico);
2660
+ // O Tradutor deve serializar de acordo e traduzir variar-caractere para character-variant
2661
+ expect(resultadoTradutor).toContain('font-variant-alternates');
2662
+ expect(resultadoTradutor).toContain(`character-variant(${valoresAceitos[index]});`);
2663
+ }
2664
+ });
2665
+ it('Atribuindo Método "variar-caractere()" - caso de falha', () => {
2666
+ const valoresAceitos = ['0', '210', '100'];
2667
+ for (let index = 0; index < valoresAceitos.length; index += 1) {
2668
+ // Lexador
2669
+ const resultadoLexador = lexador.mapear([
2670
+ "lmht {",
2671
+ `variacao-fonte-alternativa: variar-caractere(${valoresAceitos[index]});`,
2672
+ "}"
2673
+ ]);
2674
+ const resultadoAvaliadorSintatico = avaliador.analisar(resultadoLexador.simbolos);
2675
+ expect(() => {
2676
+ tradutor.serializar(resultadoAvaliadorSintatico);
2677
+ }).toThrow('O valor da função variar-caractere() deve estar entre 1 e 99');
2678
+ }
2679
+ });
2135
2680
  it('Caso de Falha - Atribuindo método inexistente', () => {
2136
2681
  for (let index = 0; index < metodos_1.MetodosTranslacao.length; index += 1) {
2137
2682
  const valoresAceitos = ['42px', '3ch', '0'];