Jan B. F. van Erp

97 papers A* 2B 17C 1Journal 41Unranked 31
YearRankTypeTitle / Venue / Authors
2026 A* conf
CHI
Melissa Esmeralda van Schaik, Li Guo, Angelika Mader, Jan B. F. van Erp, Nils-Krister Persson
2025 J jnl
Int. J. Soc. Robotics
Kris Hauser, Eleanor 'Nell' Watson, Joonbum Bae, Josh Bankston, Sven Behnke, Bill Borgia, Manuel G. Catalano, Stefano Dafarra, Jan B. F. van Erp, Thomas Ferris, Jeremy Fishel, Guy Hoffman, Serena Ivaldi, Fumio Kanehiro, Abderrahmane Kheddar, Gaëlle Lannuzel, Jacquelyn Ford Morie, Patrick Naughton, Steve NGuyen, Paul Yu Oh, Taskin Padir, Jim Pippine, Jaeheung Park, Jean Chagas Vaz, Daniele Pucci, John Peter Whitney, Peggy Wu, David Locke
2025 J jnl
ACM Trans. Hum. Robot Interact.
Sara Falcone, Robin Lieftink, Anne-Marie Brouwer, Douwe Dresscher, Dirk Heylen, Jan B. F. van Erp
2025 conf
SportsHCI
Angelika Mader, Judith Weda, Dees Postma, Jan B. F. van Erp
2025 J jnl
IEEE Trans. Haptics
Christophe van der Walt, Sara Falcone, Jan B. F. van Erp, Stefano Stramigioli, Douwe Dresscher
2024 J jnl
IEEE Robotics Autom. Lett.
Robin Lieftink, Sara Falcone, Christophe van der Walt, Jan B. F. van Erp, Douwe Dresscher
2024 J jnl
CoRR
Kris Hauser, Eleanor 'Nell' Watson, Joonbum Bae, Josh Bankston, Sven Behnke, Bill Borgia, Manuel G. Catalano, Stefano Dafarra, Jan B. F. van Erp, Thomas Ferris, Jeremy Fishel, Guy Hoffman, Serena Ivaldi, Fumio Kanehiro, Abderrahmane Kheddar, Gaëlle Lannuzel, Jacquelyn Ford Morie, Patrick Naughton, Steve NGuyen, Paul Y. Oh, Taskin Padir, Jim Pippine, Jaeheung Park, Daniele Pucci, Jean Chagas Vaz, John Peter Whitney, Peggy Wu, David Locke
2024 J jnl
Presence Teleoperators Virtual Environ.
Christophe van der Walt, Sara Falcone, Jan B. F. van Erp, Stefano Stramigioli, Douwe Dresscher
2024 J jnl
IEEE Trans. Haptics
Judith Weda, Angelika Mader, Hamid Souri, Edwin Dertien, Jan B. F. van Erp
2024 J jnl
IEEE Trans. Haptics
Elisabet Henell, Judith Weda, Sophia Cedermalm, Linnéa Eklöv, Märta Håkansson, Jesper Nordström, Märit Reibring, Jonas Stålhand, Nils-Krister Persson, Angelika Mader, Jan B. F. van Erp, Edwin W. H. Jager
2023 B conf
SMC
Jan B. F. van Erp
2023 J jnl
Frontiers Comput. Sci.
Jan B. F. van Erp, Karon E. MacLean, Gregory J. Gerling, Carey Jewitt, Alexander Toet
2023 J jnl
IEEE Trans. Affect. Comput.
Anne-Marie Brouwer, Tim J. van den Broek, Maarten A. Hogervorst, Daisuke Kaneko, Alexander Toet, Victor L. Kallen, Jan B. F. van Erp
2023 B conf
ICMI
Camille Sallaberry, Gwenn Englebienne, Jan B. F. van Erp, Vanessa Evers
2023 J jnl
Sensors
Ivo V. Stuldreher, Jan B. F. van Erp, Anne-Marie Brouwer
2023 J jnl
IEEE Trans. Haptics
Judith Weda, Jan B. F. van Erp, Angelika Mader
2023 J jnl
Frontiers Comput. Sci.
Angelika Mader, Edwin Dertien, Judith Weda, Jan B. F. van Erp
2023 J jnl
Hum. Comput. Interact.
Sara Falcone, Gwenn Englebienne, Jan B. F. van Erp, Dirk Heylen
2022 conf
EuroHaptics
Judith Weda, Dasha Kolesnyk, Angelika Mader, Jan B. F. van Erp
2022 J jnl
Frontiers Comput. Sci.
Jan B. F. van Erp
2022 C conf
IMX
Leonor Fermoselle, Alexander Toet, Nirul Hoeba, Jeanine van Bruggen, Nanda van der Stap, Frank Bart ter Haar, Jan B. F. van Erp
2022 B conf
CogSci
Sara Falcone, Anne-Marie Brouwer, Dirk Heylen, Jan B. F. van Erp, Liang Zhang, Saket Sachin Pradhan, Ivo V. Stuldreher, Ioana Cocu, Martijn Heuvel, Pieter S. de Vries, Kaj Gijsbertse, Gwenn Englebienne
2022 J jnl
Qual. User Exp.
Alexander Toet, Tina Mioch, Simon N. B. Gunkel, Omar Niamut, Jan B. F. van Erp
2022 B conf
SMC
Jan B. F. van Erp, Camille Sallaberry, Christiaan Brekelmans, Douwe Dresscher, Frank Bart ter Haar, Gwenn Englebienne, Jeanine van Bruggen, Joachim de Greeff, Leonor Fermoselle Silva Pereira, Alexander Toet, Nirul Hoeba, Robin Lieftink, Sara Falcone, Tycho J. H. Brug
2021 J jnl
Cogn. Technol. Work.
Charelle Bottenheft, Anne-Marie Brouwer, Ivo V. Stuldreher, Eric Groen, Jan B. F. van Erp
2021 B conf
CogSci
Sara Falcone, Saket Sachin Pradhan, Jan B. F. van Erp, Dirk Heylen
2021 conf
IHIET (Paris)
Navya N. Sharan, Alexander Toet, Tina Mioch, Omar Niamut, Jan B. F. van Erp
2020 J jnl
Frontiers Virtual Real.
Alexander Toet, Fabienne Heijn, Anne-Marie Brouwer, Tina Mioch, Jan B. F. van Erp
2020 conf
EuroHaptics
Irene A. Kuling, Kaj Gijsbertse, Bouke N. Krom, Kees van Teeffelen, Jan B. F. van Erp
2020 conf
EuroVR
Alexander Toet, Tina Mioch, Simon N. B. Gunkel, Camille Sallaberry, Jan B. F. van Erp, Omar Niamut
2020 J jnl
ACM Trans. Access. Comput.
Jan B. F. van Erp, Katja I. Paul, Tina Mioch
2020 conf
ICMI Companion
Pim Verhagen, Irene A. Kuling, Kaj Gijsbertse, Ivo V. Stuldreher, Krista Overvliet, Sara Falcone, Jan B. F. van Erp, Anne-Marie Brouwer
2020 conf
EuroHaptics
Alexander Toet, Jan B. F. van Erp
2020 J jnl
Frontiers Robotics AI
Alexander Toet, Irene A. Kuling, Bouke N. Krom, Jan B. F. van Erp
2019 B conf
ACII
Nattapong Thammasan, Ivo V. Stuldreher, Dagmar Wismeijer, Mannes Poel, Jan B. F. van Erp, Anne-Marie Brouwer
2019 A* conf
HRI
Jamy Li, David Sirkin, Jan B. F. van Erp, Birna van Riemsdijk
2019 conf
WHC
Bouke N. Krom, Milène Catoire, Alexander Toet, Roelof J. E. Van Dijk, Jan B. F. van Erp
2019 J jnl
Sensors
Daisuke Kaneko, Maarten A. Hogervorst, Alexander Toet, Jan B. F. van Erp, Victor L. Kallen, Anne-Marie Brouwer
2019 J jnl
Inf. Vis.
Alexander Toet, Jan B. F. van Erp, Erik M. Boertjes, Stef van Buuren
2019 J jnl
Int. J. Soc. Robotics
Christian J. A. M. Willemse, Jan B. F. van Erp
2019 conf
EuroVR
Alexander Toet, Fabienne Heijn, Anne-Marie Brouwer, Tina Mioch, Jan B. F. van Erp
2018 J jnl
J. Multimodal User Interfaces
Christian J. A. M. Willemse, Dirk K. J. Heylen, Jan B. F. van Erp
2018 B conf
DSAA
Aaqib Saeed, Tanir Ozcelebi, Johan Lukkien, Jan B. F. van Erp, Stojan Trajanovski
2018 conf
EuroHaptics (2)
Milène Catoire, Bouke N. Krom, Jan B. F. van Erp
2017 J jnl
Frontiers ICT
Christian J. A. M. Willemse, Alexander Toet, Jan B. F. van Erp
2017 conf
MHFI@ICMI
Alexander Toet, Martin G. van Schaik, Daisuke Kaneko, Jan B. F. van Erp
2017 conf
ICDM Workshops
Aaqib Saeed, Stojan Trajanovski, Maurice van Keulen, Jan B. F. van Erp
2017 J jnl
Frontiers ICT
Jan B. F. van Erp, Liselotte Kroon, Tina Mioch, Katja I. Paul
2017 B conf
MobileHCI
Limin Zeng, Gerhard Weber, Markus Simros, Peter Conradie, Jelle Saldien, Ilse Ravyse, Jan B. F. van Erp, Tina Mioch
2016 conf
EuroHaptics (2)
Christian J. A. M. Willemse, Gijs Huisman, Merel M. Jung, Jan B. F. van Erp, Dirk K. J. Heylen
2016 conf
EuroHaptics (2)
Gijs Huisman, Aduén Darriba Frederiks, Jan B. F. van Erp, Dirk K. J. Heylen
2016 J jnl
PeerJ Comput. Sci.
Jan B. F. van Erp, Maarten A. Hogervorst, Ysbrand D. van der Werf
2015 B conf
ICMI
Christian J. A. M. Willemse, Gerald M. Munters, Jan B. F. van Erp, Dirk Heylen
2015 J jnl
IEEE Trans. Affect. Comput.
Anne-Marie Brouwer, Martin G. van Schaik, J. E. Korteling, Jan B. F. van Erp, Alexander Toet
2015 B conf
ACII
Anne-Marie Brouwer, Chris Dijksterhuis, Jan B. F. van Erp
2015 J jnl
Comput. Geosci.
Peter-Paul van Maanen, Freek S. Busschers, Anne-Marie Brouwer, Michiel J. van der Meulen, Jan B. F. van Erp
2015 J jnl
Frontiers Digit. Humanit.
Jan B. F. van Erp, Alexander Toet
2015 conf
HCI (21)
Jan B. F. van Erp, Alexander Toet, Koos Meijer, Joris Janssen, Arnoud de Jong
2015 B conf
ACII
Christian J. A. M. Willemse, Dirk K. J. Heylen, Jan B. F. van Erp
2014 conf
EuroHaptics (1)
Jan B. F. van Erp, Tom G. Philippi, Peter J. Werkhoven
2014 J jnl
Displays
Peter J. Werkhoven, Jan B. F. van Erp, Tom G. Philippi
2014 J jnl
IEEE Trans. Vis. Comput. Graph.
Susanne Tak, Alexander Toet, Jan B. F. van Erp
2014 conf
HAPTICS
Jan B. F. van Erp, Anne-Marie Brouwer
2013 J jnl
Int. J. Auton. Adapt. Commun. Syst.
Esko O. Dijk, Anton Nijholt, Jan B. F. van Erp, Gerard van Wolferen, Ewoud Kuyper
2013 J jnl
IEEE Trans. Comput. Intell. AI Games
Marieke E. Thurlings, Jan B. F. van Erp, Anne-Marie Brouwer, Peter J. Werkhoven
2013 conf
HCI (6)
Anne-Marie Brouwer, Jan B. F. van Erp, Dirk Heylen, Ole Jensen, Mannes Poel
2013 conf
UMAP Workshops
Susanne Tak, Anne-Marie Brouwer, Alexander Toet, Jan B. F. van Erp
2013 B conf
ACII
S. F. Raaijmakers, F. W. Steel, M. de Goede, Nelleke C. van Wouwe, Jan B. F. van Erp, Anne-Marie Brouwer
2013 B conf
ACII
Jan B. F. van Erp, Alexander Toet
2013 B conf
ACII
Anne-Marie Brouwer, Martin G. van Schaik, Jan B. F. van Erp, Hans Korteling
2013 B conf
ACII
Alexander Toet, Jan B. F. van Erp, F. F. Petrignani, M. H. Dufrasnes, A. Sadhashivan, D. Van Alphen, F. Boeree, H. O. de Gruijter, Jesper Hoeksema, C. T. Stamhuis, P. J. Steenbergen
2012 J jnl
Computer
Jan B. F. van Erp, Fabien Lotte, Michael Tangermann
2012 conf
EMBC
Martijn Schreuder, Marieke E. Thurlings, Anne-Marie Brouwer, Jan B. F. van Erp, Michael Tangermann
2012 conf
EuroHaptics (1)
Ian Sinclair, Jim Carter, Sebastian Kassner, Jan B. F. van Erp, Gerhard Weber, Linda R. Elliott, Ian Andrew
2011 conf
HCI (6)
Jan B. F. van Erp, Marieke E. Thurlings, Anne-Marie Brouwer, Peter J. Werkhoven
2011 conf
HCI (20)
Anne-Marie Brouwer, Jan B. F. van Erp, Bart Kappé, Anne E. Urai
2010 ch.
Brain-Computer Interfaces
Jan B. F. van Erp, Hans Veltman, Marc Grootjen
2010 ch.
Brain-Computer Interfaces
Marieke E. Thurlings, Jan B. F. van Erp, Anne-Marie Brouwer, Peter J. Werkhoven
2010 J jnl
IEEE Trans. Haptics
Linda R. Elliott, Jan B. F. van Erp, Elizabeth S. Redden, Maaike Duistermaat
2010 ed.
EuroHaptics (1)
Astrid M. L. Kappers, Jan B. F. van Erp, Wouter M. Bergmann Tiest, Frans C. T. van der Helm
2010 ed.
EuroHaptics (2)
Astrid M. L. Kappers, Jan B. F. van Erp, Wouter M. Bergmann Tiest, Frans C. T. van der Helm
2010 conf
EuroHaptics (2)
Tom G. Philippi, Jan B. F. van Erp, Peter J. Werkhoven
2010 conf
EuroHaptics (2)
Jan B. F. van Erp, Ki-Uk Kyung, Sebastian Kassner, Jim Carter, Stephen A. Brewster, Gerhard Weber, Ian Andrew
2009 J jnl
IEEE Trans. Haptics
Jeroen H. Hogema, Sjoerd C. de Vries, Jan B. F. van Erp, Raymond J. Kiefer
2009 B conf
ACII
M. Lehne, Klas Ihme, Anne-Marie Brouwer, Jan B. F. van Erp, Thorsten Oliver Zander
2009 B conf
ICMI
Jan B. F. van Erp, Peter J. Werkhoven, Marieke E. Thurlings, Anne-Marie Brouwer
2008 conf
EuroHaptics
Jan B. F. van Erp, Thorsten Alexander Kern
2008 conf
EuroHaptics
Jan B. F. van Erp, Michiel M. A. Spapé
2007
Jan B. F. van Erp
2006 J jnl
Hum. Factors
Jan B. F. van Erp, Eric L. Groen, Jelte E. Bos, Hendrik A. H. C. van Veen
2005 conf
WHC
Jan B. F. van Erp
2005 J jnl
ACM Trans. Appl. Percept.
Jan B. F. van Erp, Hendrik A. H. C. van Veen, Chris Jansen, Trevor Dobbins
2002 J jnl
Hum. Factors
Jan B. F. van Erp, Arjen B. Oving
2000 conf
Haptic Human-Computer Interaction
Henricus A. H. C. van Veen, Jan B. F. van Erp
2000 conf
Haptic Human-Computer Interaction
Jan B. F. van Erp
1999 J jnl
Hum. Factors
Bart Kappé, Jan B. F. van Erp, J. E. Korteling
1997 conf
HCI (2)
Jan B. F. van Erp, Bart Kappé
tests/unit/test_macho_dataclasses.py
← Index tests/unit/test_macho_dataclasses.py python
"""
Unit tests for Mach-O dataclasses.
"""
import pytest
from typing import List, Dict, Optional

