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")