Neil A. Ernst

121 papers A* 2A 20B 2Journal 69Unranked 23
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Neil A. Ernst, Christoph Treude
2026 J jnl
CoRR
Neil A. Ernst, Ahmed Musa Awon, Swapnil Hingmire, Ze Shi Li
2025 J jnl
CoRR
Luiz Pedro Franciscatto Guerra, Neil A. Ernst
2025 J jnl
CoRR
Adam Alami, Victor Vadmand Jensen, Neil A. Ernst
2025 J jnl
ACM Trans. Softw. Eng. Methodol.
Adam Alami, Victor Vadmand Jensen, Neil A. Ernst
2025 conf
Designing@ICSE
Luiz Pedro Franciscatto Guerra, Neil A. Ernst
2025 J jnl
CoRR
Adam Alami, Nathan Cassee, Thiago Rocha Silva, Elda Paja, Neil A. Ernst
2025 J jnl
CoRR
Eric L. Melin, Ahmed Musa Awon, Nasir U. Eisty, Neil A. Ernst, Shurui Zhou
2025 J jnl
CoRR
Sebastian Baltes, Florian Angermeir, Chetan Arora, Marvin Muñoz Barón, Chunyang Chen, Lukas Böhme, Fabio Calefato, Neil A. Ernst, Davide Falessi, Brian Fitzgerald, Davide Fucci, Marcos Kalinowski, Stefano Lambiase, Daniel Russo, Mircea Lungu, Lutz Prechelt, Paul Ralph, Christoph Treude, Stefan Wagner
2025 conf
CHASE@ICSE
Adam Alami, Neil A. Ernst
2025 J jnl
CoRR
Adam Alami, Neil A. Ernst
2025 J jnl
CoRR
Paris Avgeriou, Ipek Ozkaya, Heiko Koziolek, Zadia Codabux, Neil A. Ernst
2025 J jnl
CoRR
Nathan Cassee, Neil A. Ernst, Nicole Novielli, Alexander Serebrenik
2025 J jnl
Empir. Softw. Eng.
Nathan Cassee, Neil A. Ernst, Nicole Novielli, Alexander Serebrenik
2025 J jnl
CoRR
Swapnil Hingmire, Ze Shi Li, Shiyu Zeng, Ahmed Musa Awon, Luiz Pedro Franciscatto Guerra, Neil A. Ernst
2025 J jnl
Trans. Assoc. Comput. Linguistics
Swapnil Hingmire, Ze Shi Li, Shiyu Zeng, Ahmed Musa Awon, Luiz Pedro Franciscatto Guerra, Neil A. Ernst
2025 J jnl
CoRR
Mootez Saad, José Antonio Hernández López, Boqi Chen, Neil A. Ernst, Dániel Varró, Tushar Sharma
2024 conf
WSESE@ICSE
Adam Alami, Mansooreh Zahedi, Neil A. Ernst
2024 J jnl
CoRR
Adam Alami, Mansooreh Zahedi, Neil A. Ernst
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Martin P. Robillard, Deeksha M. Arya, Neil A. Ernst, Jin L. C. Guo, Maxime Lamothe, Mathieu Nassif, Nicole Novielli, Alexander Serebrenik, Igor Steinmacher, Klaas-Jan Stol
2024 J jnl
J. Syst. Softw.
Daniel Russo, Sebastian Baltes, Niels van Berkel, Paris Avgeriou, Fabio Calefato, Beatriz Cabrero-Daniel, Gemma Catolino, Jürgen Cito, Neil A. Ernst, Thomas Fritz, Hideaki Hata, Reid Holmes, Maliheh Izadi, Foutse Khomh, Mikkel Baun Kjærgaard, Grischa Liebel, Alberto Lluch-Lafuente, Stefano Lambiase, Walid Maalej, Gail C. Murphy, Nils Brede Moe, Gabrielle O'Brien, Elda Paja, Mauro Pezzè, John Stouby Persson, Rafael Prikladnicki, Paul Ralph, Martin P. Robillard, Thiago Rocha Silva, Klaas-Jan Stol, Margaret-Anne D. Storey, Viktoria Stray, Paolo Tell, Christoph Treude, Bogdan Vasilescu
2024 J jnl
Dagstuhl Reports
Paris Avgeriou, Ipek Ozkaya, Heiko Koziolek, Zadia Codabux, Neil A. Ernst
2024 J jnl
CoRR
Paris Avgeriou, Ipek Ozkaya, Alexander Chatzigeorgiou, Marcus Ciolkowski, Neil A. Ernst, Ronald J. Koontz, Eltjo R. Poort, Forrest Shull
2024 J jnl
CoRR
Adam Alami, Neil A. Ernst
2024 conf
CHASE@ICSE
Adam Alami, Neil A. Ernst
2024 A* conf
ICSE
Ze Shi Li, Nowshin Nawar Arony, Kezia Devathasan, Manish Sihag, Neil A. Ernst, Daniela E. Damian
2023 J jnl
Commun. ACM
Maria Teresa Baldassarre, Neil A. Ernst, Ben Hermann, Tim Menzies, Rahul Yedida
2023 A conf
RE
Manish Sihag, Ze Shi Li, Amanda Dash, Nowshin Nawar Arony, Kezia Devathasan, Neil A. Ernst, Alexandra Branzan Albu, Daniela E. Damian
2023 J jnl
CoRR
Neil A. Ernst, Martin P. Robillard
2023 J jnl
Empir. Softw. Eng.
Neil A. Ernst, Martin P. Robillard
2023 J jnl
CoRR
Neil A. Ernst, John Klein, Marco Bartolini, Jeremy Coles, Nick Rees
2023 J jnl
J. Syst. Softw.
Neil A. Ernst, John Klein, Marco Bartolini, Jeremy Coles, Nick Rees
2023 A* conf
ICSE
Amir Ghorbani, Nathan Cassee, Derek Robinson, Adam Alami, Neil A. Ernst, Alexander Serebrenik, Andrzej Wasowski
2023 J jnl
CoRR
Amir Ghorbani, Nathan Cassee, Derek Robinson, Adam Alami, Neil A. Ernst, Alexander Serebrenik, Andrzej Wasowski
2023 J jnl
CoRR
Manish Sihag, Ze Shi Li, Amanda Dash, Nowshin Nawar Arony, Kezia Devathasan, Neil A. Ernst, Alexandra Branzan Albu, Daniela E. Damian
2023 J jnl
CoRR
Rohith Pudari, Neil A. Ernst
2023 J jnl
CoRR
Neil A. Ernst, Maria Teresa Baldassarre
2023 J jnl
Empir. Softw. Eng.
Neil A. Ernst, Maria Teresa Baldassarre
2023 conf
ICSE-FoSE
Paris Avgeriou, Ipek Ozkaya, Alexander Chatzigeorgiou, Marcus Ciolkowski, Neil A. Ernst, Ronald J. Koontz, Eltjo R. Poort, Forrest Shull
2023 J jnl
CoRR
Ze Shi Li, Nowshin Nawar Arony, Kezia Devathasan, Manish Sihag, Neil A. Ernst, Daniela E. Damian
2022 J jnl
IEEE Trans. Software Eng.
Richard Torkar, Carlo A. Furia, Robert Feldt, Francisco Gomes de Oliveira Neto, Lucas Gren, Per Lenberg, Neil A. Ernst
2022 J jnl
IEEE Softw.
Neil A. Ernst, Gabriele Bavota
2022 J jnl
CoRR
Neil A. Ernst, Gabriele Bavota
2022 J jnl
Empir. Softw. Eng.
Alvi Mahadi, Neil A. Ernst, Karan Tongay
2022 J jnl
IEEE Trans. Software Eng.
Colin M. Werner, Ze Shi Li, Derek Lowlind, Omar Elazhary, Neil A. Ernst, Daniela E. Damian
2022 J jnl
CoRR
Derek Robinson, Neil A. Ernst, Enrique Larios Vargas, Margaret-Anne D. Storey
2022 A conf
ICPC
Derek Robinson, Neil A. Ernst, Enrique Larios Vargas, Margaret-Anne D. Storey
2022 A conf
RE
Ze Shi Li, Manish Sihag, Nowshin Nawar Arony, Joao Bezerra Junior, Thanh Phan, Neil A. Ernst, Daniela E. Damian
2022 J jnl
CoRR
Ze Shi Li, Manish Sihag, Nowshin Nawar Arony, Joao Bezerra Junior, Thanh Phan, Neil A. Ernst, Daniela E. Damian
2022 ed.
TechDebt@ICSE
Neil A. Ernst, Valentina Lenarduzzi, Tushar Sharma
2022 J jnl
Inf. Softw. Technol.
Ze Shi Li, Colin M. Werner, Neil A. Ernst, Daniela E. Damian
2022 J jnl
IEEE Trans. Software Eng.
Omar Elazhary, Colin M. Werner, Ze Shi Li, Derek Lowlind, Neil A. Ernst, Margaret-Anne D. Storey
2021 conf
ICSE (NIER)
Omar Elazhary, Margaret-Anne D. Storey, Neil A. Ernst, Elise Paradis
2021 J jnl
CoRR
Omar Elazhary, Margaret-Anne D. Storey, Neil A. Ernst, Elise Paradis
2021 J jnl
CoRR
Alvi Mahadi, Neil A. Ernst, Karan Tongay
2021 J jnl
CoRR
Colin M. Werner, Ze Shi Li, Derek Lowlind, Omar Elazhary, Neil A. Ernst, Daniela E. Damian
2021 J jnl
CoRR
Maria Teresa Baldassarre, Neil A. Ernst, Ben Hermann, Tim Menzies, Rahul Yedida
2021 J jnl
J. Syst. Softw.
Neil A. Ernst, Mark Hills, Árpád Beszédes
2021 ed.
REFSQ Workshops
Fatma Basak Aydemir, Catarina Gralha, Maya Daneva, Eduard C. Groen, Andrea Herrmann, Patrick Mennig, Sallam Abualhaija, Alessio Ferrari, Jin Guo, Renata S. S. Guizzardi, Jennifer Horkoff, Anna Perini, Angelo Susi, Travis D. Breaux, Xavier Franch, Neil A. Ernst, Elda Paja, Norbert Seyff
2021 J jnl
CoRR
Omar Elazhary, Colin M. Werner, Ze Shi Li, Derek Lowlind, Neil A. Ernst, Margaret-Anne D. Storey
2021 J jnl
Empir. Softw. Eng.
Neil A. Ernst, Jeffrey C. Carver, Daniel Méndez, Marco Torchiano
2021 J jnl
CoRR
Matthew Ehrler, Neil A. Ernst
2020 B conf
VL/HCC
Andreas P. Koenzen, Neil A. Ernst, Margaret-Anne D. Storey
2020 J jnl
CoRR
Andreas Koenzen, Neil A. Ernst, Margaret-Anne D. Storey
2020 A conf
SANER
Alvi Mahadi, Karan Tongay, Neil A. Ernst
2020 J jnl
CoRR
Alvi Mahadi, Karan Tongay, Neil A. Ernst
2020 J jnl
CoRR
Ze Shi Li, Colin M. Werner, Neil A. Ernst, Daniela E. Damian
2020 A conf
RE
Colin M. Werner, Ze Shi Li, Neil A. Ernst, Daniela E. Damian
2020 J jnl
CoRR
Colin M. Werner, Ze Shi Li, Neil A. Ernst, Daniela E. Damian
2020 J jnl
Empir. Softw. Eng.
Margaret-Anne D. Storey, Neil A. Ernst, Courtney Williams, Eirini Kalliamvakou
2020 J jnl
CoRR
Neil A. Ernst, Jeffrey C. Carver, Daniel Méndez, Marco Torchiano
2019 conf
ICSA Companion
Neil A. Ernst, Rick Kazman, Philip Bianco
2019 conf
RE Workshops
Ze Shi Li, Colin M. Werner, Neil A. Ernst
2019 A conf
ICSME
Omar Elazhary, Margaret-Anne D. Storey, Neil A. Ernst, Andy Zaidman
2019 J jnl
CoRR
Omar Elazhary, Margaret-Anne D. Storey, Neil A. Ernst, Andy Zaidman
2019 J jnl
CoRR
Courtney Williams, Margaret-Anne D. Storey, Neil A. Ernst, Alexey Zagalsky, Eirini Kalliamvakou
2019 conf
RE Workshops
Colin M. Werner, Ze Shi Li, Neil A. Ernst
2018 J jnl
CoRR
Neil A. Ernst
2018 A conf
MSR
Neil A. Ernst
2018 A conf
ICSA
Ian Gorton, Barbora Buhnova, Neil A. Ernst, Clemens A. Szyperski
2018 conf
RoSE@ICSE
Neil A. Ernst, Rick Kazman, Philip Bianco
2017 A conf
RE
George Mathew, Tim Menzies, Neil A. Ernst, John Klein
2017 J jnl
Empir. Softw. Eng.
Richard F. Paige, Jordi Cabot, Neil A. Ernst
2017 A conf
ICSME
Martin P. Robillard, Andrian Marcus, Christoph Treude, Gabriele Bavota, Oscar Chaparro, Neil A. Ernst, Marco Aurélio Gerosa, Michael W. Godfrey, Michele Lanza, Mario Linares Vásquez, Gail C. Murphy, Laura Moreno, David C. Shepherd, Edmund Wong
2017 J jnl
CoRR
George Mathew, Tim Menzies, Neil A. Ernst, John Klein
2017 conf
ICSA Workshops
Neil A. Ernst, John Klein, George Mathew, Tim Menzies
2017 A conf
ICSA
Neil A. Ernst, Stephany Bellomo, Ipek Ozkaya, Robert L. Nord
2017 J jnl
CoRR
Neil A. Ernst, Stephany Bellomo, Ipek Ozkaya, Robert L. Nord
2016 conf
WICSA
Neil A. Ernst, Mary Popeck, Felix Bachmann, Patrick Donohoe
2016 J jnl
ACM SIGSOFT Softw. Eng. Notes
Paris Avgeriou, Neil A. Ernst, Robert L. Nord, Philippe Kruchten
2015 ed.
EmpiRE
Richard Berntsson-Svensson, Maya Daneva, Neil A. Ernst, Sabrina Marczak, Nazim H. Madhavji
2015 conf
BigData Congress
John Klein, Ian Gorton, Neil A. Ernst, Patrick Donohoe, Kim Pham, Chrisjan Matser
2015 conf
ESEC/SIGSOFT FSE
Neil A. Ernst, Stephany Bellomo, Ipek Ozkaya, Robert L. Nord, Ian Gorton
2015 conf
MTD@ICSME
Neil A. Ernst, Paris Avgeriou, Philippe Kruchten
2015 conf
PABS@ICPE
John Klein, Ian Gorton, Neil A. Ernst, Patrick Donohoe, Kim Pham, Chrisjan Matser
2014 J jnl
Inf. Syst.
Neil A. Ernst, Alexander Borgida, Ivan Jureta, John Mylopoulos
2014 ch.
Evolving Software Systems
Neil A. Ernst, Alexander Borgida, Ivan Jureta, John Mylopoulos
2014 A conf
ICSME
Stephany Bellomo, Neil A. Ernst, Robert L. Nord, Ipek Ozkaya
2014 J jnl
ACM Trans. Manag. Inf. Syst.
Ivan Jureta, Alexander Borgida, Neil A. Ernst, John Mylopoulos
2014 A conf
DSN
Stephany Bellomo, Neil A. Ernst, Robert L. Nord, Rick Kazman
2014 conf
AIRE
Neil A. Ernst, Ian Gorton
2013 J jnl
Empir. Softw. Eng.
Abram Hindle, Neil A. Ernst, Michael W. Godfrey, John Mylopoulos
2013 conf
TwinPeaks@RE
Neil A. Ernst, Ipek Ozkaya, Robert L. Nord, Julien Delange, Stephany Bellomo, Ian Gorton
2012 A conf
CAiSE
Neil A. Ernst, Alexander Borgida, John Mylopoulos, Ivan Jureta
2012 conf
EmpiRE
Neil A. Ernst, Gail C. Murphy
2012 conf
MTD@ICSE
Neil A. Ernst
2012
Neil A. Ernst
2011 A conf
MSR
Abram Hindle, Neil A. Ernst, Michael W. Godfrey, John Mylopoulos
2011 A conf
RE
Neil A. Ernst, Alexander Borgida, Ivan Jureta
2011 J jnl
CoRR
Ivan Jureta, Alexander Borgida, Neil A. Ernst
2011 conf
EVOL/IWPSE
Neil A. Ernst, Alexander Borgida, John Mylopoulos
2010 J jnl
CoRR
Neil A. Ernst, Steve M. Easterbrook, John Mylopoulos
2010 B conf
REFSQ
Neil A. Ernst, John Mylopoulos
2010 A conf
ER
Neil A. Ernst, John Mylopoulos, Alexander Borgida, Ivan Jureta
2010 A conf
RE
Ivan Jureta, Alexander Borgida, Neil A. Ernst, John Mylopoulos
2010 conf
RE@RunTime
Nauman A. Qureshi, Anna Perini, Neil A. Ernst, John Mylopoulos
2009 J jnl
LNCS Trans. Aspect Oriented Softw. Dev.
Nan Niu, Yijun Yu, Bruno González-Baixauli, Neil A. Ernst, Julio César Sampaio do Prado Leite, John Mylopoulos
2008 A conf
RE
Neil A. Ernst, John Mylopoulos, Yijun Yu, Tien Nguyen
2007 conf
MiSE@ICSE
Jorge Aranda, Neil A. Ernst, Jennifer Horkoff, Steve M. Easterbrook
2005 J jnl
Int. J. Hum. Comput. Stud.
Neil A. Ernst, Margaret-Anne D. Storey, Polly Allen
2002 A conf
IUI
Margaret-Anne D. Storey, Natasha F. Noy, Mark A. Musen, Casey Best, Ray W. Fergerson, Neil A. Ernst
tests/integration/test_pe_extractor.py
← Index tests/integration/test_pe_extractor.py python
"""
Integration tests for the PEExtractor base class.
"""
import pytest
from unittest.mock import Mock, patch, MagicMock

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


