From 49ebf7329a6661b70719a3e425196d85e2b359cb Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Thu, 20 Jan 2022 17:00:00 +0100 Subject: [PATCH] Add tests --- nim_org_parse.nimble | 8 +++++--- src/utils/str.nim | 27 +++++++++++++++++++++++++++ tests/config.nims | 4 ++++ tests/nim.cfg | 1 + tests/utils/test_str.nim | 22 ++++++++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/utils/str.nim create mode 100644 tests/config.nims create mode 100644 tests/nim.cfg create mode 100644 tests/utils/test_str.nim diff --git a/nim_org_parse.nimble b/nim_org_parse.nimble index 5f2aed5..a54b730 100644 --- a/nim_org_parse.nimble +++ b/nim_org_parse.nimble @@ -17,6 +17,8 @@ requires "fusion" # requires "zero_functional" # requires "cascade" -import distros -if detectOs(NixOS): - foreignDep "pkgconfig" +# Tasks + +task tests, "Run all tests": + echo "Runnign all tests" + exec """testament --backendLogging:off --directory:"./tests/" p "utils/*.nim"""" diff --git a/src/utils/str.nim b/src/utils/str.nim new file mode 100644 index 0000000..1a9176a --- /dev/null +++ b/src/utils/str.nim @@ -0,0 +1,27 @@ +import std/strutils +import std/math + +proc safeDelete*(str: string, slice: Slice[int]): string = + ## Deletes the items `str[slice]`, ignoring elements out of range. + if slice.a > str.len - 1: + str + else: + let fromIndex = clamp(slice.a, 0..str.len) + let toIndex = clamp(slice.b, 0..str.len - 1) + + var strDup = str + strDup.delete(fromIndex..toIndex) + strDup + +func findAndDelete*(str: string, chars: set[char], start = 0, last = str.len - 1): string = + ## Find the next instance of `chars` from `start`. + ## When found delete characters until `last`. + let startChar = str.find(chars, start, last) + if startChar == -1: + str + else: + str.safeDelete(startChar..last) + +func deleteAfterNewline*(str: string, start = 0): string = + ## Delete string after next Newline from `start`. + findAndDelete(str, Newlines, start) diff --git a/tests/config.nims b/tests/config.nims new file mode 100644 index 0000000..30e7629 --- /dev/null +++ b/tests/config.nims @@ -0,0 +1,4 @@ +switch("define", "nimUnittestOutputLevel:PRINT_FAILURES") +switch("warnings", false) +switch("hints", false) +switch("path", "$projectDir/../src") diff --git a/tests/nim.cfg b/tests/nim.cfg new file mode 100644 index 0000000..3609521 --- /dev/null +++ b/tests/nim.cfg @@ -0,0 +1 @@ +--path: "../src/" diff --git a/tests/utils/test_str.nim b/tests/utils/test_str.nim new file mode 100644 index 0000000..473c410 --- /dev/null +++ b/tests/utils/test_str.nim @@ -0,0 +1,22 @@ +import std/unittest +import utils/str + +suite "utils/str": + test "safeDelete": + let t = "abc" + check(t.safeDelete(0..0) == "abc") + + check(t.safeDelete(0..1) == "c") + check(t.safeDelete(1..1) == "ac") + check(t.safeDelete(2..2) == "ab") + + # Out of bounds slicing + check(t.safeDelete(0..10) == "") + check(t.safeDelete(10..1) == t) + check(t.safeDelete(3..3) == t) + check(t.safeDelete(3..(-1)) == t) + + test "findAndDelete": + let t = "foo\nbar" + check(t.deleteAfterNewline() == "foo") + check(t.deleteAfterNewline(start = 4) == t)