Ian R. Manchester

183 papers A* 7A 4C 18Journal 113Unranked 41
YearRankTypeTitle / Venue / Authors
2026 J jnl
Autom.
Patricia Pauli, Ruigang Wang, Ian R. Manchester, Frank Allgöwer
2026 J jnl
CoRR
Arthur C. B. de Oliveira, Ruigang Wang, Ian R. Manchester, Eduardo D. Sontag
2026 J jnl
CoRR
Xinyu Huang, Shyam Karthick V. B, Taozhao Chen, Mitch Bryson, Thomas Chaffey, Huaming Chen, Kim-Kwang Raymond Choo, Ian R. Manchester
2025 conf
CDC
Francesco Bullo, Samuel Coogan, Emiliano Dall'Anese, Ian R. Manchester, Giovanni Russo
2025 J jnl
CoRR
Raghav Mishra, Ian R. Manchester
2025 J jnl
CoRR
Andrea Martin, Ian R. Manchester, Luca Furieri
2025 J jnl
CoRR
Kanghong Shi, Ruigang Wang, Ian R. Manchester
2025 J jnl
CoRR
Ruigang Wang, Krishnamurthy Dvijotham, Ian R. Manchester
2025 J jnl
IEEE Trans. Autom. Control.
Bowen Yi, Chi Jin, Lei Wang, Guodong Shi, Viorela Ila, Ian R. Manchester
2025 J jnl
CoRR
Nicholas H. Barbara, Ruigang Wang, Ian R. Manchester
2025 J jnl
CoRR
Nicholas H. Barbara, Ruigang Wang, Alexandre Megretski, Ian R. Manchester
2025 conf
CDC
Yurui Zhang, Ruigang Wang, Ian R. Manchester
2025 J jnl
CoRR
Yurui Zhang, Ruigang Wang, Ian R. Manchester
2025 J jnl
CoRR
Mikolaj Kliniewski, Jesse Morris, Ian R. Manchester, Viorela Ila
2024 J jnl
IEEE Trans. Autom. Control.
Bowen Yi, Lei Wang, Ian R. Manchester
2024 conf
CDC
Dongjun Wu, Bowen Yi, Ian R. Manchester
2024 J jnl
CoRR
Dongjun Wu, Bowen Yi, Ian R. Manchester
2024 J jnl
CoRR
Fletcher Fan, Bowen Yi, David C. Rye, Guodong Shi, Ian R. Manchester
2024 conf
CDC
Jing Cheng, Ruigang Wang, Ian R. Manchester
2024 J jnl
CoRR
Jing Cheng, Ruigang Wang, Ian R. Manchester
2024 J jnl
CoRR
Patricia Pauli, Ruigang Wang, Ian R. Manchester, Frank Allgöwer
2024 A* conf
ICML
Ruigang Wang, Krishnamurthy Dj Dvijotham, Ian R. Manchester
2024 J jnl
CoRR
Ruigang Wang, Krishnamurthy Dvijotham, Ian R. Manchester
2024 J jnl
Syst. Control. Lett.
Bowen Yi, Ian R. Manchester
2024 J jnl
CoRR
Nicholas H. Barbara, Ruigang Wang, Ian R. Manchester
2024 J jnl
IEEE Trans. Autom. Control.
Bowen Yi, Ian R. Manchester
2024 A conf
IROS
Damian Abood, Ian R. Manchester
2024 J jnl
CoRR
Damian Abood, Ian R. Manchester
2024 A conf
IROS
Tara Bartlett, Ian R. Manchester
2024 J jnl
CoRR
Tara Bartlett, Ian R. Manchester
2024 J jnl
IEEE Trans. Autom. Control.
Max Revay, Ruigang Wang, Ian R. Manchester
2023 J jnl
Autom.
Lei Wang, Ian R. Manchester, Jochen Trumpf, Guodong Shi
2023 A* conf
ICML
Ruigang Wang, Ian R. Manchester
2023 J jnl
CoRR
Ruigang Wang, Ian R. Manchester
2023 J jnl
CoRR
Nicholas H. Barbara, Ruigang Wang, Ian R. Manchester
2023 J jnl
IEEE Control. Syst. Lett.
Ruigang Wang, Nicholas Barbara, Max Revay, Ian R. Manchester
2023 conf
CDC
Nicholas H. Barbara, Ruigang Wang, Ian R. Manchester
2023 conf
CDC
Patricia Pauli, Ruigang Wang, Ian R. Manchester, Frank Allgöwer
2023 J jnl
CoRR
Patricia Pauli, Ruigang Wang, Ian R. Manchester, Frank Allgöwer
2023 J jnl
IEEE Trans. Control. Netw. Syst.
Vera L. J. Somers, Ian R. Manchester
2023 C conf
ACC
Ruigang Wang, Armaghan Zafar, Ian R. Manchester
2023 J jnl
CoRR
Bowen Yi, Ian R. Manchester
2023 J jnl
CoRR
Bowen Yi, Chi Jin, Lei Wang, Guodong Shi, Viorela Ila, Ian R. Manchester
2023 J jnl
CoRR
Nicholas H. Barbara, Max Revay, Ruigang Wang, Jing Cheng, Ian R. Manchester
2023 J jnl
CoRR
Vera L. J. Somers, Ian R. Manchester
2023 conf
CDC
Daniele Martinelli, Clara Lucía Galimberti, Ian R. Manchester, Luca Furieri, Giancarlo Ferrari-Trecate
2023 J jnl
CoRR
Daniele Martinelli, Clara Lucía Galimberti, Ian R. Manchester, Luca Furieri, Giancarlo Ferrari-Trecate
2022 J jnl
CoRR
Bowen Yi, Lei Wang, Ian R. Manchester
2022 J jnl
IEEE Trans. Autom. Control.
Max Revay, Jack Umenberger, Ian R. Manchester
2022 J jnl
Autom.
Bowen Yi, Chi Jin, Ian R. Manchester
2022 C conf
ACC
Fletcher Fan, Bowen Yi, David C. Rye, Guodong Shi, Ian R. Manchester
2022 J jnl
CoRR
Ruigang Wang, Armaghan Zafar, Ian R. Manchester
2022 C conf
ACC
Vera L. J. Somers, Ian R. Manchester
2022 J jnl
IEEE Trans. Autom. Control.
Bowen Yi, Ruigang Wang, Ian R. Manchester
2022 C conf
ACC
Ruigang Wang, Ian R. Manchester
2021 C conf
ACC
Max Revay, Ruigang Wang, Ian R. Manchester
2021 J jnl
IEEE Control. Syst. Lett.
Max Revay, Ruigang Wang, Ian R. Manchester
2021 conf
CDC
Bowen Yi, Chi Jin, Lei Wang, Guodong Shi, Ian R. Manchester
2021 J jnl
CoRR
Bowen Yi, Chi Jin, Lei Wang, Guodong Shi, Ian R. Manchester
2021 conf
CDC
Ian R. Manchester, Max Revay, Ruigang Wang
2021 J jnl
CoRR
Ian R. Manchester, Max Revay, Ruigang Wang
2021 J jnl
CoRR
Lei Wang, Yang Liu, Ian R. Manchester, Guodong Shi
2021 J jnl
CoRR
Max Revay, Jack Umenberger, Ian R. Manchester
2021 J jnl
CoRR
Bowen Yi, Chi Jin, Ian R. Manchester
2021 J jnl
CoRR
Fletcher Fan, Bowen Yi, David C. Rye, Guodong Shi, Ian R. Manchester
2021 J jnl
CoRR
Ruigang Wang, Nicholas Barbara, Max Revay, Ian R. Manchester
2021 J jnl
CoRR
Vera L. J. Somers, Ian R. Manchester
2021 J jnl
CoRR
Vera L. J. Somers, Ian R. Manchester
2021 J jnl
CoRR
Ruigang Wang, Patrick J. W. Koelwijn, Ian R. Manchester, Roland Tóth
2021 conf
CDC
Bowen Yi, Ian R. Manchester
2021 J jnl
CoRR
Bowen Yi, Ian R. Manchester
2021 conf
CDC
Max Revay, Ruigang Wang, Ian R. Manchester
2021 J jnl
CoRR
Max Revay, Ruigang Wang, Ian R. Manchester
2021 C conf
ACC
Bowen Yi, Ruigang Wang, Ian R. Manchester
2021 J jnl
IEEE Control. Syst. Lett.
Vera L. J. Somers, Ian R. Manchester
2021 J jnl
CoRR
Ruigang Wang, Ian R. Manchester
2020 C conf
ACC
Ruigang Wang, Ian R. Manchester
2020 conf
L4DC
Max Revay, Ian R. Manchester
2020 J jnl
Syst. Control. Lett.
Felix H. Kong, Ian R. Manchester
2020 J jnl
CoRR
Max Revay, Ruigang Wang, Ian R. Manchester
2020 conf
CDC
Lei Wang, Ian R. Manchester, Jochen Trumpf, Guodong Shi
2020 J jnl
CoRR
Lei Wang, Ian R. Manchester, Jochen Trumpf, Guodong Shi
2020 J jnl
CoRR
Max Revay, Ruigang Wang, Ian R. Manchester
2020 conf
CDC
Bowen Yi, Ruigang Wang, Ian R. Manchester
2020 J jnl
CoRR
Bowen Yi, Ruigang Wang, Ian R. Manchester
2020 J jnl
CoRR
Bowen Yi, Romeo Ortega, Ian R. Manchester, Houria Siguerdidjane
2020 conf
CDC
Jack Liell-Cock, Ian R. Manchester, Guodong Shi
2020 J jnl
CoRR
Jack Liell-Cock, Ian R. Manchester, Guodong Shi
2020 J jnl
CoRR
Bowen Yi, Ruigang Wang, Ian R. Manchester
2020 J jnl
CoRR
Vera L. J. Somers, Ian R. Manchester
2020 J jnl
CoRR
Ruigang Wang, Roland Tóth, Ian R. Manchester
2019 J jnl
CoRR
Ruigang Wang, Roland Tóth, Ian R. Manchester
2019 J jnl
CoRR
Ruigang Wang, Ian R. Manchester
2019 J jnl
CoRR
Max Revay, Ian R. Manchester
2019 J jnl
IEEE Control. Syst. Lett.
Jack Umenberger, Ian R. Manchester
2019 J jnl
IEEE Trans. Control. Netw. Syst.
Humberto Stein Shiromoto, Max Revay, Ian R. Manchester
2019 J jnl
CoRR
Yang Liu, Junfeng Wu, Ian R. Manchester, Guodong Shi
2019 conf
EMBC
A. Mounir Boudali, Peter J. Sinclair, Ian R. Manchester
2019 A* conf
ICRA
Vera L. J. Somers, Ian R. Manchester
2019 J jnl
CoRR
Vera L. J. Somers, Ian R. Manchester
2019 conf
CDC
Ruigang Wang, Ian R. Manchester
2019 J jnl
CoRR
Ruigang Wang, Ian R. Manchester
2019 J jnl
IEEE Trans. Autom. Control.
Jack Umenberger, Ian R. Manchester
2018 C conf
ACC
Ian R. Manchester
2018 C conf
ACC
Thomas L. Chaffey, Ian R. Manchester
2018 J jnl
CoRR
Thomas L. Chaffey, Ian R. Manchester
2018 J jnl
CoRR
Humberto Stein Shiromoto, Max Revay, Ian R. Manchester
2018 conf
CDC
Yang Liu, Junfeng Wu, Ian R. Manchester, Guodong Shi
2018 conf
CDC
Yang Liu, Junfeng Wu, Ian R. Manchester, Guodong Shi
2018 A conf
IROS
Felix H. Kong, Ian R. Manchester
2018 J jnl
Autom.
Jack Umenberger, Johan Wågberg, Ian R. Manchester, Thomas B. Schön
2018 J jnl
CoRR
Yang Liu, Junfeng Wu, Ian R. Manchester, Guodong Shi
2018 J jnl
IEEE Control. Syst. Lett.
Ian R. Manchester, Jean-Jacques E. Slotine
2018 A* conf
ICRA
Fletcher Fan, Ian R. Manchester
2018 J jnl
CoRR
Jack Umenberger, Ian R. Manchester
2017 J jnl
CoRR
Ian R. Manchester, Thomas L. Chaffey
2017 J jnl
CoRR
Ian R. Manchester
2017 J jnl
IEEE Trans. Autom. Control.
Ian R. Manchester, Jean-Jacques E. Slotine
2017 J jnl
CoRR
Mark M. Tobenkin, Ian R. Manchester, Alexandre Megretski
2017 J jnl
IEEE Trans. Autom. Control.
Mark M. Tobenkin, Ian R. Manchester, Alexandre Megretski
2017 conf
ICM
A. Mounir Boudali, Felix H. Kong, Javier Martinez, Justin Z. Tang, Ian R. Manchester
2017 J jnl
IEEE Control. Syst. Lett.
Ruigang Wang, Ian R. Manchester, Jie Bao
2017 conf
EMBC
A. Mounir Boudali, Peter J. Sinclair, Richard Smith, Ian R. Manchester
2017 conf
CDC
Christian Grussler, Jack Umenberger, Ian R. Manchester
2017 A* conf
ICRA
Justin Z. Tang, A. Mounir Boudali, Ian R. Manchester
2017 C conf
ACC
Karen Leung, Ian R. Manchester
2017 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2016 J jnl
CoRR
Karen Leung, Ian R. Manchester
2016 J jnl
CoRR
Humberto Stein Shiromoto, Ian R. Manchester
2016 conf
CDC
Humberto Stein Shiromoto, Ian R. Manchester
2016 J jnl
CoRR
Jack Umenberger, Johan Wågberg, Ian R. Manchester, Thomas B. Schön
2016 conf
CDC
Jack Umenberger, Ian R. Manchester
2016 C conf
ACC
Jack Umenberger, Ian R. Manchester
2015 J jnl
IEEE Trans. Control. Syst. Technol.
Guilherme J. Maeda, Ian R. Manchester, David C. Rye
2015 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2015 J jnl
Autom.
Seunggyun Cheong, Ian R. Manchester
2015 C conf
CCA
Felix H. Kong, A. Mounir Boudali, Ian R. Manchester
2015 conf
ISRR (2)
Ian R. Manchester, Justin Z. Tang, Jean-Jacques E. Slotine
2014 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2014 C conf
ACC
Seunggyun Cheong, Ian R. Manchester
2014 conf
AuCC
Hua Ouyang, Ian R. Manchester
2014 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2014 conf
AuCC
Ian R. Manchester, Jean-Jacques E. Slotine
2014 A* conf
ICRA
Ian R. Manchester, Jack Umenberger
2014 J jnl
CoRR
Justin Z. Tang, Ian R. Manchester
2014 J jnl
Syst. Control. Lett.
Ian R. Manchester, Jean-Jacques E. Slotine
2014 conf
CDC
Justin Z. Tang, Ian R. Manchester
2014 C conf
ACC
Seunggyun Cheong, Ian R. Manchester
2013 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2013 J jnl
CoRR
Seunggyun Cheong, Ian R. Manchester
2013 J jnl
CoRR
Ian R. Manchester, Jack Umenberger
2013 J jnl
CoRR
Mark M. Tobenkin, Ian R. Manchester, Alexandre Megretski
2013 C conf
ACC
Mark M. Tobenkin, Ian R. Manchester, Alexandre Megretski
2013 conf
CDC
Ian R. Manchester, Jean-Jacques E. Slotine
2012 J jnl
CoRR
Ian R. Manchester, Jean-Jacques E. Slotine
2011 J jnl
Int. J. Robotics Res.
Alexander C. Shkolnik, Michael Levashov, Ian R. Manchester, Russ Tedrake
2011 conf
ADPRL
John W. Roberts, Ian R. Manchester, Russ Tedrake
2011 J jnl
CoRR
Ian R. Manchester, Mark M. Tobenkin, Jennifer Wang
2011 conf
CDC/ECC
Ian R. Manchester, Mark M. Tobenkin, Jennifer Wang
2011 J jnl
Int. J. Robotics Res.
Ian R. Manchester, Uwe Mettin, Fumiya Iida, Russ Tedrake
2010 conf
CDC
Mark M. Tobenkin, Ian R. Manchester, Jennifer Wang, Alexandre Megretski, Russ Tedrake
2010 J jnl
CoRR
Ian R. Manchester
2010 conf
CDC
Ian R. Manchester
2010 J jnl
Int. J. Robotics Res.
Russ Tedrake, Ian R. Manchester, Mark M. Tobenkin, John W. Roberts
2010 J jnl
Medical Biol. Eng. Comput.
Kennet Andersson, Ian R. Manchester, Jan Malm, Anders Eklund
2010 J jnl
CoRR
Ian R. Manchester, Mark M. Tobenkin, Michael Levashov, Russ Tedrake
2010 conf
CDC
Ian R. Manchester, Kennet Andersson, Jan Malm, Anders Eklund
2009 conf
CDC
Ian R. Manchester
2009 C conf
ISRR
Ian R. Manchester, Uwe Mettin, Fumiya Iida, Russ Tedrake
2008 J jnl
Autom.
Ian R. Manchester, K. S. Andersson, Nina Andersson, Anton S. Shiriaev, Anders Eklund
2008 J jnl
Annu. Rev. Control.
Anton S. Shiriaev, Leonid B. Freidovich, Ian R. Manchester
2008 conf
CDC
Ian R. Manchester, Emily May Peng Low, Andrey V. Savkin
2008 conf
CDC
Anton S. Shiriaev, Leonid B. Freidovich, Ian R. Manchester
2008 A* conf
ICRA
Simon Westerberg, Ian R. Manchester, Uwe Mettin, Pedro X. La Hera, Anton S. Shiriaev
2007 J jnl
Robotics Auton. Syst.
Emily May Peng Low, Ian R. Manchester, Andrey V. Savkin
2007 conf
ALCOSP/PSYCO
Anton S. Shiriaev, Leonid B. Freidovich, Ian R. Manchester
2007 A conf
IROS
Leonid B. Freidovich, Anton S. Shiriaev, Ian R. Manchester
2007 conf
CDC
Ian R. Manchester, Anton S. Shiriaev, Andrey V. Savkin
2007 C conf
CCA
Ian R. Manchester, Emily May Peng Low, Andrey V. Savkin
2006 J jnl
Autom.
Veerachai Malyavej, Ian R. Manchester, Andrey V. Savkin
2004 C conf
CCA
Veerachai Malyavej, Ian R. Manchester, Andrey V. Savkin
2003 conf
CDC
Ian R. Manchester, Andrey V. Savkin, Farhail A. Faruqi
2002 conf
CDC
Ian R. Manchester, Andrey V. Savkin
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)