-
Notifications
You must be signed in to change notification settings - Fork 55
/
testutility.nim
156 lines (128 loc) · 4.09 KB
/
testutility.nim
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
151
152
153
154
155
156
#!fmt: off Disable formatting for this file https://github.com/arnetheduck/nph/issues/69
{.used.}
# Nim-Libp2p
# Copyright (c) 2023 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import options
import ./helpers
import ../libp2p/utility
suite "Utility":
test "successful safeConvert from int8 to int16":
let res = safeConvert[int16]((-128).int8)
check res == -128'i16
test "unsuccessful safeConvert from int16 to int8":
check not (compiles do:
result: int8 = safeConvert[int8](32767'i16))
test "successful safeConvert from uint8 to uint16":
let res: uint16 = safeConvert[uint16](255'u8)
check res == 255'u16
test "unsuccessful safeConvert from uint16 to uint8":
check not (compiles do:
result: uint8 = safeConvert[uint8](256'u16))
test "unsuccessful safeConvert from int to char":
check not (compiles do:
result: char = safeConvert[char](128))
test "successful safeConvert from bool to int":
let res: int = safeConvert[int](true)
check res == 1
test "unsuccessful safeConvert from int to bool":
check not (compiles do:
result: bool = safeConvert[bool](2))
test "successful safeConvert from enum to int":
type Color = enum red, green, blue
let res: int = safeConvert[int](green)
check res == 1
test "unsuccessful safeConvert from int to enum":
type Color = enum red, green, blue
check not (compiles do:
result: Color = safeConvert[Color](3))
test "successful safeConvert from range to int":
let res: int = safeConvert[int, range[1..10]](5)
check res == 5
test "unsuccessful safeConvert from int to range":
check not (compiles do:
result: range[1..10] = safeConvert[range[1..10], int](11))
test "unsuccessful safeConvert from int to uint":
check not (compiles do:
result: uint = safeConvert[uint](11))
test "unsuccessful safeConvert from uint to int":
check not (compiles do:
result: uint = safeConvert[int](11.uint))
suite "withValue and valueOr templates":
type
TestObj = ref object
x: int
proc objIncAndOpt(self: TestObj): Opt[TestObj] =
self.x.inc()
return Opt.some(self)
proc objIncAndOption(self: TestObj): Option[TestObj] =
self.x.inc()
return some(self)
test "withValue calls right branch when Opt/Option is none":
var counter = 0
# check Opt/Option withValue with else
Opt.none(TestObj).withValue(v):
fail()
else:
counter.inc()
none(TestObj).withValue(v):
fail()
else:
counter.inc()
check counter == 2
# check Opt/Option withValue without else
Opt.none(TestObj).withValue(v):
fail()
none(TestObj).withValue(v):
fail()
test "withValue calls right branch when Opt/Option is some":
var counter = 1
# check Opt/Option withValue with else
Opt.some(counter).withValue(v):
counter.inc(v)
else:
fail()
some(counter).withValue(v):
counter.inc(v)
else:
fail()
# check Opt/Option withValue without else
Opt.some(counter).withValue(v):
counter.inc(v)
some(counter).withValue(v):
counter.inc(v)
check counter == 16
test "withValue calls right branch when Opt/Option is some with proc call":
var obj = TestObj(x: 0)
# check Opt/Option withValue with else
objIncAndOpt(obj).withValue(v):
v.x.inc()
else:
fail()
objIncAndOption(obj).withValue(v):
v.x.inc()
else:
fail()
# check Opt/Option withValue without else
objIncAndOpt(obj).withValue(v):
v.x.inc()
objIncAndOption(obj).withValue(v):
v.x.inc()
check obj.x == 8
test "valueOr calls with and without proc call":
var obj = none(TestObj).valueOr:
TestObj(x: 0)
check obj.x == 0
obj = some(TestObj(x: 2)).valueOr:
fail()
return
check obj.x == 2
obj = objIncAndOpt(obj).valueOr:
fail()
return
check obj.x == 3