16
16
using TagLib . IFD . Tags ;
17
17
using TagLib . Xmp ;
18
18
19
- public class GenerateTestFixtureApp
19
+ namespace GenerateTestFixture ;
20
+
21
+ public class Program
20
22
{
21
- private static MD5 md5 = MD5 . Create ( ) ;
23
+ static MD5 md5 = MD5 . Create ( ) ;
22
24
23
25
// Helper to run a process and capture output, error, and exit code
24
- private static bool RunProcess ( string exe , string args , out string output , out string error , out int exitCode )
26
+ static bool RunProcess ( string exe , string args , out string output , out string error , out int exitCode )
25
27
{
26
- var startInfo = new ProcessStartInfo
27
- {
28
+ var startInfo = new ProcessStartInfo {
28
29
FileName = exe ,
29
30
Arguments = args ,
30
31
RedirectStandardOutput = true ,
@@ -34,17 +35,17 @@ private static bool RunProcess(string exe, string args, out string output, out s
34
35
} ;
35
36
36
37
using var process = new Process { StartInfo = startInfo } ;
37
- process . Start ( ) ;
38
- output = process . StandardOutput . ReadToEnd ( ) ;
39
- error = process . StandardError . ReadToEnd ( ) ;
40
- process . WaitForExit ( ) ;
38
+ process . Start ( ) ;
39
+ output = process . StandardOutput . ReadToEnd ( ) ;
40
+ error = process . StandardError . ReadToEnd ( ) ;
41
+ process . WaitForExit ( ) ;
41
42
exitCode = process . ExitCode ;
42
43
return exitCode == 0 ;
43
44
}
44
45
45
- public static void Main ( string [ ] args )
46
+ public static void Main ( string [ ] args )
46
47
{
47
- if ( args . Length != 2 ) {
48
+ if ( args . Length != 2 ) {
48
49
Console . Error . WriteLine ( "USAGE: mono GenerateTestFixture.exe NAME PATH" ) ;
49
50
return ;
50
51
}
@@ -64,8 +65,7 @@ public static void Main (string [] args)
64
65
static void GenerateIFDFixture ( string name , string path )
65
66
{
66
67
// First run exiv2 on it.
67
- string output , err ; int code ;
68
- var result = RunProcess ( "listData" , $ "e { path } ", out output , out err , out code ) ;
68
+ var result = RunProcess ( "listData" , $ "e { path } ", out var output , out var err , out var code ) ;
69
69
if ( ! result ) {
70
70
Console . Error . WriteLine ( "Invoking listData failed, are you running from the examples folder?\n " + err ) ;
71
71
return ;
@@ -78,7 +78,7 @@ static void GenerateIFDFixture (string name, string path)
78
78
if ( parts . Length == 0 || line . Trim ( ) . Equals ( string . Empty ) || parts . Length != 5 )
79
79
continue ;
80
80
string tag_label = parts [ 0 ] ;
81
- ushort tag = ushort . Parse ( parts [ 1 ] . Substring ( 2 ) , System . Globalization . NumberStyles . HexNumber ) ;
81
+ ushort tag = ushort . Parse ( parts [ 1 ] . Substring ( 2 ) , System . Globalization . NumberStyles . HexNumber ) ;
82
82
string ifd = parts [ 2 ] ;
83
83
string type = parts [ 3 ] ;
84
84
uint length = uint . Parse ( parts [ 4 ] ) ;
@@ -146,15 +146,15 @@ static void GenerateIFDFixture (string name, string path)
146
146
} else if ( ifd . Equals ( "GPSInfo" ) ) {
147
147
EmitTestIFDEntryOpen ( "gps_structure" , 0 , tag , ifd ) ;
148
148
} else if ( ifd . Equals ( "CanonCs" ) ) {
149
- EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . CameraSettings , ifd ) ;
149
+ EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . CameraSettings , ifd ) ;
150
150
} else if ( ifd . Equals ( "CanonSi" ) ) {
151
- EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . ShotInfo , ifd ) ;
151
+ EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . ShotInfo , ifd ) ;
152
152
} else if ( ifd . Equals ( "CanonCf" ) ) {
153
- EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . CustomFunctions , ifd ) ;
153
+ EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . CustomFunctions , ifd ) ;
154
154
} else if ( ifd . Equals ( "CanonPi" ) ) {
155
- EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . PictureInfo , ifd ) ;
155
+ EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) CanonMakerNoteEntryTag . PictureInfo , ifd ) ;
156
156
} else if ( ifd . Equals ( "CanonFi" ) ) {
157
- EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) 0x93 , ifd ) ;
157
+ EmitTestIFDEntryOpen ( "makernote_structure" , 0 , ( ushort ) 0x93 , ifd ) ;
158
158
} else if ( ifd . Equals ( "PanasonicRaw" ) ) {
159
159
EmitTestIFDEntryOpen ( "pana_structure" , 0 , tag , ifd ) ;
160
160
} else if ( sub_ifds . ContainsKey ( ifd ) ) {
@@ -171,7 +171,7 @@ static void GenerateIFDFixture (string name, string path)
171
171
// And the fist both entries are combined to a long by exiv2.
172
172
if ( tag == 0x0001 ) {
173
173
string val1 = ( ( ushort ) uint . Parse ( val ) ) . ToString ( ) ;
174
- string val2 = ( ( ushort ) ( uint . Parse ( val ) >> 16 ) ) . ToString ( ) ;
174
+ string val2 = ( ( ushort ) ( uint . Parse ( val ) >> 16 ) ) . ToString ( ) ;
175
175
EmitTestIFDIndexedShortEntry ( tag , val1 ) ;
176
176
EmitTestIFDIndexedShortEntry ( tag + 1 , val2 ) ;
177
177
} else {
@@ -240,8 +240,7 @@ static void GenerateIFDFixture (string name, string path)
240
240
static void GenerateXMPFixture ( string name , string path )
241
241
{
242
242
// First run exiv2 on it.
243
- string output , err ; int code ;
244
- var result = RunProcess ( "listData" , $ "x { path } ", out output , out err , out code ) ;
243
+ var result = RunProcess ( "listData" , $ "x { path } ", out var output , out var err , out var code ) ;
245
244
if ( ! result ) {
246
245
Console . Error . WriteLine ( "Invoking exiv2 failed, do you have it installed?\n " + err ) ;
247
246
return ;
@@ -257,13 +256,13 @@ static void GenerateXMPFixture (string name, string path)
257
256
Write ( "XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;" ) ;
258
257
259
258
// Build prefix lookup dictionary.
260
- Type t = typeof ( XmpTag ) ;
261
- foreach ( var member in t . GetMembers ( ) ) {
259
+ Type t = typeof ( XmpTag ) ;
260
+ foreach ( var member in t . GetMembers ( ) ) {
262
261
if ( ! member . Name . EndsWith ( "_NS" ) )
263
262
continue ;
264
263
string val = ( member as System . Reflection . FieldInfo ) . GetValue ( null ) as string ;
265
- string prefix = XmpTag . NamespacePrefixes [ val ] ;
266
- xmp_prefixes [ prefix ] = member . Name ;
264
+ string prefix = XmpTag . NamespacePrefixes [ val ] ;
265
+ xmp_prefixes [ prefix ] = member . Name ;
267
266
}
268
267
269
268
foreach ( string line in output . Split ( '\n ' ) ) {
@@ -303,9 +302,9 @@ static void EmitXmpTest (string label, string type, uint length, string val)
303
302
// Plain node
304
303
int index = 0 ;
305
304
string name = parts [ 2 ] ;
306
- if ( parts [ 2 ] . EndsWith ( "]" ) ) {
305
+ if ( parts [ 2 ] . EndsWith ( "]" ) ) {
307
306
int index_start = parts [ 2 ] . LastIndexOf ( "[" ) ;
308
- string index_str = parts [ 2 ] . Substring ( index_start + 1 , parts [ 2 ] . Length - index_start - 2 ) ;
307
+ string index_str = parts [ 2 ] . Substring ( index_start + 1 , parts [ 2 ] . Length - index_start - 2 ) ;
309
308
index = int . Parse ( index_str ) ;
310
309
name = parts [ 2 ] . Substring ( 0 , index_start ) ;
311
310
}
@@ -323,7 +322,7 @@ static void EmitXmpTest (string label, string type, uint length, string val)
323
322
Write ( $ "node = node.GetChild ({ ns } , \" { name } \" );") ;
324
323
Write ( "Assert.IsNotNull (node);" ) ;
325
324
} else {
326
- throw new Exception ( "Can't navigate to " + node ) ;
325
+ throw new Exception ( "Can't navigate to " + node ) ;
327
326
}
328
327
}
329
328
@@ -338,7 +337,7 @@ static void EmitXmpTest (string label, string type, uint length, string val)
338
337
Write ( $ "Assert.AreEqual (\" { val } \" , node.Children [0].Value);") ;
339
338
} else if ( type . Equals ( "LangAlt" ) && length == 1 ) {
340
339
var langparts = val . Split ( [ ' ' ] , 2 ) ;
341
- string lang = langparts [ 0 ] . Substring ( langparts [ 0 ] . IndexOf ( '"' ) + 1 , langparts [ 0 ] . Length - langparts [ 0 ] . IndexOf ( '"' ) - 2 ) ;
340
+ string lang = langparts [ 0 ] . Substring ( langparts [ 0 ] . IndexOf ( '"' ) + 1 , langparts [ 0 ] . Length - langparts [ 0 ] . IndexOf ( '"' ) - 2 ) ;
342
341
Write ( $ "Assert.AreEqual (\" { lang } \" , node.Children [0].GetQualifier (XmpTag.XML_NS, \" lang\" ).Value);") ;
343
342
Write ( $ "Assert.AreEqual (\" { langparts [ 1 ] } \" , node.Children [0].Value);") ;
344
343
} else if ( type . Equals ( "XmpSeq" ) && length == 1 ) {
@@ -347,20 +346,20 @@ static void EmitXmpTest (string label, string type, uint length, string val)
347
346
Write ( $ "Assert.AreEqual ({ length } , node.Children.Count);") ;
348
347
Write ( $ "Assert.AreEqual (\" { val } \" , node.Children [0].Value);") ;
349
348
} else if ( type . Equals ( "XmpSeq" ) && length > 1 ) {
350
- string [ ] vals = val . Split ( ',' ) ;
349
+ string [ ] vals = val . Split ( ',' ) ;
351
350
Write ( "Assert.AreEqual (XmpNodeType.Seq, node.Type);" ) ;
352
351
Write ( "Assert.AreEqual (\" \" , node.Value);" ) ;
353
352
Write ( $ "Assert.AreEqual ({ length } , node.Children.Count);") ;
354
353
var per_iter = vals . Length / length ;
355
354
for ( int i = 0 ; i < length ; i ++ ) {
356
355
var builder = new List < string > ( ) ;
357
356
for ( int j = 0 ; j < per_iter ; j ++ ) {
358
- builder . Add ( vals [ per_iter * i + j ] . Trim ( ) ) ;
357
+ builder . Add ( vals [ per_iter * i + j ] . Trim ( ) ) ;
359
358
}
360
359
Write ( $ "Assert.AreEqual (\" { string . Join ( ", " , builder . ToArray ( ) ) } \" , node.Children [{ i } ].Value);") ;
361
360
}
362
361
} else if ( type . Equals ( "XmpBag" ) && length > 1 ) {
363
- string [ ] vals = val . Split ( ',' ) ;
362
+ string [ ] vals = val . Split ( ',' ) ;
364
363
Write ( "Assert.AreEqual (XmpNodeType.Bag, node.Type);" ) ;
365
364
Write ( "Assert.AreEqual (\" \" , node.Value);" ) ;
366
365
Write ( $ "Assert.AreEqual ({ length } , node.Children.Count);") ;
@@ -373,7 +372,7 @@ static void EmitXmpTest (string label, string type, uint length, string val)
373
372
for ( int i = 0 ; i < length ; i ++ ) {
374
373
var builder = new List < string > ( ) ;
375
374
for ( int j = 0 ; j < per_iter ; j ++ ) {
376
- builder . Add ( vals [ per_iter * i + j ] . Trim ( ) ) ;
375
+ builder . Add ( vals [ per_iter * i + j ] . Trim ( ) ) ;
377
376
}
378
377
Write ( $ "Assert.IsTrue (children_array.Contains (\" { string . Join ( ", " , builder . ToArray ( ) ) } \" ));") ;
379
378
}
@@ -396,8 +395,7 @@ static void EmitXmpTest (string label, string type, uint length, string val)
396
395
397
396
static string ExtractKey ( string file , string key )
398
397
{
399
- string output , err ; int code ;
400
- var result = RunProcess ( "extractKey" , $ "{ file } { key } ", out output , out err , out code ) ;
398
+ var result = RunProcess ( "extractKey" , $ "{ file } { key } ", out var output , out var err , out var code ) ;
401
399
if ( ! result ) {
402
400
Console . Error . WriteLine ( "Invoking extractKey failed, are you running from the examples folder?\n " + err ) ;
403
401
return string . Empty ;
@@ -418,10 +416,11 @@ static string GetXmpNs (string prefix)
418
416
prefix = "MicrosoftPhoto" ;
419
417
if ( xmp_prefixes . TryGetValue ( prefix , out var result ) )
420
418
return $ "XmpTag.{ result } ";
421
- throw new Exception ( "Unknown namespace prefix: " + prefix ) ;
419
+ throw new Exception ( "Unknown namespace prefix: " + prefix ) ;
422
420
}
423
421
424
- static bool IsPartOfMakernote ( string ifd ) {
422
+ static bool IsPartOfMakernote ( string ifd )
423
+ {
425
424
return ifd . Equals ( "MakerNote" ) ||
426
425
ifd . Equals ( "Canon" ) ||
427
426
ifd . Equals ( "Sony" ) ||
@@ -436,7 +435,7 @@ static bool IsPartOfMakernote (string ifd) {
436
435
static void EmitHeader ( string name , string path )
437
436
{
438
437
int start = path . LastIndexOf ( '/' ) ;
439
- string filename = path . Substring ( start + 1 ) ;
438
+ string filename = path . Substring ( start + 1 ) ;
440
439
Write ( "// TODO: This file is automatically generated" ) ;
441
440
Write ( "// TODO: Further manual verification is needed" ) ;
442
441
Write ( ) ;
@@ -493,7 +492,8 @@ static void EmitFooter ()
493
492
static bool iop_emitted = false ;
494
493
static bool gps_emitted = false ;
495
494
496
- static void EnsureIFD ( string ifd ) {
495
+ static void EnsureIFD ( string ifd )
496
+ {
497
497
if ( ifd . Equals ( "PanasonicRaw" ) ) {
498
498
if ( is_panasonic_raw )
499
499
return ;
@@ -691,19 +691,19 @@ static void EmitTestIFDSShortArrayEntry (string val)
691
691
static void EmitTestIFDRationalEntry ( string val )
692
692
{
693
693
Write ( "Assert.IsNotNull (entry as RationalIFDEntry, \" Entry is not a rational!\" );" ) ;
694
- string [ ] parts = val . Split ( '/' ) ;
694
+ string [ ] parts = val . Split ( '/' ) ;
695
695
Write ( $ "Assert.AreEqual ({ parts [ 0 ] } , (entry as RationalIFDEntry).Value.Numerator);") ;
696
696
Write ( $ "Assert.AreEqual ({ parts [ 1 ] } , (entry as RationalIFDEntry).Value.Denominator);") ;
697
697
}
698
698
699
699
static void EmitTestIFDRationalArrayEntry ( string val )
700
700
{
701
- var parts = val . Split ( ' ' ) ;
701
+ var parts = val . Split ( ' ' ) ;
702
702
Write ( "Assert.IsNotNull (entry as RationalArrayIFDEntry, \" Entry is not a rational array!\" );" ) ;
703
703
Write ( "var parts = (entry as RationalArrayIFDEntry).Values;" ) ;
704
704
Write ( $ "Assert.AreEqual ({ parts . Length } , parts.Length);") ;
705
705
for ( int i = 0 ; i < parts . Length ; i ++ ) {
706
- var pieces = parts [ i ] . Split ( '/' ) ;
706
+ var pieces = parts [ i ] . Split ( '/' ) ;
707
707
Write ( $ "Assert.AreEqual ({ pieces [ 0 ] } , parts[{ i } ].Numerator);") ;
708
708
Write ( $ "Assert.AreEqual ({ pieces [ 1 ] } , parts[{ i } ].Denominator);") ;
709
709
}
@@ -712,19 +712,19 @@ static void EmitTestIFDRationalArrayEntry (string val)
712
712
static void EmitTestIFDSRationalEntry ( string val )
713
713
{
714
714
Write ( "Assert.IsNotNull (entry as SRationalIFDEntry, \" Entry is not a srational!\" );" ) ;
715
- string [ ] parts = val . Split ( '/' ) ;
715
+ string [ ] parts = val . Split ( '/' ) ;
716
716
Write ( $ "Assert.AreEqual ({ parts [ 0 ] } , (entry as SRationalIFDEntry).Value.Numerator);") ;
717
717
Write ( $ "Assert.AreEqual ({ parts [ 1 ] } , (entry as SRationalIFDEntry).Value.Denominator);") ;
718
718
}
719
719
720
720
static void EmitTestIFDSRationalArrayEntry ( string val )
721
721
{
722
- var parts = val . Split ( ' ' ) ;
722
+ var parts = val . Split ( ' ' ) ;
723
723
Write ( "Assert.IsNotNull (entry as SRationalArrayIFDEntry, \" Entry is not a srational array!\" );" ) ;
724
724
Write ( "var parts = (entry as SRationalArrayIFDEntry).Values;" ) ;
725
725
Write ( $ "Assert.AreEqual ({ parts . Length } , parts.Length);") ;
726
726
for ( int i = 0 ; i < parts . Length ; i ++ ) {
727
- var pieces = parts [ i ] . Split ( '/' ) ;
727
+ var pieces = parts [ i ] . Split ( '/' ) ;
728
728
Write ( $ "Assert.AreEqual ({ pieces [ 0 ] } , parts[{ i } ].Numerator);") ;
729
729
Write ( $ "Assert.AreEqual ({ pieces [ 1 ] } , parts[{ i } ].Denominator);") ;
730
730
}
@@ -785,26 +785,26 @@ static void EmitByteArrayComparison (string val, string type, string type_desc)
785
785
{
786
786
Write ( $ "Assert.IsNotNull (entry as { type } , \" Entry is not { type_desc } !\" );") ;
787
787
Write ( $ "var parsed_bytes = (entry as { type } ).Data.Data;") ;
788
- var parts = val . Trim ( ) . Split ( ' ' ) ;
788
+ var parts = val . Trim ( ) . Split ( ' ' ) ;
789
789
if ( parts . Length < 512 ) {
790
790
Write ( $ "var bytes = new byte [] {{ { string . Join ( ", " , parts ) } }};") ;
791
791
Write ( "Assert.AreEqual (bytes, parsed_bytes);" ) ;
792
792
} else {
793
793
// Starting with 512 byte items, we compare based on an MD5 hash, should be faster and reduces
794
794
// the size of the test fixtures.
795
- byte [ ] data = new byte [ parts . Length ] ;
795
+ byte [ ] data = new byte [ parts . Length ] ;
796
796
for ( int i = 0 ; i < parts . Length ; i ++ ) {
797
- data [ i ] = byte . Parse ( parts [ i ] ) ;
797
+ data [ i ] = byte . Parse ( parts [ i ] ) ;
798
798
}
799
799
var hash = md5 . ComputeHash ( data ) ;
800
800
801
- StringBuilder shash = new StringBuilder ( ) ;
801
+ var shash = new StringBuilder ( ) ;
802
802
for ( int i = 0 ; i < hash . Length ; i ++ ) {
803
803
shash . Append ( hash [ i ] . ToString ( "x2" ) ) ;
804
804
}
805
805
806
806
Write ( "var parsed_hash = Utils.Md5Encode (parsed_bytes);" ) ;
807
- Write ( $ "Assert.AreEqual (\" { shash . ToString ( ) } \" , parsed_hash);") ;
807
+ Write ( $ "Assert.AreEqual (\" { shash } \" , parsed_hash);") ;
808
808
Write ( $ "Assert.AreEqual ({ parts . Length } , parsed_bytes.Length);") ;
809
809
}
810
810
}
@@ -851,7 +851,7 @@ static void EmitTestIFDIndexedShortEntry (int index, string val)
851
851
Write ( $ "Assert.AreEqual ({ parts [ i ] } , (entry as ShortArrayIFDEntry).Values [{ index + i } ]);") ;
852
852
}
853
853
854
- #region IFD tag names lookup
854
+ #region IFD tag names lookup
855
855
856
856
static Dictionary < string , Dictionary < ushort , string > > tag_names = null ;
857
857
@@ -904,14 +904,14 @@ static void IndexTagType (string ifd, Type t, string typename)
904
904
if ( ! tag_names . ContainsKey ( ifd ) )
905
905
tag_names [ ifd ] = new Dictionary < ushort , string > ( ) ;
906
906
foreach ( string name in Enum . GetNames ( t ) ) {
907
- ushort tag = ( ushort ) Enum . Parse ( t , name ) ;
907
+ ushort tag = ( ushort ) Enum . Parse ( t , name ) ;
908
908
tag_names [ ifd ] [ tag ] = $ "{ typename } .{ name } ";
909
909
}
910
910
}
911
911
912
- #endregion
912
+ #endregion
913
913
914
- #region Code emission
914
+ #region Code emission
915
915
916
916
static int level = 0 ;
917
917
@@ -936,5 +936,5 @@ static void Write (string str)
936
936
level ++ ;
937
937
}
938
938
939
- #endregion
939
+ #endregion
940
940
}
0 commit comments