/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package hessian

import (
	"fmt"
	"reflect"
	"testing"
	"time"
)

import (
	"github.com/stretchr/testify/assert"
)

func TestEncList(t *testing.T) {
	var (
		list []interface{}
		err  error
		e    *Encoder
		d    *Decoder
		res  interface{}
	)

	e = NewEncoder()
	list = []interface{}{100, 10.001, "hello", []byte{0, 2, 4, 6, 8, 10}, true, nil, false}
	e.Encode(list)
	assert.NotEqual(t, 0, len(e.Buffer()))

	d = NewDecoder(e.Buffer())
	res, err = d.Decode()
	assert.NoError(t, err)
	assert.Equal(t, fmt.Sprintf("%v", list), fmt.Sprintf("%v", res))

	// typed list - int32
	e = NewEncoder()
	list_1 := []int32{1, 2, 3}
	e.Encode(list_1)
	assert.NotEqual(t, 0, len(e.Buffer()))

	d = NewDecoder(e.Buffer())
	res, err = d.Decode()
	assert.NoError(t, err)
	assert.True(t, reflect.DeepEqual(res, list_1))

	// typed list - [][][]int32
	e = NewEncoder()
	list_2 := [][][]int32{{{1, 2, 3}, {4, 5, 6, 7}}, {{8, 9, 10}, {11, 12, 13, 14}}}
	e.Encode(list_2)
	assert.NotEqual(t, 0, len(e.Buffer()))

	d = NewDecoder(e.Buffer())
	res, err = d.Decode()
	assert.NoError(t, err)
	assert.True(t, reflect.DeepEqual(res, list_2))
}

func TestList(t *testing.T) {
	RegisterPOJOs(new(A0), new(A1), new(TypedListTest))

	testDecodeFramework(t, "replyTypedFixedList_0", []string{})
	testDecodeFramework(t, "replyTypedFixedList_1", []string{"1"})
	testDecodeFramework(t, "replyTypedFixedList_7", []string{"1", "2", "3", "4", "5", "6", "7"})
	testDecodeFramework(t, "replyTypedFixedList_8", []string{"1", "2", "3", "4", "5", "6", "7", "8"})
	testDecodeFramework(t, "replyUntypedFixedList_0", []interface{}{})
	testDecodeFramework(t, "replyUntypedFixedList_1", []interface{}{"1"})
	testDecodeFramework(t, "replyUntypedFixedList_7", []interface{}{"1", "2", "3", "4", "5", "6", "7"})
	testDecodeFramework(t, "replyUntypedFixedList_8", []interface{}{"1", "2", "3", "4", "5", "6", "7", "8"})

	testDecodeFramework(t, "customReplyTypedFixedListHasNull", []Object{new(A0), new(A1), nil})
	testDecodeFramework(t, "customReplyTypedVariableListHasNull", []Object{new(A0), new(A1), nil})
	testDecodeFramework(t, "customReplyUntypedFixedListHasNull", []interface{}{new(A0), new(A1), nil})
	testDecodeFramework(t, "customReplyUntypedVariableListHasNull", []interface{}{new(A0), new(A1), nil})

	testDecodeFramework(t, "customReplyTypedFixedList_A0", []*A0{new(A0), new(A0), nil})
	testDecodeFramework(t, "customReplyTypedVariableList_A0", []*A0{new(A0), new(A0), nil})

	testDecodeFramework(t, "customReplyTypedFixedList_int", []int32{1, 2, 3})
	testDecodeFramework(t, "customReplyTypedVariableList_int", []int32{1, 2, 3})

	testDecodeFramework(t, "customReplyTypedFixedList_long", []int64{1, 2, 3})
	testDecodeFramework(t, "customReplyTypedVariableList_long", []int64{1, 2, 3})

	testDecodeFramework(t, "customReplyTypedFixedList_float", []float64{1, 2, 3})
	testDecodeFramework(t, "customReplyTypedVariableList_float", []float64{1, 2, 3})

	testDecodeFramework(t, "customReplyTypedFixedList_double", []float64{1, 2, 3})
	testDecodeFramework(t, "customReplyTypedVariableList_double", []float64{1, 2, 3})

	testDecodeFramework(t, "customReplyTypedFixedList_short", []int32{1, 2, 3})
	testDecodeFramework(t, "customReplyTypedVariableList_short", []int32{1, 2, 3})

	testDecodeFramework(t, "customReplyTypedFixedList_char", []string{"1", "2", "3"})
	testDecodeFramework(t, "customReplyTypedVariableList_char", []string{"1", "2", "3"})

	testDecodeFramework(t, "customReplyTypedFixedList_boolean", []bool{true, false, true})
	testDecodeFramework(t, "customReplyTypedVariableList_boolean", []bool{true, false, true})

	testDecodeFramework(t, "customReplyTypedFixedList_date", []time.Time{
		time.Unix(1560864, 0),
		time.Unix(1560864, 0), time.Unix(1560864, 0),
	})
	testDecodeFramework(t, "customReplyTypedVariableList_date", []time.Time{
		time.Unix(1560864, 0),
		time.Unix(1560864, 0), time.Unix(1560864, 0),
	})

	testDecodeFramework(t, "customReplyTypedFixedList_arrays", [][][]int32{{{1, 2, 3}, {4, 5, 6, 7}}, {{8, 9, 10}, {11, 12, 13, 14}}})
	testDecodeFramework(t, "customReplyTypedFixedList_A0arrays", [][][]*A0{
		{{new(A0), new(A0), new(A0)}, {new(A0), new(A0), new(A0), nil}},
		{{new(A0)}, {new(A0)}},
	})

	testDecodeFramework(t, "customReplyTypedFixedList_Test", &TypedListTest{A: &A0{}, List: [][]*A0{{new(A0), new(A0)}, {new(A0), new(A0)}}, List1: [][]*A1{{new(A1), new(A1)}, {new(A1), new(A1)}}})

	testDecodeFramework(t, "customReplyTypedFixedList_Object", []Object{new(A0)})
}

