Neel Sundaresan

123 papers A* 22A 18B 1C 3Journal 46Unranked 33
YearRankTypeTitle / Venue / Authors
2025 conf
SEIP@ICSE
Spandan Garg, Roshanak Zilouchian Moghaddam, Neel Sundaresan
2025 A* conf
ICLR
Dhruv Gautam, Spandan Garg, Jinu Jang, Neel Sundaresan, Roshanak Zilouchian Moghaddam
2025 J jnl
CoRR
Dhruv Gautam, Spandan Garg, Jinu Jang, Neel Sundaresan, Roshanak Zilouchian Moghaddam
2025 conf
DeepTest
Benjamin Steenhoek, Michele Tufano, Neel Sundaresan, Alexey Svyatkovskiy
2024 J jnl
CoRR
Michele Tufano, Anisha Agarwal, Jinu Jang, Roshanak Zilouchian Moghaddam, Neel Sundaresan
2024 J jnl
CoRR
Anisha Agarwal, Aaron Chan, Shubham Chandel, Jinu Jang, Shaun Miller, Roshanak Zilouchian Moghaddam, Yevhen Mohylevskyy, Neel Sundaresan, Michele Tufano
2024 J jnl
CoRR
Mengnan Qi, Yufan Huang, Yongqiang Yao, Maoquan Wang, Bin Gu, Neel Sundaresan
2023 conf
ESEC/SIGSOFT FSE
Xiaoyu Liu, Jinu Jang, Neel Sundaresan, Miltiadis Allamanis, Alexey Svyatkovskiy
2023 conf
ACL (Findings)
Chenxiao Liu, Shuai Lu, Weizhu Chen, Daxin Jiang, Alexey Svyatkovskiy, Shengyu Fu, Neel Sundaresan, Nan Duan
2023 J jnl
CoRR
Chenxiao Liu, Shuai Lu, Weizhu Chen, Daxin Jiang, Alexey Svyatkovskiy, Shengyu Fu, Neel Sundaresan, Nan Duan
2023 conf
ESEC/SIGSOFT FSE
Matthew Jin, Syed Shahriar, Michele Tufano, Xin Shi, Shuai Lu, Neel Sundaresan, Alexey Svyatkovskiy
2023 J jnl
CoRR
Matthew Jin, Syed Shahriar, Michele Tufano, Xin Shi, Shuai Lu, Neel Sundaresan, Alexey Svyatkovskiy
2023 J jnl
CoRR
Michele Tufano, Shubham Chandel, Anisha Agarwal, Neel Sundaresan, Colin B. Clement
2023 A* conf
EMNLP
Yufan Huang, Mengnan Qi, Yongqiang Yao, Maoquan Wang, Bin Gu, Colin B. Clement, Neel Sundaresan
2023 J jnl
CoRR
Yufan Huang, Mengnan Qi, Yongqiang Yao, Maoquan Wang, Bin Gu, Colin B. Clement, Neel Sundaresan
2023 J jnl
CoRR
Spandan Garg, Roshanak Zilouchian Moghaddam, Neel Sundaresan
2023 J jnl
CoRR
Benjamin Steenhoek, Michele Tufano, Neel Sundaresan, Alexey Svyatkovskiy
2023 J jnl
CoRR
Yang Xu, Yongqiang Yao, Yufan Huang, Mengnan Qi, Maoquan Wang, Bin Gu, Neel Sundaresan
2023 A* conf
EMNLP
Mengnan Qi, Yufan Huang, Maoquan Wang, Yongqiang Yao, Zihan Liu, Bin Gu, Colin B. Clement, Neel Sundaresan
2023 J jnl
CoRR
Mengnan Qi, Yufan Huang, Maoquan Wang, Yongqiang Yao, Zihan Liu, Bin Gu, Colin B. Clement, Neel Sundaresan
2023 J jnl
CoRR
Aaron Chan, Anant Kharkar, Roshanak Zilouchian Moghaddam, Yevhen Mohylevskyy, Alec Helyar, Eslam Kamal, Mohamed Elkamhawy, Neel Sundaresan
2022 J jnl
CoRR
Xiaoyu Liu, Jinu Jang, Neel Sundaresan, Miltiadis Allamanis, Alexey Svyatkovskiy
2022 conf
ESEC/SIGSOFT FSE
Zhiyu Li, Shuai Lu, Daya Guo, Nan Duan, Shailesh Jannu, Grant Jenks, Deep Majumder, Jared Green, Alexey Svyatkovskiy, Shengyu Fu, Neel Sundaresan
2022 J jnl
CoRR
Zhiyu Li, Shuai Lu, Daya Guo, Nan Duan, Shailesh Jannu, Grant Jenks, Deep Majumder, Jared Green, Alexey Svyatkovskiy, Shengyu Fu, Neel Sundaresan
2022 conf
ESEC/SIGSOFT FSE
Spandan Garg, Roshanak Zilouchian Moghaddam, Colin B. Clement, Neel Sundaresan, Chen Wu
2022 J jnl
CoRR
Spandan Garg, Roshanak Zilouchian Moghaddam, Colin B. Clement, Neel Sundaresan, Chen Wu
2022 J jnl
CoRR
Andrei Zlotchevski, Dawn Drain, Alexey Svyatkovskiy, Colin B. Clement, Neel Sundaresan, Michele Tufano
2022 conf
ESEC/SIGSOFT FSE
Andrei Zlotchevski, Dawn Drain, Alexey Svyatkovskiy, Colin B. Clement, Neel Sundaresan, Michele Tufano
2022 C conf
AST
Michele Tufano, Dawn Drain, Alexey Svyatkovskiy, Neel Sundaresan
2022 J jnl
CoRR
Roshanak Zilouchian Moghaddam, Spandan Garg, Colin B. Clement, Yevhen Mohylevskyy, Neel Sundaresan
2022 A* conf
KDD
Roshanak Zilouchian Moghaddam, Spandan Garg, Colin B. Clement, Yevhen Mohylevskyy, Neel Sundaresan
2022 A* conf
ICSE
Anant Kharkar, Roshanak Zilouchian Moghaddam, Matthew Jin, Xiaoyu Liu, Xin Shi, Colin B. Clement, Neel Sundaresan
2022 J jnl
CoRR
Anant Kharkar, Roshanak Zilouchian Moghaddam, Matthew Jin, Xiaoyu Liu, Xin Shi, Colin B. Clement, Neel Sundaresan
2022 A conf
MSR
Michele Tufano, Shao Kun Deng, Neel Sundaresan, Alexey Svyatkovskiy
2022 J jnl
CoRR
Michele Tufano, Shao Kun Deng, Neel Sundaresan, Alexey Svyatkovskiy
2022 conf
ESEC/SIGSOFT FSE
Alexey Svyatkovskiy, Sarah Fakhoury, Negar Ghorbani, Todd Mytkowicz, Elizabeth Dinella, Christian Bird, Jinu Jang, Neel Sundaresan, Shuvendu K. Lahiri
2022 J jnl
CoRR
Shubham Chandel, Colin B. Clement, Guillermo Serrato, Neel Sundaresan
2021 conf
NeurIPS Datasets and Benchmarks
Shuai Lu, Daya Guo, Shuo Ren, Junjie Huang, Alexey Svyatkovskiy, Ambrosio Blanco, Colin B. Clement, Dawn Drain, Daxin Jiang, Duyu Tang, Ge Li, Lidong Zhou, Linjun Shou, Long Zhou, Michele Tufano, Ming Gong, Ming Zhou, Nan Duan, Neel Sundaresan, Shao Kun Deng, Shengyu Fu, Shujie Liu
2021 J jnl
CoRR
Shuai Lu, Daya Guo, Shuo Ren, Junjie Huang, Alexey Svyatkovskiy, Ambrosio Blanco, Colin B. Clement, Dawn Drain, Daxin Jiang, Duyu Tang, Ge Li, Lidong Zhou, Linjun Shou, Long Zhou, Michele Tufano, Ming Gong, Ming Zhou, Nan Duan, Neel Sundaresan, Shao Kun Deng, Shengyu Fu, Shujie Liu
2021 J jnl
CoRR
Dawn Drain, Colin B. Clement, Guillermo Serrato, Neel Sundaresan
2021 J jnl
CoRR
Colin B. Clement, Chen Wu, Dawn Drain, Neel Sundaresan
2021 J jnl
CoRR
Dawn Drain, Chen Wu, Alexey Svyatkovskiy, Neel Sundaresan
2021 J jnl
CoRR
Dawn Drain, Changran Hu, Chen Wu, Mikhail Breslav, Neel Sundaresan
2021 conf
MAPS@PLDI
Dawn Drain, Chen Wu, Alexey Svyatkovskiy, Neel Sundaresan
2021 A* conf
ICLR
Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou
2021 conf
EMNLP (1)
Colin B. Clement, Shuai Lu, Xiaoyu Liu, Michele Tufano, Dawn Drain, Nan Duan, Neel Sundaresan, Alexey Svyatkovskiy
2021 J jnl
CoRR
Colin B. Clement, Shuai Lu, Xiaoyu Liu, Michele Tufano, Dawn Drain, Nan Duan, Neel Sundaresan, Alexey Svyatkovskiy
2021 J jnl
CoRR
Alexey Svyatkovskiy, Todd Mytkowicz, Negar Ghorbani, Sarah Fakhoury, Elizabeth Dinella, Christian Bird, Neel Sundaresan, Shuvendu K. Lahiri
2021 conf
SOAP@PLDI
Spandan Garg, Roshanak Zilouchian Moghaddam, Neel Sundaresan, Chen Wu
2020 J jnl
CoRR
Shuo Ren, Daya Guo, Shuai Lu, Long Zhou, Shujie Liu, Duyu Tang, Neel Sundaresan, Ming Zhou, Ambrosio Blanco, Shuai Ma
2020 J jnl
CoRR
Michele Tufano, Dawn Drain, Alexey Svyatkovskiy, Neel Sundaresan
2020 J jnl
CoRR
Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou
2020 J jnl
CoRR
Alexey Svyatkovskiy, Shao Kun Deng, Shengyu Fu, Neel Sundaresan
2020 conf
ESEC/SIGSOFT FSE
Alexey Svyatkovskiy, Shao Kun Deng, Shengyu Fu, Neel Sundaresan
2020 conf
EMNLP (1)
Colin B. Clement, Dawn Drain, Jonathan Timcheck, Alexey Svyatkovskiy, Neel Sundaresan
2020 J jnl
CoRR
Colin B. Clement, Dawn Drain, Jonathan Timcheck, Alexey Svyatkovskiy, Neel Sundaresan
2020 J jnl
CoRR
Michele Tufano, Dawn Drain, Alexey Svyatkovskiy, Shao Kun Deng, Neel Sundaresan
2019 A* conf
KDD
Neel Sundaresan
2019 A* conf
KDD
Alexey Svyatkovskiy, Ying Zhao, Shengyu Fu, Neel Sundaresan
2019 J jnl
CoRR
Alexey Svyatkovskiy, Ying Zhao, Shengyu Fu, Neel Sundaresan
2017 J jnl
IEEE Cloud Comput.
Dennis Gannon, Roger S. Barga, Neel Sundaresan, Sebastien Goasguen, Niklas Gustaffson, Cornelia Davis, Balan Subramanian, Dan Kohn
2017 J jnl
IEEE Cloud Comput.
Dennis Gannon, Roger S. Barga, Neel Sundaresan
2016 J jnl
Manag. Sci.
Xiang Hui, Maryam Saeedi, Zeqian Shen, Neel Sundaresan
2015 A conf
WACV
Raffay Hamid, Atish Das Sarma, Dennis DeCoste, Neel Sundaresan
2014 A conf
ECIR
Bishan Yang, Nish Parikh, Gyanit Singh, Neel Sundaresan
2014 conf
WWW (Companion Volume)
Si Si, Atish Das Sarma, Elizabeth F. Churchill, Neel Sundaresan
2014 conf
WWW (Companion Volume)
Atish Das Sarma, Nish Parikh, Neel Sundaresan
2014 J jnl
CoRR
Raffay Hamid, Atish Das Sarma, Dennis DeCoste, Neel Sundaresan
2014 A conf
WACV
Mohammad Haris Baig, Vignesh Jagadeesh, Robinson Piramuthu, Anurag Bhardwaj, Wei Di, Neel Sundaresan
2014 A conf
WSDM
Wei Di, Neel Sundaresan, Robinson Piramuthu, Anurag Bhardwaj
2014 J jnl
CoRR
Vignesh Jagadeesh, Robinson Piramuthu, Anurag Bhardwaj, Wei Di, Neel Sundaresan
2014 A* conf
KDD
Vignesh Jagadeesh, Robinson Piramuthu, Anurag Bhardwaj, Wei Di, Neel Sundaresan
2014 conf
WWW (Companion Volume)
Atish Das Sarma, Si Si, Elizabeth F. Churchill, Neel Sundaresan
2013 A* conf
WWW
Yuchen Zhao, Neel Sundaresan, Zeqian Shen, Philip S. Yu
2013 B conf
ASONAM
Haipeng Zhang, Nish Parikh, Gyanit Singh, Neel Sundaresan
2013 A* conf
CVPR
Aditya Khosla, Raffay Hamid, Chih-Jen Lin, Neel Sundaresan
2013 A* conf
KDD
Anurag Bhardwaj, Atish Das Sarma, Wei Di, Raffay Hamid, Robinson Piramuthu, Neel Sundaresan
2013 conf
WWW (Companion Volume)
Zeqian Shen, Neel Sundaresan
2013 conf
CVPR Workshops
Wei Di, Catherine Wah, Anurag Bhardwaj, Robinson Piramuthu, Neel Sundaresan
2012 J jnl
Neurocomputing
Dan Shen, Jean-David Ruvini, Rajyashree Mukherjee, Neel Sundaresan
2012 conf
WWW (Companion Volume)
Gyanit Singh, Nish Parikh, Neel Sundaresan
2012 conf
LDAV
Zeqian Shen, Jishang Wei, Neel Sundaresan, Kwan-Liu Ma
2012 conf
IEEE VAST
Jishang Wei, Zeqian Shen, Neel Sundaresan, Kwan-Liu Ma
2011 conf
WWW (Companion Volume)
Nish Parikh, Neel Sundaresan
2011 A conf
CIKM
Nish Parikh, Neel Sundaresan
2011 conf
ECML/PKDD (1)
Neel Sundaresan
2011 A conf
CIKM
Dan Shen, Jean-David Ruvini, Manas Somaiya, Neel Sundaresan
2011 A conf
CIKM
Nish Parikh, Neel Sundaresan
2011 A conf
WSDM
Mohammad Al Hasan, Nish Parikh, Gyanit Singh, Neel Sundaresan
2011 A conf
RecSys
Neel Sundaresan
2011 A* conf
SIGIR
Gyanit Singh, Nish Parikh, Neel Sundaresan
2011 A conf
RecSys
Jian Wang, Badrul Sarwar, Neel Sundaresan
2011 A conf
WSDM
Zeqian Shen, Neel Sundaresan
2010 C conf
ICMLA
Dan Shen, Jean-David Ruvini, Rajyashree Mukherjee, Neel Sundaresan
2010 conf
AMEC/TADA
Quang Duong, Neel Sundaresan, Nish Parikh, Zeqian Shen
2009 A* conf
WWW
Nish Parikh, Neel Sundaresan
2009 A* conf
WWW
Yue Lu, ChengXiang Zhai, Neel Sundaresan
2008 A* conf
KDD
Hill Nguyen, Nish Parikh, Neel Sundaresan
2008 A conf
CIKM
Nish Parikh, Neel Sundaresan
2008 A* conf
KDD
Nish Parikh, Neel Sundaresan
2008 A conf
ICSOC
Neel Sundaresan
2007 A* conf
WWW
Neel Sundaresan, Kavita Ganesan, Roopnath Grandhi
2007 A* conf
EC
Neel Sundaresan
2002 J jnl
Comput. Networks
Neel Sundaresan, Reshad Moussa
2002 A* conf
ICDE
Christina Yip Chung, Michael Gertz, Neel Sundaresan
2001 A* conf
WWW
Neel Sundaresan, Reshad Moussa
2001 J jnl
Int. J. Speech Technol.
Joshua S. Hodas, Neel Sundaresan, Jared Jackson, Brandon L. Duncan, Walter I. Nissen, Jude Battista
2001 conf
WebDB
Christina Yip Chung, Michael Gertz, Neel Sundaresan
2000 A conf
IEEE International Conference on Multimedia and Expo (II)
Sami Rollins, Neel Sundaresan
2000 A* conf
KDD
Jeonghee Yi, Neel Sundaresan
2000 A conf
ASSETS
Anita W. Huang, Neel Sundaresan
2000 J jnl
Comput. Networks
Sami Rollins, Neel Sundaresan
2000 conf
CUU
Anita W. Huang, Neel Sundaresan
2000 A conf
IEEE International Conference on Multimedia and Expo (I)
Marc Girardot, Neel Sundaresan
2000 C conf
IDEAS
Jeonghee Yi, Neel Sundaresan
2000 conf
EC-Web
Jeonghee Yi, Neel Sundaresan, Anita W. Huang
2000 J jnl
Comput. Networks
Marc Girardot, Neel Sundaresan
2000 J jnl
Comput. Networks
Neel Sundaresan, Jeonghee Yi
2000 conf
WebDB (Informal Proceedings)
Neel Sundaresan, Jeonghee Yi, Anita W. Huang
2000 conf
WebDB (Selected Papers)
Jeonghee Yi, Neel Sundaresan, Anita W. Huang
2000 A conf
IEEE International Conference on Multimedia and Expo (III)
Wayne Niblack, Stanley Yue, Reiner Kraft, Arnon Amir, Neel Sundaresan
1999 conf
Workshop on Web Information and Data Management
Jeonghee Yi, Neel Sundaresan
1998 conf
QL
Ashok Malhotra, Neel Sundaresan
tests/unit/test_apk_method_extractor.py
← Index tests/unit/test_apk_method_extractor.py python
"""
Unit tests for APK method-level content extraction, hashing, and similarity.

Tests SHA-256 normalization, ssdeep/TLSH computation, obfuscation detection,
and Dalvik-to-Java type conversion.
"""
import pytest

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


