package safe_int

import (
	"os"
	"testing"

	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
)

type tester struct {
	t  *testing.T
	si ISafeInt
}

func TestSafeInt(t *testing.T) {
	sf := &tester{
		t: t,
	}
	sf.new()
	sf.newGetenv()
	sf.newFromStr()
	sf.set()
	sf.reset()
	sf.fromStr()
	sf.getEnv()
}

// Получает целое из строки
func (sf *tester) newFromStr() {
	sf.t.Log("newFromStr")
	res := NewSafeIntFromStr("-a52")
	if res.IsOk() {
		sf.t.Fatalf("newFromStr(): err==nil")
	}
	res = NewSafeIntFromStr("-60")
	if res.IsErr() {
		sf.t.Fatalf("newFromStr(): err=%v", res.Err())
	}
	if val := res.Val(); val.Get() != -60 {
		sf.t.Fatalf("newFromStr(): val(%v)!=-60", val.Get())
	}
}

// Получает целое из окружения
func (sf *tester) newGetenv() {
	sf.t.Log("newGetenv")
	res := NewSafeIntGetenv("TEST_ENV2")
	if res.IsOk() {
		sf.t.Fatalf("newGetenv(): err==nil")
	}
	os.Unsetenv("TEST_ENV2")
	os.Setenv("TEST_ENV2", "-52")
	res = NewSafeIntGetenv("TEST_ENV2")
	if res.IsErr() {
		sf.t.Fatalf("newGetenv(): err=%v", res.Err())
	}
	if val := res.Val(); val.Get() != -52 {
		sf.t.Fatalf("newGetenv(): val(%v)!=-52", val.Get())
	}
}

// Получает значение из окружения
func (sf *tester) getEnv() {
	sf.t.Log("getEnv")
	sf.getEnvBad1()
	sf.getEnvGood1()
}

func (sf *tester) getEnvGood1() {
	sf.t.Log("getEnvGood1")
	os.Unsetenv("TEST_VAL")
	os.Setenv("TEST_VAL", "45")
	val := NewSafeInt()
	res := val.Getenv("TEST_VAL")
	if res.IsErr() {
		sf.t.Fatalf("getEnvGood1(): err=%v", res.Err())
	}
	if val := res.Val(); val != 45 {
		sf.t.Fatalf("getEnvGood1(): val(%v)!=45", val)
	}
}

// Окружение не число
func (sf *tester) getEnvBad1() {
	sf.t.Log("getEnvBad1")
	os.Unsetenv("TEST_VAL")
	os.Setenv("TEST_VAL", "")
	val := NewSafeInt()
	res := val.Getenv("TEST_VAL")
	if res.IsOk() {
		sf.t.Fatalf("getEnvBad1(): res==ok")
	}
}

// Получает значение из строки
func (sf *tester) fromStr() {
	sf.t.Log("fromStr")
	sf.fromStrBad1()
	sf.fromStrGood1()
}

func (sf *tester) fromStrGood1() {
	sf.t.Log("fromStrGood1")
	val := NewSafeInt()
	res := val.FromStr("45")
	if res.IsErr() {
		sf.t.Fatalf("fromStrGood1(): err=%v", res.Err())
	}
	if val := res.Val(); val != 45 {
		sf.t.Fatalf("fromStrGood1(): val(%v)!=45", val)
	}
}

// Строка не число
func (sf *tester) fromStrBad1() {
	sf.t.Log("fromStrBad1")
	val := NewSafeInt()
	res := val.FromStr(" ")
	if res.IsOk() {
		sf.t.Fatalf("fromStrBad1(): res==ok")
	}
}

// Сбрасывает хранимое значение
func (sf *tester) reset() {
	sf.t.Log("reset")
	sf.si.Reset()
	if sf.si.Get() != 0 {
		sf.t.Fatalf("reset(): ISafeInt!=0")
	}
	sf.si.Reset()
	if sf.si.Get() != 0 {
		sf.t.Fatalf("reset(): ISafeInt!=0")
	}
}

// Установка хранимого значения
func (sf *tester) set() {
	sf.t.Log("set")
	sf.si.Set(77)
	if sf.si.Get() != 77 {
		sf.t.Fatalf("set(): ISafeInt!=77")
	}
	sf.si.Set(-56)
	if sf.si.Get() != -56 {
		sf.t.Fatalf("set(): ISafeInt!=-56")
	}
}

// Создаёт потокобезопасный булевый признак
func (sf *tester) new() {
	sf.t.Log("new")
	sf.si = NewSafeInt()
	if sf.si == nil {
		sf.t.Fatalf("new(): ISafeInt==nil")
	}
	if sf.si.Get() != 0 {
		sf.t.Fatalf("new(): ISafeInt!=0")
	}
}
