James R. Curran

106 papers A* 18A 4B 13Misc 28Journal 7Unranked 36
YearRankTypeTitle / Venue / Authors
2019 A conf
ICDAR
Andrew Naoum, Joel Nothman, James R. Curran
2019 conf
ACL (1)
Nicky Ringland, Xiang Dai, Ben Hachey, Sarvnaz Karimi, Cécile Paris, James R. Curran
2019 J jnl
CoRR
Nicky Ringland, Xiang Dai, Ben Hachey, Sarvnaz Karimi, Cécile Paris, James R. Curran
2018 conf
AIED (1)
Jessica McBroom, Kalina Yacef, Irena Koprinska, James R. Curran
2017 conf
UMAP (Adjunct Publication)
Sammi Chow, Kalina Yacef, Irena Koprinska, James R. Curran
2015 conf
ACL (1)
Dominick Ng, James R. Curran
2015 conf
WWW (Companion Volume)
Will Radford, Daniel Tse, Joel Nothman, Ben Hachey, George Wright, James R. Curran, Will Cannings, Timothy O'Keefe, Matthew Honnibal, David Vadas, Candice Loxley
2015 J jnl
CoRR
Dominick Ng, Mohit Bansal, James R. Curran
2014 A* conf
EMNLP
Glen Pink, Joel Nothman, James R. Curran
2014 conf
OIAF4HLT@COLING
Joel Nothman, Tim Dawborn, James R. Curran
2014 B conf
COLING
Kellie Webster, James R. Curran
2014 Misc conf
ALTA
Kristy Hughes, Joel Nothman, James R. Curran
2014 Misc conf
ALTA
Alexander Hogue, Joel Nothman, James R. Curran
2014 B conf
COLING
Tim Dawborn, James R. Curran
2013 conf
ACL (2)
Jonathan K. Kummerfeld, Daniel Tse, James R. Curran, Dan Klein
2013 conf
ACL (2)
Timothy O'Keefe, James R. Curran, Peter Ashwell, Irena Koprinska
2013 A* conf
EMNLP
Silvia Pareti, Timothy O'Keefe, Ioannis Konstas, James R. Curran, Irena Koprinska
2013 J jnl
Artif. Intell.
Ben Hachey, Will Radford, Joel Nothman, Matthew Honnibal, James R. Curran
2013 Misc conf
ALTA
Timothy O'Keefe, Kellie Webster, James R. Curran, Irena Koprinska
2013 conf
ACL (2)
Will Radford, James R. Curran
2013 J jnl
Artif. Intell.
Joel Nothman, Nicky Ringland, Will Radford, Tara Murphy, James R. Curran
2013 conf
TAC
Glen Pink, Andrew Naoum, Will Radford, Will Cannings, Joel Nothman, Daniel Tse, James R. Curran
2012 conf
TAC
Will Radford, Will Cannings, Joel Nothman, Daniel Tse, James R. Curran, Andrew Naoum, Glen Pink
2012 conf
EMNLP-CoNLL
Timothy O'Keefe, Silvia Pareti, James R. Curran, Irena Koprinska, Matthew Honnibal
2012 conf
ACL (1)
Dominick Ng, James R. Curran
2012 conf
ACL (2)
Joel Nothman, Matthew Honnibal, Ben Hachey, James R. Curran
2012 B conf
COLING
Sunghwan Mac Kim, Dominick Ng, Mark Johnson, James R. Curran
2012 conf
EMNLP-CoNLL
Jonathan K. Kummerfeld, David Hall, James R. Curran, Dan Klein
2012 conf
ACL (2)
Jonathan K. Kummerfeld, Dan Klein, James R. Curran
2012 conf
HLT-NAACL
Daniel Tse, James R. Curran
2011 B conf
WISE
Ben Hachey, Will Radford, James R. Curran
2011 conf
TAC
Will Radford, Joel Nothman, James R. Curran, Ben Hachey, Matthew Honnibal
2011 J jnl
Comput. Linguistics
David Vadas, James R. Curran
2011 conf
ACL (2)
Tara McIntosh, Lars Yencken, James R. Curran, Timothy Baldwin
2010 conf
COLING (Posters)
Yue Zhang, Byung-Gyu Ahn, Stephen Clark, Curt Van Wyk, James R. Curran, Laura Rimell
2010 B conf
COLING
Daniel Tse, James R. Curran
2010 B conf
EDM
Anna Katrina Dominguez, Kalina Yacef, James R. Curran
2010 B conf
Intelligent Tutoring Systems (2)
Anna Katrina Dominguez, Kalina Yacef, James R. Curran
2010 conf
TAC
William Radford, Joel Nothman, Matthew Honnibal, James R. Curran, Ben Hachey
2010 A* conf
ACL
Jonathan K. Kummerfeld, Jessika Roesner, Tim Dawborn, James Haggerty, James R. Curran, Stephen Clark
2010 conf
COLING (Posters)
Matthew Honnibal, Jonathan K. Kummerfeld, James R. Curran
2010 A* conf
ACL
Matthew Honnibal, James R. Curran, Johan Bos
2010 Misc conf
ALTA
Dominick Ng, Matthew Honnibal, James R. Curran
2010 conf
SemEval@ACL
Dominick Ng, James W. D. Constable, Matthew Honnibal, James R. Curran
2009 Misc conf
ALTA
Christopher Chua, Maria Milosavljevic, James R. Curran
2009 A conf
EACL
Joel Nothman, Tara Murphy, James R. Curran
2009 conf
UCMedia
Maria Milosavljevic, Jean-Yves Delort, Ben Hachey, Bavani Arunasalam, Will Radford, James R. Curran
2009 Misc conf
ALTA
Tim Dawborn, James R. Curran
2009 J jnl
BMC Bioinform.
Tara McIntosh, James R. Curran
2009 Misc conf
ALTA
Nicky Ringland, Joel Nothman, Tara Murphy, James R. Curran
2009 conf
ACL/IJCNLP (2)
Stephen Clark, James R. Curran
2009 conf
PWNLP@IJCNLP
Matthew Honnibal, Joel Nothman, James R. Curran
2009 Misc conf
ALTA
Jonathan K. Kummerfeld, Jessika Roesner, James R. Curran
2009 A* conf
EMNLP
Matthew Honnibal, James R. Curran
2009 Misc conf
ALTA
Sam Tardif, James R. Curran, Tara Murphy
2009 Misc conf
ALTA
James W. D. Constable, James R. Curran
2009 conf
PWNLP@IJCNLP
Dominic Balasuriya, Nicky Ringland, Joel Nothman, Tara Murphy, James R. Curran
2009 conf
ACL/IJCNLP
Tara McIntosh, James R. Curran
2009 Misc conf
ALTA
Will Radford, Ben Hachey, James R. Curran, Maria Milosavljevic
2008 Misc conf
ALTA
Katie Bell, James R. Curran
2008 Misc conf
ALTA
Susan Howlett, James R. Curran
2008 Misc conf
ALTA
Jonathan K. Kummerfeld, James R. Curran
2008 Misc conf
ALTA
Dominick Ng, David J. Kedziora, Terry T. W. Miu, James R. Curran
2008 A* conf
ACL
David Vadas, James R. Curran
2008 Misc conf
ALTA
Daniel Tse, James R. Curran
2008 Misc conf
ALTA
Joel Nothman, James R. Curran, Tara Murphy
2008 Misc conf
ALTA
Tara McIntosh, James R. Curran
2007 A* conf
ACL
David Vadas, James R. Curran
2007 conf
BioNLP@ACL
Tara McIntosh, James R. Curran
2007 Misc conf
ALTA
Tara Murphy, James R. Curran
2007 Misc conf
ALTA
Daniel Tse, James R. Curran
2007 A* conf
ACL
Stephen Clark, James R. Curran
2007 conf
IWPT
Bojan Djordjevic, James R. Curran, Stephen Clark
2007 A* conf
ACL
James R. Curran, Stephen Clark, Johan Bos
2007 Misc conf
ALTA
David Vadas, James R. Curran
2007 conf
TREC
Johan Bos, Edoardo Guzzetti, James R. Curran
2007 J jnl
Comput. Linguistics
Stephen Clark, James R. Curran
2006 B conf
ITiCSE
Steven Bird, James R. Curran
2006 Misc conf
ALTA
Bojan Djordjevic, James R. Curran
2006 A* conf
ACL
James R. Curran, Stephen Clark, David Vadas
2006 Misc conf
ALTA
Tara Murphy, Tara McIntosh, James R. Curran
2006 conf
HLT-NAACL
Stephen Clark, James R. Curran
2006 A* conf
SIGIR
Phil Blunsom, Krystle Kocik, James R. Curran
2006 A* conf
EMNLP
James Gorman, James R. Curran
2006 A* conf
ACL
James Gorman, James R. Curran
2006 A conf
EACL
Vinci Liu, James R. Curran
2005 Misc conf
ALTA
Baden Hughes, James Haggerty, Joel Nothman, Saritha Manickam, James R. Curran
2005 Misc conf
ALTA
James Gorman, James R. Curran
2005 Misc conf
ALTA
David Vadas, James R. Curran
2005 conf
TREC
Kisuh Ahn, Johan Bos, David Kor, Malvina Nissim, Bonnie L. Webber, James R. Curran
2005 A* conf
ACL
James R. Curran
2005 Misc conf
ALTA
David Vadas, James R. Curran
2005 Misc conf
ALTA
Vinci Liu, James R. Curran
2004 A* conf
EMNLP
Stephen Clark, Mark Steedman, James R. Curran
2004 A* conf
ACL
Stephen Clark, James R. Curran
2004 conf
TREC
Kisuh Ahn, Johan Bos, Stephen Clark, Tiphaine Dalmas, Jochen L. Leidner, Matthew Smillie, Bonnie L. Webber, James R. Curran
2004 B conf
COLING
Stephen Clark, James R. Curran
2004 B conf
COLING
Johan Bos, Stephen Clark, Mark Steedman, James R. Curran, Julia Hockenmaier
2003 B conf
CoNLL
Stephen Clark, James R. Curran, Miles Osborne
2003 A conf
EACL
James R. Curran, Stephen Clark
2003 B conf
CoNLL
James R. Curran, Stephen Clark
2003 A* conf
EMNLP
Stephen Clark, James R. Curran
2003 conf
TREC
Jochen L. Leidner, Johan Bos, Tiphaine Dalmas, James R. Curran, Stephen Clark, Colin J. Bannard, Bonnie L. Webber, Mark Steedman
2002 B conf
CoNLL
James R. Curran, Miles Osborne
2002 A* conf
ACL
James R. Curran, Marc Moens
2000 conf
ACSC
James R. Curran, Raymond K. Wong
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