class TestPEExtractorInitialization:
    """Tests for PEExtractor initialization."""

    def test_pe_extractor_with_valid_pe(self, pe_binary_path, mock_logger):
        """Test PEExtractor initialization with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            assert extractor.pe is not None
            assert extractor.filepath == pe_binary_path

    def test_pe_extractor_with_provided_pe_object(self, pe_binary_path, mock_logger, pe_object):
        """Test PEExtractor initialization with pre-existing PE object."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should use the provided PE object, not create a new one
            assert extractor.pe is pe_object

    def test_pe_extractor_with_invalid_file(self, elf_binary_path, mock_logger):
        """Test PEExtractor initialization with non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return None for pe when file is not a valid PE
            assert extractor.pe is None
            # Logger should have recorded an error
            assert mock_logger.error.called


class TestPEExtractorMethods:
    """Tests for PEExtractor helper methods."""

    def test_check_dotnet_true(self, pe_binary_path, mock_logger):
        """Test _check_dotnet returns True for .NET PE."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # The test PE file is a .NET binary
            if extractor.pe is not None:
                result = extractor._check_dotnet()
                # d8637bdbcfc9112fcb1f0167b398e771 is a .NET binary
                assert result is True

    def test_check_dotnet_false(self, elf_binary_path, mock_logger):
        """Test _check_dotnet returns False for non-PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return False when PE is None
            result = extractor._check_dotnet()
            assert result is False

    def test_is_signed_false(self, pe_binary_path, mock_logger):
        """Test _is_signed method."""
        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 not None:
                result = extractor._is_signed()
                # Result depends on the actual binary
                assert isinstance(result, bool)

    def test_has_overlay(self, pe_binary_path, mock_logger):
        """Test _has_overlay method."""
        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 not None:
                result = extractor._has_overlay()
                assert isinstance(result, bool)


class TestGeneratePEFileObject:
    """Tests for _generate_pefile_object method."""

    def test_generate_pefile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_pefile_object with valid PE file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # The PE object should be created successfully
            assert extractor.pe is not None

    def test_generate_pefile_object_invalid(self, temp_text_file, mock_logger):
        """Test _generate_pefile_object with invalid file."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

            # Should return None for invalid PE
            assert extractor.pe is None


