"""Tests for the Converter class."""
import numpy as np
import pytest
from Orange.data import StringVariable
from ewoksxas.converters.orange import Converter
[docs]
def test_empty_initialization():
"""Test that Converter can be initialized empty."""
converter = Converter()
assert converter._features is None
assert len(converter.metas) == 0
assert len(converter.targets) == 0
[docs]
def test_add_features_first_call():
"""Test adding features for the first time."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([[0.1, 0.2, 0.3]])
converter = Converter().add_features(x, y)
names, data = converter.features
assert np.array_equal(names, x)
assert np.array_equal(data, y)
[docs]
def test_add_features_1d_data():
"""Test that 1D feature_data is reshaped to 2D."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([0.1, 0.2, 0.3]) # 1D
converter = Converter().add_features(x, y)
_, data = converter.features
assert data.shape == (1, 3)
assert np.array_equal(data[0], y)
[docs]
def test_add_features_shape_mismatch():
"""Test that shape mismatch raises ValueError."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([[0.1, 0.2]]) # Wrong shape
with pytest.raises(ValueError, match="Shape mismatch between names"):
Converter().add_features(x, y)
[docs]
def test_add_features_append():
"""Test appending rows to existing features."""
x = np.array([1.0, 2.0, 3.0])
y1 = np.array([[0.1, 0.2, 0.3]])
y2 = np.array([[0.4, 0.5, 0.6]])
converter = Converter().add_features(x, y1)
converter.add_features(x, y2, replace=False)
_, data = converter.features
assert data.shape == (2, 3)
assert np.array_equal(data[0], y1[0])
assert np.array_equal(data[1], y2[0])
[docs]
def test_add_features_append_mismatch():
"""Test that appending with mismatched feature_names raises error."""
x1 = np.array([1.0, 2.0, 3.0])
x2 = np.array([1.5, 2.5, 3.5]) # Different
y1 = np.array([[0.1, 0.2, 0.3]])
y2 = np.array([[0.4, 0.5, 0.6]])
converter = Converter().add_features(x1, y1)
with pytest.raises(
ValueError, match="Cannot append features because names do not match"
):
converter.add_features(x2, y2, replace=False)
[docs]
def test_add_features_replace():
"""Test replacing existing features."""
x1 = np.array([1.0, 2.0, 3.0])
x2 = np.array([4.0, 5.0, 6.0])
y1 = np.array([[0.1, 0.2, 0.3]])
y2 = np.array([[0.7, 0.8, 0.9]])
converter = Converter().add_features(x1, y1)
converter.add_features(x2, y2, replace=True)
names, data = converter.features
assert np.array_equal(names, x2)
assert np.array_equal(data, y2)
[docs]
def test_to_table_empty():
"""Test creating an empty table."""
converter = Converter()
table = converter.to_table()
assert len(table) == 0
assert len(table.domain.attributes) == 0
[docs]
def test_to_table_features_only():
"""Test creating a table with features only."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
converter = Converter().add_features(x, y)
table = converter.to_table()
assert len(table) == 2
assert len(table.domain.attributes) == 3
assert len(table.domain.metas) == 0
[docs]
def test_round_trip():
"""Test round-trip conversion: Converter -> Table -> Converter."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
labels = np.array(["A", "B"])
# Create table
table = (
Converter()
.add_features(x, y)
.add_meta("Label", labels, var_type=StringVariable)
.to_table()
)
# Convert back
converter = Converter.from_table(table)
names, data = converter.features
# Verify
assert np.allclose(names, x)
assert np.allclose(data, y)
assert len(converter.metas) == 1
[docs]
def test_features_property():
"""Test the features property returns correct tuple."""
x = np.array([1.0, 2.0, 3.0])
y = np.array([[0.1, 0.2, 0.3]])
converter = Converter().add_features(x, y)
names, data = converter.features
assert np.array_equal(names, x)
assert np.array_equal(data, y)
[docs]
def test_features_property_empty():
"""Test that features property raises error when no features set."""
converter = Converter()
with pytest.raises(ValueError, match="no features data"):
_ = converter.features