Перем Поток;
Перем Поток2;

Перем Перем1 Экспорт, Перем2 Экспорт;

Перем Таб Экспорт, Таб2 Экспорт;

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

Функция _Объект() Возврат СоздатьОбъект("Поток"); КонецФункции // : Поток

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

Процедура ТестСпать() Экспорт
	_Объект = _Объект();
	_Объект.Спать(100);
КонецПроцедуры

Процедура ТестУснуть() Экспорт
	_Объект = _Объект();
	_Объект.Уснуть(100);
КонецПроцедуры

Процедура ТестСоздатьПоток() Экспорт
	Поток = _Объект();
	
	Перем1 = 1;
	ТекстПотока = "
	|Перем1 = 2;";
	Поток.СоздатьПоток(ТекстПотока);

	Поток.Спать(10);

	Сам().ПроверитьРавенство(Перем1, 2);
	
	Поток = 0;
КонецПроцедуры

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

Процедура ТестУдалитьПоток() Экспорт
	Поток = _Объект();
	Перем1 = 1;
	ТекстПотока = "
	|Перем1 = 2;";
	Поток.СоздатьПоток(ТекстПотока);

	Поток.УдалитьПоток();
	Поток.Спать(10);

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

Процедура ТестУдалитьПоток2() Экспорт
	Поток = _Объект();

	ТекстПотока = "
	|Перем1 = 2;";
	Поток.СоздатьПоток(ТекстПотока);
	
	Поток.Спать(10);
	Перем1 = 1;

	Поток.УдалитьПоток();
	Поток.Спать(10);

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

Процедура ТестДеструктор() Экспорт
	Поток = _Объект();

	Перем1 = 1;

	ТекстПотока = "
	|Перем1 = 2;";
	Поток.СоздатьПоток(ТекстПотока);

	Поток = 0;
    
	Поток2 = _Объект();
	Поток2.Спать(10);

	Сам().ПроверитьРавенство(Перем1, 1);
	
КонецПроцедуры

Процедура ТестРабота2хПотоков() Экспорт
	Поток = _Объект();

	Перем1 = 1;
	Перем2 = 1;

	ТекстПотока = "
	|Перем1 = 2;";
	Поток.СоздатьПоток(ТекстПотока);

	Поток2 = _Объект();
	ТекстПотока2 = "
	|Перем2 = 2;";
	Поток2.СоздатьПоток(ТекстПотока2);
	Поток2.Спать(10);

	Сам().ПроверитьРавенство(Перем1, 2);
	Сам().ПроверитьРавенство(Перем2, 2);
	
КонецПроцедуры

Процедура ТестСообщитьВПотоке() Экспорт
	Поток = _Объект();
	
	МодульПотока=
	"Перем1=0;
	|Для А=1 По 100 Цикл
	| Перем1 = Перем1+1;
	|КонецЦикла;
	|Сообщить(""сообщение из потока -> Перем1 = "" + Перем1);
	| Перем1 = Перем1+1;
	|";
	Поток.СоздатьПоток(МодульПотока);

	Поток.Спать(10);
	Сам().ПроверитьРавенство(Перем1, 101);
КонецПроцедуры

Процедура ТестСообщитьВПотоке2() Экспорт
	Поток = _Объект();
	
	МодульПотока=
	"Перем1=0;
	|Для А=1 По 100 Цикл
	| Перем1 = Перем1+1;
	|КонецЦикла;
	|Поток2=СоздатьОбъект(""Поток"");
	|Поток2.Уснуть(1000); // передать управление главной программе
	|Сообщить(""сообщение из потока -> Перем1 = "" + Перем1);
	| Перем1 = Перем1+1;
	|";
	Поток.СоздатьПоток(МодульПотока);

	Поток.Спать(10);
	Сам().ПроверитьРавенство(Перем1, 101);
КонецПроцедуры

