Skip to content

Commit

Permalink
added tests for serialization.py
Browse files Browse the repository at this point in the history
  • Loading branch information
cat-bug authored and andrewprzh committed Jun 19, 2024
1 parent 4d73424 commit d91764a
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ The first entry in the list should be the type of files the experiments contain,
followed by the type in quotation marks. The type can be either `fastq` or `bam`.

Each experiment is represented as set of parameters (e.g. in curly brackets).
Each experiment must have a name and a list if long-read files in the specified format.
Each experiment must have a name and a list of long-read files in the specified format.
Additionally, it may contain one or multiple BAM files with short reads.
The name is provided as `name: ` followed by the experiment name in quotation marks.
Both short and long read files are provided as a list of file paths in quotation marks,
Expand Down
2 changes: 1 addition & 1 deletion src/serialization.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

############################################################################
# Copyright (c) 2022-2024 University of Helsinki
# All Rights Reserved
Expand Down Expand Up @@ -109,6 +108,7 @@ def read_bool_array(inf, arr_size=1):
return bool_arr


# transforms a signed integer into an unsigned integer while using the 31st bit as a flag to remember the original sign
def write_int_neg(val, outf):
if val < 0:
val = abs(val)
Expand Down
103 changes: 103 additions & 0 deletions tests/test_serialization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import os

import pytest

from src import serialization

filename = "ser_test_file"


@pytest.fixture(scope="class")
def setup_class(request):
request.cls.filehandler = open(filename, "xb")
yield
os.remove(filename)


@pytest.fixture(autouse=True)
def run_after_each_test(request):
request.cls.filehandler = open(filename, "r+b")
yield
request.cls.filehandler.close()


@pytest.mark.usefixtures("setup_class")
class TestSerialization:

@pytest.mark.parametrize(
"func_wr, func_rd, value",
[
(serialization.write_int, serialization.read_int, 1),
(serialization.write_int, serialization.read_int, 0),
(serialization.write_int, serialization.read_int, 65536),
(serialization.write_short_int, serialization.read_short_int, 0),
(serialization.write_short_int, serialization.read_short_int, 65535),
(serialization.write_string, serialization.read_string, ""),
(serialization.write_string, serialization.read_string, "quite a long string dont you think"),
(serialization.write_string_or_none, serialization.read_string_or_none, None),
(serialization.write_string_or_none, serialization.read_string_or_none, "None"),
(serialization.write_int_neg, serialization.read_int_neg, -1),
(serialization.write_int_neg, serialization.read_int_neg, -65536),
(serialization.write_bool_array, serialization.read_bool_array, [False]),
(serialization.write_dict, serialization.read_dict, {'key1': 'value1', 'key2': 'value2'}),
(serialization.write_dict, serialization.read_dict, {'key1': 0, 'key2': (655536, 1)}),
(serialization.write_dict, serialization.read_dict, {})
]
)
def test_write_read_positive(self, value, func_wr, func_rd):
func_wr(value, self.filehandler)
self.filehandler.flush()
self.filehandler.seek(0)
actual = func_rd(self.filehandler)
assert actual == value

@pytest.mark.parametrize(
"func_wr, func_rd, value",
[
(serialization.write_int, serialization.read_int, [65539, 0, 1]),
(serialization.write_int, serialization.read_int, []),
(serialization.write_string_or_none, serialization.read_string_or_none, ["str", "", None]),
(serialization.write_string_or_none, serialization.read_string_or_none, []),
(serialization.write_string, serialization.read_string, ["str", "quite a long string dont you think", ""]),
(serialization.write_string, serialization.read_string, []),
(serialization.write_int_neg, serialization.read_int_neg, [-6, -33333, 0]),
(serialization.write_int_neg, serialization.read_int_neg, [])
]
)
def test_write_read_lists_positive(self, func_wr, func_rd, value):
serialization.write_list(value, self.filehandler, func_wr)
self.filehandler.flush()
self.filehandler.seek(0)
actual = serialization.read_list(self.filehandler, func_rd)
assert actual == value

@pytest.mark.parametrize(
"value",
[
([]),
([True, False]),
([False, False, False, True, False, True, True, False]),
]
)
def test_write_read_bool_array_positive(self, value):
serialization.write_bool_array(value, self.filehandler)
self.filehandler.flush()
self.filehandler.seek(0)
actual = serialization.read_bool_array(self.filehandler, len(value))
assert actual == value

@pytest.mark.parametrize(
"func_wr, func_rd, list_of_pairs",
[
(serialization.write_int, serialization.read_int, []),
(serialization.write_int, serialization.read_int, [(1225, 78854)]),
(serialization.write_int, serialization.read_int, [(1225, 78854), (1, 0), (65536, 65536)]),
(serialization.write_string, serialization.read_string, [("1225", "78854"), ("", " "), ("65536", "65536")])
]
)
def test_write_read_list_of_pairs_positive(self, func_wr, func_rd, list_of_pairs):
serialization.write_list_of_pairs(list_of_pairs, self.filehandler, func_wr)
self.filehandler.flush()
self.filehandler.seek(0)
actual = serialization.read_list_of_pairs(self.filehandler, func_rd)
assert actual == list_of_pairs

0 comments on commit d91764a

Please sign in to comment.