package exif

import (
    "io/ioutil"

    "fmt"
    "os"
    "testing"
    "time"

    "github.com/dsoprea/go-logging"
)

func TestDumpBytes(t *testing.T) {
    f, err := ioutil.TempFile(os.TempDir(), "utilitytest")
    log.PanicIf(err)

    defer os.Remove(f.Name())

    originalStdout := os.Stdout
    os.Stdout = f

    DumpBytes([]byte{0x11, 0x22})

    os.Stdout = originalStdout

    _, err = f.Seek(0, 0)
    log.PanicIf(err)

    content, err := ioutil.ReadAll(f)
    log.PanicIf(err)

    if string(content) != "DUMP: 11 22 \n" {
        t.Fatalf("content not correct: [%s]", string(content))
    }
}

func TestDumpBytesClause(t *testing.T) {
    f, err := ioutil.TempFile(os.TempDir(), "utilitytest")
    log.PanicIf(err)

    defer os.Remove(f.Name())

    originalStdout := os.Stdout
    os.Stdout = f

    DumpBytesClause([]byte{0x11, 0x22})

    os.Stdout = originalStdout

    _, err = f.Seek(0, 0)
    log.PanicIf(err)

    content, err := ioutil.ReadAll(f)
    log.PanicIf(err)

    if string(content) != "DUMP: []byte { 0x11, 0x22 }\n" {
        t.Fatalf("content not correct: [%s]", string(content))
    }
}

func TestDumpBytesToString(t *testing.T) {
    s := DumpBytesToString([]byte{0x12, 0x34, 0x56})

    if s != "12 34 56" {
        t.Fatalf("result not expected")
    }
}

func TestDumpBytesClauseToString(t *testing.T) {
    s := DumpBytesClauseToString([]byte{0x12, 0x34, 0x56})

    if s != "0x12, 0x34, 0x56" {
        t.Fatalf("result not expected")
    }
}

func TestParseExifFullTimestamp(t *testing.T) {
    timestamp, err := ParseExifFullTimestamp("2018:11:30 13:01:49")
    log.PanicIf(err)

    actual := timestamp.Format(time.RFC3339)
    expected := "2018-11-30T13:01:49Z"

    if actual != expected {
        t.Fatalf("time not formatted correctly: [%s] != [%s]", actual, expected)
    }
}

func TestExifFullTimestampString(t *testing.T) {
    originalPhrase := "2018:11:30 13:01:49"

    timestamp, err := ParseExifFullTimestamp(originalPhrase)
    log.PanicIf(err)

    restoredPhrase := ExifFullTimestampString(timestamp)
    if restoredPhrase != originalPhrase {
        t.Fatalf("Final phrase [%s] does not equal original phrase [%s]", restoredPhrase, originalPhrase)
    }
}

func ExampleParseExifFullTimestamp() {
    originalPhrase := "2018:11:30 13:01:49"

    timestamp, err := ParseExifFullTimestamp(originalPhrase)
    log.PanicIf(err)

    fmt.Printf("To Go timestamp: [%s]\n", timestamp.Format(time.RFC3339))

    // Output:
    // To Go timestamp: [2018-11-30T13:01:49Z]
}

func ExampleExifFullTimestampString() {
    originalPhrase := "2018:11:30 13:01:49"

    timestamp, err := ParseExifFullTimestamp(originalPhrase)
    log.PanicIf(err)

    restoredPhrase := ExifFullTimestampString(timestamp)
    fmt.Printf("To EXIF timestamp: [%s]\n", restoredPhrase)

    // Output:
    // To EXIF timestamp: [2018:11:30 13:01:49]
}