Перем Конт Экспорт, Результат Экспорт;

Функция Конт(Конт) Возврат Конт; КонецФункции // : Контекст
Функция Сам() Возврат Конт(Контекст); КонецФункции

// Модуль = // :ВыполняемыйМодуль

Функция ВМ()
	Возврат СоздатьОбъект("ВыполняемыйМодуль");
КонецФункции

//----------------------------
// Тесты работы с исключениями

Процедура ТестПолучитьИсключение() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	    
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		а=1/0;
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(стрОшибка, "Деление на 0");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры

Процедура ТестСформироватьОшибку() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.СформироватьОшибку("Тестовая ошибка");
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(стрОшибка, "Тестовая ошибка");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры	// ТестСформироватьОшибку

Процедура ТестВыброситьИскл() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.ВыброситьИскл("ТестовоеИсключение");
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(стрОшибка, "");
	Сам.ПроверитьРавенство(ОбИсключение, "ТестовоеИсключение");
КонецПроцедуры

Процедура ТестВыброситьИсклСОписаниемОшибки() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Искл=СоздатьОбъект("СписокЗначений");
		Модуль.ВыброситьИскл(Искл, "ТекстТестовогоИсключения");
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(стрОшибка, "ТекстТестовогоИсключения");
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ОбИсключение), "СписокЗначений");
КонецПроцедуры

Процедура ТестЧужоеИсключение() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.ВыброситьИскл("Чужое исключение", "Чужое исключение");
	Исключение
	КонецПопытки;     
	
	Попытка
		а=1/0;
	Исключение
		стрОшибка = ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, "Деление на 0");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры
	


//--------------------------------------
// Тесты компиляции и исполнения модулей
// Нельзя использовать ПроверитьИсключение() потому что в нем также используется ВыполняемыйМодуль

Функция ТекстМодуля()
	Перем ТекстМодуля;
	ТекстМодуля = "Перем ОткрытыйАтрибут Экспорт; Перем ЗакрытыйАтрибут;
		|
		|Процедура ЗакрытаяПроцедура()
		|       ОткрытыйАтрибут = ""ЗакрытаяПроцедура"";
		|       ЗакрытыйАтрибут = ""ЗакрытаяПроцедура"";
		|КонецПроцедуры
		|
		|Функция ЗакрытаяФункция()
		|       ОткрытыйАтрибут = ""ЗакрытаяФункция"";
		|       ЗакрытыйАтрибут = ""ЗакрытаяФункция"";
		|       Возврат ""ЗакрытаяФункция"";
		|КонецФункции
		|
		|Процедура ОткрытаяПроцедура() Экспорт
		|       ОткрытыйАтрибут = ""ОткрытаяПроцедура"";
		|       ЗакрытыйАтрибут = ""ОткрытаяПроцедура"";
		|КонецПроцедуры
		|
		|Функция ОткрытаяФункция() Экспорт
		|       ОткрытыйАтрибут = ""ОткрытаяФункция"";
		|       ЗакрытыйАтрибут = ""ОткрытаяФункция"";
		|       Возврат ""ОткрытаяФункция"";
		|КонецФункции
		|
		|       ЗакрытыйАтрибут = ""ЗакрытыйАтрибут"";
		|       ОткрытыйАтрибут = ""ОткрытыйАтрибут"";
		|";
	Возврат ТекстМодуля;
КонецФункции

Процедура ТестКомпилироватьИВыполнитьМодуль() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, ПолучитьПустоеЗначение());
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытыйАтрибут");

	Модуль.ОткрытыйАтрибут="";
	Модуль.КомпилироватьИВыполнитьМодуль();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытыйАтрибут");

	Модуль.ОткрытыйАтрибут="";
	Модуль.РазрешитьИсключения();
	Модуль.КомпилироватьМодуль();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, ПолучитьПустоеЗначение());
	Модуль.ВыполнитьМодуль();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытыйАтрибут");
