Skip to content

Commit

Permalink
Minor bugfixes, adding tests (#70)
Browse files Browse the repository at this point in the history
  • Loading branch information
tdegeus committed Nov 14, 2023
1 parent 746bff8 commit 546ed3b
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 10 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ jobs:
- name: Install library
run: python -m pip install . -v --no-build-isolation --no-deps

- name: Run tests
run: python -m unittest discover tests -v

- name: Run tests
working-directory: tests
run: |
Expand Down
25 changes: 15 additions & 10 deletions GooseSLURM/duration.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,18 @@ def asSeconds(data: str | float | int, default: int = None) -> int | float:
``<int>``
Number of seconds as integer (or default value if the conversion fails).
"""
if data is None:
return default

# number: implicitly assume that the input is in seconds
# plain number (int or float), interpreted as seconds
if isinstance(data, int) or isinstance(data, float):
return data

if data is None:
return default
if re.match(r"^[0-9]*\.[0-9]*$", data):
return float(data)

if re.match(r"^[0-9]*$", data):
return int(data)

# convert SLURM time string (e.g. "1-00:00:00")
if re.match(r"^[0-9]*\-[0-9]*\:[0-9]*\:[0-9]*$", data):
Expand Down Expand Up @@ -78,19 +83,19 @@ def asSeconds(data: str | float | int, default: int = None) -> int | float:
# convert humanly readable time (e.g. "1d")
if re.match(r"^[0-9]*\.?[0-9]*[a-zA-Z]$", data):
if data[-1] == "d":
return int(float(data[:-1]) * float(60 * 60 * 24))
return float(data[:-1]) * float(60 * 60 * 24)
elif data[-1] == "h":
return int(float(data[:-1]) * float(60 * 60))
return float(data[:-1]) * float(60 * 60)
elif data[-1] == "m":
return int(float(data[:-1]) * float(60))
return float(data[:-1]) * float(60)
elif data[-1] == "s":
return int(float(data[:-1]) * float(1))
return float(data[:-1]) * float(1)
elif data[-1] == "w":
return int(float(data[:-1]) * float(60 * 60 * 24 * 7))
return float(data[:-1]) * float(60 * 60 * 24 * 7)
elif data[-1] == "M":
return int(float(data[:-1]) * float(60 * 60 * 24 * 7 * 31))
return float(data[:-1]) * float(60 * 60 * 24 * 7 * 31)
elif data[-1] == "y":
return int(float(data[:-1]) * float(60 * 60 * 24 * 7 * 365))
return float(data[:-1]) * float(60 * 60 * 24 * 7 * 365)

# one last try (implicitly assume that the input is in seconds)
try:
Expand Down
Empty file added tests/__init__.py
Empty file.
37 changes: 37 additions & 0 deletions tests/test_duration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import unittest

import GooseSLURM as slurm


class MyTests(unittest.TestCase):
def test_asSeconds(self):
for value in [1, 2, 3, 1.2, 2.3, 3.4]:
self.assertEqual(slurm.duration.asSeconds(str(value)), value)

minute = 60
hour = 60 * 60
day = 24 * 60 * 60

for unit, prefactor in zip(["s", "m", "h", "d"], [1, minute, hour, day]):
for value in [1, 2, 3, 1.2, 2.3, 3.4]:
self.assertEqual(slurm.duration.asSeconds(str(value) + unit), value * prefactor)

self.assertEqual(slurm.duration.asSeconds("1-00:00:00"), day)
self.assertEqual(slurm.duration.asSeconds("1-00:00:01"), day + 1)
self.assertEqual(slurm.duration.asSeconds("1-00:02:01"), day + 1 + 2 * minute)
self.assertEqual(slurm.duration.asSeconds("1-03:02:01"), day + 1 + 2 * minute + 3 * hour)
self.assertEqual(slurm.duration.asSeconds("3-00:00:00"), 3 * day)

self.assertEqual(slurm.duration.asSeconds("00:00:00"), 0)
self.assertEqual(slurm.duration.asSeconds("00:00:01"), 1)
self.assertEqual(slurm.duration.asSeconds("00:02:01"), 1 + 2 * minute)
self.assertEqual(slurm.duration.asSeconds("03:02:01"), 1 + 2 * minute + 3 * hour)
self.assertEqual(slurm.duration.asSeconds("27:14:11"), 11 + 14 * minute + 27 * hour)

self.assertEqual(slurm.duration.asSeconds("00:01"), 1)
self.assertEqual(slurm.duration.asSeconds("02:01"), 1 + 2 * minute)
self.assertEqual(slurm.duration.asSeconds("27:01"), 1 + 27 * minute)


if __name__ == "__main__":
unittest.main()

0 comments on commit 546ed3b

Please sign in to comment.