Wade Holst

13 papers A 2Unranked 11
YearRankTypeTitle / Venue / Authors
2006 conf
OOPSLA Companion
Ben Stephenson, Wade Holst
2005 conf
OOPSLA Companion
Ben Stephenson, Wade Holst
2005 conf
OOPSLA Companion
Wade Holst
2004 conf
PPPJ
Ben Stephenson, Wade Holst
2004 conf
CASCON
Ben Stephenson, Wade Holst
2004 conf
OOPSLA Companion
Ben Stephenson, Wade Holst
2004 conf
OOPSLA Companion
Wade Holst
2003 conf
OOPSLA Companion
Ben Stephenson, Wade Holst
2001 conf
COOTS
Christopher Dutchyn, Paul Lu, Duane Szafron, Steven Bromling, Wade Holst
2000 conf
OOPSLA Addendum
Christopher Dutchyn, Paul Lu, Duane Szafron, Steven Bromling, Wade Holst
1999 A conf
ECOOP
Candy Pang, Wade Holst, Yuri Leontiev, Duane Szafron
1997 A conf
ECOOP
Wade Holst, Duane Szafron
1997 conf
TOOLS (23)
Wade Holst, Duane Szafron
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