github.com/camlistore/go4@v0.0.0-20200104003542-c7e774b10ea0/media/heif/heif_test.go (about)

     1  package heif
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/rwcarlsen/goexif/exif"
    10  	"github.com/rwcarlsen/goexif/tiff"
    11  )
    12  
    13  func 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  
    82  func 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  
   109  type walkFunc func(exif.FieldName, *tiff.Tag) error
   110  
   111  func (f walkFunc) Walk(name exif.FieldName, tag *tiff.Tag) error {
   112  	return f(name, tag)
   113  }