summary refs log tree commit diff stats
path: root/tests/int/tints.nim
blob: df72ec80abe7f30d8dc6e0c2089c56b22617cff7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
discard """
  matrix: "; --backend:js --jsbigint64:off; --backend:js --jsbigint64:on"
  output: '''
0 0
0 0
Success'''
"""
# Test the different integer operations


import std/private/jsutils

var testNumber = 0

template test(opr, a, b, c: untyped): untyped =
  # test the expression at compile and runtime
  block:
    const constExpr = opr(a, b)
    when constExpr != c:
      {.error: "Test failed " & $constExpr & " " & $c.}
    inc(testNumber)
    #Echo("Test: " & $testNumber)
    var aa = a
    var bb = b
    var varExpr = opr(aa, bb)
    assert(varExpr == c)

test(`+`, 12'i8, -13'i16, -1'i16)
test(`shl`, 0b11, 0b100, 0b110000)
whenJsNoBigInt64: discard
do:
  test(`shl`, 0b11'i64, 0b100'i64, 0b110000'i64)
when not defined(js):
  # mixed type shr needlessly complicates codegen with bigint
  # and thus is not yet supported in JS for 64 bit ints
  test(`shl`, 0b11'i32, 0b100'i64, 0b110000'i64)
test(`shl`, 0b11'i32, 0b100'i32, 0b110000'i32)

test(`or`, 0xf0f0'i16, 0x0d0d'i16, 0xfdfd'i16)
test(`and`, 0xf0f0'i16, 0xfdfd'i16, 0xf0f0'i16)

whenJsNoBigInt64: discard
do:
  test(`shr`, 0xffffffffffffffff'i64, 0x4'i64, 0xffffffffffffffff'i64)
test(`shr`, 0xffff'i16, 0x4'i16, 0xffff'i16)
test(`shr`, 0xff'i8, 0x4'i8, 0xff'i8)

whenJsNoBigInt64: discard
do:
  test(`shr`, 0xffffffff'i64, 0x4'i64, 0x0fffffff'i64)
test(`shr`, 0xffffffff'i32, 0x4'i32, 0xffffffff'i32)

whenJsNoBigInt64: discard
do:
  test(`shl`, 0xffffffffffffffff'i64, 0x4'i64, 0xfffffffffffffff0'i64)
test(`shl`, 0xffff'i16, 0x4'i16, 0xfff0'i16)
test(`shl`, 0xff'i8, 0x4'i8, 0xf0'i8)

whenJsNoBigInt64: discard
do:
  test(`shl`, 0xffffffff'i64, 0x4'i64, 0xffffffff0'i64)
test(`shl`, 0xffffffff'i32, 0x4'i32, 0xfffffff0'i32)

# bug #916
proc unc(a: float): float =
  return a

echo int(unc(0.5)), " ", int(unc(-0.5))
echo int(0.5), " ", int(-0.5)

block: # Casts to uint
  template testCast(fromValue: typed, toType: typed, expectedResult: typed) =
    let src = fromValue
    let dst = cast[toType](src)
    if dst != expectedResult:
      echo "Casting ", astToStr(fromValue), " to ", astToStr(toType), " = ", dst.int, " instead of ", astToStr(expectedResult)
    doAssert(dst == expectedResult)

  testCast(-1'i16, uint16, 0xffff'u16)
  testCast(0xffff'u16, int16, -1'i16)

  testCast(0xff'u16, uint8, 0xff'u8)
  testCast(0xffff'u16, uint8, 0xff'u8)

  testCast(-1'i16, uint32, 0xffffffff'u32)
  testCast(0xffffffff'u32, int32, -1)

  testCast(0xfffffffe'u32, int32, -2'i32)
  testCast(0xffffff'u32, int16, -1'i32)

  testCast(-5'i32, uint8, 251'u8)

# issue #7174
let c = 1'u
let val = c > 0
doAssert val

block: # bug #6752
  when not defined(js) or (defined(js) and compileOption("jsbigint64")):
    let x = 711127'i64
    doAssert x * 86400'i64 == 61441372800'i64

block: # bug #17604
  let a = 2147483648'u
  doAssert (a and a) == a
  doAssert (a or 0) == a

block: # bitwise not
  let
    z8 = 0'u8
    z16 = 0'u16
    z32 = 0'u32
    z64 = 0'u64
  doAssert (not z8) == uint8.high
  doAssert (not z16) == uint16.high
  doAssert (not z32) == uint32.high
  when not defined(js) or (defined(js) and compileOption("jsbigint64")):
    doAssert (not z64) == uint64.high

block: # shl
  let i8 = int8.high
  let i16 = int16.high
  let i32 = int32.high
  let i64 = int64.high
  doAssert i8 shl 1 == -2
  doAssert i8 shl 2 == -4
  doAssert i16 shl 1 == -2
  doAssert i16 shl 2 == -4
  doAssert i32 shl 1 == -2
  doAssert i32 shl 2 == -4
  when not defined(js) or (defined(js) and compileOption("jsbigint64")):
    doAssert i64 shl 1 == -2
    doAssert i64 shl 2 == -4

  let u8 = uint8.high
  let u16 = uint16.high
  let u32 = uint32.high
  let u64 = uint64.high
  doAssert u8 shl 1 == u8 - 1
  doAssert u16 shl 1 == u16 - 1
  doAssert u32 shl 1 == u32 - 1
  when not defined(js) or (defined(js) and compileOption("jsbigint64")):
    doAssert u64 shl 1 == u64 - 1

block: # bug #23378
  var neg = -1  # prevent compile-time evaluation
  let n = abs BiggestInt neg
  doAssert n == 1

echo("Success") #OUT Success