Xiaohong Zhang

133 papers A* 2A 11B 4C 2Misc 3Journal 85Unranked 26
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Sci.
Zhibin Zhang, Xiaohong Zhang, Qiang Li, Chun Huang, Tao Yin, Meng Yan
2025 J jnl
IEEE Trans. Knowl. Data Eng.
Ziliang Wang, Xiaohong Zhang, Ze Shi Li, Meng Yan
2025 conf
BIBM
Shengneng Chen, Cheng Cheng, Wanghong Fu, Yingjun Chen, Gao Tu, Xiaohong Zhang, Weiwei Xue
2025 J jnl
IEEE Trans. Serv. Comput.
Ziliang Wang, Xiaohong Zhang, Ze Shi Li, Sheng Huang, Meng Yan
2025 J jnl
Biomed. Signal Process. Control.
Kun Wang, Yuting Lu, Jin Liu, Xiaohong Zhang
2025 J jnl
IEEE Trans. Software Eng.
Dong Li, Shanfu Shu, Meng Yan, Zhongxin Liu, Chao Liu, Xiaohong Zhang, David Lo
2025 J jnl
CoRR
Tao Yin, Xiaohong Zhang, Jiacheng Zhang, Li Huang, Zhibin Zhang, Yuansong Zeng, Jin Xie, Meng Yan
2025 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Cheng Cheng, Xiaohong Zhang, Mianyang Yu, Yuqin Xia, Weiwei Xue
2025 J jnl
IEEE Trans. Serv. Comput.
Ziliang Wang, Xiaohong Zhang, Ze Shi Li, Meng Yan
2025 J jnl
CoRR
Ziliang Wang, Xiaohong Zhang, Ze Shi Li, Meng Yan
2025 J jnl
CoRR
Guowei Yin, Sheng Huang, Luwen Huangfu, Yi Zhang, Xiaohong Zhang
2025 J jnl
Image Vis. Comput.
Guowei Yin, Sheng Huang, Luwen Huangfu, Yi Zhang, Xiaohong Zhang
2025 J jnl
IEEE Trans. Software Eng.
Hongyan Li, Weifeng Sun, Meng Yan, Ling Xu, Qiang Li, Xiaohong Zhang, Hongyu Zhang
2025 J jnl
CoRR
Tao Yin, Xiaohong Zhang, Shaochen Fu, Zhibin Zhang, Li Huang, Yiyuan Yang, Kaixiang Yang, Meng Yan
2024 A conf
MSR
Zhipeng Liu, Meng Yan, Zhipeng Gao, Dong Li, Xiaohong Zhang, Dan Yang
2024 A conf
ISSTA
Dong Li, Meng Yan, Yaosheng Zhang, Zhongxin Liu, Chao Liu, Xiaohong Zhang, Ting Chen, David Lo
2024 J jnl
IEEE/ACM Trans. Netw.
Ziliang Wang, Shiyi Zhu, Jianguo Li, Wei Jiang, K. K. Ramakrishnan, Meng Yan, Xiaohong Zhang, Alex X. Liu
2024 J jnl
J. Syst. Softw.
Ying Fu, Meng Yan, Pinjia He, Chao Liu, Xiaohong Zhang, Dan Yang
2024 A conf
SANER
Chao Liu, Xuanlin Bao, Hongyu Zhang, Neng Zhang, Haibo Hu, Xiaohong Zhang, Meng Yan
2024 J jnl
Image Vis. Comput.
Peiyun Luo, Jing Nie, Jin Xie, Jiale Cao, Xiaohong Zhang
2024 J jnl
IEEE Trans. Medical Imaging
Han Yang, Qiuli Wang, Yue Zhang, Zhulin An, Chen Liu, Xiaohong Zhang, S. Kevin Zhou
2024 conf
BIBM
Yulong Wu, Jin Xie, Jing Nie, Xiaohong Zhang, Yuansong Zeng
2024 conf
Internetware
Xiaoqi Yue, Chao Liu, Neng Zhang, Haibo Hu, Xiaohong Zhang
2023 J jnl
CoRR
Ziliang Wang, Xiaohong Zhang, Meng Yan
2023 A conf
ICWS
Tongxin Lu, Xiaohong Zhang, Ziliang Wang, Meng Yan
2023 J jnl
Empir. Softw. Eng.
Ying Fu, Meng Yan, Zhou Xu, Xin Xia, Xiaohong Zhang, Dan Yang
2023 J jnl
Image Vis. Comput.
Yi Zhang, Sheng Huang, Wanli Yang, Wenhao Tang, Xiaohong Zhang, Dan Yang
2023 J jnl
Pattern Recognit.
Kun Wang, Xiaohong Zhang, Yuting Lu, Wei Zhang, Sheng Huang, Dan Yang
2023 J jnl
CoRR
Chao Liu, Xuanlin Bao, Hongyu Zhang, Neng Zhang, Haibo Hu, Xiaohong Zhang, Meng Yan
2023 J jnl
Biomed. Signal Process. Control.
Yuting Lu, Kun Wang, Wei Zhang, Jin Xie, Sheng Huang, Dan Yang, Xiaohong Zhang
2023 J jnl
CoRR
Han Yang, Qiuli Wang, Yue Zhang, Zhulin An, Chen Liu, Xiaohong Zhang, S. Kevin Zhou
2023 J jnl
IET Softw.
Lingfeng Fu, Yan Lei, Meng Yan, Ling Xu, Zhou Xu, Xiaohong Zhang
2023 J jnl
CoRR
Ziliang Wang, Xiaohong Zhang, Sheng Huang, Wei Zhang, Dan Yang, Meng Yan
2022 A* conf
ACM Multimedia
Wei Zhang, Xiaohong Zhang, Sheng Huang, Yuting Lu, Kun Wang
2022 J jnl
Biomed. Signal Process. Control.
Kun Wang, Xiaohong Zhang, Yuting Lu, Xiangbo Zhang, Wei Zhang
2022 A conf
ICWS
Yufu Chen, Meng Yan, Dan Yang, Xiaohong Zhang, Ziliang Wang
2022 conf
SoCC
Ziliang Wang, Shiyi Zhu, Jianguo Li, Wei Jiang, K. K. Ramakrishnan, Yangfei Zheng, Meng Yan, Xiaohong Zhang, Alex X. Liu
2022 conf
ISBI
Weixin Xu, Yun Xing, Yuting Lu, Jingkai Lin, Xiaohong Zhang
2022 A conf
BMVC
Xiaoxian Zhang, Sheng Huang, Yi Zhang, Xiaohong Zhang, Mingchen Gao, Chen Liu
2022 J jnl
Pattern Recognit.
Kun Wang, Xiaohong Zhang, Xiangbo Zhang, Yuting Lu, Sheng Huang, Dan Yang
2022 J jnl
IEEE Trans. Reliab.
Zhou Xu, Kunsong Zhao, Tao Zhang, Chunlei Fu, Meng Yan, Zhiwen Xie, Xiaohong Zhang, Gemma Catolino
2022 J jnl
IEEE Trans. Parallel Distributed Syst.
Ziliang Wang, Xiaohong Zhang, Meng Yan, Ling Xu, Dan Yang
2022 conf
ESEC/SIGSOFT FSE
Ying Fu, Meng Yan, Jian Xu, Jianguo Li, Zhongxin Liu, Xiaohong Zhang, Dan Yang
2022 J jnl
Image Vis. Comput.
Lei Wang, Sheng Huang, Luwen Huangfu, Bo Liu, Xiaohong Zhang
2022 A* conf
ACM Multimedia
Wei Zhang, Xiaohong Zhang, Sheng Huang, Yuting Lu, Kun Wang
2021 Misc conf
ICASSP
Xiaojiang Long, Wei Chen, Qiuli Wang, Xiaohong Zhang, Chen Liu, Yucong Li, Jiuquan Zhang
2021 J jnl
J. Syst. Softw.
Zhou Xu, Li Li, Meng Yan, Jin Liu, Xiapu Luo, John Grundy, Yifeng Zhang, Xiaohong Zhang
2021 J jnl
Inf. Softw. Technol.
Zhuo Zhang, Yan Lei, Xiaoguang Mao, Meng Yan, Ling Xu, Xiaohong Zhang
2021 J jnl
Expert Syst. Appl.
Bin Tang, Meng Yan, Neng Zhang, Ling Xu, Xiaohong Zhang, Haijun Ren
2021 Misc conf
ICASSP
Wei Chen, Qiuli Wang, Sheng Huang, Xiaohong Zhang, Yucong Li, Chen Liu
2021 Misc conf
ICASSP
Jingqin Li, Kun Wang, Dan Yang, Xiaohong Zhang, Chen Liu
2021 J jnl
Pattern Recognit. Lett.
Wei Wang, Feiyu Chen, Yongxin Ge, Sheng Huang, Xiaohong Zhang, Dan Yang
2021 J jnl
IEEE Trans. Medical Imaging
Qiuli Wang, Xiaohong Zhang, Wei Zhang, Mingchen Gao, Sheng Huang, Jian Wang, Jiuquan Zhang, Dan Yang, Chen Liu
2021 J jnl
Inf. Softw. Technol.
Zhou Xu, Tao Zhang, Jacky Keung, Meng Yan, Xiapu Luo, Xiaohong Zhang, Ling Xu, Yutian Tang
2021 J jnl
Biomed. Signal Process. Control.
Kun Wang, Xiangbo Zhang, Xiaohong Zhang, Sheng Huang, Jingqin Li, Luwen Huangfu
2021 conf
PRICAI (1)
Xiangbo Zhang, Kun Wang, Xiaohong Zhang, Sheng Huang
2021 A conf
SANER
Bei Wang, Meng Yan, Zhongxin Liu, Ling Xu, Xin Xia, Xiaohong Zhang, Dan Yang
2021 J jnl
IEEE Trans. Medical Imaging
Qiuli Wang, Xiaohong Zhang, Wei Zhang, Mingchen Gao, Sheng Huang, Jian Wang, Jiuquan Zhang, Dan Yang, Chen Liu
2020 conf
ISBI
Kun Wang, Xiaohong Zhang, Sheng Huang, Qiuli Wang, Feiyu Chen
2020 conf
MICCAI (6)
Qiuli Wang, Xingpeng Zhang, Wei Chen, Kun Wang, Xiaohong Zhang
2020 J jnl
IEEE Access
Qiuli Wang, Dan Yang, Zhihuan Li, Xiaohong Zhang, Chen Liu
2020 B conf
ICPR
Wei Chen, Qiuli Wang, Dan Yang, Xiaohong Zhang, Chen Liu, Yucong Li
2020 J jnl
IEEE Access
Xing-peng Zhang, Xiaohong Zhang
2020 J jnl
IEEE Access
Xing-peng Zhang, Xiaohong Zhang
2020 J jnl
J. Syst. Softw.
Zhou Xu, Kunsong Zhao, Meng Yan, Peipei Yuan, Ling Xu, Yan Lei, Xiaohong Zhang
2020 A conf
ICSME
Kun Yin, Meng Yan, Ling Xu, Zhou Xu, Zhao Li, Dan Yang, Xiaohong Zhang
2020 B conf
ICIP
Weixin Xu, Kun Wang, Jingkai Lin, Yuting Lu, Sheng Huang, Xiaohong Zhang
2020 J jnl
IEEE Access
Kun Wang, Xiaohong Zhang, Sheng Huang, Feiyu Chen, Xiangbo Zhang, Luwen Huangfu
2020 B conf
ICPR
Wei Chen, Qiuli Wang, Kun Wang, Dan Yang, Xiaohong Zhang, Chen Liu, Yucong Li
2019 J jnl
Inf. Softw. Technol.
Chao Liu, Dan Yang, Xin Xia, Meng Yan, Xiaohong Zhang
2019 conf
PRCV (2)
Kun Wang, Xiaohong Zhang, Sheng Huang, Feiyu Chen
2019 conf
ICME Workshops
Sheng Huang, Yongxin Ge, Feiyu Chen, Kewen He, Xiaohong Zhang
2019 J jnl
Neural Process. Lett.
Daoxiang Zhou, Dan Yang, Xiaohong Zhang, Sheng Huang, Shu Feng
2019 conf
PRCV (2)
Qiuli Wang, Jiajia Zhang, Sheng Huang, Chen Liu, Xiaohong Zhang, Dan Yang
2019 conf
BIBM
Kun Wang, Xiaohong Zhang, Sheng Huang
2019 J jnl
Sci. China Inf. Sci.
Meng Yan, Xin Xia, Xiaohong Zhang, Ling Xu, Dan Yang, Shanping Li
2018 conf
ICSE (Companion Volume)
Chao Liu, Dan Yang, Xiaohong Zhang, Haibo Hu, Jed Barson, Baishakhi Ray
2018 J jnl
IEEE Trans. Image Process.
Dan Yang, Chenqiu Zhao, Xiaohong Zhang, Sheng Huang
2018 conf
COMPSAC (1)
Chao Liu, Dan Yang, Xin Xia, Meng Yan, Xiaohong Zhang
2018 J jnl
Multim. Tools Appl.
Daoxiang Zhou, Dan Yang, Xiaohong Zhang
2018 J jnl
Pattern Recognit. Lett.
Sheng Huang, Hongxing Wang, Yongxin Ge, Luwen Huangfu, Xiaohong Zhang, Dan Yang
2018 J jnl
IEEE Access
Chao Liu, Dan Yang, Xiaohong Zhang, Baishakhi Ray, Md. Masudur Rahman
2018 B conf
ICIP
Xing-peng Zhang, Sheng Huang, Xiaohong Zhang, Wei Wang, Qiuli Wang, Dan Yang
2017 conf
SATE
Meng Yan, Xin Xia, Xiaohong Zhang, Ling Xu, Dan Yang
2017 J jnl
Autom. Softw. Eng.
Chunlei Fu, Dan Yang, Xiaohong Zhang, Haibo Hu
2017 J jnl
Inf. Softw. Technol.
Meng Yan, Xiaohong Zhang, Chao Liu, Ling Xu, Mengning Yang, Dan Yang
2017 A conf
ICSME
Meng Yan, Xin Xia, Xiaohong Zhang, Dan Yang, Ling Xu
2017 J jnl
J. Electronic Imaging
Daoxiang Zhou, Dan Yang, Xiaohong Zhang, Sheng Huang, Shu Feng
2017 A conf
ESEM
Meng Yan, Yicheng Fang, David Lo, Xin Xia, Xiaohong Zhang
2017 conf
ICSE (Companion Volume)
Meng Yan, Xiaohong Zhang, Chao Liu, Jie Zou, Ling Xu, Xin Xia
2017 conf
COMPSAC (1)
Meng Yan, Xiaohong Zhang, Ling Xu, Haibo Hu, Song Sun, Xin Xia
2017 J jnl
J. Vis. Commun. Image Represent.
Shizheng Zhang, Dan Yang, Sheng Huang, Xiaohong Zhang, Liyun Tu, Zemin Ren
2017 J jnl
Inf. Softw. Technol.
Jie Zou, Ling Xu, Mengning Yang, Xiaohong Zhang, Dan Yang
2016 J jnl
Inf. Softw. Technol.
Meng Yan, Xiaohong Zhang, Dan Yang, Ling Xu, Jeffrey D. Kymer
2016 J jnl
IEICE Trans. Inf. Syst.
Jie Zou, Ling Xu, Mengning Yang, Xiaohong Zhang, Jun Zeng, Sachio Hirokawa
2016 J jnl
J. Syst. Softw.
Meng Yan, Ying Fu, Xiaohong Zhang, Dan Yang, Ling Xu, Jeffrey D. Kymer
2016 conf
CCPR (1)
Chenqiu Zhao, Tingting Zhang, Qianying Huang, Xiaohong Zhang, Dan Yang, Yinq Qu, Sheng Huang
2016 conf
CCBR
Qianying Huang, Yunsong Wu, Chenqiu Zhao, Xiaohong Zhang, Dan Yang
2016 conf
ICSS
Yunsong Wu, Qianying Huang, Xiaohong Zhang, Chenqiu Zhao
2016 J jnl
Neurocomputing
Sheng Huang, Dan Yang, Yongxin Ge, Xiaohong Zhang
2016 conf
ICSS
Jie Zou, Ling Xu, Mengning Yang, Meng Yan, Dan Yang, Xiaohong Zhang
2016 J jnl
CoRR
Sheng Huang, Dan Yang, Bo Liu, Xiaohong Zhang
2016 C conf
SEKE
Meng Yan, Mengning Yang, Chao Liu, Xiaohong Zhang
2016 J jnl
J. Electronic Imaging
Qianying Huang, Xiaohong Zhang, Sheng Huang, Dan Yang
2016 J jnl
计算机科学
Fei Li, Xiaohong Zhang, Chenqiu Zhao, Meng Yan
2015 J jnl
Inf. Softw. Technol.
Ying Fu, Meng Yan, Xiaohong Zhang, Ling Xu, Dan Yang, Jeffrey D. Kymer
2015 J jnl
Signal Process.
Sheng Huang, Yu Yang, Dan Yang, Luwen Huangfu, Xiaohong Zhang
2015 J jnl
Inf. Process. Lett.
Sheng Huang, Dan Yang, Yongxin Ge, Xiaohong Zhang
2015 J jnl
J. Electronic Imaging
Shizheng Zhang, Dan Yang, Sheng Huang, Xiaohong Zhang, Ying Qu, Liyun Tu, Zemin Ren
2015 J jnl
IEEE Signal Process. Lett.
Liyun Tu, Dan Yang, Jared Vicory, Xiaohong Zhang, Stephen M. Pizer, Martin Andreas Styner
2015 J jnl
Pattern Anal. Appl.
Sheng Huang, Dan Yang, Jia Zhou, Xiaohong Zhang
2015 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xiaohong Zhang, Ying Qu, Dan Yang, Hongxing Wang, Jeffrey D. Kymer
2015 J jnl
J. Ambient Intell. Humaniz. Comput.
Ling Xu, HaiLin Liu, Xinhua Yan, Shengping Liao, Xiaohong Zhang
2015 J jnl
J. Electronic Imaging
Sheng Huang, Dan Yang, Jia Zhou, Luwen Huangfu, Xiaohong Zhang
2015 conf
ISBI
Sheng Huang, Mingchen Gao, Dan Yang, Xiaolei Huang, Ahmed M. Elgammal, Xiaohong Zhang
2015 A conf
MSR
Jie Zou, Ling Xu, Weikang Guo, Meng Yan, Dan Yang, Xiaohong Zhang
2014 conf
CVPR Workshops
Sheng Huang, Ahmed M. Elgammal, Luwen Huangfu, Dan Yang, Xiaohong Zhang
2014 J jnl
J. Softw.
Heng Li, Dan Yang, Xiaohong Zhang
2014 J jnl
IET Biom.
Sheng Huang, Dan Yang, Haopeng Zhang, Luwen Huangfu, Xiaohong Zhang
2013 J jnl
J. Vis. Commun. Image Represent.
Yongxin Ge, Dan Yang, Jiwen Lu, Bo Li, Xiaohong Zhang
2013 J jnl
IET Image Process.
Haibo Hu, Xiaoze Lin, Xiaohong Zhang, Yong Feng
2013 J jnl
CoRR
Sheng Huang, Dan Yang, Fei Yang, Yongxin Ge, Xiaohong Zhang, Jiwen Lu
2013 J jnl
J. Electronic Imaging
Peng Ma, Dan Yang, Yongxin Ge, Xiaohong Zhang, Ying Qu, Sheng Huang, Jiwen Lu
2013 C conf
ICICS
Yongxin Ge, Wenbin Bu, Dan Yang, Xin Feng, Xiaohong Zhang
2012 J jnl
J. Electronic Imaging
Peng Ma, Dan Yang, Yongxin Ge, Xiaohong Zhang, Ying Qu
2012 J jnl
J. Electronic Imaging
Yongxin Ge, Dan Yang, Xiaohong Zhang, Jiwen Lu
2011 J jnl
Inf. Sci.
Xiaohong Zhang, Chengliang Wang, Dong Li, Xiaolong Zhou, Dan Yang
2010 J jnl
Pattern Recognit.
Xiaohong Zhang, Hongxing Wang, Andrew W. B. Smith, Ling Xu, Brian C. Lovell, Dan Yang
2010 J jnl
J. Electronic Imaging
Yongxin Ge, Dan Yang, Xiaohong Zhang, Jiwen Lu
2009 J jnl
Pattern Recognit. Lett.
Xiaohong Zhang, Hongxing Wang, Mingjian Hong, Ling Xu, Dan Yang, Brian C. Lovell
2007 conf
FSKD (1)
Xiaohong Zhang, Dong Li, Dan Yang
2007 J jnl
Pattern Recognit. Lett.
Xiaohong Zhang, Ming Lei, Dan Yang, Yuzhu Wang, Litao Ma
2005 conf
ISNN (1)
Xiaohong Zhang, Shangbo Zhou
tests/unit/test_smali_normalization.py
← Index tests/unit/test_smali_normalization.py python
"""Unit tests for smali semantic normalization.

Tests the three normalization levels (category, opcode, opcode_api),
opcode categorization, ACFG feature index mapping, and integration
with MinHash computation.
"""
import pytest

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


