ifd_builder: renamed builderTag to BuilderTag.

- It's probably a generally good idea.
  - These are usually created by other methods, but they're regularly
    interacted with when you want to make tag changes and by making them
    private we can't public official, testable examples.

- Corrected names for new examples.
This commit is contained in:
Dustin Oprea 2018-05-29 14:44:52 -04:00
parent 81b804b70d
commit 570c4d582c
3 changed files with 2315 additions and 2357 deletions

View File

@ -23,7 +23,6 @@ var (
ErrTagEntryNotFound = errors.New("tag entry not found") ErrTagEntryNotFound = errors.New("tag entry not found")
) )
type IfdBuilderTagValue struct { type IfdBuilderTagValue struct {
valueBytes []byte valueBytes []byte
ib *IfdBuilder ib *IfdBuilder
@ -83,8 +82,7 @@ func (ibtv IfdBuilderTagValue) Ib() *IfdBuilder {
return ibtv.ib return ibtv.ib
} }
type BuilderTag struct {
type builderTag struct {
// ii is the IfdIdentity of the IFD that hosts this tag. // ii is the IfdIdentity of the IFD that hosts this tag.
ii IfdIdentity ii IfdIdentity
@ -97,8 +95,8 @@ type builderTag struct {
value *IfdBuilderTagValue value *IfdBuilderTagValue
} }
func NewBuilderTag(ii IfdIdentity, tagId uint16, typeId uint16, value *IfdBuilderTagValue) *builderTag { func NewBuilderTag(ii IfdIdentity, tagId uint16, typeId uint16, value *IfdBuilderTagValue) *BuilderTag {
return &builderTag{ return &BuilderTag{
ii: ii, ii: ii,
tagId: tagId, tagId: tagId,
typeId: typeId, typeId: typeId,
@ -106,13 +104,13 @@ func NewBuilderTag(ii IfdIdentity, tagId uint16, typeId uint16, value *IfdBuilde
} }
} }
func NewStandardBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagValue) *builderTag { func NewStandardBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagValue) *BuilderTag {
ti := NewTagIndex() ti := NewTagIndex()
it, err := ti.Get(ii, tagId) it, err := ti.Get(ii, tagId)
log.PanicIf(err) log.PanicIf(err)
return &builderTag{ return &BuilderTag{
ii: ii, ii: ii,
tagId: tagId, tagId: tagId,
typeId: it.Type, typeId: it.Type,
@ -120,8 +118,8 @@ func NewStandardBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagVal
} }
} }
func NewChildIfdBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagValue) *builderTag { func NewChildIfdBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagValue) *BuilderTag {
return &builderTag{ return &BuilderTag{
ii: ii, ii: ii,
tagId: tagId, tagId: tagId,
typeId: TypeLong, typeId: TypeLong,
@ -129,15 +127,15 @@ func NewChildIfdBuilderTag(ii IfdIdentity, tagId uint16, value *IfdBuilderTagVal
} }
} }
func (bt *builderTag) Value() (value *IfdBuilderTagValue) { func (bt *BuilderTag) Value() (value *IfdBuilderTagValue) {
return bt.value return bt.value
} }
func (bt *builderTag) String() string { func (bt *BuilderTag) String() string {
return fmt.Sprintf("BuilderTag<IFD=[%s] TAG-ID=(0x%04x) TAG-TYPE=[%s] VALUE=[%s]>", bt.ii, bt.tagId, TypeNames[bt.typeId], bt.value) return fmt.Sprintf("BuilderTag<IFD=[%s] TAG-ID=(0x%04x) TAG-TYPE=[%s] VALUE=[%s]>", bt.ii, bt.tagId, TypeNames[bt.typeId], bt.value)
} }
func (bt *builderTag) SetValue(byteOrder binary.ByteOrder, value interface{}) (err error) { func (bt *BuilderTag) SetValue(byteOrder binary.ByteOrder, value interface{}) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -167,9 +165,9 @@ func (bt *builderTag) SetValue(byteOrder binary.ByteOrder, value interface{}) (e
return nil return nil
} }
// NewStandardBuilderTagFromConfig constructs a `builderTag` instance. The type // NewStandardBuilderTagFromConfig constructs a `BuilderTag` instance. The type
// is looked up. `ii` is the type of IFD that owns this tag. // is looked up. `ii` is the type of IFD that owns this tag.
func NewStandardBuilderTagFromConfig(ii IfdIdentity, tagId uint16, byteOrder binary.ByteOrder, value interface{}) *builderTag { func NewStandardBuilderTagFromConfig(ii IfdIdentity, tagId uint16, byteOrder binary.ByteOrder, value interface{}) *BuilderTag {
ti := NewTagIndex() ti := NewTagIndex()
it, err := ti.Get(ii, tagId) it, err := ti.Get(ii, tagId)
@ -202,9 +200,9 @@ func NewStandardBuilderTagFromConfig(ii IfdIdentity, tagId uint16, byteOrder bin
tagValue) tagValue)
} }
// NewStandardBuilderTagFromConfig constructs a `builderTag` instance. The type is // NewStandardBuilderTagFromConfig constructs a `BuilderTag` instance. The type is
// explicitly provided. `ii` is the type of IFD that owns this tag. // explicitly provided. `ii` is the type of IFD that owns this tag.
func NewBuilderTagFromConfig(ii IfdIdentity, tagId uint16, typeId uint16, byteOrder binary.ByteOrder, value interface{}) *builderTag { func NewBuilderTagFromConfig(ii IfdIdentity, tagId uint16, typeId uint16, byteOrder binary.ByteOrder, value interface{}) *BuilderTag {
tt := NewTagType(typeId, byteOrder) tt := NewTagType(typeId, byteOrder)
ve := NewValueEncoder(byteOrder) ve := NewValueEncoder(byteOrder)
@ -234,7 +232,7 @@ func NewBuilderTagFromConfig(ii IfdIdentity, tagId uint16, typeId uint16, byteOr
// NewStandardBuilderTagFromConfigWithName allows us to easily generate solid, consistent tags // NewStandardBuilderTagFromConfigWithName allows us to easily generate solid, consistent tags
// for testing with. `ii` is the type of IFD that owns this tag. This can not be // for testing with. `ii` is the type of IFD that owns this tag. This can not be
// an IFD (IFDs are not associated with standardized, official names). // an IFD (IFDs are not associated with standardized, official names).
func NewStandardBuilderTagFromConfigWithName(ii IfdIdentity, tagName string, byteOrder binary.ByteOrder, value interface{}) *builderTag { func NewStandardBuilderTagFromConfigWithName(ii IfdIdentity, tagName string, byteOrder binary.ByteOrder, value interface{}) *BuilderTag {
ti := NewTagIndex() ti := NewTagIndex()
it, err := ti.GetWithName(ii, tagName) it, err := ti.GetWithName(ii, tagName)
@ -266,7 +264,6 @@ func NewStandardBuilderTagFromConfigWithName(ii IfdIdentity, tagName string, byt
tagValue) tagValue)
} }
type IfdBuilder struct { type IfdBuilder struct {
// ifd is the IfdIdentity instance of the IFD that owns the current tag. // ifd is the IfdIdentity instance of the IFD that owns the current tag.
ii IfdIdentity ii IfdIdentity
@ -277,7 +274,7 @@ type IfdBuilder struct {
byteOrder binary.ByteOrder byteOrder binary.ByteOrder
// Includes both normal tags and IFD tags (which point to child IFDs). // Includes both normal tags and IFD tags (which point to child IFDs).
tags []*builderTag tags []*BuilderTag
// existingOffset will be the offset that this IFD is currently found at if // existingOffset will be the offset that this IFD is currently found at if
// it represents an IFD that has previously been stored (or 0 if not). // it represents an IFD that has previously been stored (or 0 if not).
@ -302,7 +299,7 @@ func NewIfdBuilder(ii IfdIdentity, byteOrder binary.ByteOrder) (ib *IfdBuilder)
ifdTagId: ifdTagId, ifdTagId: ifdTagId,
byteOrder: byteOrder, byteOrder: byteOrder,
tags: make([]*builderTag, 0), tags: make([]*BuilderTag, 0),
} }
return ib return ib
@ -367,7 +364,7 @@ func (ib *IfdBuilder) String() string {
return fmt.Sprintf("IfdBuilder<PARENT-IFD=[%s] IFD=[%s] TAG-ID=(0x%04x) COUNT=(%d) OFF=(0x%04x) NEXT-IFD=(0x%04x)>", ib.ii.ParentIfdName, ib.ii.IfdName, ib.ifdTagId, len(ib.tags), ib.existingOffset, nextIfdPhrase) return fmt.Sprintf("IfdBuilder<PARENT-IFD=[%s] IFD=[%s] TAG-ID=(0x%04x) COUNT=(%d) OFF=(0x%04x) NEXT-IFD=(0x%04x)>", ib.ii.ParentIfdName, ib.ii.IfdName, ib.ifdTagId, len(ib.tags), ib.existingOffset, nextIfdPhrase)
} }
func (ib *IfdBuilder) Tags() (tags []*builderTag) { func (ib *IfdBuilder) Tags() (tags []*BuilderTag) {
return ib.tags return ib.tags
} }
@ -419,11 +416,9 @@ func (ib *IfdBuilder) SetThumbnail(data []byte) (err error) {
err = ib.Set(sizeBt) err = ib.Set(sizeBt)
log.PanicIf(err) log.PanicIf(err)
// TODO(dustin): !! Debugging. // TODO(dustin): !! Debugging.
// fmt.Printf("Set thumbnail into IB.\n") // fmt.Printf("Set thumbnail into IB.\n")
return nil return nil
} }
@ -588,7 +583,7 @@ func (ib *IfdBuilder) DeleteN(tagId uint16, n int) (err error) {
log.Panicf("N must be at least 1: (%d)", n) log.Panicf("N must be at least 1: (%d)", n)
} }
for ; n > 0; { for n > 0 {
j := -1 j := -1
for i, bt := range ib.tags { for i, bt := range ib.tags {
if bt.tagId == tagId { if bt.tagId == tagId {
@ -642,7 +637,7 @@ func (ib *IfdBuilder) DeleteAll(tagId uint16) (n int, err error) {
return n, nil return n, nil
} }
func (ib *IfdBuilder) ReplaceAt(position int, bt *builderTag) (err error) { func (ib *IfdBuilder) ReplaceAt(position int, bt *BuilderTag) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -660,7 +655,7 @@ func (ib *IfdBuilder) ReplaceAt(position int, bt *builderTag) (err error) {
return nil return nil
} }
func (ib *IfdBuilder) Replace(tagId uint16, bt *builderTag) (err error) { func (ib *IfdBuilder) Replace(tagId uint16, bt *BuilderTag) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -676,7 +671,7 @@ func (ib *IfdBuilder) Replace(tagId uint16, bt *builderTag) (err error) {
} }
// Set will add a new entry or update an existing entry. // Set will add a new entry or update an existing entry.
func (ib *IfdBuilder) Set(bt *builderTag) (err error) { func (ib *IfdBuilder) Set(bt *BuilderTag) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -734,7 +729,7 @@ func (ib *IfdBuilder) Find(tagId uint16) (position int, err error) {
return found[0], nil return found[0], nil
} }
func (ib *IfdBuilder) FindTag(tagId uint16) (bt *builderTag, err error) { func (ib *IfdBuilder) FindTag(tagId uint16) (bt *BuilderTag, err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -753,7 +748,7 @@ func (ib *IfdBuilder) FindTag(tagId uint16) (bt *builderTag, err error) {
return ib.tags[position], nil return ib.tags[position], nil
} }
func (ib *IfdBuilder) FindTagWithName(tagName string) (bt *builderTag, err error) { func (ib *IfdBuilder) FindTagWithName(tagName string) (bt *BuilderTag, err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -777,7 +772,7 @@ func (ib *IfdBuilder) FindTagWithName(tagName string) (bt *builderTag, err error
return ib.tags[position], nil return ib.tags[position], nil
} }
func (ib *IfdBuilder) add(bt *builderTag) (err error) { func (ib *IfdBuilder) add(bt *BuilderTag) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -785,18 +780,18 @@ func (ib *IfdBuilder) add(bt *builderTag) (err error) {
}() }()
if bt.ii == ZeroIi { if bt.ii == ZeroIi {
log.Panicf("builderTag IfdIdentity is not set: %s", bt) log.Panicf("BuilderTag IfdIdentity is not set: %s", bt)
} else if bt.typeId == 0x0 { } else if bt.typeId == 0x0 {
log.Panicf("builderTag type-ID is not set: %s", bt) log.Panicf("BuilderTag type-ID is not set: %s", bt)
} else if bt.value == nil { } else if bt.value == nil {
log.Panicf("builderTag value is not set: %s", bt) log.Panicf("BuilderTag value is not set: %s", bt)
} }
ib.tags = append(ib.tags, bt) ib.tags = append(ib.tags, bt)
return nil return nil
} }
func (ib *IfdBuilder) Add(bt *builderTag) (err error) { func (ib *IfdBuilder) Add(bt *BuilderTag) (err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -842,7 +837,7 @@ func (ib *IfdBuilder) AddChildIb(childIb *IfdBuilder) (err error) {
return nil return nil
} }
func (ib *IfdBuilder) NewBuilderTagFromBuilder(childIb *IfdBuilder) (bt *builderTag) { func (ib *IfdBuilder) NewBuilderTagFromBuilder(childIb *IfdBuilder) (bt *BuilderTag) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err := log.Wrap(state.(error)) err := log.Wrap(state.(error))
@ -914,7 +909,7 @@ func (ib *IfdBuilder) AddTagsFromExisting(ifd *Ifd, itevr *IfdTagEntryValueResol
} }
} }
var bt *builderTag var bt *BuilderTag
if ite.ChildIfdName != "" { if ite.ChildIfdName != "" {
// If we want to add an IFD tag, we'll have to build it first and // If we want to add an IFD tag, we'll have to build it first and

View File

@ -84,7 +84,6 @@ func (bw ByteWriter) WriteFourBytes(value []byte) (err error) {
return nil return nil
} }
// ifdOffsetIterator keeps track of where the next IFD should be written by // ifdOffsetIterator keeps track of where the next IFD should be written by
// keeping track of where the offsets start, the data that has been added, and // keeping track of where the offsets start, the data that has been added, and
// bumping the offset *when* the data is added. // bumping the offset *when* the data is added.
@ -117,7 +116,6 @@ func (ida *ifdDataAllocator) Bytes() []byte {
return ida.b.Bytes() return ida.b.Bytes()
} }
// IfdByteEncoder converts an IB to raw bytes (for writing) while also figuring // IfdByteEncoder converts an IB to raw bytes (for writing) while also figuring
// out all of the allocations and indirection that is required for extended // out all of the allocations and indirection that is required for extended
// data. // data.
@ -201,7 +199,7 @@ func (ibe *IfdByteEncoder) PrintJournal() {
// (`nextIfdOffsetToWrite` is required in order for them to know where the its // (`nextIfdOffsetToWrite` is required in order for them to know where the its
// IFD data will be written, in order for them to know the offset of where // IFD data will be written, in order for them to know the offset of where
// their allocated-data block will start, which follows right behind). // their allocated-data block will start, which follows right behind).
func (ibe *IfdByteEncoder) encodeTagToBytes(ib *IfdBuilder, bt *builderTag, bw *ByteWriter, ida *ifdDataAllocator, nextIfdOffsetToWrite uint32) (childIfdBlock []byte, err error) { func (ibe *IfdByteEncoder) encodeTagToBytes(ib *IfdBuilder, bt *BuilderTag, bw *ByteWriter, ida *ifdDataAllocator, nextIfdOffsetToWrite uint32) (childIfdBlock []byte, err error) {
defer func() { defer func() {
if state := recover(); state != nil { if state := recover(); state != nil {
err = log.Wrap(state.(error)) err = log.Wrap(state.(error))
@ -454,7 +452,6 @@ func (ibe *IfdByteEncoder) encodeAndAttachIfd(ib *IfdBuilder, ifdAddressableOffs
for thisIb := ib; thisIb != nil; thisIb = thisIb.nextIb { for thisIb := ib; thisIb != nil; thisIb = thisIb.nextIb {
// Do a dry-run in order to pre-determine its size requirement. // Do a dry-run in order to pre-determine its size requirement.
ibe.pushToJournal("encodeAndAttachIfd", ">", "Beginning encoding process: (%d) [%s]", i, thisIb.ii.IfdName) ibe.pushToJournal("encodeAndAttachIfd", ">", "Beginning encoding process: (%d) [%s]", i, thisIb.ii.IfdName)

View File

@ -1,12 +1,12 @@
package exif package exif
import ( import (
"testing"
"reflect"
"bytes" "bytes"
"path"
"fmt" "fmt"
"path"
"reflect"
"strings" "strings"
"testing"
"github.com/dsoprea/go-logging" "github.com/dsoprea/go-logging"
) )
@ -14,7 +14,7 @@ import (
func TestAdd(t *testing.T) { func TestAdd(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -24,7 +24,7 @@ func TestAdd(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -34,7 +34,7 @@ func TestAdd(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -46,7 +46,7 @@ func TestAdd(t *testing.T) {
originalBytes := []byte{0x11, 0x22, 0x33} originalBytes := []byte{0x11, 0x22, 0x33}
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x44, tagId: 0x44,
@ -119,7 +119,7 @@ func TestAddChildIb(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -135,7 +135,7 @@ func TestAddChildIb(t *testing.T) {
err = ib.AddChildIb(ibChild) err = ib.AddChildIb(ibChild)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -291,7 +291,7 @@ func TestAddTagsFromExisting__Excludes(t *testing.T) {
func TestFindN_First_1(t *testing.T) { func TestFindN_First_1(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -301,7 +301,7 @@ func TestFindN_First_1(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -311,7 +311,7 @@ func TestFindN_First_1(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -341,7 +341,7 @@ func TestFindN_First_1(t *testing.T) {
func TestFindN_First_2_1Returned(t *testing.T) { func TestFindN_First_2_1Returned(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -351,7 +351,7 @@ func TestFindN_First_2_1Returned(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -361,7 +361,7 @@ func TestFindN_First_2_1Returned(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -391,7 +391,7 @@ func TestFindN_First_2_1Returned(t *testing.T) {
func TestFindN_First_2_2Returned(t *testing.T) { func TestFindN_First_2_2Returned(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -401,7 +401,7 @@ func TestFindN_First_2_2Returned(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -411,7 +411,7 @@ func TestFindN_First_2_2Returned(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -421,7 +421,7 @@ func TestFindN_First_2_2Returned(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -431,7 +431,7 @@ func TestFindN_First_2_2Returned(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -468,7 +468,7 @@ func TestFindN_First_2_2Returned(t *testing.T) {
func TestFindN_Middle_WithDuplicates(t *testing.T) { func TestFindN_Middle_WithDuplicates(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -478,7 +478,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -488,7 +488,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -498,7 +498,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -508,7 +508,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -518,7 +518,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -548,7 +548,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
func TestFindN_Middle_NoDuplicates(t *testing.T) { func TestFindN_Middle_NoDuplicates(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -558,7 +558,7 @@ func TestFindN_Middle_NoDuplicates(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -568,7 +568,7 @@ func TestFindN_Middle_NoDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -578,7 +578,7 @@ func TestFindN_Middle_NoDuplicates(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -619,7 +619,7 @@ func TestFindN_Miss(t *testing.T) {
func TestFind_Hit(t *testing.T) { func TestFind_Hit(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -629,7 +629,7 @@ func TestFind_Hit(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -639,7 +639,7 @@ func TestFind_Hit(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -649,7 +649,7 @@ func TestFind_Hit(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -677,7 +677,7 @@ func TestFind_Hit(t *testing.T) {
func TestFind_Miss(t *testing.T) { func TestFind_Miss(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -687,7 +687,7 @@ func TestFind_Miss(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -697,7 +697,7 @@ func TestFind_Miss(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -707,7 +707,7 @@ func TestFind_Miss(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -728,7 +728,7 @@ func TestFind_Miss(t *testing.T) {
func TestReplace(t *testing.T) { func TestReplace(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -738,7 +738,7 @@ func TestReplace(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -748,7 +748,7 @@ func TestReplace(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -767,7 +767,7 @@ func TestReplace(t *testing.T) {
t.Fatalf("Pre-replace tags are not correct.") t.Fatalf("Pre-replace tags are not correct.")
} }
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x99, tagId: 0x99,
@ -790,7 +790,7 @@ func TestReplace(t *testing.T) {
func TestReplaceN(t *testing.T) { func TestReplaceN(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -800,7 +800,7 @@ func TestReplaceN(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -810,7 +810,7 @@ func TestReplaceN(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -829,7 +829,7 @@ func TestReplaceN(t *testing.T) {
t.Fatalf("Pre-replace tags are not correct.") t.Fatalf("Pre-replace tags are not correct.")
} }
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0xA9, tagId: 0xA9,
@ -852,7 +852,7 @@ func TestReplaceN(t *testing.T) {
func TestDeleteFirst(t *testing.T) { func TestDeleteFirst(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -862,7 +862,7 @@ func TestDeleteFirst(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -872,7 +872,7 @@ func TestDeleteFirst(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -882,7 +882,7 @@ func TestDeleteFirst(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -892,7 +892,6 @@ func TestDeleteFirst(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
if len(ib.Tags()) != 4 { if len(ib.Tags()) != 4 {
t.Fatalf("Pre-delete tag count not correct.") t.Fatalf("Pre-delete tag count not correct.")
} }
@ -906,7 +905,6 @@ func TestDeleteFirst(t *testing.T) {
t.Fatalf("Pre-delete tags not correct.") t.Fatalf("Pre-delete tags not correct.")
} }
err = ib.DeleteFirst(0x22) err = ib.DeleteFirst(0x22)
log.PanicIf(err) log.PanicIf(err)
@ -923,7 +921,6 @@ func TestDeleteFirst(t *testing.T) {
t.Fatalf("Post-delete (1) tags not correct.") t.Fatalf("Post-delete (1) tags not correct.")
} }
err = ib.DeleteFirst(0x22) err = ib.DeleteFirst(0x22)
log.PanicIf(err) log.PanicIf(err)
@ -940,7 +937,6 @@ func TestDeleteFirst(t *testing.T) {
t.Fatalf("Post-delete (2) tags not correct.") t.Fatalf("Post-delete (2) tags not correct.")
} }
err = ib.DeleteFirst(0x22) err = ib.DeleteFirst(0x22)
if err == nil { if err == nil {
t.Fatalf("Expected an error.") t.Fatalf("Expected an error.")
@ -952,7 +948,7 @@ func TestDeleteFirst(t *testing.T) {
func TestDeleteN(t *testing.T) { func TestDeleteN(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -962,7 +958,7 @@ func TestDeleteN(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -972,7 +968,7 @@ func TestDeleteN(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -982,7 +978,7 @@ func TestDeleteN(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -992,7 +988,6 @@ func TestDeleteN(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
if len(ib.Tags()) != 4 { if len(ib.Tags()) != 4 {
t.Fatalf("Pre-delete tag count not correct.") t.Fatalf("Pre-delete tag count not correct.")
} }
@ -1006,7 +1001,6 @@ func TestDeleteN(t *testing.T) {
t.Fatalf("Pre-delete tags not correct.") t.Fatalf("Pre-delete tags not correct.")
} }
err = ib.DeleteN(0x22, 1) err = ib.DeleteN(0x22, 1)
log.PanicIf(err) log.PanicIf(err)
@ -1023,7 +1017,6 @@ func TestDeleteN(t *testing.T) {
t.Fatalf("Post-delete (1) tags not correct.") t.Fatalf("Post-delete (1) tags not correct.")
} }
err = ib.DeleteN(0x22, 1) err = ib.DeleteN(0x22, 1)
log.PanicIf(err) log.PanicIf(err)
@ -1040,7 +1033,6 @@ func TestDeleteN(t *testing.T) {
t.Fatalf("Post-delete (2) tags not correct.") t.Fatalf("Post-delete (2) tags not correct.")
} }
err = ib.DeleteN(0x22, 1) err = ib.DeleteN(0x22, 1)
if err == nil { if err == nil {
t.Fatalf("Expected an error.") t.Fatalf("Expected an error.")
@ -1052,7 +1044,7 @@ func TestDeleteN(t *testing.T) {
func TestDeleteN_Two(t *testing.T) { func TestDeleteN_Two(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -1062,7 +1054,7 @@ func TestDeleteN_Two(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -1072,7 +1064,7 @@ func TestDeleteN_Two(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -1082,7 +1074,7 @@ func TestDeleteN_Two(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -1092,7 +1084,6 @@ func TestDeleteN_Two(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
if len(ib.Tags()) != 4 { if len(ib.Tags()) != 4 {
t.Fatalf("Pre-delete tag count not correct.") t.Fatalf("Pre-delete tag count not correct.")
} }
@ -1106,7 +1097,6 @@ func TestDeleteN_Two(t *testing.T) {
t.Fatalf("Pre-delete tags not correct.") t.Fatalf("Pre-delete tags not correct.")
} }
err = ib.DeleteN(0x22, 2) err = ib.DeleteN(0x22, 2)
log.PanicIf(err) log.PanicIf(err)
@ -1123,7 +1113,6 @@ func TestDeleteN_Two(t *testing.T) {
t.Fatalf("Post-delete tags not correct.") t.Fatalf("Post-delete tags not correct.")
} }
err = ib.DeleteFirst(0x22) err = ib.DeleteFirst(0x22)
if err == nil { if err == nil {
t.Fatalf("Expected an error.") t.Fatalf("Expected an error.")
@ -1135,7 +1124,7 @@ func TestDeleteN_Two(t *testing.T) {
func TestDeleteAll(t *testing.T) { func TestDeleteAll(t *testing.T) {
ib := NewIfdBuilder(RootIi, TestDefaultByteOrder) ib := NewIfdBuilder(RootIi, TestDefaultByteOrder)
bt := &builderTag{ bt := &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x11, tagId: 0x11,
@ -1145,7 +1134,7 @@ func TestDeleteAll(t *testing.T) {
err := ib.Add(bt) err := ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -1155,7 +1144,7 @@ func TestDeleteAll(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x22, tagId: 0x22,
@ -1165,7 +1154,7 @@ func TestDeleteAll(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
bt = &builderTag{ bt = &BuilderTag{
ii: RootIi, ii: RootIi,
typeId: TypeByte, typeId: TypeByte,
tagId: 0x33, tagId: 0x33,
@ -1175,7 +1164,6 @@ func TestDeleteAll(t *testing.T) {
err = ib.Add(bt) err = ib.Add(bt)
log.PanicIf(err) log.PanicIf(err)
if len(ib.Tags()) != 4 { if len(ib.Tags()) != 4 {
t.Fatalf("Pre-delete tag count not correct.") t.Fatalf("Pre-delete tag count not correct.")
} }
@ -1189,7 +1177,6 @@ func TestDeleteAll(t *testing.T) {
t.Fatalf("Pre-delete tags not correct.") t.Fatalf("Pre-delete tags not correct.")
} }
n, err := ib.DeleteAll(0x22) n, err := ib.DeleteAll(0x22)
log.PanicIf(err) log.PanicIf(err)
@ -1208,7 +1195,6 @@ func TestDeleteAll(t *testing.T) {
t.Fatalf("Post-delete tags not correct.") t.Fatalf("Post-delete tags not correct.")
} }
err = ib.DeleteFirst(0x22) err = ib.DeleteFirst(0x22)
if err == nil { if err == nil {
t.Fatalf("Expected an error.") t.Fatalf("Expected an error.")
@ -1309,7 +1295,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
e := NewExif() e := NewExif()
rawExif, err := e.SearchAndExtractExif(filepath) rawExif, err := e.SearchAndExtractExif(filepath)
log.PanicIf(err) log.PanicIf(err)
@ -1323,7 +1308,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
originalTags := originalIndex.RootIfd.DumpTags() originalTags := originalIndex.RootIfd.DumpTags()
// Encode back to binary. // Encode back to binary.
ibe := NewIfdByteEncoder() ibe := NewIfdByteEncoder()
@ -1334,7 +1318,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
updatedExif, err := ibe.EncodeToExif(rootIb) updatedExif, err := ibe.EncodeToExif(rootIb)
log.PanicIf(err) log.PanicIf(err)
// Parse again. // Parse again.
_, recoveredIndex, err := e.Collect(updatedExif) _, recoveredIndex, err := e.Collect(updatedExif)
@ -1342,18 +1325,15 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
recoveredTags := recoveredIndex.RootIfd.DumpTags() recoveredTags := recoveredIndex.RootIfd.DumpTags()
recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail() recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail()
log.PanicIf(err) log.PanicIf(err)
// Check the thumbnail. // Check the thumbnail.
if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 { if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 {
t.Fatalf("recovered thumbnail does not match original") t.Fatalf("recovered thumbnail does not match original")
} }
// Validate that all of the same IFDs were presented. // Validate that all of the same IFDs were presented.
originalIfdTags := make([][2]interface{}, 0) originalIfdTags := make([][2]interface{}, 0)
@ -1388,7 +1368,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
t.Fatalf("Recovered IFD tags are not correct.") t.Fatalf("Recovered IFD tags are not correct.")
} }
// Validate that all of the tags owned by the IFDs were presented. Note // Validate that all of the tags owned by the IFDs were presented. Note
// that the thumbnail tags are not kept but only produced on the fly, which // that the thumbnail tags are not kept but only produced on the fly, which
// is why we check it above. // is why we check it above.
@ -1430,7 +1409,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
e := NewExif() e := NewExif()
rawExif, err := e.SearchAndExtractExif(filepath) rawExif, err := e.SearchAndExtractExif(filepath)
log.PanicIf(err) log.PanicIf(err)
@ -1444,7 +1422,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
originalTags := originalIndex.RootIfd.DumpTags() originalTags := originalIndex.RootIfd.DumpTags()
// Encode back to binary. // Encode back to binary.
ibe := NewIfdByteEncoder() ibe := NewIfdByteEncoder()
@ -1452,7 +1429,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
itevr := NewIfdTagEntryValueResolver(rawExif, originalIndex.RootIfd.ByteOrder) itevr := NewIfdTagEntryValueResolver(rawExif, originalIndex.RootIfd.ByteOrder)
rootIb := NewIfdBuilderFromExistingChain(originalIndex.RootIfd, itevr) rootIb := NewIfdBuilderFromExistingChain(originalIndex.RootIfd, itevr)
// Update a tag,. // Update a tag,.
exifBt, err := rootIb.FindTagWithName("ExifTag") exifBt, err := rootIb.FindTagWithName("ExifTag")
@ -1469,13 +1445,11 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
err = ucBt.SetValue(rootIb.byteOrder, uc) err = ucBt.SetValue(rootIb.byteOrder, uc)
log.PanicIf(err) log.PanicIf(err)
// Encode. // Encode.
updatedExif, err := ibe.EncodeToExif(rootIb) updatedExif, err := ibe.EncodeToExif(rootIb)
log.PanicIf(err) log.PanicIf(err)
// Parse again. // Parse again.
_, recoveredIndex, err := e.Collect(updatedExif) _, recoveredIndex, err := e.Collect(updatedExif)
@ -1483,18 +1457,15 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
recoveredTags := recoveredIndex.RootIfd.DumpTags() recoveredTags := recoveredIndex.RootIfd.DumpTags()
recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail() recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail()
log.PanicIf(err) log.PanicIf(err)
// Check the thumbnail. // Check the thumbnail.
if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 { if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 {
t.Fatalf("recovered thumbnail does not match original") t.Fatalf("recovered thumbnail does not match original")
} }
// Validate that all of the same IFDs were presented. // Validate that all of the same IFDs were presented.
originalIfdTags := make([][2]interface{}, 0) originalIfdTags := make([][2]interface{}, 0)
@ -1529,7 +1500,6 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
t.Fatalf("Recovered IFD tags are not correct.") t.Fatalf("Recovered IFD tags are not correct.")
} }
// Validate that all of the tags owned by the IFDs were presented. Note // Validate that all of the tags owned by the IFDs were presented. Note
// that the thumbnail tags are not kept but only produced on the fly, which // that the thumbnail tags are not kept but only produced on the fly, which
// is why we check it above. // is why we check it above.
@ -1574,7 +1544,7 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *te
} }
} }
func ExampleReadThumbnail() { func ExampleIfd_Thumbnail() {
filepath := path.Join(assetsPath, "NDM_8901.jpg") filepath := path.Join(assetsPath, "NDM_8901.jpg")
e := NewExif() e := NewExif()
@ -1592,7 +1562,7 @@ func ExampleReadThumbnail() {
// Output: // Output:
} }
func ExampleUpdateUnknownTag() { func ExampleBuilderTag_SetValue() {
filepath := path.Join(assetsPath, "NDM_8901.jpg") filepath := path.Join(assetsPath, "NDM_8901.jpg")
e := NewExif() e := NewExif()
@ -1603,13 +1573,11 @@ func ExampleUpdateUnknownTag() {
_, index, err := e.Collect(rawExif) _, index, err := e.Collect(rawExif)
log.PanicIf(err) log.PanicIf(err)
// Create builder. // Create builder.
itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder) itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder)
rootIb := NewIfdBuilderFromExistingChain(index.RootIfd, itevr) rootIb := NewIfdBuilderFromExistingChain(index.RootIfd, itevr)
// Find tag to update. // Find tag to update.
exifBt, err := rootIb.FindTagWithName("ExifTag") exifBt, err := rootIb.FindTagWithName("ExifTag")
@ -1618,10 +1586,10 @@ func ExampleUpdateUnknownTag() {
ucBt, err := exifBt.value.Ib().FindTagWithName("UserComment") ucBt, err := exifBt.value.Ib().FindTagWithName("UserComment")
log.PanicIf(err) log.PanicIf(err)
// Update the value. Since this is an "undefined"-type tag, we have to use // Update the value. Since this is an "undefined"-type tag, we have to use
// its type-specific struct. // its type-specific struct.
// TODO(dustin): !! Add an example for setting a non-unknown value, too.
uc := TagUnknownType_9298_UserComment{ uc := TagUnknownType_9298_UserComment{
EncodingType: TagUnknownType_9298_UserComment_Encoding_ASCII, EncodingType: TagUnknownType_9298_UserComment_Encoding_ASCII,
EncodingBytes: []byte("TEST COMMENT"), EncodingBytes: []byte("TEST COMMENT"),
@ -1630,7 +1598,6 @@ func ExampleUpdateUnknownTag() {
err = ucBt.SetValue(rootIb.byteOrder, uc) err = ucBt.SetValue(rootIb.byteOrder, uc)
log.PanicIf(err) log.PanicIf(err)
// Encode. // Encode.
ibe := NewIfdByteEncoder() ibe := NewIfdByteEncoder()
@ -1674,10 +1641,10 @@ func TestNewStandardBuilderTagFromConfig_OneUnit(t *testing.T) {
bt := NewStandardBuilderTagFromConfig(ExifIi, uint16(0x8833), TestDefaultByteOrder, []uint32{uint32(0x1234)}) bt := NewStandardBuilderTagFromConfig(ExifIi, uint16(0x8833), TestDefaultByteOrder, []uint32{uint32(0x1234)})
if bt.ii != ExifIi { if bt.ii != ExifIi {
t.Fatalf("II in builderTag not correct") t.Fatalf("II in BuilderTag not correct")
} else if bt.tagId != 0x8833 { } else if bt.tagId != 0x8833 {
t.Fatalf("tag-ID not correct") t.Fatalf("tag-ID not correct")
} else if bytes.Compare(bt.value.Bytes(), []byte { 0x0, 0x0, 0x12, 0x34, }) != 0 { } else if bytes.Compare(bt.value.Bytes(), []byte{0x0, 0x0, 0x12, 0x34}) != 0 {
t.Fatalf("value not correct") t.Fatalf("value not correct")
} }
} }
@ -1686,12 +1653,12 @@ func TestNewStandardBuilderTagFromConfig_TwoUnits(t *testing.T) {
bt := NewStandardBuilderTagFromConfig(ExifIi, uint16(0x8833), TestDefaultByteOrder, []uint32{uint32(0x1234), uint32(0x5678)}) bt := NewStandardBuilderTagFromConfig(ExifIi, uint16(0x8833), TestDefaultByteOrder, []uint32{uint32(0x1234), uint32(0x5678)})
if bt.ii != ExifIi { if bt.ii != ExifIi {
t.Fatalf("II in builderTag not correct") t.Fatalf("II in BuilderTag not correct")
} else if bt.tagId != 0x8833 { } else if bt.tagId != 0x8833 {
t.Fatalf("tag-ID not correct") t.Fatalf("tag-ID not correct")
} else if bytes.Compare(bt.value.Bytes(), []byte{ } else if bytes.Compare(bt.value.Bytes(), []byte{
0x0, 0x0, 0x12, 0x34, 0x0, 0x0, 0x12, 0x34,
0x0, 0x0, 0x56, 0x78, }) != 0 { 0x0, 0x0, 0x56, 0x78}) != 0 {
t.Fatalf("value not correct") t.Fatalf("value not correct")
} }
} }
@ -1700,12 +1667,12 @@ func TestNewStandardBuilderTagFromConfigWithName(t *testing.T) {
bt := NewStandardBuilderTagFromConfigWithName(ExifIi, "ISOSpeed", TestDefaultByteOrder, []uint32{uint32(0x1234), uint32(0x5678)}) bt := NewStandardBuilderTagFromConfigWithName(ExifIi, "ISOSpeed", TestDefaultByteOrder, []uint32{uint32(0x1234), uint32(0x5678)})
if bt.ii != ExifIi { if bt.ii != ExifIi {
t.Fatalf("II in builderTag not correct") t.Fatalf("II in BuilderTag not correct")
} else if bt.tagId != 0x8833 { } else if bt.tagId != 0x8833 {
t.Fatalf("tag-ID not correct") t.Fatalf("tag-ID not correct")
} else if bytes.Compare(bt.value.Bytes(), []byte{ } else if bytes.Compare(bt.value.Bytes(), []byte{
0x0, 0x0, 0x12, 0x34, 0x0, 0x0, 0x12, 0x34,
0x0, 0x0, 0x56, 0x78, }) != 0 { 0x0, 0x0, 0x56, 0x78}) != 0 {
t.Fatalf("value not correct") t.Fatalf("value not correct")
} }
} }
@ -1734,4 +1701,3 @@ func TestAddFromConfigWithName(t *testing.T) {
t.Fatalf("Value not correct: (%d) [%s]", len(s), s) t.Fatalf("Value not correct: (%d) [%s]", len(s), s)
} }
} }