text_to_solver_program/test_data_profile.py
dschlueter b74445b8d6 Erste öffentliche Fassung: Math Model Generator & Solver
Übersetzt natürlichsprachige Optimierungsaufgaben (Deutsch) per LLM in
eine geprüfte Modellspezifikation, erzeugt Solver-Code und führt ihn in
einer bubblewrap-Sandbox aus. Deterministische Prüfungen ohne LLM,
Report als Markdown/HTML, Benchmark mit 19 verifizierten Fällen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 11:42:58 +02:00

49 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Profil beigelegter Datendateien – deterministisch, ohne LLM."""
import pytest
from data_profile import profile_file, profile_files, to_prompt
@pytest.fixture
def kurse(tmp_path):
datei = tmp_path / "kurse.csv"
datei.write_text("Aktie;Rendite;Risiko;Gebuehr\nA01;6,9;2,04;0,68\nA02;14,4;1,63;0,74\nA03;11,5;;0,39\n",
encoding="utf-8")
return datei
def test_german_numbers_are_recognised(kurse):
# deutsche Daten sind der Normalfall: "6,9" ist eine Zahl, keine Zeichenkette
profil = profile_file(kurse)
assert profil.rows == 3 and len(profil.columns) == 4
rendite = next(s for s in profil.columns if s.name == "Rendite")
assert rendite.dtype == "Zahl"
assert rendite.minimum == pytest.approx(6.9) and rendite.maximum == pytest.approx(14.4)
def test_text_columns_and_gaps(kurse):
profil = profile_file(kurse)
assert next(s for s in profil.columns if s.name == "Aktie").dtype == "Text"
assert next(s for s in profil.columns if s.name == "Risiko").missing == 1
def test_separator_is_detected(tmp_path):
komma = tmp_path / "en.csv"
komma.write_text("name,value\nfoo,1.5\nbar,2.5\n")
profil = profile_file(komma)
assert [s.name for s in profil.columns] == ["name", "value"]
assert next(s for s in profil.columns if s.name == "value").mean == pytest.approx(2.0)
def test_unreadable_file_is_reported_not_raised(tmp_path):
profil = profile_file(tmp_path / "gibtsnicht.csv")
assert profil.error and "FileNotFoundError" in profil.error
assert profil.rows == 0
def test_prompt_names_columns_and_ranges(kurse):
text = to_prompt(profile_files([kurse]))
assert "kurse.csv: 3 Zeilen, 4 Spalten" in text
assert "Rendite (Zahl, von 6.9 bis 14.4" in text
assert "1 fehlend" in text
assert to_prompt([]) == ""