Radoslaw Niewiadomski

99 papers A 4B 29C 1Journal 30Unranked 34
YearRankTypeTitle / Venue / Authors
2025 conf
IUI Companion
Selim Soufargi, Radoslaw Niewiadomski, Hunter Fong, Maurizio Mancini
2025 J jnl
Comput. Graph.
Magdalena Igras-Cybulska, Artur Cybulski, John Liu, Maryla Kuczynska, Agnieszka Dopierala, Radoslaw Niewiadomski, Daria Hemmerling, Isam Leebe, Gabriela Zapolska, Slawomir Konrad Tadeja
2025 A conf
Conference on Designing Interactive Systems (Companion Volume)
Hunter Fong, Selim Soufargi, Maurizio Mancini, Radoslaw Niewiadomski
2025 conf
ICSR+AI (1)
Carlesso Serena, Abdul Kader Mohamed Ismail, Giuseppe Di Cesare, Alessandra Sciutti, Radoslaw Niewiadomski
2025 conf
CHIRA (3)
Yifei Li, Hunter Fong, Maurizio Mancini, Radoslaw Niewiadomski
2025 conf
ICSR+AI (1)
Hunter Fong, Selim Soufargi, Yifei Li, Maurizio Mancini, Radoslaw Niewiadomski
2025 conf
CHItaly
Hunter Fong, Radoslaw Niewiadomski, Magdalena Igras-Cybulska
2025 J jnl
IEEE Trans. Affect. Comput.
Radoslaw Niewiadomski, Lea Chauvigne, Maurizio Mancini, Gualtiero Volpe, Antonio Camurri
2025 J jnl
IEEE Access
Irem Arici, Radoslaw Niewiadomski
2025 A conf
Conference on Designing Interactive Systems (Companion Volume)
Radoslaw Niewiadomski, Cigdem Beyan
2024 B conf
IVA
Maurizio Mancini, Radoslaw Niewiadomski, Gabriele De Lucia, Francesco Maria Longobardi
2024 conf
ICMI Companion
Kheder Yazgi, Cigdem Beyan, Maurizio Mancini, Radoslaw Niewiadomski
2024 J jnl
Int. J. Soc. Robotics
Maria Elena Lechuga Redondo, Radoslaw Niewiadomski, Francesco Rea, Sara Incao, Giulio Sandini, Alessandra Sciutti
2024 B conf
AVI
Noemi Canovi, Federico Montagna, Radoslaw Niewiadomski, Alessandra Sciutti, Giuseppe Di Cesare, Cigdem Beyan
2024 conf
ICMI Companion
Albana Hoxha, Hunter Fong, Radoslaw Niewiadomski
2024 B conf
ICMI
Radoslaw Niewiadomski, Ferran Altarriba Bertran, Christopher Dawes, Marianna Obrist, Maurizio Mancini
2024 conf
XR (2)
Andrea Chirico, Tommaso Palombi, Giovanna Varni, Radoslaw Niewiadomski, Yifei Li, Fabio Lucidi, Maurizio Mancini
2024 J jnl
IEEE Access
Matteo Cinelli, Gabriele Etta, Valentina Franzoni, Maurizio Mancini, Radoslaw Niewiadomski
2024 B conf
ACII
Marina Tiuleneva, Emanuele Castano, Radoslaw Niewiadomski
2024 B conf
AVI
Maurizio Mancini, Andrea Chirico, Radoslaw Niewiadomski, Giovanna Varni, Tommaso Palombi, Fabio Alivernini, Fabio Lucidi
2024 B conf
AVI
Chiara Gulino, Radoslaw Niewiadomski
2024 B conf
AVI
Marina Tiuleneva, Emanuele Castano, Radoslaw Niewiadomski
2023 J jnl
IEEE Trans. Haptics
Radoslaw Niewiadomski, Cigdem Beyan, Alessandra Sciutti
2023 conf
ACIIW
Maurizio Mancini, Matteo Cinelli, Gabriele Etta, Paul Ciurla, Radoslaw Niewiadomski, Walter Quattrociocchi, Valentina Franzoni
2023 J jnl
IEEE Trans. Affect. Comput.
Cigdem Beyan, Sukumar Karumuri, Gualtiero Volpe, Antonio Camurri, Radoslaw Niewiadomski
2023 J jnl
Frontiers Comput. Sci.
Radoslaw Niewiadomski, Fanny Larradet, Giacinto Barresi, Leonardo S. Mattos
2023 J jnl
IEEE Access
Moreno D'Incà, Cigdem Beyan, Radoslaw Niewiadomski, Simone Barattin, Nicu Sebe
2022 J jnl
IEEE Trans. Affect. Comput.
Temitayo A. Olugbade, Joseph W. Newbold, Rose M. G. Johnson, Erica Volta, Paolo Alborno, Radoslaw Niewiadomski, Max Dillon, Gualtiero Volpe, Nadia Bianchi-Berthouze
2022 B conf
ICMI
Maria Elena Lechuga Redondo, Radoslaw Niewiadomski, Francesco Rea, Alessandra Sciutti
2022 J jnl
Frontiers Comput. Sci.
Maurizio Mancini, Nicoletta Cavazza, Suzanne Higgs, Gijs Huisman, Janet van den Boer, Radoslaw Niewiadomski
2022 B conf
AVI
Eleonora Ceccaldi, Gabriele De Lucia, Radoslaw Niewiadomski, Gualtiero Volpe, Maurizio Mancini
2022 J jnl
Frontiers Comput. Sci.
Radoslaw Niewiadomski, Merijn Bruijnes, Gijs Huisman, Conor Patrick Gallagher, Maurizio Mancini
2022 B conf
ICMI
Radoslaw Niewiadomski, Gabriele De Lucia, Gabriele Grazzi, Maurizio Mancini
2021 conf
HRI (Companion)
Maria Elena Lechuga Redondo, Alessandra Sciutti, Sara Incao, Francesco Rea, Radoslaw Niewiadomski
2021 A conf
IUI
Radoslaw Niewiadomski, Alessandra Sciutti
2020 B conf
ICSR
Maria Elena Lechuga Redondo, Alessia Vignolo, Radoslaw Niewiadomski, Francesco Rea, Alessandra Sciutti
2020 conf
ICMI Companion
Conor Patrick Gallagher, Radoslaw Niewiadomski, Merijn Bruijnes, Gijs Huisman, Maurizio Mancini
2020 B conf
AVI
Maurizio Mancini, Conor Patrick Gallagher, Radoslaw Niewiadomski, Gijs Huisman, Merijn Bruijnes
2020 conf
CHI Extended Abstracts
Maurizio Mancini, Radoslaw Niewiadomski, Gijs Huisman, Merijn Bruijnes, Conor Patrick Gallagher
2020 J jnl
J. Multimodal User Interfaces
Vincenzo Lussu, Radoslaw Niewiadomski, Gualtiero Volpe, Antonio Camurri
2019 C conf
MIG
Chiara Bassano, Giorgio Ballestin, Eleonora Ceccaldi, Fanny Isabelle Larradet, Maurizio Mancini, Erica Volta, Radoslaw Niewiadomski
2019 J jnl
ACM Trans. Interact. Intell. Syst.
Radoslaw Niewiadomski, Ksenia Kolykhalova, Stefano Piana, Paolo Alborno, Gualtiero Volpe, Antonio Camurri
2019 B conf
ACII
Erica Volta, Radoslaw Niewiadomski, Temitayo A. Olugbade, Carla Gilio, Elena Cocchi, Nadia Berthouze, Monica Gori, Gualtiero Volpe
2019 conf
UbiComp/ISWC Adjunct
Fanny Larradet, Radoslaw Niewiadomski, Giacinto Barresi, Leonardo S. Mattos
2019 J jnl
Frontiers Robotics AI
Radoslaw Niewiadomski, Eleonora Ceccaldi, Gijs Huisman, Gualtiero Volpe, Maurizio Mancini
2019 J jnl
J. Multimodal User Interfaces
Radoslaw Niewiadomski, Maurizio Mancini, Andrea Cera, Stefano Piana, Corrado Canepa, Antonio Camurri
2019 conf
CHI Extended Abstracts
Sukumar Karumuri, Radoslaw Niewiadomski, Gualtiero Volpe, Antonio Camurri
2019 J jnl
CoRR
Paolo Alborno, Gualtiero Volpe, Maurizio Mancini, Radoslaw Niewiadomski, Stefano Piana, Antonio Camurri
2018 J jnl
CoRR
Temitayo A. Olugbade, Joseph W. Newbold, Rose M. G. Johnson, Erica Volta, Paolo Alborno, Radoslaw Niewiadomski, Max Dillon, Gualtiero Volpe, Nadia Bianchi-Berthouze
2018 conf
MOCO
Radoslaw Niewiadomski, Lea Chauvigne, Maurizio Mancini, Antonio Camurri
2017 J jnl
IEEE Trans. Affect. Comput.
Maurizio Mancini, Radoslaw Niewiadomski, Shuji Hashimoto, Mary Ellen Foster, Stefan Scherer, Gualtiero Volpe
2017 B conf
ICMI
Radoslaw Niewiadomski, Maurizio Mancini, Stefano Piana, Paolo Alborno, Gualtiero Volpe, Antonio Camurri
2016 conf
UbiComp Adjunct
Antonio Camurri, Corrado Canepa, Nicola Ferrari, Maurizio Mancini, Radoslaw Niewiadomski, Stefano Piana, Gualtiero Volpe, Jean-Marc Matos, Pablo Palacio, Muriel Romero
2016 B conf
AVI
Paolo Alborno, Stefano Piana, Maurizio Mancini, Radoslaw Niewiadomski, Gualtiero Volpe, Antonio Camurri
2016 J jnl
IEEE Trans. Hum. Mach. Syst.
Radoslaw Niewiadomski, Maurizio Mancini, Giovanna Varni, Gualtiero Volpe, Antonio Camurri
2016 conf
SERVE@AVI
Gualtiero Volpe, Paolo Alborno, Antonio Camurri, Paolo Coletta, Simone Ghisio, Maurizio Mancini, Radoslaw Niewiadomski, Stefano Piana
2016 conf
CHI Extended Abstracts
Stefano Piana, Paolo Alborno, Radoslaw Niewiadomski, Maurizio Mancini, Gualtiero Volpe, Antonio Camurri
2016 conf
MOCO
Antonio Camurri, Gualtiero Volpe, Stefano Piana, Maurizio Mancini, Radoslaw Niewiadomski, Nicola Ferrari, Corrado Canepa
2016 conf
MOCO
Stefano Piana, Paolo Coletta, Simone Ghisio, Radoslaw Niewiadomski, Maurizio Mancini, Roberto Sagoleo, Gualtiero Volpe, Antonio Camurri
2016 conf
HBU
Vincenzo Lussu, Radoslaw Niewiadomski, Gualtiero Volpe, Antonio Camurri
2015 J jnl
EAI Endorsed Trans. Collab. Comput.
Ksenia Kolykhalova, Antonio Camurri, Gualtiero Volpe, Marcello Sanguineti, Enrico Puppo, Radoslaw Niewiadomski
2015 conf
INTETAIN
Ksenia Kolykhalova, Antonio Camurri, Gualtiero Volpe, Marcello Sanguineti, Enrico Puppo, Radoslaw Niewiadomski
2015 conf
CHItaly
Radoslaw Niewiadomski, Maurizio Mancini, Gualtiero Volpe, Antonio Camurri
2015 B conf
ACII
Radoslaw Niewiadomski, Yu Ding, Maurizio Mancini, Catherine Pelachaud, Gualtiero Volpe, Antonio Camurri
2015 J jnl
ACM Trans. Appl. Percept.
Radoslaw Niewiadomski, Catherine Pelachaud
2014 conf
CHI Extended Abstracts
Maurizio Mancini, Giovanna Varni, Radoslaw Niewiadomski, Gualtiero Volpe, Antonio Camurri
2014 B conf
ICMI
Radoslaw Niewiadomski, Maurizio Mancini, Yu Ding, Catherine Pelachaud, Gualtiero Volpe
2013 conf
eNTERFACE
Maurizio Mancini, Laurent Ach, Emeline Bantegnie, Tobias Baur, Nadia Berthouze, Debajyoti Datta, Yu Ding, Stéphane Dupont, Harry J. Griffin, Florian Lingenfelser, Radoslaw Niewiadomski, Catherine Pelachaud, Olivier Pietquin, Bilal Piot, Jérôme Urbain, Gualtiero Volpe, Johannes Wagner
2013 A conf
AAMAS
Radoslaw Niewiadomski, Jennifer Hofmann, Jérôme Urbain, Tracey Platt, Johannes Wagner, Bilal Piot, Hüseyin Çakmak, Sathish Pammi, Tobias Baur, Stéphane Dupont, Matthieu Geist, Florian Lingenfelser, Gary McKeown, Olivier Pietquin, Willibald Ruch
2013 conf
HBU
Radoslaw Niewiadomski, Maurizio Mancini, Tobias Baur, Giovanna Varni, Harry J. Griffin, Min S. H. Aung
2013 ch.
Emotion-Oriented Systems
Sylwia Julia Hyniewska, Radoslaw Niewiadomski, Catherine Pelachaud
2013 conf
INTETAIN
Jérôme Urbain, Radoslaw Niewiadomski, Maurizio Mancini, Harry J. Griffin, Hüseyin Çakmak, Laurent Ach, Gualtiero Volpe
2012 conf
FAA
Bingqing Qu, Sathish Pammi, Radoslaw Niewiadomski, Gérard Chollet
2012 conf
AAAI Fall Symposium: Artificial Intelligence of Humor
Tracey Platt, Jennifer Hofmann, Willibald Ruch, Radoslaw Niewiadomski, Jérôme Urbain
2012 J jnl
Cogn. Process.
Magalie Ochs, Radoslaw Niewiadomski, Paul M. Brunet, Catherine Pelachaud
2012 B conf
IVA
Radoslaw Niewiadomski, Catherine Pelachaud
2011 J jnl
IEEE Trans. Affect. Comput.
Radoslaw Niewiadomski, Sylwia Julia Hyniewska, Catherine Pelachaud
2011 conf
Web3D
Radoslaw Niewiadomski, Mohammad Obaid, Elisabetta Bevacqua, Julian Looser, Le Quoc Anh, Catherine Pelachaud
2011 J jnl
Presence Teleoperators Virtual Environ.
Virginie Demeure, Radoslaw Niewiadomski, Catherine Pelachaud
2011 B conf
IVA
Mohammad Obaid, Radoslaw Niewiadomski, Catherine Pelachaud
2010 J jnl
J. Multimodal User Interfaces
Jérôme Urbain, Radoslaw Niewiadomski, Elisabetta Bevacqua, Thierry Dutoit, Alexis Moinet, Catherine Pelachaud, Benjamin Picart, Joëlle Tilmanne, Johannes Wagner
2010 J jnl
Int. J. Hum. Comput. Stud.
Radoslaw Niewiadomski, Catherine Pelachaud
2010 J jnl
Tech. Sci. Informatiques
Etienne de Sevin, Radoslaw Niewiadomski, Elisabetta Bevacqua, André-Marie Pez, Maurizio Mancini, Catherine Pelachaud
2010 B conf
IVA
Magalie Ochs, Radoslaw Niewiadomski, Catherine Pelachaud
2010 B conf
LREC
Jérôme Urbain, Elisabetta Bevacqua, Thierry Dutoit, Alexis Moinet, Radoslaw Niewiadomski, Catherine Pelachaud, Benjamin Picart, Joëlle Tilmanne, Johannes Wagner
2010 conf
SSPW@MM
Radoslaw Niewiadomski, Ken Prepin, Elisabetta Bevacqua, Magalie Ochs, Catherine Pelachaud
2010 B conf
IVA
Radoslaw Niewiadomski, Virginie Demeure, Catherine Pelachaud
2009 B conf
ACII
Radoslaw Niewiadomski, Sylwia Julia Hyniewska, Catherine Pelachaud
2009 conf
AAMAS (2)
Radoslaw Niewiadomski, Elisabetta Bevacqua, Maurizio Mancini, Catherine Pelachaud
2009 B conf
IVA
Radoslaw Niewiadomski, Sylwia Julia Hyniewska, Catherine Pelachaud
2008 B conf
IVA
Radoslaw Niewiadomski, Magalie Ochs, Catherine Pelachaud
2007 B conf
IVA
Radoslaw Niewiadomski, Catherine Pelachaud
2007 B conf
ACII
Radoslaw Niewiadomski, Catherine Pelachaud
2006 J jnl
Rev. d'Intelligence Artif.
Magalie Ochs, Radoslaw Niewiadomski, Catherine Pelachaud, David Sadek
2006 conf
ZiF Workshop
Isabella Poggi, Radoslaw Niewiadomski, Catherine Pelachaud
2006 J jnl
Int. J. Humanoid Robotics
Jean-Claude Martin, Radoslaw Niewiadomski, Laurence Devillers, Stéphanie Buisine, Catherine Pelachaud
2006 B conf
IVA
Stéphanie Buisine, Sarkis Abrilian, Radoslaw Niewiadomski, Jean-Claude Martin, Laurence Devillers, Catherine Pelachaud
2005 B conf
ACII
Magalie Ochs, Radoslaw Niewiadomski, Catherine Pelachaud, David Sadek
2004 conf
ICCSA (3)
Alfredo Milani, Chiara Morici, Radoslaw Niewiadomski
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                index_prefix="custom_prefix"
            )

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_benign=True
            )

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_malicious=True
            )

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()
            # Should succeed with no exporters (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result