2020-04-22 12:41:42 +00:00
|
|
|
import
|
|
|
|
unittest, typetraits,
|
2020-03-29 15:34:45 +00:00
|
|
|
../stew/objects
|
|
|
|
|
|
|
|
when defined(nimHasUsed):
|
|
|
|
{.used.}
|
|
|
|
|
2020-04-22 13:34:11 +00:00
|
|
|
{.experimental: "notnil".}
|
|
|
|
|
2020-03-29 15:34:45 +00:00
|
|
|
suite "Objects":
|
|
|
|
test "baseType":
|
|
|
|
type
|
|
|
|
Foo = ref object of RootObj
|
|
|
|
Bar = ref object of Foo
|
|
|
|
Baz = object of RootObj
|
|
|
|
Bob = object of Baz
|
|
|
|
Bill = ref object of Bob
|
|
|
|
|
|
|
|
var
|
|
|
|
foo = Foo()
|
|
|
|
bar = Bar()
|
|
|
|
baz = Baz()
|
|
|
|
bob = Bob()
|
|
|
|
bill = Bill()
|
|
|
|
|
|
|
|
when defined(nimTypeNames):
|
|
|
|
check:
|
|
|
|
foo.baseType == "Foo:ObjectType"
|
|
|
|
bar.baseType == "Bar:ObjectType"
|
|
|
|
baz.baseType == "Baz"
|
|
|
|
bob.baseType == "Bob"
|
|
|
|
bill.baseType == "Bill:ObjectType"
|
|
|
|
|
|
|
|
proc f(o: Foo) =
|
|
|
|
check $o.type == "Foo"
|
|
|
|
check o.baseType == "Bar:ObjectType"
|
|
|
|
|
|
|
|
f(bar)
|
|
|
|
|
2020-04-22 12:41:42 +00:00
|
|
|
test "declval":
|
2020-04-22 13:34:11 +00:00
|
|
|
type
|
|
|
|
Bar = object
|
|
|
|
x: RootRef not nil
|
|
|
|
|
2020-05-23 16:55:55 +00:00
|
|
|
DistinctBar = distinct Bar
|
|
|
|
|
2020-04-22 12:41:42 +00:00
|
|
|
proc foo(x: int): string =
|
|
|
|
discard
|
|
|
|
|
|
|
|
proc foo(x: var int): float =
|
|
|
|
discard
|
|
|
|
|
2020-04-22 13:34:11 +00:00
|
|
|
proc foo(x: Bar): int =
|
|
|
|
discard
|
|
|
|
|
2020-04-22 12:41:42 +00:00
|
|
|
type
|
|
|
|
T1 = typeof foo(declval(int))
|
|
|
|
T2 = typeof foo(declval(var int))
|
|
|
|
T3 = typeof foo(declval(lent int))
|
2020-04-22 13:34:11 +00:00
|
|
|
T4 = typeof foo(declval(Bar))
|
|
|
|
T5 = typeof foo(declval(var Bar))
|
2020-05-23 16:55:55 +00:00
|
|
|
T6 = typeof declval(DistinctBar)
|
2020-04-22 12:41:42 +00:00
|
|
|
|
|
|
|
check:
|
|
|
|
T1 is string
|
|
|
|
T2 is float
|
|
|
|
T3 is string
|
2020-04-22 13:34:11 +00:00
|
|
|
T4 is int
|
|
|
|
T5 is int
|
2020-05-23 16:55:55 +00:00
|
|
|
T6 is DistinctBar
|
|
|
|
T6 isnot Bar
|
2020-04-22 12:41:42 +00:00
|
|
|
|
2020-06-22 15:35:42 +00:00
|
|
|
when false:
|
|
|
|
# TODO: Not possible yet (see objects.nim)
|
|
|
|
test "hasHoles":
|
|
|
|
type
|
|
|
|
WithoutHoles = enum
|
|
|
|
A1, B1, C1
|
|
|
|
|
|
|
|
WithoutHoles2 = enum
|
|
|
|
A2 = 2, B2 = 3, C2 = 4
|
|
|
|
|
|
|
|
WithHoles = enum
|
|
|
|
A3, B3 = 2, C3
|
|
|
|
|
|
|
|
check:
|
|
|
|
hasHoles(WithoutHoles2) == false
|
|
|
|
hasHoles(WithoutHoles) == false
|
|
|
|
hasHoles(WithHoles) == true
|
|
|
|
|
|
|
|
test "checkedEnumAssign":
|
|
|
|
type
|
|
|
|
SomeEnum = enum
|
|
|
|
A1, B1, C1
|
|
|
|
|
|
|
|
AnotherEnum = enum
|
|
|
|
A2 = 2, B2, C2
|
|
|
|
|
|
|
|
var
|
|
|
|
e1 = A1
|
|
|
|
e2 = A2
|
|
|
|
|
|
|
|
check:
|
|
|
|
checkedEnumAssign(e1, 2)
|
|
|
|
e1 == C1
|
|
|
|
|
|
|
|
check:
|
|
|
|
not checkedEnumAssign(e1, 5)
|
|
|
|
e1 == C1
|
|
|
|
|
|
|
|
check:
|
|
|
|
checkedEnumAssign(e1, 0)
|
|
|
|
e1 == A1
|
|
|
|
|
|
|
|
check:
|
|
|
|
not checkedEnumAssign(e1, -1)
|
|
|
|
e1 == A1
|
|
|
|
|
|
|
|
check:
|
|
|
|
checkedEnumAssign(e2, 2)
|
|
|
|
e2 == A2
|
|
|
|
|
|
|
|
check:
|
|
|
|
not checkedEnumAssign(e2, 5)
|
|
|
|
e2 == A2
|
|
|
|
|
|
|
|
check:
|
|
|
|
checkedEnumAssign(e2, 4)
|
|
|
|
e2 == C2
|
|
|
|
|
|
|
|
check:
|
|
|
|
not checkedEnumAssign(e2, 1)
|
|
|
|
e2 == C2
|
|
|
|
|