Wanda Benesova

54 papers B 1C 12Misc 1Journal 20Unranked 20
YearRankTypeTitle / Venue / Authors
2026 conf
BIOSTEC (2)
Tomas Tanczos, Wanda Benesova, Jarmila Pavlovicova, Andrea Vajsová
2025 J jnl
CoRR
Matus Bojko, Maros Kollár, Marek Jakab, Wanda Benesova
2024 J jnl
J. Imaging
Tibor Sloboda, Lukas Hudec, Matej Halinkovic, Wanda Benesova
2024 conf
ICFSP
Igor János, Wanda Benesova
2024 J jnl
Pattern Recognit. Lett.
Igor János, Wanda Benesova
2024 J jnl
Comput. Biol. Medicine
Matej Halinkovic, Ondrej Fabian, Andrea Felsoova, Martin Kveton, Wanda Benesova
2024 J jnl
Medical Biol. Eng. Comput.
Tomas Zilka, Wanda Benesova
2023 C conf
ICVS
Ivan Vykopal, Lukas Hudec, Martin Kveton, Ondrej Fabian, Andrea Felsoova, Wanda Benesova
2023 J jnl
CoRR
Tibor Sloboda, Lukas Hudec, Wanda Benesova
2023 conf
ICIAP Workshops (2)
Tibor Sloboda, Lukas Hudec, Wanda Benesova
2023 conf
VISIGRAPP (1: GRAPP)
Maros Kollár, Lukas Hudec, Wanda Benesova
2023 C conf
ICVS
Tibor Sloboda, Lukas Hudec, Wanda Benesova
2023 J jnl
CoRR
Tibor Sloboda, Lukas Hudec, Wanda Benesova
2022 J jnl
Int. J. Imaging Syst. Technol.
Tomás Pohl, Marek Jakab, Wanda Benesova
2022 conf
ICR
Matej Halinkovic, Wanda Benesova
2021 J jnl
Vis. Comput.
Miroslav Laco, Patrik Polatsek, Simon Dekrét, Wanda Benesova, Martina Baránková, Bronislava Strnádelová, Jana Koróniová, Mária Gablíková
2021 J jnl
CoRR
Frantisek Sefcik, Wanda Benesova
2021 J jnl
CoRR
Igor János, Wanda Benesova
2021 C conf
ICMV
Miroslav Laco, Wanda Benesova
2021 J jnl
CoRR
Péter Bokor, Lukas Hudec, Ondrej Fabian, Wanda Benesova
2020 Misc conf
ICCVG
Jana Polláková, Miroslav Laco, Wanda Benesova
2020 J jnl
CoRR
Martin Stano, Wanda Benesova, Lukas Samuel Martak
2020 J jnl
IET Comput. Vis.
Marek Jakab, Lukas Hudec, Wanda Benesova
2019 C conf
ICMV
Miroslav Laco, Patrik Polatsek, Wanda Benesova
2019 C conf
ICMV
Martin Stano, Wanda Benesova, Lukas S. Martak
2019 C conf
ICMV
Dominik Hradel, Lukas Hudec, Wanda Benesova
2019 C conf
ICMV
Marek Jakab, Marek Stevuliak, Wanda Benesova
2019 conf
TSP
Stefan Grivalsky, Martin Tamajka, Wanda Benesova
2019 conf
IWSSIP
Martin Tamajka, Wanda Benesova, Matej Kompanek
2019 conf
IWSSIP
Matej Kompanek, Martin Tamajka, Wanda Benesova
2018 C conf
ICMV
Patrik Polatsek, Marek Jakab, Wanda Benesova, Matej Kuzma
2018 C conf
ICMV
Miroslav Laco, Wanda Benesova
2018 J jnl
Comput. Graph.
Patrik Polatsek, Manuela Waldner, Ivan Viola, Peter Kapec, Wanda Benesova
2018 J jnl
Comput. Vis. Image Underst.
Andrej Fogelton, Wanda Benesova
2018 conf
MIPR
Ramazan Aygun, Wanda Benesova
2018 conf
IWSSIP
Lukas S. Martak, Márius Sajgalík, Wanda Benesova
2018 conf
IWSSIP
Lukas Hudec, Wanda Benesova
2018 C conf
ICMV
Marek Jakab, Wanda Benesova
2016 conf
IWSSIP
Martin Tamajka, Wanda Benesova
2016 J jnl
Comput. Vis. Image Underst.
Andrej Fogelton, Wanda Benesova
2016 J jnl
IEEE Signal Process. Lett.
Patrik Polatsek, Wanda Benesova, Lucas Paletta, Roland Perko
2016 conf
IWSSIP
Ivana Ilcíková, Wanda Benesova, Jaroslav Polec, Tibor Csóka
2016 J jnl
J. Electronic Imaging
Jaroslav Polec, Wanda Benesova, Radoslav Vargic, Ivana Ilcíková, Tibor Csóka
2016 C conf
ICMV
Veronika Olesova, Wanda Benesova, Patrik Polatsek
2015 conf
Intelligent Robots and Computer Vision: Algorithms and Techniques
Marek Jakab, Wanda Benesova, Marek Racev
2015 J jnl
Comput. Hum. Behav.
Jorge Martín-Gutiérrez, Peña Fabiani, Wanda Benesova, María Dolores Meneses Fernández, Carlos Efrén Mora Luis
2015 conf
SCCG
Patrik Polatsek, Wanda Benesova
2015 conf
EUROCON
Ivana Uhlikova, Wanda Benesova, Jaroslav Polec, Tibor Csóka
2012 conf
Intelligent Robots and Computer Vision: Algorithms and Techniques
Wanda Benesova, Michal Kottman, Oliver Sidla
2011 conf
Intelligent Robots and Computer Vision: Algorithms and Techniques
Oliver Sidla, Michal Kottmann, Wanda Benesova
2009 conf
ICCV Workshops
Oliver Sidla, Norbert Brändle, Wanda Benesova, Marcin Rosner, Yuriy Lypetskyy
2006 C conf
Image Processing: Algorithms and Systems
Alfred Rinnhofer, Gerhard Jakob, Edwin Deutschl, Wanda Benesova, Jean-Philippe Andreu, Giuseppe Parziale, Albert Niel
2006 B conf
ICIP
Wanda Benesova, Alfred Rinnhofer, Gerhard Jakob
2006 conf
ICPR (2)
Alfred Rinnhofer, Wanda Benesova, Gerhard Jakob, Manfred Stockinger
tests/unit/test_apk_jadx_wrapper.py
← Index tests/unit/test_apk_jadx_wrapper.py python
"""
Unit tests for JADX wrapper subprocess management and output parsing.

All subprocess calls are mocked — no JADX/Java installation required.
"""
import os
import tempfile
import textwrap

