using GeradoresService; using GeradoresService.Core; namespace UnitTest; /// /// Para cada gerador e cada valor de cada opção, os valores gerados têm de passar no próprio validador. /// public class GeneratorRoundTripTests { private static readonly GeneratorRegistry Registry = new(); public static TheoryData AllOptionValues() { var data = new TheoryData(); foreach (var g in Registry.All) { if (g.Options.Count == 0) data.Add(g.Id, "", ""); foreach (var o in g.Options) foreach (var c in o.Choices) data.Add(g.Id, o.Key, c.Value); } return data; } [Theory] [MemberData(nameof(AllOptionValues))] public void Generated_values_are_valid(string generatorId, string optionKey, string optionValue) { var generator = Registry.Find(generatorId)!; var options = new Dictionary(); if (optionKey != "") options[optionKey] = optionValue; var items = Registry.Generate(generator, 300, options, seed: 42); Assert.All(items, item => Assert.False(string.IsNullOrWhiteSpace(item.Value))); if (!generator.CanValidate) return; foreach (var item in items) { var result = generator.Validate(item.Value); Assert.True(result.IsValid, $"{generatorId} gerou '{item.Value}' que não valida: {result.Message}"); } } [Fact] public void Pessoa_fields_are_all_valid() { var pessoa = Registry.Find("pessoa")!; foreach (var item in Registry.Generate(pessoa, 200, new Dictionary(), seed: 7)) { var f = item.Fields!; Assert.True(Registry.Find("nif")!.Validate(f["NIF"]).IsValid); Assert.True(Registry.Find("niss")!.Validate(f["NISS"]).IsValid); Assert.True(Registry.Find("cc")!.Validate(f["Cartão de Cidadão"]).IsValid); Assert.True(Registry.Find("iban")!.Validate(f["IBAN"]).IsValid); Assert.True(Registry.Find("telefone")!.Validate(f["Telemóvel"]).IsValid); Assert.True(Registry.Find("email")!.Validate(f["Email"]).IsValid); Assert.True(Registry.Find("codigo-postal")!.Validate(f["Código postal"]).IsValid); var age = DateTime.UtcNow.Year - DateOnly.Parse(f["Data de nascimento"]).Year; Assert.InRange(age, 18, 81); } } [Fact] public void Same_seed_gives_same_values() { var nif = Registry.Find("nif")!; var a = Registry.Generate(nif, 20, new Dictionary(), seed: 123); var b = Registry.Generate(nif, 20, new Dictionary(), seed: 123); Assert.Equal(a.Select(x => x.Value), b.Select(x => x.Value)); } [Fact] public void Generated_values_are_not_all_equal() { var items = Registry.Generate(Registry.Find("nif")!, 50, new Dictionary()); Assert.True(items.Select(i => i.Value).Distinct().Count() > 40); } [Fact] public void Invalid_option_value_throws() { var nif = Registry.Find("nif")!; Assert.Throws(() => Registry.Generate(nif, 1, new Dictionary { ["tipo"] = "4" })); } [Theory] [InlineData(0)] [InlineData(GeneratorRegistry.MaxBatch + 1)] public void Count_out_of_range_throws(int count) { Assert.Throws(() => Registry.Generate(Registry.Find("nif")!, count, new Dictionary())); } [Fact] public void Ids_are_unique() { Assert.Equal(Registry.All.Count, Registry.All.Select(g => g.Id).Distinct().Count()); } }