sinais, passo 2: primeira função completa

Agora vamos terminar de implementar a função AnalisarLinha, guiados por testes.

Alteramos runefinder_test.go para verificar o nome devolvido por AnalisarLinha:

package main

import "testing"

const linhaLetraA = "0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;"

func TestAnalisarLinha(t *testing.T) {
	runa, nome := AnalisarLinha(linhaLetraA)
	if runa != 'A' {
		t.Errorf("Esperava 'A', veio %q", runa) // ➊
	}
	const nomeA = "LATIN CAPITAL LETTER A" // ➋
	if nome != nomeA {
		t.Errorf("Esperava %q, veio %q", nomeA, nome) // ➌
	}
}

➊ Para ser consistente com o próximo teste, mudei o código de formatação aqui de %c para %q, assim a runa vai aparecer entre aspas simples se o teste falhar.

➋ Criamos uma constante só para esse teste.

➌ O código de formatação %q também serve para exibir uma string entre aspas duplas.

Rodamos o teste para ver o que acontece:

$ go test
--- FAIL: TestAnalisarLinha (0.00s)
	runefinder_test.go:14: Esperava "LATIN CAPITAL LETTER A", veio "LETRA A"
FAIL
exit status 1
FAIL	github.com/ThoughtWorksInc/sinais	0.011s

Note a mensagem indicando que na linha 14 um teste falhou. O texto da mensagem é o que passamos para o método t.Errorf.

Agora vamos codar a função AnalisarLinha de verdade no arquivo runefinder.go, assim:

package main

import ( // ➊
	"strconv"
	"strings"
)

func AnalisarLinha(ucdLine string) (rune, string) {
	campos := strings.Split(ucdLine, ";")            // ➋
	código, _ := strconv.ParseInt(campos[0], 16, 32) // ➌
	return rune(código), campos[1]                   // ➍
}

Explicando:

➊ Para importar dois ou mais pacotes, essa é a sintaxe utilizada.

➋ Todo identificador importado de outro pacote é usado assim: pacote.Identificador (na verdade, é possível importar pacotes de outra forma, mas essa é a forma mais comum e mais recomendada). A função strings.Split recebe uma string para quebrar e outra string com o separador, e devolve uma fatia (slice) de strings, que é como um array de tamanho variável.

➌ A função strconv.ParseInt converte de string para int64. Ela recebe uma string (no caso, o item 0 da fatia campos), uma base (16) e o número de bits que se espera encontrar no inteiro resultante (32). O resultado é um int64 e um objeto do tipo error, que nós vamos ignorar neste caso porque vamos assumir que as pessoas do Unicode sabem escrever números hexadecimais.

➍ Os valores devolvidos são o código convertido de int64 para rune, e o segundo campo, que contém o nome do caractere.

Podemos rodar o teste para conferir o trabalho até aqui (com a opção -v para ver mais detalhes):

$ go test -v
=== RUN TestAnalisarLinha
--- PASS: TestAnalisarLinha (0.00s)
PASS
ok  	github.com/ThoughtWorksInc/sinais	0.012s

Assim completamos o passo 2. Hora e ler o Passo 3.