package fileutil

import (
	"testing"
	log "tiloader/pkg/logutil"
)

func compareDescFile(x *DescFile, y *DescFile) bool {
	if x.DataFileName != y.DataFileName || x.Method != y.Method || x.TableName != y.TableName {
		return false
	}
	if len(x.Cols) != len(y.Cols) {
		return false
	}
	if (x.Cols == nil) != (y.Cols == nil) {
		return false
	}
	for i, v := range x.Cols {
		if v != y.Cols[i] {
			return false
		}
	}
	return true
}

func TestParse(t *testing.T) {
	log.InitLog("tiloader.log", "tiloader_err.log")
	var desc_files []string
	desc_files = []string{"desc_file_test1.desc", "desc_file_test2.desc", "desc_file_test3.desc", "desc_file_test4.desc", "desc_file_test5.desc", "desc_file_test6.desc"}
	DescFileParser := DescFileParser{}
	for key, value := range desc_files {
		switch key {
		case 0:
			//测试append正确配置文件是否能正常解析
			CorrectDescFile := DescFile{DataFileName: "emp.txt", TableName: "scott.emp", Method: APPEND, Cols: []ColInfo{{"EMPNO", 1, 4}, {"ENAME", 5, 14}, {"JOB", 15, 23}, {"MGR", 24, 27}, {"HIREDATE", 28, 44}, {"SAL", 45, 53}, {"COMM", 54, 62}, {"DEPTNO", 63, 66}}}
			DescFile, err := DescFileParser.Parse(value)
			if err != nil {
				t.Errorf("Test parse file %v: Failed to parse the correct description file", value)
				break
			}
			//比对解析结果与正确结果
			if !compareDescFile(&CorrectDescFile, &DescFile) {
				t.Errorf("Test parse file %v: Error parsing the correct description file,Wrong result", value)
				break
			}
		case 1:
			//测试replace正确配置文件是否能正常解析
			CorrectDescFile := DescFile{DataFileName: "emp.txt", TableName: "scott.emp", Method: REPLACE, Cols: []ColInfo{{"EMPNO", 1, 4}, {"ENAME", 5, 14}, {"JOB", 15, 23}, {"MGR", 24, 27}, {"HIREDATE", 28, 44}, {"SAL", 45, 53}, {"COMM", 54, 62}, {"DEPTNO", 63, 66}}}
			DescFile, err := DescFileParser.Parse(value)
			if err != nil {
				t.Errorf("Test parse file %v: Failed to parse the correct description file", value)
				break
			}
			//比对解析结果与正确结果
			if !compareDescFile(&CorrectDescFile, &DescFile) {
				t.Errorf("Test parse file %v: Error parsing the correct description file,Wrong result", value)
				break
			}
		case 2:
			//测试关键字错误是否能正确判断
			_, err := DescFileParser.Parse(value)
			if err == nil {
				t.Errorf("Test parse file %v:Description File keyword error,but function returns no error ", value)
				break
			}
		case 3:
			//测试字段偏移量错误是否能正确判断
			_, err := DescFileParser.Parse(value)
			if err == nil {
				t.Errorf("Test parse file %v:Description File position error,but function returns no error ", value)
				break
			}
		case 4:
			//测试没有正确以括号结束描述文件
			_, err := DescFileParser.Parse(value)
			if err == nil {
				t.Errorf("Test parse file %v:Description file does not end correctly,but function returns no error ", value)
				break
			}
		case 5:
			//测试关键字混合大小写、关键字间使用多个空格的正确配置文件是否能正常解析
			CorrectDescFile := DescFile{DataFileName: "emp.txt", TableName: "scott.emp", Method: APPEND, Cols: []ColInfo{{"EMPNO", 1, 4}, {"ENAME", 5, 14}, {"JOB", 15, 23}, {"MGR", 24, 27}, {"HIREDATE", 28, 44}, {"SAL", 45, 53}, {"COMM", 54, 62}, {"DEPTNO", 63, 66}}}
			DescFile, err := DescFileParser.Parse(value)
			if err != nil {
				t.Errorf("Test parse file %v: Failed to parse the correct description file", value)
				break
			}
			//比对解析结果与正确结果
			if !compareDescFile(&CorrectDescFile, &DescFile) {
				t.Errorf("Test parse file %v: Error parsing the correct description file,Wrong result", value)
				break
			}
		}
	}
}
