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"?>`