/*
 * 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 client

import (
	"reflect"
	"testing"

	"github.com/apache/iotdb-client-go/rpc"
)

func createIoTDBRpcDataSet() *IoTDBRpcDataSet {
	columns := []string{"root.ln.device1.restart_count", "root.ln.device1.price", "root.ln.device1.tick_count", "root.ln.device1.temperature", "root.ln.device1.description", "root.ln.device1.status"}
	dataTypes := []string{"INT32", "DOUBLE", "INT64", "FLOAT", "TEXT", "BOOLEAN"}
	columnNameIndex := map[string]int32{
		"root.ln.device1.restart_count": 2,
		"root.ln.device1.price":         1,
		"root.ln.device1.tick_count":    5,
		"root.ln.device1.temperature":   4,
		"root.ln.device1.description":   0,
		"root.ln.device1.status":        3,
	}
	var queyrId int64 = 1
	var sessionId int64 = 1
	var client *rpc.TSIServiceClient = nil
	queryDataSet := rpc.TSQueryDataSet{
		Time:       []byte{0, 0, 1, 118, 76, 52, 0, 236, 0, 0, 1, 118, 76, 52, 25, 228, 0, 0, 1, 118, 76, 52, 41, 42, 0, 0, 1, 118, 76, 52, 243, 148, 0, 0, 1, 118, 76, 95, 98, 255},
		ValueList:  [][]byte{{0, 0, 0, 13, 84, 101, 115, 116, 32, 68, 101, 118, 105, 99, 101, 32, 49, 0, 0, 0, 13, 84, 101, 115, 116, 32, 68, 101, 118, 105, 99, 101, 32, 49, 0, 0, 0, 13, 84, 101, 115, 116, 32, 68, 101, 118, 105, 99, 101, 32, 49, 0, 0, 0, 13, 84, 101, 115, 116, 32, 68, 101, 118, 105, 99, 101, 32, 49, 0, 0, 0, 13, 84, 101, 115, 116, 32, 68, 101, 118, 105, 99, 101, 32, 49}, {64, 159, 16, 204, 204, 204, 204, 205, 64, 159, 16, 204, 204, 204, 204, 205, 64, 159, 16, 204, 204, 204, 204, 205, 64, 159, 16, 204, 204, 204, 204, 205, 64, 159, 16, 204, 204, 204, 204, 205}, {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, {1, 1, 1, 1, 1}, {65, 65, 153, 154, 65, 65, 153, 154, 65, 65, 153, 154, 65, 65, 153, 154, 65, 65, 153, 154}, {0, 0, 0, 0, 0, 50, 220, 213, 0, 0, 0, 0, 0, 50, 220, 213, 0, 0, 0, 0, 0, 50, 220, 213, 0, 0, 0, 0, 0, 50, 220, 213, 0, 0, 0, 0, 0, 50, 220, 213}},
		BitmapList: [][]byte{{248}, {248}, {248}, {248}, {248}, {248}},
	}
	return NewIoTDBRpcDataSet("select * from root.ln.device1", columns, dataTypes, columnNameIndex, queyrId, client, sessionId, &queryDataSet, false, DefaultFetchSize)
}

func TestIoTDBRpcDataSet_getColumnType(t *testing.T) {
	type args struct {
		columnName string
	}

	ds := createIoTDBRpcDataSet()
	closedDataSet := createIoTDBRpcDataSet()
	closedDataSet.Close()
	tests := []struct {
		name    string
		dataSet *IoTDBRpcDataSet
		args    args
		want    TSDataType
	}{
		{
			name:    "Normal",
			dataSet: ds,
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: INT64,
		}, {
			name:    "Closed",
			dataSet: closedDataSet,
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: UNKNOW,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := tt.dataSet
			if got := s.getColumnType(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getColumnType() = %v, want %v", got, tt.want)
			}
			s.Close()
		})
	}
}

func TestIoTDBRpcDataSet_getColumnIndex(t *testing.T) {
	type args struct {
		columnName string
	}
	closedDataSet := createIoTDBRpcDataSet()
	closedDataSet.Close()
	tests := []struct {
		name    string
		dataset *IoTDBRpcDataSet
		args    args
		want    int32
	}{
		{
			name:    "Normal",
			dataset: createIoTDBRpcDataSet(),
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: 5,
		}, {
			name:    "Closed",
			dataset: closedDataSet,
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: -1,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := tt.dataset
			if got := s.getColumnIndex(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getColumnIndex() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_isNull(t *testing.T) {
	type args struct {
		columnIndex int
		rowIndex    int
	}
	ds := createIoTDBRpcDataSet()
	ds.next()

	tests := []struct {
		name string
		args args
		want bool
	}{
		{
			name: "Normal",
			args: args{
				columnIndex: 0,
				rowIndex:    0,
			},
			want: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.isNull(tt.args.columnIndex, tt.args.rowIndex); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.isNull() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getValue(t *testing.T) {

	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want interface{}
	}{
		{
			name: "restart_count",
			args: args{
				columnName: "root.ln.device1.restart_count",
			},
			want: int32(1),
		}, {
			name: "tick_count",
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: int64(3333333),
		}, {
			name: "price",
			args: args{
				columnName: "root.ln.device1.price",
			},
			want: float64(1988.2),
		}, {
			name: "temperature",
			args: args{
				columnName: "root.ln.device1.temperature",
			},
			want: float32(12.1),
		}, {
			name: "description",
			args: args{
				columnName: "root.ln.device1.description",
			},
			want: "Test Device 1",
		}, {
			name: "status",
			args: args{
				columnName: "root.ln.device1.status",
			},
			want: true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getValue(tt.args.columnName); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("IoTDBRpcDataSet.getValue() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_scan(t *testing.T) {
	type args struct {
		dest []interface{}
	}

	type want struct {
		err    error
		values []interface{}
	}

	var restartCount int32
	var price float64
	var tickCount int64
	var temperature float32
	var description string
	var status bool

	var restartCountStr string
	var priceStr string
	var tickCountStr string
	var temperatureStr string
	var descriptionStr string
	var statusStr string

	var wantRestartCount int32 = 1
	var wantPrice float64 = 1988.2
	var wantTickCount int64 = 3333333
	var wantTemperature float32 = 12.1
	var wantDescription string = "Test Device 1"
	var wantStatus bool = true

	var wantRestartCountStr string = "1"
	var wantPriceStr string = "1988.2"
	var wantTickCountStr string = "3333333"
	var wantTemperatureStr string = "12.1"
	var wantDescriptionStr string = "Test Device 1"
	var wantStatusStr string = "true"

	tests := []struct {
		name string
		args args
		want want
	}{
		{
			name: "Normal",
			args: args{
				dest: []interface{}{&restartCount, &price, &tickCount, &temperature, &description, &status},
			},
			want: want{
				err:    nil,
				values: []interface{}{&wantRestartCount, &wantPrice, &wantTickCount, &wantTemperature, &wantDescription, &wantStatus},
			},
		}, {
			name: "String",
			args: args{
				dest: []interface{}{&restartCountStr, &priceStr, &tickCountStr, &temperatureStr, &descriptionStr, &statusStr},
			},
			want: want{
				err:    nil,
				values: []interface{}{&wantRestartCountStr, &wantPriceStr, &wantTickCountStr, &wantTemperatureStr, &wantDescriptionStr, &wantStatusStr},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if err := s.scan(tt.args.dest...); err != tt.want.err {
				t.Errorf("IoTDBRpcDataSet.scan() error = %v, wantErr %v", err, tt.want.err)
			}
			if got := tt.args.dest; !reflect.DeepEqual(got, tt.want.values) {
				t.Errorf("IoTDBRpcDataSet.scan(), dest = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_GetTimestamp(t *testing.T) {
	tests := []struct {
		name string
		want int64
	}{
		{
			name: "GetTimestamp",
			want: 1607596245228,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.GetTimestamp(); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.GetTimestamp() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getText(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		{
			name: "restart_count",
			args: args{
				columnName: "root.ln.device1.restart_count",
			},
			want: "1",
		}, {
			name: "price",
			args: args{
				columnName: "root.ln.device1.price",
			},
			want: "1988.2",
		}, {
			name: "tick_count",
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: "3333333",
		}, {
			name: "temperature",
			args: args{
				columnName: "root.ln.device1.temperature",
			},
			want: "12.1",
		}, {
			name: "description",
			args: args{
				columnName: "root.ln.device1.description",
			},
			want: "Test Device 1",
		}, {
			name: "status",
			args: args{
				columnName: "root.ln.device1.status",
			},
			want: "true",
		}, {
			name: TimestampColumnName,
			args: args{
				columnName: TimestampColumnName,
			},
			want: "2020-12-10T18:30:45+08:00",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getText(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getText() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getBool(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want bool
	}{
		{
			name: "status",
			args: args{
				columnName: "root.ln.device1.status",
			},
			want: true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getBool(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getBool() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getFloat(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want float32
	}{
		{
			name: "temperature",
			args: args{
				columnName: "root.ln.device1.temperature",
			},
			want: 12.1,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getFloat(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getFloat() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getDouble(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want float64
	}{
		{
			name: "price",
			args: args{
				columnName: "root.ln.device1.price",
			},
			want: 1988.2,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getDouble(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getDouble() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getInt32(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want int32
	}{
		{
			name: "restart_count",
			args: args{
				columnName: "root.ln.device1.restart_count",
			},
			want: 1,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getInt32(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getInt32() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getInt64(t *testing.T) {
	type args struct {
		columnName string
	}
	tests := []struct {
		name string
		args args
		want int64
	}{
		{
			name: "tick_count",
			args: args{
				columnName: "root.ln.device1.tick_count",
			},
			want: 3333333,
		}, {
			name: TimestampColumnName,
			args: args{
				columnName: TimestampColumnName,
			},
			want: 1607596245228,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if got := s.getInt64(tt.args.columnName); got != tt.want {
				t.Errorf("IoTDBRpcDataSet.getInt64() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_getRowRecord(t *testing.T) {
	tests := []struct {
		name    string
		want    *RowRecord
		wantErr bool
	}{
		{
			name: "",
			want: &RowRecord{
				timestamp: 0,
				fields: []*Field{
					&Field{
						name:     "root.ln.device1.restart_count",
						dataType: INT32,
						value:    int32(1),
					}, &Field{
						name:     "root.ln.device1.price",
						dataType: DOUBLE,
						value:    float64(1988.2),
					}, &Field{
						name:     "root.ln.device1.tick_count",
						dataType: INT64,
						value:    int64(3333333),
					}, &Field{
						name:     "root.ln.device1.temperature",
						dataType: FLOAT,
						value:    float32(12.1),
					}, &Field{
						name:     "root.ln.device1.description",
						dataType: TEXT,
						value:    string("Test Device 1"),
					}, &Field{
						name:     "root.ln.device1.status",
						dataType: BOOLEAN,
						value:    bool(true),
					},
				},
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			got, err := s.getRowRecord()
			if (err != nil) != tt.wantErr {
				t.Errorf("IoTDBRpcDataSet.getRowRecord() error = %v, wantErr %v", err, tt.wantErr)
				return
			}

			match := true
			for i := 0; i < len(got.fields); i++ {
				gotField := got.fields[i]
				wantField := tt.want.fields[i]

				if gotField.dataType != wantField.dataType || gotField.name != wantField.name || gotField.value != wantField.value {
					match = false

				}
			}
			if !match {
				t.Errorf("IoTDBRpcDataSet.getRowRecord() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestIoTDBRpcDataSet_Close(t *testing.T) {

	tests := []struct {
		name    string
		wantErr bool
	}{
		{
			name:    "",
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			s := createIoTDBRpcDataSet()
			s.next()
			if err := s.Close(); (err != nil) != tt.wantErr {
				t.Errorf("IoTDBRpcDataSet.Close() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}
