import pytest
import linreg_core
class TestOLSNative:
def test_ols_regression_native_lists(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
names = ["Intercept", "X1"]
result = linreg_core.ols_regression(y, x, names)
assert hasattr(result, 'coefficients')
assert hasattr(result, 'r_squared')
assert hasattr(result, 'standard_errors')
assert hasattr(result, 't_statistics')
assert hasattr(result, 'p_values')
assert len(result.coefficients) == 2
def test_ols_result_object_attributes(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
names = ["Intercept", "X1"]
result = linreg_core.ols_regression(y, x, names)
assert isinstance(result.r_squared, float)
assert isinstance(result.r_squared_adjusted, float)
assert isinstance(result.f_statistic, float)
assert isinstance(result.f_p_value, float)
assert isinstance(result.mse, float)
assert isinstance(result.rmse, float)
assert isinstance(result.coefficients, list)
assert isinstance(result.standard_errors, list)
assert isinstance(result.t_statistics, list)
assert isinstance(result.p_values, list)
assert isinstance(result.residuals, list)
assert isinstance(result.standardized_residuals, list)
assert isinstance(result.leverage, list)
assert isinstance(result.vif, list)
assert isinstance(result.n_observations, int)
assert isinstance(result.n_predictors, int)
assert isinstance(result.degrees_of_freedom, int)
def test_ols_summary_method(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
names = ["Intercept", "X1"]
result = linreg_core.ols_regression(y, x, names)
summary = result.summary()
assert isinstance(summary, str)
assert "OLS Regression Results" in summary
assert "R-squared" in summary
assert "F-statistic" in summary
assert "Observations" in summary
def test_ols_to_dict_method(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
names = ["Intercept", "X1"]
result = linreg_core.ols_regression(y, x, names)
d = result.to_dict()
assert isinstance(d, dict)
assert "coefficients" in d
assert "standard_errors" in d
assert "r_squared" in d
assert "mse" in d
assert "rmse" in d
def test_ols_repr_and_str(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
names = ["Intercept", "X1"]
result = linreg_core.ols_regression(y, x, names)
str_result = str(result)
assert "OLS Regression Results" in str_result
repr_result = repr(result)
assert "OLSResult" in repr_result
def test_ols_housing_regression_accuracy(self):
y = [245.5, 312.8, 198.4, 425.6, 278.9, 356.2, 189.5, 512.3, 234.7, 298.1]
x = [
[1200.0, 1800.0, 950.0, 2400.0, 1450.0, 2000.0, 1100.0, 2800.0, 1350.0, 1650.0],
[3.0, 4.0, 2.0, 4.0, 3.0, 4.0, 2.0, 5.0, 3.0, 3.0]
]
names = ["Intercept", "Square_Feet", "Bedrooms"]
result = linreg_core.ols_regression(y, x, names)
expected_coeffs = [15.6480854, 0.1638012, 4.8496809]
tolerance = 1e-5
for i, (actual, expected) in enumerate(zip(result.coefficients, expected_coeffs)):
assert abs(actual - expected) < tolerance, f"coeff[{i}] mismatch: {actual} vs {expected}"
def test_ols_multiple_predictors(self):
y = [2.5, 3.7, 4.2, 5.1, 6.3, 7.0]
x1 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
x2 = [2.0, 4.0, 5.0, 4.0, 3.0, 2.0]
names = ["Intercept", "X1", "X2"]
result = linreg_core.ols_regression(y, [x1, x2], names)
assert len(result.coefficients) == 3
assert result.n_observations == 6
assert result.n_predictors == 2
def test_ols_variable_names_as_list(self):
y = [1.0, 2.0, 3.0, 4.0, 5.0]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
result = linreg_core.ols_regression(y, x, ["Intercept", "X1"])
assert len(result.coefficients) == 2
class TestOLSEdgeCases:
def test_empty_input_raises_error(self):
with pytest.raises(Exception):
linreg_core.ols_regression([], [], ["Intercept"])
def test_dimension_mismatch_raises_error(self):
y = [1.0, 2.0, 3.0]
x = [[1.0, 2.0]]
with pytest.raises(Exception):
linreg_core.ols_regression(y, x, ["Intercept", "X1"])
def test_insufficient_data_raises_error(self):
y = [1.0, 2.0]
x = [[1.0, 2.0], [2.0, 4.0]]
with pytest.raises(Exception):
linreg_core.ols_regression(y, x, ["Intercept", "X1", "X2"])
def test_single_observation_raises_error(self):
y = [5.0]
x = [[2.0]]
with pytest.raises(Exception):
linreg_core.ols_regression(y, x, ["Intercept", "X1"])
def test_nan_in_input(self):
y = [1.0, float('nan'), 3.0, 4.0, 5.0]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
with pytest.raises(Exception):
linreg_core.ols_regression(y, x, ["Intercept", "X1"])
def test_inf_in_input(self):
y = [1.0, float('inf'), 3.0, 4.0, 5.0]
x = [[1.0, 2.0, 3.0, 4.0, 5.0]]
with pytest.raises(Exception):
linreg_core.ols_regression(y, x, ["Intercept", "X1"])
def test_very_large_values(self):
y = [1e10, 2e10, 3e10, 4e10, 5e10]
x = [[1e10, 2e10, 3e10, 4e10, 5e10]]
result = linreg_core.ols_regression(y, x, ["Intercept", "X1"])
assert len(result.coefficients) == 2
assert result.r_squared > 0.99
def test_very_small_values(self):
y = [1e-10, 2e-10, 3e-10, 4e-10, 5e-10]
x = [[1e-10, 2e-10, 3e-10, 4e-10, 5e-10]]
result = linreg_core.ols_regression(y, x, ["Intercept", "X1"])
assert len(result.coefficients) == 2
def test_constant_predictor_handled_gracefully(self):
y = [1.0, 2.0, 3.0, 4.0, 5.0]
x = [[1.0, 1.0, 1.0, 1.0, 1.0]]
result = linreg_core.ols_regression(y, x, ["Intercept", "X1"])
assert result is not None
assert len(result.coefficients) == 2
import math
assert any(math.isnan(c) for c in result.coefficients)
def test_perfect_collinearity_handled_gracefully(self):
y = [1.0, 2.0, 3.0, 4.0, 5.0]
x1 = [1.0, 2.0, 3.0, 4.0, 5.0]
x2 = [2.0, 4.0, 6.0, 8.0, 10.0]
result = linreg_core.ols_regression(y, [x1, x2], ["Intercept", "X1", "X2"])
assert result is not None
assert len(result.coefficients) == 3
import math
assert any(math.isnan(c) for c in result.coefficients)
def test_negative_values(self):
y = [-5.0, -3.0, -1.0, 1.0, 3.0]
x = [[-2.0, -1.0, 0.0, 1.0, 2.0]]
result = linreg_core.ols_regression(y, x, ["Intercept", "X1"])
assert len(result.coefficients) == 2