функция Сам(Конт) возврат Конт; конецфункции

процедура ОбработатьКласс(Набор, ИмяКласса, Префикс)
	Мета = СоздатьОбъект("MetaInfoClasses");

	спМетоды = Мета.ПолучитьИменаМетодовКласса(ИмяКласса);
	для ъ = 1 по спМетоды.РазмерСписка() цикл
		стрМетод = спМетоды.ПолучитьЗначение(ъ);
		если ВРег(Сред(стрМетод, 1, СтрДлина(Префикс))) <> ВРег(Префикс) тогда продолжить; конецесли;
		 // каждый раз нужно создавать новый объект юнит-теста !!
		 // тормоза, но иначе никак
		набор.Добавить(ИмяКласса, стрМетод);
	конеццикла;
конецпроцедуры

функция ЗагрузитьИзКласса(ИмяКласса, Префикс) экспорт
	набор = СоздатьОбъект("НаборТестов");
	ОбработатьКласс(набор, ИмяКласса, Префикс);
	возврат набор;
конецфункции

функция ЗагрузитьИзСпискаКлассов(спКлассы, Префикс) экспорт
	набор = СоздатьОбъект("НаборТестов");
	для ъ = 1 по спКлассы.РазмерСписка() цикл
		ОбработатьКласс(набор, спКлассы.ПолучитьЗначение(ъ), Префикс);
	конеццикла;
	возврат набор;
конецфункции

функция ПолучитьСписокВсехКлассовЮнитТестовЗагруженныхВ1С(ПрефиксИлиСуффиксИмениКласса) экспорт
	Список = СоздатьОбъект("СписокЗначений");
	набор = СоздатьОбъект("НаборТестов");

	MetaInfoClasses = СоздатьОбъект("MetaInfoClasses");
	СписокВсехКлассов1С = MetaInfoClasses.ПолучитьВсеИменаКлассов();

	Длина = СтрДлина(ПрефиксИлиСуффиксИмениКласса);
	ПрефиксИлиСуффикс1 = Врег(ПрефиксИлиСуффиксИмениКласса);

	для ъ = 1 по СписокВсехКлассов1С.РазмерСписка() цикл
		ИмяКласса = СписокВсехКлассов1С.ПолучитьЗначение(ъ);
		ИмяКлассаВрег = Врег(СписокВсехКлассов1С.ПолучитьЗначение(ъ));

		Если (Лев(ИмяКлассаВрег, Длина) = ПрефиксИлиСуффикс1) или (Прав(ИмяКлассаВрег, Длина) = ПрефиксИлиСуффикс1) или (Длина = 0) Тогда
			Ошибка = "";
			Если ПустоеЗначение(набор.ПопыткаСоздатьОбъект(ИмяКласса, Ошибка)) = 1 Тогда
				Ошибка  =  "Создание класса '"+ИмяКласса+"' закончилось неудачей"+РазделительСтрок+
    	    		"	в тестировании класс не участвует"+РазделительСтрок+
					"   "+Ошибка;
				Сообщить(Ошибка, "!!!");
				Продолжить;
			КонецЕсли;
			Если набор.ЭтоТест(ИмяКласса) = 1 Тогда
				Список.ДобавитьЗначение(ИмяКласса);
			Иначе
	    	    Ошибка  =  "Класс   '"+ИмяКласса+"' не является потомком класса ТестовыйСлучай"+РазделительСтрок+
    	    		"	в тестировании класс не участвует";
				Сообщить(Ошибка, "!!!");
			КонецЕсли;
		КонецЕсли;
	конеццикла;

	возврат Список;
конецфункции

функция ЗагрузитьИзСпискаКлассовЗагруженныхВ1С(ПрефиксИлиСуффиксИмениКласса, ПрефиксМетодаКласса) экспорт
	набор = СоздатьОбъект("НаборТестов");

	СписокВсехКлассовЮнитТестов = Сам(Контекст).ПолучитьСписокВсехКлассовЮнитТестовЗагруженныхВ1С(ПрефиксИлиСуффиксИмениКласса);

	для ъ = 1 по СписокВсехКлассовЮнитТестов.РазмерСписка() цикл
		ИмяКласса = СписокВсехКлассовЮнитТестов.ПолучитьЗначение(ъ);
		ОбработатьКласс(набор, ИмяКласса, ПрефиксМетодаКласса);
	конеццикла;

	возврат набор;
конецфункции
                                                                      
// -------------- -------------- --------------
// ВАЖНАЯ ФИЧА: теперь юнит-тесты не обязательно описывать в defcls.prm
//		достаточно достаточно реализовать их в файле класса, добавив "Экспорт"
//
// пользуюсь методом GetMethOfContext класса "ВыполняемыйМодуль"
// -------------- -------------- --------------
//
// ВАЖНО: для этого приходится создавать объект с типом переданного класса !!
//		т.е. при большом количестве объектов (но не методов) возможны тормоза
//
// -------------- -------------- --------------
//
процедура ОбработатьКласс_ПолучаяИнфуИзФайловРеализацииКлассов(Набор, ИмяКласса, Префикс)
  	ВМ = СоздатьОбъект("ВыполняемыйМодуль");
  	
  	Попытка
  		Объект = СоздатьОбъект(ИмяКласса);
  	Исключение
  		Возврат;
  	КонецПопытки;

	ТабМетоды = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойства = "";
	
	ВМ.GetMethOfContext(Объект, ТабМетоды, ТабСвойства);

	спМетоды = СоздатьОбъект("СписокЗначений");
	ТабМетоды.Выгрузить(спМетоды,,,"NameRus");

	для ъ = 1 по спМетоды.РазмерСписка() цикл
		стрМетод = спМетоды.ПолучитьЗначение(ъ);
		если ВРег(Сред(стрМетод, 1, СтрДлина(Префикс))) <> ВРег(Префикс) тогда продолжить; конецесли;
		 // каждый раз нужно создавать новый объект юнит-теста !!
		 // тормоза, но иначе никак
		набор.Добавить(ИмяКласса, стрМетод);
	конеццикла;
конецпроцедуры

функция ЗагрузитьИзСпискаКлассов_ПолучаяИнфуИзФайловРеализацииКлассов(спКлассы, ПрефиксМетодаКласса) экспорт
	набор = СоздатьОбъект("НаборТестов");
	для ъ = 1 по спКлассы.РазмерСписка() цикл
		ОбработатьКласс_ПолучаяИнфуИзФайловРеализацииКлассов(набор, спКлассы.ПолучитьЗначение(ъ), ПрефиксМетодаКласса);
	конеццикла;
	возврат набор;
конецфункции
