Kai Tang

107 papers A* 6A 1B 1C 4Misc 2Journal 65Unranked 28
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Zhen Zhu, Kai Tang, Songhe Feng, Yixuan Tang, Haobo Wang, Gengyu Lyu, Cheng Peng, Yining Sun
2026 J jnl
Adv. Eng. Informatics
Kai Tang, Yuan Li, Bin Zi
2026 A* conf
AAAI
Kai Tang, Yixuan Tang, Tianyi Chen, Haokai Xu, Qiqi Luo, Jin Guang Zheng, Zhixin Zhang, Gang Chen, Haobo Wang
2026 J jnl
CoRR
Dongyu Chen, Jian Ma, Xianpeng Zhang, Lei Zhang, Haonan Lu, Chen Chen, Chuangchuang Wang, Kai Tang
2026 J jnl
CoRR
Yuming Yan, Shuo Yang, Kai Tang, Sihong Chen, Yang Zhang, Ke Xu, Dan Hu, Qun Yu, Pengfei Hu, Edith C. H. Ngai
2026 J jnl
CoRR
Weishi Mi, Yong Bao, Xiaowei Chi, Xiaozhu Ju, Zhiyuan Qin, Kuangzhi Ge, Kai Tang, Peidong Jia, Shanghang Zhang, Jian Tang
2026 J jnl
Artif. Intell. Rev.
Xiyuan Zhang, Wenjie Yuan, Jifan Yang, Kai Tang, Dongsheng Guo
2026 J jnl
IEEE Robotics Autom. Lett.
Fuyuki Tokuda, Akira Seino, Akinari Kobayashi, Kai Tang, Kazuhiro Kosuge
2026 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Kai Tang, Jinhua Cui, Canghao Wen, Shiqiang Nie, Debin Liu, Yaliang Zhao, Laurence T. Yang
2025 conf
ISSCC
Yan Yu, Deng Luo, Jianjun Chen, Yang Guo, Bin Liang, Yaqing Chi, Hanhan Sun, Jing Xiao, Hao Gao, Ming Tao, Kai Tang
2025 J jnl
Microelectron. J.
Dun Yan, Xin Zhang, Yu Xiao, Xiaoyou Yu, Shaoliang Peng, Songting Li, Kai Tang, Jie Liu
2025 J jnl
IEEE Trans. Instrum. Meas.
Kai Tang, Yuan Li, Bin Zi, Kai Feng
2025 J jnl
Neural Comput. Appl.
Yujia Zhang, Xin Zhang, Gang Zheng, Pinghui Mo, Zhuoying Zhao, Chenyang Li, Kai Tang, Jie Liu
2025 J jnl
Comput. Aided Des.
Don Pubudu Vishwana Joseph Jayakody, Tak Yu Lau, Hyunyoung Kim, Kai Tang, Lauren E. J. Thomas-Seale
2025 conf
KDD (2)
Minbo Ma, Kai Tang, Huan Li, Fei Teng, Dalin Zhang, Tianrui Li
2025 J jnl
CoRR
Minbo Ma, Kai Tang, Huan Li, Fei Teng, Dalin Zhang, Tianrui Li
2025 J jnl
CoRR
Kai Tang, Ji Zhang, Hua Meng, Minbo Ma, Qi Xiong, Fengmao Lv, Jie Xu, Tianrui Li
2025 J jnl
Comput. Aided Civ. Infrastructure Eng.
Jiandong Qiu, Sicheng Fu, Jushang Ou, Kai Tang, Xinming Qu, Shixiao Liang, Xin Wang, Bin Ran
2025 J jnl
IEEE Robotics Autom. Lett.
Kai Tang, Xuzhao Huang, Akira Seino, Fuyuki Tokuda, Akinari Kobayashi, Norman C. Tien, Kazuhiro Kosuge
2025 J jnl
CoRR
Xiaolei Lang, Jiajun Lv, Kai Tang, Laijian Li, Jianxin Huang, Lina Liu, Yong Liu, Xingxing Zuo
2025 J jnl
CoRR
Chenxi Li, Yichen Guo, Benfang Qian, Jinhao You, Kai Tang, Yaosong Du, Zonghao Zhang, Xiande Huang
2025 J jnl
CoRR
Kai Tang, Jinhao You, Xiuqi Ge, Hanze Li, Yichen Guo, Xiande Huang
2025 J jnl
IEEE Trans. Knowl. Data Eng.
Qi Xiong, Kai Tang, Minbo Ma, Ji Zhang, Jie Xu, Tianrui Li
2025 J jnl
CoRR
Wenhang Shi, Yiren Chen, Shuqing Bian, Xinyi Zhang, Kai Tang, Pengfei Hu, Zhe Zhao, Wei Lu, Xiaoyong Du
2025 J jnl
Quantum Mach. Intell.
Kai Tang, Kai Xu
2025 J jnl
CoRR
Kai Tang, Dipankar Bhattacharya, Hang Xu, Fuyuki Tokuda, Norman C. Tien, Kazuhiro Kosuge
2025 J jnl
CoRR
Siyu Xiao, Guohui Ren, Tianhao Mao, Yuqiao Chen, YiAn Liu, Junjie Wang, Kai Tang, Xindi Zhao, Zhijian Yu, Shuang Liu, Tupei Chen, Yang Liu
2025 conf
CNML
Kai Tang, Ning Ma, Wenyan Jin, Bo Zhang, Ganbei Wang
2025 J jnl
CoRR
Yichen Guo, Hanze Li, Zonghao Zhang, Jinhao You, Kai Tang, Xiande Huang
2025 J jnl
CoRR
Saisai Yang, Qingyi Huang, Jing Yuan, Liangyu Zha, Kai Tang, Yuhang Yang, Ning Wang, Yucheng Wei, Liyao Li, Wentao Ye, Hao Chen, Tao Zhang, Junlin Zhou, Haobo Wang, Gang Chen, Junbo Zhao
2025 A* conf
EMNLP
Kai Tang, Rui Wang, Renyu Zhu, Minmin Lin, Xiao Ding, Tangjie Lv, Changjie Fan, Runze Wu, Haobo Wang
2025 J jnl
CoRR
Fuyuki Tokuda, Akira Seino, Akinari Kobayashi, Kai Tang, Kazuhiro Kosuge
2025 J jnl
Inf. Fusion
Xin Shi, Zhelong Wang, Sen Qiu, Fang Lin, Ruichen Liu, Kai Tang, Pengrong Hou, Qinghao Chu, Yongtao Chen
2025 J jnl
CoRR
Xiaowei Chi, Peidong Jia, Chun-Kai Fan, Xiaozhu Ju, Weishi Mi, Kevin Zhang, Zhiyuan Qin, Wanxin Tian, Kuangzhi Ge, Hao Li, Zezhong Qian, Anthony Chen, Qiang Zhou, Yueru Jia, Jiaming Liu, Yong Dai, Qingpo Wuwu, Chengyu Bai, Yu-Kai Wang, Ying Li, Lizhang Chen, Yong Bao, Zhiyuan Jiang, Jiacheng Zhu, Kai Tang, Ruichuan An, Yulin Luo, Qiuxuan Feng, Siyuan Zhou, Chi-Min Chan, Chengkai Hou, Wei Xue, Sirui Han, Yike Guo, Shanghang Zhang, Jian Tang
2024 J jnl
Comput. Medical Imaging Graph.
Zixiao Lu, Kai Tang, Yi Wu, Xiaoxuan Zhang, Ziqi An, Xiongfeng Zhu, Qianjin Feng, Yinghua Zhao
2024 J jnl
CoRR
Kai Tang, Jin Chen
2024 conf
EITCE
Xiao Sun, Kai Tang, Xuqiang Lang, Zhenzhen Ren, Jianwei Shi, Kang Wang, Jing He
2024 conf
ICME Workshops
Xuandong Huang, Shangfei Wang, Jinghao Yan, Kai Tang, Pengfei Hu
2024 J jnl
IEEE Robotics Autom. Lett.
Wenjun Tang, Kai Tang, Bin Zi, Sen Qian, Dan Zhang
2024 conf
ACL (1)
Kai Tang, Junbo Zhao, Xiao Ding, Runze Wu, Lei Feng, Gang Chen, Haobo Wang
2024 A conf
IROS
Kai Tang, Xiaolei Lang, Yukai Ma, Yuehao Huang, Laijian Li, Yong Liu, Jiajun Lv
2024 J jnl
CoRR
Kai Tang, Xiaolei Lang, Yukai Ma, Yuehao Huang, Laijian Li, Yong Liu, Jiajun Lv
2024 A* conf
CVPR
Xiaojun Hou, Jiazheng Xing, Yijie Qian, Yaowei Guo, Shuo Xin, Junhao Chen, Kai Tang, Mengmeng Wang, Zhengkai Jiang, Liang Liu, Yong Liu
2024 J jnl
CoRR
Xiaojun Hou, Jiazheng Xing, Yijie Qian, Yaowei Guo, Shuo Xin, Junhao Chen, Kai Tang, Mengmeng Wang, Zhengkai Jiang, Liang Liu, Yong Liu
2024 J jnl
Comput. Commun.
Yanyang Zeng, Dawei Zhang, Kai Tang, Jiangfeng Sun
2024 J jnl
CoRR
Qi Xiong, Kai Tang, Minbo Ma, Jie Xu, Tianrui Li
2024 A* conf
CVPR
Ruixuan Xiao, Lei Feng, Kai Tang, Junbo Zhao, Yixuan Li, Gang Chen, Haobo Wang
2023 A* conf
DAC
Jinhua Cui, Kai Tang, Laurence T. Yang
2023 J jnl
J. Electr. Comput. Eng.
Yizhe Zhang, Yunyi Zhang, Guohui Zhou, Wei Zhang, Kangle Li, Quanqi Mu, Wei He, Kai Tang
2023 conf
CECCT
Yihe Liu, Junjie Wang, Shuang Liu, Mingyuan Sun, Kai Tang, Guohui Ren, Xindi Zhao, Mingliang Sun, Yang Liu
2023 J jnl
Comput.
Ren Tang, Chaoyang Zhang, Kai Tang, Xiaoyang He, Qipeng He
2023 conf
ICAC
Wenhui Zhu, Qingquan Lin, Xi Fu, Qinggang Wu, Kai Tang, Weining Lu
2023 J jnl
IEEE Robotics Autom. Lett.
Xiaolei Lang, Chao Chen, Kai Tang, Yukai Ma, Jiajun Lv, Yong Liu, Xingxing Zuo
2023 J jnl
CoRR
Xiaolei Lang, Chao Chen, Kai Tang, Yukai Ma, Jiajun Lv, Yong Liu, Xingxing Zuo
2023 conf
CECCT
Hongzhe Wang, Kunsong Liu, Yi'an Liu, Junjie Wang, Mingyuan Sun, Kai Tang, Guohui Ren, Xindi Zhao, Yang Liu
2023 J jnl
IEEE Robotics Autom. Lett.
Laijian Li, Yukai Ma, Kai Tang, Xiangrui Zhao, Chao Chen, Jianxin Huang, Jianbiao Mei, Yong Liu
2023 conf
ICICDT
Kai Tang
2023 J jnl
Wirel. Pers. Commun.
Fulai Liu, Kai Tang, Hao Qin
2023 J jnl
IEEE Trans. Hum. Mach. Syst.
Xin Shi, Zhelong Wang, Hongyu Zhao, Sen Qiu, Ruichen Liu, Fang Lin, Kai Tang
2022 J jnl
IEEE J. Biomed. Health Informatics
Yunxiang Li, Guodong Zeng, Yifan Zhang, Jun Wang, Qun Jin, Lingling Sun, Qianni Zhang, Qisi Lian, Guiping Qian, Neng Xia, Ruizi Peng, Kai Tang, Shuai Wang, Yaqi Wang
2022 J jnl
Medical Image Anal.
Xiaoxuan Zhang, Xiongfeng Zhu, Kai Tang, Yinghua Zhao, Zixiao Lu, Qianjin Feng
2022 J jnl
IEEE Access
Mingze Gao, Min Huang, Kai Tang, Xuqiang Lang, Jiaming Gao
2022 J jnl
Neural Comput. Appl.
Rui Zhou, Ziyuan Gong, Kai Tang, Bao Zhou, Yu Cheng
2022 J jnl
CoRR
Kai Tang, Weijie Wang, Xiao Pan, Boli Chen, Simos A. Evangelou
2022 Misc conf
ICASSP
Zhiqiang Lv, Shanshan Zhang, Kai Tang, Pengfei Hu
2022 J jnl
IEEE Commun. Lett.
Fulai Liu, Kai Tang, Zhibo Su, Ruiyan Du, Aiyi Zhang
2022 J jnl
Circuits Syst. Signal Process.
Fulai Liu, Kai Tang, Xiaodan Chen, Ruiyan Du, Dongbao Qin
2022 J jnl
Comput. Medical Imaging Graph.
Xiongfeng Zhu, Shumao Pang, Xiaoxuan Zhang, Junzhang Huang, Lei Zhao, Kai Tang, Qianjin Feng
2022 conf
ICICT
Yefan Zhu, Yanhong Liang, Kai Tang, Kazushige Ouchi
2021 conf
MLMI
Qinglian Zhang, Kai Tang, Xiaolei Liu, Qianqian Wang, Kazushige Ouchi
2021 Misc conf
ICMLC
Tao Zhang, Kai Tang
2021 J jnl
CoRR
Yunxiang Li, Guodong Zeng, Yifan Zhang, Jun Wang, Qianni Zhang, Qun Jin, Lingling Sun, Qisi Lian, Neng Xia, Ruizi Peng, Kai Tang, Yaqi Wang, Shuai Wang
2021 conf
MLMI
Xueshu Wang, Kai Tang, Xiaolei Liu, Kazushige Ouchi
2021 C conf
ICMLA
Xinhui Zhao, Kai Tang, Kazushige Ouchi
2020 conf
ACAI
Gang Wang, Kai Tang, Kazushige Ouchi
2020 J jnl
Sensors
Wendong Meng, Yurong Wang, Kai Tang, Zhijie Zhang, Shuanggen Jin, Ivan Procházka, Zhongping Zhang, Guang Wu
2019 J jnl
IEEE Access
Sen Qiu, Long Liu, Zhelong Wang, Shengming Li, Hongyu Zhao, Jiaxin Wang, Jinxiao Li, Kai Tang
2019 conf
NAS
Kai Tang, Wei Tong, Jun Ma, Bo Liu
2019 conf
ADHOCNETS
Janyong Yan, Donghai Lin, Kai Tang, Guangsong Yang, Qiubo Ye
2019 conf
FSDM
Yanping Xiao, Puheng Zhang, Kai Tang
2019 J jnl
J. Comput. Lang.
Weixin Zhao, Hongyu Jiang, Kai Tang, Wenqi Pei, Yadong Wu, Abdul Qayoom
2019 J jnl
Aust. J. Intell. Inf. Process. Syst.
Shaojie Qu, Kan Li, Bo Wu, Kai Tang, Weimin Liu
2018 J jnl
J. Vis.
Hongyu Jiang, Kai Tang, Weixin Zhao, Wenqi Pei, Yadong Wu, Jie Liang
2018 J jnl
Entropy
Zhiqing Hu, Zhuo Li, Kai Tang, Zi Wen, Yongfu Zhu
2018 J jnl
Adv. Comput. Math.
Wenqing Wang, Xuehai Huang, Kai Tang, Ruiyue Zhou
2017 J jnl
Inf. Fusion
Zhelong Wang, Donghui Wu, Raffaele Gravina, Giancarlo Fortino, Yongmei Jiang, Kai Tang
2017 C conf
CSCWD
Jie Li, Zhelong Wang, Yongmei Jiang, Sen Qiu, Jiaxing Wang, Kai Tang
2016 J jnl
Microelectron. Reliab.
Huixiang Huang, Yanyan Huang, Jiachun Zheng, Sufen Wei, Kai Tang, Dawei Bi, Zhengxuan Zhang
2016 conf
RCAR
Feng Ni, Andreas Henning, Kai Tang, Lilong Cai
2015 conf
ICC Workshops
Ahmed K. Sadek, Tamer Kadous, Kai Tang, Heechoon Lee, Mingxi Fan
2014 B conf
Intelligent Vehicles Symposium
Huan Huang, Shiying Li, Kai Tang, Renfa Li
2014 C conf
ISCAS
Kai Tang, Chao Zhou, Xinggong Zhang, Zongming Guo
2013 conf
VTC Fall
Joseph B. Soriaga, Jean Au, Kai Tang, Jacob Warner, Bo Piekarski, Christopher Lott, Rashid Attar
2012 conf
BIBM
Ruimin Sun, Xiang Gao, Nanyu Han, Qiong Wu, Yuguang Mu, Kai Tang, Xin Chen
2011 conf
FSKD
Zonghu Wang, Zhijing Liu, Donghui Chen, Kai Tang
2011 conf
ICEBE
Kai Tang, Jian Ming Zhang, Chen Hua Feng
2011 conf
ICAIC (1)
Demin Wu, Wenyong Dong, Chao Zhou, Kai Tang, Aidi Lin
2010 conf
ICEBE
Kai Tang, Jian Ming Zhang, Zhong Bo Jiang
2010 conf
WCSP
Xin Xu, Kai Tang, Yan Shi, Jianghua Li, Sixiang Yang
2010 conf
ICEBE
Kai Tang, Zhong Bo Jiang, Wei Sun, Xin Zhang, Weishan Dong
2009 conf
SERVICES I
Zhong Bo Jiang, Wei Sun, Kai Tang, Jane L. Snowdon, Xin Zhang
2007 C conf
CIS
Kai Tang, Chao Yang, Jun Yang
2003 J jnl
IEEE Trans. Commun.
Kai Tang, Laurence B. Milstein, Paul H. Siegel
2001 J jnl
IEEE J. Sel. Areas Commun.
Kai Tang, Paul H. Siegel, Laurence B. Milstein
2001 J jnl
IEEE J. Sel. Areas Commun.
Kai Tang, Laurence B. Milstein, Paul H. Siegel
1995 J jnl
Comput. Aided Des.
Kai Tang, Charles C. Cheng, Yakove Dayan
1989 J jnl
Comput. Vis. Graph. Image Process.
Kai Tang
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"