class TestCategorizeOpcode:
    """Tests for opcode -> semantic category mapping."""

    def test_arithmetic(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("add-int") == "ALU"
        assert categorize_opcode("mul-long/2addr") == "ALU"
        assert categorize_opcode("neg-int") == "ALU"

    def test_data_movement(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("move-result") == "MOV"
        assert categorize_opcode("const/4") == "CONST"
        assert categorize_opcode("const-string") == "CONST"

    def test_memory_access(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("iget-object") == "LOAD"
        assert categorize_opcode("sput-wide") == "STORE"
        assert categorize_opcode("aget-byte") == "LOAD"

    def test_invocation(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("invoke-virtual") == "CALL"
        assert categorize_opcode("invoke-static") == "CALL"
        assert categorize_opcode("invoke-direct") == "CALL"

    def test_control_flow(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("if-eqz") == "BRANCH"
        assert categorize_opcode("goto") == "JMP"
        assert categorize_opcode("goto/16") == "JMP"
        assert categorize_opcode("return-void") == "RET"

    def test_comparison(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("cmp-long") == "CMP"
        assert categorize_opcode("cmpl-float") == "CMP"
        assert categorize_opcode("cmpg-double") == "CMP"

    def test_conversion(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("int-to-long") == "CONV"
        assert categorize_opcode("float-to-int") == "CONV"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("new-instance") == "ALLOC"
        assert categorize_opcode("check-cast") == "TYPE"
        assert categorize_opcode("instance-of") == "TYPE"

    def test_exception_sync(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("throw") == "EXC"
        assert categorize_opcode("monitor-enter") == "SYNC"

    def test_unknown(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("nop") == "OTHER"


class TestNormalizeInstruction:
    """Tests for single instruction normalization at various levels."""

    def test_category_level(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("add-int v0, v1, v2", "category") == "ALU"
        assert normalize_instruction("invoke-virtual {p0}, Lcom/Foo;->bar()V", "category") == "CALL"
        assert normalize_instruction("return-void", "category") == "RET"

    def test_opcode_level_strips_width(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Width variants collapse to same base
        assert normalize_instruction("add-int v0, v1, v2", "opcode") == "add"
        assert normalize_instruction("add-long v0, v2, v4", "opcode") == "add"
        assert normalize_instruction("add-float v0, v1, v2", "opcode") == "add"
        # Addressing modes collapse too
        assert normalize_instruction("add-int/2addr v0, v1", "opcode") == "add"

    def test_opcode_api_invoke(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "invoke-virtual {p0, v0}, Lcom/example/Foo;->bar(I)V"
        )
        assert result == "CALL Lcom/example/Foo;->bar(I)V"

    def test_opcode_api_invoke_no_ref(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # If somehow no method ref is found, fallback to CALL
        assert normalize_instruction("invoke-virtual {v0}") == "CALL"

    def test_opcode_api_field_load(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "LOAD Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_field_store(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iput-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "STORE Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_androguard_field_format(self):
        """androguard uses space instead of colon in field references."""
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField Ljava/lang/String;"
        )
        assert result.startswith("LOAD")
        assert "Lcom/Foo;->mField" in result

    def test_opcode_api_new_instance(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "new-instance v0, Lcom/example/MyClass;"
        )
        assert result == "ALLOC Lcom/example/MyClass;"

    def test_opcode_api_const_string(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string v0, "hello world"'
        )
        assert result == 'CONST_STR "hello world"'

    def test_opcode_api_const_string_jumbo(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string/jumbo v0, "large string"'
        )
        assert result == 'CONST_STR "large string"'

    def test_opcode_api_fallback_to_category(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Non-special instructions fall back to category
        assert normalize_instruction("add-int v0, v1, v2") == "ALU"
        assert normalize_instruction("return-void") == "RET"
        assert normalize_instruction("nop") == "OTHER"

    def test_empty_input(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("") == ""
        assert normalize_instruction("   ") == ""


class TestNormalizeMethodBody:
    """Tests for full method body normalization."""

    def test_filters_directives_labels_comments(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
.locals 2
# comment
:label_0
add-int v0, v1, v2
.line 42
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        result = normalize_method_body(body, "category")
        assert result == ["ALU", "CALL", "RET"]

    def test_opcode_api_preserves_api_refs(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->setX(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
return-void
"""
        result = normalize_method_body(body, "opcode_api")
        assert result[0] == "CONST"
        assert result[1] == "CALL Lcom/Foo;->setX(I)V"
        assert result[2] == "LOAD Lcom/Foo;->name:Ljava/lang/String;"
        assert result[3] == "RET"

    def test_empty_body(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        assert normalize_method_body("") == []
        assert normalize_method_body("\n\n") == []


class TestNormalizationWithMinHash:
    """Integration tests: normalization + MinHash computation."""

    def test_minhash_returns_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        sig = compute_minhash(body)
        assert sig is not None
        assert len(sig) == 64
        assert all(0 <= v < 256 for v in sig)

    def test_minhash_register_invariance(self):
        """Same operations with different registers should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        body_b = """\
const/4 v3, 0x0
invoke-virtual {p1, v3}, Lcom/Foo;->bar(I)V
iget-object v4, p1, Lcom/Foo;->name:Ljava/lang/String;
add-int v5, v3, v4
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a == sig_b

    def test_minhash_width_invariance(self):
        """Width variants of same operations should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_int = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        body_long = """\
add-long v0, v2, v4
sub-long v6, v0, v2
mul-long v8, v0, v6
return-wide v8
"""
        sig_int = compute_minhash(body_int)
        sig_long = compute_minhash(body_long)
        # Both normalize to ALU, ALU, ALU, RET -> identical
        assert sig_int == sig_long

    def test_minhash_different_apis_differ(self):
        """Methods calling different APIs should produce different signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/crypto/AES;->encrypt([B)[B
invoke-virtual {v0}, Ljava/io/OutputStream;->write([B)V
return-void
"""
        body_b = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Ljava/lang/String;->length()I
invoke-virtual {v0}, Ljava/io/PrintStream;->println(I)V
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a != sig_b

    def test_minhash_too_few_instructions(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        assert compute_minhash("return-void\nnop") is None


class TestACFGBlockFeatures:
    """Tests for per-block ACFG feature extraction via smali_cfg."""

    def test_simple_linear_method(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 1
        assert len(metrics.block_features) == metrics.block_count
        # Each feature vector has 8 elements
        for feat in metrics.block_features:
            assert len(feat) == 8

    def test_branching_method_has_multiple_blocks(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
const/4 v0, 0x0
if-eqz v0, :cond_0
invoke-virtual {p0}, Lcom/Foo;->a()V
goto :goto_0
:cond_0
invoke-virtual {p0}, Lcom/Foo;->b()V
:goto_0
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 3
        assert len(metrics.block_features) == metrics.block_count

    def test_feature_vector_arithmetic_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        metrics = compute_cfg_metrics(body)
        assert len(metrics.block_features) == 1
        feat = metrics.block_features[0]
        # feat[0] = instr_count (4), feat[1] = arithmetic (3)
        assert feat[0] == 4
        assert feat[1] >= 3  # 3 ALU ops

    def test_feature_vector_call_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
invoke-virtual {p0}, Lcom/A;->a()V
invoke-static {v0}, Lcom/B;->b()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        feat = metrics.block_features[0]
        # feat[4] = call count
        assert feat[4] == 2