Login light
// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

package sexpr

import (
    "reflect"
    "testing"
)

// Test verifies that encoding and decoding a complex data value
// produces an equal result.
//
// The test does not make direct assertions about the encoded output
// because the output depends on map iteration order, which is
// nondeterministic.  The output of the t.Log statements can be
// inspected by running the test with the -v flag:
//
//     $ go test -v gopl.io/ch12/sexpr
//
func Test(t *testing.T) {
    type Movie struct {
        Title, Subtitle string
        Year            int
        Actor           map[string]string
        Oscars          []string
        Sequel          *string
    }
    strangelove := Movie{
        Title:    "Dr. Strangelove",
        Subtitle: "How I Learned to Stop Worrying and Love the Bomb",
        Year:     1964,
        Actor: map[string]string{
            "Dr. Strangelove":            "Peter Sellers",
            "Grp. Capt. Lionel Mandrake": "Peter Sellers",
            "Pres. Merkin Muffley":       "Peter Sellers",
            "Gen. Buck Turgidson":        "George C. Scott",
            "Brig. Gen. Jack D. Ripper":  "Sterling Hayden",
            `Maj. T.J. "King" Kong`:      "Slim Pickens",
        },
        Oscars: []string{
            "Best Actor (Nomin.)",
            "Best Adapted Screenplay (Nomin.)",
            "Best Director (Nomin.)",
            "Best Picture (Nomin.)",
        },
    }

    // Encode it
    data, err := Marshal(strangelove)
    if err != nil {
        t.Fatalf("Marshal failed: %v", err)
    }
    t.Logf("Marshal() = %s\n", data)

    // Decode it
    var movie Movie
    if err := Unmarshal(data, &movie); err != nil {
        t.Fatalf("Unmarshal failed: %v", err)
    }
    t.Logf("Unmarshal() = %+v\n", movie)

    // Check equality.
    if !reflect.DeepEqual(movie, strangelove) {
        t.Fatal("not equal")
    }

    // Pretty-print it:
    data, err = MarshalIndent(strangelove)
    if err != nil {
        t.Fatal(err)
    }
    t.Logf("MarshalIdent() = %s\n", data)
}