Wamberto Weber Vasconcelos

133 papers A* 2A 16B 5C 11Misc 1Journal 27Unranked 62
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Quratul-ain Mahesar, Nir Oren, Wamberto Weber Vasconcelos
2020 ch.
Knowledge Engineering Tools and Techniques for AI Planning
Nir Oren, Kees van Deemter, Wamberto Weber Vasconcelos
2020 C conf
IoTBDS
Milen S. Marev, Ernesto Compatangelo, Wamberto Weber Vasconcelos
2020 B conf
PRIMA
Quratul-ain Mahesar, Nir Oren, Wamberto Weber Vasconcelos
2020 J jnl
CoRR
Quratul-ain Mahesar, Nir Oren, Wamberto Weber Vasconcelos
2019 J jnl
Knowl. Inf. Syst.
Michael Scott Gibson, Wamberto Weber Vasconcelos
2018 conf
AT
Stephen Cranefield, Nir Oren, Wamberto Weber Vasconcelos
2018 B conf
PRIMA
Quratul-ain Mahesar, Nir Oren, Wamberto Weber Vasconcelos
2018 A conf
AAMAS
Jéssica Soares dos Santos, Jean de Oliveira Zahn, Eduardo Augusto Silvestre, Viviane Torres da Silva, Wamberto Weber Vasconcelos
2018 J jnl
ACM Trans. Internet Techn.
Julian A. Padget, Wamberto Weber Vasconcelos
2018 conf
AT
Athanasios Panaretos, David Corsar, Wamberto Weber Vasconcelos
2018 conf
AT
Samuel R. Cauvin, Nir Oren, Wamberto Weber Vasconcelos
2018 J jnl
CoRR
Milen S. Marev, Ernesto Compatangelo, Wamberto Weber Vasconcelos
2017 J jnl
Auton. Agents Multi Agent Syst.
Jéssica Soares dos Santos, Jean de Oliveira Zahn, Eduardo Augusto Silvestre, Viviane Torres da Silva, Wamberto Weber Vasconcelos
2017 J jnl
CoRR
Zohreh Shams, Marina De Vos, Julian A. Padget, Wamberto Weber Vasconcelos
2017 J jnl
Eng. Appl. Artif. Intell.
Zohreh Shams, Marina De Vos, Julian A. Padget, Wamberto Weber Vasconcelos
2016 J jnl
ACM Trans. Auton. Adapt. Syst.
Huib Aldewereld, Virginia Dignum, Wamberto Weber Vasconcelos
2016 conf
COIN@AAMAS/ECAI
Samuel R. Cauvin, Martin J. Kollingbaum, Derek H. Sleeman, Wamberto Weber Vasconcelos
2015 J jnl
Eng. Appl. Artif. Intell.
Felipe Meneguzzi, Odinaldo Rodrigues, Nir Oren, Wamberto Weber Vasconcelos, Michael Luck
2015 conf
ANT/SEIT
Michael Gibson, Wamberto Weber Vasconcelos
2015 A conf
AAMAS
Javier Morales, Iosu Mendizabal, David Sanchez-Pinsach, Juan Antonio Rodríguez-Aguilar, Maite López-Sánchez, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2015 conf
COIN@AAMAS/IJCAI
Zohreh Shams, Marina De Vos, Julian A. Padget, Wamberto Weber Vasconcelos
2015 conf
ICAART (Revised Selected Papers)
Flávio S. Corrêa da Silva, David Stuart Robertson, Wamberto Weber Vasconcelos
2015 conf
ICAART (2)
Flávio S. Corrêa da Silva, Dave Robertson, Wamberto Weber Vasconcelos
2015 J jnl
ACM Trans. Auton. Adapt. Syst.
Javier Morales, Maite López-Sánchez, Juan Antonio Rodríguez-Aguilar, Wamberto Weber Vasconcelos, Michael J. Wooldridge
2015 conf
ANT/SEIT
Julian A. Padget, Wamberto Weber Vasconcelos
2015 conf
COIN@AAMAS/IJCAI
Huib Aldewereld, Virginia Dignum, Wamberto Weber Vasconcelos
2015 A conf
AAMAS
Javier Morales, Maite López-Sánchez, Juan Antonio Rodríguez-Aguilar, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2015 conf
ICSOFT-EA
Samuel R. Cauvin, Derek H. Sleeman, Wamberto Weber Vasconcelos
2014 conf
UMAP Workshops
Nava Tintarev, Roman Kutlák, Judith Masthoff, Kees van Deemter, Nir Oren, Wamberto Weber Vasconcelos
2014 ed.
CLIMA
Nils Bulling, Leendert W. N. van der Torre, Serena Villata, Wojtek Jamroga, Wamberto Weber Vasconcelos
2014 A conf
AAMAS
Javier Morales, Maite López-Sánchez, Juan A. Rodríguez-Aguilar, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2014 A conf
AAMAS
Javier Morales, Iosu Mendizabal, David Sanchez-Pinsach, Maite López-Sánchez, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2014 A conf
AAMAS
Martin W. A. Caminada, Roman Kutlák, Nir Oren, Wamberto Weber Vasconcelos
2013 J jnl
Eng. Appl. Artif. Intell.
Geeth de Mel, Murat Sensoy, Wamberto Weber Vasconcelos, Timothy J. Norman
2013 A conf
AAMAS
Javier Morales, Maite López-Sánchez, Juan A. Rodríguez-Aguilar, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2013 ed.
DALT
Matteo Baldoni, Louise A. Dennis, Viviana Mascardi, Wamberto Weber Vasconcelos
2013 A conf
AAMAS
Javier Morales, Maite López-Sánchez, Juan A. Rodríguez-Aguilar, Michael J. Wooldridge, Wamberto Weber Vasconcelos
2013 conf
BRACIS
Emmanuel Sávio Silva Freire, Gustavo A. L. de Campos, Mariela Inés Cortés, Wamberto Weber Vasconcelos
2013 ch.
Normative Multi-Agent Systems
Tina Balke, Célia da Costa Pereira, Frank Dignum, Emiliano Lorini, Antonino Rotolo, Wamberto Weber Vasconcelos, Serena Villata
2013 conf
ICAART (1)
Michael Gibson, Wamberto Weber Vasconcelos
2013 conf
COIN@AAMAS/PRIMA
Huib Aldewereld, Virginia Dignum, Wamberto Weber Vasconcelos
2012 conf
PAAMS (Special Sessions)
Sofia Panagiotidi, Javier Vázquez-Salceda, Wamberto Weber Vasconcelos
2012 ed.
DALT
Chiaki Sakama, Sebastian Sardiña, Wamberto Weber Vasconcelos, Michael Winikoff
2012 J jnl
Expert Syst. Appl.
Wamberto Weber Vasconcelos, Andrés García-Camino, Dorian Gaertner, Juan A. Rodríguez-Aguilar, Pablo Noriega
2012 J jnl
J. Web Semant.
Murat Sensoy, Timothy J. Norman, Wamberto Weber Vasconcelos, Katia P. Sycara
2012 J jnl
Expert Syst. Appl.
Murat Sensoy, Wamberto Weber Vasconcelos, Timothy J. Norman, Katia P. Sycara
2011 conf
DALT
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2011 conf
CLIMA
Nir Oren, Wamberto Weber Vasconcelos, Felipe Meneguzzi, Michael Luck
2011 A* conf
IJCAI
Daniele Masato, Timothy J. Norman, Wamberto Weber Vasconcelos, Katia P. Sycara
2011 conf
AAMAS Workshops
Murat Sensoy, Wamberto Weber Vasconcelos, Timothy J. Norman
2011 ed.
DALT
Andrea Omicini, Sebastian Sardiña, Wamberto Weber Vasconcelos
2011 conf
COIN@AAMAS&WI-IAT
Stephen Cranefield, Michael Winikoff, Wamberto Weber Vasconcelos
2011 conf
WIMS
Murat Sensoy, Geeth de Mel, Wamberto Weber Vasconcelos, Timothy J. Norman
2011 J jnl
Comput. J.
Murat Sensoy, Thao P. Le, Wamberto Weber Vasconcelos, Timothy J. Norman, Alun D. Preece
2011 C conf
ICAIL
Régis Riveret, Antonino Rotolo, Giuseppe Contissa, Giovanni Sartor, Wamberto Weber Vasconcelos
2011 conf
DALT
David Corsar, Alison Chorley, Wamberto Weber Vasconcelos
2010 Misc conf
SYNASC
Javier Vázquez-Salceda, Wamberto Weber Vasconcelos, Julian A. Padget, Frank Dignum, Siobhán Clarke, Manel Palau, Paul Sergeant, Kees Nieuwenhuis
2010 A conf
AAMAS
Javier Vázquez-Salceda, Wamberto Weber Vasconcelos, Julian A. Padget, Frank Dignum, Siobhán Clarke, M. Palau Roig
2010 J jnl
IEEE Intell. Syst.
Huib Aldewereld, Julian A. Padget, Wamberto Weber Vasconcelos, Javier Vázquez-Salceda, Paul Sergeant, Athanasios Staikopoulos
2010 B conf
PRIMA
Thao P. Le, Timothy J. Norman, Wamberto Weber Vasconcelos
2010 ed.
COIN@AAMAS&IJCAI&MALLOW
Julian A. Padget, Alexander Artikis, Wamberto Weber Vasconcelos, Kostas Stathis, Viviane Torres da Silva, Eric T. Matson, Axel Polleres
2010 A conf
AAMAS
Murat Sensoy, Wamberto Weber Vasconcelos, Timothy J. Norman
2010 conf
ESWC (2)
Xi Bai, Wamberto Weber Vasconcelos, Dave Robertson
2010 conf
ISWC (1)
Murat Sensoy, Timothy J. Norman, Wamberto Weber Vasconcelos, Katia P. Sycara
2010 C conf
iiWAS
David Corsar, Alison Chorley, Wamberto Weber Vasconcelos
2010 C conf
iiWAS
Frank Dignum, Julian A. Padget, Wamberto Weber Vasconcelos
2010 conf
SSN
Murat Sensoy, Geeth de Mel, Wamberto Weber Vasconcelos, Timothy J. Norman
2010 conf
ATOP@AAMAS
Murat Sensoy, Wamberto Weber Vasconcelos, Geeth de Mel, Timothy J. Norman
2009 conf
ESAW
Joey Sik Chun Lam, Wamberto Weber Vasconcelos, Frank Guerin, David Corsar, Alison Chorley, Timothy J. Norman, Javier Vázquez-Salceda, Sofia Panagiotidi, Roberto Confalonieri, I. Gomez, S. Hidalgo, Sergio Álvarez-Napagao, Juan Carlos Nieves, M. Palau Roig, Luigi Ceccaroni, Huib Aldewereld, Virginia Dignum, Frank Dignum, Loris Penserini, Julian A. Padget, Marina De Vos, D. Andreou, Owen Cliffe, Athanasios Staikopoulos, Razvan Popescu, Siobhán Clarke, Paul Sergeant, Chris Reed, Thomas B. Quillinan, Kees Nieuwenhuis
2009 conf
COIN@AAMAS&IJCAI&MALLOW
Joey Sik Chun Lam, Frank Guerin, Wamberto Weber Vasconcelos, Timothy J. Norman
2009 conf
DigiBiz
Javier Vázquez-Salceda, Luigi Ceccaroni, Frank Dignum, Wamberto Weber Vasconcelos, Julian A. Padget, Siobhán Clarke, Paul Sergeant, Kees Nieuwenhuis
2009 J jnl
Auton. Agents Multi Agent Syst.
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2009 conf
CCIA
Wamberto Weber Vasconcelos, Timothy J. Norman
2009 conf
Normative Multi-Agent Systems
Wamberto Weber Vasconcelos, Timothy J. Norman
2009 J jnl
Auton. Agents Multi Agent Syst.
Wamberto Weber Vasconcelos, Martin J. Kollingbaum, Timothy J. Norman
2008 J jnl
J. Data Semant.
Joey Sik Chun Lam, Derek H. Sleeman, Jeff Z. Pan, Wamberto Weber Vasconcelos
2008 ed.
AISB Convention
Frank Guerin, Wamberto Weber Vasconcelos
2008 conf
DALT
Emmanuel M. Tadjouddine, Frank Guerin, Wamberto Weber Vasconcelos
2008 conf
AAMAS (3)
Emmanuel M. Tadjouddine, Frank Guerin, Wamberto Weber Vasconcelos
2008 B conf
EKAW
Mario Gomez, Alun D. Preece, Matthew P. Johnson, Geeth de Mel, Wamberto Weber Vasconcelos, Christopher Gibson, Amotz Bar-Noy, Konrad Borowiecki, Thomas La Porta, Diego Pizzocaro, Hosam Rowaihy, Gavin Pearson, Tien Pham
2008 conf
ESAW
Joey Sik Chun Lam, Frank Guerin, Wamberto Weber Vasconcelos, Timothy J. Norman
2008 J jnl
Auton. Agents Multi Agent Syst.
Mairi McCallum, Wamberto Weber Vasconcelos, Timothy J. Norman
2008 conf
AISB Convention
Frank Guerin, Wamberto Weber Vasconcelos
2007 conf
COIN
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Wamberto Weber Vasconcelos
2007 A conf
AAMAS
Frank Guerin, Wamberto Weber Vasconcelos
2007 conf
DALT
Frank Guerin, Wamberto Weber Vasconcelos
2007 conf
DALT
Martin J. Kollingbaum, Wamberto Weber Vasconcelos, Andrés García-Camino, Timothy J. Norman
2007 A conf
AAMAS
Dorian Gaertner, Andrés García-Camino, Pablo Noriega, Juan A. Rodríguez-Aguilar, Wamberto Weber Vasconcelos
2007 conf
ESAW
Martin J. Kollingbaum, Wamberto Weber Vasconcelos, Andrés García-Camino, Timothy J. Norman
2007 J jnl
Appl. Artif. Intell.
Flávio S. Corrêa da Silva, Wamberto Weber Vasconcelos
2007 A conf
AAMAS
Wamberto Weber Vasconcelos, Martin J. Kollingbaum, Timothy J. Norman
2006 conf
Web Intelligence
Sik Chun Lam, Jeff Z. Pan, Derek H. Sleeman, Wamberto Weber Vasconcelos
2006 J jnl
SIGecom Exch.
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2006 conf
COIN@AAMAS/ECAI
Andrés García-Camino, Juan Antonio Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2006 C conf
EUMAS
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2006 A conf
AAMAS
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2006 conf
IBERAMIA-SBIA
Flávio S. Corrêa da Silva, Wamberto Weber Vasconcelos
2005 conf
DALT
Andrés García-Camino, Juan A. Rodríguez-Aguilar, Carles Sierra, Wamberto Weber Vasconcelos
2005 conf
AI*IA
Flávio S. Corrêa da Silva, Wamberto Weber Vasconcelos
2005 conf
AAMAS Workshops
Mairi McCallum, Wamberto Weber Vasconcelos, Timothy J. Norman
2004 B conf
ICWE
Wamberto Weber Vasconcelos, João M. B. Cavalcanti
2004 conf
SGAI Conf.
Ernesto Compatangelo, Wamberto Weber Vasconcelos, Bruce Scharlau
2004 conf
SBIA
Marc Esteva, Wamberto Weber Vasconcelos, Carles Sierra, Juan A. Rodríguez-Aguilar
2004 conf
DALT
Wamberto Weber Vasconcelos
2004 conf
SGAI Conf.
Yi Zhang, Wamberto Weber Vasconcelos, Derek H. Sleeman
2004 J jnl
Ann. Math. Artif. Intell.
Wamberto Weber Vasconcelos, David Stuart Robertson, Carles Sierra, Marc Esteva, Jordi Sabater, Michael J. Wooldridge
2004 conf
SGAI Conf. (Applications)
Joey Sik Chun Lam, Derek H. Sleeman, Wamberto Weber Vasconcelos
2003 conf
SGAI Conf. (Applications)
Derek H. Sleeman, Yi Zhang, Wamberto Weber Vasconcelos
2003 A conf
AAMAS
Wamberto Weber Vasconcelos
2003 conf
DALT
Wamberto Weber Vasconcelos
2002 C conf
SEKE
João M. B. Cavalcanti, Wamberto Weber Vasconcelos
2002 A* conf
ASE
Wamberto Weber Vasconcelos, Carles Sierra, Marc Esteva
2002 conf
RASTA
Ioan Alfred Letia, Wamberto Weber Vasconcelos
2002 J jnl
Knowl. Based Syst.
Flávio S. Corrêa da Silva, Wamberto Weber Vasconcelos, David Stuart Robertson, Virgínia V. B. Biris Brilhante, Ana Cristina Vieira de Melo, Marcelo Finger, Jaume Agustí-Cullell
2002 A conf
AAMAS
Wamberto Weber Vasconcelos, Jordi Sabater, Carles Sierra, Joaquim Querol
2001 conf
AOSE
Wamberto Weber Vasconcelos, David Stuart Robertson, Jaume Agustí-Cullell, Carles Sierra, Michael J. Wooldridge, Simon Parsons, Christopher Walton, Jordi Sabater
2000 C conf
IEA/AIE
David Stuart Robertson, Flávio S. Corrêa da Silva, Wamberto Weber Vasconcelos, Ana Cristina Vieira de Melo
2000 conf
MICAI
Wamberto Weber Vasconcelos, Eudenia Xavier Meneses
2000 conf
MICAI
Wamberto Weber Vasconcelos, Marcelo A. T. Aragão
2000 conf
IBERAMIA-SBIA
Marcelo Finger, Wamberto Weber Vasconcelos
2000 J jnl
Knowl. Based Syst.
Wamberto Weber Vasconcelos, Marcelo A. T. Aragão
1999 C conf
PADL
Wamberto Weber Vasconcelos
1999 C conf
IEA/AIE
Flávio S. Corrêa da Silva, Jaume Agustí-Cullell, Ana Cristina Vieira de Melo, Wamberto Weber Vasconcelos, David Stuart Robertson
1998 conf
SBIA
Wamberto Weber Vasconcelos, Marcelo A. T. Aragão
1996 conf
SBIA
Wamberto Weber Vasconcelos, Marcelo A. T. Aragão, Norbert E. Fuchs
1995 C conf
LOPSTR
Wamberto Weber Vasconcelos, Norbert E. Fuchs
1995
Wamberto Weber Vasconcelos
1995 conf
LPE
Wamberto Weber Vasconcelos, Norbert E. Fuchs
1994 J jnl
Int. J. Hum. Comput. Stud.
Andrew Bowles, David Stuart Robertson, Wamberto Weber Vasconcelos, Maria Vargas-Vera, Diana Bental
1993 conf
ILPS
Maria Vargas-Vera, Wamberto Weber Vasconcelos, David Stuart Robertson
1993 conf
LPE
Andrew Bowles, Wamberto Weber Vasconcelos
1993 C conf
LOPSTR
Wamberto Weber Vasconcelos
tests/unit/test_apk_decompile_extractor.py
← Index tests/unit/test_apk_decompile_extractor.py python
"""
Unit tests for DecompileAPK extractor, export data, and ClickHouse schemas.

Tests the main DecompileAPK extractor class following the DecompileBinja test pattern.
All analysis is mocked — no JADX/apktool/Java installation required.
"""
import hashlib
import os
import tempfile
import zipfile