КонецПроцедуры

Процедура ТестИсполнениеМодуляВДругомКонтексте() Экспорт
	Сам = Сам();
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.НазначитьКонтекст(Сам);
	Модуль.УстановитьМодуль(
	"Перем Модульная Экспорт;
	|Модульная=2;
	|Результат=1");

	Модуль.КомпилироватьИВыполнитьМодуль();
	Сам.ПроверитьРавенство(Модуль.Модульная, 2);
	Сам.ПроверитьРавенство(Результат, 1);
КонецПроцедуры	// ТестКомпилироватьМодуль

Процедура ТестКомпилироватьМодульССинтаксическойОшибкой() Экспорт
	Сам = Сам();
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля()+" Некорректное выражение");
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 0);

	//Модуль.КомпилироватьИВыполнитьМодуль();
	ОшибкаКомпиляции = "(27) Некорректное <<?>>выражение	Переменная не определена";
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.КомпилироватьИВыполнитьМодуль();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, ОшибкаКомпиляции);
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());

	Модуль.РазрешитьИсключения();
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.КомпилироватьМодуль();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, ОшибкаКомпиляции);
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры

Процедура ТестВыполнитьМодульСНевернымВызовом() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"; ОткрытыйАтрибут.НеверныйВызов();");
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);

	Результат=Модуль.ВыполнитьМодуль();
	Сам.ПроверитьРавенство(Результат, 0); // TODO здесь что-то непонятное

	Модуль.РазрешитьИсключения();
	
	//Модуль.КомпилироватьИВыполнитьМодуль();
	ОшибкаИсполнения = "Ошибка выполнения: Значение не представляет агрегатный объект
	|<; ОткрытыйАтрибут.НеверныйВызов();>";
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.КомпилироватьИВыполнитьМодуль();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, ОшибкаИсполнения);
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());

	Модуль.РазрешитьИсключения();
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.ВыполнитьМодуль();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, ОшибкаИсполнения);
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры  // ТестВыполнитьМодуль

Процедура ТестКомпилироватьИВыполнитьМодульСОшибкойИсполнения() Экспорт
	Сам = Сам();

	Конт=СоздатьОбъект("Справочник.Новый1");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль("Результат=Конт.ЛевыйРеквизит");
	Модуль.НазначитьКонтекст(Сам);
	
	ОшибкаИсполнения = "Ошибка выполнения: Поле агрегатного объекта не обнаружено
	|<Результат=Конт.ЛевыйРеквизит>";
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.КомпилироватьИВыполнитьМодуль();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, ОшибкаИсполнения);
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());

	//В результате исполнения модуля переменная Результат получает значение из Конт.
	Сам.ПропуститьТест(, "Непонятно, что  с этим можно сделать...");
	Сам.ПроверитьРавенство(ТипЗначенияСтр(Результат), "Число");
	Сам.ПроверитьРавенство(Результат, 1);
КонецПроцедуры	// ТестКомпилироватьМодуль

// Далее идут странные тесты
// Здесь должно быть КомпилироватьМодуль() -- sedmin
Процедура ТестРазрешитьИсключения1() Экспорт
	Перем Модуль;
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();
                       
	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	 Сам().ПроверитьИсключение(Модуль, "Компилировать"); // Модуль.Компилировать();
КонецПроцедуры	// ТестРазрешитьИсключения

// Здесь не хватает КомпилироватьМодуль() -- sedmin
Процедура ТестРазрешитьИсключения2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"ОткрытыйАтрибут.НеверныйВызов();");

	// TODO здесь что-то непонятное          
	// смотри описание в "ТестВыполнитьМодульСНевернымВызовом"
	 Модуль.ВыполнитьМодуль();
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестОбращениеКВыполненномуМодулю() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);

	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытыйАтрибут");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытыйАтрибут");
	
	Модуль.ОткрытаяПроцедура();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытаяПроцедура");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ОткрытаяПроцедура");
	
	Результат = Модуль.ОткрытаяФункция();
	Сам.ПроверитьРавенство(Результат, "ОткрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ОткрытаяФункция");
	
	Модуль.ЗакрытаяПроцедура();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ЗакрытаяПроцедура");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытаяПроцедура");
	
	Результат = Модуль.ЗакрытаяФункция();
	Сам.ПроверитьРавенство(Результат, "ЗакрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ЗакрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытаяФункция");

