Radu-Daniel Vatavu

209 papers A* 22A 11B 24C 12Misc 5Journal 49Unranked 80
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Radu-Daniel Vatavu
2026 A* conf
CHI
Radu-Daniel Vatavu, Ovidiu-Ciprian Ungurean
2026 conf
CHI Extended Abstracts
Radu-Daniel Vatavu, Irina Petrariu, Tudor Horomnea, Ovidiu-Ciprian Ungurean
2026 conf
CHI Extended Abstracts
Jean Vanderdonckt, Radu-Daniel Vatavu
2026 conf
CHI Extended Abstracts
Jean Vanderdonckt, Philippe Lefèvre, Radu-Daniel Vatavu, Nuwan T. Attygalle, Laura-Bianca Bilius, Gaëlle Calvary, Sophie Dupuy-Chessa, Merle Fairhurst, Tommy Nilsson, Leif Oppermann, Paolo Roselli, Giovanni Saggio, Valérie Swaen
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Jean Vanderdonckt, Radu-Daniel Vatavu, Romain Maddox
2025 conf
CHI Extended Abstracts
Sang Ho Yoon, Andrea Bianchi, Hasti Seifi, Jin Ryong Kim, Radu-Daniel Vatavu, Jeongmi Lee, Geehyuk Lee
2025 conf
CHI Extended Abstracts
Alexandra-Elena Gurita, Radu-Daniel Vatavu
2025 A conf
Conference on Designing Interactive Systems (Companion Volume)
Arthur Sluÿters, Jean Vanderdonckt, Paolo Roselli, Radu-Daniel Vatavu
2025 conf
ACM REP
Jean Vanderdonckt, Radu-Daniel Vatavu
2025 B conf
Creativity & Cognition
Mihail Terenti, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2025 A* conf
CHI
Mihail Terenti, Radu-Daniel Vatavu
2025 conf
MobileHCI (Companion)
Laura-Bianca Bilius, Mihail Terenti, Radu-Daniel Vatavu, Jean Vanderdonckt
2025 conf
W4A
Mihail Terenti, Laura-Bianca Bilius, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2025 conf
IUI Workshops
Radu-Daniel Vatavu
2025 conf
MobileHCI (Companion)
Jean Vanderdonckt, Radu-Daniel Vatavu
2025 conf
W4A
Mihail Terenti, Laura-Bianca Bilius, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2025 A conf
Conference on Designing Interactive Systems
Alexandra-Elena Gurita, Radu-Daniel Vatavu
2025 conf
SpaceCHI
Hippolyte Hilgers, Jean Vanderdonckt, Radu-Daniel Vatavu
2025 conf
WWW (Companion Volume)
Alexandra-Elena Gurita, Radu-Daniel Vatavu
2025 A* conf
CHI
Radu-Daniel Vatavu, Bogdan-Florin Gheran
2025 A* conf
CHI
Radu-Daniel Vatavu
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Mehdi Ousmer, Jean Vanderdonckt, Laura-Bianca Bilius, Radu-Daniel Vatavu, Mihail Terenti
2025 A conf
Conference on Designing Interactive Systems
Jean Vanderdonckt, Radu-Daniel Vatavu, Julie Manon, Romain Maddox, Michael Saint-Guillain, Philippe Lefèvre, Jessica J. Márquez
2025 J jnl
Int. J. Hum. Comput. Interact.
Mihail Terenti, Radu-Daniel Vatavu
2025 conf
MobileHCI (Companion)
Radu-Daniel Vatavu, Jean Vanderdonckt
2025 conf
W4A
Alexandra-Elena Gurita, Radu-Daniel Vatavu
2024 B conf
ICMI
Radu-Daniel Vatavu
2024 conf
EICS (Companion)
Klen Copic Pucihar, Francesca Meneghello, Dariush Salami, Arthur Sluÿters, Radu-Daniel Vatavu
2024 J jnl
ACM Comput. Surv.
Santiago Villarreal-Narvaez, Arthur Sluÿters, Jean Vanderdonckt, Radu-Daniel Vatavu
2024 C conf
IMX
Radu-Daniel Vatavu, Laura-Bianca Bilius, Alexandru-Tudor Andrei, Mihail Terenti, Adrian-Vasile Catana, Alexandru-Ionut Siean
2024 B conf
AVI
Radu-Daniel Vatavu
2024 conf
EICS (Companion)
Jean Vanderdonckt, Radu-Daniel Vatavu, Arthur Sluÿters
2024 C conf
IMX
Laura-Bianca Bilius, Radu-Daniel Vatavu, Jean Vanderdonckt
2024 conf
AIxVR
Adrian-Vasile Catana, Radu-Daniel Vatavu
2024 conf
CHI Extended Abstracts
Adrian Aiordachioae, Radu-Daniel Vatavu
2024 J jnl
Multim. Tools Appl.
Adrian Aiordachioae, Cristian Pamparau, Radu-Daniel Vatavu
2024 conf
CHI Extended Abstracts
Jean Vanderdonckt, Radu-Daniel Vatavu, Julie Manon, Michael Saint-Guillain, Philippe Lefèvre, Jessica J. Márquez
2024 J jnl
Multim. Tools Appl.
Radu-Daniel Vatavu, Petruta-Paraschiva Rusu, Ovidiu-Andrei Schipor, Maria-Doina Schipor
2024 A* conf
CHI
Alexandru-Tudor Andrei, Laura-Bianca Bilius, Radu-Daniel Vatavu
2024 C conf
IMX
Laura-Bianca Bilius, Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2024 conf
CHI Extended Abstracts
Mihail Terenti, Matthieu Rupin, Baptiste Reynal, Laurent Grisoni, Radu-Daniel Vatavu
2024 J jnl
Virtual Real.
Mihail Terenti, Cristian Pamparau, Radu-Daniel Vatavu
2024 conf
CHI Extended Abstracts
Mihail Terenti, Maria Casado-Palacios, Monica Gori, Radu-Daniel Vatavu
2023 conf
CHI Extended Abstracts
Laura-Bianca Bilius, Radu-Daniel Vatavu
2023 C conf
IMX
Alexandre Nevsky, Timothy Neate, Elena Simperl, Radu-Daniel Vatavu
2023 conf
CHI Extended Abstracts
Laura-Bianca Bilius, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2023 conf
INTERACT (1)
Milad Jamalzadeh, Yosra Rekik, Laurent Grisoni, Radu-Daniel Vatavu, Gualtiero Volpe, Alexandru Dancu
2023 A* conf
CHI
Adrian-Vasile Catana, Radu-Daniel Vatavu
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Alexandru-Ionut Siean, Cristian Pamparau, Arthur Sluÿters, Radu-Daniel Vatavu, Jean Vanderdonckt
2023 B conf
ICMI
Radu-Daniel Vatavu
2023 J jnl
Int. J. Hum. Comput. Interact.
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2023 conf
PETRA
Radu-Daniel Vatavu
2023 conf
CHI Extended Abstracts
Bogdan-Florin Gheran, Radu-Daniel Vatavu, Jean Vanderdonckt
2023 J jnl
ACM Trans. Interact. Intell. Syst.
Arthur Sluÿters, Sébastien Lambot, Jean Vanderdonckt, Radu-Daniel Vatavu
2023 J jnl
Virtual Real.
Cristian Pamparau, Ovidiu-Andrei Schipor, Alexandru Dancu, Radu-Daniel Vatavu
2023 J jnl
Pattern Recognit. Lett.
Laura-Bianca Bilius, Stefan Gheorghe Pentiuc, Radu-Daniel Vatavu
2023 A* conf
CHI
Laura-Bianca Bilius, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2023 J jnl
Int. J. Hum. Comput. Interact.
Mihail Terenti, Radu-Daniel Vatavu
2023 conf
WAMWB@MobileHCI
Radu-Daniel Vatavu
2023 A* conf
CHI
Radu-Daniel Vatavu
2022 J jnl
IEEE Pervasive Comput.
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2022 conf
ISAmI
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2022 conf
CHI Extended Abstracts
Radu-Daniel Vatavu
2022 J jnl
ACM Trans. Comput. Hum. Interact.
Radu-Daniel Vatavu, Jacob O. Wobbrock
2022 conf
CHI Extended Abstracts
Radu-Daniel Vatavu
2022 B conf
AVI
Santiago Villarreal-Narvaez, Alexandru-Ionut Siean, Arthur Sluÿters, Radu-Daniel Vatavu, Jean Vanderdonckt
2022 A* conf
UIST
Radu-Daniel Vatavu, Ovidiu-Ciprian Ungurean, Laura-Bianca Bilius
2022 conf
CHI Extended Abstracts
Mihail Terenti, Radu-Daniel Vatavu
2022 conf
W4A
Ovidiu-Andrei Schipor, Laura-Bianca Bilius, Ovidiu-Ciprian Ungurean, Alexandru-Ionut Siean, Alexandru-Tudor Andrei, Radu-Daniel Vatavu
2022 B conf
AVI
Bogdan-Florin Gheran, Santiago Villarreal-Narvaez, Radu-Daniel Vatavu, Jean Vanderdonckt
2022 C conf
IMX
Alexandru-Ionut Siean, Cristian Pamparau, Radu-Daniel Vatavu
2022 A* conf
ISMAR
Radu-Daniel Vatavu
2022 conf
AH
Alexandru-Tudor Andrei, Alexandru-Ionut Siean, Radu-Daniel Vatavu
2022 C conf
IMX
Cristian Pamparau, Radu-Daniel Vatavu
2022 conf
AH
Bogdan Popoveniuc, Radu-Daniel Vatavu
2022 A* conf
CHI
Radu-Daniel Vatavu, Ovidiu-Ciprian Ungurean
2022 conf
W4A
Ovidiu-Andrei Schipor, Laura-Bianca Bilius, Radu-Daniel Vatavu
2021 J jnl
J. Intell. Transp. Syst.
Laura-Bianca Bilius, Radu-Daniel Vatavu
2021 C conf
IMX
Irina Popovici, Radu-Daniel Vatavu, Pu Feng, Wenjun Wu
2021 C conf
IMX
Radu-Daniel Vatavu
2021 conf
ISAmI
Alexandru-Ionut Siean, Laura-Bianca Bilius, Radu-Daniel Vatavu
2021 B conf
MUM
David Geerts, Radu-Daniel Vatavu, Alisa Burova, Vinoba Vinayagamoorthy, Martez E. Mott, Michael Crabb, Kathrin Gerling
2021 C conf
IMX
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2021 conf
UIST (Adjunct Volume)
Laura-Bianca Bilius, Radu-Daniel Vatavu
2021 J jnl
Interact. Comput.
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2021 J jnl
Proc. ACM Hum. Comput. Interact.
Arthur Sluÿters, Jean Vanderdonckt, Radu-Daniel Vatavu
2021 conf
INTERACT (2)
Laura-Bianca Bilius, Radu-Daniel Vatavu, Nicolai Marquardt
2021 J jnl
Int. J. Hum. Comput. Interact.
Jean Vanderdonckt, Radu-Daniel Vatavu
2021 J jnl
Multim. Tools Appl.
Cristian Pamparau, Radu-Daniel Vatavu
2021 conf
ISAmI
Radu-Daniel Vatavu, Ovidiu-Andrei Schipor
2021 A* conf
UIST
Radu-Daniel Vatavu, Laura-Bianca Bilius
2021 conf
ICMI Companion
Mihail Terenti, Radu-Daniel Vatavu
2021 Misc conf
EICS
Cristian Pamparau, Radu-Daniel Vatavu, Andrei R. Costea, Razvan Jurchis, Adrian Opre
2021 conf
INTERACT (2)
Laura-Bianca Bilius, Radu-Daniel Vatavu, Nicolai Marquardt
2021 B conf
MUM
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2021 C conf
IMX
Alexandru-Ionut Siean, Radu-Daniel Vatavu, Jean Vanderdonckt
2021 conf
ISAmI
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2021 A conf
ASSETS
Alexandru-Ionut Siean, Radu-Daniel Vatavu
2021 B conf
MUM
Cristian Pamparau, Radu-Daniel Vatavu, Andrei R. Costea, Razvan Jurchis, Adrian Opre
2020 B conf
MUM
Cristian Pamparau, Radu-Daniel Vatavu
2020 C conf
IMX
Laura-Bianca Bilius, Radu-Daniel Vatavu
2020 A conf
Conference on Designing Interactive Systems
Santiago Villarreal-Narvaez, Jean Vanderdonckt, Radu-Daniel Vatavu, Jacob O. Wobbrock
2020 Misc conf
EICS
Jean Vanderdonckt, Radu-Daniel Vatavu
2020 B conf
MUM
Adrian Aiordachioae, David Gherasim, Alexandru-Ilie Maciuc, Bogdan-Florin Gheran, Radu-Daniel Vatavu
2020 conf
GOODTECHS
Adrian Aiordachioae, Daniel Furtuna, Radu-Daniel Vatavu
2020 C conf
IMX
Radu-Daniel Vatavu, Pejman Saeghe, Teresa Chambel, Vinoba Vinayagamoorthy, Marian Florin Ursu
2020 B conf
MUM
Radu-Daniel Vatavu, Jean Vanderdonckt
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
Bogdan-Florin Gheran, Radu-Daniel Vatavu
2020 B conf
MUM
Cristian Pamparau, Adrian Aiordachioae, Radu-Daniel Vatavu
2020 J jnl
CoRR
Luis A. Leiva, Radu-Daniel Vatavu, Daniel Martín-Albo, Réjean Plamondon
2020 J jnl
Int. J. Hum. Comput. Stud.
Luis A. Leiva, Radu-Daniel Vatavu, Daniel Martín-Albo, Réjean Plamondon
2020 conf
MobileHCI (Extended Abstracts)
Radu-Daniel Vatavu
2020 ch.
The Lognormality Principle
Luis A. Leiva, Daniel Martín-Albo, Radu-Daniel Vatavu, Réjean Plamondon
2020 Misc conf
EICS
Jean Vanderdonckt, Iyad Khaddam, Radu-Daniel Vatavu
2020 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Octav Opaschi, Radu-Daniel Vatavu
2020 A conf
Conference on Designing Interactive Systems (Companion Volume)
Radu-Daniel Vatavu, Jean Vanderdonckt
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Víctor Manuel López Jaquero, Radu-Daniel Vatavu, José Ignacio Panach, Oscar Pastor, Jean Vanderdonckt
2019 Misc conf
EICS
Adrian Aiordachioae, Radu-Daniel Vatavu, Dorin-Mircea Popovici
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Jean Vanderdonckt, Mathieu Zen, Radu-Daniel Vatavu
2019 conf
ISMAR Adjunct
Irina Popovici, Radu-Daniel Vatavu
2019 J jnl
Inf. Softw. Technol.
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu, Jean Vanderdonckt
2019 Misc conf
EICS
Nathan Magrofuoco, Paolo Roselli, Jean Vanderdonckt, Jorge Luis Pérez-Medina, Radu-Daniel Vatavu
2019 J jnl
Int. J. Hum. Comput. Stud.
Irina Popovici, Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2019 conf
ISMAR Adjunct
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu, Wenjun Wu
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Adrian Aiordachioae, Radu-Daniel Vatavu
2019 ed.
TVX
Jonathan Hook, Phil Stenton, Marian Florin Ursu, Guy Schofield, Radu-Daniel Vatavu
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu, Wenjun Wu
2019 A* conf
CHI
Radu-Daniel Vatavu, Ovidiu-Ciprian Ungurean
2019 conf
TVX
Irina Popovici, Radu-Daniel Vatavu, Wenjun Wu
2019 A* conf
CHI
Radu-Daniel Vatavu
2019 conf
EICS Workshops
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2019 conf
TVX
Irina Popovici, Radu-Daniel Vatavu
2019 A* conf
ISMAR
Irina Popovici, Radu-Daniel Vatavu
2018 B conf
MobileHCI
Radu-Daniel Vatavu, Lisa Anthony, Jacob O. Wobbrock
2018 conf
CHI Extended Abstracts
Jean Vanderdonckt, Radu-Daniel Vatavu
2018 B conf
MobileHCI
Luis A. Leiva, Daniel Martín-Albo, Radu-Daniel Vatavu
2018 conf
CHI Extended Abstracts
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu, Luis A. Leiva, Réjean Plamondon
2018 A conf
Conference on Designing Interactive Systems
Bogdan-Florin Gheran, Jean Vanderdonckt, Radu-Daniel Vatavu
2018 conf
IUI Companion
Petru-Vasile Cioata, Radu-Daniel Vatavu
2018 J jnl
IEEE Pervasive Comput.
Ovidiu-Andrei Schipor, Radu-Daniel Vatavu
2018 A* conf
CHI
Luis A. Leiva, Daniel Martín-Albo, Réjean Plamondon, Radu-Daniel Vatavu
2018 conf
CHI Extended Abstracts
Jean-Yves Lionel Lawson, Jean Vanderdonckt, Radu-Daniel Vatavu
2018 conf
RoCHI
Irina Popovici, Radu-Daniel Vatavu
2018 conf
MobileHCI Adjunct
Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu, Luis A. Leiva, Daniel Martín-Albo
2018 A conf
Conference on Designing Interactive Systems (Companion Volume)
Bogdan-Florin Gheran, Radu-Daniel Vatavu, Jean Vanderdonckt
2018 J jnl
IEEE Pervasive Comput.
Radu-Daniel Vatavu, Bogdan-Florin Gheran, Maria-Doina Schipor
2018 conf
RoCHI
Bogdan-Florin Gheran, Ovidiu-Ciprian Ungurean, Radu-Daniel Vatavu
2017 J jnl
Int. J. Hum. Comput. Interact.
Radu-Daniel Vatavu
2017 J jnl
J. Multimodal User Interfaces
Radu-Daniel Vatavu
2017 conf
CHI Extended Abstracts
Radu-Daniel Vatavu
2017 A* conf
CHI
Radu-Daniel Vatavu
2017 J jnl
Sci. China Inf. Sci.
Yihua Lou, Wenjun Wu, Radu-Daniel Vatavu, Wei-Tek Tsai
2017 J jnl
Int. J. Hum. Comput. Stud.
Radu-Daniel Vatavu
2017 A* conf
CHI
Luis A. Leiva, Daniel Martín-Albo, Radu-Daniel Vatavu
2017 J jnl
Int. J. Hum. Comput. Interact.
Radu-Daniel Vatavu
2016 A* conf
CHI
Radu-Daniel Vatavu, Jacob O. Wobbrock
2016 B conf
MobileHCI
Radu-Daniel Vatavu, Annette Mossel, Christian Schönauer
2016 A* conf
CHI
Martez E. Mott, Radu-Daniel Vatavu, Shaun K. Kane, Jacob O. Wobbrock
2016 ch.
Collaboration Meets Interactive Spaces
Yosra Rekik, Radu-Daniel Vatavu, Laurent Grisoni
2016 conf
CHI Extended Abstracts
Radu-Daniel Vatavu
2015 conf
TVX
Radu-Daniel Vatavu
2015 conf
INTERACT (4)
Radu-Daniel Vatavu, Lisa Anthony, Quincy Brown
2015 J jnl
Pers. Ubiquitous Comput.
Radu-Daniel Vatavu, Matei Mancas
2015 A* conf
CHI
Radu-Daniel Vatavu, Jacob O. Wobbrock
2015 B conf
MUM
Dorin-Mircea Popovici, Radu-Daniel Vatavu, Mihai Polceanu
2015 conf
TVX
Radu-Daniel Vatavu
2015 J jnl
Pers. Ubiquitous Comput.
Ionut-Alexandru Zaiti, Stefan Gheorghe Pentiuc, Radu-Daniel Vatavu
2015 J jnl
Int. J. Hum. Comput. Stud.
Radu-Daniel Vatavu, Gabriel Cramariuc, Doina-Maria Schipor
2015 conf
INTERACT (4)
Christian Schönauer, Annette Mossel, Ionut-Alexandru Zaiti, Radu-Daniel Vatavu
2014 B conf
ICMI
Radu-Daniel Vatavu, Lisa Anthony, Jacob O. Wobbrock
2014 conf
TVX
Radu-Daniel Vatavu, Ionut-Alexandru Zaiti
2014 B conf
AVI
Yosra Rekik, Radu-Daniel Vatavu, Laurent Grisoni
2014 B conf
ICMI
Yosra Rekik, Radu-Daniel Vatavu, Laurent Grisoni
2014 conf
TVX
Radu-Daniel Vatavu, Matei Mancas
2013 J jnl
J. Ambient Intell. Smart Environ.
Radu-Daniel Vatavu
2013 J jnl
Multim. Tools Appl.
Bogdan Pogorelc, Artur Lugmayr, Björn Stockleben, Radu-Daniel Vatavu, Nina Tahmasebi, Estefanía Serral, Emilija Stojmenova, Bojan Imperl, Thomas Risse, Gideon Zenz, Matjaz Gams
2013 conf
EuroITV
Radu-Daniel Vatavu
2013 conf
SouthCHI
Ionut-Alexandru Zaiti, Radu-Daniel Vatavu, Stefan Gheorghe Pentiuc
2013 conf
INTETAIN
Radu-Daniel Vatavu, Matei Mancas
2013 J jnl
Multim. Tools Appl.
Radu-Daniel Vatavu
2013 B conf
ICMI
Radu-Daniel Vatavu, Lisa Anthony, Jacob O. Wobbrock
2013 A* conf
CHI
Radu-Daniel Vatavu, Géry Casiez, Laurent Grisoni
2013 J jnl
Int. J. Hum. Comput. Stud.
Radu-Daniel Vatavu
2013 conf
EuroITV
Radu-Daniel Vatavu
2013 B conf
Graphics Interface
Lisa Anthony, Radu-Daniel Vatavu, Jacob O. Wobbrock
2012 A conf
IUI
Radu-Daniel Vatavu
2012 J jnl
Int. J. Hum. Comput. Stud.
Radu-Daniel Vatavu, Ionut-Alexandru Zaiti
2012 conf
AmI
Radu-Daniel Vatavu, Catalin-Marian Chera, Wei-Tek Tsai
2012 conf
ISIC
Catalin-Marian Chera, Wei-Tek Tsai, Radu-Daniel Vatavu
2012 B conf
ICMI
Radu-Daniel Vatavu, Lisa Anthony, Jacob O. Wobbrock
2012 J jnl
J. Ambient Intell. Smart Environ.
Radu-Daniel Vatavu
2012 J jnl
Multim. Tools Appl.
Radu-Daniel Vatavu
2012 J jnl
Multim. Tools Appl.
Radu-Daniel Vatavu
2012 J jnl
Multim. Tools Appl.
Bogdan Pogorelc, Radu-Daniel Vatavu, Artur Lugmayr, Björn Stockleben, Thomas Risse, Juha Kaario, Estefania Constanza Lomonaco, Matjaz Gams
2012 A conf
Conference on Designing Interactive Systems
Radu-Daniel Vatavu
2012 conf
EuroITV
Radu-Daniel Vatavu
2011 conf
AmI Workshops
Radu-Daniel Vatavu, Ionut-Alexandru Zaiti
2011 ch.
Whole Body Interaction
Radu-Daniel Vatavu, Ovidiu-Ciprian Ungurean, Stefan Gheorghe Pentiuc
2011 conf
INTERACT (2)
Radu-Daniel Vatavu, Daniel Vogel, Géry Casiez, Laurent Grisoni
2011 conf
ISAmI
Radu-Daniel Vatavu
2011 ch.
Intelligent Video Event Analysis and Understanding
Radu-Daniel Vatavu
2011 B conf
ICMI
Radu-Daniel Vatavu
2010 conf
AFFINE@MM
Radu-Daniel Vatavu
2010 ch.
Mobile TV: Customizing Content and Experience
Radu-Daniel Vatavu
2009 conf
Gesture Workshop
Radu-Daniel Vatavu, Laurent Grisoni, Stefan Gheorghe Pentiuc
2008 conf
EuroITV
Radu-Daniel Vatavu, Stefan Gheorghe Pentiuc
2008 J jnl
Comput. Informatics
Radu-Daniel Vatavu, Stefan Gheorghe Pentiuc
2007 conf
Gesture Workshop
Radu-Daniel Vatavu, Laurent Grisoni, Stefan Gheorghe Pentiuc
tests/unit/test_database_exporters.py
← Index tests/unit/test_database_exporters.py python
"""
Unit tests for database exporters.
"""
import pytest
import json
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from unittest.mock import Mock, patch, MagicMock

