list.go 6.2 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1 2 3
package gen

import (
4
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5
	"github.com/easysoft/zendata/src/model"
6
	constant "github.com/easysoft/zendata/src/utils/const"
7
	"math/rand"
8
	"regexp"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10 11 12
	"strings"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
func GenerateList(field *model.DefField) model.FieldValue {
14
	fieldValue := model.FieldValue{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
	GenerateListField(field, &fieldValue)
16 17 18

	return fieldValue
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19

aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
func GenerateListField(field *model.DefField, fieldValue *model.FieldValue) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21
	fieldValue.Field = field.Field
22 23 24
	fieldValue.Precision = field.Precision

	if len(field.Fields) > 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
25 26
		for _, child := range field.Fields {
			childValue := model.FieldValue{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27
			GenerateListField(&child, &childValue)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
28
		}
29
	} else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30
		GenerateFieldValues(field, fieldValue)
31 32 33
	}
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
34
func GenerateFieldValues(field *model.DefField, fieldValue *model.FieldValue) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
	if strings.Index(field.Range, ".txt") > -1 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36
		GenerateFieldValuesFromText(field, fieldValue)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37
	} else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38
		GenerateFieldValuesFromList(field, fieldValue)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39 40 41
	}
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
func GenerateFieldValuesFromList(field *model.DefField, fieldValue *model.FieldValue) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44
	//rang := strings.TrimSpace(field.Range)
	rang := field.Range
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45

46 47
	rangeItems := ParseRange(rang)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
	index := 0
