======== #1 script generation test ========

-(a + b)
-(a <=> b)
-4
(-4) + 3 * 4
((-4) + 3) * 4
-(4 * (3 + 4))
-a
`a
(m = func()) && m
func(a) = {}
func(a) { block? } = {}
func(a) {|a, b, c|}
func(a) {|(3 | 4 | 5), b, c|}
func(a) {|(3 | 4 | 5), b, c|}
func(a) {|(3 * 4 | 5), b, c|}
func(a) {|(3 | 4 | 5), b, (a | b | c)|}
func(a) {|(a |.| b), c, d|}
func(a) {|(a |*| b), c, d|}
func(a) {|(a |+| b), c, d|}
func(a) {|(a |-| b), c, d|}
func(a) {|(a |&| b), c, d|}
func(a) {|(a ||| b), c, d|}
func(a, b, c, d, e%, f*) = {}
`(3 + 4)
`(3 * 4)
`(-(3 * 4))
`(3 + 4 + 5 + 6)
`((-3) + 4 + 5 + 6)
`((-3) - (-4) + 5 + 6)
`(3 * 4 * 5 * 6)
`(3 * (-4) * 5 * 6)
`(a(3, 4, 5):hoge).func()
`(a:hoge).func()
`(a[0]:hoge).func()
a |.| b * 3
a |*| b * 3

======== #2 acceptable value types ========

