github.com/gotranspile/cxgo@v0.3.7/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 = 0xFFFE
   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 = 0xFFFFFFFE
   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: "stdint const override",
   161  		src: `
   162  #include <stdint.h>
   163  
   164  void foo() {
   165  	int16_t a1 = INT16_MAX;
   166  	a1 = INT16_MIN;
   167  }
   168  `,
   169  		exp: `
   170  func foo() {
   171  	var a1 int16 = math.MaxInt16
   172  	_ = a1
   173  	a1 = math.MinInt16
   174  }
   175  `,
   176  	},
   177  	{
   178  		name: "var init sum",
   179  		src: `
   180  int foo = 1+2;
   181  `,
   182  		exp: `
   183  var foo int32 = 1 + 2
   184  `,
   185  	},
   186  	{
   187  		name: "char var init",
   188  		src: `
   189  char foo = '"';
   190  `,
   191  		exp: `
   192  var foo int8 = '"'
   193  `,
   194  	},
   195  	{
   196  		name: "comp lit zero init",
   197  		src: `
   198  typedef struct A {
   199  	int x;
   200  } A;
   201  typedef struct B {
   202  	int x;
   203  	int y;
   204  } B;
   205  typedef struct C {
   206  	B x;
   207  	int y;
   208  } C;
   209  A v1 = {0};
   210  B v2 = {0};
   211  C v3 = {0};
   212  `,
   213  		exp: `
   214  type A struct {
   215  	X int32
   216  }
   217  type B struct {
   218  	X int32
   219  	Y int32
   220  }
   221  type C struct {
   222  	X B
   223  	Y int32
   224  }
   225  
   226  var v1 A = A{}
   227  var v2 B = B{}
   228  var v3 C = C{}
   229  `,
   230  	},
   231  	{
   232  		name: "comp lit zero compare and assign",
   233  		src: `
   234  typedef struct A {
   235  	int x;
   236  } A;
   237  
   238  void foo(void) {
   239  	A v1;
   240  	if (v1 == 0) {
   241  		v1 = 0;
   242  	}
   243  }
   244  `,
   245  		exp: `
   246  type A struct {
   247  	X int32
   248  }
   249  
   250  func foo() {
   251  	var v1 A
   252  	if v1 == (A{}) {
   253  		v1 = A{}
   254  	}
   255  }
   256  `,
   257  	},
   258  	{
   259  		name: "array lit",
   260  		src: `
   261  int arr1[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753 };
   262  int arr2[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753, };
   263  `,
   264  		exp: `
   265  var arr1 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753}
   266  var arr2 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753}
   267  `,
   268  	},
   269  	{
   270  		name: "array lit indexes",
   271  		src: `
   272  int arr1[] = {
   273    [0] = 0,
   274    [1] = 1,
   275    [2] = 2,
   276      3,
   277    [4] = 4,
   278      5,
   279      6,
   280  };
   281  int arr2[7] = {
   282    [0] = 0,
   283    [1] = 1,
   284    [2] = 2,
   285      3,
   286    [4] = 4,
   287      5,
   288  };
   289  `,
   290  		exp: `
   291  var arr1 [7]int32 = [7]int32{0, 1, 2, 3, 4, 5, 6}
   292  var arr2 [7]int32 = [7]int32{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
   293  `,
   294  	},
   295  	{
   296  		name: "nested struct fields init",
   297  		src: `
   298  struct inner {
   299     int f;
   300     int g;
   301     int h;
   302  };
   303  struct outer {
   304     int A;
   305     struct inner B;
   306     int C;
   307  };
   308  struct outer x = {
   309     .C = 100,
   310     .B.g = 200,
   311     .A = 300,
   312     .B.f = 400,
   313  };
   314  	`,
   315  		exp: `
   316  type inner struct {
   317  	F int32
   318  	G int32
   319  	H int32
   320  }
   321  type outer struct {
   322  	A int32
   323  	B inner
   324  	C int32
   325  }
   326  
   327  var x outer = outer{C: 100, B: inner{G: 200, F: 400}, A: 300}
   328  	`,
   329  	},
   330  	{
   331  		name: "string literal ternary",
   332  		src: `
   333  int a;
   334  char* b = a ? "1" : "2";
   335  `,
   336  		exp: `
   337  var a int32
   338  var b *byte = libc.CString(func() string {
   339  	if a != 0 {
   340  		return "1"
   341  	}
   342  	return "2"
   343  }())
   344  `,
   345  	},
   346  	{
   347  		name: "init byte string",
   348  		src: `
   349  char b[] = "===";
   350  `,
   351  		exp: `
   352  var b [4]byte = func() [4]byte {
   353  	var t [4]byte
   354  	copy(t[:], []byte("==="))
   355  	return t
   356  }()
   357  `,
   358  	},
   359  	{
   360  		name: "init named uint8_t string",
   361  		src: `
   362  #include <stdint.h>
   363  typedef uint8_t  MYubyte;
   364  MYubyte vendor[] = "something here";
   365  `,
   366  		exp: `
   367  type MYubyte uint8
   368  
   369  var vendor [15]MYubyte = func() [15]MYubyte {
   370  	var t [15]MYubyte
   371  	copy(t[:], []MYubyte("something here"))
   372  	return t
   373  }()
   374  `,
   375  	},
   376  	{
   377  		name: "double negate",
   378  		src: `
   379  #define MONE (-1)
   380  int x;
   381  int y = x - MONE;
   382  `,
   383  		exp: `
   384  const MONE = -1
   385  
   386  var x int32
   387  var y int32 = x - int32(-1)
   388  `,
   389  		// TODO: x - (-1)
   390  	}, {
   391  		name: "float div literal",
   392  		src: `
   393  void foo() {
   394  	float x = 4/3.0;
   395  }
   396  `,
   397  		exp: `
   398  func foo() {
   399  	var x float32 = float32(4 / 3.0)
   400  	_ = x
   401  }
   402  `,
   403  	},
   404  }
   405  
   406  func TestLiterals(t *testing.T) {
   407  	runTestTranslate(t, casesTranslateLiterals)
   408  }