1 ## oils_failures_allowed: 0
2
3 #### Minus operator is left associative
4
5 var a = 1 - 0 - 1
6 var b = (1 - 0) - 1
7 echo a=$a b=$b
8
9 var a = 3 - 1 - 2
10 var b = (3 - 1) - 2
11 echo a=$a b=$b
12
13 ## STDOUT:
14 a=0 b=0
15 a=0 b=0
16 ## END
17
18 #### Division operators are left associative
19
20 var a = 10 / 4 / 2
21 var b = 10 / 4 / 2
22 echo a=$a b=$b
23
24 var a = 9 // 3 // 3
25 var b = (9 // 3) // 3
26 echo a=$a b=$b
27
28 var a = 11 % 6 % 3
29 var b = (11 % 6) % 3
30 echo a=$a b=$b
31
32 ## STDOUT:
33 a=1.25 b=1.25
34 a=1 b=1
35 a=2 b=2
36 ## END
37
38 #### Exponentiation is right associative
39
40 var a = 3 ** 2 ** 2
41 var b = 3 ** (2 ** 2)
42 echo a=$a b=$b
43
44 ## STDOUT:
45 a=81 b=81
46 ## END
47
48 #### Binary operators, with conversions from string
49
50 echo ' i i' $[1 + 2]
51 echo 'si i' $['1' + 2]
52 echo ' i si' $[1 + '2']
53 echo ---
54
55 echo ' f f' $[2.5 - 1.5]
56 echo 'sf f' $['2.5' - 1.5]
57 echo ' f sf' $[2.5 - '1.5']
58 echo ---
59
60 echo ' i f' $[4 * 1.5]
61 echo 'si f' $['4' * 1.5]
62 echo ' i sf' $[4 * '1.5']
63 echo ---
64
65 echo ' f i' $[5.0 / 2]
66 echo 'sf i' $['5.0' / 2]
67 echo ' f si' $[5.0 / '2']
68
69 ## STDOUT:
70 i i 3
71 si i 3
72 i si 3
73 ---
74 f f 1.0
75 sf f 1.0
76 f sf 1.0
77 ---
78 i f 6.0
79 si f 6.0
80 i sf 6.0
81 ---
82 f i 2.5
83 sf i 2.5
84 f si 2.5
85 ## END
86
87 #### Floating Point Division with /
88
89 var i = '1.0' / '0.05'
90
91 echo $i
92
93 ## STDOUT:
94 20.0
95 ## END
96
97
98 #### Operations That Convert to Integer: // % **
99 shopt -s parse_brace
100
101 var m = ' 5 ' // 2
102
103 var n = ' 5 ' % 2
104
105 var p = ' 5 ' ** 2
106
107 write -- $m $n $p
108
109 try {
110 var z = 'a' // 3
111 }
112 echo _status $_status
113
114 try {
115 var z = 'z' % 3
116 }
117 echo _status $_status
118
119 ## STDOUT:
120 2
121 1
122 25
123 _status 3
124 _status 3
125 ## END
126
127 #### Division by zero
128 shopt -s parse_brace
129
130 try {
131 = 42 / 0
132 }
133 echo "status / is $_status"
134
135 try {
136 = 42 // 0
137 }
138 echo "status // is $_status"
139
140 try {
141 = 42 % 0
142 }
143 echo "status % is $_status"
144
145 ## STDOUT:
146 status / is 3
147 status // is 3
148 status % is 3
149 ## END
150
151 #### Unary Operations
152
153 var a = ~1
154
155 var b = -1
156 var c = -2.3
157
158 var d = not true
159
160
161 write -- $a $b $c $d
162
163 ## STDOUT:
164 -2
165 -1
166 -2.3
167 false
168 ## END
169
170 #### Unary plus on integers and floats
171
172 var a = +1
173 var b = +42
174 var c = +2.5
175
176 var d = -10
177 var e = +d
178
179 write -- $a $b $c $e
180
181 ## STDOUT:
182 1
183 42
184 2.5
185 -10
186 ## END
187
188 #### unary plus and minus combined
189
190 var a = +-5
191 var b = -+5
192 var c = +(-3)
193
194 write -- $a $b $c
195
196 ## STDOUT:
197 -5
198 -5
199 -3
200 ## END
201
202 #### unary minus on strings
203 json write (-3)
204 json write (-'4')
205 json write (-'5.5')
206
207 # Not accepted
208 json write (-'abc')
209
210 ## status: 3
211 ## STDOUT:
212 -3
213 -4
214 -5.5
215 ## END
216
217 #### unary plus on strings
218 json write (+3)
219 json write (+'4')
220 json write (+'5.5')
221
222 # Not accepted
223 json write (+'abc')
224
225 ## status: 3
226 ## STDOUT:
227 3
228 4
229 5.5
230 ## END
231
232 #### unary ~ complement on strings
233 json write (~0)
234 json write (~'1')
235 json write (~' 2 ')
236 # Not accepted
237 json write (~'3.5')
238
239 ## status: 3
240 ## STDOUT:
241 -1
242 -2
243 -3
244 ## END
245
246 #### unary ~ doesn't work on bool
247 = ~false
248 ## status: 3
249 ## STDOUT:
250 ## END
251
252 #### unary ~ doesn't work on float
253 = ~1.0
254 ## status: 3
255 ## STDOUT:
256 ## END
257
258 #### unary - applied to bool is not allowed
259 = ~false
260 ## status: 3
261 ## STDOUT:
262 ## END
263
264 #### Big float constants becomes inf and -inf, tiny become 0.0 and -0.0
265
266 $SH -c '
267 var x = 0.12345
268 pp test_ (x)
269 '
270 echo float=$?
271
272 $SH -c '
273 # Becomes infinity
274 var x = 0.123456789e1234567
275 pp test_ (x)
276
277 var x = -0.123456789e1234567
278 pp test_ (x)
279 '
280 echo float=$?
281
282 $SH -c '
283 # Becomes infinity
284 var x = 0.123456789e-1234567
285 pp test_ (x)
286
287 var x = -0.123456789e-1234567
288 pp test_ (x)
289 '
290 echo float=$?
291
292 ## STDOUT:
293 (Float) 0.12345
294 float=0
295 (Float) INFINITY
296 (Float) -INFINITY
297 float=0
298 (Float) 0.0
299 (Float) -0.0
300 float=0
301 ## END
302
303 #### Int constants bigger than 64 bits
304
305 # Decimal
306 $SH -c '
307 var x = 1111
308 pp test_ (x)
309 '
310 echo dec=$?
311
312 $SH -c '
313 var x = 1111_2222_3333_4444_5555_6666
314 pp test_ (x)
315 '
316 echo dec=$?
317
318 # Binary
319 $SH -c '
320 var x = 0b11
321 pp test_ (x)
322 '
323 echo bin=$?
324
325 $SH -c '
326 var x = 0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
327 pp test_ (x)
328 '
329 echo bin=$?
330
331 # Octal
332 $SH -c '
333 var x = 0o77
334 pp test_ (x)
335 '
336 echo oct=$?
337
338 $SH -c '
339 var x = 0o1111_2222_3333_4444_5555_6666
340 pp test_ (x)
341 '
342 echo oct=$?
343
344 # Hex
345 $SH -c '
346 var x = 0xff
347 pp test_ (x)
348 '
349 echo hex=$?
350
351 $SH -c '
352 var x = 0xaaaa_bbbb_cccc_dddd_eeee_ffff
353 pp test_ (x)
354 '
355 echo hex=$?
356
357 ## STDOUT:
358 (Int) 1111
359 dec=0
360 dec=2
361 (Int) 3
362 bin=0
363 bin=2
364 (Int) 63
365 oct=0
366 oct=2
367 (Int) 255
368 hex=0
369 hex=2
370 ## END
371
372 #### Bit shift by negative number is not allowed
373
374 shopt -s ysh:upgrade
375
376 pp test_ (1 << 1)
377 pp test_ (1 << 0)
378 try {
379 pp test_ (1 << -1)
380 }
381 echo failed $[_error.code]
382 echo
383
384 pp test_ (16 >> 2)
385 pp test_ (16 >> 1)
386 pp test_ (16 >> 0)
387 try {
388 pp test_ (16 >> -1)
389 }
390 echo failed $[_error.code]
391
392 ## STDOUT:
393 (Int) 2
394 (Int) 1
395 failed 3
396
397 (Int) 4
398 (Int) 8
399 (Int) 16
400 failed 3
401 ## END
402
403 #### 64-bit operations
404
405 shopt -s ysh:upgrade
406
407 var i = 1 << 32
408 var s = str(i)
409
410 echo "i = $i, s = $s"
411
412 if (s ~== i) {
413 echo equal
414 }
415
416 ## STDOUT:
417 i = 4294967296, s = 4294967296
418 equal
419 ## END
420
421 #### 64-bit integer doesn't overflow
422
423 # same as spec/arith.test.sh case 38
424
425 var a= 1 << 31
426 echo $a
427
428 var b = a + a
429 echo $b
430
431 var c = b + a
432 echo $c
433
434 var x = 1 << 62
435 var y = x - 1
436 echo "max positive = $[ x + y ]"
437
438 #echo "overflow $[ x + x ]"
439
440 ## STDOUT:
441 2147483648
442 4294967296
443 6442450944
444 max positive = 9223372036854775807
445 ## END
446
447 #### Integer literals
448 var d = 123
449 var b = 0b11
450 var o = 0o123
451 var h = 0xff
452 echo $d $b $o $h
453 ## STDOUT:
454 123 3 83 255
455 ## END
456
457 #### Integer literals with underscores
458 const dec = 65_536
459 const bin = 0b0001_0101
460 const oct = 0o001_755
461 const hex = 0x0001_000f
462
463 echo SHELL
464 echo $dec
465 echo $bin
466 echo $oct
467 echo $hex
468 const x = 1_1 + 0b1_1 + 0o1_1 + 0x1_1
469 echo sum $x
470
471 # This works under Python 3.6, but the continuous build has earlier versions
472 if false; then
473 echo ---
474 echo PYTHON
475
476 python3 -c '
477 print(65_536)
478 print(0b0001_0101)
479 print(0o001_755)
480 print(0x0001_000f)
481
482 # Weird syntax
483 print("sum", 1_1 + 0b1_1 + 0o1_1 + 0x1_1)
484 '
485 fi
486
487 ## STDOUT:
488 SHELL
489 65536
490 21
491 1005
492 65551
493 sum 40
494 ## END
495
496 #### Exponentiation with **
497 var x = 2**3
498 echo $x
499
500 var y = 2.0 ** 3.0 # NOT SUPPORTED
501 echo 'should not get here'
502
503 ## status: 3
504 ## STDOUT:
505 8
506 ## END
507
508 #### Float Division
509 pp test_ (5/2)
510 pp test_ (-5/2)
511 pp test_ (5/-2)
512 pp test_ (-5/-2)
513
514 echo ---
515
516 var x = 9
517 setvar x /= 2
518 pp test_ (x)
519
520 var x = -9
521 setvar x /= 2
522 pp test_ (x)
523
524 var x = 9
525 setvar x /= -2
526 pp test_ (x)
527
528 var x = -9
529 setvar x /= -2
530 pp test_ (x)
531
532
533 ## STDOUT:
534 (Float) 2.5
535 (Float) -2.5
536 (Float) -2.5
537 (Float) 2.5
538 ---
539 (Float) 4.5
540 (Float) -4.5
541 (Float) -4.5
542 (Float) 4.5
543 ## END
544
545 #### Integer Division (rounds toward zero)
546 pp test_ (5//2)
547 pp test_ (-5//2)
548 pp test_ (5//-2)
549 pp test_ (-5//-2)
550
551 echo ---
552
553 var x = 9
554 setvar x //= 2
555 pp test_ (x)
556
557 var x = -9
558 setvar x //= 2
559 pp test_ (x)
560
561 var x = 9
562 setvar x //= -2
563 pp test_ (x)
564
565 var x = -9
566 setvar x //= -2
567 pp test_ (x)
568
569 ## STDOUT:
570 (Int) 2
571 (Int) -2
572 (Int) -2
573 (Int) 2
574 ---
575 (Int) 4
576 (Int) -4
577 (Int) -4
578 (Int) 4
579 ## END
580
581 #### % operator is remainder
582 pp test_ ( 5 % 3)
583 pp test_ (-5 % 3)
584
585 # negative divisor illegal (tested in test/ysh-runtime-errors.sh)
586 #pp test_ ( 5 % -3)
587 #pp test_ (-5 % -3)
588
589 var z = 10
590 setvar z %= 3
591 pp test_ (z)
592
593 var z = -10
594 setvar z %= 3
595 pp test_ (z)
596
597 ## STDOUT:
598 (Int) 2
599 (Int) -2
600 (Int) 1
601 (Int) -1
602 ## END
603
604 #### Bitwise logical
605 var a = 0b0101 & 0b0011
606 echo $a
607 var b = 0b0101 | 0b0011
608 echo $b
609 var c = 0b0101 ^ 0b0011
610 echo $c
611 var d = ~b
612 echo $d
613 ## STDOUT:
614 1
615 7
616 6
617 -8
618 ## END
619
620 #### Shift operators
621 var a = 1 << 4
622 echo $a
623 var b = 16 >> 4
624 echo $b
625 ## STDOUT:
626 16
627 1
628 ## END
629
630 #### multiline strings, list, tuple syntax for list, etc.
631 var dq = "
632 dq
633 2
634 "
635 echo dq=$[len(dq)]
636
637 var sq = '
638 sq
639 2
640 '
641 echo sq=$[len(sq)]
642
643 var mylist = [
644 1,
645 2,
646 3,
647 ]
648 echo mylist=$[len(mylist)]
649
650 var mytuple = (1,
651 2, 3)
652 echo mytuple=$[len(mytuple)]
653
654 ## STDOUT:
655 dq=6
656 sq=6
657 mylist=3
658 mytuple=3
659 ## END
660