Carmelo Maria Torre

100 papers Journal 4Unranked 38
YearRankTypeTitle / Venue / Authors
2024 conf
ICCSA (4)
Giuseppe Ciciriello, Sabrina Sacco, Carmelo Maria Torre, Maria Cerreta
2023 conf
ICCSA (Workshops 6)
Felicia Di Liddo, Debora Anelli, Pierluigi Morano, Francesco Tajani, Carmelo Maria Torre
2023 conf
ICCSA (Workshops 3)
Carmelo Maria Torre, Pierluigi Morano, Marco Locurcio, Debora Anelli
2022 conf
ICCSA (Workshops 5)
Francesco Tajani, Pierluigi Morano, Felicia Di Liddo, Endriol Doko, Carmelo Maria Torre
2022 conf
ICCSA (Workshops 2)
Carmelo Maria Torre, Debora Anelli, Felicia Di Liddo, Marco Locurcio
2021 conf
ICCSA (6)
Francesco Tajani, Pierluigi Morano, Marco Locurcio, Paola Amoruso, Carmelo Maria Torre
2021 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (9)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (6)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (7)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (8)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 ed.
ICCSA (10)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre
2021 conf
ICCSA (7)
Carmelo Maria Torre, Pasquale Balena, Alessandro Bonifazi, Ludovica Vitale
2021 conf
ICCSA (6)
Marco Locurcio, Pierluigi Morano, Francesco Tajani, Felicia Di Liddo, Carmelo Maria Torre
2020 conf
ICCSA (3)
Francesco Tajani, Pierluigi Morano, Debora Anelli, Carmelo Maria Torre
2020 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (6)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 ed.
ICCSA (7)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Chiara Garau, Ivan Blecic, David Taniar, Bernady O. Apduhan, Ana Maria A. C. Rocha, Eufemia Tarantino, Carmelo Maria Torre, Yeliz Karaca
2020 conf
ICCSA (5)
Manuela Persia, Pasquale Balena, Alessandro Bonifazi, Maria Immacolata Marzulli, Antonio Orlando, Carmelo Maria Torre
2020 conf
ICCSA (3)
Pierluigi Morano, Francesco Tajani, Felicia Di Liddo, Carmelo Maria Torre, Marco Locurcio
2019 ed.
ICCSA (7)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (1)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (2)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (3)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (4)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (5)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 ed.
ICCSA (6)
Sanjay Misra, Osvaldo Gervasi, Beniamino Murgante, Elena N. Stankova, Vladimir Korkhov, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino
2019 conf
ICCSA (2)
Francesco Tajani, Carmelo Maria Torre, Felicia Di Liddo
2019 conf
ICCSA (4)
Pasquale Balena, Alessandro Bonifazi, Carmelo Maria Torre
2018 ed.
ICCSA (6)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Elena N. Stankova, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Eufemia Tarantino, Yeonseung Ryu
2018 conf
ICCSA (3)
Paola Perchinunno, Silvestro Montrone, Carmelo Maria Torre
2018 conf
ICCSA (5)
Ginevra Balletto, Giuseppe Borruso, Francesco Tajani, Carmelo Maria Torre
2018 J jnl
Eur. J. Oper. Res.
Raffaele Attardi, Maria Cerreta, Valentina Sannicandro, Carmelo Maria Torre
2018 conf
ICCSA (3)
Mercedes del Río Merino, Marica Sorrentino, Carmelo Maria Torre, Paola Villoria-Sáez
2018 conf
ICCSA (3)
Carmelo Maria Torre, Pierluigi Morano, Francesco Tajani
2017 conf
ICCSA (5)
Carmelo Maria Torre, Tommaso Passaro, Valentina Sannicandro
2017 ed.
ICCSA (7)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 ed.
ICCSA (6)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Giuseppe Borruso, Carmelo Maria Torre, Ana Maria A. C. Rocha, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Alfredo Cuzzocrea
2017 conf
ICCSA (3)
Carmelo Maria Torre, Pierluigi Morano, Francesco Tajani
2016 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Shangguang Wang
2016 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Shangguang Wang
2016 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Shangguang Wang
2016 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Shangguang Wang
2016 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan, Elena N. Stankova, Shangguang Wang
2016 conf
ICCSA (4)
Alessandro Bonifazi, Valentina Sannicandro, Raffaele Attardi, Gianluca Di Cugno, Carmelo Maria Torre
2016 J jnl
Int. J. Bus. Intell. Data Min.
Francesco Tajani, Pierluigi Morano, Marco Locurcio, Carmelo Maria Torre
2016 conf
ICCSA (4)
Carmelo Maria Torre, Raffaele Attardi, Valentina Sannicandro
2015 ed.
ICCSA (1)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Marina L. Gavrilova, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan
2015 ed.
ICCSA (2)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Marina L. Gavrilova, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan
2015 ed.
ICCSA (3)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Marina L. Gavrilova, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan
2015 ed.
ICCSA (4)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Marina L. Gavrilova, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan
2015 ed.
ICCSA (5)
Osvaldo Gervasi, Beniamino Murgante, Sanjay Misra, Marina L. Gavrilova, Ana Maria Alves Coutinho Rocha, Carmelo Maria Torre, David Taniar, Bernady O. Apduhan
2015 conf
ICCSA (3)
Loreto Colombo, Immacolata Geltrude Palomba, Valentina Sannicandro, Carmelo Maria Torre
2015 conf
ICCSA (3)
Carmelo Maria Torre, Pierluigi Morano, Francesco Tajani
2015 conf
ICCSA (3)
Raffaele Attardi, Maria Cerreta, Valentina Sannicandro, Carmelo Maria Torre
2014 conf
ICCSA (3)
Raffaele Attardi, Emanuele Pastore, Carmelo Maria Torre
2014 ed.
ICCSA (1)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 ed.
ICCSA (2)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 ed.
ICCSA (3)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 ed.
ICCSA (4)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 ed.
ICCSA (5)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 ed.
ICCSA (6)
Beniamino Murgante, Sanjay Misra, Ana Maria A. C. Rocha, Carmelo Maria Torre, Jorge Gustavo Rocha, Maria Irene Falcão, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2014 conf
ICCSA (3)
Pasquale Balena, Valentina Sannicandro, Carmelo Maria Torre
2014 conf
ICCSA (3)
Sebastiano Carbonara, Davide Stefano, Carmelo Maria Torre
2014 J jnl
Int. J. Bus. Intell. Data Min.
Carmelo Maria Torre, Pasquale Balena, Claudia Ceppi
2014 conf
ICCSA (3)
Maria Giovanna Altieri, Francesco Rotondo, Carmelo Maria Torre
2013 ed.
ICCSA (1)
Beniamino Murgante, Sanjay Misra, Maurizio Carlini, Carmelo Maria Torre, Hong-Quang Nguyen, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2013 ed.
ICCSA (2)
Beniamino Murgante, Sanjay Misra, Maurizio Carlini, Carmelo Maria Torre, Hong-Quang Nguyen, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2013 ed.
ICCSA (3)
Beniamino Murgante, Sanjay Misra, Maurizio Carlini, Carmelo Maria Torre, Hong-Quang Nguyen, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2013 ed.
ICCSA (4)
Beniamino Murgante, Sanjay Misra, Maurizio Carlini, Carmelo Maria Torre, Hong-Quang Nguyen, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2013 ed.
ICCSA (5)
Beniamino Murgante, Sanjay Misra, Maurizio Carlini, Carmelo Maria Torre, Hong-Quang Nguyen, David Taniar, Bernady O. Apduhan, Osvaldo Gervasi
2013 conf
ICCSA (4)
Pasquale Balena, Valentina Sannicandro, Carmelo Maria Torre
2013 conf
ICCSA (4)
Pasquale Balena, Claudia Ceppi, Carmelo Maria Torre
2012 conf
ICCSA (2)
Pasquale Balena, Giovanna Mangialardi, Carmelo Maria Torre
2012 conf
ICCSA (1)
Carmelo Maria Torre, Pasquale Balena, Romina Zito
2012 conf
ICCSA (2)
Marco Selicato, Carmelo Maria Torre, Giovanni La Trofa
2012 J jnl
Int. J. Agric. Environ. Inf. Syst.
Paola Perchinunno, Francesco Rotondo, Carmelo Maria Torre
2012 conf
ICCSA (2)
Luigi Fusco Girard, Carmelo Maria Torre
2011 conf
ICCSA (1)
Carmelo Maria Torre
2010 conf
ICCSA (1)
Silvestro Montrone, Paola Perchinunno, Carmelo Maria Torre
2009 conf
ICCSA (1)
Silvestro Montrone, Massimo Bilancia, Paola Perchinunno, Carmelo Maria Torre
2008 conf
ICCSA (1)
Paola Perchinunno, Francesco Rotondo, Carmelo Maria Torre
tests/unit/test_decompile_decompiler.py
← Index tests/unit/test_decompile_decompiler.py python
"""Unit tests (mocked BN) for bninja/decompiler.py — BinaryNinjaDecompiler."""
import sys
import json
import time
import pytest
from unittest.mock import MagicMock, patch, mock_open

