using System.Globalization; using ImportAssist.Core; using Xunit; namespace ImportAssist.Core.Tests; public sealed class InvoiceValidatorTests { [Theory] [InlineData("de-DE")] [InlineData("en-US")] public void Validate_AcceptsDecimalPointRegardlessOfCurrentCulture( string cultureName) { var originalCulture = CultureInfo.CurrentCulture; try { CultureInfo.CurrentCulture = new CultureInfo(cultureName); var row = new InvoiceRow( "INV-001", "C-100", "125.50", "EUR"); var errors = InvoiceValidator.Validate(row); Assert.Empty(errors); } finally { CultureInfo.CurrentCulture = originalCulture; } } [Theory] [InlineData("abc", "Betrag ist keine gültige Zahl.")] [InlineData("125,50", "Betrag ist keine gültige Zahl.")] [InlineData("1,250.00", "Betrag ist keine gültige Zahl.")] [InlineData("0", "Betrag muss größer als null sein.")] [InlineData("-10.00", "Betrag muss größer als null sein.")] public void Validate_RejectsInvalidAmount( string amount, string expectedError) { var row = new InvoiceRow( "INV-001", "C-100", amount, "EUR"); var errors = InvoiceValidator.Validate(row); Assert.Equal(expectedError, Assert.Single(errors)); } [Fact] public void Validate_CollectsAllErrorsForOneInvoice() { var row = new InvoiceRow(" ", "\t", "0", "EUR"); var errors = InvoiceValidator.Validate(row); Assert.Equal(3, errors.Count); Assert.Contains("Rechnungsnummer fehlt.", errors); Assert.Contains("Kundennummer fehlt.", errors); Assert.Contains("Betrag muss größer als null sein.", errors); } }