pytestmark = [pytest.mark.unit, pytest.mark.dataclass, pytest.mark.macho]


class TestMachODataclass:
    """Tests for MachO dataclass."""

    def test_macho_required_fields(self):
        """Test MachO dataclass with required fields."""
        from redb.models.dataclasses import MachO

        macho = MachO(
            magic=0xFEEDFACF,
            cputype=0x01000007,
            cpusubtype=0x00000003,
            filetype=2,
            ncmds=15,
            sizeofcmds=1024,
            flags=0x00200085,
            architecture=0x01000007,
            architectures=[0x01000007],
            magic_str="MH_MAGIC_64",
            cputype_str="CPU_TYPE_X86_64",
            cpusubtype_str="CPU_SUBTYPE_X86_64_ALL",
            filetype_str="MH_EXECUTE",
            flags_str=["MH_NOUNDEFS", "MH_DYLDLINK", "MH_TWOLEVEL", "MH_PIE"],
            architecture_str="x86_64",
            architectures_str=["x86_64"],
            is_64bit=True,
            is_signed=True
        )

        assert macho.magic == 0xFEEDFACF
        assert macho.cputype == 0x01000007
        assert macho.is_64bit is True
        assert macho.is_signed is True
        assert macho.magic_str == "MH_MAGIC_64"
        assert macho.filetype_str == "MH_EXECUTE"

    def test_macho_optional_fields_defaults(self):
        """Test MachO dataclass optional fields default to correct values."""
        from redb.models.dataclasses import MachO

        macho = MachO(
            magic=0xFEEDFACF,
            cputype=0x01000007,
            cpusubtype=0x00000003,
            filetype=2,
            ncmds=15,
            sizeofcmds=1024,
            flags=0x00200085,
            architecture=0x01000007,
            architectures=[0x01000007],
            magic_str="MH_MAGIC_64",
            cputype_str="CPU_TYPE_X86_64",
            cpusubtype_str="CPU_SUBTYPE_X86_64_ALL",
            filetype_str="MH_EXECUTE",
            flags_str=["MH_NOUNDEFS"],
            architecture_str="x86_64",
            architectures_str=["x86_64"],
            is_64bit=True,
            is_signed=False
        )

        assert macho.number_of_load_commands == 0
        assert macho.load_commands_set is None
        assert macho.number_of_segments == 0
        assert macho.number_of_dylibs == 0
        assert macho.number_of_imports == 0
        assert macho.number_of_exports == 0
        assert macho.entry_point is None
        assert macho.uuid is None
        assert macho.version_info is None
        assert macho.version_info_str is None

    def test_macho_with_all_fields(self):
        """Test MachO dataclass with all fields populated."""
        from redb.models.dataclasses import MachO

        macho = MachO(
            magic=0xFEEDFACF,
            cputype=0x01000007,
            cpusubtype=0x00000003,
            filetype=2,
            ncmds=15,
            sizeofcmds=1024,
            flags=0x00200085,
            architecture=0x01000007,
            architectures=[0x01000007],
            magic_str="MH_MAGIC_64",
            cputype_str="CPU_TYPE_X86_64",
            cpusubtype_str="CPU_SUBTYPE_X86_64_ALL",
            filetype_str="MH_EXECUTE",
            flags_str=["MH_PIE"],
            architecture_str="x86_64",
            architectures_str=["x86_64"],
            is_64bit=True,
            is_signed=True,
            number_of_load_commands=15,
            load_commands_set=["LC_SEGMENT_64", "LC_DYLD_INFO_ONLY"],
            number_of_segments=4,
            number_of_dylibs=5,
            number_of_imports=100,
            number_of_exports=10,
            entry_point=0x100001234,
            uuid="12345678-1234-1234-1234-123456789012",
            version_info={"min_os": "10.15"},
            version_info_str={"min_os": "macOS 10.15"}
        )

        assert macho.number_of_load_commands == 15
        assert macho.uuid == "12345678-1234-1234-1234-123456789012"
        assert macho.entry_point == 0x100001234


