aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2017-10-25 22:00:27 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2017-10-25 23:15:54 +0300
commit46b03de3685b8714f97013d435a337ba4c0eaa8e (patch)
tree7c36306af66285e26dc5bfddd47a4ab45dd86f4c /tests
downloadnimrec-46b03de3685b8714f97013d435a337ba4c0eaa8e.tar.gz
nimrec-46b03de3685b8714f97013d435a337ba4c0eaa8e.zip
initial commit
Diffstat (limited to 'tests')
-rw-r--r--tests/nim.cfg1
-rw-r--r--tests/test.nim224
2 files changed, 225 insertions, 0 deletions
diff --git a/tests/nim.cfg b/tests/nim.cfg
new file mode 100644
index 0000000..37e96f0
--- /dev/null
+++ b/tests/nim.cfg
@@ -0,0 +1 @@
+--path:"../"
diff --git a/tests/test.nim b/tests/test.nim
new file mode 100644
index 0000000..5fb9821
--- /dev/null
+++ b/tests/test.nim
@@ -0,0 +1,224 @@
+import unittest
+import streams
+import sequtils
+
+import nimrec
+
+suite "parsing":
+ test "basics":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+"""
+
+ var ss = newStringStream(data)
+ var records = toSeq(records(ss))
+ check(len(records) == 2)
+ check(len(records[0]) == 2)
+ check(len(records[1]) == 2)
+ check(records[0]["Name"] == "John Doe")
+ check(records[0]["Age"] == "34")
+ check(records[1]["Name"] == "Jane Doe")
+ check(records[1]["Age"] == "32")
+
+ test "comments":
+ const data = """
+# This is a comment
+Name: John Doe
+Age: 34
+
+# A comment between records
+# With multiple lines!
+
+Name: Jane Doe
+# A comment between fields
+Age: 32
+"""
+
+ let ss = newStringStream(data)
+ let records = toSeq(records(ss))
+ check(len(records) == 2)
+ check(records[0]["Name"] == "John Doe")
+ check(records[0]["Age"] == "34")
+ check(records[1]["Name"] == "Jane Doe")
+ check(records[1]["Age"] == "32")
+
+ test "only initial whitespace skipped from values":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+"""
+
+ let ss = newStringStream(data)
+ let records = toSeq(records(ss))
+ check(len(records) == 2)
+ check(records[0]["Name"] == " John Doe")
+ check(records[0]["Age"] == " 34")
+ check(records[1]["Name"] == "Jane Doe")
+ check(records[1]["Age"] == "\t32")
+
+ test "trailing whitespace included in values":
+ const data =
+ "Name: John Doe \l" &
+ "Age: 34\t\l"
+
+ let ss = newStringStream(data)
+ let records = toSeq(records(ss))
+ check(len(records) == 1)
+ check(records[0]["Name"] == "John Doe ")
+ check(records[0]["Age"] == "34\t")
+
+ test "records with single field":
+ const data = """
+Name: John Doe
+
+Name: Jane Doe
+
+Name: Foobar!
+"""
+
+ let ss = newStringStream(data)
+ let records = toSeq(records(ss))
+ check(len(records) == 3)
+ check(len(records[0]) == 1)
+ check(records[0]["Name"] == "John Doe")
+ check(len(records[1]) == 1)
+ check(records[1]["Name"] == "Jane Doe")
+ check(len(records[2]) == 1)
+ check(records[2]["Name"] == "Foobar!")
+
+ test "parse error if colon missing":
+ let ss = newStringStream("Name\nAge: 34\n")
+ expect(RecParseError):
+ discard toSeq(records(ss))
+
+ test "parse error if invalid label":
+ let ss = newStringStream("Name: John Doe\nFoo-bar: 111")
+ expect(RecParseError):
+ discard toSeq(records(ss))
+
+ test "label can start with %":
+ let ss = newStringStream("%rec: Entry\n")
+ let records = toSeq(records(ss))
+ check(len(records) == 1)
+ check(len(records[0]) == 1)
+ let fields = toSeq(items(records[0]))
+ check(fields[0].label == "%rec")
+ check(fields[0].value == "Entry")
+
+ test "field must be terminated by newline":
+ let ss = newStringStream("%rec: Entry\n%type: Id int")
+ expect(RecParseError):
+ discard toSeq(records(ss))
+
+ test "multiple fields with same label":
+ const data = """
+Name: John Doe
+Age: 34
+Email: john@doe.me
+Email: john.doe@foobar.com
+
+Name: Jane Doe
+Age: 32
+Email: jane@doe.me
+"""
+
+ var ss = newStringStream(data)
+ var emails: seq[string] = @[]
+ for record in records(ss):
+ for label, value in record:
+ if label == "Email":
+ add(emails, value)
+ check(len(emails) == 3)
+ check(emails[0] == "john@doe.me")
+ check(emails[1] == "john.doe@foobar.com")
+ check(emails[2] == "jane@doe.me")
+
+
+suite "misc":
+ test "record items iterator":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+"""
+
+ var ss = newStringStream(data)
+ var fields: seq[Field] = @[]
+ for record in records(ss):
+ for field in record:
+ add(fields, field)
+ check(len(fields) == 4)
+ check(fields[0].label == "Name")
+ check(fields[0].value == "John Doe")
+ check(fields[1].label == "Age")
+ check(fields[1].value == "34")
+ check(fields[2].label == "Name")
+ check(fields[2].value == "Jane Doe")
+ check(fields[3].label == "Age")
+ check(fields[3].value == "32")
+
+ test "record pairs iterator":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+"""
+
+ var ss = newStringStream(data)
+ var results: seq[string] = @[]
+ for record in records(ss):
+ for label, value in record:
+ add(results, label)
+ add(results, value)
+ check(len(results) == 8)
+ check(results[0] == "Name")
+ check(results[1] == "John Doe")
+ check(results[2] == "Age")
+ check(results[3] == "34")
+ check(results[4] == "Name")
+ check(results[5] == "Jane Doe")
+ check(results[6] == "Age")
+ check(results[7] == "32")
+
+ test "hasField":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+Email: jane@doe.me
+"""
+
+ var ss = newStringStream(data)
+ var records = toSeq(records(ss))
+ check(len(records) == 2)
+ check(not hasField(records[0], "Email"))
+ check(hasField(records[1], "Email"))
+
+ test "contains":
+ const data = """
+Name: John Doe
+Age: 34
+
+Name: Jane Doe
+Age: 32
+Email: jane@doe.me
+"""
+
+ var ss = newStringStream(data)
+ var records = toSeq(records(ss))
+ check(len(records) == 2)
+ check("Email" notin records[0])
+ check("Email" in records[1])