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