class TestMachOSegmentDataclass:
    """Tests for MachOSegment dataclass."""

    def test_segment_creation(self):
        """Test MachOSegment dataclass creation."""
        from redb.models.dataclasses import MachOSegment

        segment = MachOSegment(
            segment_name="__TEXT",
            segment_vaddr=0x100000000,
            segment_vsize=0x1000,
            segment_offset=0,
            segment_size=0x1000,
            segment_max_vm_protection=7,
            segment_initial_vm_protection=5,
            segment_nsects=4,
            segment_flags=0,
            segment_entropy=6.5,
            segment_sha256="abc123def456789012345678901234567890123456789012345678901234"
        )

        assert segment.segment_name == "__TEXT"
        assert segment.segment_vaddr == 0x100000000
        assert segment.segment_entropy == 6.5


class TestMachOImportDataclass:
    """Tests for MachOImport dataclass."""

    def test_import_creation(self):
        """Test MachOImport dataclass creation."""
        from redb.models.dataclasses import MachOImport

        import_info = MachOImport(
            macho_imports_total=50,
            macho_import_libraryName=["libSystem.B.dylib", "CoreFoundation"],
            macho_import_functions=["_printf", "_malloc", "_free"]
        )

        assert import_info.macho_imports_total == 50
        assert len(import_info.macho_import_libraryName) == 2
        assert "_printf" in import_info.macho_import_functions

    def test_import_optional_fields(self):
        """Test MachOImport with optional fields as None."""
        from redb.models.dataclasses import MachOImport

        import_info = MachOImport(macho_imports_total=0)

        assert import_info.macho_imports_total == 0
        assert import_info.macho_import_libraryName is None
        assert import_info.macho_import_functions is None


