Haitao Zhao

59 papers B 4C 1Journal 42Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Boyu Zhao, Wei Li, Junjie Wang, Yuxiang Zhang, Hong Yang, Haitao Zhao, Ran Tao, Qian Du
2026 J jnl
IET Commun.
Qinchi Li, Haitao Zhao, Qin Wang, Weicong Zhang, Yangzhi Chen, Zhixiang Hu
2026 J jnl
Microelectron. J.
Zhongrui Wang, Kun Yang, Jiaxin Yao, Zhanfeng Liu, Hang Zhang, Yuzhe Yu, Jie Xu, Yanyu Yang, Haitao Zhao, Lei Cao, Yadong Zhang, Zhaohao Zhang, Renjie Jiang, Meihe Zhang, Yanyi Pan, Mingzhu Yan, Yingze Ren, Zhongshan Xie, Yajuan Su, Jing Xu, Linfei Wang, Hainan Liu, Junfeng Li, Qingzhu Zhang, Huaxiang Yin, Bo Li, Xiaolei Wang, Jun Luo
2025 J jnl
Comput. Aided Civ. Infrastructure Eng.
Yangtao Li, Haitao Zhao, Hao Gu, Yang Wei, Zhenyang Xiang, Yiming Wang, Yang Yu, Tengfei Bao
2025 J jnl
IEEE Internet Things J.
Yinan Liu, Chao Yang, Yanqun Tang, Haitao Zhao, Yi Liu, Shengli Xie
2025 conf
DSN-W
Andrew Cart, Shaohu Zhang, Melanie Escue, Xugui Zhou, Haitao Zhao, Prashanth Busireddygari, Beiyu Lin, Shuang Li
2025 J jnl
CoRR
Andrew Cart, Shaohu Zhang, Melanie Escue, Xugui Zhou, Haitao Zhao, Prashanth Busireddygari, Beiyu Lin, Shuang Li
2025 conf
CAI
Joong-Lyul Lee, Haitao Zhao, Mike Tree, Angelo Cristobal, Hozaifa Owaisi
2025 J jnl
CoRR
Najmul Hasan, Prashanth Busireddygari, Haitao Zhao, Yihao Ren, Jinsheng Xu, Shaohu Zhang
2025 J jnl
J. Supercomput.
Jinhang Zhang, Min Gao, Liqiang Song, Haitao Zhao, Wenzhao Li, Zetian Zhang, Chenglin Rong
2024 J jnl
Sensors
Lu Jiang, Haitao Zhao, Biao Cao, Wei He, Zengxin Yun, Chen Cheng
2024 J jnl
Microelectron. J.
Tian Han, Fazhan Zhao, Ximing Fu, Xiaowu Cai, Weiwei Yan, Haitao Zhao, Wenxin Zhao, Bo Li
2024 conf
KSE
Haitao Zhao, Jasy Suet Yan Liew
2024 B conf
ICTAI
Haitao Zhao, Jasy Liew Suet Yan
2023 J jnl
IEICE Electron. Express
Mali Gao, Xiaowu Cai, Weiwei Yan, Haitao Zhao, Ruirui Xia, Yuexin Gao
2023 J jnl
J. Chem. Inf. Model.
Zhenxing Wu, Jihong Chen, Yitong Li, Yafeng Deng, Haitao Zhao, Chang-Yu Hsieh, Tingjun Hou
2023 conf
MSN
Longze Li, Haitao Zhao, Wenxue Sun, Zhuoran Xu, Yihang Jia, Shuyi Ma
2023 conf
AIAI (2)
Joong-Lyul Lee, Safaa Alwajidi, Mike Tree, Angelo Cristobal, Haitao Zhao
2023 J jnl
J. Complex Networks
Henghe Zheng, Haitao Zhao, Gholamreza Ahmadi
2022 conf
ICSEB
Weichao Yang, Hanning Li, Yang Li, Yu Zou, Haitao Zhao
2022 J jnl
Remote. Sens.
Shu Ji, Chen Gu, Xiaobo Xi, Zhenghua Zhang, Qingqing Hong, Zhongyang Huo, Haitao Zhao, Ruihong Zhang, Bin Li, Changwei Tan
2022 J jnl
Genom. Proteom. Bioinform.
Feng Xu, Yifan Wang, Yunchao Ling, Chenfen Zhou, Haizhou Wang, Andrew E. Teschendorff, Yi Zhao, Haitao Zhao, Yungang He, Guoqing Zhang, Zhen Yang
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Haitao Zhao, Bing Zhang, Wenmin Hu, Jiangui Liu, Dong Li, Yalin Liu, Hong Yang, Jie Pan, Liuqing Xu
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Ruixiang Li, Haitao Zhao, Xiaoye Zhang, Xiaosan Ge, Zhanliang Yuan, Qin Zou
2021 J jnl
Remote. Sens.
Cheng Liu, Yueling Cao, Gong Zhang, Weiguang Gao, Ying Chen, Jun Lu, Chonghua Liu, Haitao Zhao, Fang Li
2021 J jnl
BMC Medical Imaging
Jingnan Wang, Yunwen Shao, Bowei Liu, Xuezhu Wang, Barbara Katharina Geist, Xiang Li, Fang Li, Haitao Zhao, Marcus Hacker, Haiyan Ding, Hui Zhang, Li Huo
2021 J jnl
Inf. Fusion
Xianyi Zhang, Haitao Zhao
2021 J jnl
BMC Medical Imaging
Chen Cheng, Hongyan Zhao, Wei Tian, Chunhong Hu, Haitao Zhao
2021 J jnl
Briefings Bioinform.
Junyu Long, Shan Huang, Yi Bai, Jinzhu Mao, Anqiang Wang, Yu Lin, Xu Yang, Dongxu Wang, Jianzhen Lin, Jin Bian, Xiaobo Yang, Xinting Sang, Xi Wang, Haitao Zhao
2020 conf
I2MTC
Zrinka Kovacic, Marijan Kuri, Ana Pilipovic, Haitao Zhao, Hrvoje Dzapo
2019 conf
Agro-Geoinformatics
Dongyan Zhang, Daoyong Wang, Shizhou Du, Linsheng Huang, Haitao Zhao, Dong Liang, Chunyan Gu, Xue Yang
2019 J jnl
Remote. Sens.
Haitao Zhao, Xiaoyu Song, Guijun Yang, Zhenhai Li, Dongyan Zhang, Haikuan Feng
2019 J jnl
Remote. Sens.
Dongyan Zhang, Daoyong Wang, Chunyan Gu, Ning Jin, Haitao Zhao, Gao Chen, Hongyi Liang, Dong Liang
2018 J jnl
Neural Comput. Appl.
Xiukai Ruan, Yanhua Tan, Guihua Cui, Wenbin Liu, Xiaojing Shi, Qibo Cai, Haitao Zhao
2018 J jnl
Comput. Chem. Eng.
Haitao Zhao
2018 J jnl
ACM Trans. Archit. Code Optim.
Ying Cai, Yulong Ao, Chao Yang, Wenjing Ma, Haitao Zhao
2018 conf
ICA3PP (Workshops)
Leisheng Li, Qiao Sun, Xin Liu, Changmao Wu, Haitao Zhao, Changyou Zhang
2017 J jnl
CoRR
Haitao Zhao
2017 J jnl
Nucleic Acids Res.
Zhen Yang, Liangcai Wu, Anqiang Wang, Wei Tang, Yi Zhao, Haitao Zhao, Andrew E. Teschendorff
2016 B conf
ICPADS
Changmao Wu, Fangfang Liu, Chao Yang, Ligang Li, Haitao Zhao, Yutong Lu, Leisheng Li, Yunfei Du
2016 conf
TALE
Jianhua Shen, Haitao Zhao, Fei Li, Meilan Ye
2015 J jnl
Nucleic Acids Res.
Xiaobo Yang, Ming Li, Qi Liu, Yabing Zhang, Junyan Qian, Xueshuai Wan, Anqiang Wang, Haohai Zhang, Chengpei Zhu, Xin Lu, Yilei Mao, Xinting Sang, Haitao Zhao, Yi Zhao, Xiaoyan Zhang
2015 B conf
ICPP
Peng Zhang, Yulong Ao, Chao Yang, Yiqung Liu, Fangfang Liu, Changmao Wu, Haitao Zhao
2014 J jnl
Comput. Biol. Medicine
Zhen Yang, Xueshuai Wan, Zhuoya Gu, Haohai Zhang, Xiaobo Yang, Lian He, Ruoyu Miao, Yang Zhong, Haitao Zhao
2014 J jnl
Pattern Recognit.
Haitao Zhao, Wai Keung Wong
2013 J jnl
Inf. Fusion
Wai Keung Wong, Haitao Zhao
2012 conf
WCSP
Zaijian Wang, Yuning Dong, Haitao Zhao, Shuguang Fang
2012 J jnl
Nucleic Acids Res.
Dechao Bu, Kuntao Yu, Silong Sun, Chaoyong Xie, Geir Skogerbø, Ruoyu Miao, Hui Xiao, Qi Liao, Haitao Luo, Guoguang Zhao, Haitao Zhao, Zhiyong Liu, Changning Liu, Runsheng Chen, Yi Zhao
2012 J jnl
Pattern Recognit.
Wai Keung Wong, Haitao Zhao
2011 conf
Abdominal Imaging
Hongtao Jiang, Wei Qi, Qimei Liao, Haitao Zhao, Wei Lei, Li Guo, Hongbing Lu
2011 J jnl
Nucleic Acids Res.
Qi Liao, Hui Xiao, Dechao Bu, Chaoyong Xie, Ruoyu Miao, Haitao Luo, Guoguang Zhao, Kuntao Yu, Haitao Zhao, Geir Skogerbø, Runsheng Chen, Zhongdao Wu, Changning Liu, Yi Zhao
2010 J jnl
Bioinform.
Xinyu Zhang, Lin Shi, Yan Liu, Feng Tian, Haitao Zhao, Xiaoping Miao, Ming-lie Huang, Xiao-yan Zhu
2009 B conf
IJCNN
Songyun Xie, Rong Guo, Ningfei Li, Ge Wang, Haitao Zhao
2009 C conf
BSN
Haitao Zhao, Xiaoying Lv, Guiyang Li, Zhigong Wang
2008 J jnl
Nucleic Acids Res.
Shunmin He, Changning Liu, Geir Skogerbø, Haitao Zhao, Jie Wang, Tao Liu, Baoyan Bai, Yi Zhao, Runsheng Chen
2007 J jnl
Bioinform.
Chunlei Wu, Haitao Zhao, Keith A. Baggerly, Roberto Carta, Li Zhang
2007 J jnl
BMC Bioinform.
Yifei Yin, Yi Zhao, Jie Wang, Changning Liu, Shuguang Chen, Runsheng Chen, Haitao Zhao
2006 J jnl
Neurocomputing
Haitao Zhao
2006 J jnl
Nucleic Acids Res.
Xiaosong Wang, Haitao Zhao, Qingwen Xu, Weibo Jin, Changning Liu, Huagang Zhang, Zhibin Huang, Xinyu Zhang, Yu Zhang, Dianqi Xin, Andrew J. G. Simpson, Lloyd J. Old, Yanqun Na, Yi Zhao, Weifeng Chen
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"