From 1cb88f9540c7f9c4398c13b83c2594816fa28369 Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Wed, 1 Nov 2017 18:55:52 +0200 Subject: Add real validation --- nimrec/recordset.nim | 8 ++++++++ tests/test.nim | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/nimrec/recordset.nim b/nimrec/recordset.nim index 29422e9..0a29029 100644 --- a/nimrec/recordset.nim +++ b/nimrec/recordset.nim @@ -13,6 +13,7 @@ import times type FieldKind* {.pure.} = enum Integer + Real String FieldDescriptor* = ref object @@ -76,10 +77,14 @@ proc newRecordSet*(record: Record): RecordSet = let desc = addFieldDescriptor(result, label) case kind of "int": desc.kind = FieldKind.Integer + of "real": desc.kind = FieldKind.Real else: desc.kind = FieldKind.String let integerPeg = peg"^ '-'? ('0' / ([1-9] \d*)) $" +# This should correspond to the JSON Number spec at the moment +let realPeg = peg"^ '-'? ('0' / ([1-9] \d*)) ('.' \d+)? ([Ee] [+-]? \d+)? $" + proc validate*(record: Record, recordSet: RecordSet) = let labels = toSet(toSeq(labels(record))) @@ -106,6 +111,9 @@ proc validate*(record: Record, recordSet: RecordSet) = of FieldKind.Integer: if not (value =~ integerPeg): raise newException(IntegrityError, format("integer expected")) + of FieldKind.Real: + if not (value =~ realPeg): + raise newException(IntegrityError, format("real expected")) else: discard iterator recordsInSet*(stream: Stream, kind: string): Record = diff --git a/tests/test.nim b/tests/test.nim index 3eda4eb..06c7ce0 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -433,3 +433,28 @@ suite "type basics: integers": let data = prologue & "Value: " & value & "\n" expect(Exception): discard toSeq(recordsInSet(newStringStream(data), "Entry")) + +suite "type basics: reals": + const prologue = """ +%rec: Entry +%type: Value real + +""" + + test "valid reals": + const values = ["0", "1", "123456789", "987654321", "-123456789", + "-987654321", "-0", + "0.0", "0.12345", "1234.5678", + "1e8", "1E8", "1e+9", "1E-9", "1e10"] + + for value in values: + let data = prologue & "Value: " & value & "\n" + discard toSeq(recordsInSet(newStringStream(data), "Entry")) + + test "invalid reals": + const values = ["0.", "foobar", "01", "1-"] + + for value in values: + let data = prologue & "Value: " & value & "\n" + expect(Exception): + discard toSeq(recordsInSet(newStringStream(data), "Entry")) -- cgit v1.2.3