class TestMachOExportDataclass:
    """Tests for MachOExport dataclass."""

    def test_export_creation(self):
        """Test MachOExport dataclass creation."""
        from redb.models.dataclasses import MachOExport

        export_info = MachOExport(
            macho_exports_total=10,
            macho_export_symbols=["_main", "_helper_func"]
        )

        assert export_info.macho_exports_total == 10
        assert "_main" in export_info.macho_export_symbols


class TestMachODylibDataclass:
    """Tests for MachODylib dataclass."""

    def test_dylib_creation(self):
        """Test MachODylib dataclass creation."""
        from redb.models.dataclasses import MachODylib

        dylib = MachODylib(
            dylib_name="/usr/lib/libSystem.B.dylib",
            dylib_timestamp=2,
            dylib_current_version=0x04E10200,
            dylib_compat_version=0x00010000
        )

        assert dylib.dylib_name == "/usr/lib/libSystem.B.dylib"
        assert dylib.dylib_timestamp == 2


class TestMachOLoadCommandDataclass:
    """Tests for MachOLoadCommand dataclass."""

    def test_load_command_creation(self):
        """Test MachOLoadCommand dataclass creation."""
        from redb.models.dataclasses import MachOLoadCommand

        lc = MachOLoadCommand(
            load_command=0x19,
            load_command_str="LC_SEGMENT_64",
            load_command_size=72
        )

        assert lc.load_command == 0x19
        assert lc.load_command_str == "LC_SEGMENT_64"
        assert lc.load_command_size == 72


