patty/test.nim
Andrea Ferretti ff1d10be30 Renamed macro
2015-07-05 15:34:30 +02:00

127 lines
No EOL
2.9 KiB
Nim

import unittest, patty, macros
suite "variant construction":
test "basic creation":
variant Shape:
Circle(r: float, x: float, y: float)
Rectangle(w: float, h: float)
Square(side: int)
let c = Shape(kind: CircleE, r: 4, x: 2, y: 0)
check c.r == 4.0
test "allowing empty objects":
variant Shape:
Circle(r: float, x: float, y: float)
Rectangle(w: float, h: float)
Square(side: int)
UnitCircle
let r = Shape(kind: RectangleE, w: 2, h: 5)
check r.h == 5.0
test "constructor creation":
variant Shape:
Circle(r: float, x: float, y: float)
Rectangle(w: float, h: float)
Square(side: int)
let c = Circle(r = 4, x = 2, y = 0)
check c.kind == CircleE
check c.r == 4.0
test "constructor of constant objects":
variant Shape:
Circle(r: float, x: float, y: float)
Rectangle(w: float, h: float)
Square(side: int)
UnitCircle
let c = UnitCircle()
check c.kind == UnitCircleE
test "recursive types":
variant IntList:
Nil
Cons(head: int, tail: ref IntList)
proc inew[A](a: A): ref A =
new(result)
result[] = a
var d = Cons(3, inew(Cons(2, inew(Cons(1, inew(Nil()))))))
check d.head == 3
check d.tail.head == 2
test "generated equality":
variant Shape:
Circle(r: float, x: float, y: float)
Rectangle(w: float, h: float)
Square(side: int)
UnitCircle
let
c1 = Circle(r = 3, x = 2, y = 5)
c2 = Circle(r = 3, x = 2, y = 5)
c3 = Circle(r = 2, x = 3, y = 5)
s = Square(3)
u1 = UnitCircle()
u2 = UnitCircle()
check c1 == c2
check c1 != c3
check c1 != s
check u1 == u2
suite "pattern matching":
type
ShapeKind = enum
Circle, Rectangle
Shape = object
case kind: ShapeKind
of Circle:
x, y, r: float
of Rectangle:
w, h: float
test "basic matching":
let c = Shape(kind: Circle, r: 4, x: 2, y: 0)
var res: float = 0
match c:
Circle(x: x, y: y, r: r):
res = r
Rectangle(w: w, h: h):
res = 1
check res == 4.0
test "binding to different variable names":
let c = Shape(kind: Circle, r: 4, x: 2, y: 0)
var res: float = 0
match c:
Circle(x: x, y: y, r: someNumber):
res = someNumber
Rectangle(w: w, h: h):
res = 1
check res == 4.0
test "binding a complex expression":
proc makeRect(w, h: float): Shape =
Shape(kind: Rectangle, w: w, h: h)
var res: float = 0
match makeRect(3, 4):
Circle(x: x, y: y, r: r):
res = r
Rectangle(w: w, h: h):
res = w + h
check res == 7.0
test "ignoring _ bindings":
let c = Shape(kind: Circle, r: 4, x: 2, y: 0)
var res: float = 0
match c:
Circle(x: _, y: _, r: r):
res = r
Rectangle(w: w, h: h):
res = w + h
check res == 4.0