49
	for _, rangeItem := range rangeItems {
50
		if index >= constant.MaxNumb { break }
51
		if rangeItem == "" { continue }
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
52

53
		entry, stepStr, repeat := ParseRangeItem(rangeItem)
54
		typ, desc := ParseEntry(entry)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
		items := make([]interface{}, 0)
57
		if typ == "literal" {
58
			items = GenerateValuesFromLiteral(field, desc, stepStr, repeat)
59
		} else if typ == "interval" {
60
			items = GenerateValuesFromInterval(field, desc, stepStr, repeat)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61 62
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
		fieldValue.Values = append(fieldValue.Values, items...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64 65
		index = index + len(items)
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
66 67

	if len(fieldValue.Values) == 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
68
		fieldValue.Values = append(fieldValue.Values, "N/A")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70 71
}

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
72 73 74
func CheckRangeType(startStr string, endStr string, stepStr string) (string, interface{}, int, bool) {
	rand := false

aaronchen2k2k's avatar
aaronchen2k2k 已提交
75 76 77
	_, errInt1 := strconv.ParseInt(startStr, 0, 64)
	_, errInt2 := strconv.ParseInt(endStr, 0, 64)
	if errInt1 == nil && errInt2 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
78
		var step interface{} = 1
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
79 80
		if strings.ToLower(strings.TrimSpace(stepStr)) != "r" {
			stepInt, errInt3 := strconv.Atoi(stepStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81
			if errInt3 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
82 83
				step = stepInt
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
84 85
		} else {
			rand = true
aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87
		}

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
88 89
		return "int", step, 0, rand

aaronchen2k2k's avatar
aaronchen2k2k 已提交
90 91 92 93
	} else {
		startFloat, errFloat1 := strconv.ParseFloat(startStr, 64)
		_, errFloat2 := strconv.ParseFloat(endStr, 64)
		if errFloat1 == nil && errFloat2 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
94
			var step interface{} = 0.1
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
95 96
			if strings.ToLower(strings.TrimSpace(stepStr)) != "r" {
				stepFloat, errFloat3 := strconv.ParseFloat(stepStr, 64)
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
97
				if errFloat3 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
98 99
					step = stepFloat
				}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
100 101
			} else {
				rand = true
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
102 103
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
104 105
			precision := getPrecision(startFloat, step)

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
106 107
			return "float", step, precision, rand

aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
		} else if len(startStr) == 1 && len(endStr) == 1 {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
109
			var step interface{} = 1
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
110 111
			if strings.ToLower(strings.TrimSpace(stepStr)) != "r" {
				stepChar, errChar3 := strconv.Atoi(stepStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
				if errChar3 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
113 114
					step = stepChar
				}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
115 116
			} else {
				rand = true
aaronchen2k2k's avatar
aaronchen2k2k 已提交
117 118
			}

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
119
			return "char", step, 0, rand
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120 121
		}
	}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
122

aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
	return "string", 1, 0, false
124 125 126 127 128 129 130 131
}

func ParseRange(rang string) []string {
	items := make([]string, 0)

	tagOpen := false
	temp := ""

aaronchen2k2k's avatar
aaronchen2k2k 已提交
132 133 134 135 136 137 138 139 140
	runeArr := make([]rune, 0)
	for _, c := range rang {
		runeArr = append(runeArr, c)
	}

	for i := 0; i < len(runeArr); i++ {
		c := runeArr[i]

		if c == constant.RightChar {
141
			tagOpen = false
aaronchen2k2k's avatar
aaronchen2k2k 已提交
142
		} else if c == constant.LeftChar  {
143 144 145
			tagOpen = true
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
146
		if i == len(runeArr) - 1 {
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
			temp += fmt.Sprintf("%c", c)
			items = append(items, temp)
		} else if !tagOpen && c == ',' {
			items = append(items, temp)
			temp = ""
			tagOpen = false
		} else {
			temp += fmt.Sprintf("%c", c)
		}
	}

	return items
}

func ParseRangeItem(item string) (string, string, int) {
	entry := ""
	step := "1"
164
	repeat := 1
165

aaronchen2k2k's avatar
aaronchen2k2k 已提交
166
	item = strings.TrimSpace(item)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167 168
	if string(item[0]) == string(constant.LeftChar) &&  // It's a whole when meet (xxx)
			string(item[len(item) - 1]) == string(constant.RightChar) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
169 170 171
		return item, step, repeat
	}

172 173 174
	regx := regexp.MustCompile(`\{(.*)\}`)
	arr := regx.FindStringSubmatch(item)
	if len(arr) == 2 {
175
		repeat, _ = strconv.Atoi(arr[1])
176 177 178 179 180 181 182 183 184
	}
	item = regx.ReplaceAllString(item, "")

	sectionArr := strings.Split(item, ":")
	entry = sectionArr[0]
	if len(sectionArr) == 2 {
		step = sectionArr[1]
	}

185
	return entry, step, repeat
186 187
}

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
func GenerateValuesFromLiteral(field *model.DefField, desc string, stepStr string, repeat int) []interface{} {
	items := make([]interface{}, 0)

	elemArr := strings.Split(desc, ",")
	stepStr = strings.ToLower(strings.TrimSpace(stepStr))
	step, _ := strconv.Atoi(stepStr)
	total := 0
	for round := 0; round < repeat; round++ {
		for i := 0; i < len(elemArr); {
			val := ""
			if stepStr == "r" {
				val = elemArr[rand.Intn(len(elemArr))]
			} else {
				val = elemArr[i]
			}

			items = append(items, val)
			i += step
			total++

			if total > constant.MaxNumb {
				break
			}
		}

		if total >= constant.MaxNumb {
			break
		}
	}

	return items
}

func GenerateValuesFromInterval(field *model.DefField, desc string, stepStr string, repeat int) []interface{} {
	elemArr := strings.Split(desc, "-")
	startStr := elemArr[0]
	endStr := startStr
	if len(elemArr) > 1 { endStr = elemArr[1] }

227 228 229 230 231 232 233 234
	items := make([]interface{}, 0)

	dataType, step, precision, rand := CheckRangeType(startStr, endStr, stepStr)

	if dataType == "int" {
		startInt, _ := strconv.ParseInt(startStr, 0, 64)
		endInt, _ := strconv.ParseInt(endStr, 0, 64)

235
		items = GenerateIntItems(startInt, endInt, step, rand, repeat)
236 237 238 239 240
	} else if dataType == "float" {
		startFloat, _ := strconv.ParseFloat(startStr, 64)
		endFloat, _ := strconv.ParseFloat(endStr, 64)
		field.Precision = precision

241
		items = GenerateFloatItems(startFloat, endFloat, step.(float64), rand, repeat)
242
	} else if dataType == "char" {
243
		items = GenerateByteItems(byte(startStr[0]), byte(endStr[0]), step, rand, repeat)
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
	} else if dataType == "string" {
		items = append(items, startStr)
		if startStr != endStr {
			items = append(items, endStr)
		}
	}

	return items
}

func ParseEntry(str string) (string, string) {
	typ := ""
	desc := ""

	str = strings.TrimSpace(str)
	if int32(str[0]) == constant.LeftChar {
		typ = "literal"
		desc = strings.ReplaceAll(str, string(constant.LeftChar), "")
		desc = strings.ReplaceAll(desc,string(constant.RightChar), "")
	} else {
		typ = "interval"
		desc = str
	}

	return typ, desc
269
}