Oliviero Stock

167 papers A* 15A 17B 16C 7Misc 1Journal 54Unranked 42
YearRankTypeTitle / Venue / Authors
2022 ch.
Perspectives on Digital Humanism
Oliviero Stock
2022 J jnl
Lang. Resour. Evaluation
Lorenzo Gatti, Oliviero Stock, Carlo Strapparava, Gözde Özbal
2020 J jnl
Behav. Inf. Technol.
Massimo Zancanaro, Oliviero Stock, Gianluca Schiavo, Alessandro Cappelletti, Sebastian Gehrmann, Daphna Canetti, Ohad Shaked, Shani Fachter, Rachel Yifat, Ravit Mimran, Patrice L. (Tamar) Weiss
2020 conf
UMAP (Adjunct Publication)
Alan J. Wecker, Tsvi Kuflik, Oliviero Stock
2019 ch.
Computational Creativity
Lorenzo Gatti, Gözde Özbal, Marco Guerini, Oliviero Stock, Carlo Strapparava
2019 J jnl
CoRR
Massimo Zancanaro, Oliviero Stock, Gianluca Schiavo, Alessandro Cappelletti, Sebastian Gehrmann, Daphna Canetti, Ohad Shaked, Shani Fachter, Rachel Yifat, Ravit Mimran, Patrice L. Weiss
2019 C conf
ISM
Galena Pisoni, Florian Daniel, Fabio Casati, Charles Callaway, Oliviero Stock
2017 conf
IUI Companion
Alan J. Wecker, Tsvi Kuflik, Oliviero Stock
2017 A* conf
ACM Multimedia
Lorenzo Gatti, Gözde Özbal, Oliviero Stock, Carlo Strapparava
2017 conf
EACL (2)
Lorenzo Gatti, Gözde Özbal, Oliviero Stock, Carlo Strapparava
2017 conf
UMAP (Adjunct Publication)
Tsvi Kuflik, Antonino Lo Bue, Oliviero Stock, Alan J. Wecker
2016 conf
AVI*CH
Alan J. Wecker, Tsvi Kuflik, Oliviero Stock
2016 conf
MobileHCI Adjunct
Alan J. Wecker, Tsvi Kuflik, Oliviero Stock
2016 A* conf
AAAI
Oliviero Stock, Marco Guerini, Fabio Pianesi
2016 conf
IUI Companion
Lorenzo Gatti, Gözde Özbal, Marco Guerini, Oliviero Stock, Carlo Strapparava
2016 J jnl
Int. J. Hum. Comput. Interact.
Gianluca Schiavo, Alessandro Cappelletti, Eleonora Mencarini, Oliviero Stock, Massimo Zancanaro
2015 A conf
RecSys
Oliviero Stock
2015 conf
PATCH@IUI
Alan J. Wecker, Tsvi Kuflik, Oliviero Stock
2015 J jnl
J. Inf. Technol. Tour.
Tsvi Kuflik, Alan J. Wecker, Joel Lanir, Oliviero Stock
2015 conf
INTERACT (2)
Eleonora Mencarini, Gianluca Schiavo, Alessandro Cappelletti, Oliviero Stock, Massimo Zancanaro
2015 J jnl
Intelligenza Artificiale
Oliviero Stock
2015 J jnl
Intelligenza Artificiale
Oliviero Stock
2015 J jnl
J. Inf. Technol. Tour.
Hannes Werthner, Aurkene Alzua-Sorzabal, Lorenzo Cantoni, Astrid Dickinger, Ulrike Gretzel, Dietmar Jannach, Julia Neidhardt, Birgit Pröll, Francesco Ricci, Miriam Scaglione, Brigitte Stangl, Oliviero Stock, Markus Zanker
2015 conf
AAAI Workshop: AI and Ethics
Marco Guerini, Fabio Pianesi, Oliviero Stock
2015 J jnl
Comput. Intell.
Lorenzo Gatti, Marco Guerini, Oliviero Stock, Carlo Strapparava
2015 A conf
IUI
Liliana Ardissono, Cristina Gena, Lora Aroyo, Tsvika Kuflik, Alan J. Wecker, Johan Oomen, Oliviero Stock
2015 ed.
PATCH@IUI
Liliana Ardissono, Lora Aroyo, Cristina Gena, Tsvi Kuflik, Johan Oomen, Oliviero Stock, Alan J. Wecker
2015 conf
UMAP Workshops
Antonino Lo Bue, Alan J. Wecker, Tsvi Kuflik, Alberto Machì, Oliviero Stock
2015 A* conf
IJCAI
Lorenzo Gatti, Gözde Özbal, Marco Guerini, Oliviero Stock, Carlo Strapparava
2015 conf
MobileHCI Adjunct
Alan J. Wecker, Joel Lanir, Tsvi Kuflik, Oliviero Stock
2014 A ed.
IUI
Tsvi Kuflik, Oliviero Stock, Joyce Yue Chai, Antonio Krüger
2014 ed.
IUI Companion
Tsvi Kuflik, Oliviero Stock, Joyce Yue Chai, Antonio Krüger
2014 conf
AmI
Gianluca Schiavo, Eleonora Mencarini, Alessandro Cappelletti, Oliviero Stock, Massimo Zancanaro
2014 B conf
LREC
Carlo Strapparava, Lorenzo Gatti, Marco Guerini, Oliviero Stock
2014 conf
Language, Culture, Computation (2)
Oliviero Stock, Tsvi Kuflik, Massimo Zancanaro, Dina Goren-Bar, Ariel Gorfinkel, Sadek Jbara, Shahar Kats, Julia Sheidin, Nadav Kashtan
2014 J jnl
Intelligenza Artificiale
Oliviero Stock
2014 J jnl
ACM Trans. Interact. Intell. Syst.
Charles B. Callaway, Oliviero Stock, Elyon Dekoven
2014 Misc conf
NordiCHI
Eleonora Mencarini, Gianluca Schiavo, Alessandro Cappelletti, Oliviero Stock, Massimo Zancanaro
2014 J jnl
EAI Endorsed Trans. Ambient Syst.
Charles B. Callaway, Oliviero Stock
2014 J jnl
CoRR
Marco Guerini, Fabio Pianesi, Oliviero Stock
2014 A conf
IUI
Gianluca Schiavo, Alessandro Cappelletti, Eleonora Mencarini, Oliviero Stock, Massimo Zancanaro
2014 conf
IUI Companion
Lorenzo Gatti, Marco Guerini, Oliviero Stock, Carlo Strapparava
2014 B conf
PERSUASIVE
Lorenzo Gatti, Marco Guerini, Oliviero Stock, Carlo Strapparava
2013 conf
UMAP Workshops
Alan J. Wecker, Tsvika Kuflik, Oliviero Stock
2013 J jnl
Intelligenza Artificiale
Oliviero Stock
2013 J jnl
Interact. Comput.
Joel Lanir, Tsvi Kuflik, Eyal Dim, Alan J. Wecker, Oliviero Stock
2012 J jnl
ACM Trans. Comput. Hum. Interact.
Massimo Zancanaro, Oliviero Stock, Zvi Eisikovits, Chaya Koren, Patrice L. Weiss
2012 conf
COLING (Posters)
Carlo Strapparava, Oliviero Stock, Ilai Alon
2012 C conf
ICCC
Lorenzo Gatti, Marco Guerini, Charles B. Callaway, Oliviero Stock, Carlo Strapparava
2012 J jnl
CoRR
Marco Guerini, Carlo Strapparava, Oliviero Stock
2012 conf
ACL (1)
Marco Guerini, Carlo Strapparava, Oliviero Stock
2012 J jnl
Intelligenza Artificiale
Oliviero Stock
2012 conf
CHI Extended Abstracts
Alan J. Wecker, Tsvi Kuflik, Joel Lanir, Oliviero Stock
2012 J jnl
New Rev. Hypermedia Multim.
Charles B. Callaway, Oliviero Stock, Elyon Dekoven, Kinneret Noy, Yael Citron, Yael Dobrin
2011 A conf
IUI
Massimo Zancanaro, Oliviero Stock, Daniel Tomasini, Fabio Pianesi
2011 J jnl
ACM Journal on Computing and Cultural Heritage
Tsvi Kuflik, Oliviero Stock, Massimo Zancanaro, Ariel Gorfinkel, Sadek Jbara, Shahar Kats, Julia Sheidin, Nadav Kashtan
2011 J jnl
Intelligenza Artificiale
Oliviero Stock
2011 J jnl
Interact. Comput.
Joel Lanir, Tsvi Kuflik, Alan J. Wecker, Oliviero Stock, Massimo Zancanaro
2011 J jnl
J. Softw. Eng. Appl.
Tsvi Kuflik, Pnina Soffer, Iris Reinhartz-Berger, Sadek Jbara, Oliviero Stock
2011 A conf
IUI
Tsvi Kuflik, Joel Lanir, Eyal Dim, Alan J. Wecker, Michele Corrà, Massimo Zancanaro, Oliviero Stock
2011 A conf
IUI
Charles B. Callaway, Oliviero Stock, Elyon Dekoven, Kinneret Noy, Yael Citron, Yael Dobrin
2011 conf
Mobile HCI
Alan J. Wecker, Joel Lanir, Tsvi Kuflik, Oliviero Stock
2011 A conf
IUI
Marco Guerini, Carlo Strapparava, Oliviero Stock
2010 B conf
LREC
Marco Guerini, Carlo Strapparava, Oliviero Stock
2010 conf
MCIS
Joel Lanir, Alan J. Wecker, Tsvi Kuflik, Eyal Dim, Ido Beja, Inna Belinky, Igor Gordon, Nadav Kashtan, Irit Mogilevsky, Massimo Zancanaro, Oliviero Stock
2010 J jnl
J. Inf. Technol. Tour.
Marco Guerini, Oliviero Stock
2010 B conf
LREC
Carlo Strapparava, Marco Guerini, Oliviero Stock
2009 J jnl
AI Mag.
Simon Colton, Ramón López de Mántaras, Oliviero Stock
2009 J jnl
AI Soc.
Eynat Gal, Nirit Bauminger, Dina Goren-Bar, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro, Patrice L. (Tamar) Weiss
2009 B conf
ACII
Alessandro Valitutti, Oliviero Stock, Carlo Strapparava
2009 C conf
ICIDS
Oliviero Stock, Charles B. Callaway
2009 J jnl
AI Soc.
Anton Nijholt, Oliviero Stock, Toyoaki Nishida
2009 J jnl
Künstliche Intell.
Oliviero Stock, Massimo Zancanaro
2009 J jnl
AI Soc.
Oliviero Stock, Massimo Zancanaro, Cesare Rocchi, Daniel Tomasini, Chaya Koren, Zvi Eisikovits, Dina Goren-Bar, Patrice L. (Tamar) Weiss
2008 conf
AAAI Fall Symposium: Multimedia Information Extraction
Oliviero Stock
2008 A* conf
CHI
Oliviero Stock, Massimo Zancanaro, Chaya Koren, Cesare Rocchi, Zvi Eisikovits, Dina Goren-Bar, Daniel Tomasini, Patrice L. (Tamar) Weiss
2008 B conf
AVI
Cesare Rocchi, Daniel Tomasini, Oliviero Stock, Massimo Zancanaro
2008 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Oliviero Stock, Carlo Strapparava, Alessandro Valitutti
2008 B conf
LREC
Marco Guerini, Carlo Strapparava, Oliviero Stock
2008 conf
AAAI Spring Symposium: Creative Intelligent Systems
Alessandro Valitutti, Carlo Strapparava, Oliviero Stock
2008 C conf
CICLing
Marco Guerini, Carlo Strapparava, Oliviero Stock
2008 B conf
LREC
Marco Guerini, Carlo Strapparava, Oliviero Stock
2007 J jnl
Appl. Artif. Intell.
Marco Guerini, Oliviero Stock, Massimo Zancanaro
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Cesare Rocchi, Ilenia Graziola, Dina Goren-Bar, Oliviero Stock, Massimo Zancanaro
2007 J jnl
User Model. User Adapt. Interact.
Oliviero Stock, Massimo Zancanaro, Paolo Busetta, Charles B. Callaway, Antonio Krüger, Michael Kruppa, Tsvi Kuflik, Elena Not, Cesare Rocchi
2007 B conf
ACII
Carlo Strapparava, Alessandro Valitutti, Oliviero Stock
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Massimo Zancanaro, Fabio Pianesi, Oliviero Stock, Paola Venuti, Alessandro Cappelletti, G. Iandolo, Michela Prete, Franca Rossi
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Elena Not, Charles B. Callaway, Cesare Rocchi, Oliviero Stock, Massimo Zancanaro
2007 conf
SwSTE
Sadek Jbara, Tsvi Kuflik, Pnina Soffer, Oliviero Stock
2007 A* conf
IJCAI
Carlo Strapparava, Alessandro Valitutti, Oliviero Stock
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Roberto Brunelli, Adriano Albertini, Claudio Andreatta, Paul Chippendale, M. Ruocco, Oliviero Stock, Francesco Tobia, Massimo Zancanaro
2007 C conf
MMSP
Nirit Bauminger, Dina Goren-Bar, Eynat Gal, Patrice L. Weiss, Judi Kupersmitt, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Oliviero Stock, Antonio Krüger, Tsvi Kuflik, Massimo Zancanaro
2007 conf
BVAI
Oliviero Stock, Carlo Strapparava, Alessandro Valitutti
2007 book
Oliviero Stock, Massimo Zancanaro
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Charles B. Callaway, Elena Not, Oliviero Stock
2007 A conf
IUI
Tsvi Kuflik, Julia Sheidin, Sadek Jbara, Dina Goren-Bar, Pnina Soffer, Oliviero Stock, Massimo Zancanaro
2007 conf
AI*IA
Carlo Strapparava, Alessandro Valitutti, Oliviero Stock
2006 C conf
ENTER
Tsvi Kuflik, Adriano Albertini, Paolo Busetta, Cesare Rocchi, Oliviero Stock, Massimo Zancanaro
2006 J jnl
Intelligenza Artificiale
Marco Gori, Oliviero Stock
2006 J jnl
IEEE Intell. Syst.
Kim Binsted, Benjamin Bergen, Seana Coulson, Anton Nijholt, Oliviero Stock, Carlo Strapparava, Graeme Ritchie, Ruli Manurung, Helen Pain, Annalu Waller, Dave O'Mara
2006 J jnl
IEEE Intell. Syst.
Mark T. Maybury, Oliviero Stock, Wolfgang Wahlster
2006 A* conf
AAAI
Oliviero Stock, Carlo Strapparava
2006 ed.
Reasoning, Action and Interaction in AI Theories and Systems
Oliviero Stock, Marco Schaerf
2006 B conf
LREC
Carlo Strapparava, Alessandro Valitutti, Oliviero Stock
2005 conf
INTETAIN
Oliviero Stock, Carlo Strapparava
2005 J jnl
Artif. Intell.
Charles B. Callaway, Elena Not, Alessandra Novello, Cesare Rocchi, Oliviero Stock, Massimo Zancanaro
2005 A conf
IUI
Adriano Albertini, Roberto Brunelli, Oliviero Stock, Massimo Zancanaro
2005 conf
INTETAIN
Ilenia Graziola, Cesare Rocchi, Dina Goren-Bar, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro
2005 B conf
ACII
Dina Goren-Bar, Ilenia Graziola, Cesare Rocchi, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro
2005 conf
INTETAIN
Eynat Gal, Dina Goren-Bar, E. Gazit, Nirit Bauminger, Alessandro Cappelletti, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro, Patrice L. (Tamar) Weiss
2005 A* conf
ACL
Oliviero Stock, Carlo Strapparava
2005 ed.
INTETAIN
Mark T. Maybury, Oliviero Stock, Wolfgang Wahlster
2005 B conf
ACII
Alessandro Valitutti, Carlo Strapparava, Oliviero Stock
2005 conf
User Modeling
Tsvi Kuflik, Charles B. Callaway, Dina Goren-Bar, Cesare Rocchi, Oliviero Stock, Massimo Zancanaro
2005 A conf
IUI
Charles B. Callaway, Tsvi Kuflik, Elena Not, Alessandra Novello, Oliviero Stock, Massimo Zancanaro
2005 J jnl
Appl. Artif. Intell.
Oliviero Stock, Carlo Strapparava
2004 J jnl
PsychNology J.
Alessandro Valitutti, Carlo Strapparava, Oliviero Stock
2004 A conf
IUI
Cesare Rocchi, Oliviero Stock, Massimo Zancanaro, Michael Kruppa, Antonio Krüger
2004 C conf
ENTER
Ivana Alfaro, Marianna Nardon, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro
2004 J jnl
J. Inf. Technol. Tour.
Ivana Alfaro, Marianna Nardon, Fabio Pianesi, Oliviero Stock, Massimo Zancanaro
2003 A conf
IUI
Oliviero Stock, Carlo Strapparava
2003 conf
Smart Graphics
Massimo Zancanaro, Cesare Rocchi, Oliviero Stock
2003 conf
Mobile HCI
Massimo Zancanaro, Oliviero Stock, Ivana Alfaro
2003 A* conf
IJCAI
Oliviero Stock, Carlo Strapparava
2003 conf
CHI Extended Abstracts
Anton Nijholt, Oliviero Stock, Alan J. Dix, John Morkes
2002 B conf
Intelligent Tutoring Systems
Oliviero Stock
2001 J jnl
AI Mag.
Oliviero Stock
2001 J jnl
Pers. Ubiquitous Comput.
Daniela Petrelli, Elena Not, Massimo Zancanaro, Carlo Strapparava, Oliviero Stock
2000 ed.
AH
Peter Brusilovsky, Oliviero Stock, Carlo Strapparava
2000 J jnl
Ann. Math. Artif. Intell.
Oliviero Stock
2000 J jnl
Artif. Intell. Law
Bernardo Magnini, Elena Not, Oliviero Stock, Carlo Strapparava
1999 conf
CHI Extended Abstracts
Daniela Petrelli, Elena Not, Marcello Sarini, Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1999 A* conf
IJCAI
Oliviero Stock
1998 conf
Cooperative Multimodal Communication
Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1998 J jnl
New Rev. Hypermedia Multim.
Elena Not, Daniela Petrelli, Marcello Sarini, Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1998 conf
ECDL
Mark T. Maybury, Oliviero Stock, Wolfgang Wahlster
1997 J jnl
Comput. Stand. Interfaces
Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1997 J jnl
Comput. Intell.
Massimo Zancanaro, Oliviero Stock, Carlo Strapparava
1997 conf
ICHIM
Elena Not, Daniela Petrelli, Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1996 J jnl
ACM SIGCHI Bull.
Oliviero Stock, Carlo Strapparava, Massimo Zancanaro
1995 J jnl
Artif. Intell. Rev.
Oliviero Stock
1994 J jnl
Artif. Intell.
Giorgio Satta, Oliviero Stock
1994 J jnl
IEEE Expert
Oliviero Stock
1993 A* conf
IJCAI
Massimo Zancanaro, Oliviero Stock, Carlo Strapparava
1993 J jnl
Appl. Artif. Intell.
Giuseppe Carenini, Fabio Pianesi, Marco Ponzi, Oliviero Stock
1993 conf
INTERCHI
Oliviero Stock
1992 A conf
ECAI
Oliviero Stock
1992 ed.
NLG
Robert Dale, Eduard H. Hovy, Dietmar F. Rösner, Oliviero Stock
1992 conf
NLG
Yigal Arens, Robert Dale, Stephan M. Kerpedjiev, Kathleen R. McKeown, Oliviero Stock, Wolfgang Wahlster
1991 A* conf
AAAI
Giorgio Satta, Oliviero Stock
1991 conf
AAAI Workshop on Intelligent Multimedia Interfaces
Oliviero Stock
1991 A* conf
IJCAI
Oliviero Stock
1990 conf
Modelling the Innovation
Oliviero Stock, Giuseppe Carenini, Marco Ponzi, Vieri Samek-Lodovici
1990 B conf
COLING
Alberto Lavelli, Oliviero Stock
1989 A* conf
IJCAI
Giorgio Satta, Oliviero Stock
1989 conf
IWPT
Giorgio Satta, Oliviero Stock
1989 J jnl
Comput. Linguistics
Oliviero Stock
1988 B conf
COLING
Oliviero Stock, Rino Falcone, Patrizia Insinnamo
1988 J jnl
Appl. Artif. Intell.
Roberto Caraceni, Oliviero Stock
1987 A conf
EACL
Oliviero Stock
1987 A* conf
ACL
Oliviero Stock
1986 A conf
ECAI
Oliviero Stock
1983 A conf
EACL
Oliviero Stock, Cristiano Castelfranchi, Domenico Parisi
1982 B conf
COLING
Cristiano Castelfranchi, Domenico Parisi, Oliviero Stock
1982 J jnl
SIGART Newsl.
Cristiano Castelfranchi, Domenico Parisi, Oliviero Stock
1980 A* conf
ACL
Giacomo Ferrari, Oliviero Stock
tests/integration/test_pe_extractors.py
← Index tests/integration/test_pe_extractors.py python
"""
Integration tests for PE-specific extractors.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration, pytest.mark.pe]


# ============================================================================
# PEFeaturesExtractor Tests
# ============================================================================

class TestPEFeaturesExtractor:
    """Tests for PEFeaturesExtractor class."""

    def test_extract_valid_pe(self, pe_binary_path, mock_logger):
        """Test extracting features from valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.models.dataclasses import PE

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, PE)

    def test_extract_pe_type(self, pe_binary_path, mock_logger):
        """Test PE type detection (DLL, EXE, DRIVER)."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.type in ["DLL", "EXE", "DRIVER"]

    def test_extract_architecture(self, pe_binary_path, mock_logger):
        """Test architecture detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Architecture should be detected
            assert result.architecture is not None

    def test_extract_entry_point(self, pe_binary_path, mock_logger):
        """Test entry point extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Entry point should be a hex string
            assert result.entry_point.startswith("0x")

    def test_extract_compilation_time(self, pe_binary_path, mock_logger):
        """Test compilation time extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Compilation time should be an integer timestamp
            assert isinstance(result.compilation_time, int)
            assert result.compilation_time_utc is not None

    def test_extract_dotnet_detection(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Should be True for the test .NET binary
            assert isinstance(result.is_dotnet, bool)
            assert result.is_dotnet is True  # Test file is .NET

    def test_extract_headers(self, pe_binary_path, mock_logger):
        """Test header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result.dos_header is not None
            assert result.nt_header is not None
            assert result.file_header is not None
            assert result.optional_header is not None

    def test_extract_counts(self, pe_binary_path, mock_logger):
        """Test section/import/export counts."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert isinstance(result.number_of_sections, int)
            assert isinstance(result.number_of_imports, int)
            assert isinstance(result.number_of_exports, int)
            assert isinstance(result.number_of_resources, int)

    def test_extract_rich_header(self, pe_binary_path, mock_logger):
        """Test Rich header extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Rich header may or may not be present
            # If present, should be JSON string
            if result.rich_header_dump is not None:
                assert isinstance(result.rich_header_dump, str)

    def test_extract_version_info(self, pe_binary_path, mock_logger):
        """Test version info extraction."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # Version info may or may not be present
            if result.version_info is not None:
                assert isinstance(result.version_info, list)


# ============================================================================
# PEImportExtractor Tests
# ============================================================================

class TestPEImportExtractor:
    """Tests for PEImportExtractor class."""

    def test_extract_imports(self, pe_binary_path, mock_logger):
        """Test import extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.models.dataclasses import PEImport

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                assert isinstance(result, PEImport)
                assert isinstance(result.pe_imports_total, int)

    def test_extract_import_libraries(self, pe_binary_path, mock_logger):
        """Test import library extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_libraryName is not None:
                assert isinstance(result.pe_import_libraryName, list)

    def test_extract_import_functions(self, pe_binary_path, mock_logger):
        """Test import function extraction."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and result.pe_import_functions is not None:
                assert isinstance(result.pe_import_functions, list)

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'library_name' in column_names
                assert 'function_name' in column_names


# ============================================================================
# PESectionExtractor Tests
# ============================================================================

class TestPESectionExtractor:
    """Tests for PESectionExtractor class."""

    def test_extract_sections(self, pe_binary_path, mock_logger):
        """Test section extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.models.dataclasses import PESection

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, list)
            assert len(result) > 0
            assert isinstance(result[0], PESection)

    def test_section_properties(self, pe_binary_path, mock_logger):
        """Test section property extraction."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                section = result[0]
                assert section.section_name is not None
                assert section.section_entropy >= 0
                assert section.section_sha256 is not None
                assert section.section_md5 is not None
                assert section.section_size >= 0

    def test_section_entropy_range(self, pe_binary_path, mock_logger):
        """Test that section entropy is in valid range."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None:
                for section in result:
                    assert 0 <= section.section_entropy <= 8

    def test_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test ClickHouse export preparation."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.prepare_export_data("ClickHouseExporter")

            if result is not None:
                data, column_names, column_type_names = result
                assert 'section_name' in column_names
                assert 'section_entropy' in column_names
                assert 'section_sha256' in column_names


