
Функция Конт(Конт) Возврат Конт; КонецФункции
Функция Сам() Возврат Конт(Контекст); КонецФункции
//______________________________________________________________________________
//
Функция _Объект(__стр ="Делегат")
	_о =СоздатьОбъект(__стр);
	Возврат _о;
КонецФункции
//______________________________________________________________________________
//
Функция _Обработчик(__стр ="ДелегатОбработчик")
	_о =СоздатьОбъект(__стр);
	Возврат _о;
КонецФункции
//______________________________________________________________________________
//
Процедура тестСоздатьОбъект() Экспорт
	Сам =Сам();

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

	Сам.ПроверитьРавенство(_о.Пустой(), 1);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестПроверкаОбработчика() Экспорт
	Сам =Сам();
	
	_обр =_Обработчик();
	
	Сам.ПроверитьРавенство(_обр.функПроизведение(2,3,4), 24);
	
	_знач =15;
	_обр.процИнкремент(_знач);
	Сам.ПроверитьРавенство(_знач, 16);

	_обр.процКвадрат(_знач);
	Сам.ПроверитьРавенство(_знач, 256);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестДобавитьУдалить() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);

	_о.Добавить(_обр, "процИнкремент");
	_о.Добавить(_обр, "процКвадрат");
	_о.Удалить(_обр, "процКвадрат");
	_о.Удалить(_обр, "процИнкремент");

	Сам.ПроверитьРавенство(_о.Пустой(), 1);
	
	_о.Добавить(_обр, "процИнкремент");
	_о.Добавить(_обр, "процКвадрат");
	_о.Очистить();

	Сам.ПроверитьРавенство(_о.Пустой(), 1);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестДобавитьПовторно() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);

	_знач =_о.Добавить(_обр, "процИнкремент");
	Сам.ПроверитьРавенство(_знач, 1);

	_знач =_о.Добавить(_обр, "процИнкремент");
	Сам.ПроверитьРавенство(_знач, 1);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестУдалитьПовторно() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);

	// добавляем по 2
	_о.Добавить(_обр, "процИнкремент", "Инкремент");
	_о.Добавить(_обр, "процКвадрат", "Квадрат");
	_о.Добавить(_обр, "процИнкремент", "Инкремент");
	_о.Добавить(_обр, "процКвадрат", "Квадрат");
	
	// удаляем 1й раз
	_о.Удалить(_обр, "процИнкремент");
	_знач =_о.Удалить(_обр, "процКвадрат");
	Сам.ПроверитьРавенство(_знач, 1);

	// удаляем 2й раз (этих методов уже нет в текущей ревизии)
	//_о.Удалить(_обр, "процИнкремент");
	//_знач =_о.Удалить(_обр, "процКвадрат");
	//Сам.ПроверитьРавенство(_знач, 0);

	// все удалены
	Сам.ПроверитьРавенство(_о.Пустой(), 1);

	// нечего удалять
	_знач =_о.Удалить(_обр, "процИнкремент");
	Сам.ПроверитьРавенство(_знач, 0);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура _ДобавитьНесуществующийМетод(__стр) Экспорт
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "НетТакого__!__метода");
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестДобавитьНесуществующийМетод() Экспорт
	Сам =Сам();
	
	Сам.ПроверитьИсключение(Сам, "_ДобавитьНесуществующийМетод", "");
КонецПроцедуры
//______________________________________________________________________________
//
Процедура _ДобавитьМетодНеагрегатногоОбъекта(__стр) Экспорт
	_о =_Объект();
	_неагр = "";

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_неагр, "НетТакого__!__метода");
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестДобавитьМетодНеагрегатногоОбъекта() Экспорт
	Сам =Сам();
	
	Сам.ПроверитьИсключение(Сам, "_ДобавитьМетодНеагрегатногоОбъекта", "");