from tests.unit.conftest_binja_stubs import (
    install_binja_stubs,
    MockFunction,
    MockBasicBlock,
    MockDisassemblyLine,
    MockToken,
    MockSymbol,
    MockBinaryView,
    MockEdge,
    SymbolType,
    InstructionTextTokenType,
    BranchType,
)

install_binja_stubs()

from redb.extractors.decompiler.bninja.decompiler import (
    BinaryNinjaDecompiler,
    is_lib_or_thunk,
)
from redb.extractors.decompiler.bninja.function_type import FunctionType


# ============================================================================
# 10a. BinaryNinjaDecompiler
# ============================================================================


class TestBinaryNinjaDecompilerLogError:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.bv = None
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            return d

    def test_log_error_appends(self):
        d = self._make_decompiler()
        d.log_error("test error", "func1", 0x1000, Exception("boom"), "extract")
        assert len(d.errors) == 1

    def test_log_error_schema(self):
        d = self._make_decompiler()
        d.log_error("test error", "func1", 0x1000, Exception("boom"), "extract")
        error = d.errors[0]
        expected_keys = [
            "function_name",
            "function_address",
            "error_location",
            "error_message",
            "error_details",
            "error_type",
            "timestamp",
        ]
        for key in expected_keys:
            assert key in error, f"Missing key: {key}"


