github.com/boki/go-xmp@v1.0.1/test/marshal_test.go (about) 1 // Copyright (c) 2017-2018 Alexander Eichhorn 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"): you may 4 // not use this file except in compliance with the License. You may obtain 5 // a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations 13 // under the License. 14 15 package main 16 17 import ( 18 "encoding/json" 19 "os" 20 "path/filepath" 21 "testing" 22 23 _ "trimmer.io/go-xmp/models" 24 "trimmer.io/go-xmp/xmp" 25 ) 26 27 var ( 28 buf []byte 29 testfiles []string 30 ) 31 32 // Testcases 33 // 34 35 func init() { 36 testfiles, _ = filepath.Glob("../samples/*.xmp") 37 xmp.SetLogLevel(xmp.LogLevelError) 38 } 39 40 func TestUnmarshalXMP(T *testing.T) { 41 for _, v := range testfiles { 42 f, err := os.Open(v) 43 if err != nil { 44 T.Logf("Cannot open sample '%s': %v", v, err) 45 continue 46 } 47 d := xmp.NewDecoder(f) 48 doc := &xmp.Document{} 49 if err := d.Decode(doc); err != nil { 50 T.Errorf("%s: %v", v, err) 51 } 52 f.Close() 53 doc.Close() 54 } 55 } 56 57 func TestMarshalXMP(T *testing.T) { 58 for _, v := range testfiles { 59 f, err := os.Open(v) 60 if err != nil { 61 T.Logf("Cannot open sample '%s': %v", v, err) 62 continue 63 } 64 d := xmp.NewDecoder(f) 65 doc := &xmp.Document{} 66 if err := d.Decode(doc); err != nil { 67 T.Errorf("%s: %v", v, err) 68 } 69 f.Close() 70 buf, err := xmp.Marshal(doc) 71 if err != nil { 72 T.Errorf("%s: %v", v, err) 73 } else if len(buf) == 0 { 74 T.Errorf("%s: empty result", v) 75 } 76 doc.Close() 77 } 78 } 79 80 func TestMarshalJSON(T *testing.T) { 81 for _, v := range testfiles { 82 f, err := os.Open(v) 83 if err != nil { 84 T.Logf("Cannot open sample '%s': %v", v, err) 85 continue 86 } 87 d := xmp.NewDecoder(f) 88 doc := &xmp.Document{} 89 if err := d.Decode(doc); err != nil { 90 T.Errorf("%s: %v", v, err) 91 } 92 f.Close() 93 buf, err = json.MarshalIndent(d, "", " ") 94 if err != nil { 95 T.Errorf("%s: %v", v, err) 96 } else if len(buf) == 0 { 97 T.Errorf("%s: empty result", v) 98 } 99 doc.Close() 100 } 101 } 102 103 func TestXmpRoundtrip(T *testing.T) { 104 for _, v := range testfiles { 105 f, err := os.Open(v) 106 if err != nil { 107 T.Logf("Cannot open sample '%s': %v", v, err) 108 continue 109 } 110 d := xmp.NewDecoder(f) 111 doc := &xmp.Document{} 112 if err := d.Decode(doc); err != nil { 113 T.Errorf("%s: %v", v, err) 114 } 115 f.Close() 116 buf, err := xmp.Marshal(doc) 117 if err != nil { 118 T.Errorf("%s: %v", v, err) 119 continue 120 } else if len(buf) == 0 { 121 T.Errorf("%s: empty result", v) 122 continue 123 } 124 doc2 := &xmp.Document{} 125 if err := xmp.Unmarshal(buf, doc2); err != nil { 126 T.Errorf("XMP Roundtrip %s: %v", v, err) 127 } 128 doc.Close() 129 doc2.Close() 130 } 131 } 132 133 func TestJsonRoundtrip(T *testing.T) { 134 for _, v := range testfiles { 135 f, err := os.Open(v) 136 if err != nil { 137 T.Logf("Cannot open sample '%s': %v", v, err) 138 continue 139 } 140 d := xmp.NewDecoder(f) 141 doc := &xmp.Document{} 142 if err := d.Decode(doc); err != nil { 143 T.Errorf("%s: %v", v, err) 144 } 145 f.Close() 146 buf, err = json.MarshalIndent(d, "", " ") 147 if err != nil { 148 T.Errorf("%s: %v", v, err) 149 continue 150 } else if len(buf) == 0 { 151 T.Errorf("%s: empty result", v) 152 continue 153 } 154 doc2 := &xmp.Document{} 155 if err = json.Unmarshal(buf, doc2); err != nil { 156 T.Errorf("JSON Roundtrip %s: %v", v, err) 157 } 158 doc.Close() 159 doc2.Close() 160 } 161 } 162 163 // Benchmarks 164 // 165 // func BenchmarkUnmarshalXMP(B *testing.B) { 166 // xmp.SetLogLevel(xmp.LogLevelError) 167 // b := []byte(data) 168 // for i := 0; i < B.N; i++ { 169 // d := &xmp.Document{} 170 // if err := xmp.Unmarshal(b, d); err != nil { 171 // B.Fatal(err) 172 // } 173 // d.Close() 174 // } 175 // } 176 177 // func BenchmarkMarshalXMP(B *testing.B) { 178 // xmp.SetLogLevel(xmp.LogLevelError) 179 // d := &xmp.Document{} 180 // if err := xmp.Unmarshal([]byte(data), d); err != nil { 181 // B.Fatal(err) 182 // } 183 // B.ResetTimer() 184 // var ( 185 // err error 186 // ) 187 // for i := 0; i < B.N; i++ { 188 // buf, err = xmp.Marshal(d) 189 // if err != nil { 190 // B.Fatal(err) 191 // } 192 // } 193 // d.Close() 194 // } 195 196 // func BenchmarkMarshalJSON(B *testing.B) { 197 // xmp.SetLogLevel(xmp.LogLevelError) 198 // d := &xmp.Document{} 199 // if err := xmp.Unmarshal([]byte(data), d); err != nil { 200 // B.Fatal(err) 201 // } 202 // B.ResetTimer() 203 // var ( 204 // err error 205 // ) 206 // for i := 0; i < B.N; i++ { 207 // buf, err = json.MarshalIndent(d, "", " ") 208 // if err != nil { 209 // B.Fatal(err) 210 // } 211 // } 212 // d.Close() 213 // } 214 215 // func BenchmarkUnmarshalJSON(B *testing.B) { 216 // xmp.SetLogLevel(xmp.LogLevelError) 217 // d := &xmp.Document{} 218 // if err := xmp.Unmarshal([]byte(data), d); err != nil { 219 // B.Fatal(err) 220 // } 221 // buf, err := json.MarshalIndent(d, "", " ") 222 // if err != nil { 223 // B.Fatal(err) 224 // } 225 // B.ResetTimer() 226 // for i := 0; i < B.N; i++ { 227 // dx := &xmp.Document{} 228 // if err = json.Unmarshal(buf, dx); err != nil { 229 // B.Fatal(err) 230 // } 231 // } 232 // d.Close() 233 // } 234 235 // const data = `<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> 236 // <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.155241, 2013/11/25-21:10:40 "> 237 // <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 238 // <rdf:Description rdf:about="" 239 // xmlns:xmp="http://ns.adobe.com/xap/1.0/" 240 // xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/" 241 // xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" 242 // xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" 243 // xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" 244 // xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" 245 // xmlns:dc="http://purl.org/dc/elements/1.1/" 246 // xmlns:creatorAtom="http://ns.adobe.com/creatorAtom/1.0/" 247 // xmp:CreateDate="2015-03-23T22:18:20-04:00" 248 // xmp:ModifyDate="2015-03-23T22:18:29-04:00" 249 // xmp:MetadataDate="2015-03-23T22:18:29-04:00" 250 // xmp:CreatorTool="Adobe Premiere Pro CC (Macintosh)" 251 // xmpDM:startTimeScale="24" 252 // xmpDM:startTimeSampleSize="1" 253 // xmpDM:videoFrameRate="24.000000" 254 // xmpDM:videoFieldOrder="Progressive" 255 // xmpDM:videoPixelAspectRatio="1/1" 256 // xmpDM:audioSampleRate="48000" 257 // xmpDM:audioSampleType="16Int" 258 // xmpDM:audioChannelType="Stereo" 259 // xmpMM:InstanceID="xmp.iid:5d95d24a-457a-44bd-a92c-0786456548fd" 260 // xmpMM:DocumentID="009fd353-c6ed-1e3f-5ae1-c92200000053" 261 // xmpMM:OriginalDocumentID="xmp.did:d1ae4cc5-a458-4eb7-9394-30ec546e2528" 262 // dc:format="QuickTime"> 263 // <xmpDM:duration 264 // xmpDM:value="203" 265 // xmpDM:scale="1/24"/> 266 // <xmpDM:altTimecode 267 // xmpDM:timeValue="01:02:03:04" 268 // xmpDM:timeFormat="24Timecode"/> 269 // <xmpDM:videoFrameSize 270 // stDim:w="1280" 271 // stDim:h="720" 272 // stDim:unit="pixel"/> 273 // <xmpDM:startTimecode 274 // xmpDM:timeFormat="24Timecode" 275 // xmpDM:timeValue="00:00:00:00"/> 276 // <xmpDM:projectRef 277 // xmpDM:type="movie"/> 278 // <xmpMM:History> 279 // <rdf:Seq> 280 // <rdf:li 281 // stEvt:action="saved" 282 // stEvt:instanceID="a985eefc-d371-6b9c-d554-0f0200000080" 283 // stEvt:when="2015-03-23T22:18:29-04:00" 284 // stEvt:softwareAgent="Adobe Premiere Pro CC (Macintosh)" 285 // stEvt:changed="/"/> 286 // <rdf:li 287 // stEvt:action="created" 288 // stEvt:instanceID="xmp.iid:8c22b83c-cfd3-43fe-b402-2d96d4a3d4d4" 289 // stEvt:when="2015-03-23T22:18:20-04:00" 290 // stEvt:softwareAgent="Adobe Premiere Pro CC (Macintosh)"/> 291 // <rdf:li 292 // stEvt:action="saved" 293 // stEvt:instanceID="xmp.iid:3f3bd4e9-9370-4b25-bb36-ac7d7184bbd5" 294 // stEvt:when="2015-03-23T22:18:29-04:00" 295 // stEvt:softwareAgent="Adobe Premiere Pro CC (Macintosh)" 296 // stEvt:changed="/"/> 297 // <rdf:li 298 // stEvt:action="saved" 299 // stEvt:instanceID="xmp.iid:5d95d24a-457a-44bd-a92c-0786456548fd" 300 // stEvt:when="2015-03-23T22:18:29-04:00" 301 // stEvt:softwareAgent="Adobe Premiere Pro CC (Macintosh)" 302 // stEvt:changed="/metadata"/> 303 // </rdf:Seq> 304 // </xmpMM:History> 305 // <xmpMM:Ingredients> 306 // <rdf:Bag> 307 // <rdf:li 308 // stRef:instanceID="47a9a75b-3a6b-0990-173c-d5a900000074" 309 // stRef:documentID="aeffd160-efa3-71bf-610a-09bd00000047" 310 // stRef:fromPart="time:0d2154055680000f254016000000" 311 // stRef:toPart="time:0d2154055680000f254016000000" 312 // stRef:filePath="CornerKick.mov" 313 // stRef:maskMarkers="None"/> 314 // <rdf:li 315 // stRef:instanceID="47a9a75b-3a6b-0990-173c-d5a900000074" 316 // stRef:documentID="aeffd160-efa3-71bf-610a-09bd00000047" 317 // stRef:fromPart="time:0d2154055680000f254016000000" 318 // stRef:toPart="time:0d2154055680000f254016000000" 319 // stRef:filePath="CornerKick.mov" 320 // stRef:maskMarkers="None"/> 321 // </rdf:Bag> 322 // </xmpMM:Ingredients> 323 // <xmpMM:Pantry> 324 // <rdf:Bag> 325 // <rdf:li> 326 // <rdf:Description 327 // xmp:CreateDate="2014-03-20T21:34:41Z" 328 // xmp:ModifyDate="2015-03-23T22:10:43-04:00" 329 // xmp:MetadataDate="2015-03-23T22:10:43-04:00" 330 // xmpDM:startTimeScale="5000" 331 // xmpDM:startTimeSampleSize="200" 332 // xmpMM:InstanceID="47a9a75b-3a6b-0990-173c-d5a900000074" 333 // xmpMM:DocumentID="aeffd160-efa3-71bf-610a-09bd00000047" 334 // xmpMM:OriginalDocumentID="xmp.did:cd1f24ab-d821-4bad-aa79-bdc9baaabe14"> 335 // <xmpDM:duration 336 // xmpDM:value="21200" 337 // xmpDM:scale="1/2500"/> 338 // <xmpDM:altTimecode 339 // xmpDM:timeValue="00:00:00:00" 340 // xmpDM:timeFormat="25Timecode"/> 341 // <xmpMM:History> 342 // <rdf:Seq> 343 // <rdf:li 344 // stEvt:action="saved" 345 // stEvt:instanceID="47a9a75b-3a6b-0990-173c-d5a900000074" 346 // stEvt:when="2015-03-23T22:10:43-04:00" 347 // stEvt:softwareAgent="Adobe Premiere Pro CC (Macintosh)" 348 // stEvt:changed="/"/> 349 // </rdf:Seq> 350 // </xmpMM:History> 351 // </rdf:Description> 352 // </rdf:li> 353 // </rdf:Bag> 354 // </xmpMM:Pantry> 355 // <xmpMM:DerivedFrom 356 // stRef:instanceID="xmp.iid:8c22b83c-cfd3-43fe-b402-2d96d4a3d4d4" 357 // stRef:documentID="xmp.did:8c22b83c-cfd3-43fe-b402-2d96d4a3d4d4" 358 // stRef:originalDocumentID="xmp.did:8c22b83c-cfd3-43fe-b402-2d96d4a3d4d4"/> 359 // <creatorAtom:windowsAtom 360 // creatorAtom:extension=".prproj" 361 // creatorAtom:invocationFlags="/L"/> 362 // <creatorAtom:macAtom 363 // creatorAtom:applicationCode="1347449455" 364 // creatorAtom:invocationAppleEvent="1129468018" 365 // creatorAtom:posixProjectPath="/Users/alandabul/Documents/Adobe/Premiere Pro/7.0/Untitled.prproj"/> 366 // </rdf:Description> 367 // </rdf:RDF> 368 // </x:xmpmeta> 369 370 // <?xpacket end="w"?>`