// 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

import (
	"bytes"
	"fmt"
	"testing"

	"v.io/v23/vom/testdata/data81"
	"v.io/v23/vom/testdata/types"
)

func TestEncoder81(t *testing.T) {
	testEncoder(t, Version81, data81.Tests)
}

func testEncoder(t *testing.T, version Version, tests []types.TestCase) {
	for _, test := range tests {
		name := test.Name + " [vdl.Value]"
		testEncode(t, version, name, test.Value, test.HexVersion+test.HexType+test.HexValue)
		name = test.Name + " [vdl.Value] (with TypeEncoder)"
		testEncodeWithTypeEncoder(t, version, name, test.Value, test.HexVersion, test.HexType, test.HexValue)

		// Convert into Go value for the rest of our tests.
		goValue, err := toGoValue(test.Value)
		if err != nil {
			t.Errorf("%s: %v", name, err)
			continue
		}

		name = test.Name + " [go value]"
		testEncode(t, version, name, goValue, test.HexVersion+test.HexType+test.HexValue)
		name = test.Name + " [go value] (with TypeEncoder)"
		testEncodeWithTypeEncoder(t, version, name, goValue, test.HexVersion, test.HexType, test.HexValue)
	}
}

func testEncode(t *testing.T, version Version, name string, value interface{}, hex string) {
	for _, singleShot := range []bool{false, true} {
		var bin []byte
		if !singleShot {
			var buf bytes.Buffer
			encoder := NewVersionedEncoder(version, &buf)
			if err := encoder.Encode(value); err != nil {
				t.Errorf("%s: Encode(%#v) failed: %v", name, value, err)
				return
			}
			bin = buf.Bytes()
		} else {
			name += " (single-shot)"
			var err error
			bin, err = VersionedEncode(version, value)
			if err != nil {
				t.Errorf("%s: Encode(%#v) failed: %v", name, value, err)
				return
			}
		}
		got, want := fmt.Sprintf("%x", bin), hex
		match, err := matchHexPat(got, want)
		if err != nil {
			t.Error(err)
		}
		if !match {
			t.Errorf("%s: Encode(%#v)\n GOT %s\nWANT %s", name, value, got, want)
		}
	}
}

func testEncodeWithTypeEncoder(t *testing.T, version Version, name string, value interface{}, hexversion, hextype, hexvalue string) {
	var buf, typebuf bytes.Buffer
	typeenc := NewVersionedTypeEncoder(version, &typebuf)
	encoder := NewVersionedEncoderWithTypeEncoder(version, &buf, typeenc)
	if err := encoder.Encode(value); err != nil {
		t.Errorf("%s: Encode(%#v) failed: %v", name, value, err)
		return
	}
	got, want := fmt.Sprintf("%x", typebuf.Bytes()), hexversion+hextype
	match, err := matchHexPat(got, want)
	if err != nil {
		t.Error(err)
	}
	if !match && len(hextype) > 0 {
		t.Errorf("%s: EncodeType(%#v)\nGOT %s\nWANT %s", name, value, got, want)
	}
	got, want = fmt.Sprintf("%x", buf.Bytes()), hexversion+hexvalue
	match, err = matchHexPat(got, want)
	if err != nil {
		t.Error(err)
	}
	if !match {
		t.Errorf("%s: Encode(%#v)\nGOT %s\nWANT %s", name, value, got, want)
	}
}