class TestMachOUniversalDataclass:
    """Tests for MachOUniversal dataclass."""

    def test_universal_fat_binary(self):
        """Test MachOUniversal for FAT binary."""
        from redb.models.dataclasses import MachOUniversal

        universal = MachOUniversal(
            is_fat=True,
            architecture_count=2,
            architectures=["x86_64", "arm64"],
            architecture_info=[
                {"arch": "x86_64", "offset": 0x1000},
                {"arch": "arm64", "offset": 0x10000}
            ],
            fat_hash="abc123def456789012345678901234567890123456789012345678901234",
            fat_md5="abc123def456789012345678901234",
            fat_sha1="abc123def456789012345678901234567890"
        )

        assert universal.is_fat is True
        assert universal.architecture_count == 2
        assert "x86_64" in universal.architectures
        assert "arm64" in universal.architectures

    def test_universal_single_arch(self):
        """Test MachOUniversal for single-architecture binary."""
        from redb.models.dataclasses import MachOUniversal

        universal = MachOUniversal(
            is_fat=False,
            architecture_count=1,
            architectures=["arm64"],
            architecture_info=[{"arch": "arm64", "offset": 0}]
        )

        assert universal.is_fat is False
        assert universal.architecture_count == 1
        assert universal.fat_hash is None


