Weijun Li

84 papers A* 6B 3C 1Journal 68Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
Pattern Recognit.
Xin Ning, Limin Jiang, Liping Zhang, Tingran Wang, Yuhao Wang, Weijun Li, Pengjiang Qian
2026 J jnl
Inf. Fusion
Xin Ning, Limin Jiang, Xinfeng Zhang, Zihao Wang, Liping Zhang, Yinyun Yan, Tingran Wang, Baoli Lu, Yuhao Wang, Weijun Li
2026 A* conf
AAAI
Jufeng Han, Shu Wei, Min Wu, Lina Yu, Weijun Li, Linjun Sun, Hong Qin, Yan Pang
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Hang Ran, Xingyu Gao, Lusi Li, Weijun Li, Songsong Tian, Gang Wang, Hailong Shi, Xin Ning
2025 J jnl
Knowl. Based Syst.
Jingyi Liu, Min Wu, Lina Yu, Weijun Li, Wenqiang Li, Yanjie Li, Meilan Hao, Yusong Deng, Shu Wei
2025 A* conf
ICML
Shu Wei, Yanjie Li, Lina Yu, Weijun Li, Min Wu, Linjun Sun, Jingyi Liu, Hong Qin, Yusong Deng, Jufeng Han, Yan Pang
2025 J jnl
Pattern Recognit.
Huang Zhang, Long Yu, Guoqi Wang, Shengwei Tian, Zaiyang Yu, Weijun Li, Xin Ning
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Min Wu, Weijun Li, Lina Yu, Linjun Sun, Jingyi Liu, Wenqiang Li
2025 J jnl
Expert Syst. Appl.
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Wenqiang Li, Meilan Hao
2025 J jnl
Inf. Fusion
Yanjie Li, Jingyi Liu, Min Wu, Lina Yu, Weijun Li, Xin Ning, Wenqiang Li, Meilan Hao, Yusong Deng, Shu Wei
2025 J jnl
Neural Networks
Jingyi Liu, Weijun Li, Lina Yu, Min Wu, Wenqiang Li, Yanjie Li, Meilan Hao
2025 A* conf
AAAI
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Shu Wei, Yusong Deng, Meilan Hao
2025 A* conf
CVPR
Changshuo Wang, Shuting He, Xiang Fang, Jiawei Han, Zhonghang Liu, Xin Ning, Weijun Li, Prayag Tiwari
2025 J jnl
IEEE Trans. Artif. Intell.
Xin Ning, Limin Jiang, Weijun Li, Zaiyang Yu, Jinlong Xie, Lusi Li, Prayag Tiwari, Fernando Alonso-Fernandez
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Changshuo Wang, Xin Ning, Weijun Li, Xiao Bai, Xingyu Gao
2024 A* conf
ICML
Wenqiang Li, Weijun Li, Lina Yu, Min Wu, Linjun Sun, Jingyi Liu, Yanjie Li, Shu Wei, Yusong Deng, Meilan Hao
2024 J jnl
CoRR
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jinyi Liu, Wenqiang Li, Meilan Hao
2024 J jnl
IEEE Trans. Comput. Soc. Syst.
Xiaoli Dong, Xin Ning, Jian Xu, Lina Yu, Weijun Li, Liping Zhang
2024 J jnl
Neural Networks
Songsong Tian, Lusi Li, Weijun Li, Hang Ran, Xin Ning, Prayag Tiwari
2024 J jnl
Neural Networks
Changlin Liu, Linjun Sun, Xin Ning, Jian Xu, Lina Yu, Kaijie Zhang, Weijun Li
2024 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Yugui Zhang, Anyi Feng, Liping Zhang, Bin Li, Lu Zhang, Fengcai Cao, Weijun Li, Linpeng Wang, Xu Liu, Mingliang Zhou
2024 J jnl
CoRR
Shu Wei, Yanjie Li, Lina Yu, Min Wu, Weijun Li, Meilan Hao, Wenqiang Li, Jingyi Liu, Yusong Deng
2024 J jnl
Inf. Fusion
Xin Ning, Zaiyang Yu, Lusi Li, Weijun Li, Prayag Tiwari
2024 J jnl
CoRR
Jingyi Liu, Yanjie Li, Lina Yu, Min Wu, Weijun Li, Wenqiang Li, Meilan Hao, Yusong Deng, Shu Wei
2024 J jnl
CoRR
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Wenqiang Li, Meilan Hao, Shu Wei, Yusong Deng
2024 conf
ECCV (8)
Changshuo Wang, Meiqing Wu, Siew-Kei Lam, Xin Ning, Shangshu Yu, Ruiping Wang, Weijun Li, Thambipillai Srikanthan
2024 J jnl
CoRR
Changshuo Wang, Meiqing Wu, Siew-Kei Lam, Xin Ning, Shangshu Yu, Ruiping Wang, Weijun Li, Thambipillai Srikanthan
2024 J jnl
CoRR
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Wenqiang Li, Meilan Hao, Shu Wei, Yusong Deng
2024 J jnl
Inf. Sci.
Xin Ning, Feng He, Xiaoli Dong, Weijun Li, Fayadh Alenezi, Prayag Tiwari
2024 J jnl
Inf. Process. Manag.
Hang Ran, Weijun Li, Lusi Li, Songsong Tian, Xin Ning, Prayag Tiwari
2024 J jnl
CAAI Trans. Intell. Technol.
Liping Zhang, Weijun Li, Linjun Sun, Lina Yu, Xin Ning, Xiaoli Dong
2024 J jnl
CoRR
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Wenqiang Li, Shu Wei, Yusong Deng
2024 J jnl
CoRR
Yanjie Li, Jingyi Liu, Weijun Li, Lina Yu, Min Wu, Wenqiang Li, Meilan Hao, Shu Wei, Yusong Deng
2024 J jnl
Knowl. Based Syst.
Zaiyang Yu, Prayag Tiwari, Luyang Hou, Lusi Li, Weijun Li, Limin Jiang, Xin Ning
2024 J jnl
CoRR
Yusong Deng, Min Wu, Lina Yu, Jingyi Liu, Shu Wei, Yanjie Li, Weijun Li
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Zaiyang Yu, Lusi Li, Jinlong Xie, Changshuo Wang, Weijun Li, Xin Ning
2024 J jnl
CoRR
Min Wu, Weijun Li, Lina Yu, Wenqiang Li, Jingyi Liu, Yanjie Li, Meilan Hao
2023 J jnl
Neurocomputing
Hang Ran, Xin Ning, Weijun Li, Meilan Hao, Prayag Tiwari
2023 J jnl
CoRR
Wenqiang Li, Weijun Li, Lina Yu, Min Wu, Jingyi Liu, Yanjie Li
2023 J jnl
CoRR
Songsong Tian, Lusi Li, Weijun Li, Hang Ran, Xin Ning, Prayag Tiwari
2023 J jnl
Concurr. Comput. Pract. Exp.
Yaxuan Lu, Weijun Li, Xin Ning, Xiaoli Dong, Liping Zhang, Linjun Sun, Chuantong Cheng
2023 J jnl
Neurocomputing
Songsong Tian, Weijun Li, Xin Ning, Hang Ran, Hong Qin, Prayag Tiwari
2023 J jnl
Pattern Recognit.
Xin Ning, Weijuan Tian, Zaiyang Yu, Weijun Li, Xiao Bai, Yuebao Wang
2023 J jnl
Frontiers Neurorobotics
Xiao Bai, Xin Ning, Praveen Kumar Donta, Weijun Li
2023 J jnl
IEEE Trans. Cogn. Dev. Syst.
Xin Ning, Shaohui Xu, Fangzhe Nan, Qingliang Zeng, Chen Wang, Weiwei Cai, Weijun Li, Yizhang Jiang
2023 J jnl
Pattern Recognit.
Xin Ning, Weijuan Tian, Feng He, Xiao Bai, Le Sun, Weijun Li
2023 J jnl
CoRR
Yanjie Li, Weijun Li, Lina Yu, Min Wu, Jinyi Liu, Wenqiang Li, Meilan Hao, Shu Wei, Yusong Deng
2023 J jnl
Neural Networks
Jingyi Liu, Weijun Li, Lina Yu, Min Wu, Linjun Sun, Wenqiang Li, Yanjie Li
2023 A* conf
ICLR
Wenqiang Li, Weijun Li, Linjun Sun, Min Wu, Lina Yu, Jingyi Liu, Yanjie Li, Songsong Tian
2022 J jnl
Concurr. Comput. Pract. Exp.
Yakun Zhang, Weijun Li, Liping Zhang, Xin Ning, Linjun Sun, Yaxuan Lu
2022 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Guojun Wang, Weijun Li, Liping Zhang, Linjun Sun, Peng Chen, Lina Yu, Xin Ning
2022 J jnl
Pattern Recognit.
Xin Ning, Weijuan Tian, Zaiyang Yu, Weijun Li, Xiao Bai, Yuebao Wang
2022 J jnl
Concurr. Comput. Pract. Exp.
Peng Chen, Qi Xiao, Jian Xu, Xiaoli Dong, Linjun Sun, Weijun Li, Xin Ning, Guojun Wang, Ziheng Chen
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Changshuo Wang, Xin Ning, Linjun Sun, Liping Zhang, Weijun Li, Xiao Bai
2022 J jnl
PeerJ Comput. Sci.
Yuerong Tong, Jingyi Liu, Lina Yu, Liping Zhang, Linjun Sun, Weijun Li, Xin Ning, Jian Xu, Hong Qin, Qiang Cai
2022 J jnl
Appl. Soft Comput.
Jingyi Liu, Guojun Wang, Weijun Li, Linjun Sun, Liping Zhang, Lina Yu
2021 J jnl
Displays
Changshuo Wang, Chen Wang, Weijun Li, Haining Wang
2021 conf
CCBR
Liping Zhang, Linjun Sun, Xiaoli Dong, Lina Yu, Weijun Li, Xin Ning
2021 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Xin Ning, Ke Gong, Weijun Li, Liping Zhang, Xiao Bai, Shengwei Tian
2021 J jnl
Displays
Liping Zhang, Weijun Li, Lina Yu, Linjun Sun, Xiaoli Dong, Xin Ning
2021 J jnl
Neurocomputing
Xin Ning, Ke Gong, Weijun Li, Liping Zhang
2021 J jnl
CoRR
Liping Zhang, Weijun Li, Linjun Sun, Lina Yu, Xin Ning, Xiaoli Dong, Jian Xu, Hong Qin
2021 J jnl
Displays
Shaohua Qi, Xin Ning, Guowei Yang, Liping Zhang, Peng Long, Weiwei Cai, Weijun Li
2020 J jnl
IEEE Access
Xin Ning, Pengfei Duan, Weijun Li, Yuan Shi, Shuang Li
2020 B conf
ICPR
Liping Zhang, Weijun Li, Xin Ning, Linjun Sun, Xiaoli Dong
2020 J jnl
CoRR
Liping Zhang, Weijun Li, Xin Ning
2020 J jnl
IEEE Access
Xin Ning, Weijuan Tian, Weijun Li, Yueyue Lu, Shuai Nie, Linjun Sun, Ziheng Chen
2020 B conf
ICPR
Xin Ning, Weijun Li, Xiaoli Dong, Shaohui Xu, Fangzhe Nan, Yuanzhou Yao
2020 J jnl
CoRR
Xin Ning, Shaohui Xu, Xiaoli Dong, Weijun Li, Fangzhe Nan, Yuanzhou Yao
2020 J jnl
IEEE Access
Xin Ning, Shaohui Xu, Weijun Li, Shuai Nie
2020 J jnl
CoRR
Liping Zhang, Weijun Li, Lina Yu, Xiaoli Dong, Linjun Sun, Xin Ning, Jian Xu, Hong Qin
2020 J jnl
IEICE Trans. Inf. Syst.
Linjun Sun, Weijun Li, Xin Ning, Liping Zhang, Xiaoli Dong, Wei He
2020 J jnl
IEEE Signal Process. Lett.
Xin Ning, Pengfei Duan, Weijun Li, Shaolin Zhang
2019 J jnl
IEEE Access
Yakun Zhang, Weijun Li, Liping Zhang, Xin Ning, Linjun Sun, Yaxuan Lu
2019 conf
PRCV (1)
Pengfei Duan, Xin Ning, Yuan Shi, Shaolin Zhang, Weijun Li
2019 J jnl
IEICE Trans. Inf. Syst.
Peng Chen, Weijun Li, Linjun Sun, Xin Ning, Lina Yu, Liping Zhang
2018 J jnl
IEEE Trans. Image Process.
Xin Ning, Weijun Li, Bo Tang, Haibo He
2018 conf
ICONIP (6)
Xin Ning, Weijun Li, Weijuan Tian, Xuchi, Dongxiaoli, Zhangliping
2018 C conf
ICPRAM
Xin Ning, Weijun Li, Meili Wei, Linjun Sun, Xiaoli Dong
2018 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Xin Ning, Weijun Li, Jiang Xu
2017 J jnl
IEICE Trans. Inf. Syst.
Xin Ning, Weijun Li, Wenjie Liu
2016 conf
CCBR
Qin Lin, Weijun Li, Xin Ning, Xiaoli Dong, Peng Chen
2005 conf
ICNC (1)
Shoujue Wang, Chen Xu, Hong Qin, Weijun Li, Bian Yi
2003 B conf
IJCNN
Jian Xu, Weijun Li, Yanfeng Qu, Hong Qin, Shoujue Wang
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()