class TestBinaryNinjaDecompilerIsTooFewBlocks:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.MIN_FUNCTION_SIZE = 10
            return d

    def test_is_too_few_blocks_none(self):
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = None
        assert d.is_too_few_blocks(func) is False

    def test_is_too_few_blocks_empty(self):
        # Empty basic_blocks now returns True because Binja creates function
        # stubs with empty blocks before analysis completes — we no longer
        # skip these so they get filtered downstream instead.
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = []
        assert d.is_too_few_blocks(func) is True

    def test_is_too_few_blocks_small_single(self):
        d = self._make_decompiler()
        block = MagicMock()
        block.disassembly_text = [MagicMock() for _ in range(5)]  # < 10
        func = MagicMock()
        func.basic_blocks = [block]
        assert d.is_too_few_blocks(func) is False

    def test_is_too_few_blocks_large_single(self):
        d = self._make_decompiler()
        block = MagicMock()
        block.disassembly_text = [MagicMock() for _ in range(15)]  # >= 10
        func = MagicMock()
        func.basic_blocks = [block]
        assert d.is_too_few_blocks(func) is True

    def test_is_too_few_blocks_multiple(self):
        d = self._make_decompiler()
        func = MagicMock()
        func.basic_blocks = [MagicMock(), MagicMock()]
        assert d.is_too_few_blocks(func) is True


class TestIsLibOrThunk:
    def test_is_lib_or_thunk_user(self):
        func = MagicMock()
        func.symbol.type = SymbolType.FunctionSymbol
        func.is_thunk = False
        assert is_lib_or_thunk(func) is True  # NOT filtered

    def test_is_lib_or_thunk_thunk(self):
        func = MagicMock()
        func.symbol.type = SymbolType.FunctionSymbol
        func.is_thunk = True
        assert is_lib_or_thunk(func) is False  # Filtered out

    def test_is_lib_or_thunk_external(self):
        func = MagicMock()
        func.symbol.type = SymbolType.ImportedFunctionSymbol
        func.is_thunk = False
        assert is_lib_or_thunk(func) is False  # Filtered out


class TestBinaryNinjaDecompilerExtract:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.bv = MagicMock()
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            d.arch = MagicMock()
            return d

    def test_extract_success(self):
        d = self._make_decompiler()
        mock_results = {
            "decompiled": [{"test": True}],
            "disassembled": [],
            "cfg": [],
            "llil": [],
            "errors": [],
            "strings": [],
            "mlil": [],
        }
        with patch.object(d, "analyze_binary", return_value=mock_results):
            result = d.extract()
            assert result is True
            assert d.analysis_results == mock_results

    def test_extract_failure(self):
        d = self._make_decompiler()
        with patch.object(d, "analyze_binary", return_value=None):
            result = d.extract()
            assert result is False

    def test_tag(self):
        d = self._make_decompiler()
        assert d.tag() == "DECOMPILED"