import pytest
from unittest.mock import MagicMock, patch, PropertyMock
from dataclasses import asdict

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


def _create_fake_apk_file():
    """Create a minimal APK file for testing and return its path."""
    tmpdir = tempfile.mkdtemp()
    apk_path = os.path.join(tmpdir, "test.apk")
    with zipfile.ZipFile(apk_path, "w") as zf:
        zf.writestr("AndroidManifest.xml", b"<manifest/>")
        zf.writestr("classes.dex", b"dex\n035\x00" + b"\x00" * 100)
    return apk_path


# ============================================================================
# DecompileAPK Extractor Tests
# ============================================================================

class TestDecompileAPK:
    """Tests for the DecompileAPK extractor class."""

    def test_tag(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.tag() == "apk_decompiled"
        finally:
            os.unlink(apk_path)

    def test_get_clickhouse_table(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.get_clickhouse_table() is None
        finally:
            os.unlink(apk_path)

    def test_timeout_default(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_timeout_from_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "900"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 900
        finally:
            os.unlink(apk_path)

    def test_timeout_invalid_env(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with patch.dict(os.environ, {"APK_DECOMPILE_TIMEOUT": "not_a_number"}):
                ext = DecompileAPK(apk_path, MagicMock())
                assert ext.APK_DECOMPILE_TIMEOUT == 600
        finally:
            os.unlink(apk_path)

    def test_calculate_md5(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            result = ext.calculate_md5("test_string")
            assert len(result) == 32
            assert result == hashlib.md5(b"test_string").hexdigest()
        finally:
            os.unlink(apk_path)

    def test_context_manager(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            with DecompileAPK(apk_path, MagicMock()) as ext:
                assert ext is not None
        finally:
            os.unlink(apk_path)

    def test_cleanup_run(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analyzer = MagicMock()
            ext.cleanup_run()
            assert ext.analyzer is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Export Data Tests
# ============================================================================

class TestPrepareExportData:
    """Tests for DecompileAPK.prepare_export_data() ClickHouse schemas."""

    def _make_extractor_with_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        ext = DecompileAPK(apk_path, MagicMock())
        ext.analysis_results = {
            "sha256": "a" * 64,
            "sha1": "b" * 40,
            "md5": "c" * 32,
            "decompiled_content": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "decompiled_method": "public void foo() {}",
                    "decompiled_method_type": "USER",
                    "decompiled_has_string_encryption": False,
                    "decompiled_has_reflection_calls": False,
                    "decompiled_excessive_goto_count": False,
                }
            ],
            "decompiled_refs": [
                {
                    "decompiled_method_hash": "d" * 64,
                    "smali_method_hash": "e" * 64,
                    "decompiled_class_name": "com.example.Foo",
                    "decompiled_method_name": "foo",
                    "decompiled_method_signature": "()V",
                    "decompiled_method_prototype": "void foo()",
                    "functions_caller": ["bar"],
                    "functions_call": ["baz"],
                }
            ],
            "smali_content": [
                {
                    "smali_method_hash": "e" * 64,
                    "smali_method": "invoke-virtual {p0}, Lfoo;->bar()V\nreturn-void",
                    "smali_method_type": "USER",
                    "smali_instructions_count": 10,
                    "smali_register_count": 3,
                    "smali_has_string_encryption": False,
                    "smali_has_reflection_calls": False,
                    "smali_excessive_goto_count": False,
                    "smali_flattened_score": 0.0,
                    "smali_mba_score": 0.0,
                }
            ],
            "smali_refs": [
                {
                    "smali_method_hash": "e" * 64,
                    "decompiled_method_hash": "d" * 64,
                    "smali_class_name": "com.example.Foo",
                    "smali_method_name": "foo",
                    "smali_method_signature": "()V",
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                }
            ],
            "similarity_metrics": [
                {
                    "smali_method_hash": "e" * 64,
                    "cyclomatic_complexity": 2,
                    "ssdeep_smali": None,
                    "tlsh_smali": None,
                    "ssdeep_smali_normalized": None,
                    "tlsh_smali_normalized": None,
                    "minhash": [],
                }
            ],
            "cfg": [
                {
                    "smali_method_hash": "e" * 64,
                    "cfg_topology_hash": b'\x01' * 16,
                    "block_count": 3,
                    "edge_count": 3,
                    "cfg_instructions_count": 10,
                    "call_count": 1,
                    "cyclomatic_complexity": 2,
                    "loop_count": 0,
                    "max_depth": 2,
                    "max_fan_out": 2,
                    "md_index_topdown": 12345,
                    "md_index_bottomup": 67890,
                    "prime_product_smali": 999,
                    "cfg_feature_tlsh": None,
                    "wl_minhash": [0] * 128,
                    "bb_features": [[5, 1, 0, 1, 1, 0, 0, 2]] * 3,
                    "cfg_adjacency": [0x00000001, 0x00000002],
                }
            ],
            "strings": [
                {
                    "string": "https://evil.example.com/payload",
                    "string_encoding": "UTF8",
                    "string_offset": 0,
                    "string_length": 31,
                    "string_entropy": 3.95,
                }
            ],
            "analysis_errors": [
                {
                    "class_name": "com.example.Foo",
                    "method_name": "bar",
                    "error_location": "jadx",
                    "error_message": "timeout",
                    "error_type": "TimeoutError",
                }
            ],
        }
        return ext, apk_path

    def test_returns_none_when_no_results(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            assert ext.prepare_export_data("ClickHouseExporter") is None
        finally:
            os.unlink(apk_path)

    def test_multi_table_flag(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export["multi_table"] is True
        finally:
            os.unlink(apk_path)

    def test_all_table_keys_present(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            assert "decompiled_content" in export
            assert "decompiled_refs" in export
            assert "smali_content" in export
            assert "smali_refs" in export
            assert "method_similarity_metrics" in export
            assert "strings_raw" in export
            assert "analysis_errors" in export
        finally:
            os.unlink(apk_path)

    def test_decompiled_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dc = export["decompiled_content"]
            assert dc["table"] == "code_apk_decompiled_methods_content"
            assert len(dc["column_names"]) == 7
            assert len(dc["column_type_names"]) == 7
            assert "decompiled_method_hash" in dc["column_names"]
            assert "decompiled_method" in dc["column_names"]
            assert "analysis_date" in dc["column_names"]
            assert len(dc["data"]) == 1
            assert len(dc["data"][0]) == 7
        finally:
            os.unlink(apk_path)

    def test_decompiled_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            dr = export["decompiled_refs"]
            assert dr["table"] == "code_apk_decompiled_methods_references"
            assert len(dr["column_names"]) == 10
            assert len(dr["column_type_names"]) == 10
            assert "sha256" in dr["column_names"]
            assert "sha1" not in dr["column_names"]
            assert "md5" not in dr["column_names"]
            assert "functions_caller" in dr["column_names"]
            assert "functions_call" in dr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_content_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sc = export["smali_content"]
            assert sc["table"] == "code_apk_smali_methods_content"
            assert len(sc["column_names"]) == 11
            assert len(sc["column_type_names"]) == 11
            assert "smali_instructions_count" in sc["column_names"]
            assert "smali_register_count" in sc["column_names"]
            assert "smali_flattened_score" in sc["column_names"]
            assert "smali_mba_score" in sc["column_names"]
        finally:
            os.unlink(apk_path)

    def test_smali_refs_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sr = export["smali_refs"]
            assert sr["table"] == "code_apk_smali_methods_references"
            assert len(sr["column_names"]) == 7
            assert len(sr["column_type_names"]) == 7
            assert "sha1" not in sr["column_names"]
            assert "md5" not in sr["column_names"]
            assert "ssdeep_smali" not in sr["column_names"]
            assert "tlsh_smali" not in sr["column_names"]
        finally:
            os.unlink(apk_path)

    def test_similarity_metrics_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            sm = export["method_similarity_metrics"]
            assert sm["table"] == "code_apk_method_similarity_metrics"
            assert len(sm["column_names"]) == 7
            assert "minhash" in sm["column_names"]
            assert "ssdeep_smali_normalized" in sm["column_names"]
            assert "tlsh_smali_normalized" in sm["column_names"]
            # cyclomatic_complexity moved to cfg table
            assert "cyclomatic_complexity" not in sm["column_names"]
            assert "block_count" not in sm["column_names"]
            assert "loop_count" not in sm["column_names"]
        finally:
            os.unlink(apk_path)

    def test_analysis_errors_schema(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            ae = export["analysis_errors"]
            assert ae["table"] == "code_apk_analysis_errors"
            assert len(ae["column_names"]) == 9
            assert "error_hash" in ae["column_names"]
            assert "status" in ae["column_names"]
        finally:
            os.unlink(apk_path)

    def test_sha256_propagated_to_refs(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            export = ext.prepare_export_data("ClickHouseExporter")
            # Check that sha256 from analysis_results appears in ref rows
            dr_row = export["decompiled_refs"]["data"][0]
            assert dr_row[0] == "a" * 64  # sha256
            # sha1 and md5 no longer included in refs
            assert "sha1" not in export["decompiled_refs"]["column_names"]
            assert "md5" not in export["decompiled_refs"]["column_names"]
        finally:
            os.unlink(apk_path)

    def test_empty_tables_not_included(self):
        from redb.extractors.decompiler.DecompileAPK import DecompileAPK
        apk_path = _create_fake_apk_file()
        try:
            ext = DecompileAPK(apk_path, MagicMock())
            ext.analysis_results = {
                "sha256": "a" * 64,
                "sha1": "b" * 40,
                "md5": "c" * 32,
                "decompiled_content": [],
                "decompiled_refs": [],
                "smali_content": [],
                "smali_refs": [],
                "similarity_metrics": [],
                "cfg": [],
                "strings": [],
                "analysis_errors": [],
            }
            export = ext.prepare_export_data("ClickHouseExporter")
            assert export == {"multi_table": True}
        finally:
            os.unlink(apk_path)

    def test_non_clickhouse_exporter_returns_none(self):
        ext, apk_path = self._make_extractor_with_results()
        try:
            result = ext.prepare_export_data("ElasticsearchExporter")
            assert result is None
        finally:
            os.unlink(apk_path)


# ============================================================================
# Dataclass Tests
# ============================================================================

class TestAPKCodeAnalysisDataclasses:
    """Tests for the new APK code analysis dataclasses."""

    def test_decompiled_method_content(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
        )
        assert dc.decompiled_has_string_encryption is False
        assert dc.decompiled_has_reflection_calls is False
        assert dc.decompiled_excessive_goto_count is False

    def test_decompiled_method_content_populated(self):
        from redb.models.dataclasses import APKDecompiledMethodContent
        dc = APKDecompiledMethodContent(
            decompiled_method_hash="a" * 64,
            decompiled_method="public void foo() {}",
            decompiled_method_type="USER",
            decompiled_has_string_encryption=True,
            decompiled_has_reflection_calls=True,
            decompiled_excessive_goto_count=True,
        )
        assert dc.decompiled_has_string_encryption is True
        d = asdict(dc)
        assert d["decompiled_method_hash"] == "a" * 64

    def test_decompiled_method_reference(self):
        from redb.models.dataclasses import APKDecompiledMethodReference
        dr = APKDecompiledMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            decompiled_method_hash="d" * 64,
        )
        assert dr.functions_caller == []
        assert dr.functions_call == []
        assert dr.smali_method_hash is None

    def test_smali_method_content(self):
        from redb.models.dataclasses import APKSmaliMethodContent
        sc = APKSmaliMethodContent(
            smali_method_hash="e" * 64,
            smali_method="invoke-virtual {p0}, Lfoo;->bar()V",
            smali_method_type="USER",
            smali_instructions_count=5,
            smali_register_count=3,
        )
        assert sc.smali_instructions_count == 5
        assert sc.smali_register_count == 3

    def test_smali_method_reference(self):
        from redb.models.dataclasses import APKSmaliMethodReference
        sr = APKSmaliMethodReference(
            sha256="a" * 64,
            sha1="b" * 40,
            md5="c" * 32,
            smali_method_hash="e" * 64,
        )
        assert sr.decompiled_method_hash is None
        assert sr.ssdeep_smali is None
        assert sr.tlsh_smali is None

    def test_method_similarity_metrics(self):
        from redb.models.dataclasses import APKMethodSimilarityMetrics
        ms = APKMethodSimilarityMetrics(smali_method_hash="e" * 64)
        assert ms.cyclomatic_complexity is None
        assert ms.ssdeep_smali_normalized is None
        assert ms.tlsh_smali_normalized is None
        assert ms.minhash == []

    def test_code_analysis_error(self):
        from redb.models.dataclasses import APKCodeAnalysisError
        err = APKCodeAnalysisError(
            sha256="a" * 64,
            error_location="jadx",
            error_message="timeout",
        )
        assert err.class_name is None
        assert err.method_name is None
        assert err.error_type is None


# ============================================================================
# Tag Enum Tests
# ============================================================================

class TestAPKDecompiledTag:
    """Tests for the APK_DECOMPILED tag enum."""

    def test_tag_exists(self):
        from redb.extractors.enum import Tag
        assert hasattr(Tag, "APK_DECOMPILED")

    def test_tag_value(self):
        from redb.extractors.enum import Tag
        assert Tag.APK_DECOMPILED.value == "apk_decompiled"


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

class TestAPKWorkerDecompileIntegration:
    """Tests that DecompileAPK is registered in workers.py."""

    def test_module_registered(self):
        """Verify DecompileAPK is discoverable via the extractor registry."""
        from redb.extractor_registry import get_extractor_class
        cls = get_extractor_class("DecompileAPK")
        assert cls is not None, "DecompileAPK not found in extractor registry"
        assert cls.__name__ == "DecompileAPK"

    def test_worker_apk_dispatch_includes_decompile(self):
        import inspect
        import redb.workers as workers
        source = inspect.getsource(workers.process_binary_file)
        assert "DecompileAPK" in source