КонецПроцедуры  // ТестОбращениеКВыполненномуМодулю

Процедура ТестНеверныйВызов() Экспорт
	Сам = Сам();
	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.НеверныйВызов();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, "Поле агрегатного объекта не обнаружено (НеверныйВызов)");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
	//Сам().ПроверитьИсключение(Модуль, "НеверныйВызов"); // Модуль.НеверныйВызов();
КонецПроцедуры	// ТестНеверныйВызов

Процедура ТестИсключенияВМетодахМодуля() Экспорт
	Сам = Сам(); // :ТестовыйСлучай
	Модуль = ВМ();
	Модуль.УстановитьМодуль(
	"Процедура Проц() Экспорт
	|  а=1/0;
	|КонецПроцедуры
	|
	|Функция Функ()
	|  Возврат 1/0;
	|КонецФункции");

	
	// sedmin
	// Без выполнения модуля методы не исполняются без всяких ошибок...
	Модуль.КомпилироватьИВыполнитьМодуль();

    Сам.ПропуститьТест(, "Непонятно, как должны работать пользовательские методы ВыпоняемогоМодуля");
	
	Модуль.Проц();
	рез=Модуль.Функ();
	
	Модуль.РазрешитьИсключения();
	Модуль.Проц();
	рез=Модуль.Функ();
	Возврат;
	
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		Модуль.Проц();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	Сам.ПроверитьРавенство(стрОшибка, "Деление на 0");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
	
	ОбИсключение = ""; стрОшибка = "111";
	Попытка
		рез=Модуль.Функ();
	Исключение
		стрОшибка=ОписаниеОшибки();
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(стрОшибка, "Деление на 01");
	Сам.ПроверитьРавенство(ОбИсключение, ПолучитьПустоеЗначение());
КонецПроцедуры

Процедура ТестРекурсивныйВызов() Экспорт
	Сам = Сам();

	Модуль = ВМ();

	ТекстМодуля = "Процедура РекурсивныйВызов(Модуль, Строка1) Экспорт
		|Модуль.УстановитьМодуль(Строка1);
		|Модуль.КомпилироватьМодуль();
		|КонецПроцедуры
		|";

	Модуль.УстановитьМодуль(ТекстМодуля);
	Модуль.КомпилироватьМодуль();
	Модуль.ВыполнитьМодуль();
       
	Сам().ПропуститьТест(0);
	//Сам.ПроверитьИсключение(Модуль, "РекурсивныйВызов", "А=1;"); // Модуль.РекурсивныйВызов(Модуль,"А=1;"); // также ошибка - если раскомментарить, 1С вылетит
	Модуль.РекурсивныйВызов(Модуль,"А=1;"); // также ошибка - если раскомментарить, 1С вылетит

КонецПроцедуры  // ТестРекурсивныйВызов

//--------------------------------------
// Тесты методов, несвойственных для ВыполняемогоМодуля
Процедура ТестGetMethOfContext1() Экспорт
	Сам = Сам();

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

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 0);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 0);

КонецПроцедуры

Процедура ТестGetMethOfContext2() Экспорт
	Сам = Сам();

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

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 30);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 1);

КонецПроцедуры

Процедура ТестGetMethOfContext3() Экспорт
	Сам = Сам();

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

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 30);

КонецПроцедуры

Процедура ТестGetMethOfContext4() Экспорт
	Сам = Сам();

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

КонецПроцедуры

