Перем	ЛогФайл Экспорт,
		Трассировка Экспорт;

Перем _ВремяНачала, _ВремяЗавершения;
Перем _Ошибки, _ПропущенныеТесты;
Перем _ВсегоТестов, _ПропущеноТестов, _УспешныхТестов, _УпавшихТестов;

Перем	_фСообщатьТолькоВЛогФайл,
		_фБылаПечать;

// все сообщения автоматом заносятся в лог-файл
Процедура Сообщить(Сообщение, Маркер="") Экспорт
	ЛогФайл.Сообщить(Сообщение);
	Если _фСообщатьТолькоВЛогФайл = 1 Тогда Возврат; КонецЕсли;
	
	// удобней пользоваться трассировкой
	//Message(Сообщение, Маркер);
	Трассировка.Сообщить(Сообщение, Маркер);
КонецПроцедуры // Сообщить

Процедура Конструктор()
	_Ошибки=СоздатьОбъект("СписокЗначений");
	_ПропущенныеТесты=СоздатьОбъект("СписокЗначений");
	_ВсегоТестов = 0;
	_ПропущеноТестов =0;
	_УспешныхТестов = 0;
	_УпавшихТестов = 0;
	_ВремяНачала = _GetPerformanceCounter();

	ЛогФайл = СоздатьОбъект("Общие.ЛогФайл");
	ЛогФайл.ИмяЛогФайла = КаталогИБ() + "Testing\1cpp_tests.log";
	//ЛогФайл.СообщитьСДатой("Очередное тестирование");

	_фСообщатьТолькоВЛогФайл = 0;
	_фБылаПечать = 0;

	//Трассировка = СоздатьОбъект("Общие.Трассировка");
	//Трассировка.НазваниеТрассировки = "Тестирование 1С++";
	//Трассировка.РежимТрассировки = 0;
КонецПроцедуры

Процедура Печать() Экспорт Далее

Процедура Деструктор()
	// если не было печати, скинем ее в лог-файл
	Если _фБылаПечать = 0 Тогда
		_фСообщатьТолькоВЛогФайл = 1;
		Печать();
	КонецЕсли;
КонецПроцедуры // Деструктор

Функция ВсегоТестов() Экспорт
	Возврат _ВсегоТестов;
КонецФункции

Функция ПропущеноТестов() Экспорт
	Возврат _ПропущеноТестов;
КонецФункции

Функция УспешныхТестов() Экспорт
	Возврат _УспешныхТестов;
КонецФункции

Функция УпавшихТестов() Экспорт
	Возврат _УпавшихТестов;
КонецФункции

//Процедура ОтметитьВремяЗапуска() Экспорт
//	Если ПустоеЗначение(_ВремяНачала)=1 Тогда
//		_ВремяНачала = _GetPerformanceCounter();
//	КонецЕсли;
//КонецПроцедуры

Функция ВремяВыполнения() Экспорт
	Возврат _ВремяЗавершения-_ВремяНачала;
КонецФункции

Процедура ДобавитьПадение(ОписаниеТеста, Ошибка, ОбъектИсключения) Экспорт
	_ВсегоТестов = _ВсегоТестов + 1;
	Если ТипЗначенияСтр(ОбъектИсключения)="Исключение_ПропуститьТест" Тогда
		_ПропущеноТестов = _ПропущеноТестов + 1;
		стрОписание=стрСоединить(ОписаниеТеста, ОбъектИсключения.Причина, РазделительСтрок+"       Причина: ");
		_ПропущенныеТесты.ДобавитьЗначение(стрОписание);
		Возврат;
	КонецЕсли;
	_УпавшихТестов = _УпавшихТестов + 1;
	Описание = Ошибка + РазделительСтрок + ОбъектИсключения;
	Если (СокрЛП(Ошибка) = "") и ((ПустоеЗначение(ОбъектИсключения) = 1)) Тогда
		_Ошибки.ДобавитьЗначение("Неизвестная ошибка", ОписаниеТеста); // иначе число ошибок не будет совпадать с числом упавших тестов
	Иначе
		_Ошибки.ДобавитьЗначение(Описание, ОписаниеТеста);
	КонецЕсли;
	_ВремяЗавершения=_GetPerformanceCounter();
