Han Zou

109 papers A* 7A 1B 8C 6Misc 2Journal 66Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
Digit. Signal Process.
Qiutiao Xue, Guisheng Liao, Han Zou, Sunyong Wu
2026 J jnl
Patterns
Tuo An, Yunjiao Zhou, Han Zou, Jianfei Yang
2026 J jnl
Digit. Signal Process.
Longfei Jia, Sunyong Wu, Qiutiao Xue, Han Zou, Weiwei Wang, Jingwei Xu, Jinxin Liu
2025 J jnl
Signal Process.
Han Zou, Sunyong Wu, Qiutiao Xue, Xiyan Sun, Ming Li
2025 conf
SoCC
Kaiyu Huang, Hao Wu, Zhubo Shi, Han Zou, Minchen Yu, Qingjiang Shi
2025 J jnl
CoRR
Cong Xie, Che Wang, Yan Zhang, Zheng Pan, Han Zou, Zhenpeng Zhan
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Ling Huang, Dong Huang, Han Zou, Yuefang Gao, Chang-Dong Wang, Philip S. Yu
2025 A conf
WACV
Han Zou, Masanori Suganuma, Takayuki Okatani
2025 J jnl
CoRR
Yan Zhang, Han Zou, Lincong Feng, Cong Xie, Ruiqi Yu, Zhenpeng Zhan
2025 A* conf
CVPR
Cong Xie, Han Zou, Ruiqi Yu, Yan Zhang, Zhenpeng Zhan
2025 J jnl
CoRR
Han Zou, Yan Zhang, Ruiqi Yu, Cong Xie, Jie Huang, Zhenpeng Zhan
2025 J jnl
CoRR
Kaiyu Huang, Hao Wu, Zhubo Shi, Han Zou, Minchen Yu, Qingjiang Shi
2024 J jnl
Algorithms
Lijun Zhang, Han Zou, Yungang Zhu
2024 J jnl
Remote. Sens.
Linlin Wang, Bingcheng Wan, Yuanjian Yang, Sihui Fan, Yi Jing, Xueling Cheng, Zhiqiu Gao, Shiguang Miao, Han Zou
2024 J jnl
CoRR
Tuo An, Yunjiao Zhou, Han Zou, Jianfei Yang
2024 J jnl
Neural Networks
Ling Huang, Han Zou, Xiao-Dong Huang, Yuefang Gao, Yingjie Kuang, Chang-Dong Wang
2024 J jnl
Unmanned Syst.
Yunjiao Zhou, Jianfei Yang, Haozhi Cao, Zhaoyang Zeng, Han Zou, Lihua Xie
2024 J jnl
Digit. Signal Process.
Han Zou, Sunyong Wu, Qiutiao Xue, Xiyan Sun, Ming Li
2024 J jnl
CoRR
Ruiqing Yan, Linghan Zheng, Xingbo Du, Han Zou, Yufeng Guo, Jianfei Yang
2024 J jnl
IEEE Trans. Mob. Comput.
Jianfei Yang, Han Zou, Lihua Xie
2024 J jnl
CoRR
Cong Xie, Han Zou, Ruiqi Yu, Yan Zhang, Zhenpeng Zhan
2024 J jnl
IET Comput. Vis.
Kehao Wang, Han Zou
2024 J jnl
Adv. Robotics
Han Zou, Sunyong Wu, Qiutiao Xue, Xiyan Sun, Bing Wang
2023 J jnl
IEEE Trans. Cybern.
Jianfei Yang, Jiangang Yang, Shizheng Wang, Shuxin Cao, Han Zou, Lihua Xie
2023 J jnl
IEEE Internet Things J.
Jianfei Yang, Xinyan Chen, Han Zou, Dazhuo Wang, Lihua Xie
2023 J jnl
IEEE Internet Things J.
Lang Deng, Jianfei Yang, Shenghai Yuan, Han Zou, Chris Xiaoxuan Lu, Lihua Xie
2023 conf
CVPR Workshops
Han Zou, Liang Xu, Takayuki Okatani
2023 conf
CVPR Workshops
Liang Xu, Han Zou, Takayuki Okatani
2023 A* conf
NeurIPS
Jianfei Yang, He Huang, Yunjiao Zhou, Xinyan Chen, Yuecong Xu, Shenghai Yuan, Han Zou, Chris Xiaoxuan Lu, Lihua Xie
2023 J jnl
CoRR
Jianfei Yang, He Huang, Yunjiao Zhou, Xinyan Chen, Yuecong Xu, Shenghai Yuan, Han Zou, Chris Xiaoxuan Lu, Lihua Xie
2023 J jnl
IEEE Internet Things J.
Yunjiao Zhou, He Huang, Shenghai Yuan, Han Zou, Lihua Xie, Jianfei Yang
2023 J jnl
CoRR
Han Zou, Masanori Suganuma, Takayuki Okatani
2023 J jnl
CoRR
Han Zou, Masanori Suganuma, Takayuki Okatani
2023 J jnl
Signal Process.
Han Zou, Guohua Chen
2023 J jnl
Patterns
Jianfei Yang, Xinyan Chen, Han Zou, Chris Xiaoxuan Lu, Dazhuo Wang, Sumei Sun, Lihua Xie
2023 conf
ICNC-FSKD
Ping Tan, Han Xiao, Han Zou, Kun Liu, Yi Shen, Chao Chen
2023 J jnl
CoRR
Yunjiao Zhou, Jianfei Yang, Han Zou, Lihua Xie
2023 J jnl
IEEE Access
Kehao Wang, Yuhui Wang, Ruiqi Ren, Han Zou, Zhichao Shao
2022 J jnl
CoRR
Jianfei Yang, Xinyan Chen, Han Zou, Dazhuo Wang, Lihua Xie
2022 J jnl
CoRR
Jianfei Yang, Xinyan Chen, Dazhuo Wang, Han Zou, Chris Xiaoxuan Lu, Sumei Sun, Lihua Xie
2022 J jnl
IEEE Internet Things J.
Jianfei Yang, Xinyan Chen, Han Zou, Dazhuo Wang, Qianwen Xu, Lihua Xie
2022 J jnl
CoRR
Jianfei Yang, Xinyan Chen, Han Zou, Dazhuo Wang, Qianwen Xu, Lihua Xie
2022 J jnl
CoRR
Lang Deng, Jianfei Yang, Shenghai Yuan, Han Zou, Chris Xiaoxuan Lu, Lihua Xie
2022 conf
WF-IoT
Jianfei Yang, Yunjiao Zhou, He Huang, Han Zou, Lihua Xie
2022 J jnl
CoRR
Jianfei Yang, Yunjiao Zhou, He Huang, Han Zou, Lihua Xie
2022 J jnl
CoRR
Jianfei Yang, Han Zou, Lihua Xie
2022 J jnl
CoRR
Changwei Xu, Jianfei Yang, Haoran Tang, Han Zou, Cheng Lu, Tianshuo Zhang
2021 ch.
Generalization with Deep Learning
Jianfei Yang, Han Zou, Lihua Xie, Costas J. Spanos
2021 J jnl
IEEE Trans. Artif. Intell.
Jianfei Yang, Zhaoyang Zeng, Kai Wang, Han Zou, Lihua Xie
2021 J jnl
Inf. Sci.
Jianfei Yang, Hanjie Qian, Han Zou, Lihua Xie
2021 J jnl
CoRR
Liang Xu, Taro Hatsutani, Xing Liu, Engkarat Techapanurak, Han Zou, Takayuki Okatani
2021 J jnl
Neurocomputing
Jianfei Yang, Han Zou, Yuxun Zhou, Lihua Xie
2021 conf
ACL/IJCNLP (Findings)
Han Zou, Jianfei Yang, Xiaojian Wu
2020 conf
HPCCT/BDAI
Yang Li, Han Zou, Hongzhi Liu
2020 J jnl
IEEE Internet Things J.
Han Zou, Chunlin Chen, Maoxun Li, Jianfei Yang, Yuxun Zhou, Lihua Xie, Costas J. Spanos
2020 J jnl
Remote. Sens.
Yuanjian Yang, Sihui Fan, Linlin Wang, Zhiqiu Gao, Yuanjie Zhang, Han Zou, Shiguang Miao, Yubin Li, Meng Huang, Hung Lam Steve Yim, Simone Lolli
2020 conf
ECCV (24)
Jianfei Yang, Han Zou, Yuxun Zhou, Zhaoyang Zeng, Lihua Xie
2020 J jnl
IEEE Internet Things J.
Jianfei Yang, Han Zou, Shuxin Cao, Zhenghua Chen, Lihua Xie
2020 J jnl
CoRR
Jianfei Yang, Han Zou, Yuxun Zhou, Lihua Xie
2020 J jnl
IEEE Syst. J.
Zhenghua Chen, Han Zou, Jianfei Yang, Hao Jiang, Lihua Xie
2019 A* conf
AAAI
Han Zou, Yuxun Zhou, Jianfei Yang, Huihan Liu, Hari Prasanna Das, Costas J. Spanos
2019 J jnl
IEEE Internet Things J.
Jianfei Yang, Han Zou, Yuxun Zhou, Lihua Xie
2019 J jnl
IEEE Internet Things J.
Han Zou, Yuxun Zhou, Reza Arghandeh, Costas J. Spanos
2019 J jnl
IEEE Trans. Ind. Electron.
Yuxun Zhou, Reza Arghandeh, Han Zou, Costas J. Spanos
2019 J jnl
IEEE Internet Things J.
Han Zou, Yuxun Zhou, Jianfei Yang, Costas J. Spanos
2019 conf
CVPR Workshops
Han Zou, Jianfei Yang, Hari Prasanna Das, Huihan Liu, Yuxun Zhou, Costas J. Spanos
2018 J jnl
Sensors
Kevin Weekly, Ming Jin, Han Zou, Christopher Hsu, Chris Soyza, Alexandre M. Bayen, Costas J. Spanos
2018 J jnl
IEEE Trans. Veh. Technol.
Jianfei Yang, Han Zou, Hao Jiang, Lihua Xie
2018 conf
ICC
Han Zou, Yuxun Zhou, Jianfei Yang, Hao Jiang, Lihua Xie, Costas J. Spanos
2018 J jnl
Proc. IEEE
Ruoxi Jia, Baihong Jin, Ming Jin, Yuxun Zhou, Ioannis C. Konstantakopoulos, Han Zou, Joyce Kim, Dan Li, Weixi Gu, Reza Arghandeh, Pierluigi Nuzzo, Stefano Schiavon, Alberto L. Sangiovanni-Vincentelli, Costas J. Spanos
2018 J jnl
IEEE Internet Things J.
Jianfei Yang, Han Zou, Hao Jiang, Lihua Xie
2018 B conf
WCNC
Jianfei Yang, Han Zou, Hao Jiang, Lihua Xie
2018 C conf
ICMLA
Han Zou, Jianfei Yang, Yuxun Zhou, Costas J. Spanos
2018 A* conf
AAAI
Yuxun Zhou, Han Zou, Reza Arghandeh, Weixi Gu, Costas J. Spanos
2018 B conf
ICCCN
Han Zou, Jianfei Yang, Yuxun Zhou, Lihua Xie, Costas J. Spanos
2018 A* conf
AAAI
Han Zou, Yuxun Zhou, Jianfei Yang, Weixi Gu, Lihua Xie, Costas J. Spanos
2018 conf
ICCA
Han Zou, Yuxun Zhou, Jianfei Yang, Hao Jiang, Lihua Xie, Costas J. Spanos
2017 B conf
WCNC
Han Zou, Yuxun Zhou, Hao Jiang, Baoqi Huang, Lihua Xie, Costas J. Spanos
2017 C conf
MobiQuitous
Weixi Gu, Zimu Zhou, Yuxun Zhou, Han Zou, Yunxin Liu, Costas J. Spanos, Lin Zhang
2017 B conf
GLOBECOM
Han Zou, Yuxun Zhou, Jianfei Yang, Weixi Gu, Lihua Xie, Costas J. Spanos
2017 conf
SECON Workshops
Han Zou, Yuxun Zhou, Jianfei Yang, Weixi Gu, Lihua Xie, Costas J. Spanos
2017 C conf
ICMLA
Han Zou, Yuxun Zhou, Jianfei Yang, Weixi Gu, Lihua Xie, Costas J. Spanos
2017 A* conf
MobiCom
Han Zou, Yuxun Zhou, Jianfei Yang, Weixi Gu, Lihua Xie, Costas J. Spanos
2017 Misc conf
SenSys
Weixi Gu, Zimu Zhou, Yuxun Zhou, Miao He, Han Zou, Lin Zhang
2017 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Weixi Gu, Yuxun Zhou, Zimu Zhou, Xi Liu, Han Zou, Pei Zhang, Costas J. Spanos, Lin Zhang
2017 J jnl
IEEE Trans. Wirel. Commun.
Han Zou, Ming Jin, Hao Jiang, Lihua Xie, Costas J. Spanos
2016 J jnl
IEEE Trans. Wirel. Commun.
Han Zou, Baoqi Huang, Xiaoxuan Lu, Hao Jiang, Lihua Xie
2016 A* conf
MobiCom
Han Zou, Yuxun Zhou, Hao Jiang, Baoqi Huang, Lihua Xie, Costas J. Spanos
2016 J jnl
Sensors
Han Zou, Hao Jiang, Yiwen Luo, Jianjie Zhu, Xiaoxuan Lu, Lihua Xie
2016 B conf
GLOBECOM
Zhirong Qiu, Han Zou, Hao Jiang, Lihua Xie, Yiguang Hong
2016 Misc conf
UbiComp
Baoqi Huang, Guodong Qi, Xiaokun Yang, Long Zhao, Han Zou
2016 J jnl
Sensors
Ruoxi Jia, Ming Jin, Han Zou, Yigitcan Yesilata, Lihua Xie, Costas J. Spanos
2016 J jnl
IEEE Trans. Cybern.
Xiaoxuan Lu, Han Zou, Hongming Zhou, Lihua Xie, Guang-Bin Huang
2016 B conf
WiMob
Xiaoxuan Lu, Hongkai Wen, Han Zou, Hao Jiang, Lihua Xie, Niki Trigoni
2016 B conf
WCNC
Han Zou, Baoqi Huang, Xiaoxuan Lu, Hao Jiang, Lihua Xie
2016 conf
INFOCOM Workshops
Han Zou, Ming Jin, Hao Jiang, Lihua Xie, Costas J. Spanos
2015 J jnl
Sensors
Han Zou, Xiaoxuan Lu, Hao Jiang, Lihua Xie
2015 conf
CASE
Han Zou, Yiwen Luo, Xiaoxuan Lu, Hao Jiang, Lihua Xie
2015 J jnl
Sensors
Zhenghua Chen, Han Zou, Hao Jiang, Qingchang Zhu, Yeng Chai Soh, Lihua Xie
2015 conf
BuildSys
Ruoxi Jia, Ming Jin, Han Zou, Yigitcan Yesilata, Lihua Xie, Costas J. Spanos
2014 conf
WF-IoT
Han Zou, Hao Jiang, Xiaoxuan Lu, Lihua Xie
2014 J jnl
CoRR
Kevin Weekly, Ming Jin, Han Zou, Christopher Hsu, Alexandre M. Bayen, Costas J. Spanos
2014 J jnl
CoRR
Ming Jin, Han Zou, Kevin Weekly, Ruoxi Jia, Alexandre M. Bayen, Costas J. Spanos
2014 C conf
IECON
Ming Jin, Han Zou, Kevin Weekly, Ruoxi Jia, Alexandre M. Bayen, Costas J. Spanos
2014 C conf
ICARCV
Xiaoxuan Lu, Chengpu Yu, Han Zou, Hao Jiang, Lihua Xie
2014 B conf
DCOSS
Kevin Weekly, Han Zou, Lihua Xie, Qing-Shan Jia, Alexandre M. Bayen
2014 conf
MLSP
Xiaoxuan Lu, Yushen Long, Han Zou, Chengpu Yu, Lihua Xie
2013 conf
CPSNA
Han Zou, Hengtao Wang, Lihua Xie, Qing-Shan Jia
2013 C conf
IPIN
Han Zou, Lihua Xie, Qing-Shan Jia, Hengtao 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"