5
5
namespace netczicompressTests . Models ;
6
6
7
7
using System . Reactive . Disposables ;
8
+ using System . Text ;
9
+ using System . Xml . Linq ;
10
+ using System . Xml . XPath ;
8
11
9
12
/// <summary>
10
13
/// Tests for <see cref="PInvokeFileProcessor"/>.
@@ -23,7 +26,7 @@ public void Ctr_WhenCalledWithNoOp_Throws()
23
26
[ InlineData ( CompressionMode . CompressUncompressed ) ]
24
27
[ InlineData ( CompressionMode . CompressAll ) ]
25
28
[ InlineData ( CompressionMode . CompressUncompressedAndZstd ) ]
26
- public void CompressAndDecompressOneFile_FilesHaveCorrectSize (
29
+ public void CompressAndDecompressOneFile_FilesHaveCorrectSizeAndMetadata (
27
30
CompressionMode mode )
28
31
{
29
32
// ARRANGE
@@ -43,13 +46,17 @@ public void CompressAndDecompressOneFile_FilesHaveCorrectSize(
43
46
decompressor . ProcessFile ( compressed , uncompressed , _ => { } , CancellationToken . None ) ;
44
47
45
48
var compressedSize = GetLength ( compressed ) ;
49
+
46
50
var decompressedSize = GetLength ( uncompressed ) ;
47
51
var originalSize = GetLength ( testFile ) ;
48
52
49
53
// ASSERT
50
- compressedSize . Should ( ) . Be ( 58432L ) ;
54
+ compressedSize . Should ( ) . Be ( 58528L ) ;
51
55
decompressedSize . Should ( ) . BeCloseTo ( originalSize , 2048 ) ;
52
- decompressedSize . Should ( ) . Be ( 99552L ) ;
56
+ decompressedSize . Should ( ) . Be ( 99648L ) ;
57
+
58
+ Metadata . FromFile ( compressed ) . CurrentCompressionParameters . Should ( ) . Be ( "Lossless: True" ) ;
59
+ Metadata . FromFile ( uncompressed ) . CurrentCompressionParameters . Should ( ) . BeEmpty ( ) ;
53
60
}
54
61
55
62
[ Theory ]
@@ -114,9 +121,9 @@ public void GetLibFullName_WhenCalled_ReturnsExpected()
114
121
}
115
122
116
123
[ Theory ]
117
- [ InlineData ( 0 , 99552L , 57760L ) ]
118
- [ InlineData ( 2 , 99552L , 57920L ) ]
119
- [ InlineData ( 4 , 99552L , 57472L ) ]
124
+ [ InlineData ( 0 , 99648L , 57856L ) ]
125
+ [ InlineData ( 2 , 99648L , 58016L ) ]
126
+ [ InlineData ( 4 , 99648L , 57568L ) ]
120
127
public void CompressWithLevel_FilesHaveCorrectSize (
121
128
int compressionLevel , long expectedUncompressedSize , long expectedCompressedSize )
122
129
{
@@ -160,4 +167,50 @@ private static string GetTestFilePath()
160
167
var testFile = Path . Combine ( dirname ?? "." , "mandelbrot.czi" ) ;
161
168
return testFile ;
162
169
}
170
+
171
+ private class Metadata
172
+ {
173
+ public required XDocument Xml { get ; init ; }
174
+
175
+ public string ? CurrentCompressionParameters => this . Xml
176
+ . XPathSelectElement (
177
+ "ImageDocument/Metadata/Information/Image/CurrentCompressionParameters" )
178
+ ? . Value ;
179
+
180
+ public static Metadata FromFile ( string path ) => new ( ) { Xml = ParseMetadataXml ( path ) } ;
181
+
182
+ private static XDocument ParseMetadataXml ( string filePath )
183
+ {
184
+ return XDocument . Parse ( ReadMetadataXml ( filePath ) ) ;
185
+ }
186
+
187
+ private static string ReadMetadataXml ( string filePath )
188
+ {
189
+ // These numbers are from the ZISRAW file specification.
190
+ const int SegmentHeaderSize = 16 + 8 + 8 ;
191
+ const int MetadataPositionInFileHeader = 60 ;
192
+ const int MetadataHeaderSize = 256 ;
193
+
194
+ using var stream = File . OpenRead ( filePath ) ;
195
+
196
+ // BinaryReader uses little-endian as required.
197
+ using var reader = new BinaryReader ( stream ) ;
198
+
199
+ // Read metadataPosition from ZISRAW file header
200
+ stream . Position = SegmentHeaderSize + MetadataPositionInFileHeader ;
201
+ long metadataHeaderPosition = reader . ReadInt64 ( ) + SegmentHeaderSize ;
202
+
203
+ // Read size of XML from ZISRAWMETADATA header
204
+ stream . Position = metadataHeaderPosition ;
205
+ int metadataSize = reader . ReadInt32 ( ) ;
206
+
207
+ // Read XML bytes from ZISRAWMETADATA segment
208
+ stream . Position = metadataHeaderPosition + MetadataHeaderSize ;
209
+ var xmlBytes = reader . ReadBytes ( metadataSize ) ;
210
+
211
+ // Decode (always UTF-8 according to the spec)
212
+ var result = Encoding . UTF8 . GetString ( xmlBytes ) ;
213
+ return result ;
214
+ }
215
+ }
163
216
}
0 commit comments