class TestGenerateDotNetFileObject:
    """Tests for _generate_dotnetfile_object method."""

    def test_generate_dotnetfile_object_valid(self, pe_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with .NET PE file."""
        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 not None and extractor._check_dotnet():
                dotnet, error = extractor._generate_dotnetfile_object()
                # Should create dotnet object for .NET PE
                assert dotnet is not None
                assert error is None

    def test_generate_dotnetfile_object_invalid(self, elf_binary_path, mock_logger):
        """Test _generate_dotnetfile_object with non-.NET file."""
        from redb.extractors.pe_extractors.pe_dotnet import PEDotNetExtractor

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

            dotnet, error = extractor._generate_dotnetfile_object()
            # Should return error for non-.NET file
            assert dotnet is None
            assert error is not None


class TestPEExtractorTag:
    """Tests for tag method in PE extractors."""

    def test_pe_features_tag(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEFeaturesExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_FEATURES.value

    def test_pe_import_tag(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PEImportExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_IMPORT.value

    def test_pe_section_tag(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct tag."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = PESectionExtractor(pe_binary_path, mock_logger)
            assert extractor.tag() == Tag.PE_SECTION.value


class TestPEExtractorClickHouseTable:
    """Tests for get_clickhouse_table method in PE extractors."""

    def test_pe_features_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEFeaturesExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_features import PEFeaturesExtractor

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

    def test_pe_import_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PEImportExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_imports import PEImportExtractor

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

    def test_pe_section_clickhouse_table(self, pe_binary_path, mock_logger):
        """Test that PESectionExtractor returns correct ClickHouse table name."""
        from redb.extractors.pe_extractors.pe_sections import PESectionExtractor

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


class TestPEExtractorPrepareExportData:
    """Tests for prepare_export_data method in PE extractors."""

    def test_pe_features_prepare_export_elasticsearch(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        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 not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ElasticsearchExporter")
                # Should return the pe_features dataclass
                assert result is extractor.pe_features

    def test_pe_features_prepare_export_clickhouse(self, pe_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        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 not None:
                # First extract
                extractor.extract()
                result = extractor.prepare_export_data("ClickHouseExporter")

                # Should return tuple of (data, column_names, column_type_names)
                assert isinstance(result, tuple)
                assert len(result) == 3
                data, column_names, column_type_names = result
                assert isinstance(data, list)
                assert isinstance(column_names, list)
                assert isinstance(column_type_names, list)
                # Column names and types should match in length
                assert len(column_names) == len(column_type_names)