Xiaofang Hu

92 papers A* 2B 3Journal 77Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Xiaofang Hu, Leimin Wang, Feida Song, Chuan-Ke Zhang, Yong He
2026 conf
ASP-DAC
He Xiao, Yue Zhou, Dirui Xie, Qi Cheng, Xiaofang Hu, Zhengwu Liu, Ngai Wong
2026 J jnl
Computing
Yutao Xia, Yue Zhou, Xiaofang Hu, Shukai Duan
2026 J jnl
Pattern Recognit.
Dirui Xie, Xiaofang Hu, Yue Zhou, Shukai Duan
2026 J jnl
Neurocomputing
Hong-An Tang, Zi-Yi Xia, Xiaofang Hu, Shukai Duan, Lidan Wang
2026 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Bingrui Xu, Bing Li, Xiaofang Hu, Shenglin Li
2026 J jnl
J. Ambient Intell. Humaniz. Comput.
Zhaoheng Meng, He Ji, Xiaofang Hu
2025 J jnl
Neurocomputing
Junzhe Xu, Haoqin Hong, Yue Zhou, Xiaofang Hu, Shukai Duan
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Hong-An Tang, Yanhong Wang, Xiaofang Hu, Shukai Duan, Lidan Wang
2025 J jnl
Neurocomputing
Hong-An Tang, Jin-wei Li, Xiaofang Hu, Shukai Duan, Lidan Wang
2025 J jnl
IEEE Trans. Biomed. Circuits Syst.
Qi Cheng, Xiaofang Hu, He Xiao, Yue Zhou, Shukai Duan
2025 J jnl
IEEE Trans. Fuzzy Syst.
Xiaofang Hu, Leimin Wang, Yin Sheng, Qiang Xiao, Ming-Feng Ge
2025 J jnl
Expert Syst. Appl.
Yu Yang, Yue Zhou, Xiaofang Hu, Shukai Duan
2025 A* conf
ACM Multimedia
Dirui Xie, Xiaofang Hu, Zihan Wei, Zhengqiqi Yang, Yanlian Jiang, Yue Zhou
2025 J jnl
Signal Process. Image Commun.
Peng He, Lin Zhang, Yu Yang, Yue Zhou, Shukai Duan, Xiaofang Hu
2025 J jnl
Appl. Intell.
Dirui Xie, Qi Cheng, Yue Zhou, Xiaofang Hu
2025 J jnl
Appl. Intell.
Feier Xiong, Yue Zhou, Xiaofang Hu, Shukai Duan
2025 J jnl
Knowl. Based Syst.
Dirui Xie, Xiaofang Hu, He Xiao, Yue Zhou, Shukai Duan
2025 J jnl
Math. Comput. Simul.
Leimin Wang, Jian Shen, Xiaofang Hu, Guodong Zhang, Genping Wu
2024 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Xiaofang Hu, Leimin Wang, Qingyi Wang, Ming-Feng Ge, Xiaofeng Zong
2024 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Wenhao Zhang, He Xiao, Dirui Xie, Yue Zhou, Shukai Duan, Xiaofang Hu
2024 J jnl
Pattern Recognit. Lett.
Falai Wei, Xiaofang Hu
2024 J jnl
Neurocomputing
Shi-Yu Yang, Hong-An Tang, Xiaofang Hu, Qingling Xia, Lidan Wang, Shukai Duan
2024 J jnl
Int. J. Control
Haoyu Li, Xiaofang Hu, Qingyi Wang, Leimin Wang
2024 J jnl
IEEE Trans. Cogn. Dev. Syst.
Jinying Liu, Feier Xiong, Yue Zhou, Shukai Duan, Xiaofang Hu
2024 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
He Xiao, Dirui Xie, Xiaofang Hu, Yue Zhou, Guangdong Zhou, Shukai Duan
2024 B conf
IJCNN
Haoqin Hong, Yue Zhou, Xiangyu Shu, Xiaofang Hu
2024 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
He Xiao, Xiaofang Hu, Tongtong Gao, Yue Zhou, Shukai Duan, Yiran Chen
2024 J jnl
IEEE Trans. Fuzzy Syst.
Xiaofang Hu, Leimin Wang, Chuan-Ke Zhang, Yong He
2024 J jnl
Knowl. Based Syst.
Jing Su, Dirui Xie, Yuanzhi Duan, Yue Zhou, Xiaofang Hu, Shukai Duan
2024 J jnl
Expert Syst. Appl.
Dirui Xie, He Xiao, Yue Zhou, Shukai Duan, Xiaofang Hu
2024 J jnl
Int. J. Bifurc. Chaos
Tianhao Zhao, Yue Zhou, Xiaofang Hu
2024 J jnl
IEEE Trans. Consumer Electron.
Dirui Xie, He Xiao, Xiaofang Hu, Yue Zhou, Guangdong Zhou, Shukai Duan
2024 J jnl
Inf. Sci.
Feida Song, Leimin Wang, Xiaofang Hu, Xiaofeng Zong, Shiping Wen
2024 J jnl
Neurocomputing
Bingrui Xu, Xiaofang Hu, Shenglin Li
2024 J jnl
Neurocomputing
Guanghui Jiang, Leimin Wang, Xiaofang Hu, Haoyu Li, Xiaofeng Zong
2024 J jnl
Appl. Intell.
Zhao Dong, Yuanzhi Duan, Yue Zhou, Shukai Duan, Xiaofang Hu
2023 J jnl
Int. J. Bifurc. Chaos
Jing Su, Jiale Lu, Fan Sun, Guangdong Zhou, Shukai Duan, Xiaofang Hu
2023 J jnl
IEEE Trans. Fuzzy Syst.
Xiaofang Hu, Leimin Wang, Yin Sheng, Junhao Hu
2023 J jnl
Sci. China Inf. Sci.
Xiaofang Hu, Leimin Wang, Chuan-Ke Zhang, Xiongbo Wan, Yong He
2023 J jnl
IEEE J. Emerg. Sel. Topics Circuits Syst.
He Xiao, Yue Zhou, Tongtong Gao, Shukai Duan, Guanrong Chen, Xiaofang Hu
2023 J jnl
Int. J. Bifurc. Chaos
He Xiao, Haohang Sun, Tianhao Zhao, Yue Zhou, Xiaofang Hu
2023 conf
CDC
Xiaofang Hu, Feida Song, Leimin Wang
2022 conf
PRICAI (3)
Wenhao Zhang, Yue Zhou, Shukai Duan, Xiaofang Hu
2022 J jnl
Int. J. Bifurc. Chaos
Fan Sun, Jie Li, He Xiao, Shukai Duan, Xiaofang Hu
2022 J jnl
Neural Comput. Appl.
Lin Zhang, Yue Zhou, Xiaofang Hu, Fan Sun, Shukai Duan
2022 J jnl
Knowl. Based Syst.
Tongtong Gao, Yue Zhou, Shukai Duan, Xiaofang Hu
2022 J jnl
Neurocomputing
Peng He, Yue Zhou, Shukai Duan, Xiaofang Hu
2022 conf
ACCV (1)
Yuanzhi Duan, Yue Zhou, Peng He, Qiang Liu, Shukai Duan, Xiaofang Hu
2022 J jnl
CoRR
Yuanzhi Duan, Xiaofang Hu, Yue Zhou, Peng He, Qiang Liu, Shukai Duan
2022 J jnl
Sci. China Inf. Sci.
Xiaofang Hu, Wenqiang Shi, Yue Zhou, Hong-An Tang, Shukai Duan
2022 J jnl
IEEE Trans. Fuzzy Syst.
Xiaofang Hu, Leimin Wang, Zhigang Zeng, Song Zhu, Junhao Hu
2022 J jnl
Neurocomputing
Xiaofang Hu, Xinge Liu, Meilan Tang
2021 J jnl
Neurocomputing
Meilan Tang, Xiaofang Hu, Xinge Liu, Qiao Chen
2021 J jnl
Sci. China Inf. Sci.
Yue Zhou, Xiaofang Hu, Lidan Wang, Shukai Duan
2021 J jnl
Neurocomputing
Yue Zhou, Xiaofang Hu, Jiaqi Han, Lidan Wang, Shukai Duan
2021 B conf
IJCNN
Shihao Dan, Xiaofang Hu, Yue Zhou, Shukai Duan
2021 J jnl
Neurocomputing
Lin Zhang, Xiaofang Hu, Yue Zhou, Guangdong Zhou, Shukai Duan
2021 J jnl
CoRR
Yuanzhi Duan, Xiaofang Hu, Yue Zhou, Qiang Liu, Shukai Duan
2021 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Yue Zhou, Xiaofang Hu, Lidan Wang, Guangdong Zhou, Shukai Duan
2021 J jnl
Sci. China Inf. Sci.
Li Luo, Zhekang Dong, Xiaofang Hu, Lidan Wang, Shukai Duan
2021 J jnl
Int. J. Bifurc. Chaos
Xiaoyue Ji, Donglian Qi, Zhekang Dong, Chun Sing Lai, Guangdong Zhou, Xiaofang Hu
2020 J jnl
Int. J. Bifurc. Chaos
Li Luo, Zhekang Dong, Xiaofang Hu, Lidan Wang, Shukai Duan
2020 J jnl
Neurocomputing
Chen-Xu Yue, Lidan Wang, Xiaofang Hu, Hong-An Tang, Shukai Duan
2019 ch.
Handbook of Memristor Networks
Xiaofang Hu, Guanrong Chen, Shukai Duan, Gang Feng
2019 J jnl
J. Frankl. Inst.
Hong-An Tang, Jin-Liang Wang, Lidan Wang, Xiaofang Hu, Yue Zhou, Shukai Duan
2019 J jnl
IEEE Access
Yue Zhou, Xiaofang Hu, Lidan Wang, Shukai Duan, Yiran Chen
2018 conf
ICCCS (3)
Hong Lai, Mingxing Luo, Li Tao, Fuyuan Xiao, Cheng Zhan, Xiaofang Hu
2018 J jnl
Int. J. Bifurc. Chaos
Zhekang Dong, Donglian Qi, Yufei He, Zhao Xu, Xiaofang Hu, Shukai Duan
2018 J jnl
IEEE Access
Xinyu Xiong, Fei Chen, Peizhi Huang, Miaomiao Tian, Xiaofang Hu, Badong Chen, Jing Qin
2018 J jnl
Neurocomputing
Hong-An Tang, Shukai Duan, Xiaofang Hu, Lidan Wang
2018 J jnl
Remote. Sens.
Yuguo Qian, Weiqi Zhou, Xiaofang Hu, Fan Fu
2017 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Xiaofang Hu, Gang Feng, Shukai Duan, Lu Liu
2017 conf
WCSP
Xiaolin Zhang, Xiaofang Hu, Xue Dong
2017 J jnl
Neurocomputing
Xiaofang Hu, Shukai Duan, Guanrong Chen, Ling Chen
2017 J jnl
IET Circuits Devices Syst.
Li Luo, Xiaofang Hu, Shukai Duan, Zhekang Dong, Lidan Wang
2017 J jnl
Remote. Sens.
Zhong Zheng, Weiqi Zhou, Jia Wang, Xiaofang Hu, Yuguo Qian
2016 conf
HCC
Feng Li, Xiaofang Hu
2016 J jnl
Neural Comput. Appl.
Shukai Duan, Zhekang Dong, Xiaofang Hu, Lidan Wang, Hai Li
2016 J jnl
Neurocomputing
Ling Chen, Chuandong Li, Tingwen Huang, Xiaofang Hu, Yiran Chen
2015 A* conf
DAC
Wei Wen, Chi-Ruo Wu, Xiaofang Hu, Beiye Liu, Tsung-Yi Ho, Xin Li, Yiran Chen
2015 J jnl
Int. J. Bifurc. Chaos
Xiaofang Hu, Gang Feng, Lu Liu, Shukai Duan
2015 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Shukai Duan, Xiaofang Hu, Zhekang Dong, Lidan Wang, Pinaki Mazumder
2015 J jnl
Neurocomputing
Xiaofang Hu, Gang Feng, Shukai Duan, Lu Liu
2014 B conf
IJCNN
Xiaofang Hu, Gang Feng, Hai Li, Yiran Chen, Shukai Duan
2014 J jnl
Sci. China Inf. Sci.
Shukai Duan, Xiaofang Hu, Lidan Wang, Chuandong Li
2014 J jnl
Neural Comput. Appl.
Shukai Duan, Xiaofang Hu, Lidan Wang, Shiyong Gao, Chuandong Li
2014 J jnl
Neural Comput. Appl.
Shukai Duan, Yi Zhang, Xiaofang Hu, Lidan Wang, Chuandong Li
2013 conf
EMBC
Guangchen Dai, Wei Jia, Xiaofang Hu, Lisa X. Xu
2012 J jnl
Sci. China Inf. Sci.
Xiaofang Hu, Shukai Duan, Lidan Wang, Xiaofeng Liao
2012 J jnl
Sci. China Inf. Sci.
Shukai Duan, Xiaofang Hu, Lidan Wang, Chuandong Li, Pinaki Mazumder
2011 conf
AICI (1)
Xiaofang Hu, Shukai Duan, Lidan Wang
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"