gradio/test/test_components.py
Yuichiro Tachibana (Tsuchiya) 0493c66303
Split test/test_components.py into test/components/test_*.py (#8218)
* Split test/test_components.py into test/components/test_*.py

* Remove test/components/conftest.py because what it configures is already defined in pyproject.toml
2024-05-07 16:06:34 +09:00

145 lines
5.0 KiB
Python

import inspect
import os
import numpy as np
import pandas as pd
import pytest
from gradio_client import utils as client_utils
from gradio_pdf import PDF
import gradio as gr
from gradio import processing_utils
from gradio.components.base import Component
from gradio.data_classes import GradioModel, GradioRootModel
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
class TestGettingComponents:
def test_component_function(self):
assert isinstance(
gr.components.component("textarea", render=False), gr.templates.TextArea
)
@pytest.mark.parametrize(
"component, render, unrender, should_be_rendered",
[
(gr.Textbox(render=True), False, True, False),
(gr.Textbox(render=False), False, False, False),
(gr.Textbox(render=False), True, False, True),
("textbox", False, False, False),
("textbox", True, False, True),
],
)
def test_get_component_instance_rendering(
self, component, render, unrender, should_be_rendered
):
with gr.Blocks():
textbox = gr.components.get_component_instance(
component, render=render, unrender=unrender
)
assert textbox.is_rendered == should_be_rendered
class TestNames:
# This test ensures that `components.get_component_instance()` works correctly when instantiating from components
def test_no_duplicate_uncased_names(self, io_components):
unique_subclasses_uncased = {s.__name__.lower() for s in io_components}
assert len(io_components) == len(unique_subclasses_uncased)
def test_dataframe_process_example_converts_dataframes():
df_comp = gr.Dataframe()
assert df_comp.process_example(
pd.DataFrame({"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]})
) == [
[1, 5],
[2, 6],
[3, 7],
[4, 8],
]
assert df_comp.process_example(np.array([[1, 2], [3, 4.0]])) == [
[1.0, 2.0],
[3.0, 4.0],
]
@pytest.mark.parametrize("component", [gr.Model3D, gr.File, gr.Audio])
def test_process_example_returns_file_basename(component):
component = component()
assert (
component.process_example("/home/freddy/sources/example.ext") == "example.ext"
)
assert component.process_example(None) == ""
def test_component_class_ids():
button_id = gr.Button().component_class_id
textbox_id = gr.Textbox().component_class_id
json_id = gr.JSON().component_class_id
mic_id = gr.Mic().component_class_id
microphone_id = gr.Microphone().component_class_id
audio_id = gr.Audio().component_class_id
assert button_id == gr.Button().component_class_id
assert textbox_id == gr.Textbox().component_class_id
assert json_id == gr.JSON().component_class_id
assert mic_id == gr.Mic().component_class_id
assert microphone_id == gr.Microphone().component_class_id
assert audio_id == gr.Audio().component_class_id
assert mic_id == microphone_id
# Make sure that the ids are unique
assert len({button_id, textbox_id, json_id, microphone_id, audio_id}) == 5
def test_constructor_args():
assert gr.Textbox(max_lines=314).constructor_args == {"max_lines": 314}
assert gr.LoginButton(visible=False, value="Log in please").constructor_args == {
"visible": False,
"value": "Log in please",
}
def test_template_component_configs(io_components):
template_components = [c for c in io_components if getattr(c, "is_template", False)]
for component in template_components:
component_parent_class = inspect.getmro(component)[1]
template_config = component().get_config()
parent_config = component_parent_class().get_config()
assert set(parent_config.keys()).issubset(set(template_config.keys()))
def test_component_example_values(io_components):
for component in io_components:
if component == PDF:
continue
elif component in [gr.BarPlot, gr.LinePlot, gr.ScatterPlot]:
c: Component = component(x="x", y="y")
else:
c: Component = component()
c.postprocess(c.example_value())
def test_component_example_payloads(io_components):
for component in io_components:
if component == PDF:
continue
elif component in [gr.BarPlot, gr.LinePlot, gr.ScatterPlot]:
c: Component = component(x="x", y="y")
else:
c: Component = component()
data = c.example_payload()
data = client_utils.synchronize_async(
processing_utils.async_move_files_to_cache,
data,
c,
check_in_upload_folder=False,
)
if getattr(c, "data_model", None) and data is not None:
if issubclass(c.data_model, GradioModel): # type: ignore
data = c.data_model(**data) # type: ignore
elif issubclass(c.data_model, GradioRootModel): # type: ignore
data = c.data_model(root=data) # type: ignore
c.preprocess(data)