Nadia Creignou

99 papers A* 5A 9B 6C 5Journal 62Unranked 9
YearRankTypeTitle / Venue / Authors
2026 conf
FoIKS
Nadia Creignou, Timo Camillo Merkl, Reinhard Pichler, Daniel Unterberger
2025 J jnl
ACM Trans. Comput. Theory
Nadia Creignou, Arnaud Durand, Heribert Vollmer
2025 J jnl
CoRR
Nadia Creignou, Timo Camillo Merkl, Reinhard Pichler, Daniel Unterberger
2025 B conf
WADS
Nadia Creignou, Oscar Defrain, Frédéric Olive, Simon Vilmin
2024 A conf
ECAI
Nadia Creignou, Raïda Ktari, Odile Papini
2024 conf
JIAF-JFPDA
Nadia Creignou, Raïda Ktari, Odile Papini
2024 J jnl
CoRR
Nadia Creignou, Oscar Defrain, Frédéric Olive, Simon Vilmin
2024 J jnl
Math. Struct. Comput. Sci.
Nadia Creignou, Arnaud Durand, Heribert Vollmer
2023 A* conf
AAAI
Nadia Creignou, Frédéric Olive, Johannes Schmidt
2023 J jnl
CoRR
Nadia Creignou, Frédéric Olive, Johannes Schmidt
2022 J jnl
J. Log. Comput.
Nadia Creignou, Raïda Ktari, Odile Papini
2022 B conf
MFCS
Nadia Creignou, Arnaud Durand, Heribert Vollmer
2022 J jnl
CoRR
Nadia Creignou, Arnaud Durand, Heribert Vollmer
2021 J jnl
Discret. Appl. Math.
Sarah Blind, Nadia Creignou, Frédéric Olive
2019 J jnl
Discret. Appl. Math.
Nadia Creignou, Markus Kröll, Reinhard Pichler, Sebastian Skritek, Heribert Vollmer
2019 J jnl
Algorithms
Nadia Creignou, Raïda Ktari, Arne Meier, Julian-Steffen Müller, Frédéric Olive, Heribert Vollmer
2018 A* conf
IJCAI
Nadia Creignou, Adrian Haret, Odile Papini, Stefan Woltran
2018 J jnl
J. Artif. Intell. Res.
Nadia Creignou, Raïda Ktari, Odile Papini
2018 J jnl
Log. Methods Comput. Sci.
Nadia Creignou, Reinhard Pichler, Stefan Woltran
2017 C conf
ECSQARU
Nadia Creignou, Raïda Ktari, Odile Papini
2017 J jnl
CoRR
Nadia Creignou, Reinhard Pichler, Stefan Woltran
2017 C conf
LATA
Nadia Creignou, Markus Kröll, Reinhard Pichler, Sebastian Skritek, Heribert Vollmer
2017 J jnl
Theory Comput. Syst.
Nadia Creignou, Arne Meier, Julian-Steffen Müller, Johannes Schmidt, Heribert Vollmer
2016 A conf
ECAI
Nadia Creignou, Raïda Ktari, Odile Papini
2016 J jnl
ACM Trans. Comput. Log.
Nadia Creignou, Odile Papini, Stefan Rümmele, Stefan Woltran
2016 J jnl
CoRR
Nadia Creignou, Markus Kröll, Reinhard Pichler, Sebastian Skritek, Heribert Vollmer
2016 J jnl
Dagstuhl Reports
Olaf Beyersdorff, Nadia Creignou, Uwe Egly, Heribert Vollmer
2016 A ed.
SAT
Nadia Creignou, Daniel Le Berre
2015 C conf
ECSQARU
Nadia Creignou, Raïda Ktari, Odile Papini
2015 J jnl
RAIRO Theor. Informatics Appl.
Nadia Creignou, Hervé Daudé, Uwe Egly, Raphaël Rossignol
2015 J jnl
Fundam. Informaticae
Nadia Creignou, Heribert Vollmer
2015 C conf
LATA
Nadia Creignou, Raïda Ktari, Arne Meier, Julian-Steffen Müller, Frédéric Olive, Heribert Vollmer
2014 A conf
ECAI
Nadia Creignou, Odile Papini, Stefan Rümmele, Stefan Woltran
2014 J jnl
CoRR
Nadia Creignou, Odile Papini, Stefan Rümmele, Stefan Woltran
2014 J jnl
J. Comput. Syst. Sci.
Nadia Creignou, Odile Papini, Reinhard Pichler, Stefan Woltran
2014 J jnl
ACM Trans. Comput. Log.
Nadia Creignou, Uwe Egly, Johannes Schmidt
2013 J jnl
CoRR
Nadia Creignou, Uwe Egly, Johannes Schmidt
2013 A* conf
IJCAI
Nadia Creignou, Reinhard Pichler, Stefan Woltran
2013 B conf
MFCS
Nadia Creignou, Arne Meier, Julian-Steffen Müller, Johannes Schmidt, Heribert Vollmer
2013 J jnl
CoRR
Nadia Creignou, Arne Meier, Julian-Steffen Müller, Johannes Schmidt, Heribert Vollmer
2013 J jnl
CoRR
Nadia Creignou, Raïda Ktari, Arne Meier, Julian-Steffen Müller, Frédéric Olive, Heribert Vollmer
2013 J jnl
Eur. J. Comb.
Nadia Creignou, Hervé Daudé
2012 conf
TAP@TOOLS
Nadia Creignou, Uwe Egly, Martina Seidl
2012 A* conf
KR
Nadia Creignou, Odile Papini, Reinhard Pichler, Stefan Woltran
2012 J jnl
J. Log. Comput.
Nadia Creignou, Johannes Schmidt, Michael Thomas
2012 C conf
COMMA
Nadia Creignou, Uwe Egly, Johannes Schmidt
2012 A conf
SAT
Nadia Creignou, Heribert Vollmer
2012 J jnl
Dagstuhl Reports
Nadia Creignou, Nicola Galesi, Oliver Kullmann, Heribert Vollmer
2012 J jnl
ACM Trans. Comput. Log.
Nadia Creignou, Arne Meier, Heribert Vollmer, Michael Thomas
2011 J jnl
Argument Comput.
Nadia Creignou, Johannes Schmidt, Michael Thomas, Stefan Woltran
2011 A conf
SAT
Nadia Creignou, Frédéric Olive, Johannes Schmidt
2011 J jnl
CoRR
Nadia Creignou, Hervé Daudé, Uwe Egly
2010 J jnl
Log. Methods Comput. Sci.
Elmar Böhler, Nadia Creignou, Matthias Galota, Steffen Reith, Henning Schnoor, Heribert Vollmer
2010 J jnl
CoRR
Nadia Creignou, Johannes Schmidt, Michael Thomas
2010 A* conf
KR
Nadia Creignou, Johannes Schmidt, Michael Thomas
2010 J jnl
ACM Trans. Comput. Log.
Nadia Creignou, Henning Schnoor, Ilka Schnoor
2010 B conf
JELIA
Nadia Creignou, Johannes Schmidt, Michael Thomas, Stefan Woltran
2010 J jnl
Theory Comput. Syst.
Michael Bauland, Elmar Böhler, Nadia Creignou, Steffen Reith, Henning Schnoor, Heribert Vollmer
2010 J jnl
CoRR
Nadia Creignou, Arne Meier, Michael Thomas, Heribert Vollmer
2010 conf
Circuits, Logic, and Games
Nadia Creignou, Arne Meier, Michael Thomas, Heribert Vollmer
2010 J jnl
Eur. J. Comb.
Victor Chepoi, Nadia Creignou, Miki Hermann, Gernot Salzer
2009 A conf
SAT
Nadia Creignou, Hervé Daudé, Uwe Egly, Raphaël Rossignol
2009 J jnl
CoRR
Nadia Creignou, Johannes Schmidt, Michael Thomas
2009 J jnl
Discret. Math.
Nadia Creignou, Hervé Daudé
2009 J jnl
CoRR
Nadia Creignou, Hervé Daudé, Uwe Egly, Raphaël Rossignol
2008 conf
Complexity of Constraints
Nadia Creignou, Heribert Vollmer
2008 J jnl
Theory Comput. Syst.
Nadia Creignou, Miki Hermann, Andrei A. Krokhin, Gernot Salzer
2008 ed.
Complexity of Constraints
Nadia Creignou, Phokion G. Kolaitis, Heribert Vollmer
2008 conf
ISMVL
Victor Chepoi, Nadia Creignou, Miki Hermann, Gernot Salzer
2008 A conf
SAT
Nadia Creignou, Hervé Daudé, Uwe Egly, Raphaël Rossignol
2008 B conf
CSL
Nadia Creignou, Henning Schnoor, Ilka Schnoor
2008 J jnl
J. Comput. Syst. Sci.
Nadia Creignou, Phokion G. Kolaitis, Bruno Zanuttini
2007 J jnl
J. Artif. Intell. Res.
Nadia Creignou, Hervé Daudé, Uwe Egly
2007 J jnl
Electron. Colloquium Comput. Complex.
Heribert Vollmer, Michael Bauland, Elmar Böhler, Nadia Creignou, Steffen Reith, Henning Schnoor
2006 conf
Complexity of Constraints
Nadia Creignou, Phokion G. Kolaitis, Heribert Vollmer
2006 conf
Complexity of Constraints
Nadia Creignou, Phokion G. Kolaitis, Heribert Vollmer
2006 J jnl
SIAM J. Comput.
Nadia Creignou, Bruno Zanuttini
2006 ed.
Complexity of Constraints
Nadia Creignou, Phokion G. Kolaitis, Heribert Vollmer
2005 J jnl
Discret. Appl. Math.
Nadia Creignou, Hervé Daudé, John V. Franco
2005 J jnl
Electron. Colloquium Comput. Complex.
Nadia Creignou, Phokion G. Kolaitis, Bruno Zanuttini
2005 J jnl
Electron. Colloquium Comput. Complex.
Michael Bauland, Elmar Böhler, Nadia Creignou, Steffen Reith, Henning Schnoor, Heribert Vollmer
2005 J jnl
Ann. Math. Artif. Intell.
Philippe Chapdelaine, Nadia Creignou
2004 A conf
SAT
Michael Bauland, Philippe Chapdelaine, Nadia Creignou, Miki Hermann, Heribert Vollmer
2004 conf
SAT (Selected Papers
Michael Bauland, Philippe Chapdelaine, Nadia Creignou, Miki Hermann, Heribert Vollmer
2004 J jnl
Inf. Comput.
Nadia Creignou, Hervé Daudé
2003 J jnl
Comb. Probab. Comput.
Nadia Creignou, Hervé Daudé, Olivier Dubois
2003 J jnl
Theor. Comput. Sci.
Nadia Creignou, Hervé Daudé
2003 J jnl
RAIRO Theor. Informatics Appl.
Nadia Creignou, Hervé Daudé
2001 J jnl
CoRR
Nadia Creignou, Hervé Daudé, Olivier Dubois
2001 book
Complexity classifications of Boolean constraint satisfaction problems.
Nadia Creignou, Sanjeev Khanna, Madhu Sudan
1999 J jnl
Discret. Appl. Math.
Nadia Creignou, Hervé Daudé
1998 J jnl
Inf. Process. Lett.
Nadia Creignou
1997 J jnl
J. Log. Comput.
Nadia Creignou, Malika More
1997 J jnl
RAIRO Theor. Informatics Appl.
Nadia Creignou, Jean-Jacques Hébrard
1996 J jnl
Inf. Comput.
Nadia Creignou, Miki Hermann
1996 J jnl
Ann. Math. Artif. Intell.
Nadia Creignou
1995 J jnl
J. Comput. Syst. Sci.
Nadia Creignou
1995 J jnl
Theor. Comput. Sci.
Nadia Creignou
1992 B conf
CSL
Nadia Creignou
tests/unit/test_dataclasses.py
← Index tests/unit/test_dataclasses.py python
"""
Unit tests for redb.models.dataclasses.

These tests verify construction, field defaults, and type expectations for
every dataclass in the module (excluding Mach-O dataclasses, which are
covered by test_macho_dataclasses.py).
"""
import pytest
from dataclasses import asdict, fields

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


# ============================================================================
# Hash / Hashes
# ============================================================================

class TestHashDataclass:
    """Tests for the Hash dataclass."""

    def test_creation(self):
        from redb.models.dataclasses import Hash

        h = Hash(
            md5="d41d8cd98f00b204e9800998ecf8427e",
            sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
            sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        )
        assert h.md5 == "d41d8cd98f00b204e9800998ecf8427e"
        assert h.sha1 == "da39a3ee5e6b4b0d3255bfef95601890afd80709"
        assert h.sha256 == "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

    def test_asdict(self):
        from redb.models.dataclasses import Hash

        h = Hash(md5="a", sha1="b", sha256="c")
        d = asdict(h)
        assert d == {"md5": "a", "sha1": "b", "sha256": "c"}


class TestHashesDataclass:
    """Tests for the Hashes dataclass."""

    def test_required_fields(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="md5val",
            sha1="sha1val",
            sha256="sha256val",
            ssdeep_hash="ssdeep",
            tlsh_hash="tlsh",
        )
        assert h.md5 == "md5val"
        assert h.ssdeep_hash == "ssdeep"

    def test_optional_pe_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.authentihash is None
        assert h.imphash is None
        assert h.richhash is None
        assert h.richpe_hash is None
        assert h.richpv_hash is None
        assert h.richpv_hash_sorted is None
        assert h.typerefhash is None
        assert h.impfuzzy is None

    def test_optional_elf_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.import_hash is None
        assert h.export_hash is None
        assert h.section_hash is None
        assert h.symbol_hash is None
        assert h.dynamic_hash is None

    def test_optional_macho_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.macho_dylib_hash is None
        assert h.macho_import_hash is None
        assert h.macho_export_hash is None
        assert h.macho_entitlement_hash is None
        assert h.macho_symhash is None

    def test_macho_fields_settable(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e",
            macho_dylib_hash="dylib_h",
            macho_import_hash="import_h",
            macho_export_hash="export_h",
            macho_entitlement_hash="ent_h",
            macho_symhash="sym_h",
        )
        assert h.macho_dylib_hash == "dylib_h"
        assert h.macho_import_hash == "import_h"
        assert h.macho_export_hash == "export_h"
        assert h.macho_entitlement_hash == "ent_h"
        assert h.macho_symhash == "sym_h"


# ============================================================================
# BasicProperties
# ============================================================================

class TestBasicPropertiesDataclass:
    """Tests for the BasicProperties dataclass."""

    def test_required_fields(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="test.exe",
            sample_name="test.exe",
            filesize=1024,
            filetype="PE32",
            filetype_mime="application/x-dosexec",
            filetype_magika="pebin",
            file_entropy=6.5,
        )
        assert bp.filename == "test.exe"
        assert bp.filesize == 1024
        assert bp.file_entropy == 6.5

    def test_optional_fields_default_none(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="x", sample_name="x", filesize=0,
            filetype="t", filetype_mime="m", filetype_magika="k", file_entropy=0.0,
        )
        assert bp.is_packed is None
        assert bp.is_fat is None
        assert bp.child_sha256 is None
        assert bp.child_architecture is None
        assert bp.child_filetype is None

    def test_fat_fields(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="universal.app",
            sample_name="universal.app",
            filesize=2048,
            filetype="Mach-O universal",
            filetype_mime="application/x-mach-binary",
            filetype_magika="macho",
            file_entropy=7.2,
            is_fat=True,
            child_sha256=["hash1", "hash2"],
            child_architecture=["x86_64", "arm64"],
            child_filetype=["macho", "macho"],
        )
        assert bp.is_fat is True
        assert len(bp.child_sha256) == 2
        assert bp.child_architecture == ["x86_64", "arm64"]

    def test_asdict_roundtrip(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="f", sample_name="s", filesize=10,
            filetype="t", filetype_mime="m", filetype_magika="k", file_entropy=1.0,
        )
        d = asdict(bp)
        assert d["filename"] == "f"
        assert d["is_fat"] is None


# ============================================================================
# DIEinfo / CAPA
# ============================================================================

class TestDIEinfoDataclass:
    def test_creation(self):
        from redb.models.dataclasses import DIEinfo

        d = DIEinfo(die_full_dump="dump_text")
        assert d.die_full_dump == "dump_text"
        assert d.die_info == {}

    def test_with_info(self):
        from redb.models.dataclasses import DIEinfo

        d = DIEinfo(die_full_dump="x", die_info={"packer": "UPX"})
        assert d.die_info["packer"] == "UPX"


class TestCAPADataclass:
    def test_creation(self):
        from redb.models.dataclasses import CAPA

        c = CAPA(
            capa_dump="dump",
            capabilities=["cap1"],
            namespaces=["ns1"],
            attack_dump="attack",
            tactics=["TA0001"],
            techniques=["T1059"],
            techniques_id=["T1059.001"],
            mbc_dump="mbc",
            mbc_objectives=["obj1"],
            mbc_behaviors=["beh1"],
            mbc_behaviors_id=["B0001"],
        )
        assert c.capa_dump == "dump"
        assert "cap1" in c.capabilities
        assert "TA0001" in c.tactics


# ============================================================================
# Malcontent
# ============================================================================

class TestMalcontentDataclass:
    def test_creation(self):
        from redb.models.dataclasses import Malcontent

        m = Malcontent(
            malcontent_dump='{"RiskScore": 2}',
            version="malcontent v1.0.0",
            risk_score=2,
            risk_level="MEDIUM"
        )
        assert m.malcontent_dump == '{"RiskScore": 2}'
        assert m.version == "malcontent v1.0.0"
        assert m.risk_score == 2
        assert m.risk_level == "MEDIUM"

    def test_with_json_content(self):
        from redb.models.dataclasses import Malcontent
        import json

        # Now stores unwrapped content (without Files/<path> wrapper)
        file_content = {
            "RiskScore": 3,
            "RiskLevel": "HIGH",
            "IsMalcontent": True,
            "Behaviors": [
                {"RuleName": "exec/shell", "RiskLevel": "HIGH", "Description": "executes shell commands"}
            ]
        }
        m = Malcontent(
            malcontent_dump=json.dumps(file_content),
            version="v0.5.0",
            risk_score=3,
            risk_level="HIGH"
        )
        parsed = json.loads(m.malcontent_dump)
        assert parsed["RiskLevel"] == "HIGH"
        assert parsed["Behaviors"][0]["RuleName"] == "exec/shell"

    def test_asdict(self):
        from redb.models.dataclasses import Malcontent
        from dataclasses import asdict

        m = Malcontent(malcontent_dump="{}", version="v1", risk_score=0, risk_level="")
        d = asdict(m)
        assert d == {"malcontent_dump": "{}", "version": "v1", "risk_score": 0, "risk_level": ""}


# ============================================================================
# String
# ============================================================================

class TestStringDataclass:
    def test_creation(self):
        from redb.models.dataclasses import String

        s = String(string="hello", string_length=5, string_entropy=2.3, string_frequency=10)
        assert s.string == "hello"
        assert s.md5 == []
        assert s.sha1 == []
        assert s.sha256 == []

    def test_with_hashes(self):
        from redb.models.dataclasses import String

        s = String(
            string="test", string_length=4, string_entropy=2.0, string_frequency=1,
            md5=["abc"], sha256=["def"],
        )
        assert s.md5 == ["abc"]
        assert s.sha256 == ["def"]


# ============================================================================
# PE Dataclasses
# ============================================================================

class TestPEDataclass:
    def test_required_fields(self):
        from redb.models.dataclasses import PE

        pe = PE(
            dos_header="dos", nt_header="nt", optional_header="opt",
            file_header="fh", magic="0x10b", entry_point="0x1000",
            major_linker_version=14, minor_linker_version=0,
            target_machine="I386", architecture="x86",
            compilation_time=1609459200, compilation_time_utc="2021-01-01T00:00:00",
            is_dotnet=False, is_signed=False, has_overlay=False,
            number_of_sections=4, number_of_imports=10,
            number_of_exports=0, number_of_resources=2,
            type="EXE",
        )
        assert pe.architecture == "x86"
        assert pe.type == "EXE"

    def test_optional_fields_default_none(self):
        from redb.models.dataclasses import PE

        pe = PE(
            dos_header="d", nt_header="n", optional_header="o",
            file_header="f", magic="m", entry_point="e",
            major_linker_version=0, minor_linker_version=0,
            target_machine="t", architecture="a",
            compilation_time=0, compilation_time_utc="",
            is_dotnet=False, is_signed=False, has_overlay=False,
            number_of_sections=0, number_of_imports=0,
            number_of_exports=0, number_of_resources=0,
            type="DLL",
        )
        assert pe.dbg_struct is None
        assert pe.tls_struct is None
        assert pe.rich_header_dump is None
        assert pe.version_info is None


class TestPEImportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEImport

        pi = PEImport(pe_imports_total=5)
        assert pi.pe_imports_total == 5
        assert pi.pe_import_libraryName is None
        assert pi.pe_import_functions is None


class TestPESectionDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PESection

        ps = PESection(
            _id="sec_id", section_entropy=6.5, section_sha256="sha",
            section_md5="md5", section_name=".text", section_name_b64=".text",
            section_pointer_to_raw_data="0x400",
            section_size=4096, section_v_addr="0x1000",
            section_v_addr_hex="0x1000", section_v_size=8192,
        )
        assert ps.section_name == ".text"
        assert ps.section_entropy == 6.5


class TestPEResourceDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEResource

        pr = PEResource(
            _id="res_id", resource_type="RT_ICON", resource_entropy=3.5,
            resource_sha256="sha", resource_filetype="image/png",
            resource_magika="png", resource_language="LANG_ENGLISH",
            resource_sub_lang="SUBLANG_DEFAULT",
            resource_rva="0x2000", resource_size=1024,
        )
        assert pr.resource_type == "RT_ICON"


class TestPEOverlayDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEOverlay

        po = PEOverlay(
            _id="ovl_id", overlay_size=512, overlay_entropy=7.9,
            overlay_offset="0x5000", overlay_mimetype="application/octet-stream",
            overlay_type="data", overlay_magika="unknown",
            overlay_sha256="sha", overlay_sha1="sha1", overlay_md5="md5",
        )
        assert po.overlay_size == 512


class TestPESignerDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PESigner

        ps = PESigner(
            signer_serial_number="01", signer_subject="CN=Test",
            signer_issuer="CN=CA", signer_valid_from="2021-01-01",
            signer_valid_to="2025-01-01", signer_thumbprint="aabb",
            signer_algorithm="sha256WithRSAEncryption",
        )
        assert ps.signer_subject == "CN=Test"


class TestPECertificateDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PECertificate

        pc = PECertificate(
            certificate_serial_number="02", certificate_subject="CN=Cert",
            certificate_issuer="CN=CA", certificate_valid_from="2021-01-01",
            certificate_valid_to="2025-01-01", certificate_thumbprint="ccdd",
            certificate_algorithm="sha256",
        )
        assert pc.certificate_serial_number == "02"


class TestPECodeSigningInfoDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PECodeSigningInfo

        cs = PECodeSigningInfo(
            _id="cs_id", signature_verified=True, number_of_certificates=2,
        )
        assert cs.signature_verified is True
        assert cs.x509_certificates is None

    def test_with_certificates(self):
        from redb.models.dataclasses import PECodeSigningInfo

        cs = PECodeSigningInfo(
            _id="cs_id", signature_verified=False, number_of_certificates=0,
            x509_certificates=[{"cn": "test"}],
        )
        assert len(cs.x509_certificates) == 1


class TestPEExtraFindingDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEExtraFinding

        ef = PEExtraFinding(context="anomaly_detection")
        assert ef.context == "anomaly_detection"
        assert ef.finding is None


class TestPEDotNetDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEDotNet

        dn = PEDotNet()
        assert dn.dotnet == {}

    def test_with_data(self):
        from redb.models.dataclasses import PEDotNet

        dn = PEDotNet(dotnet={"runtime": "v4.0.30319"})
        assert dn.dotnet["runtime"] == "v4.0.30319"


class TestDotNetInconsistencyTestsDataclass:
    def test_creation(self):
        from redb.models.dataclasses import DotNetInconsistencyTests

        it = DotNetInconsistencyTests(
            test_dotnet_data_dir_hidden=False,
            test_dotnet_fake_types=True,
            test_dotnet_extra_data=None,
            test_dotnet_invalid_type_ref=False,
            test_dotnet_fake_datastreams=False,
            test_dotnet_extra_module_table=None,
            test_dotnet_extra_assembly_table=False,
            test_dotnet_invalid_strings_stream=False,
            test_dotnet_streams_mixed_case=True,
            test_dotnet_method_def_invalid_table=False,
            test_dotnet_max_len_exceeding_strings=False,
        )
        assert it.test_dotnet_fake_types is True
        assert it.test_dotnet_extra_data is None


class TestPEInconsistencyTestsDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEInconsistencyTests

        it = PEInconsistencyTests(
            test_rich_header_checksum=True,
            test_rich_header_duplicate=False,
            test_rich_header_linker=None,
            test_rich_header_import_count=True,
        )
        assert it.test_rich_header_checksum is True
        assert it.test_rich_header_linker is None


# ============================================================================
# YARA Dataclasses
# ============================================================================

class TestYaraRuleDataclass:
    def test_creation(self):
        from redb.models.dataclasses import YaraRule

        yr = YaraRule(
            rule_name="test_rule",
            rule_tags=["malware", "trojan"],
            rule_meta={"author": "test", "description": "A test rule"},
        )
        assert yr.rule_name == "test_rule"
        assert "malware" in yr.rule_tags


class TestYaraMatchDataclass:
    def test_creation(self):
        from redb.models.dataclasses import YaraMatch

        ym = YaraMatch(rule_name="test_rule", match_strings=["$s1", "$s2"])
        assert ym.rule_name == "test_rule"
        assert len(ym.match_strings) == 2


# ============================================================================
# ELF Dataclasses
# ============================================================================

class TestELFFeaturesDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFFeatures

        ef = ELFFeatures(
            ei_class=2, ei_data=1, ei_version=1, ei_osabi=0, ei_abiversion=0,
            e_type=2, e_machine=62, e_version=1, e_entry=0x400000, e_flags=0,
            ei_class_str="ELFCLASS64", ei_data_str="ELFDATA2LSB",
            ei_osabi_str="ELFOSABI_SYSV", e_type_str="ET_EXEC",
            e_machine_str="EM_X86_64",
            is_64bit=1, is_stripped=0, is_pie=0, has_canary=1, has_nx=1,
            has_relro=1, has_fortify=0,
            number_of_segments=9, number_of_sections=31,
            number_of_symbols=100, number_of_dynamic_symbols=50,
            number_of_relocations=25, number_of_dependencies=5,
            gnu_hash_present=1, has_debug_info=0,
        )
        assert ef.ei_class == 2
        assert ef.e_machine_str == "EM_X86_64"
        assert ef.build_id is None

    def test_with_build_id(self):
        from redb.models.dataclasses import ELFFeatures

        ef = ELFFeatures(
            ei_class=2, ei_data=1, ei_version=1, ei_osabi=0, ei_abiversion=0,
            e_type=3, e_machine=62, e_version=1, e_entry=0, e_flags=0,
            ei_class_str="64", ei_data_str="LE", ei_osabi_str="SYSV",
            e_type_str="DYN", e_machine_str="X86_64",
            is_64bit=1, is_stripped=1, is_pie=1, has_canary=0, has_nx=1,
            has_relro=1, has_fortify=0,
            number_of_segments=8, number_of_sections=28,
            number_of_symbols=0, number_of_dynamic_symbols=30,
            number_of_relocations=10, number_of_dependencies=3,
            gnu_hash_present=1, has_debug_info=0,
            build_id="abc123def456",
        )
        assert ef.build_id == "abc123def456"


class TestELFDependencyDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFDependency

        dep = ELFDependency(
            dependency_name="libc.so.6",
            dependency_type=1,
            dependency_type_str="NEEDED",
        )
        assert dep.dependency_name == "libc.so.6"


class TestELFImportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFImport

        ei = ELFImport(elf_imports_total=3)
        assert ei.elf_imports_total == 3
        assert ei.elf_import_libraries == []
        assert ei.elf_import_functions == []


class TestELFExportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFExport

        ee = ELFExport(elf_exports_total=5)
        assert ee.elf_exports_total == 5
        assert ee.elf_export_functions == []


class TestELFSectionDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSection

        es = ELFSection(
            section_name=".text", section_type=1, section_type_str="SHT_PROGBITS",
            section_flags=6, section_flags_str=["SHF_ALLOC", "SHF_EXECINSTR"],
            section_addr=0x400000, section_offset=0x1000, section_size=4096,
            section_link=0, section_info=0, section_addralign=16, section_entsize=0,
            section_entropy=6.8, section_sha256="sha", section_md5="md5",
        )
        assert es.section_name == ".text"
        assert "SHF_ALLOC" in es.section_flags_str


class TestELFSegmentDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSegment

        seg = ELFSegment(
            segment_type=1, segment_type_str="PT_LOAD",
            segment_flags=5, segment_flags_str=["PF_R", "PF_X"],
            segment_offset=0, segment_vaddr=0x400000, segment_paddr=0x400000,
            segment_filesz=0x1000, segment_memsz=0x1000, segment_align=0x200000,
            segment_entropy=5.5, segment_sha256="sha", segment_md5="md5",
        )
        assert seg.segment_type_str == "PT_LOAD"


class TestELFSymbolDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSymbol

        sym = ELFSymbol(
            symbol_name="main", symbol_value=0x401000, symbol_size=100,
            symbol_type=2, symbol_type_str="STT_FUNC",
            symbol_bind=1, symbol_bind_str="STB_GLOBAL",
            symbol_visibility=0, symbol_visibility_str="STV_DEFAULT",
            symbol_section_index=14, symbol_section_index_str="14",
            is_dynamic=0,
        )
        assert sym.symbol_name == "main"
        assert sym.symbol_type_str == "STT_FUNC"


class TestELFRelocationDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFRelocation

        rel = ELFRelocation(
            relocation_offset=0x601000, relocation_type=7,
            relocation_type_str="R_X86_64_JUMP_SLOT",
            relocation_symbol_index=1, relocation_symbol_name="printf",
            relocation_section=".rela.plt",
        )
        assert rel.relocation_addend is None

    def test_with_addend(self):
        from redb.models.dataclasses import ELFRelocation

        rel = ELFRelocation(
            relocation_offset=0x601000, relocation_type=7,
            relocation_type_str="R_X86_64_JUMP_SLOT",
            relocation_symbol_index=1, relocation_symbol_name="printf",
            relocation_section=".rela.plt",
            relocation_addend=-4,
        )
        assert rel.relocation_addend == -4


class TestELFNoteDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFNote

        note = ELFNote(
            note_name="GNU", note_type=3,
            note_type_str="NT_GNU_BUILD_ID",
            note_desc="abc123", note_section=".note.gnu.build-id",
        )
        assert note.note_name == "GNU"
        assert note.note_type_str == "NT_GNU_BUILD_ID"


# ============================================================================
# Decompiled
# ============================================================================

class TestDecompiledDataclass:
    def test_creation(self):
        from redb.models.dataclasses import Decompiled

        d = Decompiled(
            _id="func_hash",
            decompiled_function_name="main",
            decompiled_function_address="0x401000",
            decompiled_function="int main() { return 0; }",
        )
        assert d.decompiled_function_name == "main"