2023-05-18 08:24:17 +00:00
|
|
|
#!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.
|
|
|
|
|
2024-04-04 15:15:50 +00:00
|
|
|
import options
|
2023-05-18 08:24:17 +00:00
|
|
|
import ./helpers
|
|
|
|
import ../libp2p/utility
|
|
|
|
|
|
|
|
suite "Utility":
|
|
|
|
|
|
|
|
test "successful safeConvert from int8 to int16":
|
2023-05-22 09:07:22 +00:00
|
|
|
let res = safeConvert[int16, int8]((-128).int8)
|
|
|
|
check res == -128'i16
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int16 to int8":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: int8 = safeConvert[int8, int16](32767'i16))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "successful safeConvert from uint8 to uint16":
|
2023-05-22 09:07:22 +00:00
|
|
|
let res: uint16 = safeConvert[uint16, uint8](255'u8)
|
|
|
|
check res == 255'u16
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from uint16 to uint8":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: uint8 = safeConvert[uint8, uint16](256'u16))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "successful safeConvert from char to int":
|
2023-05-22 09:07:22 +00:00
|
|
|
let res: int = safeConvert[int, char]('A')
|
|
|
|
check res == 65
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int to char":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: char = safeConvert[char, int](128))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "successful safeConvert from bool to int":
|
2023-05-22 09:07:22 +00:00
|
|
|
let res: int = safeConvert[int, bool](true)
|
|
|
|
check res == 1
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int to bool":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: bool = safeConvert[bool, int](2))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "successful safeConvert from enum to int":
|
|
|
|
type Color = enum red, green, blue
|
2023-05-22 09:07:22 +00:00
|
|
|
let res: int = safeConvert[int, Color](green)
|
|
|
|
check res == 1
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int to enum":
|
|
|
|
type Color = enum red, green, blue
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: Color = safeConvert[Color, int](3))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "successful safeConvert from range to int":
|
2023-05-22 09:07:22 +00:00
|
|
|
let res: int = safeConvert[int, range[1..10]](5)
|
|
|
|
check res == 5
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int to range":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: range[1..10] = safeConvert[range[1..10], int](11))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from int to uint":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: uint = safeConvert[uint, int](11))
|
2023-05-18 08:24:17 +00:00
|
|
|
|
|
|
|
test "unsuccessful safeConvert from uint to int":
|
2023-05-22 09:07:22 +00:00
|
|
|
check not (compiles do:
|
|
|
|
result: uint = safeConvert[int, uint](11.uint))
|
2024-04-04 15:15:50 +00:00
|
|
|
|
|
|
|
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
|