pytestmark = [pytest.mark.unit, pytest.mark.exporters]


# ============================================================================
# Sample Dataclass for Testing
# ============================================================================

@dataclass
class SampleData:
    """Sample dataclass for export testing."""
    sha256: str = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    name: str = "test_sample"
    value: int = 42
    _id: str = "test_id"


# ============================================================================
# PrintExporter Tests
# ============================================================================

class TestPrintExporter:
    """Tests for PrintExporter class."""

    def test_initialization(self, mock_logger):
        """Test PrintExporter initialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger

    def test_export_dataclass(self, mock_logger, capsys):
        """Test exporting a dataclass."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        sample = SampleData()

        result = exporter.export(sample)

        assert result is True
        captured = capsys.readouterr()
        assert "test_sample" in captured.out

    def test_export_list_of_dataclasses(self, mock_logger, capsys):
        """Test exporting a list of dataclasses."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        samples = [SampleData(name="sample1"), SampleData(name="sample2")]

        result = exporter.export(samples)

        assert result is True
        captured = capsys.readouterr()
        assert "sample1" in captured.out
        assert "sample2" in captured.out

    def test_export_dict(self, mock_logger, capsys):
        """Test exporting a dictionary."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {"key": "value", "number": 42}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "key" in captured.out
        assert "value" in captured.out

    def test_export_none(self, mock_logger):
        """Test exporting None."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export(None)

        assert result is True

    def test_export_empty_list(self, mock_logger):
        """Test exporting empty list."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")

        result = exporter.export([])

        assert result is True


