package net_test

import (
	"testing"

	. "v2ray.com/core/common/net"
	. "v2ray.com/core/common/net/testing"
	. "v2ray.com/ext/assert"
)

func TestTCPDestination(t *testing.T) {
	assert := With(t)

	dest := TCPDestination(IPAddress([]byte{1, 2, 3, 4}), 80)
	assert(dest, IsTCP)
	assert(dest, Not(IsUDP))
	assert(dest.String(), Equals, "tcp:1.2.3.4:80")
}

func TestUDPDestination(t *testing.T) {
	assert := With(t)

	dest := UDPDestination(IPAddress([]byte{0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88}), 53)
	assert(dest, Not(IsTCP))
	assert(dest, IsUDP)
	assert(dest.String(), Equals, "udp:[2001:4860:4860::8888]:53")
}

func TestDestinationParse(t *testing.T) {
	assert := With(t)

	cases := []struct {
		Input  string
		Output Destination
		Error  bool
	}{
		{
			Input:  "tcp:127.0.0.1:80",
			Output: TCPDestination(LocalHostIP, Port(80)),
		},
		{
			Input:  "udp:8.8.8.8:53",
			Output: UDPDestination(IPAddress([]byte{8, 8, 8, 8}), Port(53)),
		},
		{
			Input: "8.8.8.8:53",
			Output: Destination{
				Address: IPAddress([]byte{8, 8, 8, 8}),
				Port:    Port(53),
			},
		},
		{
			Input: ":53",
			Output: Destination{
				Address: AnyIP,
				Port:    Port(53),
			},
		},
		{
			Input: "8.8.8.8",
			Error: true,
		},
		{
			Input: "8.8.8.8:http",
			Error: true,
		},
	}

	for _, testcase := range cases {
		d, err := ParseDestination(testcase.Input)
		if !testcase.Error {
			assert(err, IsNil)
			assert(d, Equals, testcase.Output)
		} else {
			assert(err, IsNotNil)
		}
	}
}