Files
tia-love/internal/audio/wav_test.go
T

54 lines
1.7 KiB
Go

package audio
import (
"encoding/binary"
"testing"
)
// wavBytes merakit WAV minimal (RIFF/WAVE + fmt + data) untuk pengujian parser.
func wavBytes(channels, bits, rate int, data []byte) []byte {
b := make([]byte, 0, 44+len(data))
b = append(b, "RIFF"...)
b = binary.LittleEndian.AppendUint32(b, uint32(36+len(data)))
b = append(b, "WAVE"...)
b = append(b, "fmt "...)
b = binary.LittleEndian.AppendUint32(b, 16) // ukuran fmt
b = binary.LittleEndian.AppendUint16(b, 1) // PCM
b = binary.LittleEndian.AppendUint16(b, uint16(channels)) // kanal
b = binary.LittleEndian.AppendUint32(b, uint32(rate)) // sample rate
b = binary.LittleEndian.AppendUint32(b, uint32(rate*channels*bits/8)) // byte rate
b = binary.LittleEndian.AppendUint16(b, uint16(channels*bits/8)) // block align
b = binary.LittleEndian.AppendUint16(b, uint16(bits)) // bit/sample
b = append(b, "data"...)
b = binary.LittleEndian.AppendUint32(b, uint32(len(data)))
return append(b, data...)
}
func TestParsePCM(t *testing.T) {
pcm := []byte{1, 0, 2, 0, 3, 0, 4, 0}
got, err := ParsePCM(wavBytes(1, 16, 44100, pcm))
if err != nil {
t.Fatalf("wav valid ditolak: %v", err)
}
if string(got) != string(pcm) {
t.Fatalf("PCM tidak sama: %v", got)
}
cases := []struct {
name string
b []byte
}{
{"bukan RIFF", []byte("NOPE-nope-nope-nope-nope-nope-nope-nope-nope")},
{"stereo", wavBytes(2, 16, 44100, pcm)},
{"sample rate salah", wavBytes(1, 16, 48000, pcm)},
{"bit depth salah", wavBytes(1, 8, 44100, pcm)},
{"data kosong", wavBytes(1, 16, 44100, nil)},
}
for _, c := range cases {
if _, err := ParsePCM(c.b); err == nil {
t.Errorf("%s: seharusnya error", c.name)
}
}
}