# ============================================================================
# ElasticsearchExporter Tests
# ============================================================================

class TestElasticsearchExporter:
    """Tests for ElasticsearchExporter class."""

    def test_initialization(self, mock_logger):
        """Test ElasticsearchExporter initialization."""
        with patch('redb.settings.get_elasticsearch_client') as mock_client:
            mock_client.return_value = Mock()
            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")

            assert exporter.index_prefix == "test_index"
            assert exporter.log is mock_logger
            assert exporter.client is not None

    def test_export_dataclass(self, mock_logger):
        """Test exporting a dataclass to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True
            mock_client.index.assert_called()

    def test_export_list(self, mock_logger):
        """Test exporting a list to Elasticsearch."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            samples = [SampleData(name="sample1"), SampleData(name="sample2")]

            result = exporter.export(
                samples,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": "test_hash"}
            )

            assert result is True
            # Should be called twice (once per sample)
            assert mock_client.index.call_count == 2

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_client.index.side_effect = Exception("Connection failed")
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData()

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is False
            mock_logger.error.assert_called()

    def test_export_with_custom_id(self, mock_logger):
        """Test exporting with custom _id field."""
        with patch('redb.settings.get_elasticsearch_client') as mock_get_client:
            mock_client = Mock()
            mock_get_client.return_value = mock_client

            from redb.extractors.database_exporters import ElasticsearchExporter

            exporter = ElasticsearchExporter(mock_logger, "test_index")
            sample = SampleData(_id="custom_id")

            result = exporter.export(
                sample,
                index="test_index",
                tag="test_tag",
                hashes={"sha256": sample.sha256}
            )

            assert result is True


