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