using GeradoresService;
namespace UnitTest;
/// Valores conhecidos (exemplos oficiais / números de teste públicos).
public class KnownValuesTests
{
private static readonly GeneratorRegistry Registry = new();
private static void AssertValid(string id, string value) =>
Assert.True(Registry.Find(id)!.Validate(value).IsValid, $"{id}: '{value}' devia ser válido.");
private static void AssertInvalid(string id, string value) =>
Assert.False(Registry.Find(id)!.Validate(value).IsValid, $"{id}: '{value}' devia ser inválido.");
[Theory]
[InlineData("123456789")]
[InlineData("PT 123 456 789")]
[InlineData("100000010")] // resto 0 → dígito 0 (falhava na versão antiga)
[InlineData("500000000")] // resto 1 → dígito 0
[InlineData("451234561")] // prefixo 45
public void Nif_valid(string nif) => AssertValid("nif", nif);
[Theory]
[InlineData("123456780")]
[InlineData("100000011")]
[InlineData("12345678")]
[InlineData("412345678")] // prefixo 4 só é válido como 45
[InlineData("abcdefghi")]
public void Nif_invalid(string nif) => AssertInvalid("nif", nif);
[Fact]
public void Nipc_rejects_individual_nif()
{
AssertValid("nipc", "500000000");
AssertInvalid("nipc", "123456789");
}
[Fact]
public void Nif_reports_expected_check_digit()
{
var result = Registry.Find("nif")!.Validate("123456780");
Assert.True(result.FormatMatch);
Assert.Contains("esperado 9", result.Message);
}
[Theory]
[InlineData("12345678902")]
[InlineData("20000000001")]
public void Niss_valid(string niss) => AssertValid("niss", niss);
[Theory]
[InlineData("12345678903")]
[InlineData("32345678902")]
[InlineData("1234567890")]
public void Niss_invalid(string niss) => AssertInvalid("niss", niss);
[Theory]
[InlineData("00000000 0 ZZ4")] // exemplo da especificação da AMA
[InlineData("000000000zz4")]
public void Cc_valid(string cc) => AssertValid("cc", cc);
[Theory]
[InlineData("00000000 0 ZZ5")]
[InlineData("00000000 0 ZZ")]
public void Cc_invalid(string cc) => AssertInvalid("cc", cc);
[Theory]
[InlineData("PT50000201231234567890154")] // exemplo do Banco de Portugal
[InlineData("PT50 0002 0123 1234 5678 9015 4")]
[InlineData("GB82 WEST 1234 5698 7654 32")]
[InlineData("DE89370400440532013000")]
public void Iban_valid(string iban) => AssertValid("iban", iban);
[Theory]
[InlineData("PT50000201231234567890155")]
[InlineData("PT51000201231234567890154")]
[InlineData("PT5000020123123456789015")]
[InlineData("GB82WEST12345698765433")]
public void Iban_invalid(string iban) => AssertInvalid("iban", iban);
[Fact]
public void Nib_valid() => AssertValid("nib", "0002 0123 12345678901 54");
[Theory]
[InlineData("4111 1111 1111 1111")]
[InlineData("5555555555554444")]
[InlineData("2223003122003222")]
[InlineData("378282246310005")]
public void Card_valid(string card) => AssertValid("cartao-credito", card);
[Theory]
[InlineData("4111111111111112")]
[InlineData("411111")]
public void Card_invalid(string card) => AssertInvalid("cartao-credito", card);
[Theory]
[InlineData("4006381333931")]
[InlineData("96385074")]
public void Ean_valid(string ean) => AssertValid("ean", ean);
[Fact]
public void Ean_invalid() => AssertInvalid("ean", "4006381333932");
[Theory]
[InlineData("AA-00-AA")]
[InlineData("00 AB 00")]
[InlineData("12-34-XZ")]
[InlineData("ab0012")]
public void Matricula_valid(string m) => AssertValid("matricula", m);
[Theory]
[InlineData("AK-00-AA")]
[InlineData("A1-00-AA")]
[InlineData("AA-00-AA-00")]
public void Matricula_invalid(string m) => AssertInvalid("matricula", m);
[Theory]
[InlineData("+351 912 345 678")]
[InlineData("00351213456789")]
[InlineData("800 123 456")]
public void Telefone_valid(string t) => AssertValid("telefone", t);
[Theory]
[InlineData("942 345 678")]
[InlineData("91234567")]
public void Telefone_invalid(string t) => AssertInvalid("telefone", t);
[Theory]
[InlineData("1000-001")]
[InlineData("4000 123")]
public void CodigoPostal_valid(string cp) => AssertValid("codigo-postal", cp);
[Theory]
[InlineData("0100-001")]
[InlineData("1000-01")]
public void CodigoPostal_invalid(string cp) => AssertInvalid("codigo-postal", cp);
[Theory]
[InlineData("joao.silva@example.com")]
public void Email_valid(string e) => AssertValid("email", e);
[Theory]
[InlineData("joao.silva")]
[InlineData("joao@silva")]
[InlineData("jo ao@example.com")]
public void Email_invalid(string e) => AssertInvalid("email", e);
[Fact]
public void Multibanco_roundtrip_detects_tampering()
{
var mb = Registry.Find("multibanco")!;
var value = mb.Generate(new GeradoresService.Core.GeneratorContext(new Random(1), new Dictionary())).Value;
Assert.True(mb.Validate(value).IsValid);
var parts = value.Split(' ');
var amount = decimal.Parse(parts[^1], System.Globalization.CultureInfo.InvariantCulture) + 1;
var tampered = string.Join(' ', parts[..^1]) + " " + amount.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture);
Assert.False(mb.Validate(tampered).IsValid);
}
[Fact]
public void Uuid_versions()
{
Assert.Contains("versão 4", Registry.Find("uuid")!.Validate("f47ac10b-58cc-4372-a567-0e02b2c3d479").Message);
AssertInvalid("uuid", "not-a-uuid");
}
}