package assert

import (
	"v2ray.com/core/common/net"
)

func (v *Assert) Destination(value net.Destination) *DestinationSubject {
	return &DestinationSubject{
		Subject: Subject{
			disp: value.String(),
			a:    v,
		},
		value: value,
	}
}

type DestinationSubject struct {
	Subject
	value net.Destination
}

func (v *DestinationSubject) IsTCP() {
	if v.value.Network != net.Network_TCP {
		v.Fail("is", "a TCP destination")
	}
}

func (v *DestinationSubject) IsNotTCP() {
	if v.value.Network == net.Network_TCP {
		v.Fail("is not", "a TCP destination")
	}
}

func (v *DestinationSubject) IsUDP() {
	if v.value.Network != net.Network_UDP {
		v.Fail("is", "a UDP destination")
	}
}

func (v *DestinationSubject) IsNotUDP() {
	if v.value.Network == net.Network_UDP {
		v.Fail("is not", "a UDP destination")
	}
}

func (v *DestinationSubject) EqualsString(another string) {
	if v.value.String() != another {
		v.Fail("not equals to string", another)
	}
}

func (v *DestinationSubject) Equals(another net.Destination) {
	if v.value != another {
		v.Fail("not equals to", another.String())
	}
}

func (v *DestinationSubject) HasAddress() *AddressSubject {
	return v.a.Address(v.value.Address)
}

func (v *DestinationSubject) HasPort() *PortSubject {
	return v.a.Port(v.value.Port)
}
