Fixed tests for recent changes.

pull/3/head
Dustin Oprea 2018-05-29 00:55:43 -04:00
parent 8ce7625fc9
commit 0a561e98ed
6 changed files with 109 additions and 131 deletions

View File

@ -352,9 +352,9 @@
"unit_count": 264, "unit_count": 264,
"value": { "value": {
"EncodingType": 3, "EncodingType": 3,
"EncodingBytes": "" "EncodingBytes": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
}, },
"value_string": "UserComment\u003cSIZE=(0) ENCODING=[UNDEFINED] V=[]\u003e" "value_string": "UserComment\u003cSIZE=(256) ENCODING=[UNDEFINED] V=[0 0 0 0 0 0 0 0]... LEN=(256)\u003e"
}, },
{ {
"ifd_name": "Exif", "ifd_name": "Exif",
@ -691,29 +691,5 @@
"unit_count": 1, "unit_count": 1,
"value": "2", "value": "2",
"value_string": "2" "value_string": "2"
},
{
"ifd_name": "IFD",
"parent_ifd_name": "",
"ifd_index": 1,
"tag_id": 513,
"tag_name": "JPEGInterchangeFormat",
"tag_type_id": 4,
"tag_type_name": "LONG",
"unit_count": 1,
"value": "11444",
"value_string": "11444"
},
{
"ifd_name": "IFD",
"parent_ifd_name": "",
"ifd_index": 1,
"tag_id": 514,
"tag_name": "JPEGInterchangeFormatLength",
"tag_type_id": 4,
"tag_type_name": "LONG",
"unit_count": 1,
"value": "21491",
"value_string": "21491"
} }
] ]

View File

@ -10,6 +10,7 @@ import (
"os/exec" "os/exec"
"encoding/json" "encoding/json"
"io/ioutil"
"github.com/dsoprea/go-logging" "github.com/dsoprea/go-logging"
) )
@ -65,7 +66,7 @@ IFD=[Exif] ID=(0x9207) NAME=[MeteringMode] COUNT=(1) TYPE=[SHORT] VALUE=[5]
IFD=[Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16] IFD=[Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16]
IFD=[Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1] IFD=[Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1]
IFD=[Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote<TYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00]>] IFD=[Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote<TYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00]>]
IFD=[Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment<SIZE=(0) ENCODING=[UNDEFINED] V=[]>] IFD=[Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment<SIZE=(256) ENCODING=[UNDEFINED] V=[0 0 0 0 0 0 0 0]... LEN=(256)>]
IFD=[Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00] IFD=[Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00]
IFD=[Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00] IFD=[Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00]
IFD=[Exif] ID=(0x9292) NAME=[SubSecTimeDigitized] COUNT=(3) TYPE=[ASCII] VALUE=[00] IFD=[Exif] ID=(0x9292) NAME=[SubSecTimeDigitized] COUNT=(3) TYPE=[ASCII] VALUE=[00]
@ -94,12 +95,10 @@ IFD=[IFD] ID=(0x0103) NAME=[Compression] COUNT=(1) TYPE=[SHORT] VALUE=[6]
IFD=[IFD] ID=(0x011a) NAME=[XResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1] IFD=[IFD] ID=(0x011a) NAME=[XResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]
IFD=[IFD] ID=(0x011b) NAME=[YResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1] IFD=[IFD] ID=(0x011b) NAME=[YResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]
IFD=[IFD] ID=(0x0128) NAME=[ResolutionUnit] COUNT=(1) TYPE=[SHORT] VALUE=[2] IFD=[IFD] ID=(0x0128) NAME=[ResolutionUnit] COUNT=(1) TYPE=[SHORT] VALUE=[2]
IFD=[IFD] ID=(0x0201) NAME=[JPEGInterchangeFormat] COUNT=(1) TYPE=[LONG] VALUE=[11444]
IFD=[IFD] ID=(0x0202) NAME=[JPEGInterchangeFormatLength] COUNT=(1) TYPE=[LONG] VALUE=[21491]
` `
if actual != expected { if actual != expected {
t.Fatalf("Output not as expected:\n%s", actual) t.Fatalf("Output not as expected:\nACTUAL:\n%s\nEXPECTED:\n%s", actual, expected)
} }
} }
@ -134,20 +133,17 @@ func TestMainJson(t *testing.T) {
jsonFilepath := path.Join(assetsPath, "exif_read.json") jsonFilepath := path.Join(assetsPath, "exif_read.json")
f, err := os.Open(jsonFilepath) expectedRaw, err := ioutil.ReadFile(jsonFilepath)
log.PanicIf(err) log.PanicIf(err)
defer f.Close()
expected := make([]map[string]interface{}, 0) expected := make([]map[string]interface{}, 0)
r := json.NewDecoder(f) err = json.Unmarshal(expectedRaw, &expected)
err = r.Decode(&expected)
log.PanicIf(err) log.PanicIf(err)
if reflect.DeepEqual(actual, expected) == false { if reflect.DeepEqual(actual, expected) == false {
t.Fatalf("Output not as expected:\n%s", actual) t.Fatalf("Output not as expected:\nACTUAL:\n%s\nEXPECTED:\n%s", actualRaw, expectedRaw)
} }
} }

