diff --git a/segpy/header.py b/segpy/header.py index edfbe4a..b2ae093 100644 --- a/segpy/header.py +++ b/segpy/header.py @@ -55,6 +55,22 @@ class Header: def __getattr__(self, name): raise AttributeError("Object of type {!r} has no attribute {!r}".format(self.__class__.__name__, name)) + def __repr__(self): + return "{}({})".format( + self.__class__.__name__, + ', '.join("{}={}".format(k, getattr(self, k)) for k in self.ordered_field_names())) + + +def are_equal(self, other): + """Compare two headers for equality. + + Note: + This is not implemented as __eq__() to prevent recursive behaviour in the header descriptor. + """ + if type(self) != type(other): + return False + return all(getattr(self, field_name) == getattr(other, field_name) for field_name in self.ordered_field_names()) + class FormatMeta(type): """A metaclass for header format classes. diff --git a/segpy/toolkit.py b/segpy/toolkit.py index c57ef3f..d519191 100644 --- a/segpy/toolkit.py +++ b/segpy/toolkit.py @@ -169,7 +169,6 @@ def read_binary_reel_header(fh, endian='>'): little-endian (non-standard) """ header_packer = make_header_packer(BinaryReelHeader, endian) - fh.seek(TEXTUAL_HEADER_NUM_BYTES) # Consider using from_one_based(BinaryReelHeader.START_OFFSET_IN_BYTES) buffer = fh.read(BinaryReelHeader.LENGTH_IN_BYTES) reel_header = header_packer.unpack(buffer) return reel_header diff --git a/test/test_roundtrip.py b/test/test_roundtrip.py new file mode 100644 index 0000000..f202302 --- /dev/null +++ b/test/test_roundtrip.py @@ -0,0 +1,24 @@ +import unittest +from hypothesis import given +from io import BytesIO +from hypothesis.specifiers import sampled_from +from segpy.binary_reel_header import BinaryReelHeader +from segpy.header import are_equal + +from segpy.toolkit import write_binary_reel_header, read_binary_reel_header +from test.strategies import header + + +class TestBinaryReelHeader(unittest.TestCase): + + @given(header(BinaryReelHeader), + sampled_from(['<', '>'])) + def test_roundtrip(self, write_header, endian): + with BytesIO() as write_stream: + write_binary_reel_header(write_stream, write_header, endian) + written_steam = write_stream.getvalue() + + with BytesIO(written_steam) as read_stream: + read_header = read_binary_reel_header(read_stream, endian) + + self.assertTrue(are_equal(write_header, read_header))