/*
Copyright 2018 The Kubernetes Authors.

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 pointer

import (
	"fmt"
	"testing"
)

func TestAllPtrFieldsNil(t *testing.T) {
	testCases := []struct {
		obj      interface{}
		expected bool
	}{
		{struct{}{}, true},
		{struct{ Foo int }{12345}, true},
		{&struct{ Foo int }{12345}, true},
		{struct{ Foo *int }{nil}, true},
		{&struct{ Foo *int }{nil}, true},
		{struct {
			Foo int
			Bar *int
		}{12345, nil}, true},
		{&struct {
			Foo int
			Bar *int
		}{12345, nil}, true},
		{struct {
			Foo *int
			Bar *int
		}{nil, nil}, true},
		{&struct {
			Foo *int
			Bar *int
		}{nil, nil}, true},
		{struct{ Foo *int }{new(int)}, false},
		{&struct{ Foo *int }{new(int)}, false},
		{struct {
			Foo *int
			Bar *int
		}{nil, new(int)}, false},
		{&struct {
			Foo *int
			Bar *int
		}{nil, new(int)}, false},
		{(*struct{})(nil), true},
	}
	for i, tc := range testCases {
		name := fmt.Sprintf("case[%d]", i)
		t.Run(name, func(t *testing.T) {
			if actual := AllPtrFieldsNil(tc.obj); actual != tc.expected {
				t.Errorf("%s: expected %t, got %t", name, tc.expected, actual)
			}
		})
	}
}

func TestInt32(t *testing.T) {
	val := int32(0)
	ptr := Int32(val)
	if *ptr != val {
		t.Errorf("expected %d, got %d", val, *ptr)
	}

	val = int32(1)
	ptr = Int32(val)
	if *ptr != val {
		t.Errorf("expected %d, got %d", val, *ptr)
	}
}

func TestInt32Deref(t *testing.T) {
	var val, def int32 = 1, 0

	out := Int32Deref(&val, def)
	if out != val {
		t.Errorf("expected %d, got %d", val, out)
	}

	out = Int32Deref(nil, def)
	if out != def {
		t.Errorf("expected %d, got %d", def, out)
	}
}

func TestInt32Equal(t *testing.T) {
	if !Int32Equal(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !Int32Equal(Int32(123), Int32(123)) {
		t.Errorf("expected true (val == val)")
	}
	if Int32Equal(nil, Int32(123)) {
		t.Errorf("expected false (nil != val)")
	}
	if Int32Equal(Int32(123), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if Int32Equal(Int32(123), Int32(456)) {
		t.Errorf("expected false (val != val)")
	}
}

func TestInt64(t *testing.T) {
	val := int64(0)
	ptr := Int64(val)
	if *ptr != val {
		t.Errorf("expected %d, got %d", val, *ptr)
	}

	val = int64(1)
	ptr = Int64(val)
	if *ptr != val {
		t.Errorf("expected %d, got %d", val, *ptr)
	}
}

func TestInt64Deref(t *testing.T) {
	var val, def int64 = 1, 0

	out := Int64Deref(&val, def)
	if out != val {
		t.Errorf("expected %d, got %d", val, out)
	}

	out = Int64Deref(nil, def)
	if out != def {
		t.Errorf("expected %d, got %d", def, out)
	}
}

func TestInt64Equal(t *testing.T) {
	if !Int64Equal(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !Int64Equal(Int64(123), Int64(123)) {
		t.Errorf("expected true (val == val)")
	}
	if Int64Equal(nil, Int64(123)) {
		t.Errorf("expected false (nil != val)")
	}
	if Int64Equal(Int64(123), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if Int64Equal(Int64(123), Int64(456)) {
		t.Errorf("expected false (val != val)")
	}
}

func TestBool(t *testing.T) {
	val := false
	ptr := Bool(val)
	if *ptr != val {
		t.Errorf("expected %t, got %t", val, *ptr)
	}

	val = true
	ptr = Bool(true)
	if *ptr != val {
		t.Errorf("expected %t, got %t", val, *ptr)
	}
}

func TestBoolDeref(t *testing.T) {
	val, def := true, false

	out := BoolDeref(&val, def)
	if out != val {
		t.Errorf("expected %t, got %t", val, out)
	}

	out = BoolDeref(nil, def)
	if out != def {
		t.Errorf("expected %t, got %t", def, out)
	}
}

func TestBoolEqual(t *testing.T) {
	if !BoolEqual(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !BoolEqual(Bool(true), Bool(true)) {
		t.Errorf("expected true (val == val)")
	}
	if BoolEqual(nil, Bool(true)) {
		t.Errorf("expected false (nil != val)")
	}
	if BoolEqual(Bool(true), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if BoolEqual(Bool(true), Bool(false)) {
		t.Errorf("expected false (val != val)")
	}
}

func TestString(t *testing.T) {
	val := ""
	ptr := String(val)
	if *ptr != val {
		t.Errorf("expected %s, got %s", val, *ptr)
	}

	val = "a"
	ptr = String(val)
	if *ptr != val {
		t.Errorf("expected %s, got %s", val, *ptr)
	}
}

func TestStringDeref(t *testing.T) {
	val, def := "a", ""

	out := StringDeref(&val, def)
	if out != val {
		t.Errorf("expected %s, got %s", val, out)
	}

	out = StringDeref(nil, def)
	if out != def {
		t.Errorf("expected %s, got %s", def, out)
	}
}

func TestStringEqual(t *testing.T) {
	if !StringEqual(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !StringEqual(String("abc"), String("abc")) {
		t.Errorf("expected true (val == val)")
	}
	if StringEqual(nil, String("abc")) {
		t.Errorf("expected false (nil != val)")
	}
	if StringEqual(String("abc"), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if StringEqual(String("abc"), String("def")) {
		t.Errorf("expected false (val != val)")
	}
}

func TestFloat32(t *testing.T) {
	val := float32(0)
	ptr := Float32(val)
	if *ptr != val {
		t.Errorf("expected %f, got %f", val, *ptr)
	}

	val = float32(0.1)
	ptr = Float32(val)
	if *ptr != val {
		t.Errorf("expected %f, got %f", val, *ptr)
	}
}

func TestFloat32Deref(t *testing.T) {
	var val, def float32 = 0.1, 0

	out := Float32Deref(&val, def)
	if out != val {
		t.Errorf("expected %f, got %f", val, out)
	}

	out = Float32Deref(nil, def)
	if out != def {
		t.Errorf("expected %f, got %f", def, out)
	}
}

func TestFloat32Equal(t *testing.T) {
	if !Float32Equal(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !Float32Equal(Float32(1.25), Float32(1.25)) {
		t.Errorf("expected true (val == val)")
	}
	if Float32Equal(nil, Float32(1.25)) {
		t.Errorf("expected false (nil != val)")
	}
	if Float32Equal(Float32(1.25), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if Float32Equal(Float32(1.25), Float32(4.5)) {
		t.Errorf("expected false (val != val)")
	}
}

func TestFloat64(t *testing.T) {
	val := float64(0)
	ptr := Float64(val)
	if *ptr != val {
		t.Errorf("expected %f, got %f", val, *ptr)
	}

	val = float64(0.1)
	ptr = Float64(val)
	if *ptr != val {
		t.Errorf("expected %f, got %f", val, *ptr)
	}
}

func TestFloat64Deref(t *testing.T) {
	var val, def float64 = 0.1, 0

	out := Float64Deref(&val, def)
	if out != val {
		t.Errorf("expected %f, got %f", val, out)
	}

	out = Float64Deref(nil, def)
	if out != def {
		t.Errorf("expected %f, got %f", def, out)
	}
}

func TestFloat64Equal(t *testing.T) {
	if !Float64Equal(nil, nil) {
		t.Errorf("expected true (nil == nil)")
	}
	if !Float64Equal(Float64(1.25), Float64(1.25)) {
		t.Errorf("expected true (val == val)")
	}
	if Float64Equal(nil, Float64(1.25)) {
		t.Errorf("expected false (nil != val)")
	}
	if Float64Equal(Float64(1.25), nil) {
		t.Errorf("expected false (val != nil)")
	}
	if Float64Equal(Float64(1.25), Float64(4.5)) {
		t.Errorf("expected false (val != val)")
	}
}
