blob: ea9e846fc82731782cb226e6c38a0f5b72917187 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vom_test
import (
"bytes"
"fmt"
"testing"
"v.io/v23/vdl"
"v.io/v23/vom"
"v.io/v23/vom/vomtest"
)
func TestEncoder(t *testing.T) {
for _, test := range vomtest.AllPass() {
testEncoder(t, "[go value]", test, test.Value.Interface())
vv, err := vdl.ValueFromReflect(test.Value)
if err != nil {
t.Errorf("%s: ValueFromReflect failed: %v", test.Name(), err)
continue
}
testEncoder(t, "[vdl.Value]", test, vv)
}
}
func testEncoder(t *testing.T, pre string, test vomtest.Entry, value interface{}) {
// Test vom.NewEncoder.
{
var buf bytes.Buffer
name := fmt.Sprintf("%s %s", pre, test.Name())
enc := vom.NewVersionedEncoder(test.Version, &buf)
if err := enc.Encode(value); err != nil {
t.Errorf("%s: Encode failed: %v", name, err)
return
}
if got, want := buf.Bytes(), test.Bytes(); !bytes.Equal(got, want) {
t.Errorf("%s\nGOT %x\nWANT %x", name, got, want)
return
}
}
// Test vom.NewEncoderWithTypeEncoder.
{
var buf, bufT bytes.Buffer
name := fmt.Sprintf("%s (with TypeEncoder) %s", pre, test.Name())
encT := vom.NewVersionedTypeEncoder(test.Version, &bufT)
enc := vom.NewVersionedEncoderWithTypeEncoder(test.Version, &buf, encT)
if err := enc.Encode(value); err != nil {
t.Errorf("%s: Encode failed: %v", name, err)
return
}
if got, want := bufT.Bytes(), test.TypeBytes(); !bytes.Equal(got, want) {
t.Errorf("%s TYPE\nGOT %x\nWANT %x", name, got, want)
return
}
if got, want := buf.Bytes(), test.ValueBytes(); !bytes.Equal(got, want) {
t.Errorf("%s VALUE\nGOT %x\nWANT %x", name, got, want)
return
}
}
// Test single-shot vom.Encode.
{
name := fmt.Sprintf("%s (single-shot) %s", pre, test.Name())
buf, err := vom.VersionedEncode(test.Version, value)
if err != nil {
t.Errorf("%s: Encode failed: %v", name, err)
return
}
if got, want := buf, test.Bytes(); !bytes.Equal(got, want) {
t.Errorf("%s\nGOT %x\nWANT %x", name, got, want)
return
}
}
}