1package heif 2 3import ( 4 "bytes" 5 "fmt" 6 "os" 7 "testing" 8 9 "github.com/rwcarlsen/goexif/exif" 10 "github.com/rwcarlsen/goexif/tiff" 11) 12 13func TestAll(t *testing.T) { 14 f, err := os.Open("testdata/park.heic") 15 if err != nil { 16 t.Fatal(err) 17 } 18 defer f.Close() 19 h := Open(f) 20 21 // meta 22 _, err = h.getMeta() 23 if err != nil { 24 t.Fatalf("getMeta: %v", err) 25 } 26 27 it, err := h.PrimaryItem() 28 if err != nil { 29 t.Fatalf("PrimaryItem: %v", err) 30 } 31 if want := uint32(49); it.ID != want { 32 t.Errorf("PrimaryIem ID = %v; want %v", it.ID, want) 33 } 34 if it.Location == nil { 35 t.Errorf("Item.Location is nil") 36 } 37 if it.Info == nil { 38 t.Errorf("Item.Info is nil") 39 } 40 if len(it.Properties) == 0 { 41 t.Errorf("Item.Properties is empty") 42 } 43 for _, prop := range it.Properties { 44 t.Logf(" property: %q, %#v", prop.Type(), prop) 45 } 46 if w, h, ok := it.SpatialExtents(); !ok || w == 0 || h == 0 { 47 t.Errorf("no spatial extents found") 48 } else { 49 t.Logf("dimensions: %v x %v", w, h) 50 } 51 52 // exif 53 exbuf, err := h.EXIF() 54 if err != nil { 55 t.Errorf("EXIF: %v", err) 56 } else { 57 const magic = "Exif\x00\x00" 58 if !bytes.HasPrefix(exbuf, []byte(magic)) { 59 t.Errorf("Exif buffer doesn't start with %q: got %q", magic, exbuf) 60 } 61 x, err := exif.Decode(bytes.NewReader(exbuf)) 62 if err != nil { 63 t.Fatalf("EXIF decode: %v", err) 64 } 65 got := map[string]string{} 66 if err := x.Walk(walkFunc(func(name exif.FieldName, tag *tiff.Tag) error { 67 got[fmt.Sprint(name)] = fmt.Sprint(tag) 68 return nil 69 })); err != nil { 70 t.Fatalf("EXIF walk: %v", err) 71 } 72 if g, w := len(got), 56; g < w { 73 t.Errorf("saw %v EXIF tags; want at least %v", g, w) 74 } 75 if g, w := got["GPSLongitude"], `["122/1","21/1","3776/100"]`; g != w { 76 t.Errorf("GPSLongitude = %#q; want %#q", g, w) 77 } 78 79 } 80} 81 82func TestRotations(t *testing.T) { 83 f, err := os.Open("testdata/rotate.heic") 84 if err != nil { 85 t.Fatal(err) 86 } 87 defer f.Close() 88 h := Open(f) 89 it, err := h.PrimaryItem() 90 if err != nil { 91 t.Fatalf("PrimaryItem: %v", err) 92 } 93 if r := it.Rotations(); r != 3 { 94 t.Errorf("Rotations = %v; want %v", r, 3) 95 } 96 sw, sh, ok := it.SpatialExtents() 97 if !ok { 98 t.Fatalf("expected spatial extents") 99 } 100 vw, vh, ok := it.VisualDimensions() 101 if !ok { 102 t.Fatalf("expected visual dimensions") 103 } 104 if vw != sh || vh != sw { 105 t.Errorf("visual dimensions = %v, %v; want %v, %v", vw, vh, sh, sw) 106 } 107} 108 109type walkFunc func(exif.FieldName, *tiff.Tag) error 110 111func (f walkFunc) Walk(name exif.FieldName, tag *tiff.Tag) error { 112 return f(name, tag) 113} 114