class TestHashingFunctions:
    """Tests for hashing utility functions."""

    def test_sha256_deterministic(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        h1 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        h2 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        assert h1 == h2

    def test_sha256_hex_length(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert len(compute_sha256("test")) == 64

    def test_sha256_different_inputs(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert compute_sha256("aaa") != compute_sha256("bbb")

    def test_ssdeep_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_ssdeep
        assert compute_ssdeep("short") is None

    def test_tlsh_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_tlsh
        assert compute_tlsh("x") is None


class TestObfuscationDetection:
    """Tests for obfuscation indicator detection."""

    def test_short_method_name_single_char(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("a", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_short_method_name_two_chars(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("ab", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_normal_method_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("onCreate", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is False

    def test_short_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/a;", "", 10)
        assert r["short_class_name"] is True

    def test_normal_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/example/MainActivity;", "", 10)
        assert r["short_class_name"] is False

    def test_string_encryption_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = (
            'const-string v0, "xyz"\n'
            'invoke-static {v0}, Lcom/Enc;->decrypt(Ljava/lang/String;)Ljava/lang/String;\n'
        )
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is True

    def test_no_string_encryption(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'const-string v0, "hello"\ninvoke-virtual {v0}, Ljava/lang/String;->length()I'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is False

    def test_reflection_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {v0, v1}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is True

    def test_no_reflection(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {p0}, Lcom/Foo;->bar()V'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is False

    def test_excessive_goto_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto :label"] * 10)
        # threshold = max(5, 20*0.15=3) = 5, 10 > 5
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True

    def test_no_excessive_goto(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "goto :label\nreturn-void"
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 100)
        assert r["excessive_goto_count"] is False

    def test_goto_16_counted(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto/16 :label"] * 10)
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True


class TestDalvikTypeConversion:
    """Tests for Dalvik-to-Java type conversion."""

    def test_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("V") == "void"

    def test_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("I") == "int"
        assert dalvik_type_to_java("Z") == "boolean"
        assert dalvik_type_to_java("J") == "long"
        assert dalvik_type_to_java("F") == "float"
        assert dalvik_type_to_java("D") == "double"
        assert dalvik_type_to_java("B") == "byte"
        assert dalvik_type_to_java("S") == "short"
        assert dalvik_type_to_java("C") == "char"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("Ljava/lang/String;") == "String"
        assert dalvik_type_to_java("Lcom/example/Foo;") == "Foo"

    def test_array_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("[I") == "int[]"
        assert dalvik_type_to_java("[Ljava/lang/String;") == "String[]"

    def test_empty_returns_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("") == "void"


class TestJavaPrototypeConversion:
    """Tests for method signature to Java prototype conversion."""

    def test_simple_method(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        assert dalvik_to_java_prototype("foo", "()V") == "void foo()"

    def test_method_with_params(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("bar", "(ILjava/lang/String;)Z")
        assert result == "boolean bar(int, String)"

    def test_method_returning_object(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("create", "()Lcom/example/Foo;")
        assert result == "Foo create()"

    def test_empty_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("m", "")
        assert "m()" in result


class TestDalvikParamParsing:
    """Tests for parsing Dalvik parameter descriptors."""

    def test_empty(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("") == []

    def test_single_primitive(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("I") == ["I"]

    def test_multiple_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("IZJ") == ["I", "Z", "J"]

    def test_single_object(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("Ljava/lang/String;") == ["Ljava/lang/String;"]

    def test_mixed(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("ILjava/lang/String;Z")
        assert result == ["I", "Ljava/lang/String;", "Z"]

    def test_arrays(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("[I[Ljava/lang/String;")
        assert result == ["[I", "[Ljava/lang/String;"]

    def test_two_objects(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("Landroid/os/Bundle;Ljava/lang/String;")
        assert len(result) == 2