package ident

import (
	"testing"

	"github.com/go-test/deep"
)

// TestResponseDecode exercises the response decode implementation.
func TestResponseDecode(t *testing.T) {
	for i, te := range []struct {
		data string
		want *Response
	}{
		// 0: Everything okay, server returned error.
		{"123, 234 : ERROR : INVALID-PORT", &Response{
			ServerPort: 123,
			ClientPort: 234,
			Error:      InvalidPort,
		}},
		// 1: Everything okay, server returned error but also added some weird
		// whitespace.
		{" 123\t ,234  :ERROR:  NO-USER   ", &Response{
			ServerPort: 123,
			ClientPort: 234,
			Error:      NoUser,
		}},
		// 2: Everything okay, server returned a simple ident response.
		{"123,234 : USERID : UNIX :q3k", &Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "UNIX",
				CharacterSet:    "US-ASCII",
				UserID:          "q3k",
			},
		}},
		// 3: Everything okay, server returned an ident response with a
		// charset.
		{"123,234 : USERID : UNIX, PETSCII :q3k", &Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "UNIX",
				CharacterSet:    "PETSCII",
				UserID:          "q3k",
			},
		}},
	} {
		res, err := decodeResponse([]byte(te.data))
		if err != nil {
			if te.want != nil {
				t.Errorf("%d: wanted result, got err %v", i, err)
			}
		} else {
			if diff := deep.Equal(te.want, res); diff != nil {
				t.Errorf("%d: %s", i, diff)
			}
		}
	}
}

// TestResponseEncode exercises the encode method of Response.
func TestResponseEncode(t *testing.T) {
	for i, te := range []struct {
		r    *Response
		want string
	}{
		/// Standard features
		// 0: simple error
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Error:      InvalidPort,
		}, "123,234:ERROR:INVALID-PORT\r\n"},
		// 1: simple response, stripped US-ASCII
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "UNIX",
				UserID:          "q3k",
			},
		}, "123,234:USERID:UNIX:q3k\r\n"},
		// 2: simple response, stripped US-ASCII
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "UNIX",
				CharacterSet:    "US-ASCII",
				UserID:          "q3k",
			},
		}, "123,234:USERID:UNIX:q3k\r\n"},

		/// Unusual features
		// 3: unusual response
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "SUN",
				CharacterSet:    "PETSCII",
				UserID:          "q3k",
			},
		}, "123,234:USERID:SUN,PETSCII:q3k\r\n"},
		// 4: non-standard error code
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Error:      ErrorResponse("XNOMANA"),
		}, "123,234:ERROR:XNOMANA\r\n"},

		/// Errors
		// 5: invalid error code (should return nil)
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Error:      ErrorResponse("NOT ENOUGH MANA"),
		}, ""},
		// 6: no error/ident set (should return nil)
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
		}, ""},
		// 7: both error and ident set (should return nil)
		{&Response{
			ServerPort: 123,
			ClientPort: 234,
			Ident: &IdentResponse{
				OperatingSystem: "UNIX",
				CharacterSet:    "US-ASCII",
				UserID:          "q3k",
			},
			Error: InvalidPort,
		}, ""},
	} {
		if want, got := te.want, string(te.r.encode()); want != got {
			t.Errorf("%d: wanted %q, got %q", i, want, got)
		}
	}
}