КонецПроцедуры

Процедура ДобавитьУспех() Экспорт
	_ВсегоТестов = _ВсегоТестов + 1;
	_УспешныхТестов = _УспешныхТестов + 1;
	_ВремяЗавершения=_GetPerformanceCounter();
КонецПроцедуры

Функция Итог() Экспорт
	стрПропущено=?(_ПропущеноТестов=0, "", "пропущено - "+_ПропущеноТестов+", ");
	Возврат "Запущено тестов: "+ВсегоТестов()+", из них "+стрПропущено+"упало - "+УпавшихТестов()+".";
КонецФункции

Процедура Печать() Экспорт
	Перем ОписаниеТеста;
	
	Если _фСообщатьТолькоВЛогФайл = 0 Тогда
		Трассировка = СоздатьОбъект("Общие.Трассировка");
		Трассировка.СоздатьТрассировку("Тестирование 1С++");
	КонецЕсли;
                                   
	Если ВсегоТестов() > 0 Тогда
		Сообщить(Итог(), ?(УпавшихТестов()>0, "!!!", "I"));
        Сообщить("Общее время выполнения: "+Формат(ВремяВыполнения()/1000, "Ч10.2")+" сек.", ".");
	КонецЕсли;

	Для ъ=1 По УпавшихТестов() Цикл
		Ошибка = _Ошибки.ПолучитьЗначение(ъ, ОписаниеТеста);
		Сообщить("");
		Сообщить(""+ъ+". Упал тест: "+ОписаниеТеста, "!!!");
		Сообщить(Ошибка);
	КонецЦикла;

	Если ПропущеноТестов()>0 Тогда
		Сообщить("");
		Сообщить("Пропущены тесты: ", "I");
		Для ъ=1 По ПропущеноТестов() Цикл
			Сообщить(""+ъ+". "+_ПропущенныеТесты.ПолучитьЗначение(ъ), "i");
		КонецЦикла;
	КонецЕсли;
	
	_фБылаПечать = 1;

	Если _фСообщатьТолькоВЛогФайл = 0 Тогда
		Трассировка.ПоказатьТрассировку();
	КонецЕсли;
КонецПроцедуры

Процедура ВыдатьРезультатВЛогФайл(ИмяЛогФайла, фОчиститьЛог) Экспорт
	Перем ОписаниеТеста;
    
	ЛогФайл1 = СоздатьОбъект("Общие.ЛогФайл");
	ЛогФайл1.ИмяЛогФайла = ИмяЛогФайла;

	Если фОчиститьЛог = 1 Тогда
		Если ФС.СуществуетФайл(ИмяЛогФайла) = 1 Тогда
			ФС.УдалитьФайл(ИмяЛогФайла);
		КонецЕсли;
	КонецЕсли;
	
	Если УпавшихТестов() = 0 Тогда
		ЛогФайл1.Сообщить("ok");
		ЛогФайл1.Сообщить(ТекущаяДата() + " "+ТекущееВремя());
		Возврат;
	КонецЕсли;
	
	Если ПропущеноТестов()>0 Тогда
		ЛогФайл1.Сообщить("Пропущены тесты: ", "!!!");
		Для ъ=1 По ПропущеноТестов() Цикл
			ЛогФайл1.Сообщить(""+ъ+". "+_ПропущенныеТесты.ПолучитьЗначение(ъ), "i");
		КонецЦикла;
	КонецЕсли;
	
	Для ъ=1 По УпавшихТестов() Цикл
		Ошибка = _Ошибки.ПолучитьЗначение(ъ, ОписаниеТеста);
		ЛогФайл1.Сообщить("");
		ЛогФайл1.Сообщить(""+ъ+". Упал тест: "+ОписаниеТеста, "!!!");
	КонецЦикла;

	Если ВсегоТестов() > 0 Тогда
		ЛогФайл1.Сообщить("");
		ЛогФайл1.Сообщить(Итог(), "I");
	КонецЕсли; 
	
КонецПроцедуры