public bool Execute() { var paths = new Paths(); var success = true; try { var currentCode = string.Empty; if (File.Exists(paths.DocStringsFilePath)) { currentCode = File.ReadAllText(paths.DocStringsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("namespace MudBlazor.Docs.Models"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("public static partial class DocStrings"); cb.AddLine("{"); cb.IndentLevel++; var assembly = typeof(MudText).Assembly; foreach (var type in assembly.GetTypes().OrderBy(t => GetSaveTypename(t))) { foreach (var info in type.GetPropertyInfosWithAttribute <ParameterAttribute>()) { var doc = info.GetDocumentation(); doc = Regex.Replace(doc ?? "", @"</?.+?>", ""); cb.AddLine($"public const string {GetSaveTypename(type).TrimEnd('_')}_{info.Name} = @\"{EscapeDescription(doc)}\";\n"); } } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.DocStringsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.DocStringsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); var newFiles = new StringBuilder(); var success = true; var noOfFilesUpdated = 0; var noOfFilesCreated = 0; try { var formatter = new HtmlClassFormatter(); var lastCheckedTime = new DateTime(); if (File.Exists(paths.NewFilesToBuildPath)) { var lastNewFilesToBuild = new FileInfo(paths.NewFilesToBuildPath); lastCheckedTime = lastNewFilesToBuild.LastWriteTime; } var directoryInfo = new DirectoryInfo(paths.DocsDirPath); foreach (var entry in directoryInfo.GetFiles("*.razor", SearchOption.AllDirectories)) { if (entry.Name.EndsWith("Code.razor")) { continue; } if (!entry.Name.Contains(Paths.ExampleDiscriminator)) { continue; } var markupPath = entry.FullName.Replace("Examples", "Code").Replace(".razor", "Code.html"); if (entry.LastWriteTime < lastCheckedTime && File.Exists(markupPath)) { continue; } var markupDir = Path.GetDirectoryName(markupPath); if (!Directory.Exists(markupDir)) { Directory.CreateDirectory(markupDir); } var src = StripComponentSource(entry.FullName); var blocks = src.Split("@code"); var blocks0 = Regex.Replace(blocks[0], @"</?DocsFrame>", string.Empty) .Replace("@", "PlaceholdeR") .Trim(); // Note: the @ creates problems and thus we replace it with an unlikely placeholder and in the markup replace back. var html = formatter.GetHtmlString(blocks0, Languages.Html).Replace("PlaceholdeR", "@"); html = AttributePostprocessing(html).Replace("@", "<span class=\"atSign\">@</span>"); var currentCode = string.Empty; if (File.Exists(markupPath)) { currentCode = File.ReadAllText(markupPath); } var cb = new CodeBuilder(); // cb.AddLine("@* Auto-generated markup. Any changes will be overwritten *@"); // cb.AddLine("@namespace MudBlazor.Docs.Examples.Markup"); cb.AddLine("<div class=\"mud-codeblock\">"); cb.AddLine(html.ToLfLineEndings()); if (blocks.Length == 2) { cb.AddLine( formatter.GetHtmlString("@code" + blocks[1], Languages.CSharp) .Replace("@", "<span class=\"atSign\">@</span>") .ToLfLineEndings()); } cb.AddLine("</div>"); if (currentCode != cb.ToString()) { File.WriteAllText(markupPath, cb.ToString()); if (currentCode == string.Empty) { newFiles.AppendLine(markupPath); noOfFilesCreated++; } else { noOfFilesUpdated++; } } } File.WriteAllText(paths.NewFilesToBuildPath, newFiles.ToString()); } catch (Exception e) { Console.WriteLine($"Error generating examples markup : {e.Message}"); success = false; } Console.WriteLine($"Docs.Compiler updated {noOfFilesUpdated} generated files"); Console.WriteLine($"Docs.Compiler generated {noOfFilesCreated} new files"); return(success); }
public bool Execute() { var paths = new Paths(); bool success = true; try { Directory.CreateDirectory(paths.TestDirPath); string currentCode = string.Empty; if (File.Exists(paths.ComponentTestsFilePath)) { currentCode = File.ReadAllText(paths.ComponentTestsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("using Bunit;"); cb.AddLine("using Bunit.TestDoubles;"); cb.AddLine("using Microsoft.AspNetCore.Components;"); cb.AddLine("using Microsoft.Extensions.DependencyInjection;"); cb.AddLine("using NUnit.Framework;"); cb.AddLine("using MudBlazor.UnitTests.Mocks;"); cb.AddLine("using MudBlazor.Docs.Examples;"); cb.AddLine("using MudBlazor.Docs.Wireframes;"); cb.AddLine("using MudBlazor.Services;"); cb.AddLine("using System.Net.Http;"); cb.AddLine(); cb.AddLine("namespace MudBlazor.UnitTests.Components"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("// These tests just check if all the examples from the doc page render without errors"); cb.AddLine("[TestFixture]"); cb.AddLine("public class _AllComponents"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("private Bunit.TestContext ctx;"); cb.AddLine(); cb.AddLine("[SetUp]"); cb.AddLine("public void Setup()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("ctx = new Bunit.TestContext();"); cb.AddLine("ctx.JSInterop.Mode = JSRuntimeMode.Loose;"); cb.AddLine("ctx.Services.AddSingleton<NavigationManager>(new MockNavigationManager());"); cb.AddLine("ctx.Services.AddSingleton<IDialogService>(new DialogService());"); cb.AddLine("ctx.Services.AddSingleton<ISnackbar>(new MockSnackbar());"); cb.AddLine("ctx.Services.AddSingleton<IResizeListenerService>(new MockResizeListenerService());"); cb.AddLine("ctx.Services.AddScoped(sp => new HttpClient());"); cb.IndentLevel--; cb.AddLine("}"); cb.AddLine(); cb.AddLine("[TearDown]"); cb.AddLine("public void TearDown() => ctx.Dispose();"); cb.AddLine(); foreach (var entry in Directory.EnumerateFiles(paths.DocsDirPath, "*.razor", SearchOption.AllDirectories) .OrderBy(e => e.Replace("\\", "/"), StringComparer.Ordinal)) { if (entry.EndsWith("Code.razor")) { continue; } var filename = Path.GetFileName(entry); var componentName = Path.GetFileNameWithoutExtension(filename); if (!filename.Contains(Paths.ExampleDiscriminator)) { continue; } cb.AddLine("[Test]"); cb.AddLine($"public void {componentName}_Test()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine($"ctx.RenderComponent<{componentName}>();"); cb.IndentLevel--; cb.AddLine("}"); } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.ComponentTestsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.ComponentTestsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); var success = true; try { var currentCode = string.Empty; if (File.Exists(paths.DocStringsFilePath)) { currentCode = File.ReadAllText(paths.DocStringsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("namespace MudBlazor.Docs.Models"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("public static partial class DocStrings"); cb.AddLine("{"); cb.IndentLevel++; var assembly = typeof(MudText).Assembly; foreach (var type in assembly.GetTypes().OrderBy(t => GetSaveTypename(t))) { foreach (var property in type.GetPropertyInfosWithAttribute <ParameterAttribute>()) { var doc = property.GetDocumentation() ?? ""; doc = Regex.Replace(doc, @"</?.+?>", ""); cb.AddLine($"public const string {GetSaveTypename(type)}_{property.Name} = @\"{EscapeDescription(doc).Trim()}\";\n"); } // TableContext was causing conflicts due to the imperfect mapping from the name of class to the name of field in DocStrings if (type.IsSubclassOf(typeof(Attribute)) || GetSaveTypename(type) == "TypeInference" || type == typeof(Utilities.CssBuilder) || type == typeof(TableContext)) { continue; } foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)) { if (!hiddenMethods.Any(x => x.Contains(method.Name)) && !method.Name.StartsWith("get_") && !method.Name.StartsWith("set_")) { // omit methods defined in System.Enum if (GetBaseDefinitionClass(method) == typeof(Enum)) { continue; } var doc = method.GetDocumentation() ?? ""; cb.AddLine($"public const string {GetSaveTypename(type)}_method_{GetSaveMethodIdentifier(method)} = @\"{EscapeDescription(doc)}\";\n"); } } } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.DocStringsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.DocStringsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); var success = true; try { Directory.CreateDirectory(paths.TestDirPath); var currentCode = string.Empty; if (File.Exists(paths.ComponentTestsFilePath)) { currentCode = File.ReadAllText(paths.ComponentTestsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("using MudBlazor.Docs.Examples;"); cb.AddLine("using MudBlazor.Docs.Wireframes;"); cb.AddLine("using NUnit.Framework;"); cb.AddLine(); cb.AddLine("namespace MudBlazor.UnitTests.Components"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("// These tests just check if all the examples from the doc page render without errors"); cb.AddLine("public partial class ExampleDocsTests"); cb.AddLine("{"); cb.IndentLevel++; foreach (var entry in Directory.EnumerateFiles(paths.DocsDirPath, "*.razor", SearchOption.AllDirectories) .OrderBy(e => e.Replace("\\", "/"), StringComparer.Ordinal)) { if (entry.EndsWith("Code.razor")) { continue; } var filename = Path.GetFileName(entry); var componentName = Path.GetFileNameWithoutExtension(filename); if (!filename.Contains(Paths.ExampleDiscriminator)) { continue; } // skip over table/data grid virutalization since it takes too long. if (filename == "TableVirtualizationExample.razor" || filename == "DataGridVirtualizationExample.razor") { continue; } cb.AddLine("[Test]"); cb.AddLine($"public void {componentName}_Test()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine($"ctx.RenderComponent<{componentName}>();"); cb.IndentLevel--; cb.AddLine("}"); } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.ComponentTestsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.ComponentTestsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); bool success = true; try { var formatter = new HtmlClassFormatter(); foreach (var entry in Directory.EnumerateFiles(paths.DocsDirPath, "*.razor", SearchOption.AllDirectories) .OrderBy(e => e.Replace("\\", "/"), StringComparer.Ordinal)) { if (entry.EndsWith("Code.razor")) { continue; } var filename = Path.GetFileName(entry); if (!filename.Contains(Paths.ExampleDiscriminator)) { continue; } var markupPath = entry.Replace("Examples", "Code").Replace(".razor", "Code.razor"); var markupDir = Path.GetDirectoryName(markupPath); if (!Directory.Exists(markupDir)) { Directory.CreateDirectory(markupDir); } var src = StripComponentSource(entry); var blocks = src.Split("@code"); var blocks0 = Regex.Replace(blocks[0], @"</?DocsFrame>", string.Empty) .Replace("@", "PlaceholdeR") .Trim(); // Note: the @ creates problems and thus we replace it with an unlikely placeholder and in the markup replace back. var html = formatter.GetHtmlString(blocks0, Languages.Html).Replace("PlaceholdeR", "@"); html = AttributePostprocessing(html).Replace("@", "<span class=\"atSign\">@</span>"); string currentCode = string.Empty; if (File.Exists(markupPath)) { currentCode = File.ReadAllText(markupPath); } var cb = new CodeBuilder(); cb.AddLine("@* Auto-generated markup. Any changes will be overwritten *@"); cb.AddLine("@namespace MudBlazor.Docs.Examples.Markup"); cb.AddLine("<div class=\"mud-codeblock\">"); cb.AddLine(html.ToLfLineEndings()); if (blocks.Length == 2) { cb.AddLine( formatter.GetHtmlString("@code" + blocks[1], Languages.CSharp) .Replace("@", "<span class=\"atSign\">@</span>") .ToLfLineEndings()); } cb.AddLine("</div>"); if (currentCode != cb.ToString()) { File.WriteAllText(markupPath, cb.ToString()); } } } catch (Exception e) { Console.WriteLine($"Error generating examples markup : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); var success = true; try { Directory.CreateDirectory(paths.TestDirPath); var currentCode = string.Empty; if (File.Exists(paths.ApiPageTestsFilePath)) { currentCode = File.ReadAllText(paths.ApiPageTestsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("using MudBlazor.Charts;"); cb.AddLine("using MudBlazor.Docs.Components;"); cb.AddLine("using MudBlazor.Internal;"); cb.AddLine("using NUnit.Framework;"); cb.AddLine("using ComponentParameter = Bunit.ComponentParameter;"); cb.AddLine(); cb.AddLine("namespace MudBlazor.UnitTests.Components"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("// These tests just check all the API pages to see if they throw any exceptions"); cb.AddLine("public partial class ApiDocsTests"); cb.AddLine("{"); cb.IndentLevel++; var mudBlazorComponents = typeof(MudAlert).Assembly.GetTypes().OrderBy(t => t.FullName).Where(t => t.IsSubclassOf(typeof(ComponentBase))); foreach (var type in mudBlazorComponents) { if (type.IsAbstract) { continue; } if (type.Name.Contains("Base")) { continue; } if (type.Namespace.Contains("InternalComponents")) { continue; } cb.AddLine("[Test]"); cb.AddLine($"public void {SafeTypeName(type, removeT: true)}_API_Test()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine(@$ "ctx.RenderComponent<DocsApi>(ComponentParameter.CreateParameter(" "Type" ", typeof({SafeTypeName(type)})));"); cb.IndentLevel--; cb.AddLine("}"); } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.ApiPageTestsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.ApiPageTestsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); var success = true; try { Directory.CreateDirectory(paths.TestDirPath); var currentCode = string.Empty; if (File.Exists(paths.ApiPageTestsFilePath)) { currentCode = File.ReadAllText(paths.ApiPageTestsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddUsings(); cb.AddLine("namespace MudBlazor.UnitTests.Components"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("// These tests just check all the API pages to see if they throw any exceptions"); cb.AddLine("[TestFixture]"); cb.AddLine("public class _AllApiPages"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("private Bunit.TestContext ctx;"); cb.AddLine(); cb.AddLine("[SetUp]"); cb.AddLine("public void Setup()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("ctx = new Bunit.TestContext();"); cb.AddLine("ctx.JSInterop.Mode = JSRuntimeMode.Loose;"); cb.AddLine("ctx.Services.AddSingleton<NavigationManager>(new MockNavigationManager());"); cb.AddLine("ctx.Services.AddSingleton<IDialogService>(new DialogService());"); cb.AddLine("ctx.Services.AddSingleton<ISnackbar>(new SnackbarService());"); cb.AddLine("ctx.Services.AddSingleton<IResizeListenerService>(new MockResizeListenerService());"); cb.AddLine("ctx.Services.AddTransient<IScrollManager, MockScrollManager>();"); cb.AddLine("ctx.Services.AddTransient<IScrollListener, MockScrollListener>();"); cb.AddLine("ctx.Services.AddSingleton<IHeadElementHelper>(new MockHeadElementHelper());"); cb.AddLine("ctx.Services.AddSingleton<IBrowserWindowSizeProvider>(new MockBrowserWindowSizeProvider());"); cb.AddLine("ctx.Services.AddSingleton<IDomService>(new MockDomService());"); cb.AddLine("ctx.Services.AddScoped(sp => new HttpClient());"); cb.IndentLevel--; cb.AddLine("}"); cb.AddLine(); cb.AddLine("[TearDown]"); cb.AddLine("public void TearDown() => ctx.Dispose();"); cb.AddLine(); var mudBlazorComponents = typeof(MudAlert).Assembly.GetTypes().OrderBy(t => t.FullName).Where(t => t.IsSubclassOf(typeof(ComponentBase))); foreach (var type in mudBlazorComponents) { if (type.IsAbstract) { continue; } if (type.Name.Contains("Base")) { continue; } if (type.Namespace.Contains("InternalComponents")) { continue; } cb.AddLine("[Test]"); cb.AddLine($"public void {SafeTypeName(type, removeT: true)}_API_Test()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine(@$ "ctx.RenderComponent<DocsApi>(ComponentParameter.CreateParameter(" "Type" ", typeof({SafeTypeName(type)})));"); cb.IndentLevel--; cb.AddLine("}"); } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.ApiPageTestsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.ApiPageTestsFilePath} : {e.Message}"); success = false; } return(success); }
public bool Execute() { var paths = new Paths(); bool success = true; try { Directory.CreateDirectory(paths.TestDirPath); string currentCode = string.Empty; if (File.Exists(paths.ApiPageTestsFilePath)) { currentCode = File.ReadAllText(paths.ApiPageTestsFilePath); } var cb = new CodeBuilder(); cb.AddHeader(); cb.AddLine("using Bunit.TestDoubles.JSInterop;"); cb.AddLine("using Microsoft.AspNetCore.Components;"); cb.AddLine("using Microsoft.Extensions.DependencyInjection;"); cb.AddLine("using NUnit.Framework;"); cb.AddLine("using MudBlazor.UnitTests.Mocks;"); cb.AddLine("using MudBlazor.Docs.Examples;"); cb.AddLine("using MudBlazor.Services;"); cb.AddLine("using MudBlazor.Docs.Components;"); cb.AddLine("using Bunit.Rendering;"); cb.AddLine("using System;"); cb.AddLine("using Toolbelt.Blazor.HeadElement;"); cb.AddLine("using MudBlazor.UnitTests;"); cb.AddLine("using MudBlazor.Charts;"); cb.AddLine("using Bunit;"); cb.AddLine(); cb.AddLine("#if NET5_0"); cb.AddLine("using ComponentParameter = Bunit.ComponentParameter;"); cb.AddLine("#endif"); cb.AddLine(); cb.AddLine("namespace MudBlazor.UnitTests.Components"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("// These tests just check all the API pages to see if they throw any exceptions"); cb.AddLine("[TestFixture]"); cb.AddLine("public class _AllApiPages"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("private Bunit.TestContext ctx;"); cb.AddLine(); cb.AddLine("[SetUp]"); cb.AddLine("public void Setup()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine("ctx = new Bunit.TestContext();"); cb.AddLine("ctx.Services.AddMockJSRuntime();"); cb.AddLine("ctx.Services.AddSingleton<NavigationManager>(new MockNavigationManager());"); cb.AddLine("ctx.Services.AddSingleton<IDialogService>(new DialogService());"); cb.AddLine("ctx.Services.AddSingleton<ISnackbar>(new MockSnackbar());"); cb.AddLine("ctx.Services.AddSingleton<IResizeListenerService>(new MockResizeListenerService());"); cb.AddLine("ctx.Services.AddSingleton<IHeadElementHelper>(new MockHeadElementHelper());"); cb.IndentLevel--; cb.AddLine("}"); cb.AddLine(); cb.AddLine("[TearDown]"); cb.AddLine("public void TearDown() => ctx.Dispose();"); cb.AddLine(); var mudBlazorComponents = typeof(MudAlert).Assembly.GetTypes().OrderBy(t => t.FullName).Where(t => t.IsSubclassOf(typeof(ComponentBase))); foreach (var type in mudBlazorComponents) { if (type.IsAbstract) { continue; } if (type.Name.Contains("Base")) { continue; } if (type.Namespace.Contains("InternalComponents")) { continue; } cb.AddLine("[Test]"); cb.AddLine($"public void {SafeTypeName(type, removeT: true)}_API_Test()"); cb.AddLine("{"); cb.IndentLevel++; cb.AddLine(@$ "ctx.RenderComponent<DocsApi>(ComponentParameter.CreateParameter(" "Type" ", typeof({SafeTypeName(type)})));"); cb.IndentLevel--; cb.AddLine("}"); } cb.IndentLevel--; cb.AddLine("}"); cb.IndentLevel--; cb.AddLine("}"); if (currentCode != cb.ToString()) { File.WriteAllText(paths.ApiPageTestsFilePath, cb.ToString()); } } catch (Exception e) { Console.WriteLine($"Error generating {paths.ApiPageTestsFilePath} : {e.Message}"); success = false; } return(success); }