github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/util/util_test.go (about) 1 package util 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strings" 7 "testing" 8 ) 9 10 func TestUcfirst(t *testing.T) { 11 tcs := []struct { 12 in string 13 out string 14 }{ 15 {"", ""}, 16 {"a", "A"}, 17 {"w", "W"}, 18 {"wa", "Wa"}, 19 } 20 21 for index, tc := range tcs { 22 t.Run(fmt.Sprintf("%v", index), func(t *testing.T) { 23 a := Ucfirst(tc.in) 24 if a != tc.out { 25 t.Errorf("Result is not same: `%s` `%s`", a, tc.out) 26 } 27 }) 28 } 29 } 30 31 func TestResolveFunction(t *testing.T) { 32 var tcs = []struct { 33 input string 34 35 prefix string 36 funcname string 37 fields []string 38 returns []string 39 }{ 40 { 41 input: "__ssize_t (void *, char *, size_t)", 42 prefix: "", 43 fields: []string{"void *", "char *", "size_t"}, 44 returns: []string{"__ssize_t"}, 45 }, 46 { 47 input: "int (*)(sqlite3_vtab *, int, const char *, void (**)(sqlite3_context *, int, sqlite3_value **), void **)", 48 prefix: "", 49 fields: []string{ 50 "sqlite3_vtab *", 51 "int", 52 "const char *", 53 "void (**)(sqlite3_context *, int, sqlite3_value **)", 54 "void **"}, 55 returns: []string{"int"}, 56 }, 57 { 58 input: "void ( *(*)(int *, void *, char *))(void)", 59 prefix: "*", 60 fields: []string{"void"}, 61 returns: []string{"void (int *, void *, char *)"}, 62 }, 63 { 64 input: " void (*)(void)", 65 prefix: "", 66 fields: []string{"void"}, 67 returns: []string{"void"}, 68 }, 69 { 70 input: " int (*)(sqlite3_file *)", 71 prefix: "", 72 fields: []string{"sqlite3_file *"}, 73 returns: []string{"int"}, 74 }, 75 { 76 input: " int (*)(int)", 77 prefix: "", 78 fields: []string{"int"}, 79 returns: []string{"int"}, 80 }, 81 { 82 input: " int (*)(void *) ", 83 prefix: "", 84 fields: []string{"void *"}, 85 returns: []string{"int"}, 86 }, 87 { 88 input: " void (*)(sqlite3_context *, int, sqlite3_value **)", 89 prefix: "", 90 fields: []string{"sqlite3_context *", "int", "sqlite3_value **"}, 91 returns: []string{"void"}, 92 }, 93 { 94 input: "char *(*)( char *, ...)", 95 prefix: "", 96 fields: []string{"char *", "..."}, 97 returns: []string{"char *"}, 98 }, 99 { 100 input: "char *(*)( char *, struct __va_list_tag *)", 101 prefix: "", 102 fields: []string{"char *", "struct __va_list_tag *"}, 103 returns: []string{"char *"}, 104 }, 105 { 106 input: "char *(*)(const char *, ...)", 107 prefix: "", 108 fields: []string{"const char *", "..."}, 109 returns: []string{"char *"}, 110 }, 111 { 112 input: "char *(*)(ImportCtx *)", 113 prefix: "", 114 fields: []string{"ImportCtx *"}, 115 returns: []string{"char *"}, 116 }, 117 { 118 input: "char *(*)(int, char *, char *, ...)", 119 prefix: "", 120 fields: []string{"int", "char *", "char *", "..."}, 121 returns: []string{"char *"}, 122 }, 123 { 124 input: "const char *(*)(int)", 125 prefix: "", 126 fields: []string{"int"}, 127 returns: []string{"const char *"}, 128 }, 129 { 130 input: "const unsigned char *(*)(sqlite3_value *)", 131 prefix: "", 132 fields: []string{"sqlite3_value *"}, 133 returns: []string{"const unsigned char *"}, 134 }, 135 { 136 input: "int (*)(const char *, sqlite3 **)", 137 prefix: "", 138 fields: []string{"const char *", "sqlite3 **"}, 139 returns: []string{"int"}, 140 }, 141 { 142 input: "int (*)(fts5_api *, const char *, void *, fts5_extension_function, void (*)(void *))", 143 prefix: "", 144 fields: []string{"fts5_api *", 145 "const char *", 146 "void *", 147 "fts5_extension_function", 148 "void (*)(void *)"}, 149 returns: []string{"int"}, 150 }, 151 { 152 input: "int (*)(Fts5Context *, char *, int, void *, int (*)(void *, int, char *, int, int, int))", 153 prefix: "", 154 fields: []string{"Fts5Context *", 155 "char *", 156 "int", 157 "void *", 158 "int (*)(void *, int, char *, int, int, int)"}, 159 returns: []string{"int"}, 160 }, 161 { 162 input: "int (*)(sqlite3 *, char *, int, int, void *, void (*)(sqlite3_context *, int, sqlite3_value **), void (*)(sqlite3_context *, int, sqlite3_value **), void (*)(sqlite3_context *))", 163 prefix: "", 164 fields: []string{ 165 "sqlite3 *", 166 "char *", 167 "int", 168 "int", 169 "void *", 170 "void (*)(sqlite3_context *, int, sqlite3_value **)", 171 "void (*)(sqlite3_context *, int, sqlite3_value **)", 172 "void (*)(sqlite3_context *)", 173 }, 174 returns: []string{"int"}, 175 }, 176 { 177 input: "int (*)(sqlite3_vtab *, int, const char *, void (**)(sqlite3_context *, int, sqlite3_value **), void **)", 178 prefix: "", 179 fields: []string{ 180 "sqlite3_vtab *", 181 "int", 182 "const char *", 183 "void (**)(sqlite3_context *, int, sqlite3_value **)", 184 "void **"}, 185 returns: []string{"int"}, 186 }, 187 { 188 input: "void (*(int *, void *, const char *))(void)", 189 prefix: "", 190 fields: []string{"void"}, 191 returns: []string{"void (int *, void *, const char *)"}, 192 }, 193 { 194 input: "long (int, int)", 195 prefix: "", 196 fields: []string{"int", "int"}, 197 returns: []string{"long"}, 198 }, 199 { 200 input: "void (const char *, ...)", 201 prefix: "", 202 fields: []string{"const char *", "..."}, 203 returns: []string{"void"}, 204 }, 205 { 206 input: "void (void)", 207 prefix: "", 208 fields: []string{"void"}, 209 returns: []string{"void"}, 210 }, 211 { 212 input: "void ()", 213 prefix: "", 214 fields: []string{""}, 215 returns: []string{"void"}, 216 }, 217 { 218 input: "int (*)()", 219 prefix: "", 220 fields: []string{""}, 221 returns: []string{"int"}, 222 }, 223 { 224 input: "int ioctl(int , int , ... )", 225 prefix: "", 226 funcname: "ioctl", 227 fields: []string{"int", "int", "..."}, 228 returns: []string{"int"}, 229 }, 230 { 231 input: "speed_t cfgetospeed(const struct termios *)", 232 prefix: "", 233 funcname: "cfgetospeed", 234 fields: []string{"const struct termios *"}, 235 returns: []string{"speed_t"}, 236 }, 237 { 238 input: "void (*signal(int , void (*)(int)))(int)", 239 prefix: "*", 240 funcname: "signal", 241 fields: []string{"int"}, 242 returns: []string{"void(int,void(int))"}, 243 }, 244 { 245 input: "void ( * signal(int , void (*)(int)))(int)", 246 prefix: "*", 247 funcname: "signal", 248 fields: []string{"int"}, 249 returns: []string{"void(int,void(int))"}, 250 }, 251 { 252 input: "void (struct __jmp_buf_tag *, int) __attribute__((noreturn))", 253 prefix: "", 254 funcname: "", 255 fields: []string{"struct __jmp_buf_tag *", "int"}, 256 returns: []string{"void"}, 257 }, 258 } 259 260 for i, tc := range tcs { 261 t.Run(fmt.Sprintf("Test %d : %s", i, tc.input), func(t *testing.T) { 262 actualPrefix, actualName, actualField, actualReturn, err := 263 ParseFunction(tc.input) 264 if err != nil { 265 t.Fatal(err) 266 } 267 if actualPrefix != tc.prefix { 268 t.Errorf("Prefix is not same.\nActual: %s\nExpected: %s\n", 269 actualPrefix, tc.prefix) 270 } 271 if actualName != tc.funcname { 272 t.Errorf("Names is not same.\nActual: %s\nExpected: %s\n", 273 actualName, tc.funcname) 274 } 275 if len(actualField) != len(tc.fields) { 276 a, _ := json.Marshal(actualField) 277 f, _ := json.Marshal(tc.fields) 278 t.Errorf("Size of field is not same.\nActual : %s\nExpected: %s\n", 279 string(a), 280 string(f)) 281 return 282 } 283 if len(actualField) != len(tc.fields) { 284 a, _ := json.Marshal(actualField) 285 f, _ := json.Marshal(tc.fields) 286 t.Errorf("Size of field is not same.\nActual : %s\nExpected: %s\n", 287 string(a), 288 string(f)) 289 return 290 } 291 for i := range actualField { 292 actualField[i] = strings.Replace(actualField[i], " ", "", -1) 293 tc.fields[i] = strings.Replace(tc.fields[i], " ", "", -1) 294 if actualField[i] != tc.fields[i] { 295 t.Errorf("Not correct field: %v\nExpected: %v", actualField, tc.fields) 296 } 297 } 298 if len(actualReturn) != len(tc.returns) { 299 a, _ := json.Marshal(actualReturn) 300 f, _ := json.Marshal(tc.returns) 301 t.Errorf("Size of return field is not same.\nActual : %s\nExpected: %s\n", 302 string(a), 303 string(f)) 304 return 305 } 306 if len(actualReturn) != len(tc.returns) { 307 t.Errorf("Amount of return elements are different\nActual : %v\nExpected: %v\n", 308 actualReturn, tc.returns) 309 } 310 for i := range actualReturn { 311 actualReturn[i] = strings.Replace(actualReturn[i], " ", "", -1) 312 tc.returns[i] = strings.Replace(tc.returns[i], " ", "", -1) 313 if actualReturn[i] != tc.returns[i] { 314 t.Errorf("Not correct returns: %v\nExpected: %v", actualReturn, tc.returns) 315 } 316 } 317 }) 318 } 319 } 320 321 // func TestGenerateCorrectType(t *testing.T) { 322 // tcs := []struct { 323 // inp string 324 // out string 325 // }{ 326 // { 327 // inp: "union (anonymous union at tests/union.c:46:3)", 328 // out: "union __union_at_tests_union_c_46_3_", 329 // }, 330 // { 331 // inp: " const struct (anonymous struct at /home/lepricon/go/src/github.com/tests/struct.c:282:18) [7]", 332 // out: "struct __struct_at__home_lepricon_go_src_github_com_tests_struct_c_282_18_ [7]", 333 // }, 334 // } 335 // 336 // for i, tc := range tcs { 337 // t.Run(fmt.Sprintf("Test %d : %s", i, tc.inp), func(t *testing.T) { 338 // act := types.GenerateCorrectType(tc.inp) 339 // if act != tc.out { 340 // t.Errorf("Not correct result.\nExpected:%s\nActual:%s\n", 341 // tc.out, act) 342 // } 343 // }) 344 // } 345 // }