import pytest
from unittest.mock import MagicMock, patch, call

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


class TestJADXDecompiler:
    """Tests for JADXDecompiler subprocess wrapper."""

    @patch.dict(os.environ, {}, clear=False)
    def test_init_defaults(self):
        os.environ.pop("JADX_PATH", None)
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        assert j.jadx_path == "jadx"
        assert j.timeout == 300

    def test_init_custom_path(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler(jadx_path="/usr/local/bin/jadx", timeout=300)
        assert j.jadx_path == "/usr/local/bin/jadx"
        assert j.timeout == 300

    def test_init_from_env(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        with patch.dict(os.environ, {"JADX_PATH": "/opt/jadx/bin/jadx", "JADX_TIMEOUT": "120"}):
            j = JADXDecompiler()
            assert j.jadx_path == "/opt/jadx/bin/jadx"
            assert j.timeout == 120

    @patch("subprocess.Popen")
    def test_decompile_success(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("output", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        j = JADXDecompiler()
        result = j.decompile("/test.apk", "/output")
        assert result is True

    @patch("subprocess.Popen")
    def test_decompile_nonzero_exit_no_sources(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "error msg")
        mock_proc.returncode = 1
        mock_popen.return_value = mock_proc

        j = JADXDecompiler(log=MagicMock())
        result = j.decompile("/test.apk", "/nonexistent_output")
        assert result is False

    @patch("subprocess.Popen")
    def test_decompile_timeout(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        import subprocess
        mock_proc = MagicMock()
        mock_proc.communicate.side_effect = subprocess.TimeoutExpired(cmd="jadx", timeout=10)
        mock_proc.pid = 12345
        mock_popen.return_value = mock_proc

        with patch("os.getpgid", return_value=12345), \
             patch("os.killpg"):
            j = JADXDecompiler(timeout=10, log=MagicMock())
            result = j.decompile("/test.apk", "/output")
            assert result is False

    @patch("subprocess.Popen", side_effect=FileNotFoundError)
    def test_decompile_not_found(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler(log=MagicMock())
        result = j.decompile("/test.apk", "/output")
        assert result is False

    @patch("subprocess.Popen")
    def test_decompile_command_args(self, mock_popen):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        mock_proc = MagicMock()
        mock_proc.communicate.return_value = ("", "")
        mock_proc.returncode = 0
        mock_popen.return_value = mock_proc

        j = JADXDecompiler(jadx_path="/opt/jadx")
        j.decompile("/test.apk", "/output")

        cmd = mock_popen.call_args[0][0]
        assert cmd[0] == "/opt/jadx"
        assert "--no-res" in cmd
        assert "--no-imports" in cmd
        assert "--threads-count" in cmd
        assert "/test.apk" in cmd

    def test_parse_java_methods_empty_dir(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j.parse_java_methods("/nonexistent")
        assert result == {}

    def test_parse_java_methods_with_files(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        with tempfile.TemporaryDirectory() as tmpdir:
            sources_dir = os.path.join(tmpdir, "sources", "com", "example")
            os.makedirs(sources_dir)

            java_content = textwrap.dedent("""\
                package com.example;

                public class MyClass {
                    public void doStuff(int x) {
                        System.out.println(x);
                    }

                    private String getName() {
                        return "test";
                    }
                }
            """)
            with open(os.path.join(sources_dir, "MyClass.java"), "w") as f:
                f.write(java_content)

            j = JADXDecompiler()
            methods = j.parse_java_methods(tmpdir)
            assert len(methods) >= 1

    def test_extract_methods_from_java(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        source = textwrap.dedent("""\
            public void foo(int x) {
                if (x > 0) {
                    System.out.println(x);
                }
            }
        """)
        j = JADXDecompiler()
        methods = j._extract_methods_from_java(source, "com.example.Test")
        assert len(methods) == 1
        key = list(methods.keys())[0]
        assert "foo" in key

    def test_is_method_declaration_valid(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j._is_method_declaration("    public void foo(int x) {")
        assert result is not None
        assert result[0] == "foo"

    def test_is_method_declaration_control_flow(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        # 'if', 'for', etc. should not be recognized as methods
        assert j._is_method_declaration("        if (x > 0) {") is None
        assert j._is_method_declaration("        for (int i = 0; i < 10; i++) {") is None

    def test_is_method_declaration_static(self):
        from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
        j = JADXDecompiler()
        result = j._is_method_declaration("    public static void main(String[] args) {")
        assert result is not None
        assert result[0] == "main"