James M. Shook

14 papers C 1Journal 10Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
James M. Shook, Isabel Beichl
2025 J jnl
J. Graph Theory
James M. Shook
2024 J jnl
J. Graph Theory
James M. Shook
2019 J jnl
IACR Cryptol. ePrint Arch.
James M. Shook, Scott Simon, Peter Mell
2019 J jnl
CoRR
Loïc Lesavre, Priam Varin, Peter Mell, Michael Davidson, James M. Shook
2019 J jnl
CoRR
Peter Mell, John Kelsey, James M. Shook
2019 conf
Open Identity Summit
Peter Mell, Jim Dray, James M. Shook
2019 J jnl
CoRR
Peter Mell, Jim Dray, James M. Shook
2017 C conf
SSS
Peter Mell, John Kelsey, James M. Shook
2017 J jnl
J. Wirel. Mob. Networks Ubiquitous Comput. Dependable Appl.
Peter Mell, James M. Shook, Richard E. Harang, Serban I. Gavrila
2016 conf
ICSS
Peter Mell, James M. Shook, Richard E. Harang
2016 conf
MIST@CCS
Peter Mell, James M. Shook, Serban I. Gavrila
2015 J jnl
SIAM J. Discret. Math.
Jennifer Diemunsch, Michael Ferrara, Sogol Jahanbekam, James M. Shook
2010 J jnl
Discret. Math.
James M. Shook, Bing Wei
tests/unit/test_decompile_function_type.py
← Index tests/unit/test_decompile_function_type.py python
"""Unit tests for bninja/function_type.py."""
import sys
import pytest
from unittest.mock import MagicMock

# Install binaryninja stubs before importing
from tests.unit.conftest_binja_stubs import install_binja_stubs, SymbolType
install_binja_stubs()

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


# ============================================================================
# 4a. FunctionType / FunctionTypeAnalysis
# ============================================================================


class TestFunctionTypeEnum:
    def test_function_type_enum_values(self):
        assert FunctionType.USER.value == "USER"
        assert FunctionType.LIBRARY.value == "LIBRARY"
        assert FunctionType.EXTERNAL.value == "EXTERNAL"
        assert FunctionType.THUNK.value == "THUNK"
        assert FunctionType.UNKNOWN.value == "UNKNOWN"


class TestFunctionTypeAnalysis:
    def _make_function(self, symbol_type=None, is_thunk=False, raise_on_symbol=False):
        func = MagicMock()
        func.is_thunk = is_thunk
        if raise_on_symbol:
            type(func).symbol = property(lambda self: (_ for _ in ()).throw(Exception("no symbol")))
        else:
            func.symbol.type = symbol_type if symbol_type is not None else SymbolType.FunctionSymbol
        return func

    def test_user_function_type(self):
        func = self._make_function(symbol_type=SymbolType.FunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.USER

    def test_external_function_type(self):
        func = self._make_function(symbol_type=SymbolType.ImportedFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.EXTERNAL

    def test_library_function_type(self):
        func = self._make_function(symbol_type=SymbolType.LibraryFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.LIBRARY

    def test_thunk_function_type(self):
        # Thunk overrides the symbol type
        func = self._make_function(
            symbol_type=SymbolType.FunctionSymbol, is_thunk=True
        )
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.THUNK

    def test_exception_returns_unknown(self):
        func = self._make_function(raise_on_symbol=True)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.UNKNOWN