class TestBinaryNinjaDecompilerAnalyzeBinary:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.filepath = "/fake/binary"
            d.analysis_results = None
            d.exporters = []
            d.index_prefix = None
            d.filetype = None
            d.goresym = None
            d.BNINJA_TIMEOUT = 60
            d.arch = MagicMock()
            d.MIN_FUNCTION_SIZE = 10
            return d

    def test_analyze_binary_links_hlil_disasm(self):
        """Bi-directional hash linkage between decompiled and disassembled."""
        d = self._make_decompiler()
        d.bv = MagicMock()
        d.bv.functions = []
        # Mock methods to return controlled data
        with patch.object(d, "extract_hlil") as mock_hlil, \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg", return_value=None), \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_hlil.return_value = {
                "decompiled_function_hash": "HLIL_HASH",
                "decompiled_function_name": "test",
                "decompiled_function": "code",
            }
            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }

            # Manually feed one function
            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["decompiled"]:
                hlil_r = results["decompiled"][0]
                disasm_r = results["disassembled"][0]
                assert hlil_r["disassembled_function_hash"] == "DISASM_HASH"
                assert disasm_r["decompiled_function_hash"] == "HLIL_HASH"

    def test_analyze_binary_links_llil_disasm(self):
        """Bi-directional linkage between LLIL and disassembly."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg", return_value=None), \
             patch.object(d, "extract_lowlevel") as mock_llil:

            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_llil.return_value = {
                "sha256_llil": "LLIL_HASH",
                "tlsh_llil": "tlsh_val",
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["llil"]:
                llil_r = results["llil"][0]
                assert llil_r["disassembled_function_hash"] == "DISASM_HASH"

    def test_analyze_binary_links_cfg_disasm(self):
        """CFG gets disassembled_function_hash."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg") as mock_cfg, \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_disasm.return_value = {
                "disassembled_function_hash": "DISASM_HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_cfg.return_value = {
                "function_address": 0x1000,
                "cyclomatic_complexity": 3,
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["cfg"]:
                cfg_r = results["cfg"][0]
                assert cfg_r["disassembled_function_hash"] == "DISASM_HASH"

    def test_analyze_binary_sets_cyclomatic(self):
        """cyclomatic_complexity set on disasm from CFG."""
        d = self._make_decompiler()
        d.bv = MagicMock()

        with patch.object(d, "extract_hlil", return_value=None), \
             patch.object(d, "extract_disasm") as mock_disasm, \
             patch.object(d, "extract_cfg") as mock_cfg, \
             patch.object(d, "extract_lowlevel", return_value=None):

            mock_disasm.return_value = {
                "disassembled_function_hash": "HASH",
                "disassembled_function_no_addresses": "asm",
            }
            mock_cfg.return_value = {
                "function_address": 0x1000,
                "cyclomatic_complexity": 7,
            }

            mock_func = MagicMock()
            mock_func.symbol.type = SymbolType.FunctionSymbol
            mock_func.is_thunk = False
            mock_func.basic_blocks = [MagicMock(), MagicMock()]
            d.bv.functions = [mock_func]

            results = d.analyze_binary()
            if results and results["disassembled"]:
                disasm_r = results["disassembled"][0]
                assert disasm_r.get("cyclomatic_complexity") == 7


class TestApplyGoReSym:
    def _make_decompiler(self):
        with patch.object(BinaryNinjaDecompiler, "__init__", lambda self, *a, **kw: None):
            d = BinaryNinjaDecompiler.__new__(BinaryNinjaDecompiler)
            d.log = MagicMock()
            d.errors = []
            d.bv = MagicMock()
            return d

    def test_apply_goresym_user_functions(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        data = {
            "UserFunctions": [{"Start": 0x1000, "FullName": "main.main"}],
        }
        with patch("builtins.open", mock_open(read_data=json.dumps(data))):
            d._BinaryNinjaDecompiler__apply_goresym()
            d.bv.define_user_symbol.assert_called()

    def test_apply_goresym_std_functions(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        data = {
            "StdFunctions": [{"Start": 0x2000, "FullName": "runtime.main"}],
        }
        with patch("builtins.open", mock_open(read_data=json.dumps(data))):
            d._BinaryNinjaDecompiler__apply_goresym()
            d.bv.define_user_symbol.assert_called()

    def test_apply_goresym_invalid_json(self):
        d = self._make_decompiler()
        d.goresym = "/tmp/goresym.json"
        with patch("builtins.open", mock_open(read_data="not json {")):
            d._BinaryNinjaDecompiler__apply_goresym()
            # Should log error but not crash
            d.log.log_error if hasattr(d.log, 'log_error') else None
            # Just verify no exception raised