# ============================================================================
# PEResourceExtractor Tests
# ============================================================================

class TestPEResourceExtractor:
    """Tests for PEResourceExtractor class."""

    def test_extract_resources(self, pe_binary_path, mock_logger):
        """Test resource extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no resources
            if result is not None:
                assert isinstance(result, list)

    def test_resource_properties(self, pe_binary_path, mock_logger):
        """Test resource property extraction."""
        from redb.extractors.pe_extractors.pe_resources import PEResourceExtractor
        from redb.models.dataclasses import PEResource

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEResourceExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            if result is not None and len(result) > 0:
                resource = result[0]
                assert isinstance(resource, PEResource)
                assert resource.resource_type is not None


# ============================================================================
# PEOverlayExtractor Tests
# ============================================================================

class TestPEOverlayExtractor:
    """Tests for PEOverlayExtractor class."""

    def test_extract_overlay(self, pe_binary_path, mock_logger):
        """Test overlay extraction."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if no overlay
            # If present, should have overlay properties
            if result is not None:
                assert hasattr(result, 'overlay_size')

    def test_has_overlay_check(self, pe_binary_path, mock_logger):
        """Test overlay detection."""
        from redb.extractors.pe_extractors.pe_overlay import PEOverlayExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEOverlayExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            has_overlay = extractor._has_overlay()
            assert isinstance(has_overlay, bool)