# ============================================================================
# ClickHouseExporter Tests
# ============================================================================

class TestClickHouseExporter:
    """Tests for ClickHouseExporter class."""

    def test_initialization(self, mock_logger):
        """Test ClickHouseExporter initialization."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        assert exporter.index_prefix == "test_index"
        assert exporter.log is mock_logger
        assert exporter.client is mock_client

    def test_export_tuple_data(self, mock_logger):
        """Test exporting tuple data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is True

    def test_export_multi_table(self, mock_logger):
        """Test exporting multi-table data to ClickHouse."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table1',
                    'data': [["hash123", "sample.exe"]],
                    'column_names': ["sha256", "name"],
                    'column_type_names': ["String", "String"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_export_failure(self, mock_logger):
        """Test handling export failure."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.side_effect = Exception("Connection failed")
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names),
                table="test_table"
            )

            assert result is False

    def test_export_missing_table(self, mock_logger):
        """Test export without table name raises error."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = [["hash123", "sample.exe", 1024]]
            column_names = ["sha256", "name", "size"]
            column_type_names = ["String", "String", "UInt64"]

            result = exporter.export(
                (data, column_names, column_type_names)
                # Missing table parameter
            )

            assert result is False

    def test_get_client(self, mock_logger):
        """Test get_client method."""
        from redb.extractors.database_exporters import ClickHouseExporter

        mock_client = Mock()
        exporter = ClickHouseExporter(mock_logger, "test_index", client=mock_client)

        result = exporter.get_client()

        assert result is mock_client

    def test_get_client_creates_new(self, mock_logger):
        """Test get_client creates new client if none exists."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_new_client = Mock()
            mock_create.return_value = mock_new_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            result = exporter.get_client()

            assert result is mock_new_client


