Kang Zhang

280 papers A* 3A 4B 21C 47Misc 12Journal 117Unranked 73
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Hum. Comput. Stud.
Rong Huang, Yihan Hou, Mela Bettega, Kang Zhang, Wei Zeng
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Yu-Ao Wang, James She, Troy TianYu Lin, Kang Zhang
2025 J jnl
Vis. Comput. Ind. Biomed. Art
Rem RunGu Lin, Koo Yongen Ke, Kang Zhang
2025 conf
3DV
Zhijing Shao, Duotun Wang, Qing-Yao Tian, Yao-Dong Yang, Hengyu Meng, Zeyu Cai, Bo Dong, Yu Zhang, Kang Zhang, Zeyu Wang
2025 J jnl
Proc. ACM Comput. Graph. Interact. Tech.
Troy TianYu Lin, Boyan Zheng, Haichuan Lin, Wen You, Kang Zhang, Chen Liang
2025 J jnl
ACM Journal on Computing and Cultural Heritage
Troy TianYu Lin, James She, Yu-Ao Wang, Kang Zhang
2025 C conf
VINCI
Ziwei Wu, Xinyu Ma, Kang Zhang
2025 C conf
VINCI
Jiawen Zhang, Mingyu Chen, Jiaqi Shi, Xin Tong, Kang Zhang
2025 B conf
TEI
Aven Le Zhou, Lei Xi, Kang Zhang
2025 A* conf
ACM Multimedia
Tiancheng Liu, Jiayi Ye, Shumeng Zhang, Kang Zhang, Chen Liang
2025 conf
ARTECH
Haoxuan Wang, Zirui Wu, Kang Zhang
2025 C conf
EvoMUSART
Aven Le Zhou, Wei Wu, Yu-Ao Wang, Kang Zhang
2025 J jnl
CoRR
Jiayang Huang, Lingjie Li, Kang Zhang, David Kei-Man Yip
2025 A* conf
CHI
Chao Liu, Mingyang Su, Yan Xiang, Yuru Huang, Yiqian Yang, Kang Zhang, Mingming Fan
2025 J jnl
IEEE Computer Graphics and Applications
Yilin Ye, Rong Huang, Kang Zhang, Wei Zeng
2024 J jnl
CoRR
Aven Le Zhou, Lei Xi, Kang Zhang
2024 J jnl
Proc. ACM Comput. Graph. Interact. Tech.
Rem RunGu Lin, Botao Amber Hu, Koo Yongen Ke, Wei Wu, Kang Zhang
2024 J jnl
CoRR
Zhijing Shao, Duotun Wang, Qing-Yao Tian, Yao-Dong Yang, Hengyu Meng, Zeyu Cai, Bo Dong, Yu Zhang, Kang Zhang, Zeyu Wang
2024 J jnl
CoRR
Aven Le Zhou, Yu-Ao Wang, Wei Wu, Kang Zhang
2024 J jnl
CoRR
Aven Le Zhou, Lei Xi, Kang Zhang
2024 J jnl
CoRR
Aven Le Zhou, Lei Xi, Kang Zhang
2024 A* conf
CHI
Rong Huang, Haichuan Lin, Chuanzhang Chen, Kang Zhang, Wei Zeng
2024 J jnl
CoRR
Aven Le Zhou, Wei Wu, Yu-Ao Wang, Kang Zhang
2024 J jnl
Vis. Comput. Ind. Biomed. Art
Rem RunGu Lin, Kang Zhang
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Yilin Ye, Qian Zhu, Shishi Xiao, Kang Zhang, Wei Zeng
2023 J jnl
Vis. Comput.
Zhenbao Fan, Yixuan Zhu, Slobodan Markovic, Kang Zhang
2023 J jnl
CoRR
Aven Le Zhou, Jiayi Ye, Tianchen Liu, Kang Zhang
2023 C conf
VINCI
Yufan Li, Yue Huang, Kang Zhang, Varvara Guljajeva
2023 C conf
VINCI
Lei Xia, Yi-Ping Gao, Le Lin, Yu-Xi Chen, Kang Zhang
2023 J jnl
J. Vis.
Yufan Li, Zhenbao Fan, Yixuan Zhu, Christine Yan, Kang Zhang
2023 J jnl
IEEE Trans. Learn. Technol.
Kang Zhang, Zhijing Shao, Yun Lu, Ying Yu, Wei Sun, Zeyu Wang
2023 C conf
VINCI
Zixu Gong, Kang Zhang, Rongrong Chen
2023 conf
SIGGRAPH Asia Art Papers
Rem RunGu Lin, Kang Zhang
2023 C conf
VINCI
Kelin Li, Hong Yin, Dong Li, Kang Zhang, Changbo Wang
2023 C conf
VINCI
Bingyuan Wang, Kang Zhang, Zeyu Wang
2023 conf
ARTECH
Aven Le Zhou, Kang Zhang, David Kei-Man Yip
2023 J jnl
CoRR
Aven Le Zhou, Kang Zhang, David Kei-Man Yip
2023 C ed.
VINCI
Roger Malina, Kang Zhang, Wei Zeng, Günter Wallner
2023 J jnl
CoRR
Yilin Ye, Qian Zhu, Shishi Xiao, Kang Zhang, Wei Zeng
2023 C conf
VINCI
Rem RunGu Lin, Koo Yongen Ke, Kang Zhang
2022 J jnl
Vis. Informatics
Yongjian Sun, Jie Li, Siming Chen, Gennady L. Andrienko, Natalia V. Andrienko, Kang Zhang
2022 J jnl
Comput. J.
Zhen Bao Fan, Yi-Na Li, Kang Zhang, Jinhui Yu, Mao Lin Huang
2022 J jnl
Vis. Comput.
Lingchen Dai, Kang Zhang, Xianjun Sam Zheng, Ralph R. Martin, Yi-Na Li, Jinhui Yu
2021 J jnl
Multim. Tools Appl.
Peichi Zhou, Zipeng Zhao, Kang Zhang, Chen Li, Changbo Wang
2021 J jnl
Comput. J.
Yufeng Liu, Xiaoqin Zeng, Kang Zhang, Yang Zou
2020 J jnl
Vis. Comput.
Huan Yang, Yi-Na Li, Kang Zhang
2020 J jnl
J. Comput. Sci. Coll.
Pushpa Kumar, Kang Zhang
2020 J jnl
J. Comput. Lang.
Jiajing Zhang, Kang Zhang, Ren Peng, Jinhui Yu
2020 J jnl
J. Vis.
Lu Yang, Jie Li, Wenhuan Lu, Yi Chen, Kang Zhang, Yan Li
2020 J jnl
Vis. Comput.
Guanyu Lian, Kang Zhang
2020 J jnl
J. Vis. Lang. Sentient Syst.
Chunying Zhao, Cong Chen, Kang Zhang, Jun Kong
2020 J jnl
Vis. Comput. Ind. Biomed. Art
Zhen Bao Fan, Kang Zhang
2019 A conf
SANER
Cong Chen, Yulong Yang, Lin Yang, Kang Zhang
2019 J jnl
J. Comput. Sci. Technol.
Mohan Zhang, Jinhui Yu, Kang Zhang, Junsong Zhang
2019 J jnl
IEEE Trans. Vis. Comput. Graph.
Jie Li, Siming Chen, Kang Zhang, Gennady L. Andrienko, Natalia V. Andrienko
2019 C conf
VINCI
Han Sun, Zhijun Peng, Kang Zhang
2019 C conf
VINCI
Lu Yang, Jie Li, Wenhuan Lu, Yi Chen, Kang Zhang, Yan Li
2019 J jnl
Int. J. Arts Technol.
Hanqing Zhao, Kang Zhang
2019 J jnl
Inf. Sci.
Yi-Na Li, Kang Zhang, Dong-Ni Hu, Mao Lin Huang
2019 J jnl
Vis. Comput.
Zhuang Cai, Kang Zhang, Dong-Ni Hu
2018 J jnl
Softw. Pract. Exp.
Yufeng Liu, Xiaoqin Zeng, Yang Zou, Kang Zhang
2018 conf
DMSVIVA
Yufeng Liu, Zhan Shi, Yingfeng Wang, Yang Zou, Jun Kong, Kang Zhang, Xiaoqin Zeng
2018 J jnl
J. Vis. Lang. Sentient Syst.
Xiaoqin Zeng, Yufeng Liu, Zhan Shi, Yingfeng Wang, Yang Zou, Jun Kong, Kang Zhang
2018 J jnl
Vis. Comput. Ind. Biomed. Art
Yihang Bo, Jinhui Yu, Kang Zhang
2018 J jnl
IEEE Trans. Vis. Comput. Graph.
Mohan Zhang, Hongwei Lin, Kang Zhang, Jinhui Yu
2018 conf
IWISC
Xiao-Yu Wang, Kang Zhang
2018 C conf
VINCI
Xiao-Yu Wang, Yu-feng Liu, Jie Li, Kang Zhang
2018 conf
IWISC
Yufeng Liu, Xiaoqin Zeng, Kang Zhang
2018 J jnl
Spatial Cogn. Comput.
Yufeng Liu, Kang Zhang, Jun Kong, Yang Zou, Xiaoqin Zeng
2018 J jnl
Comput. J.
Meng-Jia Zhang, Kang Zhang, Jie Li, Yi-Na Li
2018 J jnl
Pers. Ubiquitous Comput.
Zhao Xiao, Yuelei Li, Kang Zhang
2017 J jnl
CoRR
Jinhui Yu, Kailin Wu, Kang Zhang, Xianjun Sam Zheng
2017 J jnl
J. Vis.
Jie Li, Zhao-Peng Meng, Mao Lin Huang, Kang Zhang
2017 J jnl
ACM Trans. Appl. Percept.
Jiajing Zhang, Jinhui Yu, Kang Zhang, Xianjun Sam Zheng, Junsong Zhang
2017 book
Leen Ammeraal, Kang Zhang
2017 C conf
VINCI
Jiajing Zhang, Kang Zhang, Ren Peng, Jinhui Yu
2017 J jnl
ACM Trans. Appl. Percept.
Yi-Na Li, Kang Zhang, Dong-Jin Li
2017 J jnl
J. Vis. Lang. Comput.
Yuhua Liu, Changbo Wang, Peng Ye, Kang Zhang
2017 J jnl
J. Vis.
Yi-Na Li, Dong-Jin Li, Kang Zhang
2017 C conf
VINCI
Kang Zhang, Yihang Bo, Yi Yang
2017 B conf
SAP
Zhen Bao Fan, Yi-Na Li, Jinhui Yu, Kang Zhang
2017 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Jun Duan, Kang Zhang, Kevin W. Hamlen
2016 J jnl
Mob. Inf. Syst.
Veera V. S. M. Chintapalli, Wenyuan Tao, Zhao-Peng Meng, Kang Zhang, Jun Kong, Yue Ge
2016 conf
SIGGRAPH Asia Posters
Guanyu Lian, Yanli Wang, Kang Zhang, Li Yao
2016 conf
VRCAI
Meng-Jia Zhang, Jie Li, Kang Zhang
2016 J jnl
J. Vis. Lang. Comput.
Wenbo Wang, Mao Lin Huang, Quang Vinh Nguyen, Weidong Huang, Kang Zhang, Tze-Haw Huang
2016 C conf
VINCI
Lu Xiong, Kang Zhang
2016 J jnl
Inf. Sci.
Kang Zhang, Xianjun Sam Zheng
2016 J jnl
J. Vis. Lang. Comput.
Du Zhang, Mehmet A. Orgun, Kang Zhang
2016 J jnl
Inf. Sci.
Amin Roudaki, Jun Kong, Kang Zhang
2016 J jnl
J. Vis.
Peng Ye, Changbo Wang, Yuhua Liu, Qiaoming Zhu, Kang Zhang
2016 J jnl
J. Vis.
Jie Li, Zhao Xiao, Hanqing Zhao, Zhao-Peng Meng, Kang Zhang
2015 J jnl
J. Vis. Lang. Comput.
Abhishek P. Chhetri, Kang Zhang, Eakta Jain
2015 C conf
VINCI
Jie Li, Zhao-Peng Meng, Mao Lin Huang, Kang Zhang
2015 J jnl
J. Vis.
Yuhua Liu, Changbo Wang, Peng Ye, Kang Zhang
2015 J jnl
J. Vis. Lang. Comput.
Changbo Wang, Yuhua Liu, Zhao Xiao, Aoying Zhou, Kang Zhang
2015 B conf
PacificVis
Zhuang Cai, Yi-Na Li, Xianjun Sam Zheng, Kang Zhang
2015 J jnl
J. Big Data
Yalong Yang, Kang Zhang, Jianrong Wang, Quang Vinh Nguyen
2015 J jnl
Vis. Comput.
Yan Zheng, Xuecheng Nie, Zhao-Peng Meng, Wei Feng, Kang Zhang
2015 C conf
VINCI
Yi-Na Li, Dong-Jin Li, Kang Zhang
2015 conf
CAAD Futures
Kai Liao, Bauke de Vries, Jun Kong, Kang Zhang
2015 J jnl
IEEE Computer Graphics and Applications
Kang Zhang, Quang Vinh Nguyen, Zhao-Peng Meng, Wenyuan Tao
2015 J jnl
IEEE Trans. Hum. Mach. Syst.
Quang Vinh Nguyen, Kang Zhang, Simeon J. Simoff
2015 C conf
VINCI
Meng-Jia Zhang, Jie Li, Kang Zhang
2015 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Meng-Yao Chen, Cong Chen, Shu-Qing Liu, Kang Zhang
2015 conf
SmartCity
Chao Wen, Kang Zhang, Jie Li, Fanrui Sun
2014 conf
IEEE VAST
Ying Zhao, Yanni Peng, Wei Huang, Yong Li, Fangfang Zhou, Zhifang Liao, Kang Zhang
2014 J jnl
World Wide Web
Krishna C. Chinthakayala, Chunying Zhao, Jun Kong, Kang Zhang
2014 conf
DMS
Yi-Na Li, Chi Yao, Dong-Jin Li, Kang Zhang
2014 J jnl
J. Vis. Lang. Comput.
Yi-Na Li, Chi Yao, Dong-Jin Li, Kang Zhang
2014 C conf
ICIS
Wenyuan Tao, Yaxuan Liu, Kang Zhang
2014 C conf
ICIS
Peng Wang, Kang Zhang, Xiaonan Song, Tianyi Zhou, Dongwei Gong
2014 C conf
VINCI
Meng-Yao Chen, Cong Chen, Shu-Qing Liu, Kang Zhang
2014 C conf
ICGSE
Cong Chen, Kang Zhang
2014 conf
IEEE VAST
Zhuang Cai, Meng-Yao Chen, Hanqing Zhao, Ying Zhao, Fangfang Zhou, Kang Zhang
2014 conf
IEEE VAST
Jie Li, Kang Zhang, Zhao-Peng Meng
2014 Misc conf
SAC
Jie Li, Zhao-Peng Meng, Kang Zhang
2014 Misc conf
SAC
Yalong Yang, Ning Dou, Shuai Zhao, Zhichao Yang, Kang Zhang, Quang Vinh Nguyen
2014 conf
ICSE Companion
Cong Chen, Kang Zhang
2013 J jnl
J. Vis. Lang. Comput.
Cong Chen, Wenyuan Tao, Kang Zhang
2013 C conf
VINCI
Abhishek P. Chhetri, Kang Zhang, Eakta Jain
2013 ed.
ENASE (Selected Papers)
Leszek A. Maciaszek, Kang Zhang
2013 conf
SIGGRAPH ASIA Art Gallery
Kang Zhang, Jinhui Yu
2013 J jnl
IEEE Trans. Hum. Mach. Syst.
Changbo Wang, Zhao Xiao, Yuhua Liu, Yanru Xu, Aoying Zhou, Kang Zhang
2012 conf
ICMLA (2)
Tze-Haw Huang, Mao Lin Huang, Kang Zhang
2012 C conf
VINCI
Cong Chen, Kang Zhang
2012 C conf
CDVE
Cong Chen, Kang Zhang, Takayuki Itoh
2012 B conf
AVI
Ai Gomi, Takayuki Itoh, Kang Zhang
2012 conf
ACIS-ICIS
Abhishek P. Chhetri, Kang Zhang
2012 J jnl
J. Vis. Lang. Comput.
Kang Zhang
2012 J jnl
IEEE Trans. Syst. Man Cybern. Part C
Jun Kong, Omer Barkol, Ruth Bergman, Ayelet Pnueli, Sagi Schein, Kang Zhang, Chunying Zhao
2011 conf
ACIS-ICIS
Kun Tian, Kendra M. L. Cooper, Kang Zhang
2011 C conf
VINCI
Jie Hao, Kang Zhang
2011 B conf
ENASE
Cong Chen, Kang Zhang
2011 conf
ENASE (Selected Papers)
Cong Chen, Kang Zhang
2011 C conf
VINCI
Su Te Lei, Kang Zhang
2010 C ed.
VINCI
Guozhong Dai, Kang Zhang, Mao Lin Huang, Hongan Wang, Xiaoru Yuan, Linmi Tao, Wei Chen
2010 Misc conf
IRI
Kun Tian, Kendra M. L. Cooper, Kang Zhang
2010 C conf
VINCI
Su Te Lei, Kang Zhang
2010 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Reda Alhajj, Kang Zhang
2010 J jnl
J. Vis. Lang. Comput.
Kang Zhang
2010 J jnl
IEEE Trans. Software Eng.
Chunying Zhao, Jun Kong, Kang Zhang
2010 conf
IHI
Abhishek P. Chhetri, Forrest Wen, Yizhong Wang, Kang Zhang
2010 conf
SSIRI
Kun Tian, Kendra M. L. Cooper, Kang Zhang, Siyuan Liu
2010 C ed.
VINCI
Mao Lin Huang, Quang Vinh Nguyen, Kang Zhang
2009 conf
SSIRI
Kun Tian, Kendra M. L. Cooper, Kang Zhang, Huiqun Yu
2009 Misc conf
SAC
Chunying Zhao, Kang Zhang, Yu Lei
2009 C conf
DASC
Pushpa Kumar, Li Wang, J. Chauhan, Kang Zhang
2009 C conf
VINCI
Pushpa Kumar, Kang Zhang, Mao Lin Huang
2009 conf
APWeb/WAIM
Jie Hao, Kang Zhang, Chad Allen Gabrysch, Qiaoming Zhu
2009 J jnl
J. Vis. Lang. Comput.
Pushpa Kumar, Kang Zhang
2009 conf
ACIS-ICIS
Pushpa Kumar, Nary Subramanian, Kang Zhang
2009 J jnl
Informatica (Slovenia)
Reda Alhajj, Kang Zhang
2009 J jnl
J. Syst. Softw.
Jun Kong, Kang Zhang, Jing Dong, Dianxiang Xu
2009 Misc conf
SAC
Pushpa Kumar, Kang Zhang
2009 conf
SSIRI
Chunying Zhao, Kang Zhang, Jie Hao, W. Eric Wong
2008 conf
HASE
Chunying Zhao, Kang Zhang
2008 J jnl
Comput. Support. Cooperative Work.
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2008 conf
ICTAI (1)
Jun Kong, Kevin L. Ates, Kang Zhang, Yan Gu
2008 B conf
MMM
Manoj M. Pawar, Gaurav N. Pradhan, Kang Zhang, Balakrishnan Prabhakaran
2008 conf
ICTAI (2)
Chunying Zhao, Keven Ates, Jun Kong, Kang Zhang
2008 conf
VISUAL
Pushpa Kumar, Nary Subramanian, Kang Zhang
2008 Misc conf
IRI
Stuart Harvey Rubin, Shu-Ching Chen, Lotfi A. Zadeh, Hojjat Adeli, Mohammad Rifaie, Gordon K. Lee, Kang Zhang, Reda Alhajj, Gary D. Boetticher, Du Zhang
2008 ch.
Wiley Encyclopedia of Computer Science and Engineering
Kang Zhang, Jun Kong, Jiannong Cao
2008 C conf
IV
Pushpa Kumar, Kang Zhang, Yuke Wang
2008 J jnl
Comput. Geosci.
Yu Qian, Fang Qiu, Jie Chang, Kang Zhang
2007 conf
PKDD
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2007 C conf
CIDM
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2007 conf
EUC Workshops
Su Te Lei, Kang Zhang, Edwin Hsing-Mean Sha
2007 conf
HICSS
Chunying Zhao, Jun Kong, Kang Zhang
2007 conf
VISUAL
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2007 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Kang Zhang, George Spanoudakis, Giuseppe Visaggio
2007 J jnl
J. Vis. Lang. Comput.
Kang Zhang
2007 J jnl
J. Vis. Lang. Comput.
Chunying Zhao, Jun Kong, Jing Dong, Kang Zhang
2007 conf
VISUAL
Jie Hao, Kang Zhang, Mao Lin Huang
2007 conf
ICEBE
Pushpa Kumar, Kang Zhang
2007 C conf
SEW
Chunying Zhao, Kang Zhang
2007 J jnl
J. Vis. Lang. Comput.
Guido Wirtz, Kang Zhang
2007 conf
HICSS
Guido Wirtz, Kang Zhang
2007 J jnl
IEEE Trans. Software Eng.
Jing Dong, Sheng Yang, Kang Zhang
2006 C conf
CSCWD
Jun Kong, Guang-Lei Song, Kang Zhang, Mao Lin Huang
2006 conf
ECBS
Jing Dong, Sheng Yang, Kang Zhang
2006 conf
CGIV
Quang Vinh Nguyen, Mao Lin Huang, Yu Qian, Kang Zhang
2006 conf
CGIV
Quang Vinh Nguyen, Mao Lin Huang, Kang Zhang, I-Ling Yen
2006 J jnl
J. Vis. Lang. Comput.
Guang-Lei Song, Jun Kong, Kang Zhang
2006 J jnl
IEEE Trans. Neural Networks
Xiaoqin Zeng, Yingfeng Wang, Kang Zhang
2006 J jnl
Sci. China Ser. F Inf. Sci.
Jing Dong, Yongtao Sun, Sheng Yang, Kang Zhang
2006 C conf
ADMA
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2006 B conf
AVI
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang, Yihao Zhang
2006 J jnl
Multim. Tools Appl.
Kang Zhang
2006 B conf
CBMS
Guang-Lei Song, Yu Qian, Ying Liu, Kang Zhang
2006 C ed.
SEKE
Kang Zhang, George Spanoudakis, Giuseppe Visaggio
2006 J jnl
ACM Trans. Comput. Hum. Interact.
Jun Kong, Kang Zhang, Xiaoqin Zeng
2006 J jnl
Web Intell. Agent Syst.
Meikang Qiu, Kang Zhang, Mao Lin Huang
2006 B conf
VL/HCC
Kevin L. Ates, Kang Zhang, B. Prabhakaran
2005 C conf
SEW
Jun Kong, Kang Zhang, Jing Dong, Guang-Lei Song
2005 conf
ITCC (2)
Ganesha S. R. Shanmuganathan, Kang Zhang, W. Eric Wong, Yu Qi
2005 B conf
ICECCS
Jun Kong, Kang Zhang, Jing Dong
2005 Misc conf
IRI
Kang Zhang, Guang-Lei Song, Jun Kong
2005 J jnl
Multim. Syst.
Kang Zhang, Jun Kong, Mei Kang Qiu, Guang-Lei Song
2005 B conf
PAKDD
Yu Qian, Kang Zhang, Dung T. Huynh
2005 B conf
VL/HCC
Xiaoqin Zeng, Kang Zhang, Jun Kong, Guang-Lei Song
2005 B conf
DBSec
Guang-Lei Song, Kang Zhang, Bhavani Thuraisingham, Jun Kong
2005 Misc conf
SAC
Yu Qian, Kang Zhang, Fang Qiu
2005 Misc conf
SAC
Yu Qian, Kang Zhang
2005 conf
EEE
Guang-Lei Song, Kang Zhang, Bhavani Thuraisingham, Jiannong Cao
2005 conf
ITCC (2)
Jing Dong, Sheng Yang, Kang Zhang
2005 J jnl
Softw. Pract. Exp.
Fan Chan, Jiannong Cao, Alvin T. S. Chan, Kang Zhang
2004 C conf
SEKE
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2004 conf
Web Intelligence
Mei Kang Qiu, Kang Zhang, Mao Lin Huang
2004 conf
ISPAN
Jiannong Cao, Yifeng Chen, Kang Zhang, Yanxiang He
2004 B conf
PAKDD
Yu Qian, Kang Zhang, Wei Lai
2004 conf
DMKD
Yu Qian, Kang Zhang
2004 conf
SIGMOD Conference
Yu Qian, Gang Zhang, Kang Zhang
2004 Misc conf
SAC
Yu Qian, Kang Zhang
2004 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Kang Zhang
2004 conf
Web Intelligence
Guang-Lei Song, Kang Zhang, Raymond K. Wong, Jun Kong
2004 B conf
VL/HCC
Guang-Lei Song, Kang Zhang, Jun Kong
2004 B conf
VL/HCC
Jun Kong, Kang Zhang
2004 B conf
VL/HCC
Jun Kong, Kang Zhang
2004 C conf
IEEE International Workshop on Rapid System Prototyping
Kang Zhang, Guang-Lei Song, Jun Kong
2004 J jnl
J. Syst. Softw.
Jiannong Cao, Ying Liu, Li Xie, Bing Mao, Kang Zhang
2004 conf
ITCC (1)
Guang-Lei Song, Kang Zhang
2003 Misc conf
SAC
Yu Qian, Kang Zhang
2003 B conf
COMPSAC
Jun Kong, Kang Zhang, Jing Dong, Guang-Lei Song
2003 C conf
SEKE
Xiaoxing Ma, Jian Lu, Jiannong Cao, Alvin T. S. Chan, Kang Zhang
2003 conf
ACSC
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2003 conf
Applied Informatics
Jun Kong, Kang Zhang, Mao Lin Huang
2003 A conf
ICME
Jun Kong, Meikang Qiu, Kang Zhang
2003 J jnl
J. Vis. Lang. Comput.
Kang Zhang
2003 conf
VIP
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2003 J jnl
Sci. Comput. Program.
Jiannong Cao, Alvin T. S. Chan, Yudong Sun, Kang Zhang
2003 C conf
IDEAL
Yu Qian, Kang Zhang, Jiannong Cao
2003 conf
HCC
Mei Kang Qiu, Guang-Lei Song, Jun Kong, Kang Zhang
2003 conf
ICDCS Workshops
Jun Kong, Kang Zhang
2002 J jnl
IEEE Trans. Software Eng.
Nenad Stankovic, Kang Zhang
2002 conf
DCW
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2002 conf
DCW
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2002 conf
WECWIS
Kang Zhang, Mao Lin Huang, Kei-Chun Li
2002 B conf
ICPADS
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2002 C conf
Diagrams
Ke-Bing Zhang, Kang Zhang, Mehmet A. Orgun
2002 conf
EDCIS
Liyin Xue, Mehmet A. Orgun, Kang Zhang
2002 conf
VIP
Ke-Bing Zhang, Mehmet A. Orgun, Kang Zhang
2001 J jnl
Comput. J.
Da-Qian Zhang, Kang Zhang, Jiannong Cao
2001 conf
HCC
Kang Zhang, Da-Qian Zhang, Yi Deng
2001 J jnl
Comput. Syst. Sci. Eng.
Chuchang Liu, Mehmet A. Orgun, Kang Zhang
2001 C conf
ISADS
Liyin Xue, Kang Zhang, Chengzheng Sun
2001 J jnl
IEEE Trans. Software Eng.
Kang Zhang, Da-Qian Zhang, Jiannong Cao
2001 J jnl
Ann. Softw. Eng.
Kang Zhang, Da-Qian Zhang, Yi Deng
2001 J jnl
J. Vis. Lang. Comput.
Kang Zhang, Guido Wirtz
2001 J jnl
J. Vis. Lang. Comput.
Nenad Stankovic, Dieter Kranzlmüller, Kang Zhang
2001 conf
VIP
Ke-Bing Zhang, Kang Zhang, Mehmet A. Orgun
2001 J jnl
J. Vis. Lang. Comput.
Guido Wirtz, Kang Zhang
2001 A conf
ICME
Kang Zhang, Da-Qian Zhang
2000 J jnl
Softw. Pract. Exp.
Nenad Stankovic, Kang Zhang
2000 B conf
WISE
Liyin Xue, Kang Zhang, Chengzheng Sun
2000 J jnl
J. Syst. Softw.
Jiannong Cao, Graeme Bennett, Kang Zhang
2000 conf
ISPAN
Jiannong Cao, Y. Liu, Li Xie, Kang Zhang
1999 conf
ISCOPE
Nenad Stankovic, Kang Zhang
1999 conf
ISHPC
Nenad Stankovic, Kang Zhang
1999 J jnl
Parallel Comput.
Wentong Cai, Kang Zhang, Stephen John Turner, Chengzheng Sun
1999 conf
PVM/MPI
Nenad Stankovic, Kang Zhang
1999 J jnl
J. Supercomput.
Kei-Chun Li, Kang Zhang
1999 J jnl
J. Vis. Lang. Comput.
Kang Zhang, Tom Hintz, Xianwu Ma
1999 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Nenad Stankovic, Kang Zhang
1998 A conf
HPDC
Kang Zhang, Chengzheng Sun, Kei-Chun Li
1998 J jnl
Aust. Comput. J.
Kang Zhang, Da-Qian Zhang
1998 conf
PVM/MPI
Nenad Stankovic, Kang Zhang
1998 J jnl
J. Syst. Softw.
Jiannong Cao, Kang Zhang, Olivier Y. de Vel
1998 conf
VL
Da-Qian Zhang, Kang Zhang
1998 conf
VL
Da-Qian Zhang, Kang Zhang
1997 J jnl
J. Syst. Softw.
Su Te Lei, Kang Zhang, Kei-Chun Li
1997 conf
VL
Da-Qian Zhang, Kang Zhang
1997 conf
VL
Nenad Stankovic, Kang Zhang
1996 C conf
SEKE
Kang Zhang, Da-Qian Zhang
1995 conf
VL
Da-Qian Zhang, Kang Zhang
1994 J jnl
ACM SIGPLAN Notices
Kang Zhang
1994 B conf
ICPADS
Sute Lei, Kang Zhang
1994 Misc conf
SAC
Kang Zhang, Gaurav Marwaha
1993 J jnl
Future Gener. Comput. Syst.
Kang Zhang
tests/integration/test_basicproperties.py
← Index tests/integration/test_basicproperties.py python
"""
Integration tests for the BasicPropertiesExtractor class.
"""
import pytest
import os
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.integration]


