Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Text.Json;
using Azure.Core;

namespace Azure.ResourceManager.Core
{
/// <summary>
/// A class representing SKU for resource.
/// </summary>
public sealed partial class Sku : IUtf8JsonSerializable
{
/// <summary>
/// Serialize the input Sku object.
/// </summary>
/// <param name="writer"> Input Json writer. </param>
void IUtf8JsonSerializable.Write(Utf8JsonWriter writer)
{
if (writer is null)
{
throw new ArgumentNullException(nameof(writer));
}

writer.WriteStartObject();
if (Optional.IsDefined(Name))
{
writer.WritePropertyName("name");
writer.WriteStringValue(Name);
}
if (Optional.IsDefined(Tier))
{
writer.WritePropertyName("tier");
writer.WriteStringValue(Tier);
}
if (Optional.IsDefined(Size))
{
writer.WritePropertyName("size");
writer.WriteStringValue(Size);
}
if (Optional.IsDefined(Family))
{
writer.WritePropertyName("family");
writer.WriteStringValue(Family);
}
if (Optional.IsDefined(Capacity))
{
writer.WritePropertyName("capacity");
writer.WriteNumberValue(Capacity.Value);
}
writer.WriteEndObject();
}

/// <summary>
/// Deserialize the input Json object.
/// </summary>
/// <param name="element"> The Json object need to be deserialized. </param>
internal static Sku DeserializeSku(JsonElement element)
{
Optional<string> name = default;
Optional<string> tier = default;
Optional<string> size = default;
Optional<string> family = default;
Optional<int> capacity = default;
foreach (var property in element.EnumerateObject())
{
if (property.NameEquals("name"))
{
name = property.Value.GetString();
continue;
}
if (property.NameEquals("tier"))
{
tier = property.Value.GetString();
continue;
}
if (property.NameEquals("size"))
{
size = property.Value.GetString();
continue;
}
if (property.NameEquals("family"))
{
family = property.Value.GetString();
continue;
}
if (property.NameEquals("capacity"))
{
if (property.Value.ValueKind == JsonValueKind.Null)
{
property.ThrowNonNullablePropertyIsNull();
continue;
}
capacity = property.Value.GetInt32();
continue;
}
}

return new Sku(name.Value, tier.Value, family.Value, size.Value, Optional.ToNullable(capacity));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
// Licensed under the MIT License.

using System;
using Azure.ResourceManager.Resources.Models;

namespace Azure.ResourceManager.Core
{
/// <summary>
/// A class representing SKU for resource
/// A class representing SKU for resource.
/// </summary>
public sealed class Sku : IEquatable<Sku>, IComparable<Sku>
public sealed partial class Sku : IEquatable<Sku>, IComparable<Sku>
{
/// <summary>
/// Initializes a new instance of the <see cref="Sku"/> class.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
using NUnit.Framework;
using System.IO;
using System.Text;
using System.Text.Json;
using Azure.Core;
using NUnit.Framework;

namespace Azure.ResourceManager.Core.Tests
{
Expand Down Expand Up @@ -225,5 +229,56 @@ public void EqualsToSameSkus()
Sku sku2 = sku1;
Assert.IsTrue(sku1.Equals(sku2));
}

[Test]
public void SerializationTest()
{
string expected = "{\"properties\":{\"name\":\"NameForSku\",\"tier\":\"TierForSku\",\"size\":\"SizeForSku\",\"family\":\"FamilyForSku\",\"capacity\":123456789}}";
Sku sku = new("NameForSku", "TierForSku", "FamilyForSku", "SizeForSku", 123456789);
var stream = new MemoryStream();
Utf8JsonWriter writer = new(stream, new JsonWriterOptions());
writer.WriteStartObject();
writer.WritePropertyName("properties");
writer.WriteObjectValue(sku);
writer.WriteEndObject();
writer.Flush();
string json = Encoding.UTF8.GetString(stream.ToArray());
Assert.IsTrue(expected.Equals(json));
}

[Test]
public void InvalidSerializationTest()
{
Sku sku = new(null, null, null, null);
var stream = new MemoryStream();
Utf8JsonWriter writer = new(stream, new JsonWriterOptions());
writer.WriteStartObject();
writer.WritePropertyName("properties");
writer.WriteObjectValue(sku);
writer.WriteEndObject();
writer.Flush();
string json = Encoding.UTF8.GetString(stream.ToArray());
Assert.IsTrue(json.Equals("{\"properties\":{}}"));
}

[Test]
public void DeserializationTest()
{
string json = "{\"name\":\"NameForSku\",\"tier\":\"TierForSku\",\"size\":\"SizeForSku\",\"family\":\"FamilyForSku\",\"capacity\":123456789}";
JsonElement element = JsonDocument.Parse(json).RootElement;
Sku sku = Sku.DeserializeSku(element);
Assert.IsTrue(sku.Name.Equals("NameForSku"));
Assert.IsTrue(sku.Capacity == 123456789);
}

[Test]
public void InvalidDeserializationTest()
{
string json = "{\"name\":\"NameForSku\",\"notTier\":\"TierForSku\",\"size\":\"SizeForSku\",\"family\":\"FamilyForSku\"}";
JsonElement element = JsonDocument.Parse(json).RootElement;
Sku sku = Sku.DeserializeSku(element);
Assert.IsTrue(sku.Tier == null);
Assert.IsTrue(sku.Capacity == null);
}
}
}