/*
NAME
  rtp_test.go

DESCRIPTION
  See Readme.md

AUTHOR
  Saxon Nelson-Milton (saxon@ausocean.org)

LICENSE
  rtp_test.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)

  It is free software: you can redistribute it and/or modify them
  under the terms of the GNU General Public License as published by the
  Free Software Foundation, either version 3 of the License, or (at your
  option) any later version.

  It is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License
  along with revid in gpl.txt. If not, see http://www.gnu.org/licenses.
*/

package rtp

import (
	"reflect"
	"testing"
)

// TODO (saxon): add more tests
var rtpTests = []struct {
	num  int
	pkt  Pkt
	want []byte
}{
	// No padding, no CSRC and no extension.
	{
		num: 1,
		pkt: Pkt{
			V:    2,
			p:    false,
			X:    false,
			CC:   0,
			M:    false,
			PT:   6,
			SN:   167,
			TS:   160,
			SSRC: 10,
			Payload: []byte{
				0x00, 0x01, 0x07, 0xf0,
				0x56, 0x37, 0x0a, 0x0f,
			},
		},
		want: []byte{
			0x80, 0x06, 0x00, 0xa7,
			0x00, 0x00, 0x00, 0xa0,
			0x00, 0x00, 0x00, 0x0a,
			0x00, 0x01, 0x07, 0xf0,
			0x56, 0x37, 0x0a, 0x0f,
		},
	},
	// With padding.
	{
		num: 2,
		pkt: Pkt{
			V:    2,
			p:    true,
			X:    false,
			CC:   0,
			M:    false,
			PT:   6,
			SN:   167,
			TS:   160,
			SSRC: 10,
			Payload: []byte{
				0x00, 0x01, 0x07, 0xf0,
				0x56, 0x37, 0x0a, 0x0f,
			},
			Padding: []byte{
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x0b,
			},
		},
		want: []byte{
			0xa0, 0x06, 0x00, 0xa7,
			0x00, 0x00, 0x00, 0xa0,
			0x00, 0x00, 0x00, 0x0a,
			0x00, 0x01, 0x07, 0xf0,
			0x56, 0x37, 0x0a, 0x0f,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x0b,
		},
	},
	// With padding and CSRC.
	{
		num: 3,
		pkt: Pkt{
			V:    2,
			p:    true,
			X:    false,
			CC:   2,
			M:    false,
			PT:   6,
			SN:   167,
			TS:   160,
			SSRC: 10,
			CSRC: [][4]byte{
				{0x01, 0x02, 0x03, 0x04},
				{0x05, 0x06, 0x07, 0x08},
			},
			Payload: []byte{
				0x00, 0x01, 0x07, 0xf0,
				0x56, 0x37, 0x0a, 0x0f,
			},
			Padding: []byte{
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x0b,
			},
		},
		want: []byte{
			0xa2, 0x06, 0x00, 0xa7,
			0x00, 0x00, 0x00, 0xa0,
			0x00, 0x00, 0x00, 0x0a,
			0x01, 0x02, 0x03, 0x04,
			0x05, 0x06, 0x07, 0x08,
			0x00, 0x01, 0x07, 0xf0,
			0x56, 0x37, 0x0a, 0x0f,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x0b,
		},
	},
	// With padding, CSRC and extension.
	{
		num: 4,
		pkt: Pkt{
			V:    2,
			p:    true,
			X:    true,
			CC:   2,
			M:    false,
			PT:   6,
			SN:   167,
			TS:   160,
			SSRC: 10,
			CSRC: [][4]byte{
				{0x01, 0x02, 0x03, 0x04},
				{0x05, 0x06, 0x07, 0x08},
			},
			Extension: ExtensionHeader{
				ID: 15,
				Header: [][4]byte{
					{0x01, 0x02, 0x03, 0x04},
					{0x05, 0x06, 0x07, 0x08},
				},
			},
			Payload: []byte{
				0x00, 0x01, 0x07, 0xf0,
				0x56, 0x37, 0x0a, 0x0f,
			},
			Padding: []byte{
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x00, 0x00,
				0x00, 0x00, 0x0b,
			},
		},
		want: []byte{
			0xb2, 0x06, 0x00, 0xa7,
			0x00, 0x00, 0x00, 0xa0,
			0x00, 0x00, 0x00, 0x0a,
			0x01, 0x02, 0x03, 0x04,
			0x05, 0x06, 0x07, 0x08,
			0x00, 0x0f, 0x00, 0x02,
			0x01, 0x02, 0x03, 0x04,
			0x05, 0x06, 0x07, 0x08,
			0x00, 0x01, 0x07, 0xf0,
			0x56, 0x37, 0x0a, 0x0f,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x0b,
		},
	},
}

func TestRtpPktToByteSlice(t *testing.T) {
	for _, test := range rtpTests {
		got := test.pkt.Bytes(nil)
		if !reflect.DeepEqual(got, test.want) {
			t.Errorf("unexpected error for test %v: \ngot :%v\n want:%v\n", test.num, got,
				test.want)
		}
	}
}