func TestListEncode(t *testing.T) {
	RegisterPOJOs(new(A0))

	testJavaDecode(t, "argUntypedFixedList_0", []interface{}{})
	testJavaDecode(t, "argUntypedFixedList_1", []interface{}{"1"})
	testJavaDecode(t, "argUntypedFixedList_7", []interface{}{"1", "2", "3", "4", "5", "6", "7"})
	testJavaDecode(t, "argUntypedFixedList_8", []interface{}{"1", "2", "3", "4", "5", "6", "7", "8"})

	testJavaDecode(t, "customArgUntypedFixedListHasNull", []interface{}{new(A0), new(A1), nil})

	testJavaDecode(t, "customArgTypedFixedList", []*A0{new(A0)})

	testJavaDecode(t, "argTypedFixedList_0", []string{})
	testJavaDecode(t, "argTypedFixedList_7", []string{"1", "2", "3", "4", "5", "6", "7"})

	testJavaDecode(t, "customArgTypedFixedList_short_0", []int8{})
	testJavaDecode(t, "customArgTypedFixedList_short_7", []int8{1, 2, 3, 4, 5, 6, 7})
	testJavaDecode(t, "customArgTypedFixedList_short_0", []int16{})
	testJavaDecode(t, "customArgTypedFixedList_short_7", []int16{1, 2, 3, 4, 5, 6, 7})
	testJavaDecode(t, "customArgTypedFixedList_short_0", []uint16{})
	testJavaDecode(t, "customArgTypedFixedList_short_7", []uint16{1, 2, 3, 4, 5, 6, 7})

	testJavaDecode(t, "customArgTypedFixedList_int_0", []int32{})
	testJavaDecode(t, "customArgTypedFixedList_int_7", []uint32{1, 2, 3, 4, 5, 6, 7})

	testJavaDecode(t, "customArgTypedFixedList_long_0", []int{})
	testJavaDecode(t, "customArgTypedFixedList_long_7", []int{1, 2, 3, 4, 5, 6, 7})
	testJavaDecode(t, "customArgTypedFixedList_long_0", []uint{})
	testJavaDecode(t, "customArgTypedFixedList_long_7", []uint{1, 2, 3, 4, 5, 6, 7})
	testJavaDecode(t, "customArgTypedFixedList_long_0", []int64{})
	testJavaDecode(t, "customArgTypedFixedList_long_7", []int64{1, 2, 3, 4, 5, 6, 7})
	testJavaDecode(t, "customArgTypedFixedList_long_0", []uint64{})
	testJavaDecode(t, "customArgTypedFixedList_long_7", []uint64{1, 2, 3, 4, 5, 6, 7})

	testJavaDecode(t, "customArgTypedFixedList_float_0", []float32{})
	testJavaDecode(t, "customArgTypedFixedList_float_7", []float32{1, 2, 3, 4, 5, 6, 7})

	testJavaDecode(t, "customArgTypedFixedList_double_0", []float64{})
	testJavaDecode(t, "customArgTypedFixedList_double_7", []float64{1, 2, 3, 4, 5, 6, 7})

	testJavaDecode(t, "customArgTypedFixedList_boolean_0", []bool{})
	testJavaDecode(t, "customArgTypedFixedList_boolean_7", []bool{true, false, true, false, true, false, true})

	testJavaDecode(t, "customArgTypedFixedList_date_0", []time.Time{})
	testJavaDecode(t, "customArgTypedFixedList_date_3", []time.Time{
		time.Unix(1560864, 0),
		time.Unix(1560864, 0), time.Unix(1560864, 0),
	})

	testJavaDecode(t, "customArgTypedFixedList_arrays", [][][]int32{{{1, 2, 3}, {4, 5, 6, 7}}, {{8, 9, 10}, {11, 12, 13, 14}}})
	testJavaDecode(t, "customArgTypedFixedList_A0arrays", [][][]*A0{
		{{new(A0), new(A0), new(A0)}, {new(A0), new(A0), new(A0), nil}},
		{{new(A0)}, {new(A0)}},
	})

	testJavaDecode(t, "customArgTypedFixedList_Test", &TypedListTest{A: new(A0), List: [][]*A0{{new(A0), new(A0)}, {new(A0), new(A0)}}, List1: [][]*A1{{new(A1), new(A1)}, {new(A1), new(A1)}}})

	testJavaDecode(t, "customArgTypedFixedList_Object", []Object{new(A0)})
}

type TypedListTest struct {
	A     *A0
	List  [][]*A0
	List1 [][]*A1
}

// JavaClassName  java fully qualified path
func (*TypedListTest) JavaClassName() string {
	return "test.TypedListTest"
}
