diff --git a/IOUtils.Tests/EncoderTests/Base10Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base10Tests.cs similarity index 68% rename from IOUtils.Tests/EncoderTests/Base10Tests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base10Tests.cs index c2bc6c2..73f7016 100644 --- a/IOUtils.Tests/EncoderTests/Base10Tests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base10Tests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base10Tests { private const string TestEncodedValue = "1415934836"; @@ -9,7 +10,7 @@ public class Base10Tests { [Test] public void Base10_Encode_Test_ReturnsEncodedString() { - string actual = Base10Encoder.Encode(TestRawValues.TestBytes); + string actual = Encoder.Base10.Encode(TestRawValues.TestBytes); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -18,14 +19,14 @@ public void Base10_Encode_Test_ReturnsEncodedString() { public void Base10_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base10Encoder.Decode(TestEncodedValue); + byte[] actual = Encoder.Base10.Decode(TestEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base10_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base10Encoder.Encode(TestRawValues.HelloWorldBytes); + string actual = Encoder.Base10.Encode(TestRawValues.HelloWorldBytes); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -34,14 +35,14 @@ public void Base10_Encode_HelloWorld_ReturnsEncodedString() { public void Base10_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base10Encoder.Decode(HelloWorldEncodedValue); + byte[] actual = Encoder.Base10.Decode(HelloWorldEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base10_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base10Encoder.Encode(TestRawValues.EmptyBytes); + string actual = Encoder.Base10.Encode(TestRawValues.EmptyBytes); Assert.That(actual, Is.Empty); } @@ -50,13 +51,13 @@ public void Base10_Encode_EmptyArray_ReturnsEmptyString() { public void Base10_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base10Encoder.Decode(string.Empty); + byte[] actual = Encoder.Base10.Decode(string.Empty); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base10_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base10Encoder.Decode("1379A")); + Assert.Throws(() => Encoder.Base10.Decode("1379A")); } } \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/Base16Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base16Tests.cs similarity index 67% rename from IOUtils.Tests/EncoderTests/Base16Tests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base16Tests.cs index dd00a0d..72bb007 100644 --- a/IOUtils.Tests/EncoderTests/Base16Tests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base16Tests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base16Tests { private const string TestEncodedValue = "54657374"; @@ -9,7 +10,7 @@ public class Base16Tests { [Test] public void Base16_Encode_Test_ReturnsEncodedString() { - string actual = Base16Encoder.Encode(TestRawValues.TestBytes); + string actual = Encoder.Base16.Encode(TestRawValues.TestBytes); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -18,14 +19,14 @@ public void Base16_Encode_Test_ReturnsEncodedString() { public void Base16_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base16Encoder.Decode(TestEncodedValue); + byte[] actual = Encoder.Base16.Decode(TestEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base16_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base16Encoder.Encode(TestRawValues.HelloWorldBytes); + string actual = Encoder.Base16.Encode(TestRawValues.HelloWorldBytes); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -34,14 +35,14 @@ public void Base16_Encode_HelloWorld_ReturnsEncodedString() { public void Base16_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base16Encoder.Decode(HelloWorldEncodedValue); + byte[] actual = Encoder.Base16.Decode(HelloWorldEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base16_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base16Encoder.Encode(TestRawValues.EmptyBytes); + string actual = Encoder.Base16.Encode(TestRawValues.EmptyBytes); Assert.That(actual, Is.Empty); } @@ -50,13 +51,13 @@ public void Base16_Encode_EmptyArray_ReturnsEmptyString() { public void Base16_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base16Encoder.Decode(string.Empty); + byte[] actual = Encoder.Base16.Decode(string.Empty); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base16_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base16Encoder.Decode("1379ADG")); + Assert.Throws(() => Encoder.Base16.Decode("1379ADG")); } } \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/Base2Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base2Tests.cs similarity index 69% rename from IOUtils.Tests/EncoderTests/Base2Tests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base2Tests.cs index 5574af0..c39c49e 100644 --- a/IOUtils.Tests/EncoderTests/Base2Tests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base2Tests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base2Tests { private const string TestEncodedValue = "1010100011001010111001101110100"; @@ -9,7 +10,7 @@ public class Base2Tests { [Test] public void Base2_Encode_Test_ReturnsEncodedString() { - string actual = Base2Encoder.Encode(TestRawValues.TestBytes); + string actual = Encoder.Base2.Encode(TestRawValues.TestBytes); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -18,14 +19,14 @@ public void Base2_Encode_Test_ReturnsEncodedString() { public void Base2_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base2Encoder.Decode(TestEncodedValue); + byte[] actual = Encoder.Base2.Decode(TestEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base2_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base2Encoder.Encode(TestRawValues.HelloWorldBytes); + string actual = Encoder.Base2.Encode(TestRawValues.HelloWorldBytes); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -34,14 +35,14 @@ public void Base2_Encode_HelloWorld_ReturnsEncodedString() { public void Base2_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base2Encoder.Decode(HelloWorldEncodedValue); + byte[] actual = Encoder.Base2.Decode(HelloWorldEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base2_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base2Encoder.Encode(TestRawValues.EmptyBytes); + string actual = Encoder.Base2.Encode(TestRawValues.EmptyBytes); Assert.That(actual, Is.Empty); } @@ -50,13 +51,13 @@ public void Base2_Encode_EmptyArray_ReturnsEmptyString() { public void Base2_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base2Encoder.Decode(string.Empty); + byte[] actual = Encoder.Base2.Decode(string.Empty); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base2_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base2Encoder.Decode("10X")); + Assert.Throws(() => Encoder.Base2.Decode("10X")); } } \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/Base36Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base36Tests.cs similarity index 66% rename from IOUtils.Tests/EncoderTests/Base36Tests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base36Tests.cs index 2067b35..a3d8702 100644 --- a/IOUtils.Tests/EncoderTests/Base36Tests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base36Tests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base36Tests { private const string TestEncodedValue = "NF0EB8"; @@ -9,7 +10,7 @@ public class Base36Tests { [Test] public void Base36_Encode_Test_ReturnsEncodedString() { - string actual = Base36Encoder.Encode(TestRawValues.TestBytes); + string actual = Encoder.Base36.Encode(TestRawValues.TestBytes); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -18,14 +19,14 @@ public void Base36_Encode_Test_ReturnsEncodedString() { public void Base36_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base36Encoder.Decode(TestEncodedValue); + byte[] actual = Encoder.Base36.Decode(TestEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base36_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base36Encoder.Encode(TestRawValues.HelloWorldBytes); + string actual = Encoder.Base36.Encode(TestRawValues.HelloWorldBytes); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -34,14 +35,14 @@ public void Base36_Encode_HelloWorld_ReturnsEncodedString() { public void Base36_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base36Encoder.Decode(HelloWorldEncodedValue); + byte[] actual = Encoder.Base36.Decode(HelloWorldEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base36_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base36Encoder.Encode(TestRawValues.EmptyBytes); + string actual = Encoder.Base36.Encode(TestRawValues.EmptyBytes); Assert.That(actual, Is.Empty); } @@ -50,13 +51,13 @@ public void Base36_Encode_EmptyArray_ReturnsEmptyString() { public void Base36_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base36Encoder.Decode(string.Empty); + byte[] actual = Encoder.Base36.Decode(string.Empty); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base36_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base36Encoder.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!")); + Assert.Throws(() => Encoder.Base36.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!")); } } \ No newline at end of file diff --git a/IOUtils.Tests/DataTests/EncoderTests/Base62Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base62Tests.cs new file mode 100644 index 0000000..d24065f --- /dev/null +++ b/IOUtils.Tests/DataTests/EncoderTests/Base62Tests.cs @@ -0,0 +1,63 @@ +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; +using NUnit.Framework; + +namespace IOUtils.Tests.DataTests.EncoderTests; + +public class Base62Tests { + private const string TestEncodedValue = "1Xp7Ke"; + private const string HelloWorldEncodedValue = "1wJfrzvdbtXUOlUjUf"; + + [Test] + public void Base62_Encode_Test_ReturnsEncodedString() { + string actual = Encoder.Base62.Encode(TestRawValues.TestBytes); + + Assert.That(actual, Is.EqualTo(TestEncodedValue)); + } + + [Test] + public void Base62_Decode_Test_ReturnsDecodedBytes() { + byte[] expected = TestRawValues.TestBytes; + + byte[] actual = Encoder.Base62.Decode(TestEncodedValue); + + Assert.That(actual, Is.EqualTo(expected)); + } + + [Test] + public void Base62_Encode_HelloWorld_ReturnsEncodedString() { + string actual = Encoder.Base62.Encode(TestRawValues.HelloWorldBytes); + + Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); + } + + [Test] + public void Base62_Decode_HelloWorld_ReturnsDecodedBytes() { + byte[] expected = TestRawValues.HelloWorldBytes; + + byte[] actual = Encoder.Base62.Decode(HelloWorldEncodedValue); + + Assert.That(actual, Is.EqualTo(expected)); + } + + [Test] + public void Base62_Encode_EmptyArray_ReturnsEmptyString() { + string actual = Encoder.Base62.Encode(TestRawValues.EmptyBytes); + + Assert.That(actual, Is.Empty); + } + + [Test] + public void Base62_Decode_EmptyString_ReturnsEmptyArray() { + byte[] expected = TestRawValues.EmptyBytes; + + byte[] actual = Encoder.Base62.Decode(string.Empty); + + Assert.That(actual, Is.EqualTo(expected)); + } + + [Test] + public void Base62_Decode_InvalidCharacter_ThrowsFormatException() { + Assert.Throws(() => Encoder.Base62.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_")); + } +} \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/Base64Tests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base64Tests.cs similarity index 68% rename from IOUtils.Tests/EncoderTests/Base64Tests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base64Tests.cs index cd3eab6..a9e5bde 100644 --- a/IOUtils.Tests/EncoderTests/Base64Tests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base64Tests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base64Tests { private const string TestEncodedValue = "BUZXN0"; @@ -10,7 +11,7 @@ public class Base64Tests { [Test] public void Base64_Encode_Test_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.TestBytes); + string actual = Encoder.Base64.Encode(TestRawValues.TestBytes); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -19,14 +20,14 @@ public void Base64_Encode_Test_ReturnsEncodedString() { public void Base64_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base64Encoder.Decode(TestEncodedValue); + byte[] actual = Encoder.Base64.Decode(TestEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.HelloWorldBytes); + string actual = Encoder.Base64.Encode(TestRawValues.HelloWorldBytes); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -35,14 +36,14 @@ public void Base64_Encode_HelloWorld_ReturnsEncodedString() { public void Base64_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base64Encoder.Decode(HelloWorldEncodedValue); + byte[] actual = Encoder.Base64.Decode(HelloWorldEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_Base64SpecialBytes_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.Base64SpecialBytes); + string actual = Encoder.Base64.Encode(TestRawValues.Base64SpecialBytes); Assert.That(actual, Is.EqualTo(Base64SpecialEncodedValue)); } @@ -51,14 +52,14 @@ public void Base64_Encode_Base64SpecialBytes_ReturnsEncodedString() { public void Base64_Decode_Base64SpecialBytes_ReturnsDecodedBytes() { byte[] expected = TestRawValues.Base64SpecialBytes; - byte[] actual = Base64Encoder.Decode(Base64SpecialEncodedValue); + byte[] actual = Encoder.Base64.Decode(Base64SpecialEncodedValue); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base64Encoder.Encode(TestRawValues.EmptyBytes); + string actual = Encoder.Base64.Encode(TestRawValues.EmptyBytes); Assert.That(actual, Is.Empty); } @@ -67,13 +68,13 @@ public void Base64_Encode_EmptyArray_ReturnsEmptyString() { public void Base64_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base64Encoder.Decode(string.Empty); + byte[] actual = Encoder.Base64.Decode(string.Empty); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base64Encoder.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_")); + Assert.Throws(() => Encoder.Base64.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_")); } } \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/Base64UriSafeTests.cs b/IOUtils.Tests/DataTests/EncoderTests/Base64UriSafeTests.cs similarity index 64% rename from IOUtils.Tests/EncoderTests/Base64UriSafeTests.cs rename to IOUtils.Tests/DataTests/EncoderTests/Base64UriSafeTests.cs index d6e9412..46eb32b 100644 --- a/IOUtils.Tests/EncoderTests/Base64UriSafeTests.cs +++ b/IOUtils.Tests/DataTests/EncoderTests/Base64UriSafeTests.cs @@ -1,7 +1,8 @@ -using IOUtils.Encoders; +using IOUtils.Data; +using IOUtils.Tests.EncoderTests; using NUnit.Framework; -namespace IOUtils.Tests.EncoderTests; +namespace IOUtils.Tests.DataTests.EncoderTests; public class Base64UriSafeTests { private const string TestEncodedValue = "BUZXN0"; @@ -10,7 +11,7 @@ public class Base64UriSafeTests { [Test] public void Base64_Encode_Test_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.TestBytes, true); + string actual = Encoder.Base64UriSafe.Encode(TestRawValues.TestBytes, true); Assert.That(actual, Is.EqualTo(TestEncodedValue)); } @@ -19,14 +20,14 @@ public void Base64_Encode_Test_ReturnsEncodedString() { public void Base64_Decode_Test_ReturnsDecodedBytes() { byte[] expected = TestRawValues.TestBytes; - byte[] actual = Base64Encoder.Decode(TestEncodedValue, true); + byte[] actual = Encoder.Base64UriSafe.Decode(TestEncodedValue, true); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_HelloWorld_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.HelloWorldBytes, true); + string actual = Encoder.Base64UriSafe.Encode(TestRawValues.HelloWorldBytes, true); Assert.That(actual, Is.EqualTo(HelloWorldEncodedValue)); } @@ -35,14 +36,14 @@ public void Base64_Encode_HelloWorld_ReturnsEncodedString() { public void Base64_Decode_HelloWorld_ReturnsDecodedBytes() { byte[] expected = TestRawValues.HelloWorldBytes; - byte[] actual = Base64Encoder.Decode(HelloWorldEncodedValue, true); + byte[] actual = Encoder.Base64UriSafe.Decode(HelloWorldEncodedValue, true); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_Base64SpecialBytes_ReturnsEncodedString() { - string actual = Base64Encoder.Encode(TestRawValues.Base64SpecialBytes, true); + string actual = Encoder.Base64UriSafe.Encode(TestRawValues.Base64SpecialBytes, true); Assert.That(actual, Is.EqualTo(Base64SpecialEncodedValue)); } @@ -51,14 +52,14 @@ public void Base64_Encode_Base64SpecialBytes_ReturnsEncodedString() { public void Base64_Decode_Base64SpecialBytes_ReturnsDecodedBytes() { byte[] expected = TestRawValues.Base64SpecialBytes; - byte[] actual = Base64Encoder.Decode(Base64SpecialEncodedValue, true); + byte[] actual = Encoder.Base64UriSafe.Decode(Base64SpecialEncodedValue, true); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Encode_EmptyArray_ReturnsEmptyString() { - string actual = Base64Encoder.Encode(TestRawValues.EmptyBytes, true); + string actual = Encoder.Base64UriSafe.Encode(TestRawValues.EmptyBytes, true); Assert.That(actual, Is.Empty); } @@ -67,13 +68,13 @@ public void Base64_Encode_EmptyArray_ReturnsEmptyString() { public void Base64_Decode_EmptyString_ReturnsEmptyArray() { byte[] expected = TestRawValues.EmptyBytes; - byte[] actual = Base64Encoder.Decode(string.Empty, true); + byte[] actual = Encoder.Base64UriSafe.Decode(string.Empty, true); Assert.That(actual, Is.EqualTo(expected)); } [Test] public void Base64_Decode_InvalidCharacter_ThrowsFormatException() { - Assert.Throws(() => Base64Encoder.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/", true)); + Assert.Throws(() => Encoder.Base64UriSafe.Decode("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/", true)); } } \ No newline at end of file diff --git a/IOUtils.Tests/DataTests/EncoderTests/InvalidEncoderTests.cs b/IOUtils.Tests/DataTests/EncoderTests/InvalidEncoderTests.cs new file mode 100644 index 0000000..64b0c05 --- /dev/null +++ b/IOUtils.Tests/DataTests/EncoderTests/InvalidEncoderTests.cs @@ -0,0 +1,21 @@ +using IOUtils.Data; +using NUnit.Framework; + +namespace IOUtils.Tests.DataTests.EncoderTests; + +public class InvalidEncoderTests { + [Test] + public void CreateEncoder_NoCharacters_ThrowsArgumentException() { + Assert.That(() => new Encoder(string.Empty), Throws.ArgumentException); + } + + [Test] + public void CreateEncoder_OneCharacter_ThrowsArgumentException() { + Assert.That(() => new Encoder("0"), Throws.ArgumentException); + } + + [Test] + public void CreateEncoder_DuplicateCharacters_ThrowsArgumentException() { + Assert.That(() => new Encoder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_"), Throws.ArgumentException); + } +} \ No newline at end of file diff --git a/IOUtils.Tests/EncoderTests/TestRawValues.cs b/IOUtils.Tests/DataTests/EncoderTests/TestRawValues.cs similarity index 100% rename from IOUtils.Tests/EncoderTests/TestRawValues.cs rename to IOUtils.Tests/DataTests/EncoderTests/TestRawValues.cs diff --git a/IOUtils.Tests/IOUtils.Tests.csproj b/IOUtils.Tests/IOUtils.Tests.csproj index d909604..0c701db 100644 --- a/IOUtils.Tests/IOUtils.Tests.csproj +++ b/IOUtils.Tests/IOUtils.Tests.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/IOUtils/Data/Encoder.cs b/IOUtils/Data/Encoder.cs new file mode 100644 index 0000000..cfa2287 --- /dev/null +++ b/IOUtils/Data/Encoder.cs @@ -0,0 +1,59 @@ +using System.Numerics; +using System.Text; + +namespace IOUtils.Data; + +public class Encoder { + public static readonly Encoder Base2 = new("01"); + public static readonly Encoder Base10 = new("0123456789"); + public static readonly Encoder Base16 = new("0123456789ABCDEF"); + public static readonly Encoder Base36 = new("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + public static readonly Encoder Base62 = new("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); + public static readonly Encoder Base64 = new("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); + public static readonly Encoder Base64UriSafe = new("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"); + + public char[] Characters { get; } + + public Encoder(char[] characters) { + if (characters.Length < 2) + throw new ArgumentException("The encoder must have at least two characters", nameof(characters)); + + if (characters.Length != characters.Distinct().Count()) + throw new ArgumentException("The encoder must not have duplicate characters", nameof(characters)); + + Characters = characters; + } + + public Encoder(string characters) : this(characters.ToCharArray()) { } + + public string Encode(byte[] bytes, bool isBigEndian = true) { + BigInteger dividend = new(bytes, true, isBigEndian); + + StringBuilder encodedStringBuilder = new(); + + while (!dividend.IsZero) { + dividend = BigInteger.DivRem(dividend, Characters.Length, out BigInteger remainder); + + char encodedChar = Characters[(int)remainder]; + encodedStringBuilder.Insert(0, encodedChar); + } + + return encodedStringBuilder.ToString(); + } + + public byte[] Decode(string encoded, bool isBigEndian = true) { + BigInteger decodedValue = BigInteger.Zero; + + foreach (int charIndex in encoded.Select(encodedChar => Array.IndexOf(Characters, encodedChar))) { + if (charIndex is -1) { + throw new ArgumentException("The encoding contains unknown characters", nameof(encoded)); + } + + decodedValue = BigInteger.Add(BigInteger.Multiply(decodedValue, Characters.Length), charIndex); + } + + return decodedValue.IsZero + ? Array.Empty() + : decodedValue.ToByteArray(true, isBigEndian); + } +} \ No newline at end of file diff --git a/IOUtils/Encoders/Base10Encoder.cs b/IOUtils/Encoders/Base10Encoder.cs deleted file mode 100644 index 530d91f..0000000 --- a/IOUtils/Encoders/Base10Encoder.cs +++ /dev/null @@ -1,15 +0,0 @@ -using IOUtils.Utils; - -namespace IOUtils.Encoders; - -public static class Base10Encoder { - private const string CharSet = "0123456789"; - - public static string Encode(byte[] raw, bool isBigEndian = true) { - return raw.Encode(CharSet, isBigEndian); - } - - public static byte[] Decode(string encoded, bool isBigEndian = true) { - return encoded.Decode(CharSet, isBigEndian); - } -} \ No newline at end of file diff --git a/IOUtils/Encoders/Base16Encoder.cs b/IOUtils/Encoders/Base16Encoder.cs deleted file mode 100644 index 2f9f8a3..0000000 --- a/IOUtils/Encoders/Base16Encoder.cs +++ /dev/null @@ -1,15 +0,0 @@ -using IOUtils.Utils; - -namespace IOUtils.Encoders; - -public static class Base16Encoder { - private const string CharSet = "0123456789ABCDEF"; - - public static string Encode(byte[] raw, bool isBigEndian = true) { - return raw.Encode(CharSet, isBigEndian); - } - - public static byte[] Decode(string encoded, bool isBigEndian = true) { - return encoded.Decode(CharSet, isBigEndian); - } -} \ No newline at end of file diff --git a/IOUtils/Encoders/Base2Encoder.cs b/IOUtils/Encoders/Base2Encoder.cs deleted file mode 100644 index 552c166..0000000 --- a/IOUtils/Encoders/Base2Encoder.cs +++ /dev/null @@ -1,15 +0,0 @@ -using IOUtils.Utils; - -namespace IOUtils.Encoders; - -public static class Base2Encoder { - private const string CharSet = "01"; - - public static string Encode(byte[] raw, bool isBigEndian = true) { - return raw.Encode(CharSet, isBigEndian); - } - - public static byte[] Decode(string encoded, bool isBigEndian = true) { - return encoded.Decode(CharSet, isBigEndian); - } -} \ No newline at end of file diff --git a/IOUtils/Encoders/Base36Encoder.cs b/IOUtils/Encoders/Base36Encoder.cs deleted file mode 100644 index 9dbbf1b..0000000 --- a/IOUtils/Encoders/Base36Encoder.cs +++ /dev/null @@ -1,15 +0,0 @@ -using IOUtils.Utils; - -namespace IOUtils.Encoders; - -public static class Base36Encoder { - private const string CharSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - public static string Encode(byte[] raw, bool isBigEndian = true) { - return raw.Encode(CharSet, isBigEndian); - } - - public static byte[] Decode(string encoded, bool isBigEndian = true) { - return encoded.Decode(CharSet, isBigEndian); - } -} \ No newline at end of file diff --git a/IOUtils/Encoders/Base64Encoder.cs b/IOUtils/Encoders/Base64Encoder.cs deleted file mode 100644 index 11771ef..0000000 --- a/IOUtils/Encoders/Base64Encoder.cs +++ /dev/null @@ -1,16 +0,0 @@ -using IOUtils.Utils; - -namespace IOUtils.Encoders; - -public static class Base64Encoder { - private const string CharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - private const string UriSafeCharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - public static string Encode(byte[] raw, bool uriSafe = false, bool isBigEndian = true) { - return raw.Encode(uriSafe ? UriSafeCharSet : CharSet, isBigEndian); - } - - public static byte[] Decode(string encoded, bool uriSafe = false, bool isBigEndian = true) { - return encoded.Decode(uriSafe ? UriSafeCharSet : CharSet, isBigEndian); - } -} \ No newline at end of file diff --git a/IOUtils/Utils/EncodingUtils.cs b/IOUtils/Utils/EncodingUtils.cs deleted file mode 100644 index 93eb011..0000000 --- a/IOUtils/Utils/EncodingUtils.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Numerics; -using System.Text; - -namespace IOUtils.Utils; - -internal static class EncodingUtils { - internal static string Encode(this byte[] bytes, string charSet, bool isBigEndian) { - BigInteger dividend = new(bytes, true, isBigEndian); - - StringBuilder stringBuilder = new(); - - while (!dividend.IsZero) { - dividend = BigInteger.DivRem(dividend, charSet.Length, out BigInteger remainder); - - char encodedChar = charSet[(int)remainder]; - stringBuilder.Insert(0, encodedChar); - } - - return stringBuilder.ToString(); - } - - internal static byte[] Decode(this string encoded, string charSet, bool isBigEndian) { - BigInteger decodedValue = BigInteger.Zero; - - foreach (char encodedChar in encoded) { - int charIndex = charSet.IndexOf(encodedChar); - - if (charIndex is -1) { - throw new FormatException($"Character '{encodedChar}' is not in the character set."); - } - - decodedValue = BigInteger.Add(BigInteger.Multiply(decodedValue, charSet.Length), charIndex); - } - - return decodedValue.IsZero - ? Array.Empty() - : decodedValue.ToByteArray(true, isBigEndian); - } -} \ No newline at end of file diff --git a/README.md b/README.md index e8bbbe2..025929f 100644 --- a/README.md +++ b/README.md @@ -105,26 +105,27 @@ string directoryPath = FileInput.GetDirectoryPath("Enter a directory path"); The following encoders are available: -| Encoder | Character set | -|--------------------------|---------------------| -| Base2Encoder | 0-1 | -| Base10Encoder | 0-9 | -| Base16Encoder | 0-9, A-F | -| Base36Encoder | 0-9, A-Z | -| Base64Encoder | A-Z, a-z, 0-9, +, / | -| Base64Encoder (URI safe) | A-Z, a-z, 0-9, -, _ | +| Encoder | Character set | +|-----------------------|---------------------| +| Encoder.Base2 | 0-1 | +| Encoder.Base10 | 0-9 | +| Encoder.Base16 | 0-9, A-F | +| Encoder.Base36 | 0-9, A-Z | +| Encoder.Base62 | 0-9, A-Z, a-z | +| Encoder.Base64 | A-Z, a-z, 0-9, +, / | +| Encoder.Base64UriSafe | A-Z, a-z, 0-9, -, _ | #### Encode text Encode a byte array using one of the available encoders. The encoded text is returned as a string. ```csharp -using IOUtils.Encoders; +using IOUtils.Data; byte[] raw = "Hello, World!"u8.ToArray(); // Any encoder listed above can be used here -string encoded = Base36Encoder.Encode(raw); +string encoded = Encoder.Base36.Encode(raw); Console.WriteLine($"Encoded text: {encoded}"); ``` @@ -134,11 +135,11 @@ Console.WriteLine($"Encoded text: {encoded}"); Decode a string encoded using one of the available encoders. The decoded text is returned as a byte array. If the encoded text is not valid, a FormatException is thrown. ```csharp -using IOUtils.Encoders; +using IOUtils.Data; string encoded = "FG3H7VQW7EEN6JWWNZMP"; -byte[] decoded = Base36Encoder.Decode(encoded); +byte[] decoded = Encoder.Base36.Decode(encoded); Console.WriteLine($"Decoded text: {System.Text.Encoding.UTF8.GetString(decoded)}"); ```