list.go 6.5 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
	_, errInt1 := strconv.ParseInt(startStr, 0, 64)
	_, errInt2 := strconv.ParseInt(endStr, 0, 64)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77 78
	_, errInt3 := strconv.ParseInt(stepStr, 0, 64)
	if errInt1 == nil && errInt2 == nil && errInt3 == nil { // is int
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
79
		var step interface{} = 1
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
80 81
		if strings.ToLower(strings.TrimSpace(stepStr)) != "r" {
			stepInt, errInt3 := strconv.Atoi(stepStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
82
			if errInt3 == nil {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
83 84
				step = stepInt
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
85 86
		} else {
			rand = true
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87 88
		}

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

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
106
			precision := getPrecision(startFloat, step)
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
107 108
			return "float", step, precision, rand

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

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

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

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

	tagOpen := false
	temp := ""

aaronchen2k2k's avatar
aaronchen2k2k 已提交
133 134 135 136 137 138 139 140 141
	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 {
142
			tagOpen = false
aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
		} else if c == constant.LeftChar  {
144 145 146
			tagOpen = true
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
147
		if i == len(runeArr) - 1 {
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
			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"
165
	repeat := 1
166

aaronchen2k2k's avatar
aaronchen2k2k 已提交
167
	item = strings.TrimSpace(item)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169
	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 已提交
170 171 172
		return item, step, repeat
	}

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

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

186
	return entry, step, repeat
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 227
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] }

228 229
	items := make([]interface{}, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
230 231 232
	// deal with exp like user-01


233 234 235 236 237 238
	dataType, step, precision, rand := CheckRangeType(startStr, endStr, stepStr)

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

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

245
		items = GenerateFloatItems(startFloat, endFloat, step.(float64), rand, repeat)
246
	} else if dataType == "char" {
247
		items = GenerateByteItems(byte(startStr[0]), byte(endStr[0]), step, rand, repeat)
248
	} else if dataType == "string" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
249 250 251 252 253 254
		//items = append(items, startStr)
		//if startStr != endStr {
		//	items = append(items, endStr)
		//}

		items = append(items, desc)
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
	}

	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
275
}