1+ using NUnit . Framework ;
2+ using TagLib ;
3+ using TagLib . IFD ;
4+ using TagLib . IFD . Tags ;
5+ using TagLib . IFD . Entries ;
6+ using TagLib . Xmp ;
7+ using TaglibSharp . Tests . Images . Validators ;
8+
9+ namespace TaglibSharp . Tests . Images
10+ {
11+ public class BadIptcSectionTest
12+ {
13+ [ Test ]
14+ public void Test ( )
15+ {
16+ ImageTest . Run ( "sample_IPTC_crash.jpg" ,
17+ false ,
18+ new BadIptcSectionTestInvariantValidator ( ) ,
19+ NoModificationValidator . Instance ,
20+ new PropertyModificationValidator < string > ( "Copyright" , null , "Copyright 2024 by Somebody Im Sure" )
21+ ) ;
22+ }
23+ }
24+ public class BadIptcSectionTestInvariantValidator : IMetadataInvariantValidator
25+ {
26+ int calls = 0 ;
27+ public void ValidateMetadataInvariants ( TagLib . Image . File file )
28+ {
29+ // If we get here, the fix works.
30+ ++ calls ;
31+
32+ Assert . IsNotNull ( file ) ;
33+
34+ Assert . IsFalse ( file . PossiblyCorrupt ) ; // The only problem is in the IPTC section, which we ignore.
35+
36+ var tag = file . GetTag ( TagTypes . TiffIFD ) as IFDTag ;
37+ Assert . IsNotNull ( tag , "IFD tag not found" ) ;
38+
39+ var structure = tag . Structure ;
40+
41+ var exif = structure . GetEntry ( 0 , ( ushort ) IFDEntryTag . ExifIFD ) as SubIFDEntry ;
42+ Assert . IsNotNull ( exif , "Exif tag not found" ) ;
43+
44+ var exif_structure = exif . Structure ;
45+ {
46+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . ExifVersion ) ;
47+ Assert . IsNotNull ( entry , "Entry 0x9000 missing in IFD 0" ) ;
48+ Assert . IsNotNull ( entry as UndefinedIFDEntry , "Entry is not an undefined IFD entry!" ) ;
49+ var parsed_bytes = ( entry as UndefinedIFDEntry ) . Data . Data ;
50+ var bytes = new byte [ ] { 48 , 50 , 51 , 49 } ;
51+ Assert . AreEqual ( bytes , parsed_bytes ) ;
52+ }
53+ {
54+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . ColorSpace ) ;
55+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
56+ Assert . IsNotNull ( entry as ShortIFDEntry , "Entry is not a short IFD entry!" ) ;
57+ var parsed_value = ( entry as ShortIFDEntry ) . Value ;
58+ Assert . AreEqual ( 65535 , parsed_value ) ;
59+ }
60+ {
61+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . PixelXDimension ) ;
62+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
63+ Assert . IsNotNull ( entry as LongIFDEntry , "Entry is not a long IFD entry!" ) ;
64+ var parsed_value = ( entry as LongIFDEntry ) . Value ;
65+ Assert . AreEqual ( 4845 , parsed_value ) ;
66+ }
67+ {
68+ var entry = exif_structure . GetEntry ( 0 , ( ushort ) ExifEntryTag . PixelYDimension ) ;
69+ Assert . IsNotNull ( entry , "Entry 0xa001 missing in IFD 0" ) ;
70+ Assert . IsNotNull ( entry as LongIFDEntry , "Entry is not a long IFD entry!" ) ;
71+ var parsed_value = ( entry as LongIFDEntry ) . Value ;
72+ Assert . AreEqual ( 2834 , parsed_value ) ;
73+ }
74+
75+
76+ var xmp = file . GetTag ( TagTypes . XMP ) as XmpTag ;
77+ Assert . IsNotNull ( xmp , "XMP tag not found" ) ;
78+
79+ Assert . AreEqual ( "Adobe Photoshop 22.1 (Windows)" , xmp . Software ) ;
80+ // ValidateMetadataInvariants is called 3 times for each Validator: once in the
81+ // ParseUnmodifiedFile method, once in the ModifyFile method before changing
82+ // anything, and once in the ParseModifiedFile method.
83+ // The PropertyModificationValidator class verifies the property setting, but
84+ // I'm not sure I totally trust it, so I'm going to check the property value
85+ // here as well.
86+ if ( calls == 1 )
87+ Assert . IsNull ( xmp . Copyright ) ;
88+ if ( xmp . Copyright != null )
89+ Assert . AreEqual ( "Copyright 2024 by Somebody Im Sure" , xmp . Copyright ) ;
90+ Assert . IsNull ( xmp . Creator ) ;
91+ }
92+ }
93+ }
0 commit comments