File: test_dtypes.py

package info (click to toggle)
python-mrcfile 1.5.4-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 63,824 kB
  • sloc: python: 3,871; sh: 28; makefile: 16
file content (100 lines) | stat: -rw-r--r-- 5,128 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# Copyright (c) 2022, Science and Technology Facilities Council
# This software is distributed under a BSD licence. See LICENSE.txt.

"""
Tests for dtypes.py
"""

# Import Python 3 features for future-proofing
# Deliberately do NOT import unicode_literals due to a bug in numpy dtypes:
# https://github.com/numpy/numpy/issues/2407
from __future__ import absolute_import, division, print_function

import unittest

import mrcfile.dtypes as dtypes
import mrcfile.utils as utils
from .helpers import AssertRaisesRegexMixin


class DtypesTest(AssertRaisesRegexMixin, unittest.TestCase):
    
    """Unit tests for mrcfile.dtypes"""

    def test_invalid_byte_order_raises_exception(self):
        with self.assertRaisesRegex(ValueError, "Unrecognised byte order indicator"):
            _ = dtypes.get_ext_header_dtype('', 'a')
    
    def test_fei1_ext_header_with_native_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI1')
        assert dtype.itemsize == 768
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '=')
        with self.assertRaises(KeyError):
            _ = dtype['Scan rotation']
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')

    def test_fei2_ext_header_with_native_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI2')
        assert dtype.itemsize == 888
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '=')
        assert dtype['Scan rotation'] is not None
        assert utils.byte_orders_equal(dtype['Scan rotation'].byteorder, '=')
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')

    def test_fei1_ext_header_with_little_endian_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI1', '<')
        # Normal fields should match the requested byte order
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Alpha tilt'].byteorder, '<')
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')

    def test_fei2_ext_header_with_little_endian_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI2', '<')
        # Normal fields should match the requested byte order
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Alpha tilt'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Scan rotation'].byteorder, '<')
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')

    def test_fei1_ext_header_with_big_endian_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI1', '>')
        # Normal fields should match the requested byte order
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '>')
        assert utils.byte_orders_equal(dtype['Alpha tilt'].byteorder, '>')
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')

    def test_fei2_ext_header_with_big_endian_byte_order(self):
        dtype = dtypes.get_ext_header_dtype(b'FEI2', '>')
        # Normal fields should match the requested byte order
        assert utils.byte_orders_equal(dtype['Metadata size'].byteorder, '>')
        assert utils.byte_orders_equal(dtype['Alpha tilt'].byteorder, '>')
        assert utils.byte_orders_equal(dtype['Scan rotation'].byteorder, '>')
        # Bitmasks should always be little-endian
        assert utils.byte_orders_equal(dtype['Bitmask 1'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 2'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 3'].byteorder, '<')
        assert utils.byte_orders_equal(dtype['Bitmask 4'].byteorder, '<')


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