github.com/google/skylark@v0.0.0-20181101142754-a5f7082aabed/testdata/int.sky (about) 1 # Tests of Skylark 'int' 2 3 load("assert.sky", "assert") 4 5 # basic arithmetic 6 assert.eq(0 - 1, -1) 7 assert.eq(0 + 1, +1) 8 assert.eq(1 + 1, 2) 9 assert.eq(5 + 7, 12) 10 assert.eq(5 * 7, 35) 11 assert.eq(5 - 7, -2) 12 13 # truth 14 assert.true(123) 15 assert.true(-1) 16 assert.true(not 0) 17 18 # floored division 19 # (For real division, see float.sky.) 20 assert.eq(100 // 7, 14) 21 assert.eq(100 // -7, -15) 22 assert.eq(-100 // 7, -15) # NB: different from Go/Java 23 assert.eq(-100 // -7, 14) # NB: different from Go/Java 24 assert.eq(98 // 7, 14) 25 assert.eq(98 // -7, -14) 26 assert.eq(-98 // 7, -14) 27 assert.eq(-98 // -7, 14) 28 29 # remainder 30 assert.eq(100 % 7, 2) 31 assert.eq(100 % -7, -5) # NB: different from Go/Java 32 assert.eq(-100 % 7, 5) # NB: different from Go/Java 33 assert.eq(-100 % -7, -2) 34 assert.eq(98 % 7, 0) 35 assert.eq(98 % -7, 0) 36 assert.eq(-98 % 7, 0) 37 assert.eq(-98 % -7, 0) 38 39 # compound assignment 40 def compound(): 41 x = 1 42 x += 1 43 assert.eq(x, 2) 44 x -= 3 45 assert.eq(x, -1) 46 x *= 39 47 assert.eq(x, -39) 48 x //= 4 49 assert.eq(x, -10) 50 x /= -2 51 assert.eq(x, 5) 52 x %= 3 53 assert.eq(x, 2) 54 # use resolve.AllowBitwise to enable the ops: 55 x = 2 56 x &= 1 57 assert.eq(x, 0) 58 x |= 2 59 assert.eq(x, 2) 60 x ^= 3 61 assert.eq(x, 1) 62 x <<= 2 63 assert.eq(x, 4) 64 x >>=2 65 assert.eq(x, 1) 66 67 compound() 68 69 # int conversion 70 # See float.sky for float-to-int conversions. 71 # We follow Python 3 here, but I can't see the method in its madness. 72 # int from bool/int/float 73 assert.fails(int, 'missing argument') # int() 74 assert.eq(int(False), 0) 75 assert.eq(int(True), 1) 76 assert.eq(int(3), 3) 77 assert.eq(int(3.1), 3) 78 assert.fails(lambda: int(3, base=10), "non-string with explicit base") 79 assert.fails(lambda: int(True, 10), "non-string with explicit base") 80 # int from string, base implicitly 10 81 assert.eq(int("100000000000000000000"), 10000000000 * 10000000000) 82 assert.eq(int("-100000000000000000000"), -10000000000 * 10000000000) 83 assert.eq(int("123"), 123) 84 assert.eq(int("-123"), -123) 85 assert.eq(int("0123"), 123) # not octal 86 assert.eq(int("-0123"), -123) 87 assert.fails(lambda: int("0x12"), "invalid literal with base 10") 88 assert.fails(lambda: int("-0x12"), "invalid literal with base 10") 89 assert.fails(lambda: int("0o123"), "invalid literal.*base 10") 90 assert.fails(lambda: int("-0o123"), "invalid literal.*base 10") 91 # int from string, explicit base 92 assert.eq(int("11", base=9), 10) 93 assert.eq(int("-11", base=9), -10) 94 assert.eq(int("10011", base=2), 19) 95 assert.eq(int("-10011", base=2), -19) 96 assert.eq(int("123", 8), 83) 97 assert.eq(int("-123", 8), -83) 98 assert.eq(int("0123", 8), 83) # redundant zeros permitted 99 assert.eq(int("-0123", 8), -83) 100 assert.eq(int("00123", 8), 83) 101 assert.eq(int("-00123", 8), -83) 102 assert.eq(int("0o123", 8), 83) 103 assert.eq(int("-0o123", 8), -83) 104 assert.eq(int("123", 7), 66) # 1*7*7 + 2*7 + 3 105 assert.eq(int("-123", 7), -66) 106 assert.eq(int("12", 16), 18) 107 assert.eq(int("-12", 16), -18) 108 assert.eq(int("0x12", 16), 18) 109 assert.eq(int("-0x12", 16), -18) 110 assert.eq(0x1000000000000001 * 0x1000000000000001, 0x1000000000000002000000000000001) 111 assert.eq(int("1010", 2), 10) 112 assert.eq(int("111111101", 2), 509) 113 assert.eq(int("0b0101", 0), 5) 114 assert.eq(int("0b00000", 0), 0) 115 assert.eq(1111111111111111 * 1111111111111111, 1234567901234567654320987654321) 116 assert.fails(lambda: int("0x123", 8), "invalid literal.*base 8") 117 assert.fails(lambda: int("-0x123", 8), "invalid literal.*base 8") 118 assert.fails(lambda: int("0o123", 16), "invalid literal.*base 16") 119 assert.fails(lambda: int("-0o123", 16), "invalid literal.*base 16") 120 assert.fails(lambda: int("0x110", 2), "invalid literal.*base 2") 121 # int from string, auto detect base 122 assert.eq(int("123", 0), 123) 123 assert.eq(int("+123", 0), +123) 124 assert.eq(int("-123", 0), -123) 125 assert.eq(int("0x12", 0), 18) 126 assert.eq(int("+0x12", 0), +18) 127 assert.eq(int("-0x12", 0), -18) 128 assert.eq(int("0o123", 0), 83) 129 assert.eq(int("+0o123", 0), +83) 130 assert.eq(int("-0o123", 0), -83) 131 assert.fails(lambda: int("0123", 0), "invalid literal.*base 0") # valid in Python 2.7 132 assert.fails(lambda: int("-0123", 0), "invalid literal.*base 0") 133 134 # bitwise union (int|int), intersection (int&int), XOR (int^int), unary not (~int), 135 # left shift (int<<int), and right shift (int>>int). 136 # use resolve.AllowBitwise to enable the ops. 137 # TODO(adonovan): this is not yet in the Skylark spec, 138 # but there is consensus that it should be. 139 assert.eq(1|2, 3) 140 assert.eq(3|6, 7) 141 assert.eq((1|2) & (2|4), 2) 142 assert.eq(1 ^ 2, 3) 143 assert.eq(2 ^ 2, 0) 144 assert.eq(1 | 0 ^ 1, 1) # check | and ^ operators precedence 145 assert.eq(~1, -2) 146 assert.eq(~-2, 1) 147 assert.eq(~0, -1) 148 assert.eq(1 << 2, 4) 149 assert.eq(2 >> 1, 1) 150 assert.fails(lambda: 2 << -1, "negative shift count") 151 assert.fails(lambda: 1 << 512, "shift count too large") 152 153 # comparisons 154 # TODO(adonovan): test: < > == != etc 155 assert.lt(-2, -1) 156 assert.lt(-1, 0) 157 assert.lt(0, 1) 158 assert.lt(1, 2) 159 assert.true(2 >= 2) 160 assert.true(2 > 1) 161 assert.true(1 >= 1) 162 assert.true(1 > 0) 163 assert.true(0 >= 0) 164 assert.true(0 > -1) 165 assert.true(-1 >= -1) 166 assert.true(-1 > -2) 167 168 # precision 169 maxint64 = 9223372036854775807 # = 2^63 170 minint64 = -maxint64 - 1 # = -2^64 171 assert.eq(str(maxint64), "9223372036854775807") 172 assert.eq(str(maxint64+1), "9223372036854775808") 173 assert.eq(str(minint64), "-9223372036854775808") 174 assert.eq(str(minint64-1), "-9223372036854775809") 175 assert.eq(str(minint64 * minint64), "85070591730234615865843651857942052864") 176 177 # string formatting 178 assert.eq("%o %x %d" % (0o755, 0xDEADBEEF, 42), "755 deadbeef 42") 179 nums = [-95, -1, 0, +1, +95] 180 assert.eq(' '.join(["%o" % x for x in nums]), "-137 -1 0 1 137") 181 assert.eq(' '.join(["%d" % x for x in nums]), "-95 -1 0 1 95") 182 assert.eq(' '.join(["%i" % x for x in nums]), "-95 -1 0 1 95") 183 assert.eq(' '.join(["%x" % x for x in nums]), "-5f -1 0 1 5f") 184 assert.eq(' '.join(["%X" % x for x in nums]), "-5F -1 0 1 5F") 185 assert.eq("%o %x %d" % (123, 123, 123), "173 7b 123") 186 assert.eq("%o %x %d" % (123.1, 123.1, 123.1), "173 7b 123") # non-int operands are acceptable 187 assert.fails(lambda: "%d" % True, "cannot convert bool to int")