From 831e0c8e0921ca5ab9c813fc74ece737b484193b Mon Sep 17 00:00:00 2001 From: m-nash <64171366+m-nash@users.noreply.github.com> Date: Tue, 25 Jun 2024 13:03:19 -0700 Subject: [PATCH] remove new dictionaryexpression and keep as snippet only (#3652) Fixes https://github.com/microsoft/typespec/issues/3471 --- .../DictionaryInitializerExpression.cs | 32 +++-- .../Expressions/NewDictionaryExpression.cs | 21 --- .../src/Expressions/NewInstanceExpression.cs | 18 ++- .../ObjectInitializerExpression.cs | 47 +++--- .../src/Snippets/Snippet.New.cs | 18 +-- .../src/Snippets/Snippet.cs | 1 + ...ExpressionsTest.cs => ExpressionsTests.cs} | 2 +- .../NewDictionaryExpressionTests.cs | 28 ++++ .../Expressions/NewInstanceExpressionTests.cs | 39 +++++ .../TestInvokeInstanceMethodExpression.cs | 0 .../TestNewInstanceExpression.cs | 0 .../UseNewInstanceExpression.cs | 5 + .../test/Snippets/SnippetTests.cs | 135 +++++++++++++++++- .../ValidateAnonymousMultipleProperties.cs | 5 + .../ValidateAnonymousSingleProperty.cs | 4 + .../ValidateDictionaryWithValues.cs | 5 + .../SnippetTests/ValidateFrameworkInstance.cs | 5 + .../TestData/SnippetTests/ValidateInstance.cs | 5 + .../SnippetTests/ValidateInstanceCtor.cs | 5 + .../ValidateInstanceCtorWithArguments.cs | 4 + 20 files changed, 301 insertions(+), 78 deletions(-) delete mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewDictionaryExpression.cs rename packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/{ExpressionsTest.cs => ExpressionsTests.cs} (99%) create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewDictionaryExpressionTests.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewInstanceExpressionTests.cs rename packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/{ExpressionsTest => ExpressionsTests}/TestInvokeInstanceMethodExpression.cs (100%) rename packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/{ExpressionsTest => ExpressionsTests}/TestNewInstanceExpression.cs (100%) create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/NewDictionaryExpressionTests/UseNewInstanceExpression.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousMultipleProperties.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousSingleProperty.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateDictionaryWithValues.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateFrameworkInstance.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstance.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtor.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtorWithArguments.cs diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/DictionaryInitializerExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/DictionaryInitializerExpression.cs index bdd13c8656..5731000773 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/DictionaryInitializerExpression.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/DictionaryInitializerExpression.cs @@ -5,29 +5,33 @@ namespace Microsoft.Generator.CSharp.Expressions { - public sealed record DictionaryInitializerExpression(IReadOnlyList<(ValueExpression Key, ValueExpression Value)>? Values = null) : ValueExpression + public sealed record DictionaryInitializerExpression(IReadOnlyDictionary Values) : ObjectInitializerExpression(Values) { internal override void Write(CodeWriter writer) { - if (Values is not { Count: > 0 }) + var enumerator = Values.GetEnumerator(); + if (!enumerator.MoveNext()) { - writer.AppendRaw("{}"); + writer.AppendRaw("{ }"); return; } - - writer.WriteLine(); - writer.WriteRawLine("{"); - for (int i = 0; i < Values.Count; i++) + using var scope = writer.Scope(); + WriteItem(writer, enumerator.Current); + while (enumerator.MoveNext()) { - var (key, value) = Values[i]; - key.Write(writer); - writer.AppendRaw(" = "); - value.Write(writer); - if (i < Values.Count - 1) - writer.WriteRawLine(","); + writer.WriteRawLine(","); + WriteItem(writer, enumerator.Current); } writer.WriteLine(); - writer.AppendRaw("}"); + } + + private void WriteItem(CodeWriter writer, KeyValuePair item) + { + writer.AppendRaw("{ "); + item.Key.Write(writer); + writer.AppendRaw(", "); + item.Value.Write(writer); + writer.AppendRaw(" }"); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewDictionaryExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewDictionaryExpression.cs deleted file mode 100644 index b66040f754..0000000000 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewDictionaryExpression.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.Generator.CSharp.Expressions -{ - public sealed record NewDictionaryExpression(CSharpType Type, DictionaryInitializerExpression? Values = null) : ValueExpression - { - internal override void Write(CodeWriter writer) - { - writer.Append($"new {Type}"); - if (Values is { Values.Count: > 0 }) - { - Values.Write(writer); - } - else - { - writer.AppendRaw("()"); - } - } - } -} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewInstanceExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewInstanceExpression.cs index 774877cf69..099722a0ba 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewInstanceExpression.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/NewInstanceExpression.cs @@ -5,20 +5,30 @@ namespace Microsoft.Generator.CSharp.Expressions { - public sealed record NewInstanceExpression(CSharpType Type, IReadOnlyList Parameters, ObjectInitializerExpression? InitExpression = null) : ValueExpression + public sealed record NewInstanceExpression(CSharpType? Type, IReadOnlyList Parameters, ObjectInitializerExpression? InitExpression = null) : ValueExpression { private const int SingleLineParameterThreshold = 6; internal override void Write(CodeWriter writer) { - writer.Append($"new {Type}"); - if (Parameters.Count > 0 || InitExpression is not { Parameters.Count: > 0 }) + writer.Append($"new"); + if (Type is not null) + writer.Append($" {Type}"); + if (Parameters.Count > 0 || InitExpression is not { Values.Count: > 0 }) { writer.WriteArguments(Parameters, Parameters.Count < SingleLineParameterThreshold); } - if (InitExpression is { Parameters.Count: > 0 }) + if (InitExpression is not null) { + if (!InitExpression.UseSingleLine) + { + writer.WriteLine(); + } + else + { + writer.AppendRaw(" "); + } InitExpression.Write(writer); } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/ObjectInitializerExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/ObjectInitializerExpression.cs index 3e50b2c1ad..7e82eb732a 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/ObjectInitializerExpression.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Expressions/ObjectInitializerExpression.cs @@ -8,50 +8,47 @@ namespace Microsoft.Generator.CSharp.Expressions /// /// Represents an object initializer expression. /// - /// The parameters to initialize the object to. + /// The set of property values to initialize the object to. /// Flag to determine if the object should be initialized inline. - public sealed record ObjectInitializerExpression(IReadOnlyDictionary? Parameters = null, bool UseSingleLine = true) : ValueExpression + public record ObjectInitializerExpression(IReadOnlyDictionary Values, bool UseSingleLine = false) : ValueExpression { internal override void Write(CodeWriter writer) { - if (Parameters is not { Count: > 0 }) + var iterator = Values.GetEnumerator(); + if (!iterator.MoveNext()) { - writer.AppendRaw("{}"); + writer.AppendRaw("{ }"); return; } if (UseSingleLine) { - writer.AppendRaw("{"); - var iterator = Parameters.GetEnumerator(); - if (iterator.MoveNext()) + writer.AppendRaw("{ "); + WriteItem(writer, iterator.Current); + while (iterator.MoveNext()) { - var (name, value) = iterator.Current; - writer.Append($"{name} = "); - value.Write(writer); - while (iterator.MoveNext()) - { - writer.AppendRaw(", "); - (name, value) = iterator.Current; - writer.Append($"{name} = "); - value.Write(writer); - } + writer.AppendRaw(", "); + WriteItem(writer, iterator.Current); } - writer.AppendRaw("}"); + writer.AppendRaw(" }"); } else { - writer.WriteLine(); - writer.WriteRawLine("{"); - foreach (var (name, value) in Parameters) + using var scope = writer.Scope(); + WriteItem(writer, iterator.Current); + while (iterator.MoveNext()) { - writer.Append($"{name} = "); - value.Write(writer); writer.WriteRawLine(","); + WriteItem(writer, iterator.Current); } - - writer.AppendRaw("}"); + writer.WriteLine(); } } + + private static void WriteItem(CodeWriter writer, KeyValuePair item) + { + writer.Append($"{item.Key} = "); + item.Value.Write(writer); + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.New.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.New.cs index 1c7d00f29a..5a52fdace8 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.New.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.New.cs @@ -47,9 +47,9 @@ public static ValueExpression JsonException(ValueExpression message) public static EnumerableSnippet Array(CSharpType? elementType, ValueExpression size) => new(elementType ?? typeof(object), new NewArrayExpression(elementType, Size: size)); public static DictionarySnippet Dictionary(CSharpType keyType, CSharpType valueType) - => new(keyType, valueType, new NewDictionaryExpression(new CSharpType(typeof(Dictionary<,>), keyType, valueType))); - public static DictionarySnippet Dictionary(CSharpType keyType, CSharpType valueType, params (ValueExpression Key, ValueExpression Value)[] values) - => new(keyType, valueType, new NewDictionaryExpression(new CSharpType(typeof(Dictionary<,>), keyType, valueType), new DictionaryInitializerExpression(values))); + => new(keyType, valueType, new NewInstanceExpression(new CSharpType(typeof(Dictionary<,>), keyType, valueType), [])); + public static DictionarySnippet Dictionary(CSharpType keyType, CSharpType valueType, IReadOnlyDictionary values) + => new(keyType, valueType, new NewInstanceExpression(new CSharpType(typeof(Dictionary<,>), keyType, valueType), [], new DictionaryInitializerExpression(values))); public static TypedSnippet JsonSerializerOptions() => new FrameworkTypeSnippet(typeof(JsonSerializerOptions), new ValueExpression()); @@ -60,15 +60,15 @@ public static DictionarySnippet Dictionary(CSharpType keyType, CSharpType valueT public static TimeSpanSnippet TimeSpan(int hours, int minutes, int seconds) => new(Instance(typeof(TimeSpan), Int(hours), Int(minutes), Int(seconds))); public static TypedSnippet Uri(string uri) => Instance(typeof(Uri), Literal(uri)); - public static ValueExpression Anonymous(string key, ValueExpression value) => Anonymous(new Dictionary { [key] = value }); - public static ValueExpression Anonymous(IReadOnlyDictionary? properties) => new KeywordExpression("new", new ObjectInitializerExpression(properties, UseSingleLine: false)); - public static ValueExpression Instance(ConstructorSignature ctorSignature, IReadOnlyList arguments, IReadOnlyDictionary? properties = null) => new NewInstanceExpression(ctorSignature.Type, arguments, properties != null ? new ObjectInitializerExpression(properties) : null); - public static ValueExpression Instance(ConstructorSignature ctorSignature, IReadOnlyDictionary? properties = null) => Instance(ctorSignature, ctorSignature.Parameters.Select(p => (ValueExpression)p).ToArray(), properties); + public static ValueExpression Anonymous(ValueExpression key, ValueExpression value) => Anonymous(new Dictionary { [key] = value }); + public static ValueExpression Anonymous(IReadOnlyDictionary properties) => new NewInstanceExpression(null, [], new ObjectInitializerExpression(properties)); + public static ValueExpression Instance(ConstructorSignature ctorSignature, IReadOnlyList arguments, IReadOnlyDictionary? properties = null) => new NewInstanceExpression(ctorSignature.Type, arguments, properties != null ? new ObjectInitializerExpression(properties) : null); + public static ValueExpression Instance(ConstructorSignature ctorSignature, IReadOnlyDictionary? properties = null) => Instance(ctorSignature, ctorSignature.Parameters.Select(p => (ValueExpression)p).ToArray(), properties); public static ValueExpression Instance(CSharpType type, IReadOnlyList arguments) => new NewInstanceExpression(type, arguments); public static ValueExpression Instance(CSharpType type, params ValueExpression[] arguments) => new NewInstanceExpression(type, arguments); - public static ValueExpression Instance(CSharpType type, IReadOnlyDictionary properties) => new NewInstanceExpression(type, System.Array.Empty(), new ObjectInitializerExpression(properties)); + public static ValueExpression Instance(CSharpType type, IReadOnlyDictionary properties) => new NewInstanceExpression(type, System.Array.Empty(), new ObjectInitializerExpression(properties)); public static TypedSnippet Instance(Type type, params ValueExpression[] arguments) => new FrameworkTypeSnippet(type, new NewInstanceExpression(type, arguments)); - public static TypedSnippet Instance(Type type, IReadOnlyDictionary properties) => new FrameworkTypeSnippet(type, new NewInstanceExpression(type, System.Array.Empty(), new ObjectInitializerExpression(properties))); + public static TypedSnippet Instance(Type type, IReadOnlyDictionary properties) => new FrameworkTypeSnippet(type, new NewInstanceExpression(type, System.Array.Empty(), new ObjectInitializerExpression(properties))); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs index c6de207022..24ffc7fb0c 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Snippets/Snippet.cs @@ -22,6 +22,7 @@ internal override void Write(CodeWriter writer) public static readonly MethodBodyStatement EmptyStatement = new(); public static readonly MethodBodyStatement EmptyLineStatement = new PrivateEmptyLineStatement(); + public static ValueExpression Identifier(string name) => new MemberExpression(null, name); public static ExtensibleSnippets Extensible => CodeModelPlugin.Instance.ExtensibleSnippets; public static MethodBodyStatement AsStatement(this IEnumerable statements) => statements.ToArray(); diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTest.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTests.cs similarity index 99% rename from packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTest.cs rename to packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTests.cs index db31757db5..0e2a719bc5 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTest.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/ExpressionsTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.Generator.CSharp.Tests.Expressions { - internal class ExpressionsTest + internal class ExpressionsTests { private readonly string _mocksFolder = "Mocks"; diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewDictionaryExpressionTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewDictionaryExpressionTests.cs new file mode 100644 index 0000000000..07f0d99a99 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewDictionaryExpressionTests.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using Microsoft.Generator.CSharp.Expressions; +using NUnit.Framework; +using static Microsoft.Generator.CSharp.Snippets.Snippet; + + +namespace Microsoft.Generator.CSharp.Tests.Expressions +{ + public class NewDictionaryExpressionTests + { + [Test] + public void UseNewInstanceExpression() + { + var expression = new NewInstanceExpression(typeof(Dictionary), [], new DictionaryInitializerExpression(new Dictionary + { + { Literal("x"), Literal(1) }, + { Literal("y"), Literal(2) } + })); + using CodeWriter writer = new(); + expression.Write(writer); + var actual = writer.ToString(false); + Assert.AreEqual(Helpers.GetExpectedFromFile(), actual); + } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewInstanceExpressionTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewInstanceExpressionTests.cs new file mode 100644 index 0000000000..614eab2bef --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/NewInstanceExpressionTests.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using Microsoft.Generator.CSharp.Expressions; +using NUnit.Framework; +using static Microsoft.Generator.CSharp.Snippets.Snippet; + +namespace Microsoft.Generator.CSharp.Tests.Expressions +{ + internal class NewInstanceExpressionTests + { + [Test] + public void ValidateAnonymousSingleLine() + { + using CodeWriter writer = new CodeWriter(); + new NewInstanceExpression(null, [], new ObjectInitializerExpression(new Dictionary + { + { Identifier("key"), Literal(1) } + }, + true)).Write(writer); + Assert.AreEqual("new { key = 1 }", writer.ToString(false)); + } + + [Test] + public void ValidateAnonymousWithPropertiesSingleLine() + { + using CodeWriter writer = new CodeWriter(); + new NewInstanceExpression(null, [], new ObjectInitializerExpression(new Dictionary + { + { Identifier("key"), Literal(1) }, + { Identifier("value"), Literal(2) } + }, + true)).Write(writer); + Assert.AreEqual("new { key = 1, value = 2 }", writer.ToString(false)); + } + + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTest/TestInvokeInstanceMethodExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTests/TestInvokeInstanceMethodExpression.cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTest/TestInvokeInstanceMethodExpression.cs rename to packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTests/TestInvokeInstanceMethodExpression.cs diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTest/TestNewInstanceExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTests/TestNewInstanceExpression.cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTest/TestNewInstanceExpression.cs rename to packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/ExpressionsTests/TestNewInstanceExpression.cs diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/NewDictionaryExpressionTests/UseNewInstanceExpression.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/NewDictionaryExpressionTests/UseNewInstanceExpression.cs new file mode 100644 index 0000000000..61e63a72d6 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Expressions/TestData/NewDictionaryExpressionTests/UseNewInstanceExpression.cs @@ -0,0 +1,5 @@ +new global::System.Collections.Generic.Dictionary +{ + { "x", 1 }, + { "y", 2 } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/SnippetTests.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/SnippetTests.cs index 0d5dab66fc..3032deea42 100644 --- a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/SnippetTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/SnippetTests.cs @@ -1,8 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using Microsoft.Generator.CSharp.Snippets; +using System.Collections.Generic; +using Microsoft.Generator.CSharp.Expressions; +using Microsoft.Generator.CSharp.Providers; using NUnit.Framework; +using static Microsoft.Generator.CSharp.Snippets.Snippet; namespace Microsoft.Generator.CSharp.Tests.Snippets { @@ -12,7 +15,7 @@ public class SnippetTests public void ValidateFloat() { using CodeWriter writer = new CodeWriter(); - Snippet.Float(1.1f).Write(writer); + Float(1.1f).Write(writer); Assert.AreEqual("1.1F", writer.ToString(false)); } @@ -20,7 +23,7 @@ public void ValidateFloat() public void ValidateString() { using CodeWriter writer = new CodeWriter(); - Snippet.Literal("testing").Untyped.Write(writer); + Literal("testing").Untyped.Write(writer); Assert.AreEqual("\"testing\"", writer.ToString(false)); } @@ -28,8 +31,132 @@ public void ValidateString() public void ValidateStringU8() { using CodeWriter writer = new CodeWriter(); - Snippet.LiteralU8("testing").Untyped.Write(writer); + LiteralU8("testing").Untyped.Write(writer); Assert.AreEqual("\"testing\"u8", writer.ToString(false)); } + + [Test] + public void ValidateDictionary() + { + using CodeWriter writer = new CodeWriter(); + New.Dictionary(typeof(string), typeof(int)).Untyped.Write(writer); + Assert.AreEqual("new global::System.Collections.Generic.Dictionary()", writer.ToString(false)); + } + + [Test] + public void ValidateDictionaryWithValues() + { + using CodeWriter writer = new CodeWriter(); + New.Dictionary(typeof(string), typeof(int), new Dictionary + { + { Literal("x"), Literal(1) }, + { Literal("y"), Literal(2) } + }).Untyped.Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateAnonymousSingleProperty() + { + using CodeWriter writer = new CodeWriter(); + New.Anonymous(Identifier("key"), Literal(1)).Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateAnonymousMultipleProperties() + { + using CodeWriter writer = new CodeWriter(); + New.Anonymous(new Dictionary + { + { Identifier("key"), Literal(1) }, + { Identifier("value"), Literal(2) } + }).Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateInstanceCtor() + { + var ctor = new ConstructorSignature(typeof(TestClass), null, MethodSignatureModifiers.Public, []); + using CodeWriter writer = new CodeWriter(); + New.Instance(ctor, new Dictionary + { + { Identifier("X"), Literal(100) }, + { Identifier("Y"), Literal(200) } + }).Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateInstanceCtorWithArguments() + { + var xParam = new ParameterProvider("x", FormattableStringHelpers.Empty, typeof(int)); + var ctor = new ConstructorSignature(typeof(TestClass), null, MethodSignatureModifiers.Public, []); + using CodeWriter writer = new CodeWriter(); + New.Instance(ctor, [Literal(20)], new Dictionary + { + { Identifier("Y"), Literal(200) } + }).Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateInstance() + { + using CodeWriter writer = new CodeWriter(); + New.Instance(new CSharpType(typeof(TestClass)), new Dictionary + { + { Identifier("X"), Literal(100) }, + { Identifier("Y"), Literal(200) } + }).Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateInstanceWithArguments() + { + using CodeWriter writer = new CodeWriter(); + New.Instance(new CSharpType(typeof(TestClass)), [Literal(20)]).Write(writer); + Assert.AreEqual("new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass(20)", writer.ToString(false)); + } + + [Test] + public void ValidateFrameworkInstance() + { + using CodeWriter writer = new CodeWriter(); + New.Instance(typeof(TestClass), new Dictionary + { + { Identifier("X"), Literal(100) }, + { Identifier("Y"), Literal(200) } + }).Untyped.Write(writer); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + + [Test] + public void ValidateFrameworkInstanceWithArguments() + { + using CodeWriter writer = new CodeWriter(); + New.Instance(typeof(TestClass), [Literal(20)]).Untyped.Write(writer); + Assert.AreEqual("new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass(20)", writer.ToString(false)); + } + + private class TestClass + { + public TestClass() + { + X = 1; + Y = 2; + } + + public TestClass(int x) + { + X = x; + Y = 2; + } + + public int X { get; set; } + public int Y { get; set; } + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousMultipleProperties.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousMultipleProperties.cs new file mode 100644 index 0000000000..0678f232bf --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousMultipleProperties.cs @@ -0,0 +1,5 @@ +new +{ + key = 1, + value = 2 +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousSingleProperty.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousSingleProperty.cs new file mode 100644 index 0000000000..0b82c97eb8 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateAnonymousSingleProperty.cs @@ -0,0 +1,4 @@ +new +{ + key = 1 +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateDictionaryWithValues.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateDictionaryWithValues.cs new file mode 100644 index 0000000000..61e63a72d6 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateDictionaryWithValues.cs @@ -0,0 +1,5 @@ +new global::System.Collections.Generic.Dictionary +{ + { "x", 1 }, + { "y", 2 } +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateFrameworkInstance.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateFrameworkInstance.cs new file mode 100644 index 0000000000..ea90450364 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateFrameworkInstance.cs @@ -0,0 +1,5 @@ +new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass +{ + X = 100, + Y = 200 +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstance.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstance.cs new file mode 100644 index 0000000000..ea90450364 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstance.cs @@ -0,0 +1,5 @@ +new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass +{ + X = 100, + Y = 200 +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtor.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtor.cs new file mode 100644 index 0000000000..ea90450364 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtor.cs @@ -0,0 +1,5 @@ +new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass +{ + X = 100, + Y = 200 +} diff --git a/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtorWithArguments.cs b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtorWithArguments.cs new file mode 100644 index 0000000000..3dd6217c9b --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Snippets/TestData/SnippetTests/ValidateInstanceCtorWithArguments.cs @@ -0,0 +1,4 @@ +new global::Microsoft.Generator.CSharp.Tests.Snippets.TestClass(20) +{ + Y = 200 +}