Процедура ТестGetMethOfContextПроизвольногоМодуля() Экспорт
	Сам = Сам();

	Модуль = ВМ();		    
	
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "ЗакрытаяПроцедура", "ЗакрытаяПроцедура", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "ЗакрытаяФункция", "ЗакрытаяФункция", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "ОткрытаяПроцедура", "ОткрытаяПроцедура", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "ОткрытаяФункция", "ОткрытаяФункция", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "ОткрытыйАтрибут", "ОткрытыйАтрибут", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "ЗакрытыйАтрибут", "ЗакрытыйАтрибут", 1, 1);
	
	//ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Модуль, 4, 2);
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Модуль, табМетодовИсходная, ТабСвойствИсходная);
КонецПроцедуры

Процедура ТестGetMethOfContextБазовогоКласса() Экспорт
	Сам = Сам();

	Модуль = ВМ();		    
	Объект = СоздатьОбъект("ВыполняемыйМодуль_Предок");

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "ПолучитьПоследнийВызванныйМетод", "", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "ОткрытаяПроцедура", "", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "ОткрытаяФункция", "", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "АтрибутБазовогоКласса", "АтрибутБазовогоКласса", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "АтрибутКласса", "АтрибутКласса", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "_ПоследнийВызванныйМетод", "_ПоследнийВызванныйМетод", 1, 1);

	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Объект, табМетодовИсходная, ТабСвойствИсходная);
КонецПроцедуры

//Процедура ТестGetMethOfContextКлассаПотомка() Экспорт
//      Сам = Сам();
//
//      Модуль = ВМ();		    
////    Объект = СоздатьОбъект("ВыполняемыйМодуль_Потомок");
////
////    ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
////    
////    табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
////    ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "Функция1", 1, 0);
////    ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "Процедура1", 0, 1);
////    
////    ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
////    ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "АтрибутБазовогоКласса", "АтрибутБазовогоКласса", 1, 1);
////    ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "АтрибутКласса", "АтрибутКласса", 1, 1);
////    ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "_ПоследнийВызванныйМетод", "_ПоследнийВызванныйМетод", 1, 1);
////    
////    ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Объект, табМетодовИсходная, ТабСвойствИсходная);
//      
//      // !! ПОКА НЕ РЕАЛИЗОВАНО !!
//КонецПроцедуры

Процедура ТестGetMethOfContextПустогоКонтекста() Экспорт
	Сам = Сам();
	
	Конт = "";    
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Модуль.GetMethOfContext("Строка", табМетодов, ТабСвойств);      

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 0);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 0);
	
КонецПроцедуры  // ТестПустогоКонтекста

Процедура ТестGetMethOfContextДляМодуляВстроенногоОтчета() Экспорт
	Конт = "";    
	Сам().ОткрытьФорму("Отчет.ПолучениеМетодовИСвойств", Конт);
	Конт = Сам().КонтекстФормы;
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.GetMethOfContext(Конт, табМетодов, ТабСвойств);
//табМетодов.ВыбратьСтроку(""); 
//ТабСвойств.ВыбратьСтроку("");
//      Модуль.GetMethOfContext(Конт);
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "УстановитьРеквизит_АтрибутМодуля", 0, 1);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "ПолучитьРеквизит_АтрибутМодуля", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "", "ПриОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "", "ПриПовторномОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 4, "", "Сформировать", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 5, "", "ПолучитьТаблицу", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	// TODO для встроенных отчетов пока не выдает список реквизитов, а для внешних выдает :(
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "Флажок", 1, 1);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "", "Реквизит", 1, 1);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "", "ПолеСоСписком", 1, 0);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 3, "АтрибутМодуля", "", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "АтрибутМодуля", 1, 1);
	
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Конт, табМетодовИсходная, ТабСвойствИсходная);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры  // ТестМодуляФормыОтчета

