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 }