From 97fccc5b3e00ff91a1d8b2260110143a89998ddf Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 10:20:00 -0800 Subject: [PATCH 1/8] delete duplicate test project --- sdk/core/Azure.Core/Azure.Core.sln | 6 - .../MapsClient/CountryRegion.cs | 72 --- .../MapsClient/IPAddressCountryPair.cs | 96 ---- .../MapsClient/MapsClient.cs | 120 ----- .../MapsClient/MapsClientOptions.cs | 30 -- .../nullableenabledclient/MapsClientTests.cs | 479 ------------------ ...ntModel.Tests.NullableEnabledClient.csproj | 21 - 7 files changed, 824 deletions(-) delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/CountryRegion.cs delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/IPAddressCountryPair.cs delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClientOptions.cs delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClientTests.cs delete mode 100644 sdk/core/System.ClientModel/tests/nullableenabledclient/System.ClientModel.Tests.NullableEnabledClient.csproj diff --git a/sdk/core/Azure.Core/Azure.Core.sln b/sdk/core/Azure.Core/Azure.Core.sln index d31d15062fe9..e7b54032ec97 100644 --- a/sdk/core/Azure.Core/Azure.Core.sln +++ b/sdk/core/Azure.Core/Azure.Core.sln @@ -63,8 +63,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.ClientModel.Tests.In EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.ClientModel.Tests.Internal.Perf", "..\System.ClientModel\tests\internal.perf\System.ClientModel.Tests.Internal.Perf.csproj", "{14F5E486-2C03-4293-ACA7-47B3E069956E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.ClientModel.Tests.NullableEnabledClient", "..\System.ClientModel\tests\nullableenabledclient\System.ClientModel.Tests.NullableEnabledClient.csproj", "{596EA833-B84F-41C2-BB0C-1FE3A2CADEAA}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -163,10 +161,6 @@ Global {14F5E486-2C03-4293-ACA7-47B3E069956E}.Debug|Any CPU.Build.0 = Debug|Any CPU {14F5E486-2C03-4293-ACA7-47B3E069956E}.Release|Any CPU.ActiveCfg = Release|Any CPU {14F5E486-2C03-4293-ACA7-47B3E069956E}.Release|Any CPU.Build.0 = Release|Any CPU - {596EA833-B84F-41C2-BB0C-1FE3A2CADEAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {596EA833-B84F-41C2-BB0C-1FE3A2CADEAA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {596EA833-B84F-41C2-BB0C-1FE3A2CADEAA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {596EA833-B84F-41C2-BB0C-1FE3A2CADEAA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/CountryRegion.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/CountryRegion.cs deleted file mode 100644 index d4ede6e5a9af..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/CountryRegion.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.ClientModel.Primitives; -using System.Text.Json; - -namespace Maps.NullableEnabled; - -public class CountryRegion : IJsonModel -{ - internal CountryRegion(string isoCode) - { - IsoCode = isoCode; - } - - public string IsoCode { get; } - - internal static CountryRegion FromJson(JsonElement element) - { - // TODO: is this valid? If so we would need to represent it - // TODO: Would we ever have IJsonModel? - //if (element.ValueKind == JsonValueKind.Null) - //{ - // return null; - //} - - string? isoCode = default; - - foreach (var property in element.EnumerateObject()) - { - if (property.NameEquals("isoCode"u8)) - { - isoCode = property.Value.GetString(); - continue; - } - } - - // Note needed to satisfy contract, or alternate solution - if (isoCode is null) - { - throw new InvalidOperationException("Serialization failed."); - } - - return new CountryRegion(isoCode); - } - - public string GetFormatFromOptions(ModelReaderWriterOptions options) - => "J"; - - public CountryRegion Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) - { - using var document = JsonDocument.ParseValue(ref reader); - return FromJson(document.RootElement); - } - - public CountryRegion Create(BinaryData data, ModelReaderWriterOptions options) - { - using var document = JsonDocument.Parse(data.ToString()); - return FromJson(document.RootElement); - } - - public void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) - { - throw new NotSupportedException("This model is used for output only"); - } - - public BinaryData Write(ModelReaderWriterOptions options) - { - throw new NotSupportedException("This model is used for output only"); - } -} diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/IPAddressCountryPair.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/IPAddressCountryPair.cs deleted file mode 100644 index 9cbc598be94f..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/IPAddressCountryPair.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.ClientModel.Primitives; -using System.Net; -using System.Text.Json; - -namespace Maps.NullableEnabled; - -public class IPAddressCountryPair : IJsonModel -{ - internal IPAddressCountryPair(CountryRegion countryRegion, IPAddress ipAddress) - { - CountryRegion = countryRegion; - IpAddress = ipAddress; - } - - public CountryRegion CountryRegion { get; } - - public IPAddress IpAddress { get; } - - internal static IPAddressCountryPair FromJson(JsonElement element) - { - //if (element.ValueKind == JsonValueKind.Null) - //{ - // return null; - //} - - CountryRegion? countryRegion = default; - IPAddress? ipAddress = default; - - foreach (var property in element.EnumerateObject()) - { - if (property.NameEquals("countryRegion"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - - countryRegion = CountryRegion.FromJson(property.Value); - continue; - } - - if (property.NameEquals("ipAddress"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - - ipAddress = IPAddress.Parse(property.Value.GetString()!); - continue; - } - } - // Note needed to satisfy contract, or alternate solution - if (countryRegion is null || ipAddress is null) - { - throw new InvalidOperationException("Serialization failed."); - } - - return new IPAddressCountryPair(countryRegion, ipAddress); - } - - internal static IPAddressCountryPair FromResponse(PipelineResponse response) - { - using var document = JsonDocument.Parse(response.Content); - return FromJson(document.RootElement); - } - - public string GetFormatFromOptions(ModelReaderWriterOptions options) - => "J"; - - public IPAddressCountryPair Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) - { - using var document = JsonDocument.ParseValue(ref reader); - return FromJson(document.RootElement); - } - - public IPAddressCountryPair Create(BinaryData data, ModelReaderWriterOptions options) - { - using var document = JsonDocument.Parse(data.ToString()); - return FromJson(document.RootElement); - } - - public void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) - { - throw new NotSupportedException("This model is used for output only"); - } - - public BinaryData Write(ModelReaderWriterOptions options) - { - throw new NotSupportedException("This model is used for output only"); - } -} diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs deleted file mode 100644 index aaa2d23a75d8..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClient.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.ClientModel; -using System.ClientModel.Primitives; -using System.Net; -using System.Text; - -namespace Maps.NullableEnabled; - -public class MapsClient -{ - private readonly Uri _endpoint; - private readonly ApiKeyCredential _credential; - private readonly ClientPipeline _pipeline; - private readonly string _apiVersion; - - public MapsClient(Uri endpoint, ApiKeyCredential credential, MapsClientOptions? options = default) - { - if (endpoint is null) throw new ArgumentNullException(nameof(endpoint)); - if (credential is null) throw new ArgumentNullException(nameof(credential)); - - options ??= new MapsClientOptions(); - - _endpoint = endpoint; - _credential = credential; - _apiVersion = options.Version; - - var authenticationPolicy = ApiKeyAuthenticationPolicy.CreateHeaderApiKeyPolicy(credential, "subscription-key"); - _pipeline = ClientPipeline.Create(options, - perCallPolicies: ReadOnlySpan.Empty, - perTryPolicies: new PipelinePolicy[] { authenticationPolicy }, - beforeTransportPolicies: ReadOnlySpan.Empty); - } - - public virtual ClientResult GetCountryCode(IPAddress ipAddress) - { - if (ipAddress is null) throw new ArgumentNullException(nameof(ipAddress)); - - ClientResult result = GetCountryCode(ipAddress.ToString()); - - PipelineResponse response = result.GetRawResponse(); - IPAddressCountryPair value = IPAddressCountryPair.FromResponse(response); - - return ClientResult.FromValue(value, response); - } - - public virtual ClientResult GetCountryCodeIfExists(IPAddress ipAddress) - { - if (ipAddress is null) - throw new ArgumentNullException(nameof(ipAddress)); - - ClientResult result = GetCountryCode(ipAddress.ToString()); - - PipelineResponse response = result.GetRawResponse(); - - // Note: We must add the status code check - if (response.Status == 404) - { - return ClientResult.FromOptionalValue(default, response); - } - - IPAddressCountryPair value = IPAddressCountryPair.FromResponse(response); - return ClientResult.FromOptionalValue(value, response); - } - - public virtual ClientResult GetCountryCode(string ipAddress, RequestOptions? options = null) - { - if (ipAddress is null) throw new ArgumentNullException(nameof(ipAddress)); - - options ??= new RequestOptions(); - - using PipelineMessage message = CreateGetLocationRequest(ipAddress, options); - - _pipeline.Send(message); - - PipelineResponse response = message.Response!; - - if (response.IsError && options.ErrorOptions == ClientErrorBehaviors.Default) - { - throw new ClientResultException(response); - } - - return ClientResult.FromResponse(response); - } - - private PipelineMessage CreateGetLocationRequest(string ipAddress, RequestOptions options) - { - PipelineMessage message = _pipeline.CreateMessage(); - message.ResponseClassifier = PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); - - PipelineRequest request = message.Request; - request.Method = "GET"; - - UriBuilder uriBuilder = new(_endpoint.ToString()); - - StringBuilder path = new(); - path.Append("geolocation/ip"); - path.Append("/json"); - uriBuilder.Path += path.ToString(); - - StringBuilder query = new(); - query.Append("api-version="); - query.Append(Uri.EscapeDataString(_apiVersion)); - query.Append("&ip="); - query.Append(Uri.EscapeDataString(ipAddress)); - uriBuilder.Query = query.ToString(); - - request.Uri = uriBuilder.Uri; - - request.Headers.Add("Accept", "application/json"); - - // Note: due to addition of SetHeader method on RequestOptions, we now - // need to apply options at the end of the CreateRequest routine. - message.Apply(options); - - return message; - } -} diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClientOptions.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClientOptions.cs deleted file mode 100644 index 43138bd4c086..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClient/MapsClientOptions.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.ClientModel.Primitives; - -namespace Maps.NullableEnabled; - -public class MapsClientOptions : ClientPipelineOptions -{ - private const ServiceVersion LatestVersion = ServiceVersion.V1; - - public enum ServiceVersion - { - V1 = 1 - } - - internal string Version { get; } - - internal Uri? Endpoint { get; } - - public MapsClientOptions(ServiceVersion version = LatestVersion) - { - Version = version switch - { - ServiceVersion.V1 => "1.0", - _ => throw new NotSupportedException() - }; - } -} diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClientTests.cs b/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClientTests.cs deleted file mode 100644 index 4ab39c69547c..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/MapsClientTests.cs +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.ClientModel.Primitives; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Threading; -using System.Threading.Tasks; -using Maps.NullableEnabled; -using NUnit.Framework; - -namespace System.ClientModel.Tests.NullableEnableClient; - -public class MapsClientTests -{ - // This is a "TestSupportProject", so these tests will never be run as part of CIs. - // It's here now for quick manual validation of client functionality, but we can revisit - // this story going forward. - [Test] - [Ignore("Test support project")] - public void TestClientSync() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult output = client.GetCountryCode(ipAddress); - - Assert.AreEqual("US", output.Value.CountryRegion.IsoCode); - Assert.AreEqual(IPAddress.Parse("2001:4898:80e8:b::189"), output.Value.IpAddress); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void TestGetIfExists() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult result = client.GetCountryCodeIfExists(ipAddress); - if (result.Value is not null) - { - // It existed - - Assert.AreEqual("US", result.Value.CountryRegion.IsoCode); - Assert.AreEqual(IPAddress.Parse("2001:4898:80e8:b::189"), result.Value.IpAddress); - } - else - { - // It did not exist - - Assert.AreEqual(404, result.GetRawResponse().Status); - } - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - #region Options Tests - - [Test] - [Ignore("Test support project")] - public void ChangeServiceVersion() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - // Service version is available on client subtype of ServiceClientOptions - MapsClientOptions options = new MapsClientOptions(MapsClientOptions.ServiceVersion.V1); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential, options); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult output = client.GetCountryCode(ipAddress); - - Assert.AreEqual("US", output.Value.CountryRegion.IsoCode); - Assert.AreEqual(IPAddress.Parse("2001:4898:80e8:b::189"), output.Value.IpAddress); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void SetNetworkTimeout_ClientScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClientOptions options = new MapsClientOptions(); - options.NetworkTimeout = TimeSpan.FromSeconds(2); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential, options); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult output = client.GetCountryCode(ipAddress); - - Assert.AreEqual("US", output.Value.CountryRegion.IsoCode); - Assert.AreEqual(IPAddress.Parse("2001:4898:80e8:b::189"), output.Value.IpAddress); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void AddCustomPolicy_ClientScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClientOptions options = new MapsClientOptions(); - CustomPolicy customPolicy = new CustomPolicy(); - options.AddPolicy(customPolicy, PipelinePosition.PerCall); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential, options); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult output = client.GetCountryCode(ipAddress); - - Assert.IsTrue(customPolicy.ProcessedMessage); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void OverrideTransport_ClientScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClientOptions options = new MapsClientOptions(); - options.Transport = new CustomTransport(); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential, options); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - ClientResult output = client.GetCountryCode(ipAddress); - - PipelineResponse reponse = output.GetRawResponse(); - - Assert.AreEqual("CustomTransportResponse", reponse.ReasonPhrase); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void PassCancellationToken_MethodScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - - RequestOptions options = new RequestOptions(); - options.CancellationToken = new CancellationToken(); - - // Call protocol method in order to pass RequestOptions - ClientResult output = client.GetCountryCode(ipAddress.ToString(), options); - - // TODO: Add validation test - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void AddRequestHeader_MethodScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - - RequestOptions options = new RequestOptions(); - options.AddHeader("CustomHeader", "CustomHeaderValue"); - - // Call protocol method in order to pass RequestOptions - ClientResult output = client.GetCountryCode(ipAddress.ToString(), options); - - // TODO: Add validation test - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void AddCustomPolicy_MethodScope() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - - RequestOptions options = new RequestOptions(); - CustomPolicy customPolicy = new CustomPolicy(); - options.AddPolicy(customPolicy, PipelinePosition.PerCall); - - // Call protocol method in order to pass RequestOptions - ClientResult output = client.GetCountryCode(ipAddress.ToString(), options); - - Assert.IsTrue(customPolicy.ProcessedMessage); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - [Test] - [Ignore("Test support project")] - public void ChangeMethodBehaviorOnErrorResponse() - { - string key = Environment.GetEnvironmentVariable("MAPS_API_KEY") ?? string.Empty; - ApiKeyCredential credential = new ApiKeyCredential(key); - - MapsClient client = new MapsClient(new Uri("https://atlas.microsoft.com"), credential); - - try - { - IPAddress ipAddress = IPAddress.Parse("2001:4898:80e8:b::189"); - - RequestOptions options = new RequestOptions(); - options.ErrorOptions = ClientErrorBehaviors.NoThrow; - - // Call protocol method in order to pass RequestOptions - ClientResult output = client.GetCountryCode(ipAddress.ToString(), options); - } - catch (ClientResultException e) - { - Assert.Fail($"Error: Response status code: '{e.Status}'"); - } - } - - #endregion - - #region Helpers - public class CustomPolicy : PipelinePolicy - { - public bool ProcessedMessage { get; private set; } - - public CustomPolicy() { } - - public override void Process(PipelineMessage message, IReadOnlyList pipeline, int currentIndex) - { - ProcessNext(message, pipeline, currentIndex); - ProcessedMessage = true; - } - - public override async ValueTask ProcessAsync(PipelineMessage message, IReadOnlyList pipeline, int currentIndex) - { - await ProcessNextAsync(message, pipeline, currentIndex).ConfigureAwait(false); - ProcessedMessage = true; - } - } - - public class CustomTransport : PipelineTransport - { - protected override PipelineMessage CreateMessageCore() - { - CustomTransportRequest request = new CustomTransportRequest(); - CustomTransportMessage message = new CustomTransportMessage(request); - return message; - } - - protected override void ProcessCore(PipelineMessage message) - { - if (message is CustomTransportMessage customMessage) - { - CustomTransportResponse reponse = new CustomTransportResponse(); - customMessage.SetResponse(reponse); - } - } - - protected override ValueTask ProcessCoreAsync(PipelineMessage message) - { - if (message is CustomTransportMessage customMessage) - { - CustomTransportResponse reponse = new CustomTransportResponse(); - customMessage.SetResponse(reponse); - } - - return default; - } - - private class CustomTransportMessage : PipelineMessage - { - protected internal CustomTransportMessage(PipelineRequest request) : base(request) - { - } - - public void SetResponse(CustomTransportResponse response) - { - Response = response; - } - } - - private class CustomTransportRequest : PipelineRequest - { - private string? _method; - private Uri? _uri; - private PipelineRequestHeaders _headers; - - public CustomTransportRequest() - { - _headers = new CustomHeaders(); - } - - public override void Dispose() { } - - protected override string GetMethodCore() - => _method!; - - protected override Uri GetUriCore() - => _uri!; - - protected override PipelineRequestHeaders GetHeadersCore() - => _headers; - - protected override BinaryContent GetContentCore() - { - throw new NotImplementedException(); - } - - protected override void SetMethodCore(string method) - => _method = method; - - protected override void SetUriCore(Uri uri) - => _uri = uri; - - protected override void SetContentCore(BinaryContent? content) - { - throw new NotImplementedException(); - } - } - - private class CustomTransportResponse : PipelineResponse - { - private Stream? _stream; - - public CustomTransportResponse() - { - // Add fake response content - _stream = BinaryData.FromString("{}").ToStream(); - } - - public override int Status => 200; - - public override string ReasonPhrase => "CustomTransportResponse"; - - public override Stream? ContentStream - { - get => _stream; - set => _stream = value; - } - - public override BinaryData Content => BinaryData.FromStream(_stream!); - - public override void Dispose() - { - _stream?.Dispose(); - } - - protected override PipelineResponseHeaders GetHeadersCore() - { - throw new NotImplementedException(); - } - - public override BinaryData ReadContent(CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - - public override ValueTask ReadContentAsync(CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - } - - private class CustomHeaders : PipelineRequestHeaders - { - private readonly Dictionary _headers; - - public CustomHeaders() - { - _headers = new Dictionary(); - } - - public override void Add(string name, string value) - { - if (_headers.ContainsKey(name)) - { - _headers[name] = $"{_headers[name]};{value}"; - } - else - { - _headers.Add(name, value); - } - } - - public override bool Remove(string name) - { - throw new NotImplementedException(); - } - - public override void Set(string name, string value) - => _headers[name] = value; - - public override bool TryGetValue(string name, out string value) - { - throw new NotImplementedException(); - } - - public override bool TryGetValues(string name, out IEnumerable values) - { - throw new NotImplementedException(); - } - - public override IEnumerator> GetEnumerator() - { - throw new NotImplementedException(); - } - } - } - #endregion -} diff --git a/sdk/core/System.ClientModel/tests/nullableenabledclient/System.ClientModel.Tests.NullableEnabledClient.csproj b/sdk/core/System.ClientModel/tests/nullableenabledclient/System.ClientModel.Tests.NullableEnabledClient.csproj deleted file mode 100644 index e18abb99472d..000000000000 --- a/sdk/core/System.ClientModel/tests/nullableenabledclient/System.ClientModel.Tests.NullableEnabledClient.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - Test client code for use in System.ClientModel test libraries. - $(RequiredTargetFrameworks) - enable - true - - - - - - - - - - - - - - From d7e78f1d038d166d85d06519de1d4d80fed6a965 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 10:29:37 -0800 Subject: [PATCH 2/8] remove #nullable disable and #nullable enable --- .../client/ClientShared/ModelReaderWriterExtensions.cs | 2 -- .../tests/client/ClientShared/ModelReaderWriterHelper.cs | 2 +- .../tests/client/ClientShared/OptionalDictionary.cs | 2 -- .../tests/client/ClientShared/OptionalList.cs | 2 -- .../tests/client/ClientShared/TypeFormatters.cs | 4 +--- .../tests/client/MapsClient/MapsClient.cs | 6 +++--- .../ServiceModels/ApiProfile.Serialization.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/ApiProfile.cs | 2 -- .../ServiceModels/AvailabilitySetData.Serialization.cs | 2 -- .../ModelReaderWriter/ServiceModels/AvailabilitySetData.cs | 2 -- .../ServiceModels/ComputeSku.Serialization.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/ComputeSku.cs | 2 -- .../ServiceModels/ComputeStatusLevelType.Serialization.cs | 2 -- .../ServiceModels/ComputeStatusLevelType.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/CreatedByType.cs | 2 -- .../ServiceModels/InstanceViewStatus.Serialization.cs | 2 -- .../ModelReaderWriter/ServiceModels/InstanceViewStatus.cs | 2 -- .../ServiceModels/ProviderAuthorizationConsentState.cs | 2 -- .../ServiceModels/ProviderExtendedLocation.Serialization.cs | 2 -- .../ServiceModels/ProviderExtendedLocation.cs | 2 -- .../ServiceModels/ProviderResourceType.Serialization.cs | 2 -- .../ModelReaderWriter/ServiceModels/ProviderResourceType.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/ResourceData.cs | 2 -- .../ServiceModels/ResourceProviderData.Serialization.cs | 2 -- .../ModelReaderWriter/ServiceModels/ResourceProviderData.cs | 2 -- .../ServiceModels/ResourceTypeAlias.Serialization.cs | 2 -- .../ModelReaderWriter/ServiceModels/ResourceTypeAlias.cs | 2 -- .../ServiceModels/ResourceTypeAliasPath.Serialization.cs | 2 -- .../ServiceModels/ResourceTypeAliasPath.cs | 2 -- .../ServiceModels/ResourceTypeAliasPathAttributes.cs | 2 -- .../ResourceTypeAliasPathMetadata.Serialization.cs | 2 -- .../ServiceModels/ResourceTypeAliasPathMetadata.cs | 2 -- .../ServiceModels/ResourceTypeAliasPathTokenType.cs | 2 -- .../ServiceModels/ResourceTypeAliasPattern.Serialization.cs | 2 -- .../ServiceModels/ResourceTypeAliasPattern.cs | 2 -- .../ResourceTypeAliasPatternType.Serialization.cs | 2 -- .../ServiceModels/ResourceTypeAliasPatternType.cs | 2 -- .../ServiceModels/ResourceTypeAliasType.Serialization.cs | 2 -- .../ServiceModels/ResourceTypeAliasType.cs | 2 -- .../ServiceModels/SystemData.Serialization.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/SystemData.cs | 2 -- .../ModelReaderWriter/ServiceModels/TrackedResourceData.cs | 2 -- .../ServiceModels/ZoneMapping.Serialization.cs | 2 -- .../client/ModelReaderWriter/ServiceModels/ZoneMapping.cs | 2 -- .../tests/client/OpenAIClient/Choice.Serialization.cs | 2 -- .../System.ClientModel/tests/client/OpenAIClient/Choice.cs | 2 -- .../tests/client/OpenAIClient/Completions.Serialization.cs | 2 -- .../tests/client/OpenAIClient/Completions.cs | 2 -- .../tests/client/OpenAIClient/CompletionsFinishReason.cs | 2 -- .../CompletionsLogProbabilityModel.Serialization.cs | 2 -- .../client/OpenAIClient/CompletionsLogProbabilityModel.cs | 2 -- .../client/OpenAIClient/CompletionsOptions.Serialization.cs | 2 -- .../tests/client/OpenAIClient/CompletionsOptions.cs | 2 -- .../client/OpenAIClient/CompletionsUsage.Serialization.cs | 2 -- .../tests/client/OpenAIClient/CompletionsUsage.cs | 2 -- .../OpenAIClient/ContentFilterResult.Serialization.cs | 2 -- .../tests/client/OpenAIClient/ContentFilterResult.cs | 2 -- .../OpenAIClient/ContentFilterResults.Serialization.cs | 2 -- .../tests/client/OpenAIClient/ContentFilterResults.cs | 2 -- .../tests/client/OpenAIClient/ContentFilterSeverity.cs | 2 -- .../client/OpenAIClient/PromptFilterResult.Serialization.cs | 2 -- .../tests/client/OpenAIClient/PromptFilterResult.cs | 2 -- .../tests/client/System.ClientModel.Tests.Client.csproj | 1 + 63 files changed, 6 insertions(+), 125 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs index b4ad891ec481..f589c65c2bef 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable enable - using System; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs index 01aec41339bd..051da0628c03 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs @@ -23,6 +23,6 @@ public static void ValidateFormat(IPersistableModel model, string format) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ValidateFormat(IPersistableModel model, string format) => ValidateFormat(model, format); - private static ModelReaderWriterOptions _wireOptions; + private static ModelReaderWriterOptions? _wireOptions; public static ModelReaderWriterOptions WireOptions => _wireOptions ??= new ModelReaderWriterOptions("W"); } diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs index c79c187c4210..deb6d689fb91 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs @@ -5,8 +5,6 @@ using System.Collections; using System.Collections.Generic; -#nullable enable - namespace ClientModel.Tests.ClientShared; internal class OptionalDictionary : IDictionary, IReadOnlyDictionary where TKey : notnull diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs index 0460b0cebc49..b8bdc4136e23 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs @@ -6,8 +6,6 @@ using System.Collections.Generic; using System.Linq; -#nullable enable - namespace ClientModel.Tests.ClientShared; internal class OptionalList : IList, IReadOnlyList diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/TypeFormatters.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/TypeFormatters.cs index 863ec55193d3..284351df306d 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/TypeFormatters.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/TypeFormatters.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable enable - using System; using System.Collections.Generic; using System.Globalization; @@ -155,4 +153,4 @@ public static string ConvertToString(object? value, string? format = null) BinaryData binaryData => TypeFormatters.ConvertToString(binaryData.ToArray(), format), _ => value.ToString()! }; -} \ No newline at end of file +} diff --git a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs index 95179679b9c0..777a75aac5ef 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClient.cs @@ -17,7 +17,7 @@ public class MapsClient private readonly ClientPipeline _pipeline; private readonly string _apiVersion; - public MapsClient(Uri endpoint, ApiKeyCredential credential, MapsClientOptions options = default) + public MapsClient(Uri endpoint, ApiKeyCredential credential, MapsClientOptions? options = default) { if (endpoint is null) throw new ArgumentNullException(nameof(endpoint)); if (credential is null) throw new ArgumentNullException(nameof(credential)); @@ -48,7 +48,7 @@ public virtual async Task> GetCountryCodeAsyn return ClientResult.FromValue(value, response); } - public virtual async Task GetCountryCodeAsync(string ipAddress, RequestOptions options = null) + public virtual async Task GetCountryCodeAsync(string ipAddress, RequestOptions? options = null) { if (ipAddress is null) throw new ArgumentNullException(nameof(ipAddress)); @@ -81,7 +81,7 @@ public virtual ClientResult GetCountryCode(IPAddress ipAdd return ClientResult.FromValue(value, response); } - public virtual ClientResult GetCountryCode(string ipAddress, RequestOptions options = null) + public virtual ClientResult GetCountryCode(string ipAddress, RequestOptions? options = null) { if (ipAddress is null) throw new ArgumentNullException(nameof(ipAddress)); diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.Serialization.cs index e4393e2a69c0..5d97c5262942 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.cs index 18525a25a432..4fe3a7c6824d 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ApiProfile.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { /// The ApiProfile. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.Serialization.cs index 7a0a5bcd187d..529b31159dd6 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.ClientModel.Tests.Client.Models.ResourceManager.Resources; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.cs index dd8ead307953..fb71b03c936b 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/AvailabilitySetData.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Tests.Client.Models.ResourceManager.Resources; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.Serialization.cs index 0240a70b3d1e..2d8dcd8a6ea2 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.cs index c105bc7a0e56..65749933edf0 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeSku.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Compute { /// Describes a virtual machine scale set sku. NOTE: If the new VM SKU is not supported on the hardware the scale set is currently on, you need to deallocate the VMs in the scale set before you modify the SKU name. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.Serialization.cs index 541a8dd96200..e6ee84f6b3e5 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Compute { internal static partial class ComputeStatusLevelTypeExtensions diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.cs index 7730597a4101..4cba4b57bf48 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ComputeStatusLevelType.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Compute { /// The level code. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/CreatedByType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/CreatedByType.cs index 992f42571c30..0d5c110cb1fe 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/CreatedByType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/CreatedByType.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ComponentModel; namespace System.ClientModel.Tests.Client.Models.ResourceManager diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.Serialization.cs index 01d93a0a3ff3..f99005012fb0 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Globalization; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.cs index 293f238af42e..6e99f9bc8984 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/InstanceViewStatus.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Compute { /// Instance view status. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderAuthorizationConsentState.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderAuthorizationConsentState.cs index 909cdae77b4a..c0da84b79e1e 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderAuthorizationConsentState.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderAuthorizationConsentState.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ComponentModel; namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.Serialization.cs index 0e1b113b8137..aa497f3daa05 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.cs index cf36137823a0..fd8d2892166a 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderExtendedLocation.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.Serialization.cs index 6789848e53d7..afaecee28e51 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.cs index 4c5fe551a3b1..e8c7dc0aff0f 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ProviderResourceType.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs index dcc3174962ed..9405e896e4fe 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager { /// Common fields that are returned in the response for all Azure Resource Manager resources. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.Serialization.cs index 50cbb69b99ee..b880a16f9f66 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.cs index f4fcff41e23f..8c112fbb20bd 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceProviderData.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.Serialization.cs index bd5a876f5d33..511100115e64 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.cs index 015e1ee09f64..09a70d5510e2 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAlias.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.Serialization.cs index cd11999862f6..dafe7b325189 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.cs index 5d42a403cb21..e8a2d97e8272 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPath.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathAttributes.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathAttributes.cs index 2cefe596c98d..05f9ffa3da5d 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathAttributes.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathAttributes.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ComponentModel; namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs index 86df483f3e68..ac80a9aaa1a0 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.cs index 7ca70d986008..5e70b741a0bc 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathMetadata.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { /// The ResourceTypeAliasPathMetadata. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathTokenType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathTokenType.cs index e8f1e666039e..d20abd28073a 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathTokenType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPathTokenType.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ComponentModel; namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.Serialization.cs index 15d867604c3a..8df588c3e0f0 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.cs index c576ac7eb971..904439f2fc38 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPattern.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { /// The type of the pattern for an alias path. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs index c044f0ae3d60..def1686d19f2 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { internal static partial class ResourceTypeAliasPatternTypeExtensions diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.cs index d1304e113d9f..d164dfdd5a86 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasPatternType.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { /// The type of alias pattern. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.Serialization.cs index 100f1b980c0a..705a52683239 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { internal static partial class ResourceTypeAliasTypeExtensions diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.cs index ec354ff129d1..b5bf69a849a7 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceTypeAliasType.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager.Resources { /// The type of the alias. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs index 1f698f7d257f..4caffe0450a8 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Globalization; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.cs index cbce4c2804d7..c934611d9d57 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace System.ClientModel.Tests.Client.Models.ResourceManager { /// Metadata pertaining to creation and last modification of the resource. diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs index 0657acf65075..c4d6f218c68c 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.Serialization.cs index 34cb3f05eacb..84567c67a8df 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.cs index b04f38867584..b981cc599bd4 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ZoneMapping.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs index 868c1d279247..531c8351b1a1 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs index ae6870df1557..29219a43ea4c 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; namespace OpenAI; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs index ff08627275d4..ee5c2dd9de39 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs index 192cda68a433..f6f29571066d 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs index 10fa890ccf6f..34eb6a4c6840 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.ComponentModel; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs index 8f5a70a3fd33..c9c9a2a96400 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.Collections.Generic; using System.ClientModel.Primitives; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs index 67f9a6af1964..27e1579fc7fa 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.Collections.Generic; using System.Linq; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs index 93d401c912ee..27fcf71f1a45 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs index 5dc314e9aa0f..7a56cd5ebb93 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs index d6c12fa9c8a6..4542125d1f83 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs index 2fbe6aecc99d..c59be9896e63 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace OpenAI; /// diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs index fe9130d81956..9d96cef35047 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs index f106fe4f9df2..95d472ced998 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace OpenAI; /// Information about filtered content severity level and if it has been filtered or not. diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs index 0db04534ae27..9f5b841b9eab 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs index 063e5e10cc10..33c854231c3c 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace OpenAI; /// Information about the content filtering category, if it has been detected. diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs index 5c3c84310fb1..ee98ca0b1892 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs @@ -3,8 +3,6 @@ // -#nullable disable - using System; using System.ComponentModel; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs index 4434b137e592..cbc5d3bd2117 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs @@ -3,8 +3,6 @@ // -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs index 7d79d5ac71eb..2db43c8a79d9 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs @@ -3,8 +3,6 @@ // -#nullable disable - namespace OpenAI; /// Content filtering results for a single prompt in the request. diff --git a/sdk/core/System.ClientModel/tests/client/System.ClientModel.Tests.Client.csproj b/sdk/core/System.ClientModel/tests/client/System.ClientModel.Tests.Client.csproj index e88b31806b70..8a60f3bfaac5 100644 --- a/sdk/core/System.ClientModel/tests/client/System.ClientModel.Tests.Client.csproj +++ b/sdk/core/System.ClientModel/tests/client/System.ClientModel.Tests.Client.csproj @@ -4,6 +4,7 @@ Test client code for use in System.ClientModel test libraries. $(RequiredTargetFrameworks) true + enable From c6ed258237c5e17749558114251e0da3ecd5a24e Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 11:06:49 -0800 Subject: [PATCH 3/8] updates --- .../client/MapsClient/MapsClientOptions.cs | 2 -- .../tests/client/MapsClientTests.cs | 22 ++++++++++---- .../Models/DiscriminatorSet/BaseModel.cs | 29 ++++++++++--------- .../Models/DiscriminatorSet/ModelX.cs | 8 ++--- .../tests/client/OpenAIClient/OpenAIClient.cs | 8 ++--- .../tests/client/OpenAIClientTests.cs | 9 ++++-- .../tests/client/TestData.cs | 2 +- 7 files changed, 47 insertions(+), 33 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClientOptions.cs b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClientOptions.cs index 87c2da88606f..ba4a287ec2bd 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClientOptions.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClient/MapsClientOptions.cs @@ -17,8 +17,6 @@ public enum ServiceVersion internal string Version { get; } - internal Uri Endpoint { get; } - public MapsClientOptions(ServiceVersion version = LatestVersion) { Version = version switch diff --git a/sdk/core/System.ClientModel/tests/client/MapsClientTests.cs b/sdk/core/System.ClientModel/tests/client/MapsClientTests.cs index 3cc23bd2e443..dc47db1a8906 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClientTests.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClientTests.cs @@ -318,8 +318,8 @@ public void SetResponse(CustomTransportResponse response) private class CustomTransportRequest : PipelineRequest { - private string _method; - private Uri _uri; + private string? _method; + private Uri? _uri; private PipelineRequestHeaders _headers; public CustomTransportRequest() @@ -349,7 +349,7 @@ protected override void SetMethodCore(string method) protected override void SetUriCore(Uri uri) => _uri = uri; - protected override void SetContentCore(BinaryContent content) + protected override void SetContentCore(BinaryContent? content) { throw new NotImplementedException(); } @@ -357,7 +357,7 @@ protected override void SetContentCore(BinaryContent content) private class CustomTransportResponse : PipelineResponse { - private Stream _stream; + private Stream? _stream; public CustomTransportResponse() { @@ -369,13 +369,23 @@ public CustomTransportResponse() public override string ReasonPhrase => "CustomTransportResponse"; - public override Stream ContentStream + public override Stream? ContentStream { get => _stream; set => _stream = value; } - public override BinaryData Content => BinaryData.FromStream(_stream); + public override BinaryData Content + { + get + { + if (_stream == null) + { + return new BinaryData(Array.Empty()); + } + return BinaryData.FromStream(_stream); + } + } public override void Dispose() { diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs index fb50d2ac81b1..15f5694e0fc7 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs @@ -9,11 +9,11 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { [PersistableModelProxy(typeof(UnknownBaseModel))] - public abstract class BaseModel : IJsonModel + public abstract class BaseModel : IJsonModel { private Dictionary _rawData; - public static implicit operator BinaryContent(BaseModel baseModel) + public static implicit operator BinaryContent?(BaseModel baseModel) { if (baseModel == null) { @@ -23,7 +23,7 @@ public static implicit operator BinaryContent(BaseModel baseModel) return BinaryContent.Create(baseModel, ModelReaderWriterHelper.WireOptions); } - public static explicit operator BaseModel(ClientResult result) + public static explicit operator BaseModel?(ClientResult result) { if (result is null) throw new ArgumentNullException(nameof(result)); @@ -31,7 +31,7 @@ public static explicit operator BaseModel(ClientResult result) return DeserializeBaseModel(jsonDocument.RootElement, ModelReaderWriterHelper.WireOptions); } - protected internal BaseModel(Dictionary rawData) + protected internal BaseModel(Dictionary? rawData) { _rawData = rawData ?? new Dictionary(); } @@ -53,7 +53,7 @@ protected internal void SerializeRawData(Utf8JsonWriter writer) } } - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); @@ -77,10 +77,10 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) writer.WriteEndObject(); } - internal static BaseModel DeserializeBaseModel(BinaryData data, ModelReaderWriterOptions options) + internal static BaseModel? DeserializeBaseModel(BinaryData data, ModelReaderWriterOptions options) => DeserializeBaseModel(JsonDocument.Parse(data.ToString()).RootElement, options); - internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderWriterOptions options = default) + internal static BaseModel? DeserializeBaseModel(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; @@ -88,6 +88,7 @@ internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderW { return null; } + if (element.TryGetProperty("kind", out JsonElement discriminator)) { switch (discriminator.GetString()) @@ -100,8 +101,8 @@ internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderW } //Deserialize unknown subtype - string kind = default; - OptionalProperty name = default; + string? kind = default; + OptionalProperty? name = null; Dictionary rawData = new Dictionary(); foreach (var property in element.EnumerateObject()) { @@ -124,14 +125,14 @@ internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderW return new UnknownBaseModel(kind, name, rawData); } - BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + BaseModel? IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); return DeserializeBaseModel(JsonDocument.Parse(data.ToString()).RootElement, options); } - BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + BaseModel? IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); @@ -139,13 +140,13 @@ BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWri return DeserializeBaseModel(doc.RootElement, options); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); - return ModelReaderWriter.Write(this, options); + return ModelReaderWriter.Write(this, options); } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs index b381b2bbaf60..f357e014c270 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs @@ -112,7 +112,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) writer.WriteEndObject(); } - internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterOptions options = default) + internal static ModelX? DeserializeModelX(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; @@ -120,11 +120,11 @@ internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterO { return null; } - string kind = default; - OptionalProperty name = default; + string? kind = default; + OptionalProperty? name = default; int xProperty = default; OptionalProperty nullProperty = default; - OptionalProperty> fields = default; + OptionalProperty>? fields = default; OptionalProperty> keyValuePairs = default; Dictionary rawData = new Dictionary(); diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs index 14601dae3fd1..821367fa61cc 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/OpenAIClient.cs @@ -14,7 +14,7 @@ public class OpenAIClient private readonly ApiKeyCredential _credential; private readonly ClientPipeline _pipeline; - public OpenAIClient(Uri endpoint, ApiKeyCredential credential, OpenAIClientOptions options = default) + public OpenAIClient(Uri endpoint, ApiKeyCredential credential, OpenAIClientOptions? options = default) { if (endpoint is null) throw new ArgumentNullException(nameof(endpoint)); if (credential is null) throw new ArgumentNullException(nameof(credential)); @@ -46,7 +46,7 @@ public virtual ClientResult GetCompletions(string deploymentId, Com return ClientResult.FromValue(completions, response); } - public virtual ClientResult GetCompletions(string deploymentId, BinaryContent content, RequestOptions options = null) + public virtual ClientResult GetCompletions(string deploymentId, BinaryContent content, RequestOptions? options = null) { if (deploymentId is null) throw new ArgumentNullException(nameof(deploymentId)); if (deploymentId.Length == 0) throw new ArgumentException("Value cannot be an empty string.", nameof(deploymentId)); @@ -58,7 +58,7 @@ public virtual ClientResult GetCompletions(string deploymentId, BinaryContent co _pipeline.Send(message); - PipelineResponse response = message.Response; + PipelineResponse response = message.Response!; if (response.IsError && options.ErrorOptions == ClientErrorBehaviors.Default) { @@ -95,6 +95,6 @@ internal PipelineMessage CreateGetCompletionsRequest(string deploymentId, Binary return message; } - private static PipelineMessageClassifier _messageClassifier200; + private static PipelineMessageClassifier? _messageClassifier200; private static PipelineMessageClassifier MessageClassifier200 => _messageClassifier200 ??= PipelineMessageClassifier.Create(stackalloc ushort[] { 200 }); } diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClientTests.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClientTests.cs index 3a8697000f9c..2317f0be46ed 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClientTests.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClientTests.cs @@ -15,9 +15,14 @@ public class OpenAIClientTests [Ignore("OpenAI deprecated this endpoint and it now returns a 404.")] public void TestClientSync() { - string key = Environment.GetEnvironmentVariable("OPENAI_KEY"); + string? key = Environment.GetEnvironmentVariable("OPENAI_KEY"); - ApiKeyCredential credential = new ApiKeyCredential(key); + if (key == null) + { + throw new InvalidOperationException(); + } + + ApiKeyCredential credential = new ApiKeyCredential(key!); OpenAIClient client = new OpenAIClient(new Uri("https://api.openai.com/"), credential); CompletionsOptions input = new(new string[] { "tell me something about life." }) diff --git a/sdk/core/System.ClientModel/tests/client/TestData.cs b/sdk/core/System.ClientModel/tests/client/TestData.cs index 9fb857da85f8..e54cf9c49c0a 100644 --- a/sdk/core/System.ClientModel/tests/client/TestData.cs +++ b/sdk/core/System.ClientModel/tests/client/TestData.cs @@ -10,7 +10,7 @@ public static class TestData { public static string GetLocation(string fileName) { - string testsLocation = Directory.GetParent(typeof(TestData).Assembly.Location).FullName; + string? testsLocation = Directory.GetParent(typeof(TestData).Assembly.Location).FullName; StringBuilder builder = new StringBuilder(); int indexAfter = testsLocation.IndexOf(".Tests") + 6; builder.Append(testsLocation.Substring(0, indexAfter)); From a5df50a7446fd1f6cfeb5c5429523faffe69e876 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 12:36:29 -0800 Subject: [PATCH 4/8] one approach to nullable models --- .../client/ClientShared/OptionalProperty.cs | 12 ++- .../Models/DiscriminatorSet/BaseModel.cs | 75 +++++++++++++++---- .../DiscriminatorSet/UnknownBaseModel.cs | 2 +- 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs index d86de7e9627e..8f497d3e241e 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs @@ -14,11 +14,13 @@ public static bool IsCollectionDefined(IEnumerable collection) } public static bool IsCollectionDefined(IReadOnlyDictionary collection) + where TKey : notnull { return !(collection is OptionalDictionary changeTrackingList && changeTrackingList.IsUndefined); } public static bool IsCollectionDefined(IDictionary collection) + where TKey : notnull { return !(collection is OptionalDictionary changeTrackingList && changeTrackingList.IsUndefined); } @@ -31,7 +33,7 @@ public static bool IsDefined(object value) { return value != null; } - public static bool IsDefined(string value) + public static bool IsDefined(string? value) { return value != null; } @@ -42,6 +44,7 @@ public static bool IsDefined(JsonElement value) } public static IReadOnlyDictionary ToDictionary(OptionalProperty> optional) + where TKey : notnull { if (optional.HasValue) { @@ -51,6 +54,7 @@ public static IReadOnlyDictionary ToDictionary(Optio } public static IDictionary ToDictionary(OptionalProperty> optional) + where TKey : notnull { if (optional.HasValue) { @@ -93,15 +97,15 @@ public static IList ToList(OptionalProperty> optional) public readonly struct OptionalProperty { - public OptionalProperty(T value) : this() + public OptionalProperty(T? value) : this() { Value = value; HasValue = true; } - public T Value { get; } + public T? Value { get; } public bool HasValue { get; } public static implicit operator OptionalProperty(T value) => new OptionalProperty(value); - public static implicit operator T(OptionalProperty optional) => optional.Value; + public static implicit operator T?(OptionalProperty optional) => optional.Value; } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs index 15f5694e0fc7..86f2ce332975 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs @@ -11,33 +11,36 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models [PersistableModelProxy(typeof(UnknownBaseModel))] public abstract class BaseModel : IJsonModel { - private Dictionary _rawData; + private readonly Dictionary _rawData; - public static implicit operator BinaryContent?(BaseModel baseModel) + protected internal BaseModel(Dictionary? rawData) + { + _rawData = rawData ?? new Dictionary(); + } + + private Dictionary GetRawData() => _rawData; + + public static implicit operator BinaryContent?(BaseModel? baseModel) { if (baseModel == null) { return null; } - return BinaryContent.Create(baseModel, ModelReaderWriterHelper.WireOptions); + return BinaryContent.Create(new NonNullable(baseModel), ModelReaderWriterHelper.WireOptions); } public static explicit operator BaseModel?(ClientResult result) { - if (result is null) throw new ArgumentNullException(nameof(result)); + if (result is null) + throw new ArgumentNullException(nameof(result)); using JsonDocument jsonDocument = JsonDocument.Parse(result.GetRawResponse().Content); return DeserializeBaseModel(jsonDocument.RootElement, ModelReaderWriterHelper.WireOptions); } - protected internal BaseModel(Dictionary? rawData) - { - _rawData = rawData ?? new Dictionary(); - } - - public string Kind { get; internal set; } - public string Name { get; set; } + public string? Kind { get; internal set; } + public string? Name { get; set; } protected internal void SerializeRawData(Utf8JsonWriter writer) { @@ -102,7 +105,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) //Deserialize unknown subtype string? kind = default; - OptionalProperty? name = null; + OptionalProperty? name = default; Dictionary rawData = new Dictionary(); foreach (var property in element.EnumerateObject()) { @@ -113,7 +116,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) } if (property.NameEquals("name"u8)) { - name = property.Value.GetString(); + name = new(property.Value.GetString()); continue; } if (options.Format == "J") @@ -144,9 +147,53 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); - return ModelReaderWriter.Write(this, options); + return ModelReaderWriter.Write(new NonNullable(this), options); } string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + private class NonNullable : BaseModel,/* IPersistableModel, */ IPersistableModel + { + private readonly BaseModel _value; + + public NonNullable(BaseModel model)//, Dictionary? rawData) + : base(model.GetRawData()) + { + ArgumentNullException.ThrowIfNull(model); + + _value = model; + } + + NonNullable IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + => new(((IPersistableModel)_value).Create(data, options)); + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).GetFormatFromOptions(options); + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).Write(options); + + //public NonNullable Create(BinaryData data, ModelReaderWriterOptions options) + //=> ((IPersistableModel)_value).Create(data, options); + + //public string GetFormatFromOptions(ModelReaderWriterOptions options) + //{ + // throw new NotImplementedException(); + //} + + //public BinaryData Write(ModelReaderWriterOptions options) + //{ + // throw new NotImplementedException(); + //} + + //BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + // => ((IPersistableModel)_value).Create(data, options); + + //string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + // => ((IPersistableModel)_value).GetFormatFromOptions(options); + + //BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + // => ((IPersistableModel)_value).Write(options); + } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs index 492b073c665f..1e58acd51c80 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs @@ -16,7 +16,7 @@ public UnknownBaseModel() Kind = "Unknown"; } - internal UnknownBaseModel(string kind, string name, Dictionary rawData) + internal UnknownBaseModel(string? kind, string? name, Dictionary rawData) : base(rawData) { Kind = kind; From a57b82d473d0ad2a480c08b41d9d939b9d2dae80 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 14:59:00 -0800 Subject: [PATCH 5/8] more changes --- .../ClientShared/ModelReaderWriterHelper.cs | 3 +- .../tests/client/ClientShared/OptionalList.cs | 4 +- .../client/ClientShared/OptionalProperty.cs | 6 +- .../tests/client/MapsClient/CountryRegion.cs | 12 ++-- .../client/MapsClient/IPAddressCountryPair.cs | 27 +++++-- .../Models/DiscriminatorSet/BaseModel.cs | 32 ++------- .../Models/DiscriminatorSet/ModelY.cs | 70 ++++++++++++++----- .../DiscriminatorSet/UnknownBaseModel.cs | 13 ++-- .../ModelReaderWriter/Models/ModelAsStruct.cs | 2 +- .../Models/ModelWithPersistableOnly.cs | 58 +++++++++++---- 10 files changed, 148 insertions(+), 79 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs index 051da0628c03..993399273882 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs @@ -21,7 +21,8 @@ public static void ValidateFormat(IPersistableModel model, string format) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void ValidateFormat(IPersistableModel model, string format) => ValidateFormat(model, format); + public static void ValidateFormat(IPersistableModel model, string format) + => ValidateFormat(model, format); private static ModelReaderWriterOptions? _wireOptions; public static ModelReaderWriterOptions WireOptions => _wireOptions ??= new ModelReaderWriterOptions("W"); diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs index b8bdc4136e23..d34d05d7fef8 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs @@ -24,7 +24,7 @@ public OptionalList(OptionalProperty> optionalList) : this(opti { } - private OptionalList(IEnumerable innerList) + private OptionalList(IEnumerable? innerList) { if (innerList == null) { @@ -34,7 +34,7 @@ private OptionalList(IEnumerable innerList) _innerList = innerList.ToList(); } - private OptionalList(IList innerList) + private OptionalList(IList? innerList) { if (innerList == null) { diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs index 8f497d3e241e..6caaa21e3253 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs @@ -48,7 +48,7 @@ public static IReadOnlyDictionary ToDictionary(Optio { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalDictionary(optional); } @@ -58,7 +58,7 @@ public static IDictionary ToDictionary(OptionalPrope { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalDictionary(optional); } @@ -100,7 +100,7 @@ public readonly struct OptionalProperty public OptionalProperty(T? value) : this() { Value = value; - HasValue = true; + HasValue = value is not null; } public T? Value { get; } diff --git a/sdk/core/System.ClientModel/tests/client/MapsClient/CountryRegion.cs b/sdk/core/System.ClientModel/tests/client/MapsClient/CountryRegion.cs index 8feb636c2efa..af0ccc36c98f 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClient/CountryRegion.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClient/CountryRegion.cs @@ -2,7 +2,6 @@ // Licensed under the MIT License. using System; -using System.ClientModel; using System.ClientModel.Primitives; using System.Text.Json; @@ -21,12 +20,12 @@ internal static CountryRegion FromJson(JsonElement element) { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CountryRegion)}'"); } - string isoCode = default; + string? isoCode = default; - foreach (var property in element.EnumerateObject()) + foreach (JsonProperty property in element.EnumerateObject()) { if (property.NameEquals("isoCode"u8)) { @@ -35,6 +34,11 @@ internal static CountryRegion FromJson(JsonElement element) } } + if (isoCode is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CountryRegion)}': Missing 'isoCode' property"); + } + return new CountryRegion(isoCode); } diff --git a/sdk/core/System.ClientModel/tests/client/MapsClient/IPAddressCountryPair.cs b/sdk/core/System.ClientModel/tests/client/MapsClient/IPAddressCountryPair.cs index 8d998c877cd1..64ab48b59d96 100644 --- a/sdk/core/System.ClientModel/tests/client/MapsClient/IPAddressCountryPair.cs +++ b/sdk/core/System.ClientModel/tests/client/MapsClient/IPAddressCountryPair.cs @@ -2,9 +2,8 @@ // Licensed under the MIT License. using System; -using System.Net; -using System.ClientModel; using System.ClientModel.Primitives; +using System.Net; using System.Text.Json; namespace Maps; @@ -25,11 +24,11 @@ internal static IPAddressCountryPair FromJson(JsonElement element) { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(IPAddressCountryPair)}'"); } - CountryRegion countryRegion = default; - IPAddress ipAddress = default; + CountryRegion? countryRegion = default; + IPAddress? ipAddress = default; foreach (var property in element.EnumerateObject()) { @@ -51,11 +50,27 @@ internal static IPAddressCountryPair FromJson(JsonElement element) continue; } - ipAddress = IPAddress.Parse(property.Value.GetString()); + string? ipAddressValue = property.Value.GetString(); + if (ipAddressValue is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(IPAddressCountryPair)}': Missing 'ipAddress' property"); + } + + ipAddress = IPAddress.Parse(ipAddressValue); continue; } } + if (countryRegion is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(IPAddressCountryPair)}': Missing 'countryRegion' property"); + } + + if (ipAddress is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(IPAddressCountryPair)}': Missing 'ipAddress' property"); + } + return new IPAddressCountryPair(countryRegion, ipAddress); } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs index 86f2ce332975..c17971d412a9 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs @@ -18,7 +18,7 @@ protected internal BaseModel(Dictionary? rawData) _rawData = rawData ?? new Dictionary(); } - private Dictionary GetRawData() => _rawData; + internal Dictionary GetRawData() => _rawData; public static implicit operator BinaryContent?(BaseModel? baseModel) { @@ -152,14 +152,14 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - private class NonNullable : BaseModel,/* IPersistableModel, */ IPersistableModel + private class NonNullable : BaseModel, IPersistableModel { private readonly BaseModel _value; - public NonNullable(BaseModel model)//, Dictionary? rawData) - : base(model.GetRawData()) + public NonNullable(BaseModel model) : base(model.GetRawData()) { - ArgumentNullException.ThrowIfNull(model); + if (model is null) + throw new ArgumentNullException(nameof(model)); _value = model; } @@ -172,28 +172,6 @@ string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOpti BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => ((IPersistableModel)_value).Write(options); - - //public NonNullable Create(BinaryData data, ModelReaderWriterOptions options) - //=> ((IPersistableModel)_value).Create(data, options); - - //public string GetFormatFromOptions(ModelReaderWriterOptions options) - //{ - // throw new NotImplementedException(); - //} - - //public BinaryData Write(ModelReaderWriterOptions options) - //{ - // throw new NotImplementedException(); - //} - - //BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) - // => ((IPersistableModel)_value).Create(data, options); - - //string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) - // => ((IPersistableModel)_value).GetFormatFromOptions(options); - - //BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) - // => ((IPersistableModel)_value).Write(options); } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs index ac42c88881ba..0d99fd3da5e5 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs @@ -1,22 +1,21 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Collections.Generic; using System.Text.Json; +using ClientModel.Tests.ClientShared; namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { - public class ModelY : BaseModel, IJsonModel + public class ModelY : BaseModel, IJsonModel { - public ModelY() - : base(null) + public ModelY() : base(null) { Kind = "Y"; } - internal ModelY(string kind, string name, string yProperty, Dictionary rawData) + internal ModelY(string kind, string? name, string? yProperty, Dictionary rawData) : base(rawData) { Kind = kind; @@ -24,9 +23,10 @@ internal ModelY(string kind, string name, string yProperty, Dictionary.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) => Serialize(writer, options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + => Serialize(writer, options); private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) { @@ -50,7 +50,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) writer.WriteEndObject(); } - internal static ModelY DeserializeModelY(JsonElement element, ModelReaderWriterOptions options = default) + internal static ModelY? DeserializeModelY(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; @@ -58,7 +58,8 @@ internal static ModelY DeserializeModelY(JsonElement element, ModelReaderWriterO { return null; } - string kind = default; + + string? kind = default; OptionalProperty name = default; OptionalProperty yProperty = default; Dictionary rawData = new Dictionary(); @@ -71,12 +72,12 @@ internal static ModelY DeserializeModelY(JsonElement element, ModelReaderWriterO } if (property.NameEquals("name"u8)) { - name = property.Value.GetString(); + name = new(property.Value.GetString()); continue; } if (property.NameEquals("yProperty"u8)) { - yProperty = property.Value.GetString(); + yProperty = new(property.Value.GetString()); continue; } if (options.Format == "J") @@ -85,27 +86,62 @@ internal static ModelY DeserializeModelY(JsonElement element, ModelReaderWriterO rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); } } + + if (kind is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(ModelY)}': Missing 'kind' property"); + } + return new ModelY(kind, name, yProperty, rawData); } - ModelY IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ModelY? IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { return DeserializeModelY(JsonDocument.Parse(data.ToString()).RootElement, options); } - ModelY IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ModelY? IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { using var doc = JsonDocument.ParseValue(ref reader); return DeserializeModelY(doc.RootElement, options); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - ModelReaderWriterHelper.ValidateFormat(this, options.Format); + NonNullable model = new(this); - return ModelReaderWriter.Write(this, options); + ModelReaderWriterHelper.ValidateFormat(model, options.Format); + return ModelReaderWriter.Write(model, options); } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + private class NonNullable : ModelY, IPersistableModel, IJsonModel + { + private readonly ModelY _value; + + public NonNullable(ModelY model) : base() + { + if (model is null) + throw new ArgumentNullException(nameof(model)); + + _value = model; + } + + NonNullable IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + => new(((IJsonModel)_value).Create(ref reader, options)); + + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + => ((IJsonModel)_value).Write(writer, options); + + NonNullable IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + => new(((IPersistableModel)_value).Create(data, options)); + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).GetFormatFromOptions(options); + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).Write(options); + } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs index 1e58acd51c80..fa300bd717e0 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs @@ -8,7 +8,7 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { - internal class UnknownBaseModel : BaseModel, IJsonModel + internal class UnknownBaseModel : BaseModel, IJsonModel { public UnknownBaseModel() : base(null) @@ -23,7 +23,7 @@ internal UnknownBaseModel(string? kind, string? name, Dictionary.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); @@ -47,16 +47,17 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) writer.WriteEndObject(); } - internal static BaseModel DeserializeUnknownBaseModel(JsonElement element, ModelReaderWriterOptions options = default) => DeserializeBaseModel(element, options); + internal static BaseModel? DeserializeUnknownBaseModel(JsonElement element, ModelReaderWriterOptions? options = default) + => DeserializeBaseModel(element, options); - BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); return DeserializeUnknownBaseModel(JsonDocument.Parse(data.ToString()).RootElement, options); } - BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); @@ -64,7 +65,7 @@ BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWri return DeserializeUnknownBaseModel(doc.RootElement, options); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelAsStruct.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelAsStruct.cs index 6e557d3acf20..937c0747f6f4 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelAsStruct.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelAsStruct.cs @@ -71,7 +71,7 @@ ModelAsStruct IPersistableModel.Create(BinaryData data, ModelRead return DeserializeInputAdditionalPropertiesModelStruct(doc.RootElement, options); } - internal static ModelAsStruct DeserializeInputAdditionalPropertiesModelStruct(JsonElement element, ModelReaderWriterOptions options = default) + internal static ModelAsStruct DeserializeInputAdditionalPropertiesModelStruct(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs index 3c02b640d74f..71b932cade57 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs @@ -12,13 +12,16 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { public class ModelWithPersistableOnly : IPersistableModel { - private Dictionary _rawData; + private readonly Dictionary _rawData; public ModelWithPersistableOnly() { + _rawData = new Dictionary(); + Fields = new List(); + KeyValuePairs = new Dictionary(); } - internal ModelWithPersistableOnly(string name, int xProperty, int? nullProperty, IList fields, IDictionary keyValuePairs, Dictionary rawData) + internal ModelWithPersistableOnly(string? name, int xProperty, int? nullProperty, IList fields, IDictionary keyValuePairs, Dictionary rawData) { Name = name; XProperty = xProperty; @@ -28,8 +31,35 @@ internal ModelWithPersistableOnly(string name, int xProperty, int? nullProperty, _rawData = rawData; } - public string Name { get; } - public int XProperty { get; } + private void AssertHasValue(T? value, string name) + { + if (value is null) + throw new ArgumentNullException(name); + } + + public string? Name { get; } + //private string? _name; + //public string Name + //{ + // get + // { + // AssertHasValue(_name, nameof(Name)); + // return _name!; + // } + // set => _name = value; + //} + + private int? _xProperty; + public int XProperty + { + get + { + AssertHasValue(_xProperty, nameof(XProperty)); + return _xProperty!.Value; + } + set => _xProperty = value; + } + public IList Fields { get; } public int? NullProperty = null; public IDictionary KeyValuePairs { get; } @@ -55,7 +85,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) if (OptionalProperty.IsDefined(NullProperty)) { writer.WritePropertyName("nullProperty"u8); - writer.WriteNumberValue(NullProperty.Value); + writer.WriteNumberValue(NullProperty!.Value); } if (OptionalProperty.IsCollectionDefined(KeyValuePairs)) { @@ -100,14 +130,15 @@ private void SerializeRawData(Utf8JsonWriter writer) } } - internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, ModelReaderWriterOptions options = default) + internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(ModelWithPersistableOnly)}'"); } + OptionalProperty name = default; int xProperty = default; OptionalProperty nullProperty = default; @@ -115,16 +146,17 @@ internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, OptionalProperty> keyValuePairs = default; Dictionary rawData = new Dictionary(); - foreach (var property in element.EnumerateObject()) + foreach (JsonProperty property in element.EnumerateObject()) { if (property.NameEquals("name"u8)) { - name = property.Value.GetString(); + name = new(property.Value.GetString()); continue; } if (property.NameEquals("fields"u8)) { - fields = property.Value.EnumerateArray().Select(element => element.GetString()).ToList(); + // TODO: May do something different depending on the semantics of expected values + fields = property.Value.EnumerateArray().Select(element => element.GetString()!).ToList(); continue; } if (property.NameEquals("nullProperty"u8)) @@ -139,9 +171,10 @@ internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, if (property.NameEquals("keyValuePairs"u8)) { Dictionary dictionary = new Dictionary(); - foreach (var property0 in property.Value.EnumerateObject()) + foreach (JsonProperty property0 in property.Value.EnumerateObject()) { - dictionary.Add(property0.Name, property0.Value.GetString()); + // TODO: May do something different depending on the semantics of expected values + dictionary.Add(property0.Name, property0.Value.GetString()!); } keyValuePairs = dictionary; continue; @@ -157,6 +190,7 @@ internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); } } + return new ModelWithPersistableOnly(name, xProperty, OptionalProperty.ToNullable(nullProperty), OptionalProperty.ToList(fields), OptionalProperty.ToDictionary(keyValuePairs), rawData); } From d7f49015a6c23962c1885d0d7862e0a2e491b7b6 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 15:44:44 -0800 Subject: [PATCH 6/8] updates --- .../ModelReaderWriterExtensions.cs | 2 +- .../client/ClientShared/OptionalDictionary.cs | 13 ++-- .../client/ClientShared/OptionalProperty.cs | 5 +- .../Models/DiscriminatorSet/ModelX.cs | 34 +++++---- .../DiscriminatorSet/UnknownBaseModel.cs | 4 +- .../ServiceModels/ResourceData.cs | 44 ++++++++++-- .../ServiceModels/SystemData.Serialization.cs | 69 +++++++++++++------ .../ServiceModels/TrackedResourceData.cs | 24 ++++++- .../WritableSubResource.Serialization.cs | 8 ++- .../ServiceModels/WritableSubResource.cs | 4 +- .../tests/client/TestData.cs | 3 +- 11 files changed, 156 insertions(+), 54 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs index f589c65c2bef..816a1a6fb1bd 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs @@ -176,7 +176,7 @@ public static void WriteNumberValue(this Utf8JsonWriter writer, DateTimeOffset v writer.WriteNumberValue(value.ToUnixTimeSeconds()); } - public static void WriteObjectValue(this Utf8JsonWriter writer, object value) + public static void WriteObjectValue(this Utf8JsonWriter writer, object? value) { switch (value) { diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs index deb6d689fb91..f5cf05d0fede 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs @@ -7,7 +7,8 @@ namespace ClientModel.Tests.ClientShared; -internal class OptionalDictionary : IDictionary, IReadOnlyDictionary where TKey : notnull +internal class OptionalDictionary : + IDictionary, IReadOnlyDictionary where TKey : notnull { private IDictionary? _innerDictionary; @@ -15,22 +16,24 @@ public OptionalDictionary() { } - public OptionalDictionary(OptionalProperty> optionalDictionary) : this(optionalDictionary.Value) + public OptionalDictionary(OptionalProperty> optionalDictionary) + : this(optionalDictionary.Value) { } - public OptionalDictionary(OptionalProperty> optionalDictionary) : this(optionalDictionary.Value) + public OptionalDictionary(OptionalProperty> optionalDictionary) + : this(optionalDictionary.Value) { } - private OptionalDictionary(IDictionary dictionary) + private OptionalDictionary(IDictionary? dictionary) { if (dictionary == null) return; _innerDictionary = new Dictionary(dictionary); } - private OptionalDictionary(IReadOnlyDictionary dictionary) + private OptionalDictionary(IReadOnlyDictionary? dictionary) { if (dictionary == null) return; diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs index 6caaa21e3253..19b08903a665 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs @@ -62,11 +62,12 @@ public static IDictionary ToDictionary(OptionalPrope } return new OptionalDictionary(optional); } + public static IReadOnlyList ToList(OptionalProperty> optional) { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalList(optional); } @@ -75,7 +76,7 @@ public static IList ToList(OptionalProperty> optional) { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalList(optional); } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs index f357e014c270..e2584f1e05a3 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs @@ -11,13 +11,14 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { public class ModelX : BaseModel, IJsonModel { - public ModelX() - : base(null) + public ModelX() : base(null) { Kind = "X"; + Fields = new List(); + KeyValuePairs = new Dictionary(); } - internal ModelX(string kind, string name, int xProperty, int? nullProperty, IList fields, IDictionary keyValuePairs, Dictionary rawData) + internal ModelX(string kind, string? name, int xProperty, int? nullProperty, IList fields, IDictionary keyValuePairs, Dictionary rawData) : base(rawData) { Kind = kind; @@ -37,7 +38,7 @@ public static implicit operator BinaryContent(ModelX modelX) { if (modelX == null) { - return null; + throw new ArgumentNullException(nameof(modelX)); } return BinaryContent.Create(modelX, ModelReaderWriterHelper.WireOptions); @@ -81,7 +82,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) if (OptionalProperty.IsDefined(NullProperty)) { writer.WritePropertyName("nullProperty"u8); - writer.WriteNumberValue(NullProperty.Value); + writer.WriteNumberValue(NullProperty!.Value); } if (OptionalProperty.IsCollectionDefined(KeyValuePairs)) { @@ -112,19 +113,20 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) writer.WriteEndObject(); } - internal static ModelX? DeserializeModelX(JsonElement element, ModelReaderWriterOptions? options = default) + internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(ModelX)}'"); } + string? kind = default; - OptionalProperty? name = default; + OptionalProperty name = default; int xProperty = default; OptionalProperty nullProperty = default; - OptionalProperty>? fields = default; + OptionalProperty> fields = default; OptionalProperty> keyValuePairs = default; Dictionary rawData = new Dictionary(); @@ -137,12 +139,13 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) } if (property.NameEquals("name"u8)) { - name = property.Value.GetString(); + name = new(property.Value.GetString()); continue; } if (property.NameEquals("fields"u8)) { - fields = property.Value.EnumerateArray().Select(element => element.GetString()).ToList(); + // TODO: May do something different depending on the semantics of expected values + fields = property.Value.EnumerateArray().Select(element => element.GetString()!).ToList(); continue; } if (property.NameEquals("nullProperty"u8)) @@ -159,7 +162,8 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) Dictionary dictionary = new Dictionary(); foreach (var property0 in property.Value.EnumerateObject()) { - dictionary.Add(property0.Name, property0.Value.GetString()); + // TODO: May do something different depending on the semantics of expected values + dictionary.Add(property0.Name, property0.Value.GetString()!); } keyValuePairs = dictionary; continue; @@ -175,6 +179,12 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) rawData.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); } } + + if (kind is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(ModelX)}': Missing 'kind' property."); + } + return new ModelX(kind, name, xProperty, OptionalProperty.ToNullable(nullProperty), OptionalProperty.ToList(fields), OptionalProperty.ToDictionary(keyValuePairs), rawData); } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs index fa300bd717e0..c7ddb0ac7674 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/UnknownBaseModel.cs @@ -50,14 +50,14 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) internal static BaseModel? DeserializeUnknownBaseModel(JsonElement element, ModelReaderWriterOptions? options = default) => DeserializeBaseModel(element, options); - BaseModel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + BaseModel? IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); return DeserializeUnknownBaseModel(JsonDocument.Parse(data.ToString()).RootElement, options); } - BaseModel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + BaseModel? IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs index 9405e896e4fe..bb510119355a 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/ResourceData.cs @@ -24,13 +24,49 @@ protected ResourceData(string id, string name, string resourceType, SystemData s SystemData = systemData; } + private void AssertHasValue(T? value, string name) + { + if (value is null) + throw new ArgumentNullException(name); + } + + private string? _id; /// Fully qualified resource ID for the resource. Ex - /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}. - public string Id { get; } + public string Id + { + get + { + AssertHasValue(_id, nameof(Id)); + return _id!; + } + private set { _id = value; } + } + + private string? _name; /// The name of the resource. - public string Name { get; } + public string Name + { + get + { + AssertHasValue(_name, nameof(Name)); + return _name!; + } + private set { _name = value; } + } + + private string? _resourceType; /// The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or "Microsoft.Storage/storageAccounts". - public string ResourceType { get; } + public string ResourceType + { + get + { + AssertHasValue(_resourceType, nameof(ResourceType)); + return _resourceType!; + } + private set { _resourceType = value; } + } + /// Azure Resource Manager metadata containing createdBy and modifiedBy information. - public SystemData SystemData { get; } + public SystemData? SystemData { get; } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs index 4caffe0450a8..9d41fd74e6d7 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Globalization; @@ -12,17 +10,18 @@ namespace System.ClientModel.Tests.Client.Models.ResourceManager { [JsonConverter(typeof(SystemDataConverter))] - public partial class SystemData : IJsonModel + public partial class SystemData : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) => Serialize(writer, options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions? options) + => Serialize(writer, options); - private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) + private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions? options) { writer.WriteStartObject(); writer.WriteEndObject(); } - internal static SystemData DeserializeSystemData(JsonElement element, ModelReaderWriterOptions options = default) + internal static SystemData? DeserializeSystemData(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; @@ -40,7 +39,7 @@ internal static SystemData DeserializeSystemData(JsonElement element, ModelReade { if (property.NameEquals("createdBy"u8)) { - createdBy = property.Value.GetString(); + createdBy = new(property.Value.GetString()); continue; } if (property.NameEquals("createdByType"u8)) @@ -63,7 +62,7 @@ internal static SystemData DeserializeSystemData(JsonElement element, ModelReade } if (property.NameEquals("lastModifiedBy"u8)) { - lastModifiedBy = property.Value.GetString(); + lastModifiedBy = new(property.Value.GetString()); continue; } if (property.NameEquals("lastModifiedByType"u8)) @@ -98,7 +97,7 @@ private struct SystemDataProperties public OptionalProperty LastModifiedOn { get; set; } } - SystemData IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + SystemData? IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { using var doc = JsonDocument.ParseValue(ref reader); return DeserializeSystemData(doc.RootElement, options); @@ -110,7 +109,9 @@ private static void SetProperty(ReadOnlySpan propertyName, ref SystemDataP { reader.Read(); if (reader.TokenType != JsonTokenType.Null) - properties.CreatedBy = reader.GetString(); + { + properties.CreatedBy = reader.GetString()!; + } return; } if (propertyName.SequenceEqual("createdByType"u8)) @@ -124,14 +125,18 @@ private static void SetProperty(ReadOnlySpan propertyName, ref SystemDataP { reader.Read(); if (reader.TokenType != JsonTokenType.Null) - properties.CreatedOn = DateTimeOffset.Parse(reader.GetString(), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + { + properties.CreatedOn = DateTimeOffset.Parse(reader.GetString()!, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + } return; } if (propertyName.SequenceEqual("lastModifiedBy"u8)) { reader.Read(); if (reader.TokenType != JsonTokenType.Null) - properties.LastModifiedBy = reader.GetString(); + { + properties.LastModifiedBy = reader.GetString()!; + } return; } if (propertyName.SequenceEqual("lastModifiedByType"u8)) @@ -145,38 +150,62 @@ private static void SetProperty(ReadOnlySpan propertyName, ref SystemDataP { reader.Read(); if (reader.TokenType != JsonTokenType.Null) - properties.LastModifiedOn = DateTimeOffset.Parse(reader.GetString(), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + { + properties.LastModifiedOn = DateTimeOffset.Parse(reader.GetString()!, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + } return; } reader.Skip(); } - SystemData IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + SystemData? IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { using var doc = JsonDocument.Parse(data); return DeserializeSystemData(doc.RootElement, options); } - internal partial class SystemDataConverter : JsonConverter + internal partial class SystemDataConverter : JsonConverter { - public override void Write(Utf8JsonWriter writer, SystemData model, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, SystemData? model, JsonSerializerOptions options) { writer.WriteObjectValue(model); } - public override SystemData Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override SystemData? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var document = JsonDocument.ParseValue(ref reader); return DeserializeSystemData(document.RootElement, ModelReaderWriterHelper.WireOptions); } } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { ModelReaderWriterHelper.ValidateFormat(this, options.Format); - return ModelReaderWriter.Write(this, options); + return ModelReaderWriter.Write(new NonNullable(this), options); } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + private class NonNullable : SystemData, IPersistableModel + { + private readonly SystemData _value; + + public NonNullable(SystemData model) : base() + { + if (model is null) + throw new ArgumentNullException(nameof(model)); + + _value = model; + } + + NonNullable IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + => new(((IPersistableModel)_value).Create(data, options)); + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).GetFormatFromOptions(options); + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + => ((IPersistableModel)_value).Write(options); + } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs index c4d6f218c68c..e0f49fa76754 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs @@ -3,13 +3,17 @@ using ClientModel.Tests.ClientShared; using System.Collections.Generic; +using System.Security.Cryptography; namespace System.ClientModel.Tests.Client.Models.ResourceManager { /// The resource model definition for an Azure Resource Manager tracked top level resource which has 'tags' and a 'location'. public abstract partial class TrackedResourceData : ResourceData { - internal TrackedResourceData() { } + internal TrackedResourceData() + { + Tags = new OptionalDictionary(); + } /// Initializes a new instance of TrackedResource. /// The geo-location where the resource lives. @@ -34,7 +38,23 @@ protected TrackedResourceData(string id, string name, string resourceType, Syste /// Resource tags. public IDictionary Tags { get; } + + private string? _location; /// The geo-location where the resource lives. - public string Location { get; set; } + public string Location + { + get + { + AssertHasValue(_location, nameof(Location)); + return _location!; + } + set { _location = value; } + } + + private void AssertHasValue(T? value, string name) + { + if (value is null) + throw new ArgumentNullException(name); + } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.Serialization.cs index 270512877fe6..edea5bb6144d 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.Serialization.cs @@ -41,11 +41,11 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) /// /// The JSON element to be deserialized. /// Deserialized WritableSubResource object. - internal static WritableSubResource DeserializeWritableSubResource(JsonElement element, ModelReaderWriterOptions options = default) + internal static WritableSubResource DeserializeWritableSubResource(JsonElement element, ModelReaderWriterOptions? options = default) { options ??= ModelReaderWriterHelper.WireOptions; - string id = default; + string? id = default; foreach (var property in element.EnumerateObject()) { if (property.NameEquals("id")) @@ -78,7 +78,9 @@ private static void SetProperty(ReadOnlySpan propertyName, ref WritableSub { reader.Read(); if (reader.TokenType != JsonTokenType.Null) - properties.Id = reader.GetString(); + { + properties.Id = reader.GetString()!; + } return; } reader.Skip(); diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.cs index 4e758acb07c7..1c9d37256537 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/WritableSubResource.cs @@ -17,7 +17,7 @@ public WritableSubResource() /// Initializes a new instance of . /// ARM resource Id. - protected internal WritableSubResource(string id) + protected internal WritableSubResource(string? id) { Id = id; } @@ -26,6 +26,6 @@ protected internal WritableSubResource(string id) /// Gets or sets the ARM resource identifier. /// /// - public string Id { get; set; } + public string? Id { get; set; } } } diff --git a/sdk/core/System.ClientModel/tests/client/TestData.cs b/sdk/core/System.ClientModel/tests/client/TestData.cs index e54cf9c49c0a..26e0afcca774 100644 --- a/sdk/core/System.ClientModel/tests/client/TestData.cs +++ b/sdk/core/System.ClientModel/tests/client/TestData.cs @@ -10,7 +10,8 @@ public static class TestData { public static string GetLocation(string fileName) { - string? testsLocation = Directory.GetParent(typeof(TestData).Assembly.Location).FullName; + string? testsLocation = (Directory.GetParent(typeof(TestData).Assembly.Location)?.FullName) + ?? throw new InvalidOperationException("Failed to find test location"); StringBuilder builder = new StringBuilder(); int indexAfter = testsLocation.IndexOf(".Tests") + 6; builder.Append(testsLocation.Substring(0, indexAfter)); From 264a9ffc49a0cbb77df74fa992103a8bac2011f5 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 16:50:26 -0800 Subject: [PATCH 7/8] updates --- .../Models/AvailabilitySetDataTestsWithVMs.cs | 4 ++-- .../ModelReaderWriter/Models/BaseModelTests.cs | 14 ++++++++------ .../Models/UnknownBaseModelTests.cs | 10 +++++----- .../Models/DiscriminatorSet/BaseModel.cs | 10 ++++++++-- .../Models/DiscriminatorSet/ModelY.cs | 16 ++++++++-------- .../ServiceModels/TrackedResourceData.cs | 3 +-- 6 files changed, 32 insertions(+), 25 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/AvailabilitySetDataTestsWithVMs.cs b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/AvailabilitySetDataTestsWithVMs.cs index bcd67e33d511..287939ffcd45 100644 --- a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/AvailabilitySetDataTestsWithVMs.cs +++ b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/AvailabilitySetDataTestsWithVMs.cs @@ -44,8 +44,8 @@ protected override void VerifyModel(AvailabilitySetData model, string format) Assert.AreEqual(3, model.PlatformFaultDomainCount); Assert.AreEqual("Classic", model.Sku.Name); Assert.AreEqual(2, model.VirtualMachines.Count); - Assert.AreEqual("/subscriptions/e37510d7-33b6-4676-886f-ee75bcc01871/resourceGroups/testRG-6497/providers/Microsoft.Compute/availabilitySets/testAS1", model.VirtualMachines[0].Id.ToString()); - Assert.AreEqual("/subscriptions/e37510d7-33b6-4676-886f-ee75bcc01871/resourceGroups/testRG-6497/providers/Microsoft.Compute/availabilitySets/testAS2", model.VirtualMachines[1].Id.ToString()); + Assert.AreEqual("/subscriptions/e37510d7-33b6-4676-886f-ee75bcc01871/resourceGroups/testRG-6497/providers/Microsoft.Compute/availabilitySets/testAS1", model.VirtualMachines[0].Id!); + Assert.AreEqual("/subscriptions/e37510d7-33b6-4676-886f-ee75bcc01871/resourceGroups/testRG-6497/providers/Microsoft.Compute/availabilitySets/testAS2", model.VirtualMachines[1].Id!); } protected override void CompareModels(AvailabilitySetData model, AvailabilitySetData model2, string format) diff --git a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/BaseModelTests.cs b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/BaseModelTests.cs index e1faa42e5e6c..3bbaae6dd738 100644 --- a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/BaseModelTests.cs +++ b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/BaseModelTests.cs @@ -7,19 +7,21 @@ namespace System.ClientModel.Tests.ModelReaderWriterTests.Models { - internal class BaseModelTests : ModelJsonTests + internal class BaseModelTests : ModelJsonTests { - protected override BaseModel GetModelInstance() + protected override BaseModel.NonNullable GetModelInstance() { - var typeToActivate = typeof(BaseModel).Assembly.GetTypes().FirstOrDefault(t => t.Name == $"Unknown{typeof(BaseModel).Name}") ?? throw new InvalidOperationException("Unable to find BaseModel type"); - return Activator.CreateInstance(typeToActivate, true) as BaseModel ?? throw new InvalidOperationException($"Unable to create model instance of BaseModel"); + Type typeToActivate = typeof(BaseModel).Assembly.GetTypes().FirstOrDefault(t => t.Name == $"Unknown{typeof(BaseModel).Name}") ?? + throw new InvalidOperationException("Unable to find BaseModel type"); + return Activator.CreateInstance(typeToActivate, true) as BaseModel.NonNullable + ?? throw new InvalidOperationException($"Unable to create model instance of BaseModel"); } protected override string JsonPayload => WirePayload; protected override string WirePayload => "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}"; - protected override void CompareModels(BaseModel model, BaseModel model2, string format) + protected override void CompareModels(BaseModel.NonNullable model, BaseModel.NonNullable model2, string format) { Assert.AreEqual(model.Name, model2.Name); Assert.AreEqual(model.Kind, model2.Kind); @@ -45,7 +47,7 @@ protected override string GetExpectedResult(string format) return expected; } - protected override void VerifyModel(BaseModel model, string format) + protected override void VerifyModel(BaseModel.NonNullable model, string format) { Assert.AreEqual("X", model.Kind); Assert.AreEqual("xmodel", model.Name); diff --git a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/UnknownBaseModelTests.cs b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/UnknownBaseModelTests.cs index b2bd6e158c26..21bbf63315ef 100644 --- a/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/UnknownBaseModelTests.cs +++ b/sdk/core/System.ClientModel/tests/ModelReaderWriter/Models/UnknownBaseModelTests.cs @@ -7,19 +7,19 @@ namespace System.ClientModel.Tests.ModelReaderWriterTests.Models { - internal class UnknownBaseModelTests : ModelJsonTests + internal class UnknownBaseModelTests : ModelJsonTests { - protected override BaseModel GetModelInstance() + protected override BaseModel.NonNullable GetModelInstance() { var typeToActivate = typeof(BaseModel).Assembly.GetTypes().FirstOrDefault(t => t.Name == $"Unknown{typeof(BaseModel).Name}") ?? throw new InvalidOperationException("Unable to find BaseModel type"); - return Activator.CreateInstance(typeToActivate, true) as BaseModel ?? throw new InvalidOperationException($"Unable to create model instance of BaseModel"); + return Activator.CreateInstance(typeToActivate, true) as BaseModel.NonNullable ?? throw new InvalidOperationException($"Unable to create model instance of BaseModel"); } protected override string JsonPayload => WirePayload; protected override string WirePayload => "{\"kind\":\"Z\",\"name\":\"zmodel\",\"zProperty\":1.5,\"extra\":\"stuff\"}"; - protected override void CompareModels(BaseModel model, BaseModel model2, string format) + protected override void CompareModels(BaseModel.NonNullable model, BaseModel.NonNullable model2, string format) { Assert.AreEqual("UnknownBaseModel", model.GetType().Name); Assert.AreEqual("UnknownBaseModel", model2.GetType().Name); @@ -46,7 +46,7 @@ protected override string GetExpectedResult(string format) return expected; } - protected override void VerifyModel(BaseModel model, string format) + protected override void VerifyModel(BaseModel.NonNullable model, string format) { Assert.AreEqual("UnknownBaseModel", model.GetType().Name); Assert.AreEqual("Z", model.Kind); diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs index c17971d412a9..c64119eafce9 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs @@ -105,7 +105,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) //Deserialize unknown subtype string? kind = default; - OptionalProperty? name = default; + OptionalProperty name = default; Dictionary rawData = new Dictionary(); foreach (var property in element.EnumerateObject()) { @@ -152,7 +152,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - private class NonNullable : BaseModel, IPersistableModel + public class NonNullable : BaseModel, IJsonModel { private readonly BaseModel _value; @@ -167,11 +167,17 @@ public NonNullable(BaseModel model) : base(model.GetRawData()) NonNullable IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => new(((IPersistableModel)_value).Create(data, options)); + NonNullable IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + => new(((IJsonModel)_value).Create(ref reader, options)); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => ((IPersistableModel)_value).GetFormatFromOptions(options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => ((IPersistableModel)_value).Write(options); + + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + => ((IJsonModel)_value).Write(writer, options); } } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs index 0d99fd3da5e5..8eb577276846 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs @@ -108,7 +108,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - NonNullable model = new(this); + NonNullableModelY model = new(this); ModelReaderWriterHelper.ValidateFormat(model, options.Format); return ModelReaderWriter.Write(model, options); @@ -116,11 +116,11 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - private class NonNullable : ModelY, IPersistableModel, IJsonModel + private class NonNullableModelY : ModelY, IPersistableModel, IJsonModel { private readonly ModelY _value; - public NonNullable(ModelY model) : base() + public NonNullableModelY(ModelY model) : base() { if (model is null) throw new ArgumentNullException(nameof(model)); @@ -128,19 +128,19 @@ public NonNullable(ModelY model) : base() _value = model; } - NonNullable IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + NonNullableModelY IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => new(((IJsonModel)_value).Create(ref reader, options)); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) => ((IJsonModel)_value).Write(writer, options); - NonNullable IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + NonNullableModelY IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => new(((IPersistableModel)_value).Create(data, options)); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => ((IPersistableModel)_value).GetFormatFromOptions(options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => ((IPersistableModel)_value).Write(options); } } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs index e0f49fa76754..365ff0f5a1bf 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/TrackedResourceData.cs @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using ClientModel.Tests.ClientShared; using System.Collections.Generic; -using System.Security.Cryptography; +using ClientModel.Tests.ClientShared; namespace System.ClientModel.Tests.Client.Models.ResourceManager { From 2eec375743a5563cb79e792736272660a5eef0b2 Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Tue, 13 Feb 2024 18:10:23 -0800 Subject: [PATCH 8/8] updates for open AI --- .../client/ClientShared/OptionalProperty.cs | 16 ++- .../Models/DiscriminatorSet/BaseModel.cs | 4 +- .../Models/DiscriminatorSet/ModelX.cs | 2 +- .../Models/DiscriminatorSet/ModelY.cs | 4 +- .../Models/ModelWithPersistableOnly.cs | 2 +- .../ServiceModels/SystemData.Serialization.cs | 4 +- .../OpenAIClient/Choice.Serialization.cs | 111 ++++++++++-------- .../tests/client/OpenAIClient/Choice.cs | 10 +- .../OpenAIClient/Completions.Serialization.cs | 44 +++++-- .../tests/client/OpenAIClient/Completions.cs | 3 - .../OpenAIClient/CompletionsFinishReason.cs | 4 +- ...etionsLogProbabilityModel.Serialization.cs | 52 ++++++-- .../CompletionsLogProbabilityModel.cs | 2 - .../CompletionsOptions.Serialization.cs | 26 ++-- .../client/OpenAIClient/CompletionsOptions.cs | 9 +- .../CompletionsUsage.Serialization.cs | 33 ++++-- .../client/OpenAIClient/CompletionsUsage.cs | 3 - .../ContentFilterResult.Serialization.cs | 69 +++++++---- .../OpenAIClient/ContentFilterResult.cs | 27 ++--- .../ContentFilterResults.Serialization.cs | 7 +- .../OpenAIClient/ContentFilterResults.cs | 12 +- .../OpenAIClient/ContentFilterSeverity.cs | 4 +- .../PromptFilterResult.Serialization.cs | 4 +- .../client/OpenAIClient/PromptFilterResult.cs | 6 +- 24 files changed, 271 insertions(+), 187 deletions(-) diff --git a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs index 19b08903a665..337e0768ce4f 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs @@ -19,9 +19,11 @@ public static bool IsCollectionDefined(IReadOnlyDictionary changeTrackingList && changeTrackingList.IsUndefined); } - public static bool IsCollectionDefined(IDictionary collection) + public static bool IsCollectionDefined(IDictionary? collection) where TKey : notnull { + if (collection is null) return false; + return !(collection is OptionalDictionary changeTrackingList && changeTrackingList.IsUndefined); } @@ -98,15 +100,17 @@ public static IList ToList(OptionalProperty> optional) public readonly struct OptionalProperty { - public OptionalProperty(T? value) : this() + public OptionalProperty(T value) : this() { Value = value; - HasValue = value is not null; } public T? Value { get; } - public bool HasValue { get; } + public bool HasValue => Value is not null; + + public static implicit operator OptionalProperty(T? value) + => value is not null ? new OptionalProperty(value) : default; - public static implicit operator OptionalProperty(T value) => new OptionalProperty(value); - public static implicit operator T?(OptionalProperty optional) => optional.Value; + public static implicit operator T?(OptionalProperty optional) + => optional.HasValue ? optional.Value : default; } diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs index c64119eafce9..df47703ce705 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/BaseModel.cs @@ -103,7 +103,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) } } - //Deserialize unknown subtype + // Deserialize unknown subtype string? kind = default; OptionalProperty name = default; Dictionary rawData = new Dictionary(); @@ -116,7 +116,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) } if (property.NameEquals("name"u8)) { - name = new(property.Value.GetString()); + name = property.Value.GetString(); continue; } if (options.Format == "J") diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs index e2584f1e05a3..03605f9bca3c 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs @@ -139,7 +139,7 @@ internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterO } if (property.NameEquals("name"u8)) { - name = new(property.Value.GetString()); + name = property.Value.GetString(); continue; } if (property.NameEquals("fields"u8)) diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs index 8eb577276846..04b3fe6102e2 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs @@ -72,12 +72,12 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions options) } if (property.NameEquals("name"u8)) { - name = new(property.Value.GetString()); + name = property.Value.GetString(); continue; } if (property.NameEquals("yProperty"u8)) { - yProperty = new(property.Value.GetString()); + yProperty = property.Value.GetString(); continue; } if (options.Format == "J") diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs index 71b932cade57..10609dd1c054 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/ModelWithPersistableOnly.cs @@ -150,7 +150,7 @@ internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, { if (property.NameEquals("name"u8)) { - name = new(property.Value.GetString()); + name = property.Value.GetString(); continue; } if (property.NameEquals("fields"u8)) diff --git a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs index 9d41fd74e6d7..da605076a50d 100644 --- a/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/ServiceModels/SystemData.Serialization.cs @@ -39,7 +39,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions? options) { if (property.NameEquals("createdBy"u8)) { - createdBy = new(property.Value.GetString()); + createdBy = property.Value.GetString(); continue; } if (property.NameEquals("createdByType"u8)) @@ -62,7 +62,7 @@ private void Serialize(Utf8JsonWriter writer, ModelReaderWriterOptions? options) } if (property.NameEquals("lastModifiedBy"u8)) { - lastModifiedBy = new(property.Value.GetString()); + lastModifiedBy = property.Value.GetString(); continue; } if (property.NameEquals("lastModifiedByType"u8)) diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs index 531c8351b1a1..79cb06d81a7c 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; @@ -10,69 +8,88 @@ namespace OpenAI; public partial class Choice +{ + internal static Choice DeserializeChoice(JsonElement element) { - internal static Choice DeserializeChoice(JsonElement element) + if (element.ValueKind == JsonValueKind.Null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Choice)}'"); + } + + string? text = default; + int? index = default; + OptionalProperty contentFilterResults = default; + CompletionsLogProbabilityModel? logprobs = default; + CompletionsFinishReason? finishReason = default; + + foreach (JsonProperty property in element.EnumerateObject()) { - if (element.ValueKind == JsonValueKind.Null) + if (property.NameEquals("text"u8)) { - return null; + text = property.Value.GetString(); + continue; } - string text = default; - int index = default; - OptionalProperty contentFilterResults = default; - CompletionsLogProbabilityModel logprobs = default; - CompletionsFinishReason? finishReason = default; - foreach (var property in element.EnumerateObject()) + + if (property.NameEquals("index"u8)) { - if (property.NameEquals("text"u8)) - { - text = property.Value.GetString(); - continue; - } - if (property.NameEquals("index"u8)) - { - index = property.Value.GetInt32(); - continue; - } - if (property.NameEquals("content_filter_results"u8)) + index = property.Value.GetInt32(); + continue; + } + + if (property.NameEquals("content_filter_results"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - contentFilterResults = ContentFilterResults.DeserializeContentFilterResults(property.Value); continue; } - if (property.NameEquals("logprobs"u8)) + contentFilterResults = ContentFilterResults.DeserializeContentFilterResults(property.Value); + continue; + } + + if (property.NameEquals("logprobs"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - logprobs = null; - continue; - } - logprobs = CompletionsLogProbabilityModel.DeserializeCompletionsLogProbabilityModel(property.Value); + logprobs = null; continue; } - if (property.NameEquals("finish_reason"u8)) + logprobs = CompletionsLogProbabilityModel.DeserializeCompletionsLogProbabilityModel(property.Value); + continue; + } + + if (property.NameEquals("finish_reason"u8)) + { + string? finishReasonValue = property.Value.GetString(); + + if (finishReasonValue is null) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - finishReason = null; - continue; - } - finishReason = new CompletionsFinishReason(property.Value.GetString()); + finishReason = null; continue; } + + finishReason = new CompletionsFinishReason(finishReasonValue); + continue; } - return new Choice(text, index, contentFilterResults.Value, logprobs, finishReason); } - /// Deserializes the model from a raw response. - /// The response to deserialize the model from. - internal static Choice FromResponse(PipelineResponse response) + if (text is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Choice)}': Missing 'text' property."); + } + + if (index is null) { - using var document = JsonDocument.Parse(response.Content); - return DeserializeChoice(document.RootElement); + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Choice)}': Missing 'index' property."); } + + return new Choice(text, index.Value, contentFilterResults.Value, logprobs, finishReason); } + /// Deserializes the model from a raw response. + /// The response to deserialize the model from. + internal static Choice FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeChoice(document.RootElement); + } +} diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs index 29219a43ea4c..d98c8c8349d0 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System; namespace OpenAI; @@ -20,7 +18,7 @@ public partial class Choice /// The log probabilities model for tokens associated with this completions choice. /// Reason for finishing. /// is null. - internal Choice(string text, int index, CompletionsLogProbabilityModel logProbabilityModel, CompletionsFinishReason? finishReason) + internal Choice(string text, int index, CompletionsLogProbabilityModel? logProbabilityModel, CompletionsFinishReason? finishReason) { if (text is null) throw new ArgumentNullException(nameof(text)); @@ -40,7 +38,7 @@ internal Choice(string text, int index, CompletionsLogProbabilityModel logProbab /// /// The log probabilities model for tokens associated with this completions choice. /// Reason for finishing. - internal Choice(string text, int index, ContentFilterResults contentFilterResults, CompletionsLogProbabilityModel logProbabilityModel, CompletionsFinishReason? finishReason) + internal Choice(string text, int index, ContentFilterResults? contentFilterResults, CompletionsLogProbabilityModel? logProbabilityModel, CompletionsFinishReason? finishReason) { Text = text; Index = index; @@ -58,9 +56,9 @@ internal Choice(string text, int index, ContentFilterResults contentFilterResult /// has been detected, as well as the severity level (very_low, low, medium, high-scale that /// determines the intensity and risk level of harmful content) and if it has been filtered or not. /// - public ContentFilterResults ContentFilterResults { get; } + public ContentFilterResults? ContentFilterResults { get; } /// The log probabilities model for tokens associated with this completions choice. - public CompletionsLogProbabilityModel LogProbabilityModel { get; } + public CompletionsLogProbabilityModel? LogProbabilityModel { get; } /// Reason for finishing. public CompletionsFinishReason? FinishReason { get; } } diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs index ee5c2dd9de39..a6712260dc56 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.Serialization.cs @@ -1,13 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; using System.Collections.Generic; using System.Text.Json; +using ClientModel.Tests.ClientShared; namespace OpenAI; @@ -17,13 +15,15 @@ internal static Completions DeserializeCompletions(JsonElement element) { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Completions)}'"); } - string id = default; - DateTimeOffset created = default; + + string? id = default; + DateTimeOffset? created = default; + IReadOnlyList? choices = default; + CompletionsUsage? usage = default; OptionalProperty> promptAnnotations = default; - IReadOnlyList choices = default; - CompletionsUsage usage = default; + foreach (var property in element.EnumerateObject()) { if (property.NameEquals("id"u8)) @@ -66,7 +66,32 @@ internal static Completions DeserializeCompletions(JsonElement element) continue; } } - return new Completions(id, created, OptionalProperty.ToList(promptAnnotations), choices, usage); + + if (id is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Completions)}': " + + "Missing 'id' property."); + } + + if (created is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Completions)}': " + + "Missing 'created' property."); + } + + if (choices is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Completions)}': " + + "Missing 'choices' property."); + } + + if (usage is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(Completions)}': " + + "Missing 'usage' property."); + } + + return new Completions(id, created!.Value, OptionalProperty.ToList(promptAnnotations), choices, usage); } /// Deserializes the model from a raw response. @@ -77,4 +102,3 @@ internal static Completions FromResponse(PipelineResponse response) return DeserializeCompletions(document.RootElement); } } - diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs index f6f29571066d..8a35baa7bf49 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; @@ -89,4 +87,3 @@ internal Completions(string id, DateTimeOffset created, IReadOnlyList Usage information for tokens processed and generated as part of this completions operation. public CompletionsUsage Usage { get; } } - diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs index 34eb6a4c6840..438bb58e1a68 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System; using System.ComponentModel; @@ -45,7 +43,7 @@ public CompletionsFinishReason(string value) /// [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is CompletionsFinishReason other && Equals(other); + public override bool Equals(object? obj) => obj is CompletionsFinishReason other && Equals(other); /// public bool Equals(CompletionsFinishReason other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs index c9c9a2a96400..7592652d7337 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.Serialization.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -using System; -using System.Collections.Generic; using System.ClientModel.Primitives; +using System.Collections.Generic; using System.Text.Json; namespace OpenAI; @@ -16,12 +13,14 @@ internal static CompletionsLogProbabilityModel DeserializeCompletionsLogProbabil { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Nested models be set to null by parent model."); } - IReadOnlyList tokens = default; - IReadOnlyList tokenLogprobs = default; - IReadOnlyList> topLogprobs = default; - IReadOnlyList textOffset = default; + + IReadOnlyList? tokens = default; + IReadOnlyList? tokenLogprobs = default; + IReadOnlyList>? topLogprobs = default; + IReadOnlyList? textOffset = default; + foreach (var property in element.EnumerateObject()) { if (property.NameEquals("tokens"u8)) @@ -29,7 +28,10 @@ internal static CompletionsLogProbabilityModel DeserializeCompletionsLogProbabil List array = new List(); foreach (var item in property.Value.EnumerateArray()) { - array.Add(item.GetString()); + string? itemValue = item.GetString() ?? + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}.'" + + "'tokens' collection contains null value"); + array.Add(itemValue); } tokens = array; continue; @@ -54,11 +56,12 @@ internal static CompletionsLogProbabilityModel DeserializeCompletionsLogProbabil if (property.NameEquals("top_logprobs"u8)) { List> array = new List>(); - foreach (var item in property.Value.EnumerateArray()) + foreach (JsonElement item in property.Value.EnumerateArray()) { if (item.ValueKind == JsonValueKind.Null) { - array.Add(null); + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}.': " + + "'top_logprobs' collection contains null key value pair."); } else { @@ -91,6 +94,31 @@ internal static CompletionsLogProbabilityModel DeserializeCompletionsLogProbabil continue; } } + + if (tokens is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}': " + + "Missing 'tokens' property."); + } + + if (tokenLogprobs is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}': " + + "Missing 'token_logprobs' property."); + } + + if (topLogprobs is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}': " + + "Missing 'top_logprobs' property."); + } + + if (textOffset is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsLogProbabilityModel)}': " + + "Missing 'text_offset' property."); + } + return new CompletionsLogProbabilityModel(tokens, tokenLogprobs, topLogprobs, textOffset); } diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs index 27e1579fc7fa..430febf996f2 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System; using System.Collections.Generic; using System.Linq; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs index 27fcf71f1a45..775eab19b114 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; @@ -25,23 +23,23 @@ private void Write(Utf8JsonWriter writer) if (OptionalProperty.IsDefined(MaxTokens)) { writer.WritePropertyName("max_tokens"u8); - writer.WriteNumberValue(MaxTokens.Value); + writer.WriteNumberValue(MaxTokens!.Value); } if (OptionalProperty.IsDefined(Temperature)) { writer.WritePropertyName("temperature"u8); - writer.WriteNumberValue(Temperature.Value); + writer.WriteNumberValue(Temperature!.Value); } if (OptionalProperty.IsDefined(NucleusSamplingFactor)) { writer.WritePropertyName("top_p"u8); - writer.WriteNumberValue(NucleusSamplingFactor.Value); + writer.WriteNumberValue(NucleusSamplingFactor!.Value); } if (OptionalProperty.IsCollectionDefined(InternalStringKeyedTokenSelectionBiases)) { writer.WritePropertyName("logit_bias"u8); writer.WriteStartObject(); - foreach (var item in InternalStringKeyedTokenSelectionBiases) + foreach (var item in InternalStringKeyedTokenSelectionBiases!) { writer.WritePropertyName(item.Key); writer.WriteNumberValue(item.Value); @@ -56,17 +54,17 @@ private void Write(Utf8JsonWriter writer) if (OptionalProperty.IsDefined(ChoicesPerPrompt)) { writer.WritePropertyName("n"u8); - writer.WriteNumberValue(ChoicesPerPrompt.Value); + writer.WriteNumberValue(ChoicesPerPrompt!.Value); } if (OptionalProperty.IsDefined(LogProbabilityCount)) { writer.WritePropertyName("logprobs"u8); - writer.WriteNumberValue(LogProbabilityCount.Value); + writer.WriteNumberValue(LogProbabilityCount!.Value); } if (OptionalProperty.IsDefined(Echo)) { writer.WritePropertyName("echo"u8); - writer.WriteBooleanValue(Echo.Value); + writer.WriteBooleanValue(Echo!.Value); } if (OptionalProperty.IsCollectionDefined(StopSequences)) { @@ -81,22 +79,22 @@ private void Write(Utf8JsonWriter writer) if (OptionalProperty.IsDefined(PresencePenalty)) { writer.WritePropertyName("presence_penalty"u8); - writer.WriteNumberValue(PresencePenalty.Value); + writer.WriteNumberValue(PresencePenalty!.Value); } if (OptionalProperty.IsDefined(FrequencyPenalty)) { writer.WritePropertyName("frequency_penalty"u8); - writer.WriteNumberValue(FrequencyPenalty.Value); + writer.WriteNumberValue(FrequencyPenalty!.Value); } if (OptionalProperty.IsDefined(GenerationSampleCount)) { writer.WritePropertyName("best_of"u8); - writer.WriteNumberValue(GenerationSampleCount.Value); + writer.WriteNumberValue(GenerationSampleCount!.Value); } if (OptionalProperty.IsDefined(InternalShouldStreamResponse)) { writer.WritePropertyName("stream"u8); - writer.WriteBooleanValue(InternalShouldStreamResponse.Value); + writer.WriteBooleanValue(InternalShouldStreamResponse!.Value); } if (OptionalProperty.IsDefined(InternalNonAzureModelName)) { @@ -114,7 +112,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWrit BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => ModelReaderWriter.Write(this, options); - + CompletionsOptions IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { throw new NotImplementedException(); diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs index 7a56cd5ebb93..8b683362554d 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; @@ -146,12 +144,12 @@ internal CompletionsOptions(IList prompts, int? maxTokens, float? temper /// a full ban or exclusive selection of a token, respectively. The exact behavior of a given bias /// score varies by model. /// - public IDictionary InternalStringKeyedTokenSelectionBiases { get; } + public IDictionary? InternalStringKeyedTokenSelectionBiases { get; } /// /// An identifier for the caller or end user of the operation. This may be used for tracking /// or rate-limiting purposes. /// - public string User { get; set; } + public string? User { get; set; } /// /// The number of completions choices that should be generated per provided prompt as part of an /// overall completions response. @@ -201,6 +199,5 @@ internal CompletionsOptions(IList prompts, int? maxTokens, float? temper /// Not applicable to Azure OpenAI, where deployment information should be included in the Azure /// resource URI that's connected to. /// - public string InternalNonAzureModelName { get; set; } + public string? InternalNonAzureModelName { get; set; } } - diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs index 4542125d1f83..e92a6fb0f406 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System; using System.ClientModel.Primitives; using System.Text.Json; @@ -15,11 +13,13 @@ internal static CompletionsUsage DeserializeCompletionsUsage(JsonElement element { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}'"); } - int completionTokens = default; - int promptTokens = default; - int totalTokens = default; + + int? completionTokens = default; + int? promptTokens = default; + int? totalTokens = default; + foreach (var property in element.EnumerateObject()) { if (property.NameEquals("completion_tokens"u8)) @@ -38,7 +38,26 @@ internal static CompletionsUsage DeserializeCompletionsUsage(JsonElement element continue; } } - return new CompletionsUsage(completionTokens, promptTokens, totalTokens); + + if (completionTokens is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}': " + + "Missing 'completion_tokens' property."); + } + + if (promptTokens is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}': " + + "Missing 'prompt_tokens' property."); + } + + if (totalTokens is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}': " + + "Missing 'total_tokens' property."); + } + + return new CompletionsUsage(completionTokens.Value, promptTokens.Value, totalTokens.Value); } /// Deserializes the model from a raw response. diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs index c59be9896e63..4cb3ecf9cc15 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - namespace OpenAI; /// @@ -30,4 +28,3 @@ internal CompletionsUsage(int completionTokens, int promptTokens, int totalToken /// The total number of tokens processed for the completions request and response. public int TotalTokens { get; } } - diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs index 9d96cef35047..c07b3b88bd92 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.Serialization.cs @@ -1,45 +1,64 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -using System; using System.ClientModel.Primitives; using System.Text.Json; + namespace OpenAI; public partial class ContentFilterResult +{ + internal static ContentFilterResult DeserializeContentFilterResult(JsonElement element) { - internal static ContentFilterResult DeserializeContentFilterResult(JsonElement element) + if (element.ValueKind == JsonValueKind.Null) { - if (element.ValueKind == JsonValueKind.Null) - { - return null; - } - ContentFilterSeverity severity = default; - bool filtered = default; - foreach (var property in element.EnumerateObject()) + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}'"); + } + + ContentFilterSeverity? severity = default; + bool? filtered = default; + + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("severity"u8)) { - if (property.NameEquals("severity"u8)) - { - severity = new ContentFilterSeverity(property.Value.GetString()); - continue; - } - if (property.NameEquals("filtered"u8)) + string? severityValue = property.Value.GetString(); + if (severityValue is null) { - filtered = property.Value.GetBoolean(); - continue; + throw new JsonException(); } + + severity = new ContentFilterSeverity(severityValue); + continue; } - return new ContentFilterResult(severity, filtered); + + if (property.NameEquals("filtered"u8)) + { + filtered = property.Value.GetBoolean(); + continue; + } + } + + if (severity is null) + { + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}': " + + "Missing 'severity' property."); } - /// Deserializes the model from a raw response. - /// The response to deserialize the model from. - internal static ContentFilterResult FromResponse(PipelineResponse response) + if (filtered is null) { - using var document = JsonDocument.Parse(response.Content); - return DeserializeContentFilterResult(document.RootElement); + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(CompletionsUsage)}': " + + "Missing 'filtered' property."); } + + return new ContentFilterResult(severity!.Value, filtered!.Value); } + /// Deserializes the model from a raw response. + /// The response to deserialize the model from. + internal static ContentFilterResult FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeContentFilterResult(document.RootElement); + } +} diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs index 95d472ced998..5f64d4b50685 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs @@ -1,25 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - namespace OpenAI; /// Information about filtered content severity level and if it has been filtered or not. public partial class ContentFilterResult +{ + /// Initializes a new instance of ContentFilterResult. + /// Ratings for the intensity and risk level of filtered content. + /// A value indicating whether or not the content has been filtered. + internal ContentFilterResult(ContentFilterSeverity severity, bool filtered) { - /// Initializes a new instance of ContentFilterResult. - /// Ratings for the intensity and risk level of filtered content. - /// A value indicating whether or not the content has been filtered. - internal ContentFilterResult(ContentFilterSeverity severity, bool filtered) - { - Severity = severity; - Filtered = filtered; - } - - /// Ratings for the intensity and risk level of filtered content. - public ContentFilterSeverity Severity { get; } - /// A value indicating whether or not the content has been filtered. - public bool Filtered { get; } + Severity = severity; + Filtered = filtered; } + /// Ratings for the intensity and risk level of filtered content. + public ContentFilterSeverity Severity { get; } + /// A value indicating whether or not the content has been filtered. + public bool Filtered { get; } +} diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs index 9f5b841b9eab..24e50bf763a9 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; @@ -15,12 +13,14 @@ internal static ContentFilterResults DeserializeContentFilterResults(JsonElement { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(ContentFilterResults)}'"); } + OptionalProperty sexual = default; OptionalProperty violence = default; OptionalProperty hate = default; OptionalProperty selfHarm = default; + foreach (var property in element.EnumerateObject()) { if (property.NameEquals("sexual"u8)) @@ -60,6 +60,7 @@ internal static ContentFilterResults DeserializeContentFilterResults(JsonElement continue; } } + return new ContentFilterResults(sexual.Value, violence.Value, hate.Value, selfHarm.Value); } diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs index 33c854231c3c..6f5d430c336f 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - namespace OpenAI; /// Information about the content filtering category, if it has been detected. @@ -35,7 +33,7 @@ internal ContentFilterResults() /// Describes language related to physical actions intended to purposely hurt, injure, /// or damage one’s body, or kill oneself. /// - internal ContentFilterResults(ContentFilterResult sexual, ContentFilterResult violence, ContentFilterResult hate, ContentFilterResult selfHarm) + internal ContentFilterResults(ContentFilterResult? sexual, ContentFilterResult? violence, ContentFilterResult? hate, ContentFilterResult? selfHarm) { Sexual = sexual; Violence = violence; @@ -49,12 +47,12 @@ internal ContentFilterResults(ContentFilterResult sexual, ContentFilterResult vi /// those portrayed as an assault or a forced sexual violent act against one’s will, /// prostitution, pornography, and abuse. /// - public ContentFilterResult Sexual { get; } + public ContentFilterResult? Sexual { get; } /// /// Describes language related to physical actions intended to hurt, injure, damage, or /// kill someone or something; describes weapons, etc. /// - public ContentFilterResult Violence { get; } + public ContentFilterResult? Violence { get; } /// /// Describes language attacks or uses that include pejorative or discriminatory language /// with reference to a person or identity group on the basis of certain differentiating @@ -62,10 +60,10 @@ internal ContentFilterResults(ContentFilterResult sexual, ContentFilterResult vi /// gender identity and expression, sexual orientation, religion, immigration status, ability /// status, personal appearance, and body size. /// - public ContentFilterResult Hate { get; } + public ContentFilterResult? Hate { get; } /// /// Describes language related to physical actions intended to purposely hurt, injure, /// or damage one’s body, or kill oneself. /// - public ContentFilterResult SelfHarm { get; } + public ContentFilterResult? SelfHarm { get; } } diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs index ee98ca0b1892..d71a74ea9a8e 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using System; using System.ComponentModel; @@ -59,7 +57,7 @@ public ContentFilterSeverity(string value) /// [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is ContentFilterSeverity other && Equals(other); + public override bool Equals(object? obj) => obj is ContentFilterSeverity other && Equals(other); /// public bool Equals(ContentFilterSeverity other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs index cbc5d3bd2117..1283ded47c9a 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; @@ -15,7 +13,7 @@ internal static PromptFilterResult DeserializePromptFilterResult(JsonElement ele { if (element.ValueKind == JsonValueKind.Null) { - return null; + throw new JsonException($"Invalid JSON provided to deserialize type '{nameof(PromptFilterResult)}'"); } int promptIndex = default; OptionalProperty contentFilterResults = default; diff --git a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs index 2db43c8a79d9..9c4d26ca12ba 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - namespace OpenAI; /// Content filtering results for a single prompt in the request. @@ -18,7 +16,7 @@ internal PromptFilterResult(int promptIndex) /// Initializes a new instance of PromptFilterResult. /// The index of this prompt in the set of prompt results. /// Content filtering results for this prompt. - internal PromptFilterResult(int promptIndex, ContentFilterResults contentFilterResults) + internal PromptFilterResult(int promptIndex, ContentFilterResults? contentFilterResults) { PromptIndex = promptIndex; ContentFilterResults = contentFilterResults; @@ -27,5 +25,5 @@ internal PromptFilterResult(int promptIndex, ContentFilterResults contentFilterR /// The index of this prompt in the set of prompt results. public int PromptIndex { get; } /// Content filtering results for this prompt. - public ContentFilterResults ContentFilterResults { get; } + public ContentFilterResults? ContentFilterResults { get; } }