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 }