//*************************************************************************
Процедура ТестОдновременнаяРаботаСТаблицей() Экспорт
	Поток = _Объект();
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	Таб.НоваяКолонка("Сумма", "Число");
	               
	лКоличествоПопыток = 5000;
	
	ТекстПотока = 
	"
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.НоваяСтрока();
	|	Таб.Сумма = к;
	|КонецЦикла;
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.УдалитьСтроку(1);
	|КонецЦикла;
	|";

	Поток.СоздатьПоток(ТекстПотока);
	
	Поток.Спать(10);
	
	// почему-то здесь не происходит падение теста :(
	// хотя выполнение завершается на этой строке
	Сам().ПропуститьТест(); // TODO после этого может падать :(
	// дальше код не выполняется
	
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб.НоваяСтрока();
		Таб.Сумма = к;
	КонецЦикла;
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб.УдалитьСтроку(1);
	КонецЦикла;
КонецПроцедуры

//*************************************************************************
Процедура ТестОдновременнаяРаботаСИндексированнойТаблицей() Экспорт
	Поток = _Объект();
	
	Таб = СоздатьОбъект("ИндексированнаяТаблица");
	Таб.НоваяКолонка("Сумма");
	               
	лКоличествоПопыток = 5000;
	
	ТекстПотока = 
	"
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.НоваяСтрока();
	|	Таб.Сумма = к;
	|КонецЦикла;
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.УдалитьСтроку(1);
	|КонецЦикла;
	|";          

	Поток.СоздатьПоток(ТекстПотока);

	Поток.Спать(10);
	
	// почему-то здесь не происходит падение теста :(
	// хотя выполнение завершается на этой строке
	Сам().ПропуститьТест(); // TODO после этого может падать :(
	// дальше код не выполняется
	
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб.НоваяСтрока();
		Таб.Сумма = к;
	КонецЦикла;
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб.УдалитьСтроку(1);
	КонецЦикла;
КонецПроцедуры

Процедура ТестОдновременнаяРаботаСРазнымиТаблицами() Экспорт
	Поток = _Объект();
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	Таб.НоваяКолонка("Сумма", "Число");
	
	Таб2 = СоздатьОбъект("ТаблицаЗначений");
	Таб2.НоваяКолонка("Сумма", "Число");
	               
	лКоличествоПопыток = 5000;
	
	ТекстПотока = 
	"
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.НоваяСтрока();
	|	Таб.Сумма = к;
	|КонецЦикла;
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.УдалитьСтроку(1);
	|КонецЦикла;
	|";

	Поток.СоздатьПоток(ТекстПотока);
	
	Поток.Спать(10);
	
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб2.НоваяСтрока();
		Таб2.Сумма = к;
	КонецЦикла;
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб2.УдалитьСтроку(1);
	КонецЦикла;
КонецПроцедуры

Процедура ТестОдновременнаяРаботаСРазнымиИндексированнымиТаблицами() Экспорт
	Поток = _Объект();
	
	Таб = СоздатьОбъект("ИндексированнаяТаблица");
	Таб.НоваяКолонка("Сумма");
	
	Таб2 = СоздатьОбъект("ИндексированнаяТаблица");
	Таб2.НоваяКолонка("Сумма");
	               
	лКоличествоПопыток = 15000;
	
	ТекстПотока = 
	"
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.НоваяСтрока();
	|	Таб.Сумма = к;
	|КонецЦикла;
	|Для к=1 По "+лКоличествоПопыток+" Цикл
	|	Таб.УдалитьСтроку(1);
	|КонецЦикла;
	|";

	Поток.СоздатьПоток(ТекстПотока);
	
	Поток.Спать(10);
	
	// почему-то здесь не происходит падение теста :(
	// хотя выполнение завершается на этой строке
	// даже предварительно Поток = 0; не помогает
	Сам().ПропуститьТест(); // TODO после этого может падать :(
	// дальше код не выполняется
	
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб2.НоваяСтрока();
		Таб2.Сумма = к;
	КонецЦикла;
	Для к=1 По лКоличествоПопыток Цикл
		//Если к % 100 = 0 Тогда
		//	Сообщить("к = "+к+", КолвоСтрок() = "+Таб.КоличествоСтрок());
		//КонецЕсли;
		Таб2.УдалитьСтроку(1);
	КонецЦикла;
КонецПроцедуры