nim-codex/tests/codex/utils/testoptions.nim

50 lines
1.4 KiB
Nim
Raw Permalink Normal View History

import std/unittest
import codex/utils/options
import ../helpers
checksuite "optional casts":
test "casting value to same type works":
check 42 as int == some 42
test "casting value to unrelated type evaluates to None":
check 42 as string == string.none
test "casting value to subtype works":
type
BaseType = ref object of RootObj
SubType = ref object of BaseType
let x: BaseType = SubType()
check x as SubType == SubType(x).some
test "casting to unrelated subtype evaluates to None":
type
BaseType = ref object of RootObj
SubType = ref object of BaseType
OtherType = ref object of BaseType
let x: BaseType = SubType()
check x as OtherType == OtherType.none
test "casting works on optional types":
check 42.some as int == some 42
check 42.some as string == string.none
check int.none as int == int.none
checksuite "Optionalize":
test "does not except non-object types":
static:
doAssert not compiles(Optionalize(int))
test "converts object fields to option":
type BaseType = object
a: int
b: bool
c: string
d: Option[string]
type OptionalizedType = Optionalize(BaseType)
check OptionalizedType.a is Option[int]
check OptionalizedType.b is Option[bool]
check OptionalizedType.c is Option[string]
check OptionalizedType.d is Option[string]