Source code for reconstruction.tests.test_spreadsheets

"""Unit test for the spreadsheets module."""

from io import BytesIO, TextIOWrapper
import os
import unittest

from reconstruction.spreadsheets import JsonReader, JsonWriter, read_tsv, tsv_reader
from wholecell.utils import units

# Silence Sphinx autodoc warning
unittest.TestCase.__module__ = "unittest"


JAVIER_TABLE = os.path.join(
    "validation", "ecoli", "flat", "schmidt2015_javier_table.tsv"
)
CHEMOSTAT_20 = b"Chemostat \xc2\xb5=0.20".decode("utf-8")

FIELD_NAMES = ["id", "ourLocation", "\u20ac:xyz", "mass (units.g)"]
UNITLESS_FIELD_NAMES = FIELD_NAMES[:-1] + ["mass"]
INPUT_DATA = b""""id"\t"ourLocation"\t"\xe2\x82\xac:xyz"\t"mass (units.g)"
"G6660-MONOMER"\t["c"]\t"Location information from Lopez Campistrous 2005."\t98.6
2.71828\t["c"]\t"Location from \xe2\x8a\x972011."\t12
"""
INPUT_DATA_WITH_PRIVATE_FIELD = b""""id"\t"ourLocation"\t"_\xe2\x82\xac:xyz"\t"mass (units.g)"
"G6660-MONOMER"\t["c"]\t"Location information from Lopez Campistrous 2005."\t98.6
2.71828\t["c"]\t"Location from \xe2\x8a\x972011."\t12
"""
NONPRIVATE_FIELD_NAMES = ["id", "ourLocation", "mass"]


[docs] class Test_Spreadsheets(unittest.TestCase): def test_json_reader(self): byte_stream = BytesIO(INPUT_DATA) read_stream = TextIOWrapper(byte_stream) reader = JsonReader(read_stream) list_reader = list(reader) assert len(list_reader) == 2 assert list_reader[0] == { "id": "G6660-MONOMER", "ourLocation": ["c"], "\u20ac:xyz": "Location information from Lopez Campistrous 2005.", "mass": 98.6 * units.g, } assert list_reader[1] == { "id": 2.71828, "ourLocation": ["c"], "\u20ac:xyz": b"Location from \xe2\x8a\x972011.".decode("utf-8"), "mass": 12 * units.g, } assert set(list_reader[0].keys()) == set(UNITLESS_FIELD_NAMES) def test_json_reader_with_private_field(self): byte_stream = BytesIO(INPUT_DATA_WITH_PRIVATE_FIELD) read_stream = TextIOWrapper(byte_stream) reader = JsonReader(read_stream) list_reader = list(reader) assert len(list_reader) == 2 assert list_reader[0] == { "id": "G6660-MONOMER", "ourLocation": ["c"], "mass": 98.6 * units.g, } assert list_reader[1] == { "id": 2.71828, "ourLocation": ["c"], "mass": 12 * units.g, } assert set(list_reader[0].keys()) == set(NONPRIVATE_FIELD_NAMES) def test_tsv_reader(self): with tsv_reader(JAVIER_TABLE) as reader: fieldnames = reader.fieldnames assert fieldnames[0] == "EcoCycID" assert fieldnames[-1] == "Fructose" row1 = next(reader) assert row1["EcoCycID"] == "EG10001" assert row1[CHEMOSTAT_20] == 9 assert CHEMOSTAT_20 in row1 assert CHEMOSTAT_20 in fieldnames def test_read_tsv(self): entries = read_tsv(JAVIER_TABLE) assert CHEMOSTAT_20 in entries[0] def test_json_writer(self): byte_stream = BytesIO() write_stream = TextIOWrapper(byte_stream, line_buffering=True) key2 = "key \u20ac." field_names = ["key1", key2, "33.3"] writer = JsonWriter(write_stream, field_names) writer.writeheader() writer.writerow({"key1": "value1", key2: "", "33.3": 33.4}) writer.writerow({"key1": [1.1, "11"], key2: None, "33.3": {"\u2297!": [33]}}) data = byte_stream.getvalue() lines = data.split(b"\n") assert len(lines) == 4 assert lines[0] == b'"key1"\t"key \xe2\x82\xac."\t"33.3"' assert lines[1] == b'"value1"\t""\t33.4' assert lines[2] == b'[1.1, "11"]\tnull\t{"\xe2\x8a\x97!": [33]}' assert lines[3] == b""
# TODO(jerry): Test dict and ndarray values. # TODO(jerry): Test tsv_writer() by writing and reading back a file.