private static void TestEncoding(TsscEncoder encoder, TsscDecoder decoder, TsscEncoder encoder2, byte[] writeBuffer, byte randomValue, OrigReader reader2, ushort idOld, long timestampOld, uint qualityOld, float valueOld) { ushort id2; long timestamp2; uint quality2; float value2; ushort id3 = 0; long timestamp3 = 0; uint quality3 = 0; float value3 = 0; int flushPosition; flushPosition = encoder.FinishBlock(); Array.Clear(writeBuffer, flushPosition, writeBuffer.Length - flushPosition); byte[] writeBuffer2 = new byte[writeBuffer.Length]; encoder2.SetBuffer(writeBuffer2, randomValue, writeBuffer2.Length - randomValue); decoder.SetBuffer(writeBuffer, randomValue, flushPosition - randomValue); while (decoder.TryGetMeasurement(out id2, out timestamp2, out quality2, out value2)) { if (!encoder2.TryAddMeasurement(id2, timestamp2, quality2, value2)) { throw new Exception(); } if (!reader2.ReadNextMeasurement(out id3, out timestamp3, out quality3, out value3)) { throw new Exception(); } if (id2 != id3) { throw new Exception(); } if (timestamp2 != timestamp3) { throw new Exception(); } if (quality2 != quality3) { throw new Exception(); } if (value2 != value3) { throw new Exception(); } } if (idOld != id3) { throw new Exception(); } if (timestampOld != timestamp3) { throw new Exception(); } if (qualityOld != quality3) { throw new Exception(); } if (valueOld != value3) { throw new Exception(); } if (flushPosition != encoder2.FinishBlock()) { throw new Exception(); } for (int x = 0; x < writeBuffer.Length; x++) { if (writeBuffer[x] != writeBuffer2[x]) { throw new Exception(); } } }
//[TestMethod] public unsafe void TestSmallerSegments() { Stopwatch sw = new Stopwatch(); sw.Start(); long totalSize = 0; long measurementsProcessed = 0; int quitAfterCount = 0; Dictionary <Guid, ushort> idLookup = new Dictionary <Guid, ushort>(); var encoder = new TsscEncoder(); var encoder2 = new TsscEncoder(); var decoder = new TsscDecoder(); foreach (var file in Directory.GetFiles(@"D:\TsscTest", "*.PhasorStream")) { if (quitAfterCount == 1) { return; } quitAfterCount++; byte[] data = File.ReadAllBytes(file); var reader1 = new OrigReader(data, idLookup); var reader2 = new OrigReader(data, idLookup); byte randomValue = Security.Cryptography.Random.ByteBetween(1, 200); byte[] writeBuffer = new byte[randomValue * 1024]; encoder.SetBuffer(writeBuffer, randomValue, writeBuffer.Length - randomValue); ushort id; long timestamp; uint quality; float value; ushort idOld = 0; long timestampOld = 0; uint qualityOld = 0; float valueOld = 0; int quitAfter = Security.Cryptography.Random.ByteBetween(0, 40); while (reader1.ReadNextMeasurement(out id, out timestamp, out quality, out value)) { measurementsProcessed++; if (quitAfter <= 0 || !encoder.TryAddMeasurement(id, timestamp, quality, value)) { totalSize += encoder.FinishBlock(); TestEncoding(encoder, decoder, encoder2, writeBuffer, randomValue, reader2, idOld, timestampOld, qualityOld, valueOld); randomValue = Security.Cryptography.Random.ByteBetween(1, 200); writeBuffer = new byte[randomValue * 1024]; encoder.SetBuffer(writeBuffer, randomValue, writeBuffer.Length - randomValue); if (!encoder.TryAddMeasurement(id, timestamp, quality, value)) { throw new Exception(); } quitAfter = Security.Cryptography.Random.ByteBetween(0, 40); } quitAfter--; idOld = id; timestampOld = timestamp; qualityOld = quality; valueOld = value; } totalSize += encoder.FinishBlock(); TestEncoding(encoder, decoder, encoder2, writeBuffer, randomValue, reader2, idOld, timestampOld, qualityOld, valueOld); System.Console.WriteLine(measurementsProcessed.ToString("N0") + " " + file + " " + sw.Elapsed.TotalSeconds.ToString("N1") + " " + (totalSize * 8 / (double)measurementsProcessed).ToString("N2")); } }