github.com/gotranspile/cxgo@v0.3.8-0.20240118201721-29871598a6a2/literals_test.go (about)

     1  package cxgo
     2  
     3  import "testing"
     4  
     5  var casesTranslateLiterals = []parseCase{
     6  	{
     7  		name: "literal statement",
     8  		src: `
     9  void foo() {
    10  	0;
    11  }
    12  `,
    13  		exp: `
    14  func foo() {
    15  }
    16  `,
    17  	},
    18  	{
    19  		name: "string -> byte ptr",
    20  		src: `
    21  void foo() {
    22  	char* a;
    23  	a = "abc";
    24  }
    25  `,
    26  		exp: `
    27  func foo() {
    28  	var a *byte
    29  	_ = a
    30  	a = libc.CString("abc")
    31  }
    32  `,
    33  	},
    34  	{
    35  		name: "rune -> int",
    36  		src: `
    37  void foo() {
    38  	int a = 'a';
    39  }
    40  `,
    41  		exp: `
    42  func foo() {
    43  	var a int32 = 'a'
    44  	_ = a
    45  }
    46  `,
    47  	},
    48  	{
    49  		name: "wstring -> wchar ptr",
    50  		src: `
    51  #include <stddef.h>
    52  
    53  void foo() {
    54  	wchar_t* a;
    55  	a = L"abc";
    56  }
    57  `,
    58  		exp: `
    59  func foo() {
    60  	var a *libc.WChar
    61  	_ = a
    62  	a = libc.CWString("abc")
    63  }
    64  `,
    65  	},
    66  	{
    67  		name: "negative char",
    68  		src: `
    69  void foo() {
    70  	char a;
    71  	a = -1;
    72  	a = -2;
    73  }
    74  `,
    75  		exp: `
    76  func foo() {
    77  	var a int8
    78  	_ = a
    79  	a = -1
    80  	a = -2
    81  }
    82  `,
    83  	},
    84  	{
    85  		name: "negative uchar",
    86  		src: `
    87  void foo() {
    88  	unsigned char a;
    89  	a = -1;
    90  	a = -2;
    91  }
    92  `,
    93  		exp: `
    94  func foo() {
    95  	var a uint8
    96  	_ = a
    97  	a = math.MaxUint8
    98  	a = 254
    99  }
   100  `,
   101  	},
   102  	{
   103  		name: "negative ushort",
   104  		src: `
   105  void foo() {
   106  	unsigned short a;
   107  	a = -1;
   108  	a = -2;
   109  }
   110  `,
   111  		exp: `
   112  func foo() {
   113  	var a uint16
   114  	_ = a
   115  	a = math.MaxUint16
   116  	a = 65534
   117  }
   118  `,
   119  	},
   120  	{
   121  		name: "negative uint",
   122  		src: `
   123  void foo() {
   124  	unsigned int a;
   125  	a = -1;
   126  	a = -2;
   127  }
   128  `,
   129  		exp: `
   130  func foo() {
   131  	var a uint32
   132  	_ = a
   133  	a = math.MaxUint32
   134  	a = 4294967294
   135  }
   136  `,
   137  	},
   138  	{
   139  		name: "int overflow",
   140  		src: `
   141  void foo(int a) {
   142  	if (a & 0xFFFF0000) {
   143  		return;
   144  	}
   145  	a = 0x80000000;
   146  	a = 2415929931;
   147  }
   148  `,
   149  		exp: `
   150  func foo(a int32) {
   151  	if uint32(a)&0xFFFF0000 != 0 {
   152  		return
   153  	}
   154  	a = math.MinInt32
   155  	a = -1879037365
   156  }
   157  `,
   158  	},
   159  	{
   160  		name: "float const -> int",
   161  		src: `
   162  void foo() {
   163  	int a = 1.1 + 0.5;
   164  }
   165  `,
   166  		exp: `
   167  func foo() {
   168  	var a int32 = int32(math.Floor(1.1 + 0.5))
   169  	_ = a
   170  }
   171  `,
   172  	},
   173  	{
   174  		name: "float const + int",
   175  		src: `
   176  void foo(int a) {
   177  	int b = a + (3.0 / 2);
   178  }
   179  `,
   180  		exp: `
   181  func foo(a int32) {
   182  	var b int32 = int32(float64(a) + 3.0/2)
   183  	_ = b
   184  }
   185  `,
   186  	},
   187  	{
   188  		name: "stdint const override",
   189  		src: `
   190  #include <stdint.h>
   191  
   192  void foo() {
   193  	int16_t a1 = INT16_MAX;
   194  	a1 = INT16_MIN;
   195  }
   196  `,
   197  		exp: `
   198  func foo() {
   199  	var a1 int16 = math.MaxInt16
   200  	_ = a1
   201  	a1 = math.MinInt16
   202  }
   203  `,
   204  	},
   205  	{
   206  		name: "var init sum",
   207  		src: `
   208  int foo = 1+2;
   209  `,
   210  		exp: `
   211  var foo int32 = 1 + 2
   212  `,
   213  	},
   214  	{
   215  		name: "char var init",
   216  		src: `
   217  char foo = '"';
   218  `,
   219  		exp: `
   220  var foo int8 = '"'
   221  `,
   222  	},
   223  	{
   224  		name: "comp lit zero init",
   225  		src: `
   226  typedef struct A {
   227  	int x;
   228  } A;
   229  typedef struct B {
   230  	int x;
   231  	int y;
   232  } B;
   233  typedef struct C {
   234  	B x;
   235  	int y;
   236  } C;
   237  A v1 = {0};
   238  B v2 = {0};
   239  C v3 = {0};
   240  `,
   241  		exp: `
   242  type A struct {
   243  	X int32
   244  }
   245  type B struct {
   246  	X int32
   247  	Y int32
   248  }
   249  type C struct {
   250  	X B
   251  	Y int32
   252  }
   253  
   254  var v1 A = A{}
   255  var v2 B = B{}
   256  var v3 C = C{}
   257  `,
   258  	},
   259  	{
   260  		name: "comp lit zero compare and assign",
   261  		src: `
   262  typedef struct A {
   263  	int x;
   264  } A;
   265  
   266  void foo(void) {
   267  	A v1;
   268  	if (v1 == 0) {
   269  		v1 = 0;
   270  	}
   271  }
   272  `,
   273  		exp: `
   274  type A struct {
   275  	X int32
   276  }
   277  
   278  func foo() {
   279  	var v1 A
   280  	if v1 == (A{}) {
   281  		v1 = A{}
   282  	}
   283  }
   284  `,
   285  	},
   286  	{
   287  		name: "array lit",
   288  		src: `
   289  int arr1[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753 };
   290  int arr2[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753, };
   291  `,
   292  		exp: `
   293  var arr1 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753}
   294  var arr2 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753}
   295  `,
   296  	},
   297  	{
   298  		name: "array lit indexes",
   299  		src: `
   300  int arr1[] = {
   301    [0] = 0,
   302    [1] = 1,
   303    [2] = 2,
   304      3,
   305    [4] = 4,
   306      5,
   307      6,
   308  };
   309  int arr2[7] = {
   310    [0] = 0,
   311    [1] = 1,
   312    [2] = 2,
   313      3,
   314    [4] = 4,
   315      5,
   316  };
   317  `,
   318  		exp: `
   319  var arr1 [7]int32 = [7]int32{0, 1, 2, 3, 4, 5, 6}
   320  var arr2 [7]int32 = [7]int32{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
   321  `,
   322  	},
   323  	{
   324  		name: "nested struct fields init",
   325  		src: `
   326  struct inner {
   327     int f;
   328     int g;
   329     int h;
   330  };
   331  struct outer {
   332     int A;
   333     struct inner B;
   334     int C;
   335  };
   336  struct outer x = {
   337     .C = 100,
   338     .B.g = 200,
   339     .A = 300,
   340     .B.f = 400,
   341  };
   342  	`,
   343  		exp: `
   344  type inner struct {
   345  	F int32
   346  	G int32
   347  	H int32
   348  }
   349  type outer struct {
   350  	A int32
   351  	B inner
   352  	C int32
   353  }
   354  
   355  var x outer = outer{C: 100, B: inner{G: 200, F: 400}, A: 300}
   356  	`,
   357  	},
   358  	{
   359  		name: "string literal ternary",
   360  		src: `
   361  int a;
   362  char* b = a ? "1" : "2";
   363  `,
   364  		exp: `
   365  var a int32
   366  var b *byte = libc.CString(func() string {
   367  	if a != 0 {
   368  		return "1"
   369  	}
   370  	return "2"
   371  }())
   372  `,
   373  	},
   374  	{
   375  		name: "init byte string",
   376  		src: `
   377  char b[] = "===";
   378  `,
   379  		exp: `
   380  var b [4]byte = func() [4]byte {
   381  	var t [4]byte
   382  	copy(t[:], []byte("==="))
   383  	return t
   384  }()
   385  `,
   386  	},
   387  	{
   388  		name: "init named uint8_t string",
   389  		src: `
   390  #include <stdint.h>
   391  typedef uint8_t  MYubyte;
   392  MYubyte vendor[] = "something here";
   393  `,
   394  		exp: `
   395  type MYubyte uint8
   396  
   397  var vendor [15]MYubyte = func() [15]MYubyte {
   398  	var t [15]MYubyte
   399  	copy(t[:], []MYubyte("something here"))
   400  	return t
   401  }()
   402  `,
   403  	},
   404  	{
   405  		name: "double negate",
   406  		src: `
   407  #define MONE (-1)
   408  int x;
   409  int y = x - MONE;
   410  `,
   411  		exp: `
   412  const MONE = -1
   413  
   414  var x int32
   415  var y int32 = x - int32(-1)
   416  `,
   417  		// TODO: x - (-1)
   418  	}, {
   419  		name: "float div literal",
   420  		src: `
   421  void foo() {
   422  	float x = 4/3.0;
   423  }
   424  `,
   425  		exp: `
   426  func foo() {
   427  	var x float32 = 4 / 3.0
   428  	_ = x
   429  }
   430  `,
   431  	},
   432  }
   433  
   434  func TestLiterals(t *testing.T) {
   435  	runTestTranslate(t, casesTranslateLiterals)
   436  }