Skip to content

Commit 93cd8be

Browse files
committed
Add Checksum tests
1 parent 391e4f8 commit 93cd8be

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
using LibDeflate.Checksums;
2+
using System;
3+
using Xunit;
4+
5+
namespace LibDeflate.Tests
6+
{
7+
public class ChecksumTests
8+
{
9+
private static readonly Random _rand = new();
10+
private static byte[] GetRandomBuffer(int length)
11+
{
12+
var input = new byte[length];
13+
_rand.NextBytes(input);
14+
return input;
15+
}
16+
17+
private uint NaiveCrc32(ReadOnlySpan<byte> input, uint poly = 0xEDB88320)
18+
{
19+
uint crc = unchecked((uint)-1);
20+
21+
while (!input.IsEmpty)
22+
{
23+
crc ^= input[0];
24+
input = input.Slice(1);
25+
for (int bit = 0; bit < 8; bit++)
26+
{
27+
if ((crc & 1) == 1) crc = (crc >> 1) ^ poly;
28+
else crc >>= 1;
29+
}
30+
}
31+
return ~crc;
32+
}
33+
34+
[Fact]
35+
public void Crc32ComputeTest()
36+
{
37+
var testBuffer = GetRandomBuffer(0x1000);
38+
39+
var naiveCrc32 = NaiveCrc32(testBuffer);
40+
var lbdCrc32 = new Crc32().Compute(testBuffer);
41+
42+
Assert.Equal(naiveCrc32, lbdCrc32);
43+
}
44+
45+
[Fact]
46+
public void Crc32AppendTest()
47+
{
48+
Span<byte> testBuffer = GetRandomBuffer(0x1000);
49+
50+
var naiveCrc32 = NaiveCrc32(testBuffer);
51+
var lbdCrc32 = new Crc32();
52+
while (!testBuffer.IsEmpty)
53+
{
54+
var chunk = testBuffer[..0x100];
55+
lbdCrc32.Append(chunk);
56+
testBuffer = testBuffer[0x100..];
57+
}
58+
59+
Assert.Equal(naiveCrc32, lbdCrc32.Hash);
60+
}
61+
62+
private uint NaiveAdler32(ReadOnlySpan<byte> input, uint mparam = 65521)
63+
{
64+
uint a = 1, b = 0;
65+
for (int i = 0; i < input.Length; i++)
66+
{
67+
uint p = input[i];
68+
b = (b + (a = (a + p) % (p = mparam))) % p;
69+
}
70+
return b << 16 | a;
71+
}
72+
73+
[Fact]
74+
public void Adler32ComputeTest()
75+
{
76+
var testBuffer = GetRandomBuffer(0x1000);
77+
78+
var naiveAdler32 = NaiveAdler32(testBuffer);
79+
var lbdAdler32 = new Adler32().Compute(testBuffer);
80+
81+
Assert.Equal(naiveAdler32, lbdAdler32);
82+
}
83+
84+
[Fact]
85+
public void Adler32AppendTest()
86+
{
87+
Span<byte> testBuffer = GetRandomBuffer(0x1000);
88+
89+
var naiveAdler32 = NaiveAdler32(testBuffer);
90+
var lbdAdler32 = new Adler32();
91+
while (!testBuffer.IsEmpty)
92+
{
93+
var chunk = testBuffer[..0x100];
94+
lbdAdler32.Append(chunk);
95+
testBuffer = testBuffer[0x100..];
96+
}
97+
98+
Assert.Equal(naiveAdler32, lbdAdler32.Hash);
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)