/*
 * 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"
	"time"

	"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, 0)
}

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: time.Unix(0, 1607596245228000000).Format(time.RFC3339),
		},
	}
	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)
			}
		})
	}
}