class TestMachOCertificateDataclass:
    """Tests for MachOCertificate dataclass."""

    def test_certificate_creation(self):
        """Test MachOCertificate dataclass creation."""
        from redb.models.dataclasses import MachOCertificate

        cert = MachOCertificate(
            subject="CN=Apple Development",
            issuer="CN=Apple Worldwide Developer Relations",
            serial_number="123456789",
            not_before="2023-01-01T00:00:00Z",
            not_after="2024-01-01T00:00:00Z",
            thumbprint="abc123def456789012345678901234567890",
            certificate_type="leaf",
            order=0,
            algorithm="sha256WithRSAEncryption",
            common_name="Apple Development",
            organizational_unit="Development",
            organization="Apple Inc."
        )

        assert cert.subject == "CN=Apple Development"
        assert cert.certificate_type == "leaf"
        assert cert.order == 0


class TestMachOCodeDirectoryDataclass:
    """Tests for MachOCodeDirectory dataclass."""

    def test_code_directory_creation(self):
        """Test MachOCodeDirectory dataclass creation."""
        from redb.models.dataclasses import MachOCodeDirectory

        cd = MachOCodeDirectory(
            identifier="com.example.app",
            team_id="ABC123DEF",
            flags=0x10000,
            cd_hash="abc123def456789012345678901234567890123456789012345678901234"
        )

        assert cd.identifier == "com.example.app"
        assert cd.team_id == "ABC123DEF"
        assert cd.flags == 0x10000