View File

@ -145,7 +145,7 @@ func TestVisit(t *testing.T) {
"IFD=[Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16]", "IFD=[Exif] ID=(0x9209) NAME=[Flash] COUNT=(1) TYPE=[SHORT] VALUE=[16]",
"IFD=[Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1]", "IFD=[Exif] ID=(0x920a) NAME=[FocalLength] COUNT=(1) TYPE=[RATIONAL] VALUE=[16/1]",
"IFD=[Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote<TYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00]>]", "IFD=[Exif] ID=(0x927c) NAME=[MakerNote] COUNT=(8152) TYPE=[UNDEFINED] VALUE=[MakerNote<TYPE-ID=[28 00 01 00 03 00 31 00 00 00 74 05 00 00 02 00 03 00 04 00]>]",
"IFD=[Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment<SIZE=(0) ENCODING=[UNDEFINED] V=[]>]", "IFD=[Exif] ID=(0x9286) NAME=[UserComment] COUNT=(264) TYPE=[UNDEFINED] VALUE=[UserComment<SIZE=(256) ENCODING=[UNDEFINED] V=[0 0 0 0 0 0 0 0]... LEN=(256)>]",
"IFD=[Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00]", "IFD=[Exif] ID=(0x9290) NAME=[SubSecTime] COUNT=(3) TYPE=[ASCII] VALUE=[00]",
"IFD=[Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00]", "IFD=[Exif] ID=(0x9291) NAME=[SubSecTimeOriginal] COUNT=(3) TYPE=[ASCII] VALUE=[00]",
"IFD=[Exif] ID=(0x9292) NAME=[SubSecTimeDigitized] COUNT=(3) TYPE=[ASCII] VALUE=[00]", "IFD=[Exif] ID=(0x9292) NAME=[SubSecTimeDigitized] COUNT=(3) TYPE=[ASCII] VALUE=[00]",
@ -174,8 +174,6 @@ func TestVisit(t *testing.T) {
"IFD=[IFD] ID=(0x011a) NAME=[XResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]", "IFD=[IFD] ID=(0x011a) NAME=[XResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]",
"IFD=[IFD] ID=(0x011b) NAME=[YResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]", "IFD=[IFD] ID=(0x011b) NAME=[YResolution] COUNT=(1) TYPE=[RATIONAL] VALUE=[72/1]",
"IFD=[IFD] ID=(0x0128) NAME=[ResolutionUnit] COUNT=(1) TYPE=[SHORT] VALUE=[2]", "IFD=[IFD] ID=(0x0128) NAME=[ResolutionUnit] COUNT=(1) TYPE=[SHORT] VALUE=[2]",
"IFD=[IFD] ID=(0x0201) NAME=[JPEGInterchangeFormat] COUNT=(1) TYPE=[LONG] VALUE=[11444]",
"IFD=[IFD] ID=(0x0202) NAME=[JPEGInterchangeFormatLength] COUNT=(1) TYPE=[LONG] VALUE=[21491]",
} }
if reflect.DeepEqual(tags, expected) == false { if reflect.DeepEqual(tags, expected) == false {

View File

@ -918,10 +918,10 @@ func ExampleIfdByteEncoder_EncodeToExif() {
// Output: // Output:
// //
// 0: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x0b) TAG-TYPE=[ASCII] UNIT-COUNT=(11)> [asciivalue] // 0: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x000b) TAG-TYPE=[ASCII] UNIT-COUNT=(11)> [asciivalue]
// 1: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x150) TAG-TYPE=[BYTE] UNIT-COUNT=(1)> [[17]] // 1: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x0150) TAG-TYPE=[BYTE] UNIT-COUNT=(1)> [[17]]
// 2: IfdTagEntry<TAG-IFD=[] TAG-ID=(0xff) TAG-TYPE=[SHORT] UNIT-COUNT=(1)> [[8755]] // 2: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x00ff) TAG-TYPE=[SHORT] UNIT-COUNT=(1)> [[8755]]
// 3: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x100) TAG-TYPE=[LONG] UNIT-COUNT=(1)> [[1146447479]] // 3: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x0100) TAG-TYPE=[LONG] UNIT-COUNT=(1)> [[1146447479]]
// 4: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x13e) TAG-TYPE=[RATIONAL] UNIT-COUNT=(1)> [[{286335522 858997828}]] // 4: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x013e) TAG-TYPE=[RATIONAL] UNIT-COUNT=(1)> [[{286335522 858997828}]]
// 5: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x9201) TAG-TYPE=[SRATIONAL] UNIT-COUNT=(1)> [[{286335522 858997828}]] // 5: IfdTagEntry<TAG-IFD=[] TAG-ID=(0x9201) TAG-TYPE=[SRATIONAL] UNIT-COUNT=(1)> [[{286335522 858997828}]]
} }

View File

@ -6,7 +6,7 @@ import (
"bytes" "bytes"
"path" "path"
"fmt" "fmt"
"sort" "strings"
"github.com/dsoprea/go-logging" "github.com/dsoprea/go-logging"
) )
@ -148,7 +148,7 @@ func TestAddChildIb(t *testing.T) {
if ib.tags[0].tagId != 0x11 { if ib.tags[0].tagId != 0x11 {
t.Fatalf("first tag not correct") t.Fatalf("first tag not correct")
} else if ib.tags[1].tagId != ibChild.ifdTagId { } else if ib.tags[1].tagId != ibChild.ifdTagId {
t.Fatalf("second tag ID does not match child-IFD tag-ID: (0x%02x) != (0x%02x)", ib.tags[1].tagId, ibChild.ifdTagId) t.Fatalf("second tag ID does not match child-IFD tag-ID: (0x%04x) != (0x%04x)", ib.tags[1].tagId, ibChild.ifdTagId)
} else if ib.tags[1].value.Ib() != ibChild { } else if ib.tags[1].value.Ib() != ibChild {
t.Fatalf("second tagvalue does not match child-IFD") t.Fatalf("second tagvalue does not match child-IFD")
} else if ib.tags[2].tagId != 0x22 { } else if ib.tags[2].tagId != 0x22 {
@ -169,6 +169,7 @@ func TestAddTagsFromExisting(t *testing.T) {
entries := make([]*IfdTagEntry, 3) entries := make([]*IfdTagEntry, 3)
entries[0] = &IfdTagEntry{ entries[0] = &IfdTagEntry{
Ii: ExifIi,
TagId: 0x11, TagId: 0x11,
TagType: TypeByte, TagType: TypeByte,
UnitCount: 4, UnitCount: 4,
@ -176,11 +177,14 @@ func TestAddTagsFromExisting(t *testing.T) {
} }
entries[1] = &IfdTagEntry{ entries[1] = &IfdTagEntry{
Ii: ExifIi,
TagId: 0x22, TagId: 0x22,
TagType: TypeLong,
ChildIfdName: "some ifd", ChildIfdName: "some ifd",
} }
entries[2] = &IfdTagEntry{ entries[2] = &IfdTagEntry{
Ii: ExifIi,
TagId: 0x33, TagId: 0x33,
TagType: TypeByte, TagType: TypeByte,
UnitCount: 4, UnitCount: 4,
@ -197,9 +201,11 @@ func TestAddTagsFromExisting(t *testing.T) {
if ib.tags[0].tagId != 0x11 { if ib.tags[0].tagId != 0x11 {
t.Fatalf("tag (0) not correct") t.Fatalf("tag (0) not correct")
} else if ib.tags[1].tagId != 0x33 { } else if ib.tags[1].tagId != 0x22 {
t.Fatalf("tag (1) not correct") t.Fatalf("tag (1) not correct")
} else if len(ib.tags) != 2 { } else if ib.tags[2].tagId != 0x33 {
t.Fatalf("tag (2) not correct")
} else if len(ib.tags) != 3 {
t.Fatalf("tag count not correct") t.Fatalf("tag count not correct")
} }
} }
@ -275,9 +281,9 @@ func TestAddTagsFromExisting__Excludes(t *testing.T) {
err := ib.AddTagsFromExisting(ifd, nil, nil, []uint16 { 0x11 }) err := ib.AddTagsFromExisting(ifd, nil, nil, []uint16 { 0x11 })
log.PanicIf(err) log.PanicIf(err)
if ib.tags[0].tagId != 0x33 { if ib.tags[0].tagId != 0x22 {
t.Fatalf("tag not correct") t.Fatalf("tag not correct")
} else if len(ib.tags) != 1 { } else if len(ib.tags) != 2 {
t.Fatalf("tag count not correct") t.Fatalf("tag count not correct")
} }
} }
@ -328,7 +334,7 @@ func TestFindN_First_1(t *testing.T) {
bt = tags[found[0]] bt = tags[found[0]]
if bt.tagId != 0x11 { if bt.tagId != 0x11 {
log.Panicf("Found entry is not correct: (0x%02x)", bt.tagId) log.Panicf("Found entry is not correct: (0x%04x)", bt.tagId)
} }
} }
@ -378,7 +384,7 @@ func TestFindN_First_2_1Returned(t *testing.T) {
bt = tags[found[0]] bt = tags[found[0]]
if bt.tagId != 0x11 { if bt.tagId != 0x11 {
log.Panicf("Found entry is not correct: (0x%02x)", bt.tagId) log.Panicf("Found entry is not correct: (0x%04x)", bt.tagId)
} }
} }
@ -450,12 +456,12 @@ func TestFindN_First_2_2Returned(t *testing.T) {
bt = tags[found[0]] bt = tags[found[0]]
if bt.tagId != 0x11 || bytes.Compare(bt.value.Bytes(), []byte("test string")) != 0 { if bt.tagId != 0x11 || bytes.Compare(bt.value.Bytes(), []byte("test string")) != 0 {
log.Panicf("Found entry 0 is not correct: (0x%02x) [%s]", bt.tagId, bt.value) log.Panicf("Found entry 0 is not correct: (0x%04x) [%s]", bt.tagId, bt.value)
} }
bt = tags[found[1]] bt = tags[found[1]]
if bt.tagId != 0x11 || bytes.Compare(bt.value.Bytes(), []byte("test string4")) != 0 { if bt.tagId != 0x11 || bytes.Compare(bt.value.Bytes(), []byte("test string4")) != 0 {
log.Panicf("Found entry 1 is not correct: (0x%02x) [%s]", bt.tagId, bt.value) log.Panicf("Found entry 1 is not correct: (0x%04x) [%s]", bt.tagId, bt.value)
} }
} }
@ -535,7 +541,7 @@ func TestFindN_Middle_WithDuplicates(t *testing.T) {
bt = tags[found[0]] bt = tags[found[0]]
if bt.tagId != 0x33 { if bt.tagId != 0x33 {
log.Panicf("Found entry is not correct: (0x%02x)", bt.tagId) log.Panicf("Found entry is not correct: (0x%04x)", bt.tagId)
} }
} }
@ -595,7 +601,7 @@ func TestFindN_Middle_NoDuplicates(t *testing.T) {
bt = tags[found[0]] bt = tags[found[0]]
if bt.tagId != 0x33 { if bt.tagId != 0x33 {
log.Panicf("Found entry is not correct: (0x%02x)", bt.tagId) log.Panicf("Found entry is not correct: (0x%04x)", bt.tagId)
} }
} }
@ -664,7 +670,7 @@ func TestFind_Hit(t *testing.T) {
bt = tags[position] bt = tags[position]
if bt.tagId != 0x33 { if bt.tagId != 0x33 {
log.Panicf("Found entry is not correct: (0x%02x)", bt.tagId) log.Panicf("Found entry is not correct: (0x%04x)", bt.tagId)
} }
} }
@ -1232,20 +1238,20 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain(t *testing.T) {
itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder) itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder)
ib := NewIfdBuilderFromExistingChain(index.RootIfd, itevr) ib := NewIfdBuilderFromExistingChain(index.RootIfd, itevr)
lines := ib.DumpToStrings() actual := ib.DumpToStrings()
expected := []string { expected := []string {
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(0) TAG=[0x10f]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(0) TAG=[0x010f]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(1) TAG=[0x110]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(1) TAG=[0x0110]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(2) TAG=[0x112]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(2) TAG=[0x0112]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(3) TAG=[0x11a]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(3) TAG=[0x011a]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(4) TAG=[0x11b]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(4) TAG=[0x011b]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(5) TAG=[0x128]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(5) TAG=[0x0128]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(6) TAG=[0x132]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(6) TAG=[0x0132]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(7) TAG=[0x13b]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(7) TAG=[0x013b]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(8) TAG=[0x213]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(8) TAG=[0x0213]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[] INDEX=(9) TAG=[0x8298]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[] INDEX=(9) TAG=[0x8298]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[Exif] INDEX=(10) TAG=[0x8769]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[Exif] INDEX=(10) TAG=[0x8769]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(0) TAG=[0x829a]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(0) TAG=[0x829a]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(1) TAG=[0x829d]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(1) TAG=[0x829d]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(2) TAG=[0x8822]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(2) TAG=[0x8822]",
@ -1271,27 +1277,28 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain(t *testing.T) {
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(22) TAG=[0xa001]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(22) TAG=[0xa001]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(23) TAG=[0xa002]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(23) TAG=[0xa002]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(24) TAG=[0xa003]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(24) TAG=[0xa003]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(25) TAG=[0xa20e]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[Iop] INDEX=(25) TAG=[0xa005]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(26) TAG=[0xa20f]", "<PARENTS=[IFD->Exif] IFD-NAME=[Iop]> IFD-TAG-ID=(0xa005) CHILD-IFD=[] INDEX=(0) TAG=[0x0001]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(27) TAG=[0xa210]", "<PARENTS=[IFD->Exif] IFD-NAME=[Iop]> IFD-TAG-ID=(0xa005) CHILD-IFD=[] INDEX=(1) TAG=[0x0002]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(28) TAG=[0xa401]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(26) TAG=[0xa20e]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(29) TAG=[0xa402]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(27) TAG=[0xa20f]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(30) TAG=[0xa403]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(28) TAG=[0xa210]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(31) TAG=[0xa406]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(29) TAG=[0xa401]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(32) TAG=[0xa430]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(30) TAG=[0xa402]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(33) TAG=[0xa431]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(31) TAG=[0xa403]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(34) TAG=[0xa432]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(32) TAG=[0xa406]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(35) TAG=[0xa434]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(33) TAG=[0xa430]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(36) TAG=[0xa435]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(34) TAG=[0xa431]",
"<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[Iop] INDEX=(37) TAG=[0xa005]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(35) TAG=[0xa432]",
"<PARENTS=[IFD->Exif] IFD-NAME=[Iop]> IFD-TAG-ID=(0xa005) CHILD-IFD=[] INDEX=(0) TAG=[0x01]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(36) TAG=[0xa434]",
"<PARENTS=[IFD->Exif] IFD-NAME=[Iop]> IFD-TAG-ID=(0xa005) CHILD-IFD=[] INDEX=(1) TAG=[0x02]", "<PARENTS=[IFD] IFD-NAME=[Exif]> IFD-TAG-ID=(0x8769) CHILD-IFD=[] INDEX=(37) TAG=[0xa435]",
"<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x00) CHILD-IFD=[GPSInfo] INDEX=(11) TAG=[0x8825]", "<PARENTS=[] IFD-NAME=[IFD]> IFD-TAG-ID=(0x0000) CHILD-IFD=[GPSInfo] INDEX=(11) TAG=[0x8825]",
"<PARENTS=[IFD] IFD-NAME=[GPSInfo]> IFD-TAG-ID=(0x8825) CHILD-IFD=[] INDEX=(0) TAG=[0x00]", "<PARENTS=[IFD] IFD-NAME=[GPSInfo]> IFD-TAG-ID=(0x8825) CHILD-IFD=[] INDEX=(0) TAG=[0x0000]",
} }
if reflect.DeepEqual(lines, expected) == false { if reflect.DeepEqual(actual, expected) == false {
t.Fatalf("IB did not [correctly] duplicate the IFD structure") fmt.Printf("ACTUAL:\n%s\n\nEXPECTED:\n%s\n", strings.Join(actual, "\n"), strings.Join(expected, "\n"))
t.Fatalf("IB did not [correctly] duplicate the IFD structure.")
} }
} }
@ -1308,32 +1315,44 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
// Decode from binary. // Decode from binary.
_, index, err := e.Collect(rawExif) _, originalIndex, err := e.Collect(rawExif)
log.PanicIf(err) log.PanicIf(err)
originalTags := index.RootIfd.DumpTags() originalThumbnailData, err := originalIndex.RootIfd.NextIfd.Thumbnail()
index.RootIfd.PrintTagTree(true) log.PanicIf(err)
originalTags := originalIndex.RootIfd.DumpTags()
// Encode back to binary. // Encode back to binary.
ibe := NewIfdByteEncoder() ibe := NewIfdByteEncoder()
itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder) itevr := NewIfdTagEntryValueResolver(rawExif, originalIndex.RootIfd.ByteOrder)
rootIb := NewIfdBuilderFromExistingChain(index.RootIfd, itevr) rootIb := NewIfdBuilderFromExistingChain(originalIndex.RootIfd, itevr)
updatedExif, err := ibe.EncodeToExif(rootIb) updatedExif, err := ibe.EncodeToExif(rootIb)
log.PanicIf(err) log.PanicIf(err)
// Parse again. // Parse again.
_, index, err = e.Collect(updatedExif) _, recoveredIndex, err := e.Collect(updatedExif)
log.PanicIf(err) log.PanicIf(err)
recoveredTags := index.RootIfd.DumpTags() recoveredTags := recoveredIndex.RootIfd.DumpTags()
index.RootIfd.PrintTagTree(true)
return recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail()
log.PanicIf(err)
// Check the thumbnail.
if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 {
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.
@ -1370,45 +1389,34 @@ return
} }
// Validate that all of the tags owned by the IFDs were presented. The tags // Validate that all of the tags owned by the IFDs were presented. Note
// might not be in the same order since the IFD tags are allocated after // that the thumbnail tags are not kept but only produced on the fly, which
// the non-IFD ones. // is why we check it above.
originalNonIfdTags := make([]string, 0) for i, recoveredIte := range recoveredTags {
for _, ite := range originalTags { if recoveredIte.ChildIfdName != "" {
if ite.ChildIfdName == "" { continue
originalNonIfdTags = append(originalNonIfdTags, fmt.Sprintf("%s 0x%02x", ite.Ii, ite.TagId))
}
}
sort.StringSlice(originalNonIfdTags).Sort()
recoveredNonIfdTags := make([]string, 0)
for _, ite := range recoveredTags {
if ite.ChildIfdName == "" {
recoveredNonIfdTags = append(recoveredNonIfdTags, fmt.Sprintf("%s 0x%02x", ite.Ii, ite.TagId))
}
}
sort.StringSlice(recoveredNonIfdTags).Sort()
if reflect.DeepEqual(recoveredNonIfdTags, originalNonIfdTags) != true {
fmt.Printf("Original non-IFD tags:\n\n")
for i, x := range originalNonIfdTags {
fmt.Printf(" %02d %v\n", i, x)
} }
fmt.Printf("\nRecovered non-IFD tags:\n\n") originalIte := originalTags[i]
for i, x := range recoveredNonIfdTags { if recoveredIte.Ii != originalIte.Ii {
fmt.Printf(" %02d %v\n", i, x) t.Fatalf("IfdIdentify not as expected: %s != %s ITE=%s", recoveredIte.Ii, originalIte.Ii, recoveredIte)
} else if recoveredIte.TagId != originalIte.TagId {
t.Fatalf("Tag-ID not as expected: %s != %s ITE=%s", recoveredIte.TagId, originalIte.TagId, recoveredIte)
} else if recoveredIte.TagType != originalIte.TagType {
t.Fatalf("Tag-type not as expected: %d != %d ITE=%s", recoveredIte.TagType, originalIte.TagType, recoveredIte)
} }
fmt.Printf("\n") originalValueBytes, err := originalIte.ValueBytes(originalIndex.RootIfd.addressableData, originalIndex.RootIfd.ByteOrder)
log.PanicIf(err)
t.Fatalf("Recovered non-IFD tags are not correct.") recoveredValueBytes, err := recoveredIte.ValueBytes(recoveredIndex.RootIfd.addressableData, recoveredIndex.RootIfd.ByteOrder)
log.PanicIf(err)
if bytes.Compare(originalValueBytes, recoveredValueBytes) != 0 {
t.Fatalf("bytes of tag content not correct: %s != %s", originalIte, recoveredIte)
}
} }
} }
@ -1496,7 +1504,7 @@ func TestAddFromConfigWithName(t *testing.T) {
if bt.ii != RootIi { if bt.ii != RootIi {
t.Fatalf("II not correct: %s", bt.ii) t.Fatalf("II not correct: %s", bt.ii)
} else if bt.tagId != 0x000b { } else if bt.tagId != 0x000b {
t.Fatalf("Tag-ID not correct: (0x%02x)", bt.tagId) t.Fatalf("Tag-ID not correct: (0x%04x)", bt.tagId)
} }
s := string(bt.value.Bytes()) s := string(bt.value.Bytes())

View File

@ -173,7 +173,7 @@ func Test_IfdTagEntry_String(t *testing.T) {
Ii: RootIi, Ii: RootIi,
} }
expected := "IfdTagEntry<TAG-IFD=[] TAG-ID=(0x01) TAG-TYPE=[BYTE] UNIT-COUNT=(6)>" expected := "IfdTagEntry<TAG-IFD=[] TAG-ID=(0x0001) TAG-TYPE=[BYTE] UNIT-COUNT=(6)>"
if ite.String() != expected { if ite.String() != expected {
t.Fatalf("string representation not expected: [%s] != [%s]", ite.String(), expected) t.Fatalf("string representation not expected: [%s] != [%s]", ite.String(), expected)
} }