class TestBasicPropertiesExtractorInitialization:
    """Tests for BasicPropertiesExtractor initialization."""

    def test_initialization(self, elf_binary_path, mock_logger):
        """Test basic initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.filepath == elf_binary_path
            assert extractor.basic_properties is None
            assert extractor.is_packed is None
            assert extractor.is_fat is None
            assert extractor.parent_sha256 is None
            assert extractor.child_sha256 is None
            assert extractor.child_architecture is None
            assert extractor.child_filetype is None

    def test_initialization_with_fat_params(self, elf_binary_path, mock_logger):
        """Test initialization with FAT Mach-O parameters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types
            )

            assert extractor.is_fat is True
            assert extractor.child_sha256 == child_hashes
            assert extractor.child_architecture == child_archs
            assert extractor.child_filetype == child_types

    def test_initialization_with_parent_sha256(self, elf_binary_path, mock_logger):
        """Test initialization with parent_sha256 for slice binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_sha256_hash_here"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )

            assert extractor.parent_sha256 == parent_hash

    def test_elastic_index_suffix(self, elf_binary_path, mock_logger):
        """Test that elastic_index has correct suffix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert "-basic_properties" in extractor.elastic_index


class TestBasicPropertiesExtractorTag:
    """Tests for tag method."""

    def test_tag_value(self, elf_binary_path, mock_logger):
        """Test that tag returns correct value."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.extractors.enum import Tag

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.tag() == Tag.BASIC_PROPERTIES.value
            assert extractor.tag() == "basic_properties"


class TestBasicPropertiesExtract:
    """Tests for extract method."""

    def test_extract_elf_binary(self, elf_binary_path, mock_logger):
        """Test extracting properties from ELF binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.sample_name == os.path.basename(elf_binary_path)
            assert result.filesize > 0
            assert result.file_entropy >= 0
            assert result.filetype is not None
            assert result.filetype_mime is not None
            assert result.filetype_magika is not None

    def test_extract_pe_binary(self, pe_binary_path, mock_logger):
        """Test extracting properties from PE binary."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor
        from redb.models.dataclasses import BasicProperties

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert isinstance(result, BasicProperties)
            assert result.filesize > 0
            # PE file should be detected
            assert "PE" in result.filetype or "executable" in result.filetype.lower()

    def test_extract_text_file(self, temp_text_file, mock_logger):
        """Test extracting properties from text file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert "text" in result.filetype.lower() or "ASCII" in result.filetype
            assert result.file_entropy >= 0

    def test_extract_stores_in_basic_properties(self, elf_binary_path, mock_logger):
        """Test that extract stores result in basic_properties attribute."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.basic_properties is None
            result = extractor.extract()
            assert extractor.basic_properties is result


class TestBasicPropertiesFiletype:
    """Tests for file type detection."""

    def test_elf_filetype(self, elf_binary_path, mock_logger):
        """Test ELF file type detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Should detect as ELF
            assert "ELF" in result.filetype

    def test_pe_filetype_mime(self, pe_binary_path, mock_logger):
        """Test PE file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # PE MIME types (varies by libmagic version)
            assert "dosexec" in result.filetype_mime or "x-msdownload" in result.filetype_mime or "portable-executable" in result.filetype_mime

    def test_text_filetype_mime(self, temp_text_file, mock_logger):
        """Test text file type MIME detection."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(temp_text_file, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Text MIME types
            assert "text" in result.filetype_mime


