From c96266bfe7911aafca1951422dfb5761de26377a Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Wed, 17 Dec 2025 13:41:38 +0200 Subject: [PATCH 1/8] Created ByteTree tests Signed-off-by: Zafer Balkan --- .github/workflows/unit-testing.yml | 41 +++ README.md | 4 + TechnitiumLibrary.UnitTests/MSTestSettings.cs | 3 + .../ByteTreeTests.cs | 315 ++++++++++++++++++ .../TechnitiumLibrary.UnitTests.csproj | 15 + TechnitiumLibrary.sln | 6 + 6 files changed, 384 insertions(+) create mode 100644 .github/workflows/unit-testing.yml create mode 100644 TechnitiumLibrary.UnitTests/MSTestSettings.cs create mode 100644 TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs create mode 100644 TechnitiumLibrary.UnitTests/TechnitiumLibrary.UnitTests.csproj diff --git a/.github/workflows/unit-testing.yml b/.github/workflows/unit-testing.yml new file mode 100644 index 00000000..11ef5256 --- /dev/null +++ b/.github/workflows/unit-testing.yml @@ -0,0 +1,41 @@ +name: Unit testing (Windows / MSBuild) + +on: + workflow_dispatch: + push: + branches: ["master"] + pull_request: + branches: ["master"] + schedule: + - cron: "0 0 * * 0" # weekly, Sunday 00:00 UTC + +permissions: + contents: read + +jobs: + test: + runs-on: windows-latest + + env: + SOLUTION_NAME: TechnitiumLibrary.sln + BUILD_CONFIGURATION: Debug + + steps: + - uses: actions/checkout@v4 + + - name: Install .NET 9 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.0.x + + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v1 + + - name: Restore + run: msbuild ${{ env.SOLUTION_NAME }} /t:Restore + + - name: Build + run: msbuild ${{ env.SOLUTION_NAME }} /m /p:Configuration=${{ env.BUILD_CONFIGURATION }} + + - name: Test (msbuild) + run: msbuild TechnitiumLibrary.Tests\TechnitiumLibrary.Tests.csproj /t:Test /p:Configuration=${{ env.BUILD_CONFIGURATION }} \ No newline at end of file diff --git a/README.md b/README.md index b329873a..ad146a6c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # TechnitiumLibrary A library for .net based applications. + +## Quality Assurance + +[![Unit testing (Windows / MSBuild)](https://github.com/TechnitiumSoftware/TechnitiumLibrary/actions/workflows/unit-testing.yml/badge.svg)](https://github.com/TechnitiumSoftware/TechnitiumLibrary/actions/workflows/unit-testing.yml) \ No newline at end of file diff --git a/TechnitiumLibrary.UnitTests/MSTestSettings.cs b/TechnitiumLibrary.UnitTests/MSTestSettings.cs new file mode 100644 index 00000000..e466aa12 --- /dev/null +++ b/TechnitiumLibrary.UnitTests/MSTestSettings.cs @@ -0,0 +1,3 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs new file mode 100644 index 00000000..412776d0 --- /dev/null +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -0,0 +1,315 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Linq; +using TechnitiumLibrary.ByteTree; + +namespace TechnitiumLibrary.UnitTests.TechnitiumLibrary.ByteTree +{ + [TestClass] + public sealed class ByteTreeTests + { + private static byte[] Key(params byte[] b) => b; + + // --------------------------- + // ADD + GET + // --------------------------- + [TestMethod] + public void Add_ShouldInsertValue_WhenKeyDoesNotExist() + { + // GIVEN + ByteTree tree = new ByteTree(); + + // WHEN + tree.Add(Key(1, 2, 3), "value"); + + // THEN + Assert.AreEqual("value", tree[Key(1, 2, 3)]); + } + + [TestMethod] + public void Add_ShouldThrow_WhenKeyExists() + { + // GIVEN + ByteTree tree = new ByteTree(); + tree.Add(Key(4), "first"); + + // WHEN – THEN + Assert.ThrowsExactly(() => + tree.Add(Key(4), "duplicate")); + } + + [TestMethod] + public void Add_ShouldThrow_WhenKeyNull() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.Add(null, "x")); + } + + // --------------------------- + // TryAdd + // --------------------------- + [TestMethod] + public void TryAdd_ShouldReturnTrue_WhenKeyAdded() + { + ByteTree tree = new ByteTree(); + bool result = tree.TryAdd(Key(1), "v"); + Assert.IsTrue(result); + } + + [TestMethod] + public void TryAdd_ShouldReturnFalse_WhenKeyExists() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(5), "initial"); + + bool result = tree.TryAdd(Key(5), "other"); + + Assert.IsFalse(result); + Assert.AreEqual("initial", tree[Key(5)]); + } + + [TestMethod] + public void TryAdd_ShouldThrow_WhenKeyNull() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.TryAdd(null, "x")); + } + + // --------------------------- + // GET operations + // --------------------------- + [TestMethod] + public void TryGet_ShouldReturnTrue_WhenKeyExists() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(1, 2), "data"); + + bool found = tree.TryGet(Key(1, 2), out string? value); + + Assert.IsTrue(found); + Assert.AreEqual("data", value); + } + + [TestMethod] + public void TryGet_ShouldReturnFalse_WhenMissing() + { + ByteTree tree = new ByteTree(); + + bool result = tree.TryGet(Key(9), out string? value); + + Assert.IsFalse(result); + Assert.IsNull(value); + } + + [TestMethod] + public void TryGet_ShouldThrow_WhenNull() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.TryGet(null, out _)); + } + + // --------------------------- + // ContainsKey + // --------------------------- + [TestMethod] + public void ContainsKey_ShouldReturnTrue_WhenKeyPresent() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(3, 3), "v"); + + Assert.IsTrue(tree.ContainsKey(Key(3, 3))); + } + + [TestMethod] + public void ContainsKey_ShouldReturnFalse_WhenKeyMissing() + { + ByteTree tree = new ByteTree(); + Assert.IsFalse(tree.ContainsKey(Key(3, 100))); + } + + [TestMethod] + public void ContainsKey_ShouldThrow_WhenNull() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.ContainsKey(null)); + } + + // --------------------------- + // Remove + // --------------------------- + [TestMethod] + public void TryRemove_ShouldReturnTrue_WhenKeyExists() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(10), "v"); + + bool result = tree.TryRemove(Key(10), out string? removed); + + Assert.IsTrue(result); + Assert.AreEqual("v", removed); + Assert.IsFalse(tree.ContainsKey(Key(10))); + } + + [TestMethod] + public void TryRemove_ShouldReturnFalse_WhenMissing() + { + ByteTree tree = new ByteTree(); + bool result = tree.TryRemove(Key(11), out string? removed); + + Assert.IsFalse(result); + Assert.IsNull(removed); + } + + [TestMethod] + public void TryRemove_ShouldThrow_WhenNull() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.TryRemove(null, out _)); + } + + // --------------------------- + // TryUpdate + // --------------------------- + [TestMethod] + public void TryUpdate_ShouldReplaceValue_WhenComparisonMatches() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(5), "old"); + + bool updated = tree.TryUpdate(Key(5), "new", "old"); + + Assert.IsTrue(updated); + Assert.AreEqual("new", tree[Key(5)]); + } + + [TestMethod] + public void TryUpdate_ShouldReturnFalse_WhenComparisonDoesNotMatch() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(7), "original"); + + bool updated = tree.TryUpdate(Key(7), "attempt", "different"); + + Assert.IsFalse(updated); + Assert.AreEqual("original", tree[Key(7)]); + } + + // --------------------------- + // AddOrUpdate + // --------------------------- + [TestMethod] + public void AddOrUpdate_ShouldInsert_WhenMissing() + { + ByteTree tree = new ByteTree(); + + string val = tree.AddOrUpdate( + Key(1, 1), + _ => "create", + (_, old) => old + "update"); + + Assert.AreEqual("create", val); + } + + [TestMethod] + public void AddOrUpdate_ShouldModify_WhenExists() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(1, 2), "first"); + + string updated = tree.AddOrUpdate( + Key(1, 2), + _ => "ignored", + (_, old) => old + "_changed"); + + Assert.AreEqual("first_changed", updated); + } + + // --------------------------- + // Indexer get/set + // --------------------------- + [TestMethod] + public void Indexer_Get_ShouldReturnExactValue() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(99), "stored"); + + Assert.AreEqual("stored", tree[Key(99)]); + } + + [TestMethod] + public void Indexer_Set_ShouldOverwriteFormerValue() + { + ByteTree tree = new ByteTree(); + tree[Key(5, 5)] = "initial"; + + tree[Key(5, 5)] = "updated"; + + Assert.AreEqual("updated", tree[Key(5, 5)]); + } + + [TestMethod] + public void Indexer_Get_ShouldThrow_WhenMissingKey() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => + _ = tree[Key(8, 8)]); + } + + [TestMethod] + public void Indexer_ShouldThrow_WhenNullKey() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree[null] = "x"); + } + + // --------------------------- + // Enumeration + // --------------------------- + [TestMethod] + public void Enumerator_ShouldYieldExistingValues() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(1), "x"); + tree.Add(Key(2), "y"); + tree.Add(Key(3), "z"); + + List values = tree.ToList(); + + Assert.HasCount(3, values); + CollectionAssert.AreEquivalent(new[] { "x", "y", "z" }, values); + } + + [TestMethod] + public void ReverseEnumerable_ShouldYieldInReverseOrder() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(0), "a"); + tree.Add(Key(1), "b"); + tree.Add(Key(255), "c"); + + List result = tree.GetReverseEnumerable().ToList(); + + Assert.HasCount(3, result); + Assert.AreEqual("c", result[0]); // last sorted key + Assert.AreEqual("b", result[1]); + Assert.AreEqual("a", result[2]); + } + + // --------------------------- + // Clear + // --------------------------- + [TestMethod] + public void Clear_ShouldEraseAllData() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(1), "x"); + tree.Add(Key(2), "y"); + + tree.Clear(); + + Assert.IsTrue(tree.IsEmpty); + Assert.IsFalse(tree.ContainsKey(Key(1))); + } + } +} diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.UnitTests.csproj b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.UnitTests.csproj new file mode 100644 index 00000000..c63e9f74 --- /dev/null +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.UnitTests.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + latest + disable + enable + true + + + + + + + diff --git a/TechnitiumLibrary.sln b/TechnitiumLibrary.sln index 9cbcda3e..bfc3298a 100644 --- a/TechnitiumLibrary.sln +++ b/TechnitiumLibrary.sln @@ -25,6 +25,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechnitiumLibrary", "Techni EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechnitiumLibrary.Security.OTP", "TechnitiumLibrary.Security.OTP\TechnitiumLibrary.Security.OTP.csproj", "{72AF4EB6-EB81-4655-9998-8BF24B304614}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TechnitiumLibrary.UnitTests", "TechnitiumLibrary.UnitTests\TechnitiumLibrary.UnitTests.csproj", "{D0CD41D8-E5F0-4EEF-81E3-587A2A877C49}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -75,6 +77,10 @@ Global {72AF4EB6-EB81-4655-9998-8BF24B304614}.Debug|Any CPU.Build.0 = Debug|Any CPU {72AF4EB6-EB81-4655-9998-8BF24B304614}.Release|Any CPU.ActiveCfg = Release|Any CPU {72AF4EB6-EB81-4655-9998-8BF24B304614}.Release|Any CPU.Build.0 = Release|Any CPU + {D0CD41D8-E5F0-4EEF-81E3-587A2A877C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0CD41D8-E5F0-4EEF-81E3-587A2A877C49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0CD41D8-E5F0-4EEF-81E3-587A2A877C49}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0CD41D8-E5F0-4EEF-81E3-587A2A877C49}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 831618da6a14b0f862d02b839273c56eaefba45c Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:10:47 +0200 Subject: [PATCH 2/8] Added AddOrUpdate_ShouldThrow_WhenNullKey --- .../ByteTreeTests.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs index 412776d0..a80aa37e 100644 --- a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -96,7 +96,7 @@ public void TryGet_ShouldReturnFalse_WhenMissing() { ByteTree tree = new ByteTree(); - bool result = tree.TryGet(Key(9), out string? value); + bool result = tree.TryGet(Key("\t"u8.ToArray()), out string? value); Assert.IsFalse(result); Assert.IsNull(value); @@ -142,13 +142,13 @@ public void ContainsKey_ShouldThrow_WhenNull() public void TryRemove_ShouldReturnTrue_WhenKeyExists() { ByteTree tree = new ByteTree(); - tree.Add(Key(10), "v"); + tree.Add(Key("\n"u8.ToArray()), "v"); - bool result = tree.TryRemove(Key(10), out string? removed); + bool result = tree.TryRemove(Key("\n"u8.ToArray()), out string? removed); Assert.IsTrue(result); Assert.AreEqual("v", removed); - Assert.IsFalse(tree.ContainsKey(Key(10))); + Assert.IsFalse(tree.ContainsKey(Key("\n"u8.ToArray()))); } [TestMethod] @@ -225,6 +225,16 @@ public void AddOrUpdate_ShouldModify_WhenExists() Assert.AreEqual("first_changed", updated); } + [TestMethod] + public void AddOrUpdate_ShouldThrow_WhenNullKey() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.AddOrUpdate( + null!, + _ => "x", + (_, __) => "y")); + } + // --------------------------- // Indexer get/set // --------------------------- @@ -232,9 +242,9 @@ public void AddOrUpdate_ShouldModify_WhenExists() public void Indexer_Get_ShouldReturnExactValue() { ByteTree tree = new ByteTree(); - tree.Add(Key(99), "stored"); + tree.Add(Key("c"u8.ToArray()), "stored"); - Assert.AreEqual("stored", tree[Key(99)]); + Assert.AreEqual("stored", tree[Key("c"u8.ToArray())]); } [TestMethod] From d06d78d60d625ce6b4089c094022fd3d01578a78 Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:11:26 +0200 Subject: [PATCH 3/8] Added TryUpdate_ShouldThrow_WhenNullKey --- .../TechnitiumLibrary.ByteTree/ByteTreeTests.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs index a80aa37e..1c9d8417 100644 --- a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -195,6 +195,13 @@ public void TryUpdate_ShouldReturnFalse_WhenComparisonDoesNotMatch() Assert.AreEqual("original", tree[Key(7)]); } + [TestMethod] + public void TryUpdate_ShouldThrow_WhenNullKey() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.TryUpdate(null, "x", "y")); + } + // --------------------------- // AddOrUpdate // --------------------------- From a6866d6e3cd4dc8a8af6883036cc3228c47896cc Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:12:26 +0200 Subject: [PATCH 4/8] Fixed workflow path --- .github/workflows/unit-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-testing.yml b/.github/workflows/unit-testing.yml index 11ef5256..74c7a992 100644 --- a/.github/workflows/unit-testing.yml +++ b/.github/workflows/unit-testing.yml @@ -38,4 +38,4 @@ jobs: run: msbuild ${{ env.SOLUTION_NAME }} /m /p:Configuration=${{ env.BUILD_CONFIGURATION }} - name: Test (msbuild) - run: msbuild TechnitiumLibrary.Tests\TechnitiumLibrary.Tests.csproj /t:Test /p:Configuration=${{ env.BUILD_CONFIGURATION }} \ No newline at end of file + run: msbuild TechnitiumLibrary.UnitTests\TechnitiumLibrary.UnitTests.csproj /t:Test /p:Configuration=${{ env.BUILD_CONFIGURATION }} \ No newline at end of file From a6a0f2f8f82c2db8cf485ec889cc9189a102c311 Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:14:47 +0200 Subject: [PATCH 5/8] Added TryUpdate_ShouldReturnFalse_WhenKeyMissing --- .../TechnitiumLibrary.ByteTree/ByteTreeTests.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs index 1c9d8417..d2704ebd 100644 --- a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -202,6 +202,14 @@ public void TryUpdate_ShouldThrow_WhenNullKey() Assert.ThrowsExactly(() => tree.TryUpdate(null, "x", "y")); } + [TestMethod] + public void TryUpdate_ShouldReturnFalse_WhenKeyMissing() + { + ByteTree tree = new ByteTree(); + Assert.IsFalse(tree.TryUpdate(Key(9), "x", "y")); + } + + // --------------------------- // AddOrUpdate // --------------------------- From 63238cfdc64802a7e62495a1e403d896041b447f Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:16:50 +0200 Subject: [PATCH 6/8] Added GetOrAdd test cases --- .../ByteTreeTests.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs index d2704ebd..55029344 100644 --- a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -210,6 +210,35 @@ public void TryUpdate_ShouldReturnFalse_WhenKeyMissing() } + // --------------------------- + // GetOrAdd + // --------------------------- + + [TestMethod] + public void GetOrAdd_ShouldReturnExistingValue_WhenKeyExists() + { + ByteTree tree = new ByteTree(); + tree.Add(Key(2, 2), "existing"); + string val = tree.GetOrAdd(Key(2, 2), "new"); + Assert.AreEqual("existing", val); + } + + [TestMethod] + public void GetOrAdd_ShouldInsertAndReturnNewValue_WhenKeyMissing() + { + ByteTree tree = new ByteTree(); + string val = tree.GetOrAdd(Key(3, 3), "added"); + Assert.AreEqual("added", val); + Assert.AreEqual("added", tree[Key(3, 3)]); + } + + [TestMethod] + public void GetOrAdd_ShouldThrow_WhenNullKey() + { + ByteTree tree = new ByteTree(); + Assert.ThrowsExactly(() => tree.GetOrAdd(null, "x")); + } + // --------------------------- // AddOrUpdate // --------------------------- From 8588ab881f855e65449913fa851960ebaeaefdc7 Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Thu, 29 Jan 2026 10:41:59 +0200 Subject: [PATCH 7/8] Updated workflow file --- .github/workflows/unit-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-testing.yml b/.github/workflows/unit-testing.yml index 74c7a992..5fbbae8e 100644 --- a/.github/workflows/unit-testing.yml +++ b/.github/workflows/unit-testing.yml @@ -29,7 +29,7 @@ jobs: dotnet-version: 9.0.x - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1 + uses: microsoft/setup-msbuild@v2 - name: Restore run: msbuild ${{ env.SOLUTION_NAME }} /t:Restore From b283c67edbd94c4b91519fbf6426b892492477af Mon Sep 17 00:00:00 2001 From: Zafer Balkan Date: Tue, 3 Feb 2026 19:22:58 +0200 Subject: [PATCH 8/8] Added copyright --- .../ByteTreeTests.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs index 55029344..47b7d33d 100644 --- a/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs +++ b/TechnitiumLibrary.UnitTests/TechnitiumLibrary.ByteTree/ByteTreeTests.cs @@ -1,4 +1,24 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +/* +Technitium Library +Copyright (C) 2026 Shreyas Zare (shreyas@technitium.com) +Copyright (C) 2026 Zafer Balkan (zafer@zaferbalkan.com) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +*/ + +using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Linq;