# ============================================================================
# DatabaseExporter Abstract Base Class Tests
# ============================================================================

class TestDatabaseExporter:
    """Tests for DatabaseExporter abstract base class."""

    def test_cannot_instantiate_abstract(self):
        """Test that DatabaseExporter cannot be instantiated directly."""
        from redb.extractors.database_exporters import DatabaseExporter

        with pytest.raises(TypeError):
            DatabaseExporter()

    def test_subclass_must_implement_export(self):
        """Test that subclasses must implement export method."""
        from redb.extractors.database_exporters import DatabaseExporter

        # Define incomplete subclass
        class IncompleteExporter(DatabaseExporter):
            pass

        with pytest.raises(TypeError):
            IncompleteExporter()


# ============================================================================
# Null/Edge Case Tests
# ============================================================================

class TestExporterEdgeCases:
    """Tests for edge cases in exporters."""

    def test_print_exporter_with_complex_nested_data(self, mock_logger, capsys):
        """Test PrintExporter with complex nested data."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        data = {
            "level1": {
                "level2": {
                    "level3": [1, 2, 3]
                }
            },
            "array": [{"a": 1}, {"b": 2}]
        }

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "level1" in captured.out

    def test_clickhouse_null_handling(self, mock_logger):
        """Test ClickHouse exporter handles null values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            # Multi-table data with null values
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [[None, "sample.exe", None]],
                    'column_names': ["sha256", "name", "size"],
                    'column_type_names': ["Nullable(String)", "String", "Nullable(UInt64)"]
                }
            }

            result = exporter.export(data)

            # Should handle nulls appropriately
            assert result is True

    def test_clickhouse_array_handling(self, mock_logger):
        """Test ClickHouse exporter handles array types."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", ["tag1", "tag2"]]],
                    'column_names': ["sha256", "tags"],
                    'column_type_names': ["String", "Array(String)"]
                }
            }

            result = exporter.export(data)

            assert result is True


# ============================================================================
# Type Conversion Tests
# ============================================================================

class TestExporterTypeConversions:
    """Tests for type conversions in exporters."""

    def test_clickhouse_datetime_handling(self, mock_logger):
        """Test ClickHouse exporter handles datetime values."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_client.insert.return_value = True
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            now = datetime.now(timezone.utc)
            data = {
                'multi_table': True,
                'table1': {
                    'table': 'test_table',
                    'data': [["hash", now]],
                    'column_names': ["sha256", "timestamp"],
                    'column_type_names': ["String", "DateTime64(3, 'UTC')"]
                }
            }

            result = exporter.export(data)

            assert result is True

    def test_print_exporter_datetime_serialization(self, mock_logger, capsys):
        """Test PrintExporter handles datetime serialization."""
        from redb.extractors.database_exporters import PrintExporter

        exporter = PrintExporter(mock_logger, "test_index")
        now = datetime.now(timezone.utc)
        data = {"timestamp": now, "name": "test"}

        result = exporter.export(data)

        assert result is True
        captured = capsys.readouterr()
        assert "timestamp" in captured.out


# ============================================================================
# Connection Context Manager Tests
# ============================================================================

class TestClickHouseConnectionManager:
    """Tests for ClickHouse connection context manager."""

    def test_clickhouse_connection_context(self, mock_logger):
        """Test clickhouse_connection context manager."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            with exporter.clickhouse_connection() as client:
                assert client is mock_client

            # Client should be closed after context exits
            mock_client.close.assert_called()

    def test_clickhouse_connection_close_on_error(self, mock_logger):
        """Test client is closed even if operation fails."""
        with patch('redb.settings.create_clickhouse_client') as mock_create:
            mock_client = Mock()
            mock_create.return_value = mock_client

            from redb.extractors.database_exporters import ClickHouseExporter

            exporter = ClickHouseExporter(mock_logger, "test_index")

            try:
                with exporter.clickhouse_connection() as client:
                    raise ValueError("Test error")
            except ValueError:
                pass

            # Client should still be closed
            mock_client.close.assert_called()