54 lines
1.7 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|