Files
csharp/tests/KubernetesClient.Tests/QuantityValueTests.cs
Manuel Menegazzo f615b5b459 Fix some compilation warnings (#1010)
* Fixe some summary warning

* Fixed more warning

* Uniformed example projects code

* Uniformed test projects code

* Fix OperatingSystems enum and GenericType summaries
2022-09-15 16:21:21 -07:00

226 lines
12 KiB
C#

using k8s.Models;
using System;
using Xunit;
using static k8s.Models.ResourceQuantity.SuffixFormat;
namespace k8s.Tests
{
public class QuantityValueTests
{
[Fact]
public void Deserialize()
{
{
var q = KubernetesJson.Deserialize<ResourceQuantity>("\"12k\"");
Assert.Equal(new ResourceQuantity(12000, 0, DecimalSI), q);
}
}
[Fact]
public void Parse()
{
foreach (var (input, expect) in new[]
{
("0", new ResourceQuantity(0, 0, DecimalSI)), ("0n", new ResourceQuantity(0, 0, DecimalSI)),
("0u", new ResourceQuantity(0, 0, DecimalSI)), ("0m", new ResourceQuantity(0, 0, DecimalSI)),
("0Ki", new ResourceQuantity(0, 0, BinarySI)), ("0k", new ResourceQuantity(0, 0, DecimalSI)),
("0Mi", new ResourceQuantity(0, 0, BinarySI)), ("0M", new ResourceQuantity(0, 0, DecimalSI)),
("0Gi", new ResourceQuantity(0, 0, BinarySI)), ("0G", new ResourceQuantity(0, 0, DecimalSI)),
("0Ti", new ResourceQuantity(0, 0, BinarySI)), ("0T", new ResourceQuantity(0, 0, DecimalSI)),
// Quantity less numbers are allowed
("1", new ResourceQuantity(1, 0, DecimalSI)),
// Binary suffixes
("1Ki", new ResourceQuantity(1024, 0, BinarySI)), ("8Ki", new ResourceQuantity(8 * 1024, 0, BinarySI)),
("7Mi", new ResourceQuantity(7 * 1024 * 1024, 0, BinarySI)),
("6Gi", new ResourceQuantity(6L * 1024 * 1024 * 1024, 0, BinarySI)),
("5Ti", new ResourceQuantity(5L * 1024 * 1024 * 1024 * 1024, 0, BinarySI)),
("4Pi", new ResourceQuantity(4L * 1024 * 1024 * 1024 * 1024 * 1024, 0, BinarySI)),
("3Ei", new ResourceQuantity(3L * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, 0, BinarySI)),
("10Ti", new ResourceQuantity(10L * 1024 * 1024 * 1024 * 1024, 0, BinarySI)),
("100Ti", new ResourceQuantity(100L * 1024 * 1024 * 1024 * 1024, 0, BinarySI)),
// Decimal suffixes
("5n", new ResourceQuantity(5, -9, DecimalSI)), ("4u", new ResourceQuantity(4, -6, DecimalSI)),
("3m", new ResourceQuantity(3, -3, DecimalSI)), ("9", new ResourceQuantity(9, 0, DecimalSI)),
("8k", new ResourceQuantity(8, 3, DecimalSI)), ("50k", new ResourceQuantity(5, 4, DecimalSI)),
("7M", new ResourceQuantity(7, 6, DecimalSI)), ("6G", new ResourceQuantity(6, 9, DecimalSI)),
("5T", new ResourceQuantity(5, 12, DecimalSI)), ("40T", new ResourceQuantity(4, 13, DecimalSI)),
("300T", new ResourceQuantity(3, 14, DecimalSI)), ("2P", new ResourceQuantity(2, 15, DecimalSI)),
("1E", new ResourceQuantity(1, 18, DecimalSI)),
// Decimal exponents
("1E-3", new ResourceQuantity(1, -3, DecimalExponent)),
("1e3", new ResourceQuantity(1, 3, DecimalExponent)),
("1E6", new ResourceQuantity(1, 6, DecimalExponent)),
("1e9", new ResourceQuantity(1, 9, DecimalExponent)),
("1E12", new ResourceQuantity(1, 12, DecimalExponent)),
("1e15", new ResourceQuantity(1, 15, DecimalExponent)),
("1E18", new ResourceQuantity(1, 18, DecimalExponent)),
// Nonstandard but still parsable
("1e14", new ResourceQuantity(1, 14, DecimalExponent)),
("1e13", new ResourceQuantity(1, 13, DecimalExponent)),
("1e3", new ResourceQuantity(1, 3, DecimalExponent)),
("100.035k", new ResourceQuantity(100035, 0, DecimalSI)),
// Things that look like floating point
("0.001", new ResourceQuantity(1, -3, DecimalSI)), ("0.0005k", new ResourceQuantity(5, -1, DecimalSI)),
("0.005", new ResourceQuantity(5, -3, DecimalSI)), ("0.05", new ResourceQuantity(5, -2, DecimalSI)),
("0.5", new ResourceQuantity(5, -1, DecimalSI)), ("0.00050k", new ResourceQuantity(5, -1, DecimalSI)),
("0.00500", new ResourceQuantity(5, -3, DecimalSI)),
("0.05000", new ResourceQuantity(5, -2, DecimalSI)),
("0.50000", new ResourceQuantity(5, -1, DecimalSI)),
("0.5e0", new ResourceQuantity(5, -1, DecimalExponent)),
("0.5e-1", new ResourceQuantity(5, -2, DecimalExponent)),
("0.5e-2", new ResourceQuantity(5, -3, DecimalExponent)),
("0.5e0", new ResourceQuantity(5, -1, DecimalExponent)),
("10.035M", new ResourceQuantity(10035, 3, DecimalSI)),
("1.2e3", new ResourceQuantity(12, 2, DecimalExponent)),
("1.3E+6", new ResourceQuantity(13, 5, DecimalExponent)),
("1.40e9", new ResourceQuantity(14, 8, DecimalExponent)),
("1.53E12", new ResourceQuantity(153, 10, DecimalExponent)),
("1.6e15", new ResourceQuantity(16, 14, DecimalExponent)),
("1.7E18", new ResourceQuantity(17, 17, DecimalExponent)),
("9.01", new ResourceQuantity(901, -2, DecimalSI)), ("8.1k", new ResourceQuantity(81, 2, DecimalSI)),
("7.123456M", new ResourceQuantity(7123456, 0, DecimalSI)),
("6.987654321G", new ResourceQuantity(6987654321, 0, DecimalSI)),
("5.444T", new ResourceQuantity(5444, 9, DecimalSI)),
("40.1T", new ResourceQuantity(401, 11, DecimalSI)),
("300.2T", new ResourceQuantity(3002, 11, DecimalSI)),
("2.5P", new ResourceQuantity(25, 14, DecimalSI)), ("1.01E", new ResourceQuantity(101, 16, DecimalSI)),
// Things that saturate/round
("3.001n", new ResourceQuantity(4, -9, DecimalSI)),
("1.1E-9", new ResourceQuantity(2, -9, DecimalExponent)),
("0.0000000001", new ResourceQuantity(1, -9, DecimalSI)),
("0.0000000005", new ResourceQuantity(1, -9, DecimalSI)),
("0.00000000050", new ResourceQuantity(1, -9, DecimalSI)),
("0.5e-9", new ResourceQuantity(1, -9, DecimalExponent)),
("0.9n", new ResourceQuantity(1, -9, DecimalSI)),
("0.00000012345", new ResourceQuantity(124, -9, DecimalSI)),
("0.00000012354", new ResourceQuantity(124, -9, DecimalSI)),
("9Ei", new ResourceQuantity(ResourceQuantity.MaxAllowed, 0, BinarySI)),
("9223372036854775807Ki", new ResourceQuantity(ResourceQuantity.MaxAllowed, 0, BinarySI)),
("12E", new ResourceQuantity(12, 18, DecimalSI)),
// We'll accept fractional binary stuff, too.
("100.035Ki", new ResourceQuantity(10243584, -2, BinarySI)),
("0.5Mi", new ResourceQuantity(.5m * 1024 * 1024, 0, BinarySI)),
("0.05Gi", new ResourceQuantity(536870912, -1, BinarySI)),
("0.025Ti", new ResourceQuantity(274877906944, -1, BinarySI)),
// Things written by trolls
("0.000000000001Ki", new ResourceQuantity(2, -9, DecimalSI)), // rounds up, changes format
(".001", new ResourceQuantity(1, -3, DecimalSI)), (".0001k", new ResourceQuantity(100, -3, DecimalSI)),
("1.", new ResourceQuantity(1, 0, DecimalSI)), ("1.G", new ResourceQuantity(1, 9, DecimalSI)),
})
{
Assert.Equal(expect.ToString(), new ResourceQuantity(input).ToString());
}
foreach (var s in new[]
{
"1.1.M", "1+1.0M", "0.1mi", "0.1am", "aoeu", ".5i", "1i", "-3.01i", "-3.01e-",
// TODO support trailing whitespace is forbidden
// " 1",
// "1 "
})
{
Assert.ThrowsAny<Exception>(() => { new ResourceQuantity(s); });
}
}
[Fact]
public void ConstructorTest()
{
Assert.Throws<FormatException>(() => new ResourceQuantity(string.Empty));
}
[Fact]
public void QuantityString()
{
foreach (var (input, expect, alternate) in new[]
{
(new ResourceQuantity(1024 * 1024 * 1024, 0, BinarySI), "1Gi", "1024Mi"),
(new ResourceQuantity(300 * 1024 * 1024, 0, BinarySI), "300Mi", "307200Ki"),
(new ResourceQuantity(6 * 1024, 0, BinarySI), "6Ki", ""),
(new ResourceQuantity(1001 * 1024 * 1024 * 1024L, 0, BinarySI), "1001Gi", "1025024Mi"),
(new ResourceQuantity(1024 * 1024 * 1024 * 1024L, 0, BinarySI), "1Ti", "1024Gi"),
(new ResourceQuantity(5, 0, BinarySI), "5", "5000m"),
(new ResourceQuantity(500, -3, BinarySI), "500m", "0.5"),
(new ResourceQuantity(1, 9, DecimalSI), "1G", "1000M"),
(new ResourceQuantity(1000, 6, DecimalSI), "1G", "0.001T"),
(new ResourceQuantity(1000000, 3, DecimalSI), "1G", ""),
(new ResourceQuantity(1000000000, 0, DecimalSI), "1G", ""),
(new ResourceQuantity(1, -3, DecimalSI), "1m", "1000u"),
(new ResourceQuantity(80, -3, DecimalSI), "80m", ""),
(new ResourceQuantity(1080, -3, DecimalSI), "1080m", "1.08"),
(new ResourceQuantity(108, -2, DecimalSI), "1080m", "1080000000n"),
(new ResourceQuantity(10800, -4, DecimalSI), "1080m", ""),
(new ResourceQuantity(300, 6, DecimalSI), "300M", ""),
(new ResourceQuantity(1, 12, DecimalSI), "1T", ""),
(new ResourceQuantity(1234567, 6, DecimalSI), "1234567M", ""),
(new ResourceQuantity(1234567, -3, BinarySI), "1234567m", ""),
(new ResourceQuantity(3, 3, DecimalSI), "3k", ""),
(new ResourceQuantity(1025, 0, BinarySI), "1025", ""),
(new ResourceQuantity(0, 0, DecimalSI), "0", ""), (new ResourceQuantity(0, 0, BinarySI), "0", ""),
(new ResourceQuantity(1, 9, DecimalExponent), "1e9", ".001e12"),
(new ResourceQuantity(1, -3, DecimalExponent), "1e-3", "0.001e0"),
(new ResourceQuantity(1, -9, DecimalExponent), "1e-9", "1000e-12"),
(new ResourceQuantity(80, -3, DecimalExponent), "80e-3", ""),
(new ResourceQuantity(300, 6, DecimalExponent), "300e6", ""),
(new ResourceQuantity(1, 12, DecimalExponent), "1e12", ""),
(new ResourceQuantity(1, 3, DecimalExponent), "1e3", ""),
(new ResourceQuantity(3, 3, DecimalExponent), "3e3", ""),
(new ResourceQuantity(3, 3, DecimalSI), "3k", ""),
(new ResourceQuantity(0, 0, DecimalExponent), "0", "00"),
(new ResourceQuantity(1, -9, DecimalSI), "1n", ""),
(new ResourceQuantity(80, -9, DecimalSI), "80n", ""),
(new ResourceQuantity(1080, -9, DecimalSI), "1080n", ""),
(new ResourceQuantity(108, -8, DecimalSI), "1080n", ""),
(new ResourceQuantity(10800, -10, DecimalSI), "1080n", ""),
(new ResourceQuantity(1, -6, DecimalSI), "1u", ""),
(new ResourceQuantity(80, -6, DecimalSI), "80u", ""),
(new ResourceQuantity(1080, -6, DecimalSI), "1080u", ""),
})
{
Assert.Equal(expect, input.ToString());
Assert.Equal(expect, new ResourceQuantity(expect).ToString());
if (string.IsNullOrEmpty(alternate))
{
continue;
}
Assert.Equal(expect, new ResourceQuantity(alternate).ToString());
}
}
[Fact]
public void Serialize()
{
{
ResourceQuantity quantity = 12000;
Assert.Equal("\"12e3\"", KubernetesJson.Serialize(quantity));
}
}
[Fact]
public void DeserializeYaml()
{
var value = KubernetesYaml.Deserialize<ResourceQuantity>("\"1\"");
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
}
[Fact]
public void SerializeYaml()
{
var value = KubernetesYaml.Serialize(new ResourceQuantity(1, -1, DecimalSI));
Assert.Equal("100m", value);
}
}
}