class TestMachOCodeSigningInfoDataclass:
    """Tests for MachOCodeSigningInfo dataclass."""

    def test_code_signing_info_unsigned(self):
        """Test MachOCodeSigningInfo for unsigned binary."""
        from redb.models.dataclasses import MachOCodeSigningInfo

        info = MachOCodeSigningInfo(
            _id="abc123def456789012345678901234567890123456789012345678901234",
            signing_type="unsigned",
            has_signature=False,
            number_of_certificates=0
        )

        assert info.signing_type == "unsigned"
        assert info.has_signature is False
        assert info.number_of_certificates == 0

    def test_code_signing_info_signed(self):
        """Test MachOCodeSigningInfo for signed binary."""
        from redb.models.dataclasses import MachOCodeSigningInfo, MachOCodeDirectory

        cd = MachOCodeDirectory(
            identifier="com.example.app",
            team_id="ABC123DEF"
        )

        info = MachOCodeSigningInfo(
            _id="abc123def456789012345678901234567890123456789012345678901234",
            signing_type="certificate",
            has_signature=True,
            number_of_certificates=3,
            code_directories=[cd],
            entitlements={"com.apple.security.app-sandbox": True},
            has_hardened_runtime=True,
            has_library_validation=True
        )

        assert info.signing_type == "certificate"
        assert info.has_signature is True
        assert info.number_of_certificates == 3
        assert info.has_hardened_runtime is True

    def test_code_signing_info_adhoc(self):
        """Test MachOCodeSigningInfo for ad-hoc signed binary."""
        from redb.models.dataclasses import MachOCodeSigningInfo

        info = MachOCodeSigningInfo(
            _id="abc123def456789012345678901234567890123456789012345678901234",
            signing_type="ad-hoc",
            has_signature=True,
            number_of_certificates=0,
            arch_identifier="x86_64"
        )

        assert info.signing_type == "ad-hoc"
        assert info.number_of_certificates == 0
        assert info.arch_identifier == "x86_64"


class TestMachOEntitlementDataclass:
    """Tests for MachOEntitlement dataclass."""

    def test_entitlement_boolean(self):
        """Test MachOEntitlement with boolean value."""
        from redb.models.dataclasses import MachOEntitlement

        ent = MachOEntitlement(
            key="com.apple.security.app-sandbox",
            value_type="boolean",
            value_bool=True
        )

        assert ent.key == "com.apple.security.app-sandbox"
        assert ent.value_type == "boolean"
        assert ent.value_bool is True

    def test_entitlement_string(self):
        """Test MachOEntitlement with string value."""
        from redb.models.dataclasses import MachOEntitlement

        ent = MachOEntitlement(
            key="com.apple.developer.team-identifier",
            value_type="string",
            value_string="ABC123DEF"
        )

        assert ent.key == "com.apple.developer.team-identifier"
        assert ent.value_type == "string"
        assert ent.value_string == "ABC123DEF"

    def test_entitlement_array(self):
        """Test MachOEntitlement with array value."""
        from redb.models.dataclasses import MachOEntitlement

        ent = MachOEntitlement(
            key="com.apple.security.application-groups",
            value_type="array",
            value_array=["group.com.example.app", "group.com.example.shared"]
        )

        assert ent.key == "com.apple.security.application-groups"
        assert ent.value_type == "array"
        assert len(ent.value_array) == 2