package worker

import (
	"bytes"
	"testing"
)

var (
	outpackcases = map[uint32]map[string]string{
		dtCanDo: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x01\x00\x00\x00\x01a",
			"data": "a",
		},
		dtCanDoTimeout: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x17\x00\x00\x00\x06a\x00\x00\x00\x00\x01",
			"data": "a\x00\x00\x00\x00\x01",
		},
		dtCantDo: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x02\x00\x00\x00\x01a",
			"data": "a",
		},
		dtResetAbilities: map[string]string{
			"src": "\x00REQ\x00\x00\x00\x03\x00\x00\x00\x00",
		},
		dtPreSleep: map[string]string{
			"src": "\x00REQ\x00\x00\x00\x04\x00\x00\x00\x00",
		},
		dtGrabJob: map[string]string{
			"src": "\x00REQ\x00\x00\x00\x09\x00\x00\x00\x00",
		},
		dtGrabJobUniq: map[string]string{
			"src": "\x00REQ\x00\x00\x00\x1E\x00\x00\x00\x00",
		},
		dtWorkData: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x1C\x00\x00\x00\x03a\x00b",
			"data": "a\x00b",
		},
		dtWorkWarning: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x1D\x00\x00\x00\x03a\x00b",
			"data": "a\x00b",
		},
		dtWorkStatus: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x0C\x00\x00\x00\x08a\x0050\x00100",
			"data": "a\x0050\x00100",
		},
		dtWorkComplete: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x0D\x00\x00\x00\x03a\x00b",
			"data": "a\x00b",
		},
		dtWorkFail: map[string]string{
			"src":    "\x00REQ\x00\x00\x00\x0E\x00\x00\x00\x01a",
			"handle": "a",
		},
		dtWorkException: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x19\x00\x00\x00\x03a\x00b",
			"data": "a\x00b",
		},
		dtSetClientId: map[string]string{
			"src":  "\x00REQ\x00\x00\x00\x16\x00\x00\x00\x01a",
			"data": "a",
		},
		dtAllYours: map[string]string{
			"src": "\x00REQ\x00\x00\x00\x18\x00\x00\x00\x00",
		},
	}
)

func TestOutPack(t *testing.T) {
	for k, v := range outpackcases {
		outpack := getOutPack()
		outpack.dataType = k
		if handle, ok := v["handle"]; ok {
			outpack.handle = handle
		}
		if data, ok := v["data"]; ok {
			outpack.data = []byte(data)
		}
		data := outpack.Encode()
		if bytes.Compare([]byte(v["src"]), data) != 0 {
			t.Errorf("%d: %X expected, %X got.", k, v["src"], data)
		}
	}
}

func BenchmarkEncode(b *testing.B) {
	for i := 0; i < b.N; i++ {
		for k, v := range outpackcases {
			outpack := getOutPack()
			outpack.dataType = k
			if handle, ok := v["handle"]; ok {
				outpack.handle = handle
			}
			if data, ok := v["data"]; ok {
				outpack.data = []byte(data)
			}
			outpack.Encode()
		}
	}
}