Процедура ТестGetMethOfContextДляМодуляВнешнегоОтчета() Экспорт
	//Отлично проходит и при неправильной таблице методов
	//Сам().ПропуститьТест(, "Отлично проходит и при неправильной таблице методов");
	Сам().ПроверитьРавенство(ФС.СуществуетФайл(КаталогИБ()+"ExtForms\ПолучениеМетодовИСвойств.ert"), 1);

	Конт = 0;    
	Сам().ОткрытьФорму("Отчет", Конт, КаталогИБ()+"ExtForms\ПолучениеМетодовИСвойств.ert");
	Конт = Сам().КонтекстФормы;
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.GetMethOfContext(Конт, табМетодов, ТабСвойств);
//табМетодов.ВыбратьСтроку(""); 
//ТабСвойств.ВыбратьСтроку("");
//      Модуль.GetMethOfContext(Конт);

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "УстановитьРеквизит_АтрибутМодуля", 0, 1);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "ПолучитьРеквизит_АтрибутМодуля", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "", "УстановитьПараметр", 0, 2);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "", "ПриОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 4, "", "ПриПовторномОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 5, "", "Сформировать", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 6, "", "ПолучитьТаблицу", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 7, "", "ПриЗакрытии", 0, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();	  
	
	// сначала список реквизитов, затем список переменных модуля
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "Флажок", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "", "Реквизит", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "", "ПолеВвода", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 3, "", "ПолеСоСписком", 1, 0);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 4, "", "тзНаФорме", 1, 0);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 5, "", "АтрибутМодуля", 1, 1);
	
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Конт, табМетодовИсходная, ТабСвойствИсходная);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры  // ТестМодуляФормыОтчета

Процедура ТестРазрешитьИсключения3() Экспорт
	Перем Модуль;
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	 Сам().ПроверитьИсключение(Модуль, "КомпилироватьИВыполнитьМодуль"); // Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры  // ТестРазрешитьИсключения

Процедура ТестРазрешитьИсключения4() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"ОткрытыйАтрибут.НеверныйВызов();");

	// TODO здесь что-то непонятное	  
	// смотри описание в "ТестВыполнитьМодульСНевернымВызовом"
	Сам.ПропуститьТест();
	Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры  // ТестРазрешитьИсключения

Процедура ТестВыполнитьПроцедуруКонтекста() Экспорт
	Сам = Сам();

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

Процедура ТестВыполнитьФункциюКонтекста() Экспорт
	Сам = Сам();

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

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

Процедура ТестВыполнитьПроцедуруГрупповогоКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет#", Конт, КаталогИБ()+"ExtForms\ОтчетНовый1.ert");
	Конт = Сам().КонтекстФормы;
	
	фРез = Модуль.ВыполнитьПроцедуруКонтекста(Конт, "Сформировать", СоздатьОбъект("СписокЗначений"));
	Сам.ПроверитьРавенство(фРез, 1);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры  // ТестРазрешитьИсключения

Процедура ТестВыполнитьФункциюГрупповогоКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет#", Конт, КаталогИБ()+"ExtForms\ОтчетНовый1.ert");
	Конт = Сам().КонтекстФормы;
	
	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Конт, "ПолучитьРеквизит_АтрибутМодуля", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(лРез, 1);
КонецПроцедуры  // ТестРазрешитьИсключения

Процедура ТестВыполнитьПроцедуруГрупповогоКонтекста2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет.новый1#", Конт);
	Конт = Сам().КонтекстФормы;
	
	фРез = Модуль.ВыполнитьПроцедуруКонтекста(Конт, "Сформировать", СоздатьОбъект("СписокЗначений"));
	Сам.ПроверитьРавенство(фРез, 1);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры  // ТестРазрешитьИсключения

Процедура ТестВыполнитьФункциюГрупповогоКонтекста2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет.новый1#", Конт);
	Конт = Сам().КонтекстФормы;
	
	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Конт, "ПолучитьРеквизит_АтрибутМодуля", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(лРез, 1);
КонецПроцедуры  // ТестРазрешитьИсключения
