def test_write_metadata_with_properties(self):
        data_type = TestObject(enum_value=3)

        # Use an ordered dict for properties so that
        # the order of properties in metadata is guaranteed
        properties = OrderedDict()
        properties["prop1"] = String("foo")
        properties["prop2"] = Int32(42)

        channel = TestObject(path="channel_path",
                             has_data=True,
                             data=[1] * 10,
                             data_type=data_type,
                             properties=properties)

        segment = TdmsSegment([channel])
        metadata = segment.metadata()

        expected_values = [
            Uint32(1),  # Number of objects
            String("channel_path"),
            Uint32(20),  # Length of raw data index in bytes
            Int32(3),  # Data type
            Uint32(1),  # Array dimension
            Uint64(10),  # Number of values
            Uint32(2),  # Number of properties
            String("prop1"),  # Property name
            Int32(0x20),
            String("foo"),
            String("prop2"),
            Int32(3),
            Int32(42),
        ]

        self.assert_sequence_equal(metadata, expected_values)
    def test_write_metadata_with_no_data(self):
        obj = TestObject(path="object_path", has_data=False, properties={})

        segment = TdmsSegment([obj])
        metadata = segment.metadata()

        expected_values = [
            Uint32(1),  # Number of objects
            String("object_path"),
            Bytes(b'\xFF\xFF\xFF\xFF'),  # Raw data index
            Uint32(0),  # Number of properties
        ]

        self.assert_sequence_equal(metadata, expected_values)
    def test_write_leadin_with_object_without_data(self):
        channel = TestObject(path="", has_data=False)

        toc = ["kTocMetaData", "kTocRawData", "kTocNewObjList"]
        metadata_size = 12

        segment = TdmsSegment([channel])
        leadin = segment.leadin(toc, metadata_size)

        expected_values = [
            Bytes(b'TDSm'),
            Int32(14),  # TOC bitmask
            Int32(4712),  # TDMS version
            Uint64(12),  # Next segment offset
            Uint64(12),  # Raw data offset
        ]

        self.assert_sequence_equal(leadin, expected_values)
def test_write_leadin_with_one_channel():
    data_type = StubObject(size=4)

    channel = StubObject(path="",
                         has_data=True,
                         data=[0] * 10,
                         data_type=data_type)

    toc = ["kTocMetaData", "kTocRawData", "kTocNewObjList"]
    metadata_size = 12

    segment = TdmsSegment([channel])
    leadin = segment.leadin(toc, metadata_size)

    expected_values = [
        Bytes(b'TDSm'),
        Int32(14),  # TOC bitmask
        Int32(4712),  # TDMS version
        Uint64(52),  # Next segment offset
        Uint64(12),  # Raw data offset
    ]

    _assert_sequence_equal(leadin, expected_values)