// Copyright 2013 Google Inc.  All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pretty

import (
	"testing"
)

func TestDiff(t *testing.T) {
	type example struct {
		Name    string
		Age     int
		Friends []string
	}

	tests := []struct {
		desc      string
		got, want interface{}
		diff      string
	}{
		{
			desc: "basic struct",
			got: example{
				Name: "Zaphd",
				Age:  42,
				Friends: []string{
					"Ford Prefect",
					"Trillian",
					"Marvin",
				},
			},
			want: example{
				Name: "Zaphod",
				Age:  42,
				Friends: []string{
					"Ford Prefect",
					"Trillian",
				},
			},
			diff: ` {
- Name: "Zaphd",
+ Name: "Zaphod",
  Age: 42,
  Friends: [
   "Ford Prefect",
   "Trillian",
-  "Marvin",
  ],
 }`,
		},
	}

	for _, test := range tests {
		if got, want := Compare(test.got, test.want), test.diff; got != want {
			t.Errorf("%s:", test.desc)
			t.Errorf("  got:  %q", got)
			t.Errorf("  want: %q", want)
		}
	}
}

func TestSkipZeroFields(t *testing.T) {
	type example struct {
		Name    string
		Species string
		Age     int
		Friends []string
	}

	tests := []struct {
		desc      string
		got, want interface{}
		diff      string
	}{
		{
			desc: "basic struct",
			got: example{
				Name:    "Zaphd",
				Species: "Betelgeusian",
				Age:     42,
			},
			want: example{
				Name:    "Zaphod",
				Species: "Betelgeusian",
				Age:     42,
				Friends: []string{
					"Ford Prefect",
					"Trillian",
					"",
				},
			},
			diff: ` {
- Name: "Zaphd",
+ Name: "Zaphod",
  Species: "Betelgeusian",
  Age: 42,
+ Friends: [
+  "Ford Prefect",
+  "Trillian",
+  "",
+ ],
 }`,
		},
	}

	cfg := *CompareConfig
	cfg.SkipZeroFields = true

	for _, test := range tests {
		if got, want := cfg.Compare(test.got, test.want), test.diff; got != want {
			t.Errorf("%s:", test.desc)
			t.Errorf("  got:  %q", got)
			t.Errorf("  want: %q", want)
		}
	}
}
