Como validar um cálculo do calendário chinês
Datas de referência
Valide separadamente a conversão de datas lunares, os horários dos termos solares, as classificações do almanaque e o comportamento da interface. A concordância em uma parte não demonstra que as demais estejam corretas. Um conjunto útil de verificações inclui as transições de mês e de ano, além de datas no interior de um mês.
Escolha uma referência independente que informe sua convenção de calendário e sua abrangência. Um segundo site que use o mesmo mecanismo de cálculo pode reproduzir os mesmos erros. Registre a edição ou versão da referência junto dos valores esperados para que seja possível rastrear uma alteração posterior.
O Atlas aceita datas civis de 1 d.C. a 2100. Seu mecanismo de cálculo, mantido em uma versão fixa, usa datas civis julianas até 1582-10-04, seguidas de 1582-10-15 no calendário gregoriano. Os dias de 5 a 14 de outubro não existem nessa sequência de datas civis. Uma comparação que use o calendário gregoriano estendido para trás, antes de sua introdução, chamado de calendário gregoriano proléptico, está testando uma correspondência diferente para as datas mais antigas.
Essa convenção descreve as designações de datas civis do software. Ela não estabelece qual calendário foi historicamente usado na China. Teste os limites do intervalo aceito e o tratamento de datas fora dele. Um intervalo de datas civis também difere de um intervalo de anos lunares completos, cujos limites caem em dias diferentes.
Armazene cada resultado com todos estes elementos: data civil e convenção de calendário, ano lunar, número do mês lunar, indicador de mês intercalar e dia lunar. Distinga o número do mês de sua posição no ano: o sexto mês intercalar é o sétimo mês em ordem cronológica, mas seu número continua sendo seis.
Casos de teste
Verificações de datas exatas
Estas datas abrangem o Ano-Novo Chinês, um dia bissexto gregoriano válido e as duas extremidades de meses lunares comuns e intercalares. Nesta tabela, a designação do ano lunar é o ano gregoriano em que ele começa. “Comum” significa que o indicador de mês intercalar é falso.
| Data gregoriana | Ano lunar | Mês | Tipo | Dia lunar |
|---|---|---|---|---|
| 2024-02-09 | 2023 | 12 | Comum | 30 |
| 2024-02-10 | 2024 | 1 | Comum | 1 |
| 2024-02-29 | 2024 | 1 | Comum | 20 |
| 2025-07-24 | 2025 | 6 | Comum | 30 |
| 2025-07-25 | 2025 | 6 | Intercalar | 1 |
| 2025-08-22 | 2025 | 6 | Intercalar | 29 |
| 2025-08-23 | 2025 | 7 | Comum | 1 |
| 2033-12-21 | 2033 | 11 | Comum | 30 |
| 2033-12-22 | 2033 | 11 | Intercalar | 1 |
| 2034-01-19 | 2033 | 11 | Intercalar | 29 |
| 2034-01-20 | 2033 | 12 | Comum | 1 |
| 2034-02-19 | 2034 | 1 | Comum | 1 |
Execute a conversão de cada data nos dois sentidos. A conversão de gregoriano para lunar deve produzir os quatro campos lunares, e a conversão de lunar para gregoriano deve recuperar a data indicada. Depois, teste toda a sequência ao redor da transição, não apenas seu primeiro dia. Isso distingue um início de mês incorreto de uma designação na tela que omite o indicador de mês intercalar.
Uma conversão de ida e volta, por si só, não comprova a exatidão. Duas funções podem compartilhar a mesma tabela incorreta e, ainda assim, desfazer perfeitamente a operação uma da outra. A comparação com valores esperados independentes é uma verificação separada. Uma comparação exaustiva deve registrar quantas datas foram comparadas, qual referência foi usada e todas as divergências.
Verificações estruturais e de entrada
| Verificação | Comportamento esperado |
|---|---|
| Avançar a partir do último dia de um mês lunar | Chegar ao primeiro dia do próximo mês em ordem cronológica, com o número do mês, o indicador de mês intercalar e o ano lunar corretos |
| Avançar de um mês comum para seu mês intercalar | Repetir o número do mês e mudar o indicador de mês intercalar para verdadeiro |
| Avançar de um mês intercalar para o mês seguinte | Desativar o indicador de mês intercalar e avançar o número do mês, incluindo qualquer mudança de ano necessária |
| Solicitar o dia 30 do sexto mês intercalar de 2025, que tem 29 dias | Rejeitar a data lunar inexistente |
| Solicitar um mês intercalar em um ano em que esse mês intercalar não ocorre | Rejeitá-lo, em vez de substituí-lo pelo mês comum |
| Inserir 29 de fevereiro de 2000 e, depois, 29 de fevereiro de 2100 | Aceitar a primeira data gregoriana e rejeitar a segunda |
| Inserir 29 de fevereiro de 1500 sob a convenção juliana do Atlas | Aceitar como uma data juliana válida |
| Avançar um dia civil a partir de 1582-10-04 sob a convenção de transição do Atlas | Chegar a 1582-10-15, exatamente um dia transcorrido depois |
| Converter uma data válida para lunar e de volta | Recuperar a data original sem perder a identidade do mês intercalar |
O calendário juliano acrescenta um dia bissexto a cada quatro anos. A regra gregoriana exclui os anos de fim de século, a menos que sejam divisíveis por 400; por isso, um teste de dia bissexto precisa especificar o calendário civil.
As verificações de rejeição descrevem uma interface de entrada de datas com validação estrita. Uma biblioteca subjacente também pode oferecer uma normalização documentada, como levar um dia fora do intervalo para o mês seguinte. Teste esses comportamentos separadamente, em vez de confundir um valor normalizado com a entrada original.
Verificações da interface
Teste a troca de idioma, a atualização do navegador, a navegação entre meses e a entrada do Almanaque separadamente das funções de conversão. A troca de idioma deve preservar a data selecionada e o mês exibido. Navegar para outro mês deve preservar o dia selecionado até que um novo dia seja escolhido. Verifique se a entrada do Almanaque abre na data gregoriana local do dispositivo e se uma página permanente de data mantém a data civil escrita nela quando acessada em outro fuso horário.
Inclua um instante de teste em que a data local do dispositivo seja diferente da data de referência do calendário. Isso permite detectar o erro de usar o relógio de referência astronômica para escolher a data da entrada do Almanaque ou de usar o relógio do navegador para reconstruir os limites dos meses lunares.
Termos solares e limites
Uma comparação de termos solares precisa da identidade do termo, da data civil, do horário, do padrão de tempo e da precisão publicada. Coloque os dois valores no mesmo calendário civil e no mesmo padrão de tempo antes de compará-los. Um horário publicado com precisão de minuto não pode comprovar uma correspondência ao segundo.
Teste a data de calendário atribuída separadamente da tolerância do registro de horário. Uma diferença inferior a um minuto pode ser aceitável em uma exibição arredondada e, ainda assim, colocar um evento do lado errado da meia-noite. Documente qualquer incerteza conhecida para esse limite específico, em vez de ampliar a tolerância para todas as datas.
Inclua uma Lua nova e um termo principal que ocorram na mesma data de referência. O termo pertence ao novo mês do calendário mesmo que seu instante preceda a conjunção. Um teste baseado apenas na ordem dos horários dos eventos pode deixar passar essa distinção.
Para a numeração dos meses intercalares, inclua a sequência de 2033–2034. O oitavo mês comum de 2033 e o primeiro mês de 2034 não têm termo principal, enquanto o mês intercalar entre eles é o décimo primeiro. Um cálculo que trate todo mês sem termo principal como intercalar falhará nessas verificações.
Verificações do almanaque e de datas históricas
Classificações do almanaque
Yi significa atividades indicadas e Ji, atividades a evitar. Obter a mesma Lua nova ou data lunar não valida essas listas. Teste suas regras de consulta em relação à convenção ou ao conjunto de dados de almanaque escolhido e, em separado, confira as designações de atividades em inglês. Um resultado explícito de “nenhuma” também precisa continuar distinguível da ausência de dados.
Quando uma classificação do almanaque muda em um termo solar, registre se seu limite é o início do dia de calendário desse termo ou seu instante exato. Teste os dois lados do limite escolhido. Essas classificações de mês não precisam mudar no início de um mês lunar.
O Ganzhi, o ciclo de troncos e ramos, também precisa de um limite de ano declarado. Uma designação de ano baseada no Ano-Novo Chinês e outra baseada no Início da Primavera, ou Lichun, podem divergir durante o intervalo entre esses limites. Compare cada campo usando sua convenção declarada.
Conversão histórica
Para um documento histórico, estabeleça a dinastia ou o ano da era, a localidade, a designação do mês, o marcador de mês intercalar e qualquer dia Ganzhi registrado antes de escolher um método de conversão. Calendários mais antigos usavam métodos astronômicos e convenções de tempo diferentes. Por isso, um cálculo moderno estendido para o passado pode diferir do calendário efetivamente usado no registro.
Mantenha a transcrição, sua interpretação e a data convertida em campos separados. Quando um documento fornecer tanto uma data numerada quanto um dia Ganzhi, teste sua concordância, em vez de descartar um para fazer o outro se encaixar.