КонецПроцедуры
//______________________________________________________________________________
//
Процедура _ВызватьСЛишнимиПараметрами(__стр) Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

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

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент");
	
	_знач =125;
	_о.Вызвать(_знач);
	Сам.ПроверитьРавенство(_знач, 126);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестВызватьФункцию() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(3, 1);
	_о.Добавить(_обр, "функСумма");
	
	_знач =_о.Вызвать(5, 132, -4);
	Сам.ПроверитьРавенство(_знач, 133);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестВызватьМножествоПроцедур() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент");
	_о.Добавить(_обр, "процКвадрат");
	
	_знач =11;
	_о.Вызвать(_знач);
	Сам.ПроверитьРавенство(_знач, 144);

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

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент", "Инкремент");
	_о.Добавить(_обр, "процКвадрат", "Квадрат");
	
	_знач =11;
	_о.ВызватьПоКлючу("Инкремент", _знач);
	Сам.ПроверитьРавенство(_знач, 12);

	_о.ВызватьПоКлючу("Квадрат", _знач);
	Сам.ПроверитьРавенство(_знач, 144);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестВызватьФункциюПоКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(3, 1);
	_о.Добавить(_обр, "функСумма", "Сумма");
	_о.Добавить(_обр, "функПроизведение", "Произведение");
	
	_знач =_о.ВызватьПоКлючу("Сумма", 1, 4, 5);
	Сам.ПроверитьРавенство(_знач, 10);

	_знач =_о.ВызватьПоКлючу("Произведение", 5, 6, -2);
	Сам.ПроверитьРавенство(_знач, -60);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестВызватьМножествоОдинаковыхПроцедур() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

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

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

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

	_знач =15;
	_о.ВызватьПоКлючу("222", _знач);
	Сам.ПроверитьРавенство(_знач, 225);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестУдалитьПоКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент", "111");
	_о.Добавить(_обр, "процКвадрат", "222");
	
	_знач =_о.УдалитьПоКлючу("111");
	Сам.ПроверитьРавенство(_знач, 1);

	_знач =_о.УдалитьПоКлючу("222");
	Сам.ПроверитьРавенство(_знач, 1);

	_знач =_о.УдалитьПоКлючу("222");
	Сам.ПроверитьРавенство(_знач, 0);

	Сам.ПроверитьРавенство(_о.Пустой(), 1);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестУдалитьМножествоПроцедурПоКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент", "111");
	_о.Добавить(_обр, "процКвадрат", "111");
	_о.Добавить(_обр, "процДекремент", "222");
	_о.Добавить(_обр, "процКвадрат", "222");
	
	_знач =_о.УдалитьПоКлючу("111");
	Сам.ПроверитьРавенство(_знач, 1);

	_знач =_о.УдалитьПоКлючу("222");
	Сам.ПроверитьРавенство(_знач, 1);

	_знач =_о.УдалитьПоКлючу("222");
	Сам.ПроверитьРавенство(_знач, 0);

	Сам.ПроверитьРавенство(_о.Пустой(), 1);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестЗапретПрерывания() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 1);
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "2");
	_о.Добавить(_обр, "функПостИнкремент", "3");
	_о.Добавить(_обр, "функПостИнкремент", "3");
	_о.Добавить(_обр, "функПостИнкремент", "4");
	
	_нач =-2;
	_кон =_о.Вызвать(_нач);

	Сам.ПроверитьРавенство(_нач, 3);
	Сам.ПроверитьРавенство(_кон, 2);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестПрерывание() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 1, 1);
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "2");
	_о.Добавить(_обр, "функПостИнкремент", "3");
	_о.Добавить(_обр, "функПостИнкремент", "3");
	_о.Добавить(_обр, "функПостИнкремент", "4");
	
	_нач =-2;
	_кон =_о.Вызвать(_нач);

	Сам.ПроверитьРавенство(_нач, 1);
	Сам.ПроверитьРавенство(_кон, 0);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестЗапретПрерыванияПоКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 1);
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "2");
	
	_нач =-2;
	_кон =_о.ВызватьПоКлючу("1", _нач);

	Сам.ПроверитьРавенство(_нач, 3);
	Сам.ПроверитьРавенство(_кон, 2);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестПрерываниеПоКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 1, 1);
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "1");
	_о.Добавить(_обр, "функПостИнкремент", "2");
	
	_нач =-2;
	_кон =_о.ВызватьПоКлючу("1", _нач);

	Сам.ПроверитьРавенство(_нач, 1);
	Сам.ПроверитьРавенство(_кон, 0);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестВызватьПоНесуществующемуКлючу() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент", "Инкремент");
	
	_знач =14;
	_о.ВызватьПоКлючу("Инкремент", _знач);
	Сам.ПроверитьРавенство(_знач, 15);

	_о.ВызватьПоКлючу("Не_найден_ключ", _знач);
	Сам.ПроверитьРавенство(_знач, 15);

	_о.Добавить(_обр, "процКвадрат", "__default");

	_о.ВызватьПоКлючу("Не_найден_ключ", _знач);
	Сам.ПроверитьРавенство(_знач, 225);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестРегистронезависимостьМетода() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "пРоЦИНкреМенТ");
	_о.Добавить(_обр, "прОЦкВАдрАт");
	
	_знач =14;
	_о.Вызвать(_знач);
	Сам.ПроверитьРавенство(_знач, 225);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестРегистронезависимостьКлюча() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент", "иНкРЕмЕНт");
	_о.Добавить(_обр, "процКвадрат", "__DEFaulT");
	
	_знач =14;
	_о.ВызватьПоКлючу("Инкремент", _знач);
	Сам.ПроверитьРавенство(_знач, 15);

	_о.ВызватьПоКлючу("Не_найден_метод", _знач);
	Сам.ПроверитьРавенство(_знач, 225);
КонецПроцедуры
//______________________________________________________________________________
//
Процедура тестУничтожениеОбработчика() Экспорт
	Сам =Сам();
	
	_о =_Объект();
	_обр =_Обработчик();

	_о.ОпределитьТип(1, 0);
	_о.Добавить(_обр, "процИнкремент");
	_о.Добавить(_обр, "процКвадрат");
	
	_обр = 0;
	_обр = "уже не здесь, еще не там";
	
	_знач =8;
	_о.Вызвать(_знач);
	Сам.ПроверитьРавенство(_знач, 81);
КонецПроцедуры
//______________________________________________________________________________
//
