Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Off-by-one de signos no dia limite do signo #1

Open
wh1t3h47 opened this issue Jun 23, 2021 · 7 comments
Open

Off-by-one de signos no dia limite do signo #1

wh1t3h47 opened this issue Jun 23, 2021 · 7 comments

Comments

@wh1t3h47
Copy link

Se eu usar signoDeHoje com a seguinte data: new Date('01-20-2005') - o programa retorna aquário, o resultado está incorreto, pois aquário seria no dia seguinte.

@brunomdrrosa
Copy link
Owner

Se eu usar signoDeHoje com a seguinte data: new Date('01-20-2005') - o programa retorna aquário, o resultado está incorreto, pois aquário seria no dia seguinte.

Acabei pegando as datas de um site que dizia que Aquário começava em 20 de janeiro, falha minha de não ter percebido na hora de passar pro programa, obrigado pelo aviso!

@wh1t3h47
Copy link
Author

wh1t3h47 commented Jun 23, 2021

Imagina, que isso! Estou desenvolvendo em cima do seu repositório uma suite de testes para melhorar o código, isso mostra como é fundamental usarmos testes para publicarmos um pacote.
Meu objetivo é publicar no NPM, podemos entrar em contato? Gostaria de creditá-lo pelo trabalho e também licenciar o código (inclusive porque estou usando dentro do grupo CBR, para uso comercial).

@wh1t3h47
Copy link
Author

wh1t3h47 commented Jun 23, 2021

Sumário de testes:

Perdoe as piadas ruins, só queria fazer o trabalho de escrever testes mais divertido!
Acredito que os erros sejam a mesma raíz do off-by-one, sabe quando você se confunde e acha que 1 e 5 não se incluem no grupo "de 1 a 5"
Alguns dos testes eu conferi que estão corretos: pesquise signo 19 fevereiro e o Google lhe dará uma resposta instantânea, mas pode ser que eu tenha errado no teste também, fica de olho... Uma coisa que aprendi no TDD é a testar os próprios testes, eles nunca são uma fonte de verdade absoluta

yarn run jest
yarn run v1.22.10
warning package.json: License should be a valid SPDX license expression
warning ../../package.json: No license field
$ /home/skid/My_Code/signoDeHoje/node_modules/.bin/jest
FAIL src/signoDeHoje.test.js
● testar pessoa Capricornoano | data = Thu, 20 Jan 2005 02:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Capricórnio"
Received string:    "Aquário"

  11 | const testarSigno = (testName, data, signo) => {
  12 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 13 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  14 |     });
  15 | }
  16 |

  at Object.<anonymous> (src/signoDeHoje.test.js:13:35)

FAIL src/signoDeHojeOffByOne.test.js
● testar último dia de Aquário) | data = Sat, 19 Feb 2000 02:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Aquário"
Received string:    "Peixes"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar último dia de Áries) | data = Thu, 20 Apr 2000 03:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Áries"
Received string:    "Touro"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar primeiro dia de Touro) | data = Tue, 21 Mar 2000 03:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Touro"
Received string:    "Áries"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar primeiro dia de Leão) | data = Sat, 22 Jul 2000 03:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Leão"
Received string:    "Câncer"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar último dia de gente Virgem) | data = Tue, 22 Aug 2000 03:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Virgem"
Received string:    "Leão"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar primeiro dia de Libra) | data = Wed, 23 Aug 2000 03:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Libra"
Received string:    "Virgem"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

● testar último dia de Capricórnio) | data = Thu, 20 Jan 2000 02:00:00 GMT

expect(received).toMatch(expected)

Expected substring: "Capricórnio"
Received string:    "Aquário"

  14 |  const testarSigno = (testName, data, signo) => {
  15 |     test(`${testName} | data = ${data.toUTCString()}`, () => {
> 16 |       expect(retorna_signo(data)).toMatch(signo);
     |                                   ^
  17 |     });
  18 | }
  19 |

  at Object.<anonymous> (src/signoDeHojeOffByOne.test.js:16:35)

Test Suites: 2 failed, 2 total
Tests: 8 failed, 29 passed, 37 total
Snapshots: 0 total
Time: 0.32 s, estimated 1 s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

@wh1t3h47
Copy link
Author

wh1t3h47 commented Jun 23, 2021

Correções:

// Eu separei porque essa data que diferencia `or` do `and`
const DataInicio = "12-22"

