1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00
jashkenas--coffeescript/test/test_operations.coffee

176 lines
2.7 KiB
CoffeeScript
Raw Normal View History

# CoffeeScript's operations should be chainable, like Python's.
ok 500 > 50 > 5 > -5
ok true is not false is true is not false
ok 0 is 0 isnt 50 is 50
ok 10 < 20 > 10
ok 50 > 10 > 5 is parseInt('5', 10)
eq 1, 1 | 2 < 3 < 4
ok 1 == 1 <= 1, '`x == y <= z` should become `x === y && y <= z`'
2010-07-25 01:23:37 -04:00
i = 0
2010-09-27 01:32:26 -04:00
ok 1 > i++ < 1, 'chained operations should evaluate each value only once'
# `==` and `is` should be interchangeable.
a = b = 1
ok a is 1 and b is 1
ok a == b
ok a is b
# Allow "if x not in y"
2010-07-25 01:23:37 -04:00
obj = {a: true}
ok 'a' of obj
ok 'b' not of obj
# And for "a in b" with array presence.
2010-09-27 01:32:26 -04:00
ok 200 in [100, 200, 300]
2010-07-25 01:23:37 -04:00
array = [100, 200, 300]
2010-09-27 01:32:26 -04:00
ok 200 in array
ok 1 not in array
2010-09-27 01:32:26 -04:00
ok array[0]++ in [99, 100], 'should cache testee'
# And with array presence on an instance variable.
2010-07-25 01:23:37 -04:00
obj = {
list: [1, 2, 3, 4, 5]
in_list: (value) -> value in @list
}
ok obj.in_list 4
ok not obj.in_list 0
# Non-spaced values still work.
2010-07-25 01:23:37 -04:00
x = 10
y = -5
ok x*-y is 50
ok x*+y is -50
# Compound operators.
2010-09-27 01:32:26 -04:00
one = 1
two = 0
one or= 2
two or= 2
2010-09-27 01:32:26 -04:00
eq one, 1
eq two, 2
2010-09-27 01:32:26 -04:00
zero = 0
2010-09-27 01:32:26 -04:00
zero and= 'one'
one and= 'one'
2010-09-27 01:32:26 -04:00
eq zero, 0
eq one , 'one'
2010-09-27 01:32:26 -04:00
# Compound assignment should be careful about caching variables.
count = 0
2010-09-27 01:32:26 -04:00
list = []
2010-09-27 01:32:26 -04:00
list[++count] or= 1
eq list[1], 1
eq count, 1
2010-09-27 01:32:26 -04:00
list[++count] ?= 2
eq list[2], 2
eq count, 2
2010-09-12 11:08:05 -04:00
2010-09-27 01:32:26 -04:00
list[count++] and= 'two'
eq list[2], 'two'
eq count, 3
2010-09-12 11:08:05 -04:00
2010-09-27 01:32:26 -04:00
base = -> ++count; base
2010-09-12 11:08:05 -04:00
2010-09-27 01:32:26 -04:00
base().four or= 4
eq base.four, 4
eq count, 4
2010-09-12 11:08:05 -04:00
2010-09-27 01:32:26 -04:00
base().five ?= 5
eq base.five, 5
eq count, 5
2010-09-12 11:08:05 -04:00
# Ensure that RHS is treated as a group.
a = b = false
a and= b or true
ok a is false
# Bitwise operators:
ok (10 & 3) is 2
ok (10 | 3) is 11
ok (10 ^ 3) is 9
ok (10 << 3) is 80
ok (10 >> 3) is 1
ok (10 >>> 3) is 1
num = 10; ok (num <<= 3) is 80
num = 10; ok (num >>= 3) is 1
num = 10; ok (num >>>= 3) is 1
num = 10; ok (num &= 3) is 2
num = 10; ok (num ^= 3) is 9
num = 10; ok (num |= 3) is 11
# Compound assignment with implicit objects.
obj = undefined
obj ?=
one: 1
ok obj.one is 1
obj and=
two: 2
ok not obj.one
ok obj.two is 2
# Compound assignment as a sub expression.
[a, b, c] = [1, 2, 3]
ok (a + b += c) is 6
ok a is 1
ok b is 5
ok c is 3
2010-08-21 08:56:25 -04:00
# Instanceof.
ok new String instanceof String
ok new Number not instanceof String
#737: `in` should have higher precedence than logical operators.
eq 1, 1 in [1] and 1
2010-10-13 12:12:24 -04:00
#768: `in` should preserve evaluation order.
2010-10-13 12:12:24 -04:00
share = 0
a = -> share++ if share is 0
b = -> share++ if share is 1
c = -> share++ if share is 2
ok a() not in [b(),c()] and share is 3
# `in` with cache and `__indexOf` should work in commaed lists.
eq [Object() in Array()].length, 1
# Operators should respect new lines as spaced.
2010-10-20 21:37:58 -04:00
a = (123) +
456
ok a is 579
2010-10-20 21:37:58 -04:00
a = "1#{2}3" +
"456"
ok a is '123456'
2010-10-23 07:01:26 -04:00
# Multiple operators should space themselves.
ok + +1 is - -1