Coverage
--coverage instrumenta o que compila: a entrada de cada função e cada instrução de cada bloco incrementa um contador, e os contadores são escritos ao lado do output quando o programa termina - um return, um panic e um exit todos escrevem.
talor test src/main.talor --coverage -o build/main.ll
talor build --coverageO compilador escreve <stem>.covmap ao lado do output, nomeando o que cada contador é: o arquivo, a linha e a coluna, se é uma função ou uma instrução, e o nome da função. O programa em execução escreve as contagens ao lado de si mesmo, e TALOR_COV_FILE muda para onde elas vão.
talor run recusa a flag, porque o que ele constrói ele apaga, e dado de coverage que morre com o temporário não é dado:
'--coverage' is a flag of compile, test and build, and the data is written beside what they build; 'cov report' reads itO que é contado
O fonte do próprio programa: a árvore em que o module raiz está. A biblioteca padrão e um package alcançado por um require são compilados com o programa e não são regiões, porque um total que a biblioteca domina é um número que nenhum passo de build consegue exigir. O corpo de uma closure é contado como qualquer outra instrução da função que o contém, e o ponto de entrada que o compilador escreve não é uma região.
talor cov report
Um relatório recebe caminhos .covmap ou .covdata, pareia cada um com o seu irmão, e soma as contagens das regiões que nomeiam o mesmo arquivo, linha, coluna, tipo e função - duas instâncias de um generic são uma região, e um acerto em qualquer uma é um acerto:
talor cov report build/main.covdatafile regions covered cover
main.talor 5 3 60.0% 1, 5
TOTAL 5 3 60.0%As linhas que a última coluna nomeia são as que têm uma região que nunca foi alcançada. A porcentagem é de regiões cobertas e não de linhas: uma linha conta porque uma região começa nela, e uma linha onde nenhuma região começa - um comentário, uma linha em branco, uma chave - está fora da conta.
--min <pct> recebe uma porcentagem de 0 a 100 e responde 1 quando o total está abaixo dela, que é a pergunta que um passo de build faz:
talor cov report build/main.covdata --min 80coverage 60.0% is under --min 80talor cov annotate
Os mesmos dados contra o fonte, sob o nome do arquivo, uma marca por linha: - para uma linha em que uma região não foi alcançada, . para uma em que todas as regiões foram, e um espaço para uma linha onde nenhuma região começa.
main.talor
- fn unused(n: i64): i64 {
n * 2
}
. fn main(): i32 {
. println(`${sign(3)}`);
0
}Contadores são incrementos simples e não são sincronizados: sob threads uma contagem pode ser perdida, e uma contagem perdida só pode perder uma linha, nunca inventar uma.