Karima Benatchba

98 papers B 12C 14Misc 3Journal 27Unranked 42
YearRankTypeTitle / Venue / Authors
2026 B conf
CC
Abdessamed Seddiki, Arab Mohammed, Zakaria Hebbal, Aimad Chabounia, Eduardo Chielle, Karima Benatchba, Challal Yacine, Djamel Eddine Menacer, Michail Maniatakos, Riyadh Baghdadi
2025 J jnl
CoRR
Aniss Bessalah, Hatem Mohamed Abdelmoumen, Karima Benatchba, Hadjer Benmeziane
2025 B conf
PACT
Massinissa Merouani, Afif Boudaoud, Iheb Nassim Aouadj, Nassim Tchoulak, Islem Kara Bernou, Hamza Benyamina, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Hugh Leather, Riyadh Baghdadi
2025 conf
CNS
Menatallah Fadoua Slama, Hiba Guerrouache, Yacine Challal, Karima Benatchba, Riyadh Baghdadi
2025 C conf
CoDIT
Meriem Touat, Karima Benatchba, Lyna-Razane Meguellati
2025 conf
GECCO Companion
Yousra Farhani, Taha Arbaoui, Karima Benatchba
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Anais Boumendil, Walid Bechkit, Karima Benatchba
2025 C conf
PST
Hiba Guerrouache, Menatallah Fadoua Slama, Yacine Challal, Karima Benatchba
2025 J jnl
SN Comput. Sci.
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Yahya Slimani
2025 J jnl
Int. J. Data Sci. Anal.
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Karima Benatchba
2024 B conf
IWCMC
Abdelaziz Amara Korba, Souad Sebaa, Malik Mabrouki, Yacine Ghamri-Doudane, Karima Benatchba
2024 J jnl
CoRR
Abdelaziz Amara Korba, Souad Sebaa, Malik Mabrouki, Yacine Ghamri-Doudane, Karima Benatchba
2024 C conf
CoDIT
Meriem Touat, Karima Benatchba, Annis-Sahnoune Haned, Mohammadmohsen Aghelinejad
2024 J jnl
J. Syst. Inf. Technol.
Narimène Dakiche, Karima Benatchba, Fatima Benbouzid-Si Tayeb, Yahya Slimani, Mehdi Anis Brahmi
2024 J jnl
IEEE Internet Things J.
Mohamed Sami Assenine, Walid Bechkit, Ichrak Mokhtari, Hervé Rivano, Karima Benatchba
2024 J jnl
CoRR
Massinissa Merouani, Khaled Afif Boudaoud, Iheb Nassim Aouadj, Nassim Tchoulak, Islem Kara Bernou, Hamza Benyamina, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Hugh Leather, Riyadh Baghdadi
2024 J jnl
IEEE Access
Hachemi Nabil Dellys, Layth Sliman, Brendan Tran Morris, Karima Benatchba
2023 conf
ICCCI (CCIS Volume)
Asma Cherrered, Imene Racha Mekki, Karima Benatchba, Fatima Benbouzid-Si Tayeb
2023 B conf
KES
Sarra Zohra Ahmed Bacha, Fatima Benbouzid-Si Tayeb, Karima Benatchba
2023 J jnl
IEEE Access
Mohamed Oulad-Kaddour, Hamid Haddadou, Cristina Conde Vilda, Daniel Palacios-Alonso, Karima Benatchba, Enrique Cabello
2023 B conf
HAI
Melissa Tessa, Sarah Abchiche, Yves Claude Ferstler, Igor Tchappi, Karima Benatchba, Amro Najjar
2023 B conf
KES
Imene Racha Mekki, Asma Cherrered, Fatima Benbouzid-Si Tayeb, Karima Benatchba
2023 conf
IWANN (2)
Leila Hamdad, Cylia Laoufi, Rima Amirat, Karima Benatchba, Souhila Sadeg
2023 B conf
ICTAI
Anais Boumendil, Walid Bechkit, Karima Benatchba
2023 conf
WEBIST (Revised Selected Papers)
Narimène Dakiche, Karima Benatchba, Fatima Benbouzid-Si Tayeb
2022 B conf
ASONAM
Narimène Dakiche, Karima Benatchba, Fatima Benbouzid-Si Tayeb, Yahya Slimani, Mehdi Anis Brahmi
2022 J jnl
Appl. Soft Comput.
Sarra Zohra Ahmed Bacha, Karima Benatchba, Fatima Benbouzid-Si Tayeb
2022 J jnl
CoRR
Massinissa Merouani, Khaled Afif Boudaoud, Iheb Nassim Aouadj, Nassim Tchoulak, Fatima Benbouzid-Sitayeb, Karima Benatchba, Hugh Leather, Riyadh Baghdadi
2021 conf
MLSys
Riyadh Baghdadi, Massinissa Merouani, Mohamed-Hicham Leghettas, Kamel Abdous, Taha Arbaoui, Karima Benatchba, Saman P. Amarasinghe
2021 J jnl
CoRR
Riyadh Baghdadi, Massinissa Merouani, Mohamed-Hicham Leghettas, Kamel Abdous, Taha Arbaoui, Karima Benatchba, Saman P. Amarasinghe
2021 J jnl
SN Comput. Sci.
Leila Hamdad, Karima Benatchba
2021 C conf
SIMULTECH
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Yahya Slimani, Abdelouahab Khelifati, Hadjer Chabane
2021 C conf
WEBIST
Narimène Dakiche, Karima Benatchba, Fatima Benbouzid-Si Tayeb, Yahya Slimani
2021 J jnl
IET Biom.
Saliha Artabaz, Layth Sliman, Karima Benatchba, Mouloud Koudil
2021 J jnl
Int. J. Bio Inspired Comput.
Asma Daoudi, Karima Benatchba, Malika Bessedik, Leila Hamdad
2021 J jnl
New Gener. Comput.
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Yahya Slimani
2020 J jnl
Memetic Comput.
Souhila Sadeg, Leila Hamdad, Hadjer Chettab, Karima Benatchba, Zineb Habbas, M. Tahar Kechadi
2020 conf
MISC
Souhila Sadeg, Leila Hamdad, Omar Kada, Karima Benatchba, Zineb Habbas
2020 conf
ACIIDS (1)
Mourad Terzi, Taha Arbaoui, Farouk Yalaoui, Karima Benatchba
2020 J jnl
Int. J. Comput. Sci. Eng.
Leila Hamdad, Zakaria Ournani, Karima Benatchba, Ahcène Bendjoudi
2019 B conf
KES
Sarra Zohra Ahmed Bacha, Mohamed Walid Belahdji, Karima Benatchba, Fatima Benbouzid-Si Tayeb
2019 Misc conf
SAC
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Yahya Slimani, Karima Benatchba
2019 conf
BI
Meriem Romaissa Boubakeur, Guoyin Wang, Ke Liu, Karima Benatchba
2019 conf
IWANN (2)
Leila Hamdad, Karima Benatchba, Ahcène Bendjoudi, Zakaria Ournani
2019 C conf
IECON
Charaf Eddine Khamoudj, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Mohamed Benbouzid
2019 C conf
IECON
Touka Faisal, Karima Benatchba, Mouloud Koudil
2019 conf
IWANN (2)
Souhila Sadeg, Leila Hamdad, Amine Riad Remache, Mehdi Nedjmeddine Karech, Karima Benatchba, Zineb Habbas
2019 J jnl
Inf. Process. Manag.
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Yahya Slimani, Karima Benatchba
2019 conf
IWANN (2)
Souhila Sadeg, Leila Hamdad, Mouloud Haouas, Kouider Abderrahmane, Karima Benatchba, Zineb Habbas
2018 conf
CIIA
Leila Hamdad, Karima Benatchba, Fella Belkham, Nesrine Cherairi
2018 conf
NTMS
Hachemi Nabil Dellys, Karima Benatchba, Layth Sliman, Yen-Wei Chen
2018 J jnl
Oper. Res.
Fatima Benbouzid-Si Tayeb, Karima Benatchba, Abdessalam Messiaid
2018 B conf
FUZZ-IEEE
Narimène Dakiche, Fatima Benbouzid-Si Tayeb, Yahya Slimani, Karima Benatchba
2018 conf
CIIA
Leila Hamdad, Karima Benatchba, Soraya Ifrez, Yasmine Mohguen
2017 J jnl
Appl. Soft Comput.
Sabrina Titri, Cherif Larbes, Kamal Youcef-Toumi, Karima Benatchba
2017 J jnl
Telecommun. Syst.
Said Talbi, Mouloud Koudil, Abdelmadjid Bouabdallah, Karima Benatchba
2017 C conf
IECON
Charaf Eddine Khamoudj, Fatima Benbouzid-Si Tayeb, Karima Benatchba, Mohamed Benbouzid
2016 Misc conf
IDC
Adel Boukhadra, Karima Benatchba, Amar Balla
2016 C conf
HIS
Hachemi Nabil Dellys, Layth Sliman, Saliha Artabaz, Karima Benatchba, Mouloud Koudil
2016 conf
ICSIBO
Charaf Eddine Khamoudj, Karima Benatchba, Mohand Tahar Kechadi
2016 J jnl
J. Ambient Intell. Humaniz. Comput.
Adel Boukhadra, Karima Benatchba, Amar Balla
2016 conf
MCSoC
Asma Benmessaoud Gabis, Marc Sevaux, Pierre Bomel, Mouloud Koudil, Karima Benatchba
2016 C conf
ISDA
Saliha Artabaz, Layth Sliman, Hachemi Nabil Dellys, Karima Benatchba, Mouloud Koudil
2015 conf
IVIC
Hachemi Nabil Dellys, Noussaiba Benadjimi, Meriem Romaissa Boubakeur, Layth Sliman, Karima Benatchba, Saliha Artabaz, Mouloud Koudil
2015 conf
IDT
Braham Lotfi Mediouni, Smaïl Niar, Rachid Benmansour, Karima Benatchba, Mouloud Koudil
2015 B conf
GLOBECOM
Said Talbi, Mouloud Koudil, Abdelmadjid Bouabdallah, Karima Benatchba
2015 C conf
SIMULTECH
Badiâa Hedjazi, Samir Aknine, Karima Benatchba
2015 conf
IWANN (1)
Souhila Sadeg, Leila Hamdad, Karima Benatchba, Zineb Habbas
2015 Misc conf
DCAI
Adel Boukhadra, Karima Benatchba, Amar Balla
2015 conf
CDC
Fatima Benbouzid-Si Tayeb, Abdessalam Messiaid, Karima Benatchba
2015 B conf
ACII
Mohamed Redha Sidoumou, Scott J. Turner, Phil D. Picton, Kamal Bechkoum, Karima Benatchba
2015 conf
CIIA
Omar Boudraa, Karima Benatchba
2015 conf
IVIC
Saliha Artabaz, Layth Sliman, Karima Benatchba, Hachemi Nabil Dellys, Mouloud Koudil
2015 conf
FNC/MobiSPC
Adel Boukhadra, Karima Benatchba, Amar Balla
2015 conf
3PGCIC
Adel Boukhadra, Karima Benatchba, Amar Balla
2014 C conf
IAS
Saliha Artabaz, Karima Benatchba, Mouloud Koudil, Dellys Hachemi Nabil, Ahmed Bouridane
2014 conf
HPCC/CSS/ICESS
Adel Boukhadra, Karima Benatchba, Amar Balla
2014 conf
NBiS
Adel Boukhadra, Karima Benatchba, Amar Balla
2013 conf
NICSO
Malika Bessedik, Asma Daoudi, Karima Benatchba
2013 C conf
IECON
Daoud Boumazouza, Yasmine Sefouane, Mohamed Djeddi, Boualem Khelouat, Karima Benatchba
2013 conf
ICITST
Adel Boukhadra, Karima Benatchba, Amar Balla
2013 conf
3PGCIC
Adel Boukhadra, Karima Benatchba, Amar Balla
2013 J jnl
Int. J. Simul. Process. Model.
Badiâa Hedjazi, Mohamed Ahmed-Nacer, Samir Aknine, Karima Benatchba
2013 conf
HPCC/EUC
Ahcène Bendjoudi, Mehdi Chekini, Makhlouf Gharbi, Malika Mehdi, Karima Benatchba, Fatima Sitayeb-Benbouzid, Nouredine Melab
2013 conf
IWINAC (1)
Leila Hamdad, Anissa Achab, Amira Boutouchent, Fodil Dahamni, Karima Benatchba
2012 C conf
ISCC
Walid Bechkit, Mouloud Koudil, Yacine Challal, Abdelmadjid Bouabdallah, Brahim Souici, Karima Benatchba
2012 conf
IAT
Badiâa Hedjazi, Mohamed Ahmed-Nacer, Samir Aknine, Karima Benatchba
2012 conf
ICAART (2)
Badiâa Hedjazi, Mohamed Ahmed-Nacer, Samir Aknine, Karima Benatchba
2012 conf
AMT
Badiâa Hedjazi, Mohamed Ahmed-Nacer, Samir Aknine, Karima Benatchba
2012 conf
CASoN
Dellys Hachemi Nabil, Karima Benatchba, Mouloud Koudil, Ahmed Bouridane
2011 conf
IEEE ICCI*CC
Aicha Mahmoudi, Karima Benatchba, Malika Bessedik
2011 conf
ICAART (2)
Badiâa Hedjazi, Samir Aknine, Mohamed Ahmed-Nacer, Karima Benatchba
2007 J jnl
Appl. Math. Comput.
Mouloud Koudil, Karima Benatchba, Amina Tarabet, El Batoul Sahraoui
2006 J jnl
Appl. Math. Comput.
Lotfi Admane, Karima Benatchba, Mouloud Koudil, Lamri Siad, Said Maziz
2005 conf
IWINAC (2)
Mouloud Koudil, Karima Benatchba, Said Gharout, Nacer Hamani
2005 conf
IWINAC (2)
Karima Benatchba, Lotfi Admane, Mouloud Koudil
2004 conf
SMC (4)
Lotfi Admane, Karima Benatchba, Mouloud Koudil, Habiba Drias, Said Gharout, Nacer Hamani
2003 conf
IWANN (2)
Mouloud Koudil, Karima Benatchba, Daniel Dours
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"