diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 079d5d9..599b19f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,10 +14,13 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: '3.1.x' + dotnet-version: | + 6.0.x + 7.0.x + 8.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --no-restore - name: Test - run: dotnet test --no-build --verbosity normal \ No newline at end of file + run: dotnet test --no-build --verbosity normal diff --git a/CHANGELOG.md b/CHANGELOG.md index 060a2c1..cd673ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Represents the **NuGet** versions. +## v2.0.0 +- *Enhancement:* **Breaking change** - underlying JSON serialization has been changed from `Newtonsoft.Json` to `System.Text.Json`, with new `Utility.JsonSerializer` encapsulating logic to enable. The following steps are required to migrate existing usage: + - Rename all attribute references from `JsonProperty` to `JsonPropertyName`. + - Remove all attribute references to `[JsonObject(MemberSerialization = MemberSerialization.OptIn)]`; opt-in is the default behavior when leveraging the `CodeGenClassAttribute` attribute. +- *Fixed:* All dependencies updated to the latest version. + ## v1.0.8 - *Fixed:* Added comparison context where reporting a file update as a result of using `ExpectNoChanges`. diff --git a/src/OnRamp/Config/CodeGenPropertyAttribute.cs b/src/OnRamp/Config/CodeGenPropertyAttribute.cs index a11c762..458d801 100644 --- a/src/OnRamp/Config/CodeGenPropertyAttribute.cs +++ b/src/OnRamp/Config/CodeGenPropertyAttribute.cs @@ -7,19 +7,14 @@ namespace OnRamp.Config /// /// Represents the code-generation property configuration. /// + /// The grouping category. [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] - public sealed class CodeGenPropertyAttribute : Attribute + public sealed class CodeGenPropertyAttribute(string category) : Attribute { - /// - /// Initializes a new instance of the class. - /// - /// The grouping category. - public CodeGenPropertyAttribute(string category) => Category = category ?? throw new ArgumentNullException(nameof(category)); - /// /// Gets or sets the category. /// - public string Category { get; } + public string Category { get; } = category ?? throw new ArgumentNullException(nameof(category)); /// /// Gets or sets the title. diff --git a/src/OnRamp/Config/ConfigBase.cs b/src/OnRamp/Config/ConfigBase.cs index 0106251..8fea79a 100644 --- a/src/OnRamp/Config/ConfigBase.cs +++ b/src/OnRamp/Config/ConfigBase.cs @@ -1,11 +1,11 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace OnRamp.Config @@ -13,7 +13,6 @@ namespace OnRamp.Config /// /// Provides base configuration capabilities. /// - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public abstract class ConfigBase { #region static @@ -215,35 +214,35 @@ public static bool IsSubclassOfBaseType(Type baseType, Type type) /// Gets or sets the that houses any additional/extra properties/attributes deserialized within the configuration. /// [JsonExtensionData] - public Dictionary? ExtraProperties { get; set; } + public Dictionary? ExtraProperties { get; set; } /// - /// Gets the property value from using the specified as . + /// Gets the property value from using the specified and . /// /// The property . /// The key. /// The default value where the property is not found. /// The value. - public T GetExtraProperty(string key, T defaultValue = default!) where T : JToken + public T? GetExtraProperty(string key, T? defaultValue = default!) { if (ExtraProperties != null && ExtraProperties.TryGetValue(key, out var val)) - return (T)Convert.ChangeType(val, typeof(T)); + return val.Deserialize()!; else return defaultValue!; } /// - /// Trys to get the property value from using the specified as . + /// Trys to get the property value from using the specified and . /// /// The property . /// The key. /// The corresponding value. /// true if the is found; otherwise, false. - public bool TryGetExtraProperty(string key, out T value) where T : JToken + public bool TryGetExtraProperty(string key, out T value) { if (ExtraProperties != null && ExtraProperties.TryGetValue(key, out var val)) { - value = (T)Convert.ChangeType(val, typeof(T)); + value = val.Deserialize()!; return true; } else @@ -257,7 +256,7 @@ public bool TryGetExtraProperty(string key, out T value) where T : JToken /// Gets the that allows for custom property values to be manipulated at runtime. /// [JsonIgnore] - public Dictionary CustomProperties { get; } = new Dictionary(); + public Dictionary CustomProperties { get; } = []; /// /// Gets the property value from using the specified as . diff --git a/src/OnRamp/Config/ConfigBaseT.cs b/src/OnRamp/Config/ConfigBaseT.cs index f229cb3..eb70e7d 100644 --- a/src/OnRamp/Config/ConfigBaseT.cs +++ b/src/OnRamp/Config/ConfigBaseT.cs @@ -1,6 +1,5 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -14,7 +13,6 @@ namespace OnRamp.Config /// /// The root . /// The parent . - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public abstract class ConfigBase : ConfigBase where TRoot : ConfigBase where TParent : ConfigBase { /// diff --git a/src/OnRamp/Config/ConfigRootBase.cs b/src/OnRamp/Config/ConfigRootBase.cs index a9d4e6f..6e849bd 100644 --- a/src/OnRamp/Config/ConfigRootBase.cs +++ b/src/OnRamp/Config/ConfigRootBase.cs @@ -1,6 +1,5 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using OnRamp.Generators; using System; using System.Collections.Generic; @@ -11,7 +10,6 @@ namespace OnRamp.Config /// Provides the root base configuration capabilities. /// /// The root . - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public abstract class ConfigRootBase : ConfigBase, IRootConfig where TRoot : ConfigRootBase { /// diff --git a/src/OnRamp/Console/ConsoleLogger.cs b/src/OnRamp/Console/ConsoleLogger.cs index 00c987b..e98cfe4 100644 --- a/src/OnRamp/Console/ConsoleLogger.cs +++ b/src/OnRamp/Console/ConsoleLogger.cs @@ -20,13 +20,13 @@ public class ConsoleLogger : ILogger public ConsoleLogger(IConsole? console = null) => _console = console; /// - public IDisposable BeginScope(TState state) => NullScope.Default; + public IDisposable BeginScope(TState state) where TState : notnull => NullScope.Default; /// public bool IsEnabled(LogLevel logLevel) => true; /// - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { if (formatter == null) throw new ArgumentNullException(nameof(formatter)); diff --git a/src/OnRamp/OnRamp.csproj b/src/OnRamp/OnRamp.csproj index cebb6bc..9ca9a22 100644 --- a/src/OnRamp/OnRamp.csproj +++ b/src/OnRamp/OnRamp.csproj @@ -4,7 +4,7 @@ Exe netstandard2.1 OnRamp - 1.0.8 + 2.0.0 true Avanade Avanade @@ -48,13 +48,13 @@ - - - - + + + - + + \ No newline at end of file diff --git a/src/OnRamp/Scripts/CodeGenScript.cs b/src/OnRamp/Scripts/CodeGenScript.cs index 9558f57..204940f 100644 --- a/src/OnRamp/Scripts/CodeGenScript.cs +++ b/src/OnRamp/Scripts/CodeGenScript.cs @@ -1,10 +1,10 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using OnRamp.Config; using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace OnRamp.Scripts @@ -12,7 +12,6 @@ namespace OnRamp.Scripts /// /// Represents the root that encapsulates the underlying . /// - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [CodeGenClass("Script", Title = "'Script' object.", Description = "The `Script` object scripts the code-generation execution.")] [CodeGenCategory("Key", Title = "Provides the _Key_ configuration.")] [CodeGenCategory("Collections", Title = "Provides related child (hierarchical) configuration.")] @@ -24,28 +23,28 @@ public class CodeGenScript : ConfigRootBase /// /// Gets or sets the .NET Type for the underlying . /// - [JsonProperty("configType")] + [JsonPropertyName("configType")] [CodeGenProperty("Key", Title = "The .NET ConfigRootBase Type for the underlying 'Generators'.", IsMandatory = true)] public string? ConfigType { get; set; } /// /// Gets or sets the list of additional script resource names to inherit. /// - [JsonProperty("inherits")] + [JsonPropertyName("inherits")] [CodeGenPropertyCollection("Key", Title = "The list of additional script resource names to inherit.")] public List? Inherits { get; set; } /// /// Gets or sets the . /// - [JsonProperty("editorType")] + [JsonPropertyName("editorType")] [CodeGenPropertyCollection("Key", Title = "The .NET IConfigEditor Type for performing extended custom configuration prior to generation.")] public string? EditorType { get; set; } /// /// Gets or sets the collection. /// - [JsonProperty("generators")] + [JsonPropertyName("generators")] [CodeGenPropertyCollection("Collections", Title = "The corresponding `Generator` collection.")] public List? Generators { get; set; } diff --git a/src/OnRamp/Scripts/CodeGenScriptItem.cs b/src/OnRamp/Scripts/CodeGenScriptItem.cs index 811482c..f49324d 100644 --- a/src/OnRamp/Scripts/CodeGenScriptItem.cs +++ b/src/OnRamp/Scripts/CodeGenScriptItem.cs @@ -1,11 +1,11 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using OnRamp.Config; using OnRamp.Generators; using OnRamp.Utility; using System; using System.Collections.Generic; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace OnRamp.Scripts @@ -13,7 +13,6 @@ namespace OnRamp.Scripts /// /// Represents the script arguments used to define a (as specified by the ) and other associated code-generation arguments. /// - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [CodeGenClass("Generate", Title = "'Generate' command.", Description = "The `Generate` command defines the execution parameters for a code-generation execution.")] [CodeGenCategory("Key", Title = "Provides the _Key_ configuration.")] public class CodeGenScriptItem : ConfigBase @@ -29,14 +28,14 @@ public class CodeGenScriptItem : ConfigBase /// /// Gets or sets the . /// - [JsonProperty("type")] + [JsonPropertyName("type")] [CodeGenProperty("Key", Title = "The .NET Generator (CodeGeneratorBase) Type.", IsMandatory = true)] public string? Type { get; set; } /// /// Gets or sets the template resource name. /// - [JsonProperty("template")] + [JsonPropertyName("template")] [CodeGenProperty("Key", Title = "The template resource name.", IsMandatory = true)] public string? Template { get; set; } @@ -44,7 +43,7 @@ public class CodeGenScriptItem : ConfigBase /// Gets or sets the file name. /// /// Supports Handlebars syntax. - [JsonProperty("file")] + [JsonPropertyName("file")] [CodeGenProperty("Key", Title = "The file name.", IsMandatory = true, Description = "Supports _Handlebars_ syntax.")] public string? File { get; set; } @@ -52,14 +51,14 @@ public class CodeGenScriptItem : ConfigBase /// Gets or sets the directory name. /// /// Supports Handlebars syntax. - [JsonProperty("directory")] + [JsonPropertyName("directory")] [CodeGenProperty("Key", Title = "The directory name.", Description = "Supports _Handlebars_ syntax.")] public string? Directory { get; set; } /// /// Indicates whether the file is only generated once; i.e. only created where it does not already exist. /// - [JsonProperty("genOnce")] + [JsonPropertyName("genOnce")] [CodeGenProperty("Key", Title = "Indicates whether the file is only generated once; i.e. only created where it does not already exist.")] public bool IsGenOnce { get; set; } @@ -67,14 +66,14 @@ public class CodeGenScriptItem : ConfigBase /// Gets or sets the gen-once file name pattern to check (can include wildcard '*' characters). /// /// Supports Handlebars syntax. - [JsonProperty("genOncePattern")] + [JsonPropertyName("genOncePattern")] [CodeGenProperty("Key", Title = "The gen-once file name pattern to check (can include wildcard `*` characters).", Description = "Supports _Handlebars_ syntax. Defaults to `File` where not specified.")] public string? GenOncePattern { get; set; } /// /// Gets or sets the help text. /// - [JsonProperty("text")] + [JsonPropertyName("text")] [CodeGenProperty("Key", Title = "The additional text written to the log to enable additional context.")] public string? Text { get; set; } @@ -127,7 +126,7 @@ protected override Task PrepareAsync() { foreach (var json in ExtraProperties) { - RuntimeParameters.Add(json.Key, json.Value.ToObject()); + RuntimeParameters.Add(json.Key, json.Value.ToString()); } } } diff --git a/src/OnRamp/Utility/JsonSchemaGenerator.cs b/src/OnRamp/Utility/JsonSchemaGenerator.cs index aee6fea..8c32d60 100644 --- a/src/OnRamp/Utility/JsonSchemaGenerator.cs +++ b/src/OnRamp/Utility/JsonSchemaGenerator.cs @@ -1,17 +1,18 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using OnRamp.Config; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; namespace OnRamp.Utility { /// - /// Represents a JsonSchema generator. + /// Represents a JsonSchema generator. /// /// See and . public static class JsonSchemaGenerator @@ -24,29 +25,29 @@ public static class JsonSchemaGenerator /// The title override. public static void Generate(string path, string? title = null) where T : ConfigBase, IRootConfig { - using var tw = File.CreateText(path ?? throw new ArgumentNullException(nameof(path))); - Generate(tw, title); + using var fs = File.Create(path ?? throw new ArgumentNullException(nameof(path))); + Generate(fs, title); } /// /// Generates a JsonSchema from the . /// /// The root to derive the schema from. - /// The . + /// The . /// The title override. - public static void Generate(TextWriter textWriter, string? title = null) where T : ConfigBase, IRootConfig + public static void Generate(Stream stream, string? title = null) where T : ConfigBase, IRootConfig { var type = typeof(T); var types = new List { type }; FindAllTypes(types, typeof(T)); - using var jtw = new JsonTextWriter(textWriter ?? throw new ArgumentNullException(nameof(textWriter))) { Formatting = Formatting.Indented }; + using var jtw = new Utf8JsonWriter(stream ?? throw new ArgumentNullException(nameof(stream)), new JsonWriterOptions { Indented = true }); jtw.WriteStartObject(); jtw.WritePropertyName("title"); - jtw.WriteValue(title ?? StringConverter.ToSentenceCase(type.Name)); + jtw.WriteStringValue(title ?? StringConverter.ToSentenceCase(type.Name)); jtw.WritePropertyName("$schema"); - jtw.WriteValue("https://json-schema.org/draft-04/schema#"); + jtw.WriteStringValue("https://json-schema.org/draft-04/schema#"); jtw.WritePropertyName("definitions"); jtw.WriteStartObject(); @@ -57,7 +58,7 @@ public static void Generate(TextWriter textWriter, string? title = null) wher jtw.WriteStartArray(); jtw.WriteStartObject(); jtw.WritePropertyName("$ref"); - jtw.WriteValue($"#/definitions/{type.GetCustomAttribute()?.Name}"); + jtw.WriteStringValue($"#/definitions/{type.GetCustomAttribute()?.Name}"); jtw.WriteEndObject(); jtw.WriteEndArray(); @@ -90,22 +91,19 @@ private static void FindAllTypes(List types, Type type) /// /// Writes the object definition. /// - private static void WriteDefinition(Type type, JsonTextWriter jtw) + private static void WriteDefinition(Type type, Utf8JsonWriter jtw) { - var csa = type.GetCustomAttribute(); - if (csa == null) - throw new InvalidOperationException($"Type {type.Name} does not have required ClassSchemaAttribute defined."); - + var csa = type.GetCustomAttribute() ?? throw new InvalidOperationException($"Type {type.Name} does not have required ClassSchemaAttribute defined."); jtw.WritePropertyName(csa.Name); jtw.WriteStartObject(); jtw.WritePropertyName("type"); - jtw.WriteValue("object"); + jtw.WriteStringValue("object"); jtw.WritePropertyName("title"); - jtw.WriteValue(CleanString(csa.Title) ?? StringConverter.ToSentenceCase(csa.Name)!); + jtw.WriteStringValue(CleanString(csa.Title) ?? StringConverter.ToSentenceCase(csa.Name)!); if (csa.Description != null) { jtw.WritePropertyName("description"); - jtw.WriteValue(CleanString(csa.Description)); + jtw.WriteStringValue(CleanString(csa.Description)); } jtw.WritePropertyName("properties"); @@ -115,11 +113,11 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) foreach (var pi in type.GetProperties()) { - var jpa = pi.GetCustomAttribute(); + var jpa = pi.GetCustomAttribute(); if (jpa == null) continue; - var name = jpa.PropertyName ?? StringConverter.ToCamelCase(pi.Name)!; + var name = jpa.Name ?? StringConverter.ToCamelCase(pi.Name)!; jtw.WritePropertyName(name); jtw.WriteStartObject(); @@ -127,13 +125,13 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) if (psa != null) { jtw.WritePropertyName("type"); - jtw.WriteValue(GetJsonType(pi)); + jtw.WriteStringValue(GetJsonType(pi)); jtw.WritePropertyName("title"); - jtw.WriteValue(CleanString(psa.Title) ?? StringConverter.ToSentenceCase(name)!); + jtw.WriteStringValue(CleanString(psa.Title) ?? StringConverter.ToSentenceCase(name)!); if (psa.Description != null) { jtw.WritePropertyName("description"); - jtw.WriteValue(CleanString(psa.Description)); + jtw.WriteStringValue(CleanString(psa.Description)); } if (psa.IsMandatory) @@ -145,25 +143,22 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) jtw.WriteStartArray(); foreach (var opt in psa.Options) - jtw.WriteValue(opt); + jtw.WriteStringValue(opt); jtw.WriteEndArray(); } } else { - var pcsa = pi.GetCustomAttribute(); - if (pcsa == null) - throw new InvalidOperationException($"Type '{type.Name}' Property '{pi.Name}' does not have a required PropertySchemaAttribute or PropertyCollectionSchemaAttribute."); - + var pcsa = pi.GetCustomAttribute() ?? throw new InvalidOperationException($"Type '{type.Name}' Property '{pi.Name}' does not have a required PropertySchemaAttribute or PropertyCollectionSchemaAttribute."); jtw.WritePropertyName("type"); - jtw.WriteValue("array"); + jtw.WriteStringValue("array"); jtw.WritePropertyName("title"); - jtw.WriteValue(CleanString(pcsa.Title) ?? StringConverter.ToSentenceCase(name)!); + jtw.WriteStringValue(CleanString(pcsa.Title) ?? StringConverter.ToSentenceCase(name)!); if (pcsa.Description != null) { jtw.WritePropertyName("description"); - jtw.WriteValue(CleanString(pcsa.Description)); + jtw.WriteStringValue(CleanString(pcsa.Description)); } jtw.WritePropertyName("items"); @@ -172,7 +167,7 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) { jtw.WriteStartObject(); jtw.WritePropertyName("type"); - jtw.WriteValue("string"); + jtw.WriteStringValue("string"); jtw.WriteEndObject(); } else @@ -181,7 +176,7 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) jtw.WriteStartObject(); jtw.WritePropertyName("$ref"); - jtw.WriteValue($"#/definitions/{t.GetCustomAttribute()!.Name}"); + jtw.WriteStringValue($"#/definitions/{t.GetCustomAttribute()!.Name}"); jtw.WriteEndObject(); } } @@ -197,7 +192,7 @@ private static void WriteDefinition(Type type, JsonTextWriter jtw) jtw.WriteStartArray(); foreach (var name in rqd) - jtw.WriteValue(name); + jtw.WriteStringValue(name); jtw.WriteEndArray(); } @@ -241,6 +236,6 @@ internal static Type GetItemType(Type type) /// /// Cleans the string. /// - private static string? CleanString(string? text) => text?.Replace('`', '\''); + private static string? CleanString(string? text) => text; } } \ No newline at end of file diff --git a/src/OnRamp/Utility/JsonSerializer.cs b/src/OnRamp/Utility/JsonSerializer.cs new file mode 100644 index 0000000..8c4b01e --- /dev/null +++ b/src/OnRamp/Utility/JsonSerializer.cs @@ -0,0 +1,76 @@ +using OnRamp.Config; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; + +namespace OnRamp.Utility +{ + /// + /// Provides customized JSON serialization. + /// + public static class JsonSerializer + { + /// + /// Provides the default including . + /// + public static JsonSerializerOptions Options { get; } = new JsonSerializerOptions(JsonSerializerOptions.Default) + { + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, + WriteIndented = false, + TypeInfoResolver = new OptInJsonTypeInfoResolver() + }; + + /// + /// Support opt-in properties only (explicit ) where the class is marked with ; otherwise, all properties are included as per default behavior. + /// + public class OptInJsonTypeInfoResolver : DefaultJsonTypeInfoResolver + { + /// + public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options) + { + var jti = base.GetTypeInfo(type, options); + if (jti.Kind == JsonTypeInfoKind.Object && jti.Type.GetCustomAttributes(typeof(CodeGenClassAttribute), true)?.Length > 0) + { + var props = new List(jti.Properties); + jti.Properties.Clear(); + + foreach (var prop in props) + { + if (prop.IsExtensionData || (prop.AttributeProvider is not null && prop.AttributeProvider.GetCustomAttributes(typeof(JsonPropertyNameAttribute), true)?.Length > 0)) + jti.Properties.Add(prop); + } + } + + return jti; + } + } + + /// + /// Deserializes the into the specified . + /// + /// The UTF8 JSON . + /// The . + /// The resulting deserialized value. + public static object? Deserialize(Stream json, Type type) => System.Text.Json.JsonSerializer.Deserialize(json, type, Options); + + /// + /// Deserializes the into the specified . + /// + /// The UTF8 JSON . + /// The . + /// The resulting deserialized value. + public static object? Deserialize(TextReader json, Type type) => System.Text.Json.JsonSerializer.Deserialize(json.ReadToEnd(), type, Options); + + /// + /// Deserializes the into the specified . + /// + /// The UTF8 JSON . + /// The . + /// The resulting deserialized value. + public static object? Deserialize(string json, Type type) => System.Text.Json.JsonSerializer.Deserialize(json, type, Options); + } +} \ No newline at end of file diff --git a/src/OnRamp/Utility/MarkdownDocumentationGenerator.cs b/src/OnRamp/Utility/MarkdownDocumentationGenerator.cs index 778665b..92c4e65 100644 --- a/src/OnRamp/Utility/MarkdownDocumentationGenerator.cs +++ b/src/OnRamp/Utility/MarkdownDocumentationGenerator.cs @@ -1,12 +1,12 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using OnRamp.Config; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Text.Json.Serialization; namespace OnRamp.Utility { @@ -49,7 +49,7 @@ private static void WriteObject(Type type, Func(); foreach (var pi in type.GetProperties()) { - var jpa = pi.GetCustomAttribute(); + var jpa = pi.GetCustomAttribute(); if (jpa == null) continue; @@ -57,7 +57,7 @@ private static void WriteObject(Type type, Func() }; diff --git a/src/OnRamp/Utility/StreamExtensions.cs b/src/OnRamp/Utility/StreamExtensions.cs index 8c88cf2..0df0530 100644 --- a/src/OnRamp/Utility/StreamExtensions.cs +++ b/src/OnRamp/Utility/StreamExtensions.cs @@ -1,8 +1,9 @@ // Copyright (c) Avanade. Licensed under the MIT License. See https://github.com/Avanade/OnRamp -using Newtonsoft.Json; using System; using System.IO; +using System.Linq; +using YamlDotNet.Core.Events; using YamlDotNet.Serialization; namespace OnRamp.Utility @@ -26,7 +27,7 @@ public static class TextReaderExtensions /// The JSON . /// The value . /// The corresponding value. - public static object? DeserializeJson(this TextReader json, Type type) => JsonSerializer.Create().Deserialize(json ?? throw new ArgumentNullException(nameof(json)), type); + public static object? DeserializeJson(this TextReader json, Type type) => JsonSerializer.Deserialize(json ?? throw new ArgumentNullException(nameof(json)), type); /// /// Create an instance of from the . @@ -44,7 +45,7 @@ public static class TextReaderExtensions /// The corresponding value. public static object? DeserializeYaml(this TextReader yaml, Type type) { - var yml = new DeserializerBuilder().Build().Deserialize(yaml); + var yml = new DeserializerBuilder().WithNodeTypeResolver(new YamlNodeTypeResolver()).Build().Deserialize(yaml); #pragma warning disable IDE0063 // Use simple 'using' statement; cannot as need to be more explicit with managing the close and dispose. using (var ms = new MemoryStream()) @@ -61,5 +62,35 @@ public static class TextReaderExtensions } #pragma warning restore IDE0063 } + + private class YamlNodeTypeResolver : INodeTypeResolver + { + private static readonly string[] boolValues = { "true", "false" }; + + /// + bool INodeTypeResolver.Resolve(NodeEvent? nodeEvent, ref Type currentType) + { + if (nodeEvent is Scalar scalar && scalar.Style == YamlDotNet.Core.ScalarStyle.Plain) + { + if (decimal.TryParse(scalar.Value, out _)) + { + if (scalar.Value.Length > 1 && scalar.Value.StartsWith('0')) // Valid JSON does not support a number that starts with a zero. + currentType = typeof(string); + else + currentType = typeof(decimal); + + return true; + } + + if (boolValues.Contains(scalar.Value)) + { + currentType = typeof(bool); + return true; + } + } + + return false; + } + } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/CodeGenConsoleTest.cs b/tests/OnRamp.Test/CodeGenConsoleTest.cs index f5ee543..2719da5 100644 --- a/tests/OnRamp.Test/CodeGenConsoleTest.cs +++ b/tests/OnRamp.Test/CodeGenConsoleTest.cs @@ -18,7 +18,7 @@ public async Task A100_HelpDefaultOptions() { var c = new CodeGenConsole(); var r = await c.RunAsync("--help"); - Assert.AreEqual(0, r); + Assert.That(r, Is.EqualTo(0)); } [Test] @@ -26,7 +26,7 @@ public async Task A110_HelpSupportedOptions() { var c = new CodeGenConsole(options: SupportedOptions.IsSimulation | SupportedOptions.ExpectNoChanges); var r = await c.RunAsync("--help"); - Assert.AreEqual(0, r); + Assert.That(r, Is.EqualTo(0)); } [Test] @@ -34,7 +34,7 @@ public async Task A120_InvalidOptionScript() { var c = new CodeGenConsole(); var r = await c.RunAsync("-s"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -42,7 +42,7 @@ public async Task A130_InvalidOptionConfig() { var c = new CodeGenConsole(); var r = await c.RunAsync("-c"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -50,7 +50,7 @@ public async Task A140_InvalidOptionDirectory() { var c = new CodeGenConsole(); var r = await c.RunAsync("-d ../../Bad"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -58,7 +58,7 @@ public async Task A150_InvalidOptionAssembly() { var c = new CodeGenConsole(); var r = await c.RunAsync("-a NotExists"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -66,7 +66,7 @@ public async Task A160_InvalidOptionConnectionString() { var c = new CodeGenConsole(); var r = await c.RunAsync("-db"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -74,7 +74,7 @@ public async Task A170_InvalidOptionScriptSupportedOptions() { var c = new CodeGenConsole(options: SupportedOptions.IsSimulation | SupportedOptions.ExpectNoChanges); var r = await c.RunAsync("-c ValidEntity.yaml"); - Assert.AreEqual(1, r); + Assert.That(r, Is.EqualTo(1)); } [Test] @@ -83,7 +83,7 @@ public async Task A200_CodeGenException() var a = CodeGeneratorArgs.Create("ValidEntity.yaml"); var c = new CodeGenConsole(a); var r = await c.RunAsync(); - Assert.AreEqual(2, r); + Assert.That(r, Is.EqualTo(2)); } [Test] @@ -95,22 +95,22 @@ public async Task A300_SuccessWithNoCmdLineArgs() var a = CodeGeneratorArgs.Create("ValidEntity.yaml", "Data/ValidEntity.yaml").AddParameter("Directory", "XA300").AddParameter("AppName", "Zzz"); var c = new CodeGenConsole(a); var r = await c.RunAsync(); - Assert.AreEqual(0, r); + Assert.That(r, Is.EqualTo(0)); - Assert.IsTrue(Directory.Exists("XA300")); - Assert.AreEqual(4, Directory.GetFiles("XA300").Length); + Assert.That(Directory.Exists("XA300"), Is.True); + Assert.That(Directory.GetFiles("XA300").Length, Is.EqualTo(4)); - Assert.IsTrue(File.Exists("XA300/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("XA300/Person.txt")); + Assert.That(File.Exists("XA300/Person.txt"), Is.True); + Assert.That(File.ReadAllText("XA300/Person.txt"), Is.EqualTo("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary")); - Assert.IsTrue(File.Exists("XA300/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("XA300/Name.txt")); + Assert.That(File.Exists("XA300/Name.txt"), Is.True); + Assert.That(File.ReadAllText("XA300/Name.txt"), Is.EqualTo("Name: Person.Name, Type: string")); - Assert.IsTrue(File.Exists("XA300/Age.txt")); - Assert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("XA300/Age.txt")); + Assert.That(File.Exists("XA300/Age.txt"), Is.True); + Assert.That(File.ReadAllText("XA300/Age.txt"), Is.EqualTo("Name: Person.Age, Type: int")); - Assert.IsTrue(File.Exists("XA300/Salary.txt")); - Assert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("XA300/Salary.txt")); + Assert.That(File.Exists("XA300/Salary.txt"), Is.True); + Assert.That(File.ReadAllText("XA300/Salary.txt"), Is.EqualTo("Name: Person.Salary, Type: decimal?")); } [Test] @@ -121,22 +121,22 @@ public async Task A310_SuccessWithCmdLineArgs() var c = new CodeGenConsole(); var r = await c.RunAsync("-s ValidEntity.yaml -c Data/ValidEntity.yaml -p Directory=XA310 -p AppName=Zzz -a \"OnRamp.Test, Version=1.2.3.0, Culture=neutral, PublicKeyToken=null\""); - Assert.AreEqual(0, r); + Assert.That(r, Is.EqualTo(0)); - Assert.IsTrue(Directory.Exists("XA310")); - Assert.AreEqual(4, Directory.GetFiles("XA310").Length); + Assert.That(Directory.Exists("XA310"), Is.True); + Assert.That(Directory.GetFiles("XA310").Length, Is.EqualTo(4)); - Assert.IsTrue(File.Exists("XA310/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("XA310/Person.txt")); + Assert.That(File.Exists("XA310/Person.txt"), Is.True); + Assert.That(File.ReadAllText("XA310/Person.txt"), Is.EqualTo("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary")); - Assert.IsTrue(File.Exists("XA310/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("XA310/Name.txt")); + Assert.That(File.Exists("XA310/Name.txt"), Is.True); + Assert.That(File.ReadAllText("XA310/Name.txt"), Is.EqualTo("Name: Person.Name, Type: string")); - Assert.IsTrue(File.Exists("XA310/Age.txt")); - Assert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("XA310/Age.txt")); + Assert.That(File.Exists("XA310/Age.txt"), Is.True); + Assert.That(File.ReadAllText("XA310/Age.txt"), Is.EqualTo("Name: Person.Age, Type: int")); - Assert.IsTrue(File.Exists("XA310/Salary.txt")); - Assert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("XA310/Salary.txt")); + Assert.That(File.Exists("XA310/Salary.txt"), Is.True); + Assert.That(File.ReadAllText("XA310/Salary.txt"), Is.EqualTo("Name: Person.Salary, Type: decimal?")); } [Test] @@ -148,33 +148,33 @@ public async Task A400_ErrorExpectNoChanges() // Run and it should fail as it cannot create. var c = new CodeGenConsole(); var r = await c.RunAsync("-s ValidEntity.yaml -c Data/ValidEntity.yaml -enc -p Directory=XA400 -p AppName=Zzz -a \"OnRamp.Test, Version=1.2.3.0, Culture=neutral, PublicKeyToken=null\""); - Assert.AreEqual(3, r); + Assert.That(r, Is.EqualTo(3)); // Run again and let it make changes. c = new CodeGenConsole(); r = await c.RunAsync("-s ValidEntity.yaml -c Data/ValidEntity.yaml -p Directory=XA400 -p AppName=Zzz -a \"OnRamp.Test, Version=1.2.3.0, Culture=neutral, PublicKeyToken=null\""); - Assert.AreEqual(0, r); + Assert.That(r, Is.EqualTo(0)); // Change the file and run again and it should fail as it cannot update. var files = Directory.GetFiles("XA400"); - Assert.AreNotEqual(0, files.Length); + Assert.That(files.Length, Is.Not.EqualTo(0)); var content = File.ReadAllText(files.Last()); File.WriteAllText(files.Last(), content + "X"); c = new CodeGenConsole(); r = await c.RunAsync("-s ValidEntity.yaml -c Data/ValidEntity.yaml -enc -p Directory=XA400 -p AppName=Zzz -a \"OnRamp.Test, Version=1.2.3.0, Culture=neutral, PublicKeyToken=null\""); - Assert.AreEqual(3, r); + Assert.That(r, Is.EqualTo(3)); } [Test] public void C100_GetBaseExeDirectory() { var ed = Environment.CurrentDirectory; - Assert.IsTrue(ed.Contains(Path.Combine("bin", "debug"), StringComparison.InvariantCultureIgnoreCase) || ed.Contains(Path.Combine("bin", "release"), StringComparison.InvariantCultureIgnoreCase)); + Assert.That(ed.Contains(Path.Combine("bin", "debug"), StringComparison.InvariantCultureIgnoreCase) || ed.Contains(Path.Combine("bin", "release"), StringComparison.InvariantCultureIgnoreCase), Is.True); ed = CodeGenConsole.GetBaseExeDirectory(); - Assert.IsFalse(ed.Contains(Path.Combine("bin", "debug"), StringComparison.InvariantCultureIgnoreCase) || ed.Contains(Path.Combine("bin", "release"), StringComparison.InvariantCultureIgnoreCase)); + Assert.That(ed.Contains(Path.Combine("bin", "debug"), StringComparison.InvariantCultureIgnoreCase) || ed.Contains(Path.Combine("bin", "release"), StringComparison.InvariantCultureIgnoreCase), Is.False); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/CodeGeneratorTest.cs b/tests/OnRamp.Test/CodeGeneratorTest.cs index 405873f..408c5e0 100644 --- a/tests/OnRamp.Test/CodeGeneratorTest.cs +++ b/tests/OnRamp.Test/CodeGeneratorTest.cs @@ -1,4 +1,5 @@ using NUnit.Framework; +using NUnit.Framework.Legacy; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -13,121 +14,121 @@ public class CodeGeneratorTest public void A100_Script_DoesNotExist() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("DoesNotExist.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'DoesNotExist.yaml' does not exist.", ex.Message); + ClassicAssert.AreEqual("Script 'DoesNotExist.yaml' does not exist.", ex.Message); } [Test] public void A110_Script_InvalidFileType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidFileType.xml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidFileType.xml' is invalid: Stream content type is not supported.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidFileType.xml' is invalid: Stream content type is not supported.", ex.Message); } [Test] public void A120_Script_InvalidYamlContent() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidYamlContent.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidYamlContent.yaml' is invalid: Error converting value \"\" to type 'OnRamp.Scripts.CodeGenScript'. Path '', line 1, position 15.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidYamlContent.yaml' is invalid: The JSON value could not be converted to OnRamp.Scripts.CodeGenScript. Path: $ | LineNumber: 0 | BytePositionInLine: 15.", ex.Message); } [Test] public void A130_Script_InvalidJsonContent() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidJsonContent.json").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidJsonContent.json' is invalid: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidJsonContent.json' is invalid: '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.", ex.Message); } [Test] public void A140_Script_InvalidEmpty() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidEmpty.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidEmpty.yaml' is invalid: Stream is empty.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidEmpty.yaml' is invalid: Stream is empty.", ex.Message); } [Test] public void A150_Script_InvalidEmptyConfigType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidEmptyConfigType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidEmptyConfigType.yaml' is invalid: [ConfigType] Value is mandatory.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidEmptyConfigType.yaml' is invalid: [ConfigType] Value is mandatory.", ex.Message); } [Test] public void A160_Script_InvalidConfigType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InvalidConfigType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InvalidConfigType.yaml' is invalid: [ConfigType] Type 'OnRamp.Scripts.CodeGenScriptItem' must inherit from ConfigRootBase.", ex.Message); + ClassicAssert.AreEqual("Script 'InvalidConfigType.yaml' is invalid: [ConfigType] Type 'OnRamp.Scripts.CodeGenScriptItem' must inherit from ConfigRootBase.", ex.Message); } [Test] public void B100_Generator_DoesNotExist() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("GeneratorDoesNotExist.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'GeneratorDoesNotExist.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.DoesNotExist, OnRamp.Test' does not exist.", ex.Message); + ClassicAssert.AreEqual("Script 'GeneratorDoesNotExist.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.DoesNotExist, OnRamp.Test' does not exist.", ex.Message); } [Test] public void B110_Generator_DiffConfigType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("GeneratorDiffConfigType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'GeneratorDiffConfigType.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.ScriptsGenerator, OnRamp.Test' RootType 'CodeGenScript' must be the same as the ConfigType 'EntityConfig'.", ex.Message); + ClassicAssert.AreEqual("Script 'GeneratorDiffConfigType.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.ScriptsGenerator, OnRamp.Test' RootType 'CodeGenScript' must be the same as the ConfigType 'EntityConfig'.", ex.Message); } [Test] public void B120_Generator_NotInherits() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("GeneratorNotInherits.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'GeneratorNotInherits.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.NotInheritsGenerator, OnRamp.Test' does not implement CodeGeneratorBase and/or have a default parameterless constructor.", ex.Message); + ClassicAssert.AreEqual("Script 'GeneratorNotInherits.yaml' is invalid: [Generate.Type] Type 'OnRamp.Test.Generators.NotInheritsGenerator, OnRamp.Test' does not implement CodeGeneratorBase and/or have a default parameterless constructor.", ex.Message); } [Test] public void B130_Generator_TemplateDoesNotExist() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("GeneratorTemplateDoesNotExist.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'GeneratorTemplateDoesNotExist.yaml' is invalid: [Generate.Template] Template 'DoesNotExist.hbs' does not exist.", ex.Message); + ClassicAssert.AreEqual("Script 'GeneratorTemplateDoesNotExist.yaml' is invalid: [Generate.Template] Template 'DoesNotExist.hbs' does not exist.", ex.Message); } [Test] public async Task B140_Generator_RuntimeParams() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("GeneratorRuntimeParams.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); - Assert.NotNull(cg); - Assert.NotNull(cg.Scripts?.Generators); - Assert.AreEqual(1, cg.Scripts.Generators.Count); - Assert.AreEqual(3, cg.Scripts.Generators[0].RuntimeParameters.Count); - Assert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("IsGenOnce")); - Assert.AreEqual(false, cg.Scripts.Generators[0].RuntimeParameters["IsGenOnce"]); - Assert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("Company")); - Assert.AreEqual("Xxx", cg.Scripts.Generators[0].RuntimeParameters["Company"]); - Assert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("AppName")); - Assert.AreEqual("Yyy", cg.Scripts.Generators[0].RuntimeParameters["AppName"]); + ClassicAssert.NotNull(cg); + ClassicAssert.NotNull(cg.Scripts?.Generators); + ClassicAssert.AreEqual(1, cg.Scripts.Generators.Count); + ClassicAssert.AreEqual(3, cg.Scripts.Generators[0].RuntimeParameters.Count); + ClassicAssert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("IsGenOnce")); + ClassicAssert.AreEqual(false, cg.Scripts.Generators[0].RuntimeParameters["IsGenOnce"]); + ClassicAssert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("Company")); + ClassicAssert.AreEqual("Xxx", cg.Scripts.Generators[0].RuntimeParameters["Company"]); + ClassicAssert.IsTrue(cg.Scripts.Generators[0].RuntimeParameters.ContainsKey("AppName")); + ClassicAssert.AreEqual("Yyy", cg.Scripts.Generators[0].RuntimeParameters["AppName"]); } [Test] public void C100_Inherits_DiffConfigType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("InheritsDiffConfigType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'InheritsDiffConfigType.yaml' is invalid: Script 'InheritsDiffConfigType2.yaml' is invalid: [ConfigType] Inherited ConfigType 'OnRamp.Test.Config.InheritAlternateConfigType, OnRamp.Test' must be the same as root ConfigType 'OnRamp.Scripts.CodeGenScript'.", ex.Message); + ClassicAssert.AreEqual("Script 'InheritsDiffConfigType.yaml' is invalid: Script 'InheritsDiffConfigType2.yaml' is invalid: [ConfigType] Inherited ConfigType 'OnRamp.Test.Config.InheritAlternateConfigType, OnRamp.Test' must be the same as root ConfigType 'OnRamp.Scripts.CodeGenScript'.", ex.Message); } [Test] public async Task C110_Inherits_SameConfigType() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("InheritsSameConfigType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); - Assert.NotNull(cg); + ClassicAssert.NotNull(cg); } [Test] public void D100_Editor_TypeNotFound() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("EditorTypeNotFound.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'EditorTypeNotFound.yaml' is invalid: [EditorType] Type 'OnRamp.Scripts.NotFound' does not exist.", ex.Message); + ClassicAssert.AreEqual("Script 'EditorTypeNotFound.yaml' is invalid: [EditorType] Type 'OnRamp.Scripts.NotFound' does not exist.", ex.Message); } [Test] public void D110_Editor_InvalidType() { var ex = Assert.ThrowsAsync(() => CodeGenerator.CreateAsync(new CodeGeneratorArgs("EditorInvalidType.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly))); - Assert.AreEqual("Script 'EditorInvalidType.yaml' is invalid: [EditorType] Type 'OnRamp.Scripts.CodeGenScript' does not implement IConfigEditor and/or have a default parameterless constructor.", ex.Message); + ClassicAssert.AreEqual("Script 'EditorInvalidType.yaml' is invalid: [EditorType] Type 'OnRamp.Scripts.CodeGenScript' does not implement IConfigEditor and/or have a default parameterless constructor.", ex.Message); } [Test] @@ -135,7 +136,7 @@ public async Task E100_Config_DoesNotExist() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("DoesNotExist.yaml")); - Assert.AreEqual("Config 'DoesNotExist.yaml' does not exist.", ex.Message); + ClassicAssert.AreEqual("Config 'DoesNotExist.yaml' does not exist.", ex.Message); } [Test] @@ -143,7 +144,7 @@ public async Task E110_Config_InvalidFileType() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("Data/InvalidFileType.xml")); - Assert.AreEqual("Config 'Data/InvalidFileType.xml' is invalid: Stream content type is not supported.", ex.Message); + ClassicAssert.AreEqual("Config 'Data/InvalidFileType.xml' is invalid: Stream content type is not supported.", ex.Message); } [Test] @@ -151,7 +152,7 @@ public async Task E120_Config_MandatoryValue() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("Data/MandatoryValue.yaml")); - Assert.AreEqual("Config 'Data/MandatoryValue.yaml' is invalid: [Property.Name] Value is mandatory.", ex.Message); + ClassicAssert.AreEqual("Config 'Data/MandatoryValue.yaml' is invalid: [Property.Name] Value is mandatory.", ex.Message); } [Test] @@ -159,7 +160,7 @@ public async Task E130_Config_InvalidOption() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity").AddAssembly(typeof(CodeGeneratorTest).Assembly)); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("Data/InvalidOption.yaml")); - Assert.AreEqual("Config 'Data/InvalidOption.yaml' is invalid: [Property(Name='Salary').Type] Value 'unknown' is invalid; valid values are: 'string', 'int', 'decimal'.", ex.Message); + ClassicAssert.AreEqual("Config 'Data/InvalidOption.yaml' is invalid: [Property(Name='Salary').Type] Value 'unknown' is invalid; valid values are: 'string', 'int', 'decimal'.", ex.Message); } [Test] @@ -167,7 +168,7 @@ public async Task E140_Config_NonUniqueValue() { var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly)); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("Data/NonUniqueValue.yaml")); - Assert.AreEqual("Config 'Data/NonUniqueValue.yaml' is invalid: [Property(Name='Amount').Name] Value 'Amount' is not unique.", ex.Message); + ClassicAssert.AreEqual("Config 'Data/NonUniqueValue.yaml' is invalid: [Property(Name='Amount').Name] Value 'Amount' is not unique.", ex.Message); } [Test] @@ -179,27 +180,27 @@ public async Task F100_Generate_CreateAll() var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly).AddParameter("Directory", "F100").AddParameter("AppName", "Zzz")); var stats = await cg .GenerateAsync("Data/ValidEntity.yaml"); - Assert.NotNull(stats); - Assert.AreEqual(4, stats.CreatedCount); - Assert.AreEqual(0, stats.UpdatedCount); - Assert.AreEqual(0, stats.NotChangedCount); - Assert.AreEqual(4, stats.LinesOfCodeCount); - Assert.NotNull(stats.ElapsedMilliseconds); + ClassicAssert.NotNull(stats); + ClassicAssert.AreEqual(4, stats.CreatedCount); + ClassicAssert.AreEqual(0, stats.UpdatedCount); + ClassicAssert.AreEqual(0, stats.NotChangedCount); + ClassicAssert.AreEqual(4, stats.LinesOfCodeCount); + ClassicAssert.NotNull(stats.ElapsedMilliseconds); - Assert.IsTrue(Directory.Exists("F100")); - Assert.AreEqual(4, Directory.GetFiles("F100").Length); + ClassicAssert.IsTrue(Directory.Exists("F100")); + ClassicAssert.AreEqual(4, Directory.GetFiles("F100").Length); - Assert.IsTrue(File.Exists("F100/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F100/Person.txt")); + ClassicAssert.IsTrue(File.Exists("F100/Person.txt")); + ClassicAssert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F100/Person.txt")); - Assert.IsTrue(File.Exists("F100/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F100/Name.txt")); + ClassicAssert.IsTrue(File.Exists("F100/Name.txt")); + ClassicAssert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F100/Name.txt")); - Assert.IsTrue(File.Exists("F100/Age.txt")); - Assert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F100/Age.txt")); + ClassicAssert.IsTrue(File.Exists("F100/Age.txt")); + ClassicAssert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F100/Age.txt")); - Assert.IsTrue(File.Exists("F100/Salary.txt")); - Assert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F100/Salary.txt")); + ClassicAssert.IsTrue(File.Exists("F100/Salary.txt")); + ClassicAssert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F100/Salary.txt")); } [Test] @@ -215,27 +216,27 @@ public async Task F110_Generate_Mix() var cg = await CodeGenerator.CreateAsync(CodeGeneratorArgs.Create("ValidEntity.yaml").AddParameter("Directory", "F110").AddParameter("AppName", "Zzz")); var stats = await cg .GenerateAsync("Data/ValidEntity.yaml"); - Assert.NotNull(stats); - Assert.AreEqual(2, stats.CreatedCount); - Assert.AreEqual(1, stats.UpdatedCount); - Assert.AreEqual(1, stats.NotChangedCount); - Assert.AreEqual(4, stats.LinesOfCodeCount); - Assert.NotNull(stats.ElapsedMilliseconds); + ClassicAssert.NotNull(stats); + ClassicAssert.AreEqual(2, stats.CreatedCount); + ClassicAssert.AreEqual(1, stats.UpdatedCount); + ClassicAssert.AreEqual(1, stats.NotChangedCount); + ClassicAssert.AreEqual(4, stats.LinesOfCodeCount); + ClassicAssert.NotNull(stats.ElapsedMilliseconds); - Assert.IsTrue(Directory.Exists("F110")); - Assert.AreEqual(4, Directory.GetFiles("F110").Length); + ClassicAssert.IsTrue(Directory.Exists("F110")); + ClassicAssert.AreEqual(4, Directory.GetFiles("F110").Length); - Assert.IsTrue(File.Exists("F110/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F110/Person.txt")); + ClassicAssert.IsTrue(File.Exists("F110/Person.txt")); + ClassicAssert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F110/Person.txt")); - Assert.IsTrue(File.Exists("F110/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F110/Name.txt")); + ClassicAssert.IsTrue(File.Exists("F110/Name.txt")); + ClassicAssert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F110/Name.txt")); - Assert.IsTrue(File.Exists("F110/Age.txt")); - Assert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F110/Age.txt")); + ClassicAssert.IsTrue(File.Exists("F110/Age.txt")); + ClassicAssert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F110/Age.txt")); - Assert.IsTrue(File.Exists("F110/Salary.txt")); - Assert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F110/Salary.txt")); + ClassicAssert.IsTrue(File.Exists("F110/Salary.txt")); + ClassicAssert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F110/Salary.txt")); } [Test] @@ -251,24 +252,24 @@ public async Task F120_Generate_Simulation() var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml") { IsSimulation = true }.AddAssembly(typeof(CodeGeneratorTest).Assembly).AddParameter("Directory", "F120").AddParameter("AppName", "Zzz")); var stats = await cg.GenerateAsync("Data/ValidEntity.yaml"); - Assert.NotNull(stats); - Assert.AreEqual(2, stats.CreatedCount); - Assert.AreEqual(1, stats.UpdatedCount); - Assert.AreEqual(1, stats.NotChangedCount); - Assert.AreEqual(4, stats.LinesOfCodeCount); - Assert.NotNull(stats.ElapsedMilliseconds); + ClassicAssert.NotNull(stats); + ClassicAssert.AreEqual(2, stats.CreatedCount); + ClassicAssert.AreEqual(1, stats.UpdatedCount); + ClassicAssert.AreEqual(1, stats.NotChangedCount); + ClassicAssert.AreEqual(4, stats.LinesOfCodeCount); + ClassicAssert.NotNull(stats.ElapsedMilliseconds); - Assert.IsTrue(Directory.Exists("F120")); - Assert.AreEqual(2, Directory.GetFiles("F120").Length); + ClassicAssert.IsTrue(Directory.Exists("F120")); + ClassicAssert.AreEqual(2, Directory.GetFiles("F120").Length); - Assert.IsTrue(File.Exists("F120/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F120/Person.txt")); + ClassicAssert.IsTrue(File.Exists("F120/Person.txt")); + ClassicAssert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F120/Person.txt")); - Assert.IsTrue(File.Exists("F120/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: xxx", File.ReadAllText("F120/Name.txt")); + ClassicAssert.IsTrue(File.Exists("F120/Name.txt")); + ClassicAssert.AreEqual("Name: Person.Name, Type: xxx", File.ReadAllText("F120/Name.txt")); - Assert.IsFalse(File.Exists("F120/Age.txt")); - Assert.IsFalse(File.Exists("F120/Salary.txt")); + ClassicAssert.IsFalse(File.Exists("F120/Age.txt")); + ClassicAssert.IsFalse(File.Exists("F120/Salary.txt")); } [Test] @@ -280,18 +281,18 @@ public async Task F130_Generate_WithConfigEditor() var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntityWithConfigEditor.yaml").AddAssembly(typeof(CodeGeneratorTest).Assembly).AddParameter("Directory", "F130")); var stats = await cg.GenerateAsync("Data/ValidEntity.yaml"); - Assert.NotNull(stats); - Assert.AreEqual(1, stats.CreatedCount); - Assert.AreEqual(0, stats.UpdatedCount); - Assert.AreEqual(0, stats.NotChangedCount); - Assert.AreEqual(1, stats.LinesOfCodeCount); - Assert.NotNull(stats.ElapsedMilliseconds); + ClassicAssert.NotNull(stats); + ClassicAssert.AreEqual(1, stats.CreatedCount); + ClassicAssert.AreEqual(0, stats.UpdatedCount); + ClassicAssert.AreEqual(0, stats.NotChangedCount); + ClassicAssert.AreEqual(1, stats.LinesOfCodeCount); + ClassicAssert.NotNull(stats.ElapsedMilliseconds); - Assert.IsTrue(Directory.Exists("F130")); - Assert.AreEqual(1, Directory.GetFiles("F130").Length); + ClassicAssert.IsTrue(Directory.Exists("F130")); + ClassicAssert.AreEqual(1, Directory.GetFiles("F130").Length); - Assert.IsTrue(File.Exists("F130/PERSON.txt")); - Assert.AreEqual("Name: PERSON, CompanyName: Xxx, AppName: Yyy, Properties: Name, Age, Salary", File.ReadAllText("F130/PERSON.txt")); + ClassicAssert.IsTrue(File.Exists("F130/PERSON.txt")); + ClassicAssert.AreEqual("Name: PERSON, CompanyName: Xxx, AppName: Yyy, Properties: Name, Age, Salary", File.ReadAllText("F130/PERSON.txt")); } [Test] @@ -302,7 +303,7 @@ public async Task F140_Generate_ExpectNoChanges_Error() var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml") { ExpectNoChanges = true }.AddAssembly(typeof(CodeGeneratorTest).Assembly).AddParameter("Directory", "F140")); var ex = Assert.ThrowsAsync(() => cg.GenerateAsync("Data/ValidEntity.yaml")); - Assert.IsTrue(ex.Message.EndsWith("Person.txt' would be created as a result of the code generation.")); + ClassicAssert.IsTrue(ex.Message.EndsWith("Person.txt' would be created as a result of the code generation.")); } [Test] @@ -320,24 +321,24 @@ public async Task F150_Generate_ExpectNoChanges_Success() var cg = await CodeGenerator.CreateAsync(new CodeGeneratorArgs("ValidEntity.yaml") { ExpectNoChanges = true }.AddAssembly(typeof(CodeGeneratorTest).Assembly).AddParameter("Directory", "F150").AddParameter("AppName", "Zzz")); var stats = await cg .GenerateAsync("Data/ValidEntity.yaml"); - Assert.NotNull(stats); - Assert.AreEqual(0, stats.CreatedCount); - Assert.AreEqual(0, stats.UpdatedCount); - Assert.AreEqual(4, stats.NotChangedCount); - Assert.AreEqual(4, stats.LinesOfCodeCount); - Assert.NotNull(stats.ElapsedMilliseconds); + ClassicAssert.NotNull(stats); + ClassicAssert.AreEqual(0, stats.CreatedCount); + ClassicAssert.AreEqual(0, stats.UpdatedCount); + ClassicAssert.AreEqual(4, stats.NotChangedCount); + ClassicAssert.AreEqual(4, stats.LinesOfCodeCount); + ClassicAssert.NotNull(stats.ElapsedMilliseconds); - Assert.IsTrue(File.Exists("F150/Person.txt")); - Assert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F150/Person.txt")); + ClassicAssert.IsTrue(File.Exists("F150/Person.txt")); + ClassicAssert.AreEqual("Name: Person, CompanyName: Xxx, AppName: Zzz, Properties: Name, Age, Salary", File.ReadAllText("F150/Person.txt")); - Assert.IsTrue(File.Exists("F150/Name.txt")); - Assert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F150/Name.txt")); + ClassicAssert.IsTrue(File.Exists("F150/Name.txt")); + ClassicAssert.AreEqual("Name: Person.Name, Type: string", File.ReadAllText("F150/Name.txt")); - Assert.IsTrue(File.Exists("F150/Age.txt")); - Assert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F150/Age.txt")); + ClassicAssert.IsTrue(File.Exists("F150/Age.txt")); + ClassicAssert.AreEqual("Name: Person.Age, Type: int", File.ReadAllText("F150/Age.txt")); - Assert.IsTrue(File.Exists("F150/Salary.txt")); - Assert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F150/Salary.txt")); + ClassicAssert.IsTrue(File.Exists("F150/Salary.txt")); + ClassicAssert.AreEqual("Name: Person.Salary, Type: decimal?", File.ReadAllText("F150/Salary.txt")); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/Config/EntityConfig.cs b/tests/OnRamp.Test/Config/EntityConfig.cs index 5d30ed5..d255284 100644 --- a/tests/OnRamp.Test/Config/EntityConfig.cs +++ b/tests/OnRamp.Test/Config/EntityConfig.cs @@ -1,23 +1,22 @@ using OnRamp.Config; -using Newtonsoft.Json; using System.Collections.Generic; +using System.Text.Json.Serialization; using System.Threading.Tasks; #nullable enable namespace OnRamp.Test.Config { - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [CodeGenClass("Entity", Title = "'Entity' object.", Description = "The `Entity` object.", Markdown = "This is a _sample_ markdown.", ExampleMarkdown = "This is an `example` markdown.")] [CodeGenCategory("Key", Title = "Provides the _Key_ configuration.")] [CodeGenCategory("Collection", Title = "Provides related child (hierarchical) configuration.")] public class EntityConfig : ConfigRootBase { - [JsonProperty("name")] + [JsonPropertyName("name")] [CodeGenProperty("Key", Title = "The entity name.", IsMandatory = true)] public string? Name { get; set; } - [JsonProperty("properties")] + [JsonPropertyName("properties")] [CodeGenPropertyCollection("Collection", Title = "The `Property` collection.", IsImportant = true)] public List? Properties { get; set; } diff --git a/tests/OnRamp.Test/Config/PropertyConfig.cs b/tests/OnRamp.Test/Config/PropertyConfig.cs index 14713a7..96a61e4 100644 --- a/tests/OnRamp.Test/Config/PropertyConfig.cs +++ b/tests/OnRamp.Test/Config/PropertyConfig.cs @@ -1,27 +1,26 @@ using OnRamp.Config; -using Newtonsoft.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; #nullable enable namespace OnRamp.Test.Config { - [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [CodeGenClass("Property", Title = "'Property' object.", Description = "The `Property` object.")] [CodeGenCategory("Key", Title = "Provides the _Key_ configuration.")] public class PropertyConfig : ConfigBase { public override string QualifiedKeyName => BuildQualifiedKeyName("Property", Name); - [JsonProperty("name")] + [JsonPropertyName("name")] [CodeGenProperty("Key", Title = "The property name.", IsMandatory = true, IsUnique = true)] public string? Name { get; set; } - [JsonProperty("type")] + [JsonPropertyName("type")] [CodeGenProperty("Key", Title = "The property type.", Description = "This is a more detailed description for the property type.", IsImportant = true, Options = new string[] { "string", "int", "decimal" })] public string? Type { get; set; } - [JsonProperty("isNullable")] + [JsonPropertyName("isNullable")] [CodeGenProperty("Key", Title = "Indicates whether the property is nullable.")] public bool? IsNullable { get; set; } diff --git a/tests/OnRamp.Test/ConfigBaseTest.cs b/tests/OnRamp.Test/ConfigBaseTest.cs index a720375..94e17f6 100644 --- a/tests/OnRamp.Test/ConfigBaseTest.cs +++ b/tests/OnRamp.Test/ConfigBaseTest.cs @@ -1,8 +1,8 @@ -using Newtonsoft.Json.Linq; -using NUnit.Framework; +using NUnit.Framework; using OnRamp.Config; using OnRamp.Test.Config; -using System.Collections.Generic; +using System.Linq; +using System.Text.Json; namespace OnRamp.Test { @@ -15,16 +15,16 @@ public void IsTrue() bool val1 = true; bool? val2 = true; - Assert.IsTrue(ConfigBase.IsTrue(val1)); - Assert.IsTrue(ConfigBase.IsTrue(val2)); + Assert.That(ConfigBase.IsTrue(val1), Is.True); + Assert.That(ConfigBase.IsTrue(val2), Is.True); val1 = false; val2 = false; - Assert.IsFalse(ConfigBase.IsTrue(val1)); - Assert.IsFalse(ConfigBase.IsTrue(val2)); + Assert.That(ConfigBase.IsTrue(val1), Is.False); + Assert.That(ConfigBase.IsTrue(val2), Is.False); val2 = null; - Assert.IsFalse(ConfigBase.IsTrue(val2)); + Assert.That(ConfigBase.IsTrue(val2), Is.False); } [Test] @@ -33,84 +33,89 @@ public void IsFalse() bool val1 = true; bool? val2 = true; - Assert.IsFalse(ConfigBase.IsFalse(val1)); - Assert.IsFalse(ConfigBase.IsFalse(val2)); + Assert.That(ConfigBase.IsFalse(val1), Is.False); + Assert.That(ConfigBase.IsFalse(val2), Is.False); val1 = false; val2 = false; - Assert.IsTrue(ConfigBase.IsFalse(val1)); - Assert.IsTrue(ConfigBase.IsFalse(val2)); + Assert.That(ConfigBase.IsFalse(val1), Is.True); + Assert.That(ConfigBase.IsFalse(val2), Is.True); val2 = null; - Assert.IsTrue(ConfigBase.IsFalse(val2)); + Assert.That(ConfigBase.IsFalse(val2), Is.True); } [Test] public void DefaultWhereNull_String() { - Assert.AreEqual("ABC", ConfigBase.DefaultWhereNull("ABC", () => "DEF")); - Assert.AreEqual("", ConfigBase.DefaultWhereNull("", () => "DEF")); - Assert.AreEqual("DEF", ConfigBase.DefaultWhereNull(null, () => "DEF")); + Assert.That(ConfigBase.DefaultWhereNull("ABC", () => "DEF"), Is.EqualTo("ABC")); + Assert.That(ConfigBase.DefaultWhereNull("", () => "DEF"), Is.EqualTo("")); + Assert.That(ConfigBase.DefaultWhereNull(null, () => "DEF"), Is.EqualTo("DEF")); } [Test] public void DefaultWhereNull_Bool() { - Assert.IsTrue(ConfigBase.DefaultWhereNull(true, () => false)); - Assert.IsFalse(ConfigBase.DefaultWhereNull(false, () => true)); - Assert.IsTrue(ConfigBase.DefaultWhereNull(null, () => true)); + Assert.That(ConfigBase.DefaultWhereNull(true, () => false), Is.True); + Assert.That(ConfigBase.DefaultWhereNull(false, () => true), Is.False); + Assert.That(ConfigBase.DefaultWhereNull(null, () => true), Is.True); } [Test] public void CompareValue_String() { - Assert.IsTrue(ConfigBase.CompareValue("ABC", "ABC")); - Assert.IsFalse(ConfigBase.CompareValue("ABC", "DEF")); - Assert.IsFalse(ConfigBase.CompareValue(null, "DEF")); + Assert.That(ConfigBase.CompareValue("ABC", "ABC"), Is.True); + Assert.That(ConfigBase.CompareValue("ABC", "DEF"), Is.False); + Assert.That(ConfigBase.CompareValue(null, "DEF"), Is.False); } [Test] public void CompareValue_Bool() { - Assert.IsTrue(ConfigBase.CompareValue(true, true)); - Assert.IsFalse(ConfigBase.CompareValue(true, false)); - Assert.IsFalse(ConfigBase.CompareValue(null, true)); + Assert.That(ConfigBase.CompareValue(true, true), Is.True); + Assert.That(ConfigBase.CompareValue(true, false), Is.False); + Assert.That(ConfigBase.CompareValue(null, true), Is.False); } [Test] public void CompareNullOrValue_String() { - Assert.IsTrue(ConfigBase.CompareNullOrValue("ABC", "ABC")); - Assert.IsFalse(ConfigBase.CompareNullOrValue("ABC", "DEF")); - Assert.IsTrue(ConfigBase.CompareNullOrValue(null, "DEF")); + Assert.That(ConfigBase.CompareNullOrValue("ABC", "ABC"), Is.True); + Assert.That(ConfigBase.CompareNullOrValue("ABC", "DEF"), Is.False); + Assert.That(ConfigBase.CompareNullOrValue(null, "DEF"), Is.True); } [Test] public void CompareNullOrValue_Bool() { - Assert.IsTrue(ConfigBase.CompareNullOrValue(true, true)); - Assert.IsFalse(ConfigBase.CompareNullOrValue(true, false)); - Assert.IsTrue(ConfigBase.CompareNullOrValue(null, true)); + Assert.That(ConfigBase.CompareNullOrValue(true, true), Is.True); + Assert.That(ConfigBase.CompareNullOrValue(true, false), Is.False); + Assert.That(ConfigBase.CompareNullOrValue(null, true), Is.True); } [Test] public void ExtraProperties() { - var ec = new EntityConfig { ExtraProperties = new Dictionary { { "XXX", new JValue("AAA") } } }; + var ec = (EntityConfig)Utility.JsonSerializer.Deserialize("{ \"name\": \"Bob\", \"XXX\": \"AAA\", \"YYY\": { \"BBB\": \"CCC\" } }", typeof(EntityConfig)); - JValue jv = ec.GetExtraProperty("XXX"); - Assert.AreEqual("AAA", jv.ToObject(typeof(string))); + Assert.That(ec.ExtraProperties.Count, Is.EqualTo(2)); + Assert.That(ec.GetExtraProperty("XXX"), Is.EqualTo("AAA")); + Assert.That(ec.GetExtraProperty("JJJ", "CCC"), Is.EqualTo("CCC")); - jv = ec.GetExtraProperty("YYY", new JValue("BBB")); - Assert.AreEqual("BBB", jv.ToObject(typeof(string))); + Assert.That(ec.TryGetExtraProperty("XXX", out var val), Is.True); + Assert.That(val, Is.EqualTo("AAA")); - Assert.IsNull(ec.GetExtraProperty("YYY")); + Assert.That(ec.TryGetExtraProperty("JJJ", out val), Is.False); + Assert.That(val, Is.Null); - Assert.IsTrue(ec.TryGetExtraProperty("XXX", out jv)); - Assert.AreEqual("AAA", jv.ToObject(typeof(string))); + Assert.That(ec.TryGetExtraProperty("YYY", out var bval), Is.True); + Assert.That(bval, Is.Not.Null); + Assert.That(bval.BBB, Is.EqualTo("CCC")); + } - Assert.IsFalse(ec.TryGetExtraProperty("YYY", out jv)); - Assert.IsNull(jv); + private class YYY + { + public string BBB { get; set; } } [Test] @@ -120,18 +125,18 @@ public void CustomProperties() ec.CustomProperties.Add("XXX", "AAA"); string sv = ec.GetCustomProperty("XXX"); - Assert.AreEqual("AAA", sv); + Assert.That(sv, Is.EqualTo("AAA")); sv = ec.GetCustomProperty("YYY", "BBB"); - Assert.AreEqual("BBB", sv); + Assert.That(sv, Is.EqualTo("BBB")); - Assert.IsNull(ec.GetCustomProperty("YYY")); + Assert.That(ec.GetCustomProperty("YYY"), Is.Null); - Assert.IsTrue(ec.TryGetCustomProperty("XXX", out sv)); - Assert.AreEqual("AAA", sv); + Assert.That(ec.TryGetCustomProperty("XXX", out sv), Is.True); + Assert.That(sv, Is.EqualTo("AAA")); - Assert.IsFalse(ec.TryGetCustomProperty("YYY", out sv)); - Assert.IsNull(sv); + Assert.That(ec.TryGetCustomProperty("YYY", out sv), Is.False); + Assert.That(sv, Is.Null); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/ConfigRootBaseTest.cs b/tests/OnRamp.Test/ConfigRootBaseTest.cs index 351de6e..9fd6512 100644 --- a/tests/OnRamp.Test/ConfigRootBaseTest.cs +++ b/tests/OnRamp.Test/ConfigRootBaseTest.cs @@ -1,4 +1,5 @@ using NUnit.Framework; +using NUnit.Framework.Legacy; using OnRamp.Test.Config; using System; using System.Collections.Generic; @@ -15,29 +16,29 @@ public void RuntimeParameters() var ec = new EntityConfig(); ec.RuntimeParameters.Add("XXX", "123"); - Assert.AreEqual("123", ec.GetRuntimeParameter("XXX", "456")); - Assert.AreEqual(123, ec.GetRuntimeParameter("XXX", 456)); - Assert.AreEqual("456", ec.GetRuntimeParameter("YYY", "456")); - Assert.AreEqual(456, ec.GetRuntimeParameter("YYY", 456)); + ClassicAssert.AreEqual("123", ec.GetRuntimeParameter("XXX", "456")); + ClassicAssert.AreEqual(123, ec.GetRuntimeParameter("XXX", 456)); + ClassicAssert.AreEqual("456", ec.GetRuntimeParameter("YYY", "456")); + ClassicAssert.AreEqual(456, ec.GetRuntimeParameter("YYY", 456)); - Assert.IsTrue(ec.TryGetRuntimeParameter("XXX", out string sv)); - Assert.AreEqual("123", sv); + ClassicAssert.IsTrue(ec.TryGetRuntimeParameter("XXX", out string sv)); + ClassicAssert.AreEqual("123", sv); - Assert.IsFalse(ec.TryGetRuntimeParameter("YYY", out sv)); - Assert.IsNull(sv); + ClassicAssert.IsFalse(ec.TryGetRuntimeParameter("YYY", out sv)); + ClassicAssert.IsNull(sv); - Assert.IsTrue(ec.TryGetRuntimeParameter("XXX", out int iv)); - Assert.AreEqual(123, iv); + ClassicAssert.IsTrue(ec.TryGetRuntimeParameter("XXX", out int iv)); + ClassicAssert.AreEqual(123, iv); - Assert.IsFalse(ec.TryGetRuntimeParameter("YYY", out iv)); - Assert.AreEqual(0, iv); + ClassicAssert.IsFalse(ec.TryGetRuntimeParameter("YYY", out iv)); + ClassicAssert.AreEqual(0, iv); - Assert.IsFalse(ec.TryGetRuntimeParameter("YYY", out int? nv)); - Assert.IsNull(nv); + ClassicAssert.IsFalse(ec.TryGetRuntimeParameter("YYY", out int? nv)); + ClassicAssert.IsNull(nv); ec.ResetRuntimeParameters(); - Assert.AreEqual(0, ec.RuntimeParameters.Count); - Assert.AreEqual("456", ec.GetRuntimeParameter("XXX", "456")); + ClassicAssert.AreEqual(0, ec.RuntimeParameters.Count); + ClassicAssert.AreEqual("456", ec.GetRuntimeParameter("XXX", "456")); } [Test] @@ -54,10 +55,10 @@ public void MergeRuntimeParameters() ec.RuntimeParameters.Add("ZZZ", "ABC"); ec.MergeRuntimeParameters(rp); - Assert.AreEqual(3, ec.RuntimeParameters.Count); - Assert.AreEqual("456", ec.GetRuntimeParameter("XXX")); - Assert.AreEqual("789", ec.GetRuntimeParameter("YYY")); - Assert.AreEqual("ABC", ec.GetRuntimeParameter("ZZZ")); + ClassicAssert.AreEqual(3, ec.RuntimeParameters.Count); + ClassicAssert.AreEqual("456", ec.GetRuntimeParameter("XXX")); + ClassicAssert.AreEqual("789", ec.GetRuntimeParameter("YYY")); + ClassicAssert.AreEqual("ABC", ec.GetRuntimeParameter("ZZZ")); } [Test] @@ -67,8 +68,8 @@ public void DateTimeNow() var ec = new EntityConfig(); var dtn = ec.DateTimeNow; - Assert.IsTrue(dtn > now); - Assert.AreEqual(DateTimeKind.Local, dtn.Kind); + ClassicAssert.IsTrue(dtn > now); + ClassicAssert.AreEqual(DateTimeKind.Local, dtn.Kind); } [Test] @@ -78,15 +79,15 @@ public void DateTimeUtcNow() var ec = new EntityConfig(); var dtn = ec.DateTimeUtcNow; - Assert.IsTrue(dtn > now); - Assert.AreEqual(DateTimeKind.Utc, dtn.Kind); + ClassicAssert.IsTrue(dtn > now); + ClassicAssert.AreEqual(DateTimeKind.Utc, dtn.Kind); } [Test] public void NewGuid() { var ec = new EntityConfig(); - Assert.AreNotEqual(ec.NewGuid, ec.NewGuid); + ClassicAssert.AreNotEqual(ec.NewGuid, ec.NewGuid); } [Test] @@ -94,9 +95,9 @@ public void SelectGenResult() { var ec = new EntityConfig(); var r = ec.SelectGenResult; - Assert.IsNotNull(r); - Assert.AreEqual(1, r.Count()); - Assert.AreSame(ec, r.First()); + ClassicAssert.IsNotNull(r); + ClassicAssert.AreEqual(1, r.Count()); + ClassicAssert.AreSame(ec, r.First()); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/Expected/Schema.json b/tests/OnRamp.Test/Expected/Schema.json index 3e756eb..139a842 100644 --- a/tests/OnRamp.Test/Expected/Schema.json +++ b/tests/OnRamp.Test/Expected/Schema.json @@ -4,8 +4,8 @@ "definitions": { "Entity": { "type": "object", - "title": "'Entity' object.", - "description": "The 'Entity' object.", + "title": "\u0027Entity\u0027 object.", + "description": "The \u0060Entity\u0060 object.", "properties": { "name": { "type": "string", @@ -13,7 +13,7 @@ }, "properties": { "type": "array", - "title": "The 'Property' collection.", + "title": "The \u0060Property\u0060 collection.", "items": { "$ref": "#/definitions/Property" } @@ -25,8 +25,8 @@ }, "Property": { "type": "object", - "title": "'Property' object.", - "description": "The 'Property' object.", + "title": "\u0027Property\u0027 object.", + "description": "The \u0060Property\u0060 object.", "properties": { "name": { "type": "string", diff --git a/tests/OnRamp.Test/HandlebarsHelpersTest.cs b/tests/OnRamp.Test/HandlebarsHelpersTest.cs index a7f29c1..6427be9 100644 --- a/tests/OnRamp.Test/HandlebarsHelpersTest.cs +++ b/tests/OnRamp.Test/HandlebarsHelpersTest.cs @@ -1,4 +1,5 @@ using NUnit.Framework; +using NUnit.Framework.Legacy; using OnRamp.Utility; using System; @@ -11,195 +12,195 @@ public class HandlebarsHelpersTest public void IfEq() { var g = new HandlebarsCodeGenerator("{{#ifeq Name 'Bob'}}Hi Fella.{{else}}Hi {{Name}}.{{/ifeq}}"); - Assert.AreEqual("Hi Fella.", g.Generate(new { Name = "Bob" })); - Assert.AreEqual("Hi Mary.", g.Generate(new { Name = "Mary" })); + ClassicAssert.AreEqual("Hi Fella.", g.Generate(new { Name = "Bob" })); + ClassicAssert.AreEqual("Hi Mary.", g.Generate(new { Name = "Mary" })); } [Test] public void IfNe() { var g = new HandlebarsCodeGenerator("{{#ifne Name 'Bob' 'Gary'}}Hi {{Name}}.{{else}}Hi Fella.{{/ifne}}"); - Assert.AreEqual("Hi Fella.", g.Generate(new { Name = "Bob" })); - Assert.AreEqual("Hi Fella.", g.Generate(new { Name = "Gary" })); - Assert.AreEqual("Hi Mary.", g.Generate(new { Name = "Mary" })); + ClassicAssert.AreEqual("Hi Fella.", g.Generate(new { Name = "Bob" })); + ClassicAssert.AreEqual("Hi Fella.", g.Generate(new { Name = "Gary" })); + ClassicAssert.AreEqual("Hi Mary.", g.Generate(new { Name = "Mary" })); } [Test] public void IfLe() { var g = new HandlebarsCodeGenerator("{{#ifle Amount -1}}Negative{{else}}Positive{{/ifle}}"); - Assert.AreEqual("Positive", g.Generate(new { Amount = 1 })); - Assert.AreEqual("Positive", g.Generate(new { Amount = 0 })); - Assert.AreEqual("Negative", g.Generate(new { Amount = -1 })); - Assert.AreEqual("Negative", g.Generate(new { Amount = -2 })); + ClassicAssert.AreEqual("Positive", g.Generate(new { Amount = 1 })); + ClassicAssert.AreEqual("Positive", g.Generate(new { Amount = 0 })); + ClassicAssert.AreEqual("Negative", g.Generate(new { Amount = -1 })); + ClassicAssert.AreEqual("Negative", g.Generate(new { Amount = -2 })); } [Test] public void IfGe() { var g = new HandlebarsCodeGenerator("{{#ifge Amount 0}}Positive{{else}}Negative{{/ifge}}"); - Assert.AreEqual("Positive", g.Generate(new { Amount = 1 })); - Assert.AreEqual("Positive", g.Generate(new { Amount = 0 })); - Assert.AreEqual("Negative", g.Generate(new { Amount = -1 })); - Assert.AreEqual("Negative", g.Generate(new { Amount = -2 })); + ClassicAssert.AreEqual("Positive", g.Generate(new { Amount = 1 })); + ClassicAssert.AreEqual("Positive", g.Generate(new { Amount = 0 })); + ClassicAssert.AreEqual("Negative", g.Generate(new { Amount = -1 })); + ClassicAssert.AreEqual("Negative", g.Generate(new { Amount = -2 })); } [Test] public void IfVal() { var g = new HandlebarsCodeGenerator("{{#ifval First Last}}true{{else}}false{{/ifval}}"); - Assert.AreEqual("false", g.Generate(new { First = (string)null, Last = (string)null })); - Assert.AreEqual("false", g.Generate(new { First = "Jane", Last = (string)null })); - Assert.AreEqual("false", g.Generate(new { First = (string)null, Last = "Doe" })); - Assert.AreEqual("true", g.Generate(new { First = "Jane", Last = "Doe" })); + ClassicAssert.AreEqual("false", g.Generate(new { First = (string)null, Last = (string)null })); + ClassicAssert.AreEqual("false", g.Generate(new { First = "Jane", Last = (string)null })); + ClassicAssert.AreEqual("false", g.Generate(new { First = (string)null, Last = "Doe" })); + ClassicAssert.AreEqual("true", g.Generate(new { First = "Jane", Last = "Doe" })); } [Test] public void IfNull() { var g = new HandlebarsCodeGenerator("{{#ifnull First Last}}true{{else}}false{{/ifnull}}"); - Assert.AreEqual("true", g.Generate(new { First = (string)null, Last = (string)null })); - Assert.AreEqual("false", g.Generate(new { First = "Jane", Last = (string)null })); - Assert.AreEqual("false", g.Generate(new { First = (string)null, Last = "Doe" })); - Assert.AreEqual("false", g.Generate(new { First = "Jane", Last = "Doe" })); + ClassicAssert.AreEqual("true", g.Generate(new { First = (string)null, Last = (string)null })); + ClassicAssert.AreEqual("false", g.Generate(new { First = "Jane", Last = (string)null })); + ClassicAssert.AreEqual("false", g.Generate(new { First = (string)null, Last = "Doe" })); + ClassicAssert.AreEqual("false", g.Generate(new { First = "Jane", Last = "Doe" })); } [Test] public void IfOr() { var g = new HandlebarsCodeGenerator("{{#ifor Val1 Val2}}true{{else}}false{{/ifor}}"); - Assert.AreEqual("false", g.Generate(new { Val1 = false, Val2 = false })); - Assert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = false })); - Assert.AreEqual("true", g.Generate(new { Val1 = false, Val2 = true })); - Assert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = true })); - - Assert.AreEqual("false", g.Generate(new { Val1 = false, Val2 = (string)null })); - Assert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = (string)null })); - Assert.AreEqual("true", g.Generate(new { Val1 = false, Val2 = "X" })); - Assert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = "X" })); + ClassicAssert.AreEqual("false", g.Generate(new { Val1 = false, Val2 = false })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = false })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = false, Val2 = true })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = true })); + + ClassicAssert.AreEqual("false", g.Generate(new { Val1 = false, Val2 = (string)null })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = (string)null })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = false, Val2 = "X" })); + ClassicAssert.AreEqual("true", g.Generate(new { Val1 = true, Val2 = "X" })); } [Test] public void Lower() { var g = new HandlebarsCodeGenerator("{{lower Name}}"); - Assert.AreEqual("etag", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("etag", g.Generate(new { Name = "ETag" })); } [Test] public void Upper() { var g = new HandlebarsCodeGenerator("{{upper Name}}"); - Assert.AreEqual("ETAG", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("ETAG", g.Generate(new { Name = "ETag" })); } [Test] public void Camel() { var g = new HandlebarsCodeGenerator("{{camel Name}}"); - Assert.AreEqual("etag", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("etag", g.Generate(new { Name = "ETag" })); g = new HandlebarsCodeGenerator("{{camelx Name}}"); - Assert.AreEqual("eTag", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("eTag", g.Generate(new { Name = "ETag" })); } [Test] public void Pascal() { var g = new HandlebarsCodeGenerator("{{pascal Name}}"); - Assert.AreEqual("ETag", g.Generate(new { Name = "etag" })); + ClassicAssert.AreEqual("ETag", g.Generate(new { Name = "etag" })); g = new HandlebarsCodeGenerator("{{pascalx Name}}"); - Assert.AreEqual("Etag", g.Generate(new { Name = "etag" })); + ClassicAssert.AreEqual("Etag", g.Generate(new { Name = "etag" })); } [Test] public void Private() { var g = new HandlebarsCodeGenerator("{{private Name}}"); - Assert.AreEqual("_etag", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("_etag", g.Generate(new { Name = "ETag" })); g = new HandlebarsCodeGenerator("{{privatex Name}}"); - Assert.AreEqual("_eTag", g.Generate(new { Name = "ETag" })); + ClassicAssert.AreEqual("_eTag", g.Generate(new { Name = "ETag" })); } [Test] public void Sentence() { var g = new HandlebarsCodeGenerator("{{sentence Name}}"); - Assert.AreEqual("ETag Name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("ETag Name", g.Generate(new { Name = "ETagName" })); g = new HandlebarsCodeGenerator("{{sentencex Name}}"); - Assert.AreEqual("E Tag Name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("E Tag Name", g.Generate(new { Name = "ETagName" })); } [Test] public void Snake() { var g = new HandlebarsCodeGenerator("{{snake Name}}"); - Assert.AreEqual("etag_name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("etag_name", g.Generate(new { Name = "ETagName" })); g = new HandlebarsCodeGenerator("{{snakex Name}}"); - Assert.AreEqual("e_tag_name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("e_tag_name", g.Generate(new { Name = "ETagName" })); } [Test] public void Kebab() { var g = new HandlebarsCodeGenerator("{{kebab Name}}"); - Assert.AreEqual("etag-name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("etag-name", g.Generate(new { Name = "ETagName" })); g = new HandlebarsCodeGenerator("{{kebabx Name}}"); - Assert.AreEqual("e-tag-name", g.Generate(new { Name = "ETagName" })); + ClassicAssert.AreEqual("e-tag-name", g.Generate(new { Name = "ETagName" })); } [Test] public void PastTense() { var g = new HandlebarsCodeGenerator("{{past-tense Name}}"); - Assert.AreEqual("Ordered", g.Generate(new { Name = "Order" })); + ClassicAssert.AreEqual("Ordered", g.Generate(new { Name = "Order" })); } [Test] public void Pluralize() { var g = new HandlebarsCodeGenerator("{{pluralize Name}}"); - Assert.AreEqual("Orders", g.Generate(new { Name = "Order" })); + ClassicAssert.AreEqual("Orders", g.Generate(new { Name = "Order" })); } [Test] public void Singularize() { var g = new HandlebarsCodeGenerator("{{singularize Name}}"); - Assert.AreEqual("Order", g.Generate(new { Name = "Orders" })); + ClassicAssert.AreEqual("Order", g.Generate(new { Name = "Orders" })); } [Test] public void SeeComments() { var g = new HandlebarsCodeGenerator("{{see-comments Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "string" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "string" })); } [Test] public void Indent() { var g = new HandlebarsCodeGenerator("{{indent 4}}{{Name}}"); - Assert.AreEqual(" Bob", g.Generate(new { Name = "Bob" })); + ClassicAssert.AreEqual(" Bob", g.Generate(new { Name = "Bob" })); } [Test] public void Add() { var g = new HandlebarsCodeGenerator("{{add 4 '10' Count}}"); - Assert.AreEqual("12", g.Generate(new { Count = -2 })); + ClassicAssert.AreEqual("12", g.Generate(new { Count = -2 })); } [Test] public void Add_Index() { var g = new HandlebarsCodeGenerator("{{#each .}}{{.}}{{add @index 1}}{{/each}}"); - Assert.AreEqual("a1b2", g.Generate(new System.Collections.Generic.List { "a", "b" })); + ClassicAssert.AreEqual("a1b2", g.Generate(new System.Collections.Generic.List { "a", "b" })); } public class SetData { public int Count { get; set; } internal bool Check { get; set; } public decimal Sum { get; set; } } @@ -209,12 +210,12 @@ public void SetValue() { var sd = new SetData(); var g = new HandlebarsCodeGenerator("{{set-value 'Count' 88}}"); - Assert.AreEqual("", g.Generate(sd)); - Assert.AreEqual(88, sd.Count); + ClassicAssert.AreEqual("", g.Generate(sd)); + ClassicAssert.AreEqual(88, sd.Count); g = new HandlebarsCodeGenerator("xx{{set-value 'Check' true}}yy"); - Assert.AreEqual("xxyy", g.Generate(sd)); - Assert.AreEqual(true, sd.Check); + ClassicAssert.AreEqual("xxyy", g.Generate(sd)); + ClassicAssert.AreEqual(true, sd.Check); } [Test] @@ -222,12 +223,12 @@ public void AddValue() { var sd = new SetData(); var g = new HandlebarsCodeGenerator("{{add-value 'Sum'}}"); - Assert.AreEqual("", g.Generate(sd)); - Assert.AreEqual(1, sd.Sum); + ClassicAssert.AreEqual("", g.Generate(sd)); + ClassicAssert.AreEqual(1, sd.Sum); g = new HandlebarsCodeGenerator("{{add-value 'Sum' 3 -3.5 '8.4'}}"); - Assert.AreEqual("", g.Generate(sd)); - Assert.AreEqual(8.9m, sd.Sum); + ClassicAssert.AreEqual("", g.Generate(sd)); + ClassicAssert.AreEqual(8.9m, sd.Sum); } [Test] @@ -235,42 +236,42 @@ public void Format() { var dt = new DateTime(2021, 10, 26, 08, 55, 16); var g = new HandlebarsCodeGenerator("Date is {{format '{0:yyyy-MM-dd HH:mm:ss}' Date}}."); - Assert.AreEqual($"Date is {dt:yyyy-MM-dd HH:mm:ss}.", g.Generate(new { Date = dt })); + ClassicAssert.AreEqual($"Date is {dt:yyyy-MM-dd HH:mm:ss}.", g.Generate(new { Date = dt })); } [Test] public void Debug() { var g = new HandlebarsCodeGenerator("{{debug 'Name: {0}.' Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "Nancy" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "Nancy" })); } [Test] public void LogInfo() { var g = new HandlebarsCodeGenerator("{{log-info 'Name: {0}.' Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "Bob" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "Bob" })); } [Test] public void LogWarning() { var g = new HandlebarsCodeGenerator("{{log-warning 'Name: {0}.' Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "Jane" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "Jane" })); } [Test] public void LogError() { var g = new HandlebarsCodeGenerator("{{log-error 'Name: {0}.' Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "Bruce" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "Bruce" })); } [Test] public void LogDebug() { var g = new HandlebarsCodeGenerator("{{log-debug 'Name: {0}.' Name}}"); - Assert.AreEqual("", g.Generate(new { Name = "Grace" })); + ClassicAssert.AreEqual("", g.Generate(new { Name = "Grace" })); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/JsonSchemaGeneratorTest.cs b/tests/OnRamp.Test/JsonSchemaGeneratorTest.cs index cc79511..c4ed552 100644 --- a/tests/OnRamp.Test/JsonSchemaGeneratorTest.cs +++ b/tests/OnRamp.Test/JsonSchemaGeneratorTest.cs @@ -19,8 +19,8 @@ public void Generate() JsonSchemaGenerator.Generate(fn, "Entity Configuration"); - Assert.IsTrue(File.Exists(fn)); - Assert.AreEqual(File.ReadAllText(Path.Combine("Expected", "Schema.json")), File.ReadAllText(fn)); + Assert.That(File.Exists(fn), Is.True); + Assert.That(File.ReadAllText(fn), Is.EqualTo(File.ReadAllText(Path.Combine("Expected", "Schema.json")))); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/MarkdownDocumentationGeneratorTest.cs b/tests/OnRamp.Test/MarkdownDocumentationGeneratorTest.cs index 900812f..c9f5755 100644 --- a/tests/OnRamp.Test/MarkdownDocumentationGeneratorTest.cs +++ b/tests/OnRamp.Test/MarkdownDocumentationGeneratorTest.cs @@ -18,12 +18,12 @@ public void Generate() MarkdownDocumentationGenerator.Generate(directory: "MSG", addBreaksBetweenSections: true); var fn = Path.Combine("MSG", "Entity.md"); - Assert.IsTrue(File.Exists(fn)); - Assert.AreEqual(File.ReadAllText(Path.Combine("Expected", "Entity.md")), File.ReadAllText(fn)); + Assert.That(File.Exists(fn), Is.True); + Assert.That(File.ReadAllText(fn), Is.EqualTo(File.ReadAllText(Path.Combine("Expected", "Entity.md")))); fn = Path.Combine("MSG", "Property.md"); - Assert.IsTrue(File.Exists(fn)); - Assert.AreEqual(File.ReadAllText(Path.Combine("Expected", "Property.md")), File.ReadAllText(fn)); + Assert.That(File.Exists(fn), Is.True); + Assert.That(File.ReadAllText(fn), Is.EqualTo(File.ReadAllText(Path.Combine("Expected", "Property.md")))); } } } \ No newline at end of file diff --git a/tests/OnRamp.Test/OnRamp.Test.csproj b/tests/OnRamp.Test/OnRamp.Test.csproj index d65038a..e739138 100644 --- a/tests/OnRamp.Test/OnRamp.Test.csproj +++ b/tests/OnRamp.Test/OnRamp.Test.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 1.2.3 Test title. The long description. @@ -64,14 +64,17 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/tests/OnRamp.Test/StringConverterTest.cs b/tests/OnRamp.Test/StringConverterTest.cs index 192ca69..37bc9c6 100644 --- a/tests/OnRamp.Test/StringConverterTest.cs +++ b/tests/OnRamp.Test/StringConverterTest.cs @@ -1,4 +1,5 @@ using NUnit.Framework; +using NUnit.Framework.Legacy; using OnRamp.Utility; namespace OnRamp.Test @@ -9,124 +10,124 @@ public class StringConverterTest [Test] public void ToCamelCase() { - Assert.AreEqual("fieldName", StringConverter.ToCamelCase("FieldName")); - Assert.AreEqual("etagName", StringConverter.ToCamelCase("ETagName")); - Assert.AreEqual("odataName", StringConverter.ToCamelCase("ODataName")); + ClassicAssert.AreEqual("fieldName", StringConverter.ToCamelCase("FieldName")); + ClassicAssert.AreEqual("etagName", StringConverter.ToCamelCase("ETagName")); + ClassicAssert.AreEqual("odataName", StringConverter.ToCamelCase("ODataName")); - Assert.AreEqual("fieldName", StringConverter.ToCamelCase("FieldName", true)); - Assert.AreEqual("eTagName", StringConverter.ToCamelCase("ETagName", true)); - Assert.AreEqual("oDataName", StringConverter.ToCamelCase("ODataName", true)); + ClassicAssert.AreEqual("fieldName", StringConverter.ToCamelCase("FieldName", true)); + ClassicAssert.AreEqual("eTagName", StringConverter.ToCamelCase("ETagName", true)); + ClassicAssert.AreEqual("oDataName", StringConverter.ToCamelCase("ODataName", true)); } [Test] public void ToPascalCase() { - Assert.AreEqual("FieldName", StringConverter.ToPascalCase("fieldName")); - Assert.AreEqual("ETagName", StringConverter.ToPascalCase("etagName")); - Assert.AreEqual("ODataName", StringConverter.ToPascalCase("odataName")); + ClassicAssert.AreEqual("FieldName", StringConverter.ToPascalCase("fieldName")); + ClassicAssert.AreEqual("ETagName", StringConverter.ToPascalCase("etagName")); + ClassicAssert.AreEqual("ODataName", StringConverter.ToPascalCase("odataName")); - Assert.AreEqual("FieldName", StringConverter.ToPascalCase("fieldName", true)); - Assert.AreEqual("EtagName", StringConverter.ToPascalCase("etagName", true)); - Assert.AreEqual("OdataName", StringConverter.ToPascalCase("odataName", true)); + ClassicAssert.AreEqual("FieldName", StringConverter.ToPascalCase("fieldName", true)); + ClassicAssert.AreEqual("EtagName", StringConverter.ToPascalCase("etagName", true)); + ClassicAssert.AreEqual("OdataName", StringConverter.ToPascalCase("odataName", true)); } [Test] public void ToPrivateCase() { - Assert.AreEqual("_fieldName", StringConverter.ToPrivateCase("FieldName")); - Assert.AreEqual("_etagName", StringConverter.ToPrivateCase("ETagName")); - Assert.AreEqual("_odataName", StringConverter.ToPrivateCase("ODataName")); + ClassicAssert.AreEqual("_fieldName", StringConverter.ToPrivateCase("FieldName")); + ClassicAssert.AreEqual("_etagName", StringConverter.ToPrivateCase("ETagName")); + ClassicAssert.AreEqual("_odataName", StringConverter.ToPrivateCase("ODataName")); - Assert.AreEqual("_fieldName", StringConverter.ToPrivateCase("FieldName", true)); - Assert.AreEqual("_eTagName", StringConverter.ToPrivateCase("ETagName", true)); - Assert.AreEqual("_oDataName", StringConverter.ToPrivateCase("ODataName", true)); + ClassicAssert.AreEqual("_fieldName", StringConverter.ToPrivateCase("FieldName", true)); + ClassicAssert.AreEqual("_eTagName", StringConverter.ToPrivateCase("ETagName", true)); + ClassicAssert.AreEqual("_oDataName", StringConverter.ToPrivateCase("ODataName", true)); } [Test] public void ToSentenceCase() { - Assert.AreEqual("Field Name", StringConverter.ToSentenceCase("FieldName")); - Assert.AreEqual("ETag Name", StringConverter.ToSentenceCase("ETagName")); - Assert.AreEqual("OData Name", StringConverter.ToSentenceCase("ODataName")); - Assert.AreEqual("XML Name", StringConverter.ToSentenceCase("XMLName")); - - Assert.AreEqual("Field Name", StringConverter.ToSentenceCase("FieldName", true)); - Assert.AreEqual("E Tag Name", StringConverter.ToSentenceCase("ETagName", true)); - Assert.AreEqual("O Data Name", StringConverter.ToSentenceCase("ODataName", true)); - Assert.AreEqual("XML Name OR Other", StringConverter.ToSentenceCase("XMLNameOROther", true)); + ClassicAssert.AreEqual("Field Name", StringConverter.ToSentenceCase("FieldName")); + ClassicAssert.AreEqual("ETag Name", StringConverter.ToSentenceCase("ETagName")); + ClassicAssert.AreEqual("OData Name", StringConverter.ToSentenceCase("ODataName")); + ClassicAssert.AreEqual("XML Name", StringConverter.ToSentenceCase("XMLName")); + + ClassicAssert.AreEqual("Field Name", StringConverter.ToSentenceCase("FieldName", true)); + ClassicAssert.AreEqual("E Tag Name", StringConverter.ToSentenceCase("ETagName", true)); + ClassicAssert.AreEqual("O Data Name", StringConverter.ToSentenceCase("ODataName", true)); + ClassicAssert.AreEqual("XML Name OR Other", StringConverter.ToSentenceCase("XMLNameOROther", true)); } [Test] public void ToKebabCase() { - Assert.AreEqual("field-name", StringConverter.ToKebabCase("FieldName")); - Assert.AreEqual("etag-name", StringConverter.ToKebabCase("ETagName")); - Assert.AreEqual("odata-name", StringConverter.ToKebabCase("ODataName")); - Assert.AreEqual("xml-name", StringConverter.ToKebabCase("XMLName")); - - Assert.AreEqual("field-name", StringConverter.ToKebabCase("FieldName", true)); - Assert.AreEqual("e-tag-name", StringConverter.ToKebabCase("ETagName", true)); - Assert.AreEqual("o-data-name", StringConverter.ToKebabCase("ODataName", true)); - Assert.AreEqual("xml-name", StringConverter.ToKebabCase("XMLName", true)); + ClassicAssert.AreEqual("field-name", StringConverter.ToKebabCase("FieldName")); + ClassicAssert.AreEqual("etag-name", StringConverter.ToKebabCase("ETagName")); + ClassicAssert.AreEqual("odata-name", StringConverter.ToKebabCase("ODataName")); + ClassicAssert.AreEqual("xml-name", StringConverter.ToKebabCase("XMLName")); + + ClassicAssert.AreEqual("field-name", StringConverter.ToKebabCase("FieldName", true)); + ClassicAssert.AreEqual("e-tag-name", StringConverter.ToKebabCase("ETagName", true)); + ClassicAssert.AreEqual("o-data-name", StringConverter.ToKebabCase("ODataName", true)); + ClassicAssert.AreEqual("xml-name", StringConverter.ToKebabCase("XMLName", true)); } [Test] public void ToSnakeCase() { - Assert.AreEqual("field_name", StringConverter.ToSnakeCase("FieldName")); - Assert.AreEqual("etag_name", StringConverter.ToSnakeCase("ETagName")); - Assert.AreEqual("odata_name", StringConverter.ToSnakeCase("ODataName")); - Assert.AreEqual("xml_name", StringConverter.ToSnakeCase("XMLName")); - - Assert.AreEqual("field_name", StringConverter.ToSnakeCase("FieldName", true)); - Assert.AreEqual("e_tag_name", StringConverter.ToSnakeCase("ETagName", true)); - Assert.AreEqual("o_data_name", StringConverter.ToSnakeCase("ODataName", true)); - Assert.AreEqual("xml_name", StringConverter.ToSnakeCase("XMLName", true)); + ClassicAssert.AreEqual("field_name", StringConverter.ToSnakeCase("FieldName")); + ClassicAssert.AreEqual("etag_name", StringConverter.ToSnakeCase("ETagName")); + ClassicAssert.AreEqual("odata_name", StringConverter.ToSnakeCase("ODataName")); + ClassicAssert.AreEqual("xml_name", StringConverter.ToSnakeCase("XMLName")); + + ClassicAssert.AreEqual("field_name", StringConverter.ToSnakeCase("FieldName", true)); + ClassicAssert.AreEqual("e_tag_name", StringConverter.ToSnakeCase("ETagName", true)); + ClassicAssert.AreEqual("o_data_name", StringConverter.ToSnakeCase("ODataName", true)); + ClassicAssert.AreEqual("xml_name", StringConverter.ToSnakeCase("XMLName", true)); } [Test] public void ToPastTense() { - Assert.AreEqual("A", StringConverter.ToPastTense("A")); - Assert.AreEqual("Be", StringConverter.ToPastTense("Be")); - Assert.AreEqual("Pried", StringConverter.ToPastTense("Pry")); - Assert.AreEqual("Applied", StringConverter.ToPastTense("Apply")); - Assert.AreEqual("Dropped", StringConverter.ToPastTense("Drop")); - Assert.AreEqual("Rotted", StringConverter.ToPastTense("Rot")); - Assert.AreEqual("Concurred", StringConverter.ToPastTense("Concur")); - Assert.AreEqual("Ordered", StringConverter.ToPastTense("Order")); - Assert.AreEqual("Sent", StringConverter.ToPastTense("Send")); - Assert.AreEqual("sent", StringConverter.ToPastTense("send")); - Assert.AreEqual("Frolicked", StringConverter.ToPastTense("Frolic")); - Assert.AreEqual("Picnicked", StringConverter.ToPastTense("Picnic")); + ClassicAssert.AreEqual("A", StringConverter.ToPastTense("A")); + ClassicAssert.AreEqual("Be", StringConverter.ToPastTense("Be")); + ClassicAssert.AreEqual("Pried", StringConverter.ToPastTense("Pry")); + ClassicAssert.AreEqual("Applied", StringConverter.ToPastTense("Apply")); + ClassicAssert.AreEqual("Dropped", StringConverter.ToPastTense("Drop")); + ClassicAssert.AreEqual("Rotted", StringConverter.ToPastTense("Rot")); + ClassicAssert.AreEqual("Concurred", StringConverter.ToPastTense("Concur")); + ClassicAssert.AreEqual("Ordered", StringConverter.ToPastTense("Order")); + ClassicAssert.AreEqual("Sent", StringConverter.ToPastTense("Send")); + ClassicAssert.AreEqual("sent", StringConverter.ToPastTense("send")); + ClassicAssert.AreEqual("Frolicked", StringConverter.ToPastTense("Frolic")); + ClassicAssert.AreEqual("Picnicked", StringConverter.ToPastTense("Picnic")); } [Test] public void ToPlural() { - Assert.AreEqual("Castles", StringConverter.ToPlural("Castle")); - Assert.AreEqual("Successes", StringConverter.ToPlural("Success")); + ClassicAssert.AreEqual("Castles", StringConverter.ToPlural("Castle")); + ClassicAssert.AreEqual("Successes", StringConverter.ToPlural("Success")); } [Test] public void ToSingle() { - Assert.AreEqual("Castle", StringConverter.ToSingle("Castles")); - Assert.AreEqual("Success", StringConverter.ToSingle("Successes")); + ClassicAssert.AreEqual("Castle", StringConverter.ToSingle("Castles")); + ClassicAssert.AreEqual("Success", StringConverter.ToSingle("Successes")); } [Test] public void ToComments() { - Assert.AreEqual("See .", StringConverter.ToComments("See {{Xyz}}.")); - Assert.AreEqual("See .", StringConverter.ToComments("See {{List}}.")); + ClassicAssert.AreEqual("See .", StringConverter.ToComments("See {{Xyz}}.")); + ClassicAssert.AreEqual("See .", StringConverter.ToComments("See {{List}}.")); } [Test] public void ToSeeComments() { - Assert.AreEqual("", StringConverter.ToSeeComments("Xyz")); - Assert.AreEqual("", StringConverter.ToSeeComments("List")); + ClassicAssert.AreEqual("", StringConverter.ToSeeComments("Xyz")); + ClassicAssert.AreEqual("", StringConverter.ToSeeComments("List")); } } } \ No newline at end of file