URI: 
       exif_test.go - hugo - [fork] hugo port for 9front
  HTML git clone https://git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
       exif_test.go (6813B)
       ---
            1 // Copyright 2019 The Hugo Authors. All rights reserved.
            2 //
            3 // Licensed under the Apache License, Version 2.0 (the "License");
            4 // you may not use this file except in compliance with the License.
            5 // You may obtain a copy of the License at
            6 // http://www.apache.org/licenses/LICENSE-2.0
            7 //
            8 // Unless required by applicable law or agreed to in writing, software
            9 // distributed under the License is distributed on an "AS IS" BASIS,
           10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
           11 // See the License for the specific language governing permissions and
           12 // limitations under the License.
           13 
           14 package exif
           15 
           16 import (
           17         "encoding/json"
           18         "os"
           19         "path/filepath"
           20         "testing"
           21         "time"
           22 
           23         "github.com/bep/imagemeta"
           24         "github.com/google/go-cmp/cmp"
           25 
           26         qt "github.com/frankban/quicktest"
           27 )
           28 
           29 func TestExif(t *testing.T) {
           30         c := qt.New(t)
           31         f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg"))
           32         c.Assert(err, qt.IsNil)
           33         defer f.Close()
           34 
           35         d, err := NewDecoder(IncludeFields("Lens|Date"))
           36         c.Assert(err, qt.IsNil)
           37         x, err := d.Decode("", imagemeta.JPEG, f)
           38         c.Assert(err, qt.IsNil)
           39         c.Assert(x.Date.Format("2006-01-02"), qt.Equals, "2017-10-27")
           40 
           41         // Malaga: https://goo.gl/taazZy
           42 
           43         c.Assert(x.Lat, qt.Equals, float64(36.59744166666667))
           44         c.Assert(x.Long, qt.Equals, float64(-4.50846))
           45 
           46         v, found := x.Tags["LensModel"]
           47         c.Assert(found, qt.Equals, true)
           48         lensModel, ok := v.(string)
           49         c.Assert(ok, qt.Equals, true)
           50         c.Assert(lensModel, qt.Equals, "smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM")
           51 
           52         v, found = x.Tags["ModifyDate"]
           53         c.Assert(found, qt.Equals, true)
           54         c.Assert(v, qt.Equals, "2017:11:23 09:56:54")
           55 
           56         // Verify that it survives a round-trip to JSON and back.
           57         data, err := json.Marshal(x)
           58         c.Assert(err, qt.IsNil)
           59         x2 := &ExifInfo{}
           60         err = json.Unmarshal(data, x2)
           61         c.Assert(err, qt.IsNil)
           62 
           63         c.Assert(x2, eq, x)
           64 }
           65 
           66 func TestExifPNG(t *testing.T) {
           67         c := qt.New(t)
           68 
           69         f, err := os.Open(filepath.FromSlash("../../testdata/gohugoio.png"))
           70         c.Assert(err, qt.IsNil)
           71         defer f.Close()
           72 
           73         d, err := NewDecoder()
           74         c.Assert(err, qt.IsNil)
           75         _, err = d.Decode("", imagemeta.PNG, f)
           76         c.Assert(err, qt.IsNil)
           77 }
           78 
           79 func TestIssue8079(t *testing.T) {
           80         c := qt.New(t)
           81 
           82         f, err := os.Open(filepath.FromSlash("../../testdata/iss8079.jpg"))
           83         c.Assert(err, qt.IsNil)
           84         defer f.Close()
           85 
           86         d, err := NewDecoder()
           87         c.Assert(err, qt.IsNil)
           88         x, err := d.Decode("", imagemeta.JPEG, f)
           89         c.Assert(err, qt.IsNil)
           90         c.Assert(x.Tags["ImageDescription"], qt.Equals, "Città del Vaticano #nanoblock #vatican #vaticancity")
           91 }
           92 
           93 func BenchmarkDecodeExif(b *testing.B) {
           94         c := qt.New(b)
           95         f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg"))
           96         c.Assert(err, qt.IsNil)
           97         defer f.Close()
           98 
           99         d, err := NewDecoder()
          100         c.Assert(err, qt.IsNil)
          101 
          102         b.ResetTimer()
          103         for i := 0; i < b.N; i++ {
          104                 _, err = d.Decode("", imagemeta.JPEG, f)
          105                 c.Assert(err, qt.IsNil)
          106                 f.Seek(0, 0)
          107         }
          108 }
          109 
          110 var eq = qt.CmpEquals(
          111         cmp.Comparer(
          112                 func(v1, v2 imagemeta.Rat[uint32]) bool {
          113                         return v1.String() == v2.String()
          114                 },
          115         ),
          116         cmp.Comparer(
          117                 func(v1, v2 imagemeta.Rat[int32]) bool {
          118                         return v1.String() == v2.String()
          119                 },
          120         ),
          121         cmp.Comparer(func(v1, v2 time.Time) bool {
          122                 return v1.Unix() == v2.Unix()
          123         }),
          124 )
          125 
          126 func TestIssue10738(t *testing.T) {
          127         c := qt.New(t)
          128 
          129         testFunc := func(c *qt.C, path, include string) any {
          130                 c.Helper()
          131                 f, err := os.Open(filepath.FromSlash(path))
          132                 c.Assert(err, qt.IsNil)
          133                 defer f.Close()
          134 
          135                 d, err := NewDecoder(IncludeFields(include))
          136                 c.Assert(err, qt.IsNil)
          137                 x, err := d.Decode("", imagemeta.JPEG, f)
          138                 c.Assert(err, qt.IsNil)
          139 
          140                 // Verify that it survives a round-trip to JSON and back.
          141                 data, err := json.Marshal(x)
          142                 c.Assert(err, qt.IsNil)
          143                 x2 := &ExifInfo{}
          144                 err = json.Unmarshal(data, x2)
          145                 c.Assert(err, qt.IsNil)
          146 
          147                 c.Assert(x2, eq, x)
          148 
          149                 v, found := x.Tags["ExposureTime"]
          150                 c.Assert(found, qt.Equals, true)
          151                 return v
          152         }
          153 
          154         type args struct {
          155                 path    string // imagePath
          156                 include string // includeFields
          157         }
          158 
          159         type want struct {
          160                 vN int64 // numerator
          161                 vD int64 // denominator
          162         }
          163 
          164         type testCase struct {
          165                 name string
          166                 args args
          167                 want want
          168         }
          169 
          170         tests := []testCase{
          171                 {
          172                         "canon_cr2_fraction", args{
          173                                 path:    "../../testdata/issue10738/canon_cr2_fraction.jpg",
          174                                 include: "Lens|Date|ExposureTime",
          175                         }, want{
          176                                 1,
          177                                 500,
          178                         },
          179                 },
          180                 {
          181                         "canon_cr2_integer", args{
          182                                 path:    "../../testdata/issue10738/canon_cr2_integer.jpg",
          183                                 include: "Lens|Date|ExposureTime",
          184                         }, want{
          185                                 10,
          186                                 1,
          187                         },
          188                 },
          189                 {
          190                         "dji_dng_fraction", args{
          191                                 path:    "../../testdata/issue10738/dji_dng_fraction.jpg",
          192                                 include: "Lens|Date|ExposureTime",
          193                         }, want{
          194                                 1,
          195                                 4000,
          196                         },
          197                 },
          198                 {
          199                         "fuji_raf_fraction", args{
          200                                 path:    "../../testdata/issue10738/fuji_raf_fraction.jpg",
          201                                 include: "Lens|Date|ExposureTime",
          202                         }, want{
          203                                 1,
          204                                 250,
          205                         },
          206                 },
          207                 {
          208                         "fuji_raf_integer", args{
          209                                 path:    "../../testdata/issue10738/fuji_raf_integer.jpg",
          210                                 include: "Lens|Date|ExposureTime",
          211                         }, want{
          212                                 1,
          213                                 1,
          214                         },
          215                 },
          216                 {
          217                         "leica_dng_fraction", args{
          218                                 path:    "../../testdata/issue10738/leica_dng_fraction.jpg",
          219                                 include: "Lens|Date|ExposureTime",
          220                         }, want{
          221                                 1,
          222                                 100,
          223                         },
          224                 },
          225                 {
          226                         "lumix_rw2_fraction", args{
          227                                 path:    "../../testdata/issue10738/lumix_rw2_fraction.jpg",
          228                                 include: "Lens|Date|ExposureTime",
          229                         }, want{
          230                                 1,
          231                                 400,
          232                         },
          233                 },
          234                 {
          235                         "nikon_nef_d5600", args{
          236                                 path:    "../../testdata/issue10738/nikon_nef_d5600.jpg",
          237                                 include: "Lens|Date|ExposureTime",
          238                         }, want{
          239                                 1,
          240                                 1000,
          241                         },
          242                 },
          243                 {
          244                         "nikon_nef_fraction", args{
          245                                 path:    "../../testdata/issue10738/nikon_nef_fraction.jpg",
          246                                 include: "Lens|Date|ExposureTime",
          247                         }, want{
          248                                 1,
          249                                 640,
          250                         },
          251                 },
          252                 {
          253                         "nikon_nef_integer", args{
          254                                 path:    "../../testdata/issue10738/nikon_nef_integer.jpg",
          255                                 include: "Lens|Date|ExposureTime",
          256                         }, want{
          257                                 30,
          258                                 1,
          259                         },
          260                 },
          261                 {
          262                         "nikon_nef_fraction_2", args{
          263                                 path:    "../../testdata/issue10738/nikon_nef_fraction_2.jpg",
          264                                 include: "Lens|Date|ExposureTime",
          265                         }, want{
          266                                 1,
          267                                 6400,
          268                         },
          269                 },
          270                 {
          271                         "sony_arw_fraction", args{
          272                                 path:    "../../testdata/issue10738/sony_arw_fraction.jpg",
          273                                 include: "Lens|Date|ExposureTime",
          274                         }, want{
          275                                 1,
          276                                 160,
          277                         },
          278                 },
          279                 {
          280                         "sony_arw_integer", args{
          281                                 path:    "../../testdata/issue10738/sony_arw_integer.jpg",
          282                                 include: "Lens|Date|ExposureTime",
          283                         }, want{
          284                                 4,
          285                                 1,
          286                         },
          287                 },
          288         }
          289 
          290         for _, tt := range tests {
          291                 c.Run(tt.name, func(c *qt.C) {
          292                         got := testFunc(c, tt.args.path, tt.args.include)
          293                         switch v := got.(type) {
          294                         case float64:
          295                                 c.Assert(v, qt.Equals, float64(tt.want.vN))
          296                         case imagemeta.Rat[uint32]:
          297                                 r, err := imagemeta.NewRat[uint32](uint32(tt.want.vN), uint32(tt.want.vD))
          298                                 c.Assert(err, qt.IsNil)
          299                                 c.Assert(v, eq, r)
          300                         default:
          301                                 c.Fatalf("unexpected type: %T", got)
          302                         }
          303                 })
          304         }
          305 }