class TestBasicPropertiesEntropy:
    """Tests for entropy calculation in BasicPropertiesExtractor."""

    def test_entropy_reasonable_range(self, elf_binary_path, mock_logger):
        """Test that entropy is within reasonable range (0-8)."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert 0 <= result.file_entropy <= 8

    def test_entropy_rounded(self, elf_binary_path, mock_logger):
        """Test that entropy is rounded to 3 decimal places."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Check rounding to 3 decimal places
            entropy_str = str(result.file_entropy)
            if '.' in entropy_str:
                decimal_places = len(entropy_str.split('.')[1])
                assert decimal_places <= 3


class TestBasicPropertiesFilesize:
    """Tests for file size calculation."""

    def test_filesize_matches_actual(self, elf_binary_path, mock_logger):
        """Test that filesize matches actual file size."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            actual_size = os.path.getsize(elf_binary_path)
            assert result.filesize == actual_size

    def test_filesize_matches_binary_length(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that filesize matches binary content length."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result.filesize == len(elf_binary_content)


class TestBasicPropertiesPrepareExportData:
    """Tests for prepare_export_data method."""

    def test_prepare_export_elasticsearch(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for Elasticsearch."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ElasticsearchExporter")

            assert result is extractor.basic_properties

    def test_prepare_export_clickhouse(self, elf_binary_path, mock_logger):
        """Test prepare_export_data for ClickHouse."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            result = extractor.prepare_export_data("ClickHouseExporter")

            # Should return tuple of (data, column_names, column_type_names)
            assert isinstance(result, tuple)
            assert len(result) == 3

            data, column_names, column_type_names = result

            assert isinstance(data, list)
            assert len(data) == 1  # One row
            assert isinstance(column_names, list)
            assert isinstance(column_type_names, list)

            # Check expected columns
            assert 'sha256' in column_names
            assert 'md5' in column_names
            assert 'sha1' in column_names
            assert 'filesize' in column_names
            assert 'file_entropy' in column_names
            assert 'filetype' in column_names
            assert 'filetype_mime' in column_names
            assert 'filetype_magika' in column_names
            # New FAT/child columns
            assert 'parent_sha256' in column_names
            assert 'child_sha256' in column_names
            assert 'child_architecture' in column_names
            assert 'child_filetype' in column_names
            assert 'is_fat' in column_names

    def test_prepare_export_clickhouse_data_types(self, elf_binary_path, mock_logger):
        """Test that ClickHouse export data has correct types."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")

            row = data[0]

            # Check that sha256 is a string with correct length
            sha256_idx = column_names.index('sha256')
            assert isinstance(row[sha256_idx], str)
            assert len(row[sha256_idx]) == 64

            # Check that filesize is an integer
            filesize_idx = column_names.index('filesize')
            assert isinstance(row[filesize_idx], int)

            # Check that file_entropy is a float
            entropy_idx = column_names.index('file_entropy')
            assert isinstance(row[entropy_idx], float)


class TestBasicPropertiesClickHouseTable:
    """Tests for get_clickhouse_table method."""

    def test_clickhouse_table_name(self, elf_binary_path, mock_logger):
        """Test correct ClickHouse table name."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.get_clickhouse_table() == "redb_basic_properties"


class TestBasicPropertiesExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()

            assert result is True

    def test_export_data_empty_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()

            # Should succeed with no exporters
            assert result is True


class TestBasicPropertiesMagika:
    """Tests for Magika file type detection."""

    def test_magika_elf_detection(self, elf_binary_path, mock_logger):
        """Test Magika detection of ELF files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Magika should detect ELF
            assert result.filetype_magika == "elf" or "elf" in result.filetype_magika.lower()

    def test_magika_pe_detection(self, pe_binary_path, mock_logger):
        """Test Magika detection of PE files."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(pe_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            # Magika should detect PE
            assert "pe" in result.filetype_magika.lower() or "exe" in result.filetype_magika.lower()


class TestBasicPropertiesFATSupport:
    """Tests for FAT Mach-O and child file support."""

    def test_extract_with_fat_flag(self, elf_binary_path, mock_logger):
        """Test extraction with is_fat flag set."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True
            )

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is True

    def test_extract_with_child_hashes(self, elf_binary_path, mock_logger):
        """Test extraction with child_sha256 provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123def456", "789ghi012jkl"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_sha256=child_hashes
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_sha256 == child_hashes

    def test_extract_with_child_architecture(self, elf_binary_path, mock_logger):
        """Test extraction with child_architecture provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_archs = ["x86_64", "arm64"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_architecture=child_archs
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_architecture == child_archs

    def test_extract_with_child_filetype(self, elf_binary_path, mock_logger):
        """Test extraction with child_filetype provided."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                child_filetype=child_types
            )

            result = extractor.extract()

            assert result is not None
            assert result.child_filetype == child_types

    def test_clickhouse_export_with_fat_data(self, elf_binary_path, mock_logger):
        """Test ClickHouse export includes FAT-related fields correctly."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            child_hashes = ["abc123", "def456"]
            child_archs = ["x86_64", "arm64"]
            child_types = ["macho", "macho"]

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                is_fat=True,
                child_sha256=child_hashes,
                child_architecture=child_archs,
                child_filetype=child_types,
                parent_sha256=None  # FAT container has no parent
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            # Check FAT fields
            is_fat_idx = column_names.index('is_fat')
            assert row[is_fat_idx] is True

            child_sha256_idx = column_names.index('child_sha256')
            assert row[child_sha256_idx] == child_hashes

            child_arch_idx = column_names.index('child_architecture')
            assert row[child_arch_idx] == child_archs

            child_type_idx = column_names.index('child_filetype')
            assert row[child_type_idx] == child_types

    def test_clickhouse_export_for_slice(self, elf_binary_path, mock_logger):
        """Test ClickHouse export for a slice binary with parent_sha256."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            parent_hash = "parent_container_sha256_hash"

            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                parent_sha256=parent_hash
            )
            extractor.extract()

            data, column_names, column_type_names = extractor.prepare_export_data("ClickHouseExporter")
            row = data[0]

            parent_idx = column_names.index('parent_sha256')
            assert row[parent_idx] == parent_hash

    def test_default_fat_fields_are_none_or_empty(self, elf_binary_path, mock_logger):
        """Test that FAT-related fields default to None/empty for non-FAT binaries."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            result = extractor.extract()

            assert result is not None
            assert result.is_fat is None
            assert result.child_sha256 is None
            assert result.child_architecture is None
            assert result.child_filetype is None


@pytest.mark.unit
@pytest.mark.dataclass
class TestBasicPropertiesDataclass:
    """Tests for BasicProperties dataclass structure."""

    def test_dataclass_has_all_expected_fields(self):
        """Test that BasicProperties dataclass has all expected fields."""
        from redb.models.dataclasses import BasicProperties

        # Create a sample instance
        bp = BasicProperties(
            filename="test.exe",
            sample_name="test.exe",
            filesize=1024,
            filetype="PE32",
            filetype_mime="application/x-dosexec",
            filetype_magika="pebin",
            file_entropy=6.5
        )

        # Check required fields
        assert bp.filename == "test.exe"
        assert bp.sample_name == "test.exe"
        assert bp.filesize == 1024
        assert bp.filetype == "PE32"
        assert bp.filetype_mime == "application/x-dosexec"
        assert bp.filetype_magika == "pebin"
        assert bp.file_entropy == 6.5

        # Check optional fields default to None
        assert bp.is_packed is None
        assert bp.is_fat is None
        assert bp.child_sha256 is None
        assert bp.child_architecture is None
        assert bp.child_filetype is None

    def test_dataclass_with_optional_fat_fields(self):
        """Test BasicProperties dataclass with FAT-related optional fields."""
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="universal.app",
            sample_name="universal.app",
            filesize=2048,
            filetype="Mach-O universal",
            filetype_mime="application/x-mach-binary",
            filetype_magika="macho",
            file_entropy=7.2,
            is_fat=True,
            child_sha256=["hash1", "hash2"],
            child_architecture=["x86_64", "arm64"],
            child_filetype=["macho", "macho"]
        )

        assert bp.is_fat is True
        assert bp.child_sha256 == ["hash1", "hash2"]
        assert bp.child_architecture == ["x86_64", "arm64"]
        assert bp.child_filetype == ["macho", "macho"]