Naoyasu Ubayashi

149 papers A* 7A 19B 8C 21Misc 2Journal 37Unranked 52
YearRankTypeTitle / Venue / Authors
2026 J jnl
Softw. Pract. Exp.
Haowei Cheng, Jati H. Husen, Yijun Lu, Teeradaj Racharak, Nobukazu Yoshioka, Naoyasu Ubayashi, Hironori Washizaki
2026 J jnl
CoRR
Haowei Cheng, Milhan Kim, Foutse Khomh, Teeradaj Racharak, Nobukazu Yoshioka, Naoyasu Ubayashi, Hironori Washizaki
2025 J jnl
IEICE Trans. Inf. Syst.
Olivier Nourry, Masanari Kondo, Shinobu Saito, Yukako Iimura, Naoyasu Ubayashi, Yasutaka Kamei
2025 B conf
COMPSAC
Yijun Lu, Hironori Washizaki, Naoyasu Ubayashi, Nobukazu Yoshioka, Jiong Dong, Yuyin Ma, Jati H. Husen
2025 J jnl
CoRR
Masanari Kondo, Mahmoud Alfadel, Shane McIntosh, Yasutaka Kamei, Naoyasu Ubayashi
2025 J jnl
J. Inf. Process.
Ayana Uematsu, Minshun Yang, Hironori Washizaki, Naoyasu Ubayashi, Juichi Takahashi, Yohei Takagi
2025 A conf
RE
Ryota Sugiyama, Hironori Washizaki, Naoyasu Ubayashi, Ryoko Tanahashi, Mai Hirabayashi, Satoshi Okuda, Ken Toriumi
2025 conf
SFPVV
Toshiya Okubo, Hironori Washizaki, Naoyasu Ubayashi, Nobukazu Yoshioka, Hironori Takeuchi, Truong Vinh Truong Duy
2025 A conf
EASE
Yuta Ishimoto, Masanari Kondo, Naoyasu Ubayashi, Yasutaka Kamei, Ryota Katsube, Naoto Sato, Hideto Ogawa
2025 J jnl
CoRR
Yuta Ishimoto, Masanari Kondo, Naoyasu Ubayashi, Yasutaka Kamei, Ryota Katsube, Naoto Sato, Hideto Ogawa
2025 conf
CAI
Yuya Fujiwara, Takuma Tsuchida, Rikuho Miyata, Hironori Washizaki, Naoyasu Ubayashi
2025 J jnl
IT Prof.
Yuya Sasaki, Hironori Washizaki, Jialong Li, Nobukazu Yoshioka, Naoyasu Ubayashi, Yoshiaki Fukazawa
2025 J jnl
CoRR
Yijun Lu, Hironori Washizaki, Naoyasu Ubayashi, Nobukazu Yoshioka, Chenhao Wu, Masanari Kondo, Yuyin Ma, Jiong Dong, Jianjin Zhao, Dongqi Han
2025 J jnl
ACM Trans. Softw. Eng. Methodol.
Yuta Ishimoto, Masanari Kondo, Lei Ma, Naoyasu Ubayashi, Yasutaka Kamei
2024 J jnl
CoRR
Masanari Kondo, Daniel M. Germán, Yasutaka Kamei, Naoyasu Ubayashi, Osamu Mizuno
2024 C conf
APSEC
Yuta Ishimoto, Yuto Nakamura, Ryota Katsube, Naoto Sato, Hideto Ogawa, Masanari Kondo, Yasutaka Kamei, Naoyasu Ubayashi
2024 J jnl
Empir. Softw. Eng.
Masanari Kondo, Daniel M. Germán, Yasutaka Kamei, Naoyasu Ubayashi, Osamu Mizuno
2024 A conf
MSR
Kei Koyanagi, Dong Wang, Kotaro Noguchi, Masanari Kondo, Alexander Serebrenik, Yasutaka Kamei, Naoyasu Ubayashi
2024 J jnl
CoRR
Kei Koyanagi, Dong Wang, Kotaro Noguchi, Masanari Kondo, Alexander Serebrenik, Yasutaka Kamei, Naoyasu Ubayashi
2024 J jnl
CoRR
Haowei Cheng, Jati H. Husen, Sien Reeve Ordonez Peralta, Bowen Jiang, Nobukazu Yoshioka, Naoyasu Ubayashi, Hironori Washizaki
2024 J jnl
CoRR
Olivier Nourry, Masanari Kondo, Shinobu Saito, Yukako Iimura, Naoyasu Ubayashi, Yasutaka Kamei
2024 J jnl
CoRR
Yukako Iimura, Masanari Kondo, Kazushi Tomoto, Yasutaka Kamei, Naoyasu Ubayashi, Shinobu Saito
2024 conf
ISSRE (Workshops)
Takumi Ayukawa, Jati H. Husen, Nobukazu Yoshioka, Hironori Washizaki, Naoyasu Ubayashi
2024 A conf
SANER
Issei Morita, Yutaro Kashiwa, Masanari Kondo, Jeongju Sohn, Shane McIntosh, Yasutaka Kamei, Naoyasu Ubayashi
2024 J jnl
Empir. Softw. Eng.
Hiroki Kuramoto, Dong Wang, Masanari Kondo, Yutaro Kashiwa, Yasutaka Kamei, Naoyasu Ubayashi
2024 conf
ISSRE (Workshops)
Scott Lupton, Hironori Washizaki, Naoyasu Ubayashi, Nobukazu Yoshioka
2023 B conf
CAIN
Yuta Ishimoto, Ken Matsui, Masanari Kondo, Naoyasu Ubayashi, Yasutaka Kamei
2023 J jnl
Inf. Softw. Technol.
Yuta Ishimoto, Masanari Kondo, Naoyasu Ubayashi, Yasutaka Kamei
2023 B conf
COMPSAC
Masanari Kondo, Shinobu Saito, Yukako Iimura, Eunjong Choi, Osamu Mizuno, Yasutaka Kamei, Naoyasu Ubayashi
2023 A conf
SANER
Hiroki Yamamoto, Dong Wang, Gopi Krishnan Rajbahadur, Masanari Kondo, Yasutaka Kamei, Naoyasu Ubayashi
2023 conf
QRS Companion
Jianhong Wang, Yuta Ishimoto, Masanari Kondo, Yasutaka Kamei, Naoyasu Ubayashi
2023 J jnl
CoRR
Dong Wang, Masanari Kondo, Yasutaka Kamei, Raula Gaikovina Kula, Naoyasu Ubayashi
2023 J jnl
Empir. Softw. Eng.
Dong Wang, Masanari Kondo, Yasutaka Kamei, Raula Gaikovina Kula, Naoyasu Ubayashi
2022 J jnl
Inf. Softw. Technol.
Yutaro Kashiwa, Ryoma Nishikawa, Yasutaka Kamei, Masanari Kondo, Emad Shihab, Ryosuke Sato, Naoyasu Ubayashi
2022 A conf
MSR
Masanari Kondo, Shinobu Saito, Yukako Iimura, Eunjong Choi, Osamu Mizuno, Yasutaka Kamei, Naoyasu Ubayashi
2022 A conf
ICPC
Hiroki Kuramoto, Masanari Kondo, Yutaro Kashiwa, Yuta Ishimoto, Kaze Shindo, Yasutaka Kamei, Naoyasu Ubayashi
2022 B conf
COMPSAC
Tsukasa Nakamura, Masanari Kondo, Yasutaka Kamei, Naoyasu Ubayashi
2022 B conf
COMPSAC
Kyosuke Yamate, Masanari Kondo, Yutaro Kashiwa, Yasutaka Kamei, Naoyasu Ubayashi
2022 J jnl
Empir. Softw. Eng.
Jiayuan Zhou, Shaowei Wang, Yasutaka Kamei, Ahmed E. Hassan, Naoyasu Ubayashi
2021 A conf
ICSME
Yutaro Kashiwa, Kazuki Shimizu, Bin Lin, Gabriele Bavota, Michele Lanza, Yasutaka Kamei, Naoyasu Ubayashi
2021 J jnl
Inf. Softw. Technol.
Olivier Nourry, Yutaro Kashiwa, Yasutaka Kamei, Naoyasu Ubayashi
2021 C conf
SCAM
Hassan Atwi, Bin Lin, Nikolaos Tsantalis, Yutaro Kashiwa, Yasutaka Kamei, Naoyasu Ubayashi, Gabriele Bavota, Michele Lanza
2021 conf
QRS Companion
Lei Shi, Masanari Kondo, Naoyasu Ubayashi, Yasutaka Kamei
2020 J jnl
CoRR
Daito Nakano, Mingyang Yin, Ryosuke Sato, Abram Hindle, Yasutaka Kamei, Naoyasu Ubayashi
2020 C conf
QRS
Ryujiro Nishinaka, Naoyasu Ubayashi, Yasutaka Kamei, Ryosuke Sato
2019 ch.
Engineering Adaptive Software Systems
Lionel Montrieux, Naoyasu Ubayashi, Tianqi Zhao, Zhi Jin, Zhenjiang Hu
2019 A conf
MSR
Thong Hoang, Hoa Khanh Dam, Yasutaka Kamei, David Lo, Naoyasu Ubayashi
2019 conf
ICSE (Companion Volume)
Naoyasu Ubayashi, Takuya Watanabe, Yasutaka Kamei, Ryosuke Sato
2019 C conf
QRS
Naoyasu Ubayashi, Yasutaka Kamei, Ryosuke Sato
2018 A conf
ESEM
Junji Shimagaki, Yasutaka Kamei, Naoyasu Ubayashi, Abram Hindle
2018 C conf
MODELSWARD
Naoyasu Ubayashi, Yasutaka Kamei, Ryosuke Sato
2018 conf
ICSE (Companion Volume)
Naoyasu Ubayashi, Hokuto Muraoka, Daiki Muramoto, Yasutaka Kamei, Ryosuke Sato
2018 conf
ICSOFT (Selected Papers)
Naoyasu Ubayashi, Yasutaka Kamei, Ryosuke Sato
2018 J jnl
IEICE Trans. Inf. Syst.
Yasutaka Kamei, Takahiro Matsumoto, Kazuhiro Yamashita, Naoyasu Ubayashi, Takashi Iwasaki, Shuichi Takayama
2018 C conf
ICSOFT
Naoyasu Ubayashi, Yasutaka Kamei, Ryosuke Sato
2017 conf
ICST Workshops
Keisuke Watanabe, Takuya Fukamachi, Naoyasu Ubayashi, Yasutaka Kamei
2017 J jnl
IEICE Trans. Inf. Syst.
Pawin Suthipornopas, Pattara Leelaprute, Akito Monden, Hidetake Uwano, Yasutaka Kamei, Naoyasu Ubayashi, Kenji Araki, Kingo Yamada, Ken-ichi Matsumoto
2017 conf
MiSE@ICSE
Keisuke Watanabe, Naoyasu Ubayashi, Takuya Fukamachi, Shunya Nakamura, Hokuto Muraoka, Yasutaka Kamei
2016 Misc conf
SAC
Bodin Chinthanet, Passakorn Phannachitta, Yasutaka Kamei, Pattara Leelaprute, Arnon Rungsawang, Naoyasu Ubayashi, Ken-ichi Matsumoto
2016 conf
ICSE (Companion Volume)
Junji Shimagaki, Yasutaka Kamei, Shane McIntosh, Ahmed E. Hassan, Naoyasu Ubayashi
2016 C conf
QRS
Kwabena Ebo Bennin, Koji Toda, Yasutaka Kamei, Jacky Keung, Akito Monden, Naoyasu Ubayashi
2016 B conf
COMPSAC
Kwabena Ebo Bennin, Jacky W. Keung, Akito Monden, Yasutaka Kamei, Naoyasu Ubayashi
2016 J jnl
J. Inf. Process.
Kazuhiro Yamashita, Yasutaka Kamei, Shane McIntosh, Ahmed E. Hassan, Naoyasu Ubayashi
2016 J jnl
Empir. Softw. Eng.
Yasutaka Kamei, Takafumi Fukushima, Shane McIntosh, Kazuhiro Yamashita, Naoyasu Ubayashi, Ahmed E. Hassan
2016 A conf
ESEM
Keisuke Miura, Shane McIntosh, Yasutaka Kamei, Ahmed E. Hassan, Naoyasu Ubayashi
2016 C conf
QRS
Kazuhiro Yamashita, Changyun Huang, Meiyappan Nagappan, Yasutaka Kamei, Audris Mockus, Ahmed E. Hassan, Naoyasu Ubayashi
2016 conf
QuASoQ/TDA@APSEC
Yasutaka Kamei, Everton da S. Maldonado, Emad Shihab, Naoyasu Ubayashi
2016 A conf
ICSME
Junji Shimagaki, Yasutaka Kamei, Shane McIntosh, David Pursehouse, Naoyasu Ubayashi
2015 C conf
MODELSWARD
Changyun Huang, Ataru Osaka, Yasutaka Kamei, Naoyasu Ubayashi
2015 conf
MiSE@ICSE
Takuya Fukamachi, Naoyasu Ubayashi, Shintaro Hosoai, Yasutaka Kamei
2015 conf
ICSE (2)
Takuya Fukamachi, Naoyasu Ubayashi, Shintaro Hosoai, Yasutaka Kamei
2015 conf
IWPSE
Kazuhiro Yamashita, Shane McIntosh, Yasutaka Kamei, Ahmed E. Hassan, Naoyasu Ubayashi
2014 A* conf
ASE
Naoyasu Ubayashi, Di Ai, Peiyuan Li, Yu Ning Li, Shintaro Hosoai, Yasutaka Kamei
2014 A conf
MSR
Takafumi Fukushima, Yasutaka Kamei, Shane McIntosh, Kazuhiro Yamashita, Naoyasu Ubayashi
2014 conf
QSIC
Yasutaka Kamei, Masao Ohira, Ahmed E. Hassan, Naoyasu Ubayashi, Ken-ichi Matsumoto
2014 A conf
MSR
Kazuhiro Yamashita, Shane McIntosh, Yasutaka Kamei, Naoyasu Ubayashi
2014 conf
InnoSWDev@SIGSOFT FSE
Peiyuan Li, Naoyasu Ubayashi, Di Ai, Yu Ning Li, Shintaro Hosoai, Yasutaka Kamei
2014 conf
AOAsia@SIGSOFT FSE
Naoyasu Ubayashi, Di Ai, Peiyuan Li, Yu Ning Li, Shintaro Hosoai, Yasutaka Kamei
2014 C conf
MODELSWARD
Di Ai, Naoyasu Ubayashi, Peiyuan Li, Shintaro Hosoai, Yasutaka Kamei
2014 conf
MODULARITY (Companion)
Di Ai, Naoyasu Ubayashi, Peiyuan Li, Daisuke Yamamoto, Yu Ning Li, Shintaro Hosoai, Yasutaka Kamei
2013 J jnl
IEEE Trans. Software Eng.
Yasutaka Kamei, Emad Shihab, Bram Adams, Ahmed E. Hassan, Audris Mockus, Anand Sinha, Naoyasu Ubayashi
2013 conf
COP@ECOOP
Naoyasu Ubayashi, Di Ai, Yasutaka Kamei
2013 ed.
AOSD (Companion)
Hidehiko Masuhara, Shigeru Chiba, Naoyasu Ubayashi
2013 ed.
AOSD
Hidehiko Masuhara, Shigeru Chiba, Naoyasu Ubayashi
2013 J jnl
Sci. Comput. Program.
Naoyasu Ubayashi, Shin Nakajima, Masayuki Hirayama
2013 C conf
MiSE
Naoyasu Ubayashi, Yasutaka Kamei
2013 conf
PLEASE@ICSE
Changyun Huang, Kazuhiro Yamashita, Yasutaka Kamei, Kenji Hisazumi, Naoyasu Ubayashi
2013 A conf
MSR
Masateru Tsunoda, Koji Toda, Kyohei Fushida, Yasutaka Kamei, Meiyappan Nagappan, Naoyasu Ubayashi
2013 C conf
MODELSWARD
Naoyasu Ubayashi, Yasutaka Kamei
2013 conf
SPLC Workshops
Changyun Huang, Yasutaka Kamei, Kazuhiro Yamashita, Naoyasu Ubayashi
2012 J jnl
IEICE Trans. Inf. Syst.
Naoyasu Ubayashi, Yasutaka Kamei
2012 conf
APSEC Workshops
Akinori Ihara, Yasutaka Kamei, Akito Monden, Masao Ohira, Jacky Wai Keung, Naoyasu Ubayashi, Ken-ichi Matsumoto
2012 conf
FOAL
Naoyasu Ubayashi, Yasutaka Kamei
2012 conf
IWESEP
Hiroki Nakamura, Rina Nagano, Kenji Hisazumi, Yasutaka Kamei, Naoyasu Ubayashi, Akira Fukuda
2012 conf
DSM@SPLASH
Naoyasu Ubayashi, Yasutaka Kamei
2012 A* conf
ICSE
Rina Nagano, Hiroki Nakamura, Yasutaka Kamei, Bram Adams, Kenji Hisazumi, Naoyasu Ubayashi, Akira Fukuda
2012 C conf
MiSE
Naoyasu Ubayashi, Yasutaka Kamei
2011 A conf
RE
Naoyasu Ubayashi, Yasutaka Kamei, Masayuki Hirayama, Tetsuo Tamai
2011 conf
IWSM/Mensura
Yasutaka Kamei, Hiroki Sato, Akito Monden, Shinji Kawaguchi, Hidetake Uwano, Masataka Nagura, Ken-ichi Matsumoto, Naoyasu Ubayashi
2011 conf
COP@ECOOP
Shizuka Uchio, Naoyasu Ubayashi, Yasutaka Kamei
2011 C conf
SEKE
Masaru Shiozuka, Naoyasu Ubayashi, Yasutaka Kamei
2011 conf
CAiSE Forum
Naoyasu Ubayashi, Yasutaka Kamei
2011 conf
CAiSE Forum (Selected Papers)
Naoyasu Ubayashi, Yasutaka Kamei
2011 conf
IWSM/Mensura
Ryosuke Nakashiro, Yasutaka Kamei, Naoyasu Ubayashi, Shin Nakajima, Akihito Iwai
2010 J jnl
IEICE Trans. Inf. Syst.
Takako Nakatani, Shouzo Hori, Naoyasu Ubayashi, Keiichi Katamine, Masaaki Hashimoto
2010 conf
ICSE (1)
Naoyasu Ubayashi, Jun Nomura, Tetsuo Tamai
2010 conf
COMPSAC Workshops
Shin Nakajima, Keiji Hokamura, Naoyasu Ubayashi
2010 B conf
SPLC
Naoyasu Ubayashi, Shin Nakajima, Masayuki Hirayama
2010 conf
SPLC Workshops
Naoyasu Ubayashi
2010 J jnl
IEICE Trans. Inf. Syst.
Shouzo Hori, Takako Nakatani, Keiichi Katamine, Naoyasu Ubayashi, Masaaki Hashimoto
2009 A* conf
ASE
Keiji Hokamura, Ryoto Naruse, Masaru Shiozuka, Naoyasu Ubayashi, Shin Nakajima, Akihito Iwai
2009 A conf
CAiSE
Naoyasu Ubayashi, Genya Otsubo, Kazuhide Noda, Jun Yoshida
2009 conf
RAM-SE@ECOOP
Naoyasu Ubayashi, Hidenori Akatoki, Jun Nomura
2009 conf
ICSOFT (1)
Shouzo Hori, Takako Nakatani, Keiichi Katamine, Naoyasu Ubayashi, Masaaki Hashimoto
2009 conf
EA@ICSE
Shin Nakajima, Naoyasu Ubayashi, Keiji Hokamura
2008 A conf
RE
Takako Nakatani, Shouzo Hori, Naoyasu Ubayashi, Keiichi Katamine, Masaaki Hashimoto
2008 conf
JCKBSE
Keiichi Katamine, Yasufumi Shinyashiki, Toshiro Mise, Masaaki Hashimoto, Naoyasu Ubayashi, Takako Nakatani
2008 conf
JCKBSE
Keiichi Ishibashi, Masaaki Hashimoto, Keiichi Katamine, Ryoma Shiratsuchi, Keita Asaine, Takako Nakatani, Naoyasu Ubayashi, Yoshihiro Akiyama
2008 C conf
MiSE
Naoyasu Ubayashi, Toshiki Seto, Hirotoshi Kanagawa, Susumu Taniguchi, Jun Yoshida, Takeshi Sumi, Masayuki Hirayama
2008 C conf
SERA
Naoyasu Ubayashi, Yuki Sato, Akihiro Sakai, Tetsuo Tamai
2008 C conf
APSEC
Keiji Hokamura, Naoyasu Ubayashi, Shin Nakajima, Akihito Iwai
2008 A* conf
ASE
Naoyasu Ubayashi, Genya Otsubo, Kazuhide Noda, Jun Yoshida, Tetsuo Tamai
2008 A conf
ICST
Naoyasu Ubayashi, Jinji Piao, Suguru Shinotsuka, Tetsuo Tamai
2007 conf
MiSE@ICSE
Naoyasu Ubayashi, Shinji Sano, Genya Otsubo
2007 conf
HCI (8)
Yasufumi Shinyashiki, Toshiro Mise, Masaaki Hashimoto, Keiichi Katamine, Naoyasu Ubayashi, Takako Nakatani
2007 A* conf
ASE
Naoyasu Ubayashi, Akihiro Sakai, Tetsuo Tamai
2007 conf
SPLAT
Naoyasu Ubayashi, Akihiro Sakai, Tetsuo Tamai
2007 Misc conf
SAC
Naoyasu Ubayashi, Shin Nakajima
2007 C conf
APSEC
Yasufumi Shinyashiki, Toshiro Mise, Masaaki Hashimoto, Keiichi Katamine, Naoyasu Ubayashi, Takako Nakatani
2006 conf
JCKBSE
Toshiro Mise, Yasufumi Shinyashiki, Takako Nakatani, Naoyasu Ubayashi, Keiichi Katamine, Masaaki Hashimoto
2006 C conf
SEKE
Naoyasu Ubayashi, Tetsuo Tamai, Shinji Sano, Yusaku Maeno, Satoshi Murakami
2006 J jnl
LNCS Trans. Aspect Oriented Softw. Dev.
Kouhei Sakurai, Hidehiko Masuhara, Naoyasu Ubayashi, Saeko Matsuura, Seiichi Komiya
2006 conf
JCKBSE
Hidehiro Kametani, Yasufumi Shinyashiki, Toshiro Mise, Masaaki Hashimoto, Naoyasu Ubayashi, Keiichi Katamine, Takako Nakatani
2006 J jnl
Int. Trans. Syst. Sci. Appl.
Naoyasu Ubayashi, Tetsuo Tamai, Shinji Sano, Yusaku Maeno, Satoshi Murakami
2006 conf
SELMAS (LNCS)
Tetsuo Tamai, Naoyasu Ubayashi, Ryoichi Ichiyama
2005 A* conf
ASE
Naoyasu Ubayashi, Genki Moriyama, Hidehiko Masuhara, Tetsuo Tamai
2005 C conf
APSEC
Toshiro Mise, Masaaki Hashimoto, Keiichi Katamine, Yasufumi Shinyashiki, Naoyasu Ubayashi, Takako Nakatani
2005 A* conf
ICSE
Tetsuo Tamai, Naoyasu Ubayashi, Ryoichi Ichiyama
2005 conf
MACS@ICSE
Naoyasu Ubayashi, Tetsuo Tamai
2005 J jnl
ACM SIGSOFT Softw. Eng. Notes
Naoyasu Ubayashi, Tetsuo Tamai
2005 B conf
GPCE
Naoyasu Ubayashi, Tetsuo Tamai, Shinji Sano, Yusaku Maeno, Satoshi Murakami
2005 conf
IWPSE
Naoyasu Ubayashi, Shinji Sano, Yusaku Maeno, Satoshi Murakami, Tetsuo Tamai
2004 conf
RAM-SE
Naoyasu Ubayashi, Hidehiko Masuhara, Tetsuo Tamai
2004 conf
AOSD
Kouhei Sakurai, Hidehiko Masuhara, Naoyasu Ubayashi, Saeko Matsuura, Seiichi Komiya
2002 conf
AOSD
Naoyasu Ubayashi, Tetsuo Tamai
2002 J jnl
Syst. Comput. Jpn.
Naoyasu Ubayashi, Tetsuo Tamai
2001 conf
Reflection
Naoyasu Ubayashi, Tetsuo Tamai
1999 C conf
APSEC
Naoyasu Ubayashi, Tetsuo Tamai
1997 J jnl
Syst. Comput. Jpn.
Naoyasu Ubayashi, Atsuo Ohki, Yasushi Kuno
tests/unit/test_apk_dataclasses.py
← Index tests/unit/test_apk_dataclasses.py python
"""
Unit tests for APK dataclasses in redb/models/dataclasses.py.
"""
import pytest
from dataclasses import asdict, fields

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


# ============================================================================
# APKFeatures
# ============================================================================

class TestAPKFeaturesDataclass:
    """Tests for APKFeatures dataclass."""

    def test_named_fields(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            app_name="Example App",
            version_code=1,
            version_name="1.0.0",
        )
        assert f.package_name == "com.example.app"
        assert f.app_name == "Example App"
        assert f.version_code == 1
        assert f.version_name == "1.0.0"

    def test_all_fields_default_none_or_safe(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures()
        # Nullable fields default to None
        assert f.package_name is None
        assert f.app_name is None
        assert f.version_code is None
        assert f.version_name is None
        assert f.min_sdk_version is None
        assert f.target_sdk_version is None
        assert f.compile_sdk_version is None
        assert f.main_activity is None
        # Non-nullable fields have safe defaults
        assert f.is_debuggable is False
        assert f.allow_backup is True
        assert f.uses_cleartext_traffic is False
        assert f.supported_abis == []
        assert f.dex_count == 0
        assert f.total_dex_size == 0
        assert f.total_file_count == 0
        assert f.has_native_code is False
        assert f.has_assets is False
        assert f.uses_libraries == []
        assert f.earliest_content_modification is None
        assert f.latest_content_modification is None
        assert f.contains_embedded_apk is False

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.malware.test",
            app_name="Malware",
            version_code=42,
            version_name="6.6.6",
            min_sdk_version=21,
            target_sdk_version=33,
            compile_sdk_version=33,
            main_activity="com.malware.test.MainActivity",
            is_debuggable=True,
            allow_backup=False,
            uses_cleartext_traffic=True,
            supported_abis=["armeabi-v7a", "arm64-v8a", "x86"],
            dex_count=3,
            total_dex_size=5000000,
            total_file_count=200,
            has_native_code=True,
            has_assets=True,
            uses_libraries=["com.google.android.maps"],
            earliest_content_modification="2024-01-01T00:00:00Z",
            latest_content_modification="2024-06-15T12:00:00Z",
            contains_embedded_apk=True,
        )
        assert f.is_debuggable is True
        assert f.dex_count == 3
        assert len(f.supported_abis) == 3
        assert f.contains_embedded_apk is True

    def test_asdict_roundtrip(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.test",
            app_name="Test",
            version_code=1,
            version_name="1.0",
        )
        d = asdict(f)
        assert d["package_name"] == "com.test"
        assert d["is_debuggable"] is False
        assert d["supported_abis"] == []

    def test_partial_extraction(self):
        """Verify that APKFeatures can be created with only some fields populated,
        simulating a partial extraction where some fields failed."""
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            # app_name failed to extract — left as None
            version_code=10,
            # version_name failed to extract — left as None
            is_debuggable=True,
            dex_count=2,
        )
        assert f.package_name == "com.example.app"
        assert f.app_name is None
        assert f.version_code == 10
        assert f.version_name is None
        assert f.is_debuggable is True
        assert f.dex_count == 2


# ============================================================================
# APKManifestComponent
# ============================================================================

class TestAPKManifestComponentDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKManifestComponent

        c = APKManifestComponent(
            component_type="activity",
            class_name="com.example.MainActivity",
            is_exported=True,
            intent_actions=["android.intent.action.MAIN"],
            intent_categories=["android.intent.category.LAUNCHER"],
        )
        assert c.component_type == "activity"
        assert c.class_name == "com.example.MainActivity"
        assert c.is_exported is True
        assert len(c.intent_actions) == 1
        assert len(c.intent_categories) == 1

    def test_defaults(self):
        from redb.models.dataclasses import APKManifestComponent

        c = APKManifestComponent(
            component_type="service",
            class_name="com.example.MyService",
            is_exported=False,
        )
        assert c.intent_actions == []
        assert c.intent_categories == []


# ============================================================================
# APKManifest
# ============================================================================

class TestAPKManifestDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=5,
            service_count=2,
            receiver_count=3,
            provider_count=1,
        )
        assert m.activity_count == 5
        assert m.service_count == 2
        assert m.receiver_count == 3
        assert m.provider_count == 1

    def test_optional_list_defaults(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=0,
            service_count=0,
            receiver_count=0,
            provider_count=0,
        )
        assert m.activities == []
        assert m.services == []
        assert m.receivers == []
        assert m.providers == []
        assert m.exported_components == []
        assert m.intent_filters_by_action == []
        assert m.intent_filters_by_category == []
        assert m.uses_features == []
        assert m.meta_data is None
        assert m.manifest_xml is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=2,
            service_count=1,
            receiver_count=1,
            provider_count=0,
            activities=["MainActivity", "SettingsActivity"],
            services=["SyncService"],
            receivers=["BootReceiver"],
            providers=[],
            exported_components=["MainActivity", "BootReceiver"],
            intent_filters_by_action=["android.intent.action.MAIN"],
            uses_features=["android.hardware.camera"],
            manifest_xml="<manifest>...</manifest>",
        )
        assert len(m.activities) == 2
        assert len(m.exported_components) == 2
        assert m.manifest_xml is not None


# ============================================================================
# APKPermission / APKPermissions
# ============================================================================

class TestAPKPermissionDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKPermission

        p = APKPermission(
            permission_name="android.permission.CAMERA",
            protection_level="dangerous",
        )
        assert p.permission_name == "android.permission.CAMERA"
        assert p.protection_level == "dangerous"
        assert p.is_custom is False

    def test_custom_permission(self):
        from redb.models.dataclasses import APKPermission

        p = APKPermission(
            permission_name="com.example.CUSTOM_PERM",
            protection_level="signature",
            is_custom=True,
        )
        assert p.is_custom is True


class TestAPKPermissionsDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKPermissions

        p = APKPermissions(
            total_permission_count=10,
            dangerous_permission_count=3,
        )
        assert p.total_permission_count == 10
        assert p.dangerous_permission_count == 3

    def test_defaults(self):
        from redb.models.dataclasses import APKPermissions

        p = APKPermissions(
            total_permission_count=0,
            dangerous_permission_count=0,
        )
        assert p.permissions == []
        assert p.dangerous_permissions == []
        assert p.custom_permissions == []
        assert p.permission_details == []
        assert p.permhash is None

    def test_with_permission_details(self):
        from redb.models.dataclasses import APKPermission, APKPermissions

        details = [
            APKPermission("android.permission.INTERNET", "normal"),
            APKPermission("android.permission.CAMERA", "dangerous"),
        ]
        p = APKPermissions(
            total_permission_count=2,
            dangerous_permission_count=1,
            permissions=["android.permission.INTERNET", "android.permission.CAMERA"],
            dangerous_permissions=["android.permission.CAMERA"],
            permission_details=details,
            permhash="abc123def456",
        )
        assert len(p.permission_details) == 2
        assert p.permhash == "abc123def456"


# ============================================================================
# APKCertificate / APKCodeSigningInfo
# ============================================================================

class TestAPKCertificateDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKCertificate

        c = APKCertificate(
            subject="CN=Android Debug",
            issuer="CN=Android Debug",
            serial_number="1234567890",
            valid_from="2024-01-01",
            valid_to="2054-01-01",
            thumbprint_sha1="aabbccdd" * 5,
            thumbprint_sha256="aabbccdd" * 8,
        )
        assert c.subject == "CN=Android Debug"
        assert c.issuer == "CN=Android Debug"
        assert c.is_self_signed is False

    def test_optional_fields(self):
        from redb.models.dataclasses import APKCertificate

        c = APKCertificate(
            subject="CN=Test",
            issuer="CN=CA",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
            algorithm="SHA256withRSA",
            key_size=2048,
            is_self_signed=True,
        )
        assert c.algorithm == "SHA256withRSA"
        assert c.key_size == 2048
        assert c.is_self_signed is True


class TestAPKCodeSigningInfoDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKCodeSigningInfo

        info = APKCodeSigningInfo(
            _id="abcdef1234567890" * 4,
            is_signed=True,
        )
        assert info.is_signed is True
        assert info.signature_scheme_versions == []
        assert info.number_of_certificates == 0
        assert info.x509_certificates is None
        assert info.apk_signer_subject is None
        assert info.apk_signer_issuer is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKCertificate, APKCodeSigningInfo

        cert = APKCertificate(
            subject="CN=Test",
            issuer="CN=Test",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
        )
        info = APKCodeSigningInfo(
            _id="cc" * 32,
            is_signed=True,
            signature_scheme_versions=[1, 2, 3],
            number_of_certificates=1,
            x509_certificates=[cert],
            apk_signer_subject="CN=Test",
            apk_signer_issuer="CN=Test",
        )
        assert len(info.signature_scheme_versions) == 3
        assert info.number_of_certificates == 1
        assert len(info.x509_certificates) == 1


# ============================================================================
# APKDexFile
# ============================================================================

class TestAPKDexFileDataclass:

    def test_required_fields(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
        )
        assert d.filename == "classes.dex"
        assert d.class_count == 100
        assert d.method_count == 500
        assert d.string_count == 1000

    def test_optional_fields_defaults(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes2.dex",
            sha256="bb" * 32,
            class_count=0,
            method_count=0,
            string_count=0,
        )
        assert d.tlsh is None
        assert d.top_packages is None
        assert d.api_usage is None
        assert d.obfuscation_indicators is None

    def test_tlsh_populated(self):
        from redb.models.dataclasses import APKDexFile

        tlsh_value = "T1" + "A" * 68
        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
            tlsh=tlsh_value,
        )
        assert d.tlsh == tlsh_value

    def test_with_api_usage(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes.dex",
            sha256="cc" * 32,
            class_count=50,
            method_count=200,
            string_count=300,
            top_packages=[{"name": "com.example", "class_count": 30}],
            api_usage={
                "crypto": ["Ljavax/crypto/Cipher;->getInstance"],
                "reflection": ["Ljava/lang/Class;->forName"],
            },
            obfuscation_indicators={"short_class_names_ratio": 0.8, "single_char_methods_ratio": 0.5},
        )
        assert len(d.api_usage) == 2
        assert d.obfuscation_indicators["short_class_names_ratio"] == 0.8


# ============================================================================
# APKResource
# ============================================================================

class TestAPKResourceDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKResource

        r = APKResource(
            path="res/drawable/icon.png",
            size=1024,
            sha256="dd" * 32,
            filetype_magika="png",
        )
        assert r.path == "res/drawable/icon.png"
        assert r.size == 1024
        assert r.is_suspicious is False

    def test_suspicious_resource(self):
        from redb.models.dataclasses import APKResource

        r = APKResource(
            path="assets/payload.dex",
            size=50000,
            sha256="ee" * 32,
            filetype_magika="dex",
            is_suspicious=True,
        )
        assert r.is_suspicious is True


# ============================================================================
# APKNativeLib
# ============================================================================

class TestAPKNativeLibDataclass:

    def test_creation(self):
        from redb.models.dataclasses import APKNativeLib

        lib = APKNativeLib(
            abi="arm64-v8a",
            filename="libnative.so",
            size=200000,
            sha256="ff" * 32,
        )
        assert lib.abi == "arm64-v8a"
        assert lib.filename == "libnative.so"
        assert lib.is_known_packer is False

    def test_known_packer(self):
        from redb.models.dataclasses import APKNativeLib

        lib = APKNativeLib(
            abi="armeabi-v7a",
            filename="libjiagu.so",
            size=100000,
            sha256="aa" * 32,
            is_known_packer=True,
        )
        assert lib.is_known_packer is True


# ============================================================================
# APKInconsistencyTests
# ============================================================================

class TestAPKInconsistencyTestsDataclass:

    def test_all_defaults_none(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests()
        assert t.test_zip_bomb is None
        assert t.test_zip_duplicate_entries is None
        assert t.test_zip_path_traversal is None
        assert t.test_zip_suspicious_timestamps is None
        assert t.test_hidden_dex_files is None
        assert t.test_manifest_component_mismatch is None
        assert t.test_debuggable_release is None
        assert t.test_emulator_detection_strings is None
        assert t.test_debugger_detection is None
        assert t.test_root_detection is None

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests(
            test_zip_bomb=True,
            test_zip_duplicate_entries=False,
            test_zip_path_traversal=True,
            test_zip_suspicious_timestamps=False,
            test_hidden_dex_files=True,
            test_manifest_component_mismatch=False,
            test_debuggable_release=True,
            test_emulator_detection_strings=True,
            test_debugger_detection=False,
            test_root_detection=True,
        )
        assert t.test_zip_bomb is True
        assert t.test_debuggable_release is True
        # Count true values
        d = asdict(t)
        true_count = sum(1 for v in d.values() if v is True)
        assert true_count == 6

    def test_field_count(self):
        from redb.models.dataclasses import APKInconsistencyTests

        # Exactly 10 inconsistency tests per PDD specification
        assert len(fields(APKInconsistencyTests)) == 10


# ============================================================================
# Hashes dataclass — APK permhash field
# ============================================================================

class TestHashesAPKField:

    def test_permhash_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.permhash is None

    def test_permhash_populated(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e",
            permhash="abc123" * 10 + "abcd",
        )
        assert h.permhash is not None
        assert len(h.permhash) == 64


# ============================================================================
# Tag enum — APK entries
# ============================================================================

class TestAPKTagEnum:

    def test_all_apk_tags_exist(self):
        from redb.extractors.enum import Tag

        expected_tags = [
            "APK_FEATURES", "APK_MANIFEST", "APK_PERMISSIONS", "APK_SIGNATURE",
            "APK_DEX", "APK_RESOURCES", "APK_NATIVE_LIBS", "APK_INCONSISTENCY_TESTS",
        ]
        for name in expected_tags:
            assert hasattr(Tag, name), f"Tag.{name} missing"

    def test_apk_tag_values(self):
        from redb.extractors.enum import Tag

        assert Tag.APK_FEATURES.value == "apk_features"
        assert Tag.APK_MANIFEST.value == "apk_manifest"
        assert Tag.APK_PERMISSIONS.value == "apk_permissions"
        assert Tag.APK_SIGNATURE.value == "apk_signature"
        assert Tag.APK_DEX.value == "apk_dex"
        assert Tag.APK_RESOURCES.value == "apk_resources"
        assert Tag.APK_NATIVE_LIBS.value == "apk_native_libs"
        assert Tag.APK_INCONSISTENCY_TESTS.value == "apk_inconsistency_tests"