package mockenv

import (
	"testing"
)

/*
	Тест для отладочных переменных окружения
*/

// Тестер для переменных окружения
type tester struct {
	t  *testing.T
	me *MockEnv
}

func TestMockEnv(t *testing.T) {
	test := &tester{
		t: t,
	}
	test.create()
	test.initFake()
	test.readFile()
	test.getPairs()
	test.initLocal()
	test.stage()
}

// Плохой STAGE
func (sf *tester) stage() {
	sf.t.Logf("stage()\n")
	sf.badStage1()
	sf.badStage2()
}

// STAGE имеет неизвестное значение
func (sf *tester) badStage2() {
	sf.t.Logf("badStage2()\n")
	defer func() {
		if _panic := recover(); _panic == nil {
			sf.t.Errorf("badStage2(): panic==nil\n")
		}
	}()
	sf.me.dict["STAGE"] = "bad_local"
	sf.me.checkStage()
}

// Нет STAGE
func (sf *tester) badStage1() {
	sf.t.Logf("badStage1()\n")
	defer func() {
		if _panic := recover(); _panic == nil {
			sf.t.Errorf("badStage1(): panic==nil\n")
		}
	}()
	delete(sf.me.dict, "STAGE")
	sf.me.checkStage()
}

// Локальная инициализация
func (sf *tester) initLocal() {
	sf.initLocalBad1()
	sf.initLocalBad2()
	sf.initLocalBad3()
	sf.initLocalBad4()
	sf.initLocalGood1()
	sf.me.Unset()
}

func (sf *tester) initLocalGood1() {
	if err := sf.me.InitLocal(); err != nil {
		sf.t.Errorf("initLocalGood1(): err=\n\t%v\n", err)
	}
}

// Вообще нет STAGE
func (sf *tester) initLocalBad4() {
	_fileEnv := fileEnv
	fileEnv = "./test_data/env_bad2"
	if err := sf.me.InitLocal(); err == nil {
		sf.t.Errorf("initLocalBad4(): err==nil\n")
	}
	fileEnv = _fileEnv
}

// Кривое значение STAGE
func (sf *tester) initLocalBad3() {
	_fileEnv := fileEnv
	fileEnv = "./test_data/env_bad1"
	if err := sf.me.InitLocal(); err == nil {
		sf.t.Errorf("initLocalBad3(): err==nil\n")
	}
	fileEnv = _fileEnv
}

// Кривое содержимое файла
func (sf *tester) initLocalBad2() {
	_fileEnv := fileEnv
	fileEnv = "./test_data/env_bad"
	if err := sf.me.InitLocal(); err == nil {
		sf.t.Errorf("initLocalBad2(): err==nil\n")
	}
	fileEnv = _fileEnv
}

// Кривое имя файла
func (sf *tester) initLocalBad1() {
	_fileEnv := fileEnv
	fileEnv = "4"
	if err := sf.me.InitLocal(); err == nil {
		sf.t.Errorf("initLocalBad1(): err==nil\n")
	}
	fileEnv = _fileEnv
}

// Получение пар значений
func (sf *tester) getPairs() {
	sf.getPairsBad1()
	sf.getPairsBad2()
	sf.getPairsBad3()
	sf.getPairsBad4()
	sf.getPairsGood1()
}

func (sf *tester) getPairsGood1() {
	dict, err := sf.me.getPairs("\nPARAM=\"123\"\nPARAM2=\"param2\"\n")
	if err != nil {
		sf.t.Errorf("getPairsGood1(): err=\n\t%v\n", err)
	}
	if dict == nil {
		sf.t.Errorf("getPairsGood1(): dict == nil\n")
	}
}

// Кривая пара
func (sf *tester) getPairsBad4() {
	dict, err := sf.me.getPairs("\nPARAM=\"=\"=\"\"\nPARAM2=\"param2\"\n")
	if err == nil {
		sf.t.Errorf("getPairsBad4(): err==nil\n")
	}
	if dict != nil {
		sf.t.Errorf("getPairsBad4(): dict != nil\n")
	}
}

// Кривое значение
func (sf *tester) getPairsBad3() {
	dict, err := sf.me.getPairs("\nPARAM=\"\"\nPARAM2=\"param2\"\n")
	if err == nil {
		sf.t.Errorf("getPairsBad3(): err==nil\n")
	}
	if dict != nil {
		sf.t.Errorf("getPairsBad3(): dict != nil\n")
	}
}

// Кривой ключ
func (sf *tester) getPairsBad2() {
	dict, err := sf.me.getPairs("\n=\"param\"\nPARAM2=\"param2\"\n")
	if err == nil {
		sf.t.Errorf("getPairsBad2(): err==nil\n")
	}
	if dict != nil {
		sf.t.Errorf("getPairsBad2(): dict != nil\n")
	}
}

// Пустой текст
func (sf *tester) getPairsBad1() {
	dict, err := sf.me.getPairs("\n\n\n")
	if err == nil {
		sf.t.Errorf("getPairsBad1(): err==nil\n")
	}
	if dict != nil {
		sf.t.Errorf("getPairsBad1(): dict != nil\n")
	}
}

// Чтение файла переменных окружения
func (sf *tester) readFile() {
	sf.readFileBad1()
	sf.readFileBad2()
	sf.readFileBad3()
	sf.readFileGood1()
}

func (sf *tester) readFileGood1() {
	strData, err := sf.me.readFile()
	if err != nil {
		sf.t.Errorf("readFileGood1(): err=\n\t%v\n", err)
	}
	if strData == "" {
		sf.t.Errorf("readFileGood1(): strData is empty\n")
	}
}

// Кривой путь-2
func (sf *tester) readFileBad3() {
	_selfPath := selfPath
	selfPath = "me/"
	strData, err := sf.me.readFile()
	if err == nil {
		sf.t.Errorf("readFileBad3(): err==nil\n")
	}
	if strData != "" {
		sf.t.Errorf("readFileBad3(): strData not empty\n")
	}
	selfPath = _selfPath
}

// Неправильное имя файла
func (sf *tester) readFileBad2() {
	_fileEnv := fileEnv
	fileEnv = ""
	strData, err := sf.me.readFile()
	if err == nil {
		sf.t.Errorf("readFileBad2(): err==nil\n")
	}
	if strData != "" {
		sf.t.Errorf("readFileBad2(): strData not empty\n")
	}
	fileEnv = _fileEnv
}

// Кривой путь
func (sf *tester) readFileBad1() {
	_selfPath := selfPath
	selfPath = "#"
	strData, err := sf.me.readFile()
	if err == nil {
		sf.t.Errorf("readFileBad1(): err==nil\n")
	}
	if strData != "" {
		sf.t.Errorf("readFileBad1(): strData not empty\n")
	}
	selfPath = _selfPath
}

// Иницилизация фейковыми данными
func (sf *tester) initFake() {
	sf.me.InitFake()
}

// Создание объекта переменных окружения
func (sf *tester) create() {
	sf.me = NewMockEnv()
	if sf.me == nil {
		sf.t.Errorf("create(): mockEnv is nil\n")
	}
	if sf.me.dict == nil {
		sf.t.Errorf("create(): dict env is nil")
	}
	if len_ := len(sf.me.dict); len_ != 0 {
		sf.t.Errorf("create(): len dict(%v)!=0\n", len_)
	}
}