/** 
 * @type {Array<{ Nome: 'Aquário' | 'Peixes' | 'Áries' | 'Touro' | 'Gêmeos' | 'Câncer' | 'Leão' | 'Virgem' | 'Libra' | 'Escorpião' | 'Sagitário' | 'Capricórnio', DataInicio: '01-21' | '02-20' | '03-21' | '04-20' | '05-21' | '06-22' | '07-22' | '08-23' | '09-23' | '10-23' | '11-21' | '11-22', DataFim: '02-19' | '03-20' | '04-19' | '05-20' | '06-21' | '07-21' | '08-22' | '09-22' | '10-22' | '11-21' | '12-21' | '01-20' }> }
 **/

const colecao_signos = [
  { Nome: 'Aquário',
    DataInicio: '01-21', DataFim: '02-19',
  },

  { Nome: 'Peixes',
    DataInicio: '02-20', DataFim: '03-20',
  },

  { Nome: 'Áries',
    DataInicio: '03-21', DataFim: '04-19',
  },

  { Nome: 'Touro',
    DataInicio: '04-20', DataFim: '05-20',
  },

  { Nome: 'Gêmeos',
    DataInicio: '05-21', DataFim: '06-21',
  },

  { Nome: 'Câncer',
    DataInicio: '06-22', DataFim: '07-21',
  },


  { Nome: 'Leão',
    DataInicio: '07-22', DataFim: '08-22',
  },

  { Nome: 'Virgem',
    DataInicio: '08-23', DataFim: '09-22',
  },

  { Nome: 'Libra',
    DataInicio: '09-23', DataFim: '10-22',
  },

  { Nome: 'Escorpião',
    DataInicio: '10-23', DataFim: '11-21',
  },

  { Nome: 'Sagitário',
    DataInicio: '11-21', DataFim: '12-21',
  },

  { Nome: 'Capricórnio',
    DataInicio, DataFim: '01-20',
  },
];

Nota:

Além disso, outro erro que pode acontecer é os milisegundos atrapalharem, mas somente se a data de entrada estiver exatamente no limite (as chances são super baixas)

Antes

    const data_inicio_signo = new Date(`${signo.DataInicio}-${ano} 00:00:00`);
    const data_fim_signo = new Date(`${signo.DataFim}-${ano} 23:59:59`);

Depois

    const data_inicio_signo = new Date(`${signo.DataInicio}-${ano} 00:00:00.000`);
    const data_fim_signo = new Date(`${signo.DataFim}-${ano} 23:59:59.999`);

Questão:

  • Existe um limite bem definido padrão para signos? Alguns sites parecem ter dados divergentes de outros...

@brunomdrrosa
Copy link
Owner

Meu objetivo é publicar no NPM, podemos entrar em contato? Gostaria de creditá-lo pelo trabalho e também licenciar o código (inclusive porque estou usando dentro do grupo CBR, para uso comercial).

Podemos entrar em contato sim, achei muito bacana o teu projeto.

Questão:

  • Existe um limite bem definido padrão para signos? Alguns sites parecem ter dados divergentes de outros...

Acredito que não exista algo 100% preciso, tenho alguns amigos que nasceram em dias que alguns sites consideram ser Leão e outros sites dizem que a pessoa é do signo Câncer, acaba sendo um pouco confuso nessa parte.

@wh1t3h47
Copy link
Author

wh1t3h47 commented Jul 1, 2021

Primeiramente, parabéns pelo código, tá muito bem feito!

Eu apliquei algumas mudanças com que aprendi em TypeScript, conhece?

Bom, basicamente, JSDoc, que quando você abre a função no vscode, ela mostra o que a função faz, quais argumentos ela tem e os tipos desses argumentos... JSDoc ajuda também a detectar erros no próprio vscode, aí eu também apliquei uma biblioteca de assertions em cima do pacote, o objetivo da mesma é que os parâmetros das funções devam respeitar uma assinatura de tipo consistente.

Também implementei uma suite completa de testes e workfliows no github para fazer o teste a cada commit, a única coisa que faltou foi husky (husky toma uma ação antes mesmo do git push, eu pensei em usar ele com eslint)

Mas faltou a licença, e aí que eu gostaria de conversar contigo:

Posso licenciar seu código?

Tem diversas opções de licenças mais permissivas (uso comercial, pode incluir em um software que vá ser comercializado), o que você acha?

Eu fiz uma pesquisa, e uma ótima licença é MIT

@brunomdrrosa
Copy link
Owner

Eu apliquei algumas mudanças com que aprendi em TypeScript, conhece?

Conheço sim, já utilizei para alguns projetos usando o React

Posso licenciar seu código?
Tem diversas opções de licenças mais permissivas (uso comercial, pode incluir em um software que vá ser comercializado), o que você acha?

Com certeza, pode licenciar sim na MIT com o uso comercial, sem problemas!
Depois me manda o projeto pra eu ver como ficou, abraços!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants