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/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/ClientShared/ModelReaderWriterExtensions.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterExtensions.cs index b4ad891ec481..816a1a6fb1bd 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; @@ -178,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/ModelReaderWriterHelper.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs index 01aec41339bd..993399273882 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/ModelReaderWriterHelper.cs @@ -21,8 +21,9 @@ 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; + 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..f5cf05d0fede 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalDictionary.cs @@ -5,11 +5,10 @@ using System.Collections; using System.Collections.Generic; -#nullable enable - namespace ClientModel.Tests.ClientShared; -internal class OptionalDictionary : IDictionary, IReadOnlyDictionary where TKey : notnull +internal class OptionalDictionary : + IDictionary, IReadOnlyDictionary where TKey : notnull { private IDictionary? _innerDictionary; @@ -17,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/OptionalList.cs b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalList.cs index 0460b0cebc49..d34d05d7fef8 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 @@ -26,7 +24,7 @@ public OptionalList(OptionalProperty> optionalList) : this(opti { } - private OptionalList(IEnumerable innerList) + private OptionalList(IEnumerable? innerList) { if (innerList == null) { @@ -36,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 d86de7e9627e..337e0768ce4f 100644 --- a/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs +++ b/sdk/core/System.ClientModel/tests/client/ClientShared/OptionalProperty.cs @@ -14,12 +14,16 @@ 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) + public static bool IsCollectionDefined(IDictionary? collection) + where TKey : notnull { + if (collection is null) return false; + return !(collection is OptionalDictionary changeTrackingList && changeTrackingList.IsUndefined); } @@ -31,7 +35,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,27 +46,30 @@ public static bool IsDefined(JsonElement value) } public static IReadOnlyDictionary ToDictionary(OptionalProperty> optional) + where TKey : notnull { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalDictionary(optional); } public static IDictionary ToDictionary(OptionalProperty> optional) + where TKey : notnull { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalDictionary(optional); } + public static IReadOnlyList ToList(OptionalProperty> optional) { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalList(optional); } @@ -71,7 +78,7 @@ public static IList ToList(OptionalProperty> optional) { if (optional.HasValue) { - return optional.Value; + return optional.Value!; } return new OptionalList(optional); } @@ -96,12 +103,14 @@ public readonly struct OptionalProperty public OptionalProperty(T value) : this() { Value = value; - HasValue = true; } - public T Value { get; } - public bool HasValue { get; } + public T? Value { 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/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/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/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/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..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 @@ -9,35 +9,38 @@ namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models { [PersistableModelProxy(typeof(UnknownBaseModel))] - public abstract class BaseModel : IJsonModel + 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(); + } + + internal 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) + 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) { @@ -53,7 +56,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 +80,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 +91,7 @@ internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderW { return null; } + if (element.TryGetProperty("kind", out JsonElement discriminator)) { switch (discriminator.GetString()) @@ -99,8 +103,8 @@ internal static BaseModel DeserializeBaseModel(JsonElement element, ModelReaderW } } - //Deserialize unknown subtype - string kind = default; + // Deserialize unknown subtype + string? kind = default; OptionalProperty name = default; Dictionary rawData = new Dictionary(); foreach (var property in element.EnumerateObject()) @@ -124,14 +128,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 +143,41 @@ 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(new NonNullable(this), options); } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + public class NonNullable : BaseModel, IJsonModel + { + private readonly BaseModel _value; + + public NonNullable(BaseModel model) : base(model.GetRawData()) + { + if (model is null) + throw new ArgumentNullException(nameof(model)); + + _value = model; + } + + 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/ModelX.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelX.cs index b381b2bbaf60..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 @@ -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,15 +113,16 @@ 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; + + string? kind = default; OptionalProperty name = default; int xProperty = default; OptionalProperty nullProperty = default; @@ -142,7 +144,8 @@ internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterO } 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 @@ internal static ModelX DeserializeModelX(JsonElement element, ModelReaderWriterO 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 @@ internal static ModelX DeserializeModelX(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(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/ModelY.cs b/sdk/core/System.ClientModel/tests/client/ModelReaderWriter/Models/DiscriminatorSet/ModelY.cs index ac42c88881ba..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 @@ -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(); @@ -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); + NonNullableModelY 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 NonNullableModelY : ModelY, IPersistableModel, IJsonModel + { + private readonly ModelY _value; + + public NonNullableModelY(ModelY model) : base() + { + if (model is null) + throw new ArgumentNullException(nameof(model)); + + _value = model; + } + + NonNullableModelY 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); + + NonNullableModelY 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 492b073c665f..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 @@ -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) @@ -16,14 +16,14 @@ public UnknownBaseModel() Kind = "Unknown"; } - internal UnknownBaseModel(string kind, string name, Dictionary rawData) + internal UnknownBaseModel(string? kind, string? name, Dictionary rawData) : base(rawData) { Kind = kind; Name = name; } - void IJsonModel.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..10609dd1c054 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,7 +146,7 @@ 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)) { @@ -124,7 +155,8 @@ internal static ModelWithPersistableOnly DeserializeModelX(JsonElement element, } 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); } 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..bb510119355a 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. @@ -26,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/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..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 @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Globalization; @@ -14,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; @@ -100,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); @@ -112,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)) @@ -126,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)) @@ -147,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/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..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,17 +1,18 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#nullable disable - -using ClientModel.Tests.ClientShared; using System.Collections.Generic; +using ClientModel.Tests.ClientShared; 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. @@ -36,7 +37,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/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..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,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; @@ -12,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 ae6870df1557..d98c8c8349d0 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Choice.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System; namespace OpenAI; @@ -22,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)); @@ -42,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; @@ -60,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 ff08627275d4..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,15 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - -using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; using System.Collections.Generic; using System.Text.Json; +using ClientModel.Tests.ClientShared; namespace OpenAI; @@ -19,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)) @@ -68,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. @@ -79,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 192cda68a433..8a35baa7bf49 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/Completions.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; @@ -91,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 10fa890ccf6f..438bb58e1a68 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsFinishReason.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System; using System.ComponentModel; @@ -47,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 8f5a70a3fd33..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,13 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - -using System; -using System.Collections.Generic; using System.ClientModel.Primitives; +using System.Collections.Generic; using System.Text.Json; namespace OpenAI; @@ -18,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)) @@ -31,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; @@ -56,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 { @@ -93,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 67f9a6af1964..430febf996f2 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsLogProbabilityModel.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#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..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,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.ClientModel.Primitives; @@ -27,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); @@ -58,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)) { @@ -83,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)) { @@ -116,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 5dc314e9aa0f..8b683362554d 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsOptions.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using ClientModel.Tests.ClientShared; using System; using System.Collections.Generic; @@ -148,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. @@ -203,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 d6c12fa9c8a6..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,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System; using System.ClientModel.Primitives; using System.Text.Json; @@ -17,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)) @@ -40,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 2fbe6aecc99d..4cb3ecf9cc15 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/CompletionsUsage.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - namespace OpenAI; /// @@ -32,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 fe9130d81956..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,47 +1,64 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - -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 f106fe4f9df2..5f64d4b50685 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResult.cs @@ -1,27 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - 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 0db04534ae27..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,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System.ClientModel.Primitives; using System.Text.Json; using ClientModel.Tests.ClientShared; @@ -17,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)) @@ -62,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 063e5e10cc10..6f5d430c336f 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterResults.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - namespace OpenAI; /// Information about the content filtering category, if it has been detected. @@ -37,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; @@ -51,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 @@ -64,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 5c3c84310fb1..d71a74ea9a8e 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/ContentFilterSeverity.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using System; using System.ComponentModel; @@ -61,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/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/OpenAIClient/PromptFilterResult.Serialization.cs b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.Serialization.cs index 4434b137e592..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,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - using ClientModel.Tests.ClientShared; using System.ClientModel.Primitives; using System.Text.Json; @@ -17,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 7d79d5ac71eb..9c4d26ca12ba 100644 --- a/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs +++ b/sdk/core/System.ClientModel/tests/client/OpenAIClient/PromptFilterResult.cs @@ -1,10 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// - -#nullable disable - namespace OpenAI; /// Content filtering results for a single prompt in the request. @@ -20,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; @@ -29,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; } } 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/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 diff --git a/sdk/core/System.ClientModel/tests/client/TestData.cs b/sdk/core/System.ClientModel/tests/client/TestData.cs index 9fb857da85f8..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)); 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 - - - - - - - - - - - - - -