package assert

import (
	"bytes"

	"fmt"

	"v2ray.com/core/common/serial"
)

func (v *Assert) Bytes(value []byte) *BytesSubject {
	return &BytesSubject{
		Subject: Subject{
			disp: serial.BytesToHexString(value),
			a:    v,
		},
		value: value,
	}
}

type BytesSubject struct {
	Subject
	value []byte
}

func (subject *BytesSubject) Equals(expectation []byte) {
	if len(subject.value) != len(expectation) {
		subject.FailWithMessage(fmt.Sprint("Bytes arrays have differen size: expected ", len(expectation), ", actual ", len(subject.value)))
		return
	}
	for idx, b := range expectation {
		if subject.value[idx] != b {
			subject.FailWithMessage(fmt.Sprint("Bytes are different: ", b, " vs ", subject.value[idx]))
			return
		}
	}
}

func (subject *BytesSubject) NotEquals(expectation []byte) {
	if bytes.Equal(subject.value, expectation) {
		subject.Fail("is not equal to", serial.BytesToHexString(expectation))
	}
}