# ============================================================================
# PESignatureExtractor Tests
# ============================================================================

class TestPESignatureExtractor:
    """Tests for PESignatureExtractor class."""

    def test_extract_signature(self, pe_binary_path, mock_logger):
        """Test signature extraction."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May be None if not signed
            # Result type depends on implementation

    def test_is_signed_check(self, pe_binary_path, mock_logger):
        """Test signature detection."""
        from redb.extractors.pe_extractors.pe_signature import PESignatureExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESignatureExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_signed = extractor._is_signed()
            assert isinstance(is_signed, bool)


# ============================================================================
# PEDotNetExtractor Tests
# ============================================================================

class TestPEDotNetExtractor:
    """Tests for PEDotNetExtractor class."""

    def test_extract_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET metadata extraction."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # The test file is a .NET binary
            if extractor._check_dotnet():
                assert result is not None

    def test_check_dotnet(self, pe_binary_path, mock_logger):
        """Test .NET detection."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEDotNetExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            is_dotnet = extractor._check_dotnet()
            assert isinstance(is_dotnet, bool)
            # Test file should be .NET
            assert is_dotnet is True


# ============================================================================
# PEInconsistencyTestsExtractor Tests
# ============================================================================

class TestPEInconsistencyTestsExtractor:
    """Tests for PEInconsistencyTestsExtractor class."""

    def test_extract_inconsistency_tests(self, pe_binary_path, mock_logger):
        """Test inconsistency tests extraction."""
        from redb.extractors.pe_extractors.pe_inconsistency_tests import PEInconstistencyTestsExtractor as PEInconsistencyTestsExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEInconsistencyTestsExtractor(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # extract() returns True if tests were performed, False otherwise
            # The actual test results are stored in extractor.pe_inconsistency_tests
            # and extractor.dotnet_inconsistency_tests
            assert result in (True, False)

            if result:
                # Check that test results were stored
                assert extractor.pe_inconsistency_tests is not None or extractor.dotnet_inconsistency_tests is not None


# ============================================================================
# PEExtraFindings Tests
# ============================================================================

class TestPEExtraFindings:
    """Tests for PEExtraFindings class."""

    def test_extract_extra_findings(self, pe_binary_path, mock_logger):
        """Test extra findings extraction."""
        from redb.extractors.pe_extractors.pe_extra_findings import PEExtraFindings

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEExtraFindings(pe_binary_path, mock_logger)

            if extractor.pe is None:
                pytest.skip("PE parsing failed")

            result = extractor.extract()

            # May return None or list of findings
            if result is not None:
                assert isinstance(result, list)


# ============================================================================
# Integration Tests
# ============================================================================

class TestPEExtractorIntegration:
    """Integration tests for PE extractors."""

    def test_all_extractors_same_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test that extractors can share the same PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            # Create extractors sharing the same PE object
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger, pe=pe_object)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger, pe=pe_object)
            sections_ext = PESectionExtractor(pe_binary_path, mock_logger, pe=pe_object)

            # All should use the same PE object
            assert features_ext.pe is pe_object
            assert imports_ext.pe is pe_object
            assert sections_ext.pe is pe_object

            # All should extract successfully
            features_result = features_ext.extract()
            imports_result = imports_ext.extract()
            sections_result = sections_ext.extract()

            assert features_result is not None
            # imports and sections may be None if not present

    def test_hash_consistency_across_extractors(self, pe_binary_path, mock_logger):
        """Test that hashes are consistent across all extractors."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            features_ext = PEFeaturesExtractor(pe_binary_path, mock_logger)
            imports_ext = PEImportExtractor(pe_binary_path, mock_logger)

            # Hashes should be the same
            assert features_ext.sha256 == imports_ext.sha256
            assert features_ext.md5 == imports_ext.md5
            assert features_ext.sha1 == imports_ext.sha1