+
[`number, `complex, `rational, `array, `timedelta]
-
[`number, `complex, `rational, `array, `timedelta, `vertex]
~
[`number, `class, `function, `help]
!
[`any]
..
[`number]
+
[[`string, `any], [`boolean, `boolean], [`number, `boolean], [`boolean, `number], [`number, `number], [`complex, `number], [`rational, `number], [`array, `number], [`pointer, `number], [`any, `string], [`string, `string], [`binary, `string], [`number, `complex], [`complex, `complex], [`array, `complex], [`number, `rational], [`rational, `rational], [`number, `array], [`complex, `array], [`array, `array], [`string, `binary], [`binary, `binary], [`timedelta, `datetime], [`datetime, `timedelta], [`timedelta, `timedelta], [`vertex, `vertex]]
-
[[`boolean, `boolean], [`number, `boolean], [`boolean, `number], [`number, `number], [`complex, `number], [`rational, `number], [`array, `number], [`pointer, `number], [`number, `complex], [`complex, `complex], [`array, `complex], [`number, `rational], [`rational, `rational], [`number, `array], [`complex, `array], [`array, `array], [`color, `color], [`datetime, `datetime], [`pointer, `pointer], [`datetime, `timedelta], [`timedelta, `timedelta], [`vertex, `vertex]]
*
[[`class, `any], [`function, `any], [`boolean, `boolean], [`number, `boolean], [`boolean, `number], [`number, `number], [`string, `number], [`complex, `number], [`rational, `number], [`array, `number], [`binary, `number], [`timedelta, `number], [`vertex, `number], [`number, `string], [`number, `complex], [`complex, `complex], [`array, `complex], [`number, `rational], [`rational, `rational], [`number, `array], [`complex, `array], [`array, `array], [`number, `binary], [`number, `timedelta]]
/
[[`number, `number], [`complex, `number], [`rational, `number], [`array, `number], [`vertex, `number], [`number, `complex], [`complex, `complex], [`array, `complex], [`number, `rational], [`rational, `rational], [`number, `array], [`complex, `array], [`array, `array]]
%
[[`number, `number], [`array, `number], [`number, `array], [`array, `array]]
**
[[`number, `number], [`complex, `number], [`array, `number], [`number, `complex], [`complex, `complex], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
==
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
!=
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
>
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
<
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
>=
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
<=
[[`any, `any], [`array, `number], [`array, `complex], [`number, `array], [`complex, `array], [`array, `array]]
<=>
[[`boolean, `boolean], [`number, `number], [`rational, `number], [`symbol, `symbol], [`string, `string], [`complex, `complex], [`number, `rational], [`rational, `rational], [`binary, `binary], [`datetime, `datetime], [`list, `list], [`timedelta, `timedelta]]
in
[[`any, `any]]
|
[[`any, `nil], [`nil, `any], [`boolean, `boolean], [`number, `number], [`array, `number], [`number, `array], [`array, `array]]
&
[[`any, `nil], [`nil, `any], [`boolean, `boolean], [`number, `number], [`array, `number], [`number, `array], [`array, `array]]
^
[[`boolean, `boolean], [`number, `number], [`array, `number], [`number, `array], [`array, `array]]
<<
[[`stream, `any], [`number, `number], [`array, `number], [`markdown.document, `string], [`number, `array], [`array, `array]]
>>
[[`number, `number], [`array, `number], [`number, `array], [`array, `array]]
||
[[`any, `any]]
&&
[[`any, `any]]
..
[[`number, `number]]
|.|
[[`number, `number], [`array, `array], [`vertex, `vertex]]
|*|
[[`vertex, `vertex]]
|+|
[]
|-|
[]
|&|
[]
|||
[]

======== #3 operator assignment - 1 ========

+A
-A
~A
!A
A + A
A - A
A * A
A / A
A % A
A ** A
A == A
A != A
A > A
A < A
A >= A
A <= A
A <=> A
A in A
A | A
A & A
A ^ A
A << A
A >> A
A .. A
__getitem__ 3
__getitemx__
__setitem__ 3 2
__setitemx__ 2
__getprop__ b
__setprop__ b 2

======== #4 stream output operator ========

hello world
hello world
2nd line
3rd line
hello world

======== #5 bitwise and/or calculation with nil ========

nil | 3 .. 3
3 | nil .. 3
nil | nil .. nil
nil & 3 .. nil
3 & nil .. nil
nil & nil .. nil

======== #6 "in" operator ========

2 in 2 .. true
2 in 3 .. false
2 in 0 .. 10 .. true
2 in 4 .. 10 .. false
2 in [0 .. 10] .. true
2 in [4 .. 10] .. false
[0 .. 10 in 4] .. [false, false, false, false, true, false, false, false, false, false, false]
[0 .. 10 in (-2)] .. [false, false, false, false, false, false, false, false, false, false, false]
[0 .. 10 in 0 .. 5] .. [true, true, true, true, true, true, false, false, false, false, false]
[0 .. 10 in 4 .. 8] .. [false, false, false, false, true, true, true, true, true, false, false]
[0 .. 10 in [0 .. 5]] .. [true, true, true, true, true, true, false, false, false, false, false]
[0 .. 10 in [4 .. 8]] .. [false, false, false, false, true, true, true, true, true, false, false]
[0 .. 10] in 4 .. [false, false, false, false, true, false, false, false, false, false, false]
[0 .. 10] in (-2) .. [false, false, false, false, false, false, false, false, false, false, false]
[0 .. 10] in 0 .. 5 .. [true, true, true, true, true, true, false, false, false, false, false]
[0 .. 10] in 4 .. 8 .. [false, false, false, false, true, true, true, true, true, false, false]
[0 .. 10] in [0 .. 5] .. [true, true, true, true, true, true, false, false, false, false, false]
[0 .. 10] in [4 .. 8] .. [false, false, false, false, true, true, true, true, true, false, false]

======== #7 list assignment and suffix operators + and * ========

a=1, b=2, c=3
a=1, b=2, c=[3, 4, 5]
a=1, b=2, c=[3, 4, 5]
a=1, b=2, c=[]

======== #8 operator assignment - 2 ========

name = apple, cnt = 0
Fruit + number
Fruit - number
Fruit * number
Fruit / number
Fruit % number
Fruit ** number
number + Fruit
number - Fruit
number * Fruit
number / Fruit
number % Fruit
number ** Fruit
Fruit == number
Fruit != number
Fruit < number
Fruit > number
Fruit <= number
Fruit >= number
Fruit <=> number
Fruit | number
Fruit & number
Fruit .. number

======== #9 bitwise and/or/xor and boolean values ========

false & false .. false
false & true .. false
true & false .. false
true & true .. true
false | false .. false
false | true .. true
true | false .. true
true | true .. true
false ^ false .. false
false ^ true .. true
true ^ false .. true
true ^ true .. false
false & false & false .. false
false & false & true .. false
false & true & false .. false
false & true & true .. false
true & false & false .. false
true & false & true .. false
true & true & false .. false
true & true & true .. true
false | false | false .. false
false | false | true .. true
false | true | false .. true
false | true | true .. true
true | false | false .. true
true | false | true .. true
true | true | false .. true
true | true | true .. true
false | true & false .. false
x .. [true, false, false, true, false, true, false, false, true, true]
y .. [true, false, false, true, false, false, false, false, true, true]
z .. [false, false, false, true, false, false, false, true, true, false]
x | y .. [true, false, false, true, false, true, false, false, true, true]
x & y .. [true, false, false, true, false, false, false, false, true, true]
x || y .. [true, false, false, true, false, true, false, false, true, true]
x && y .. [true, false, false, true, false, false, false, false, true, true]
x ^ y .. [false, false, false, false, false, true, false, false, false, false]
x | y | z .. [true, false, false, true, false, true, false, true, true, true]
x & y & z .. [false, false, false, true, false, false, false, false, true, false]
x || y || z .. [true, false, false, true, false, true, false, true, true, true]
x && y && z .. [false, false, false, true, false, false, false, false, true, false]
x ^ y ^ z .. [false, false, false, true, false, true, false, true, true, false]

======== #10 operators applying arguments - 1 ========

f(a:number, b:number, c:number, d:number):map = format('%d-%d-%d-%d', a, b, c, d)
f % [1, 2, 3, 4] .. 1-2-3-4
f % [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] .. ['1-4-7-10', '2-5-8-11', '3-6-9-12']
f * [1, 2, 3, 4] .. 1-2-3-4
f * [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]] .. ['1-2-3-4', '5-6-7-8', '9-10-11-12', '13-14-15-16', '17-18-19-20']

======== #11 operators applying arguments - 2 ========

f(a:number, b:number, c:number, d:number):map = a + b + c + d
f % [1, 2, 3, 4] .. 10
f % [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] .. [22, 26, 30]
f * [1, 2, 3, 4] .. 10
f * [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]] .. [10, 26, 42, 58, 74]

======== #12 boolean with "+", "-" and "*" operators ========

false + false .. 0
false - false .. 0
false * false .. 0
false + true .. 1
false - true .. -1
false * true .. 0
true + false .. 1
true - false .. 1
true * false .. 0
true + true .. 2
true - true .. 0
true * true .. 1
false + 5 .. 5
false - 5 .. -5
false * 5 .. 0
true + 5 .. 6
true - 5 .. -4
true * 5 .. 5
5 + false .. 5
5 - false .. 5
5 * false .. 0
5 + true .. 6
5 - true .. 4
5 * true .. 5
