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

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

Процедура ТестТипЗначенияСтр() Экспорт
	Сам = Сам();

	Структура = Структура();

	Сам.ПроверитьРавенство(ТипЗначенияСтр(Структура), "Структура");

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

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

	Структура = Структура();

	Сам.ПроверитьРавенство(Структура.Количество(), 0);

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

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

	Структура = Структура();

	//Структура.Удалить("1");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Удалить", "1");

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

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

	Структура = Структура();

	ИмяСвойства = -1;

	//	Значение = Структура.Получить(1, ИмяСвойства);
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Получить", 1, ИмяСвойства);

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

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

	Структура = Структура();

	Значение = -1;

	фРезультат = Структура.Свойство("1", Значение);

	Сам.ПроверитьРавенство(фРезультат, 0);
	Сам.ПроверитьРавенство(ТипЗначения(Значение), 0);

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

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

	Структура = Структура();

	Значение = -1;

	фРезультат = Структура.Свойство("", Значение);

	Сам.ПроверитьРавенство(фРезультат, 0);
	Сам.ПроверитьРавенство(ТипЗначения(Значение), 0);

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

Процедура ТестСвойствоПоКлючуВПустойСтруктуре() Экспорт
	Сам = Сам();

	Структура = Структура();

	//Значение = Структура.Ключ;
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Ключ");

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

Процедура ТестОчиститьВПустойСтруктуре() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Очистить();

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

Процедура ТестВставитьИОчистить1() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);

	Структура.Очистить();
	Сам.ПроверитьРавенство(Структура.Количество(), 0);

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

Процедура ТестВставитьИОчистить100() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Для к=1 По 100 Цикл
		Структура.Вставить(к, к);
	КонецЦикла;
	Сам.ПроверитьРавенство(Структура.Количество(), 100);

	Структура.Очистить();
	Сам.ПроверитьРавенство(Структура.Количество(), 0);

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

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

	Структура = Структура();
                                
	Структура.Вставить("Ключ", "Значение");

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

	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Ключ");

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

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

	Структура = Структура();
                                
	Для к=1 По 100 Цикл
		Структура.Вставить(к, к);
	КонецЦикла;

	Для к=1 По 100 Цикл
		Структура.Удалить(к);
	КонецЦикла;
	Сам.ПроверитьРавенство(Структура.Количество(), 0);

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
                        
	Значение = Структура.Получить(1);

	Сам.ПроверитьРавенство(Значение, "Значение");

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
                        
	//Значение = Структура.Получить(0);
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Получить", 0);

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
                        
	//Значение = Структура.Получить(-10);
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Получить", -10);

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

Процедура ТестВставитьИПолучитьБольшеЧемКоличество() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
                        
	//Значение = Структура.Получить(2);
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Получить", 2);

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
                        
	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);

	Сам.ПроверитьРавенство(ИмяСвойства, "Ключ");
	Сам.ПроверитьРавенство(Значение, "Значение");

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

Процедура ТестВставитьИПроверитьСвойство2() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);

	Сам.ПроверитьРавенство(Структура.Ключ, "Значение");

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

Процедура ТестВставитьИПроверитьСвойство3() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
	
	Значение = "";
	фРезультат = Структура.Свойство("Ключ", Значение);
	Сам.ПроверитьРавенство(фРезультат, 1);
	Сам.ПроверитьРавенство(Значение, "Значение");

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
	Сам.ПроверитьРавенство(Структура.Количество(), 1);
                        
	Сам.ПроверитьРавенство(Структура.клЮч, "Значение");
	
	Значение = "";
	фРезультат = Структура.Свойство("клюЧ", Значение);
	Сам.ПроверитьРавенство(фРезультат, 1);
	Сам.ПроверитьРавенство(Значение, "Значение");

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

Процедура ТестУдалитьВДругомРегистре() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Структура.Вставить("Ключ", "Значение");

	Структура.Удалить("клЮЧ");
	Сам.ПроверитьРавенство(Структура.Количество(), 0);

	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Ключ");

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение1");
                        
	Структура.Вставить("Ключ", "Значение2");

	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);

	Сам.ПроверитьРавенство(ИмяСвойства, "Ключ");
	Сам.ПроверитьРавенство(Значение, "Значение2");

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение1");
                        
	Структура.Вставить("Ключ", "Значение2");

	Сам.ПроверитьРавенство(Структура.Ключ, "Значение2");

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

Процедура ТестВставитьСТемжеКлючом3() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение1");
                        
	Структура.Вставить("Ключ", "Значение2");
	
	Значение = "";
	фРезультат = Структура.Свойство("Ключ", Значение);
	Сам.ПроверитьРавенство(фРезультат, 1);
	Сам.ПроверитьРавенство(Значение, "Значение2");

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

Процедура ТестВставитьСТемжеКлючомВДругомРегистре() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение1");
                        
	Структура.Вставить("кЛЮЧ", "Значение2");
	
	Сам.ПроверитьРавенство(Структура.Ключ, "Значение2");

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

Процедура ТестВставитьПоЗначению() Экспорт
	Сам = Сам();

	Структура = Структура();
    ЗначениеИсходное = "Значение1";
	
	Структура.Вставить("Ключ", ЗначениеИсходное);
                        
    ЗначениеИсходное = "Значение2";
	
	Сам.ПроверитьРавенство(Структура.Ключ, "Значение1");

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

Процедура ТестВставитьПоЗначению2() Экспорт
	Сам = Сам();

	Структура = Структура();
    ЗначениеИсходное = "Значение1";
	
	Структура.Вставить("Ключ", ЗначениеИсходное, 1);
                        
    ЗначениеИсходное = "Значение2";
	
	Сам.ПроверитьРавенство(Структура.Ключ, "Значение1");

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

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

	Структура = Структура();
    ЗначениеИсходное = "Значение1";

	Структура.Вставить("Ключ", ЗначениеИсходное, 0);
                        
    ЗначениеИсходное = "Значение2";
	Сам.ПроверитьРавенство(Структура.Ключ, "Значение2");

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

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

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение1", 0);
    
	// здесь возвращается пустое значение
	//Сам.ПроверитьРавенство(Структура.Ключ, "Значение1");
	Сам.ПроверитьРавенство(ТипЗначения(Структура.Ключ), 0);

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

Процедура ТестУдалитьПоНесуществующемуИндексу() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить("Ключ", "Значение");
    
	//Структура.Удалить(1);
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Структура, "Удалить", 1);

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

// проверка, чтобы не было путаницы между индексами и числовыми ключами
Процедура ТестСвойствоПоИндексуВместоКлюча() Экспорт
	Сам = Сам();

	Структура = Структура();

	Структура.Вставить(2, "Значение2");
	Структура.Вставить(1, "Значение1");
               
	Значение = "";
	фРезультат = Структура.Свойство(1, Значение);
	Сам.ПроверитьРавенство(фРезультат, 1);

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

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

	Структура = Структура();

	Структура.Вставить(2, "Значение2");
	Структура.Вставить(1, "Значение1");
               
	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);

	Сам.ПроверитьРавенство(ИмяСвойства, "2");
	Сам.ПроверитьРавенство(Значение, "Значение2");
	
КонецПроцедуры

Процедура ТестРекурсия_СтруктураПомещаетсяВСебя() Экспорт
	Сам = Сам();

	Структура = Структура();

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

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

Процедура ТестВставитьБезЗначения() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Структура.Вставить(10);

	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);
	Сам.ПроверитьРавенство(ИмяСвойства, "10");
	Сам.ПроверитьРавенство(ТипЗначения(Значение), 0);

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

Процедура ТестПолучить10() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Для к=1 По 10 Цикл
		Структура.Вставить(к, к-10);
	КонецЦикла;

	Для н=-10 По -1 Цикл
		к = -н;
		ИмяСвойства = "";
		Значение = Структура.Получить(к, ИмяСвойства);
		Сам.ПроверитьРавенство(ИмяСвойства, Строка(к));
		Сам.ПроверитьРавенство(Значение, к-10);
	КонецЦикла;

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

// ключ всегда должен приводиться к типу "строка"
Процедура ТестПриведениеКлючаКСтроке() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Структура.Вставить(1, "ЗначениеЧисло");
	Структура.Вставить("1", "ЗначениеСтрока");

	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);
	Сам.ПроверитьРавенство(ИмяСвойства, "1");
	Сам.ПроверитьРавенство(Значение, "ЗначениеСтрока");

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

// ключ всегда должен приводиться к типу "строка"
Процедура ТестПриведениеКлючаКСтроке2() Экспорт
	Сам = Сам();

	Структура = Структура();
                                
	Структура.Вставить("1", "ЗначениеСтрока");
	Структура.Вставить(1, "ЗначениеЧисло");

	ИмяСвойства = "";
	Значение = Структура.Получить(1, ИмяСвойства);
	Сам.ПроверитьРавенство(ИмяСвойства, "1");
	Сам.ПроверитьРавенство(Значение, "ЗначениеЧисло");

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

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

	Структура = Структура();
                                
	Структура.Вставить("Ключ", "Значение");

	Сам.ПроверитьРавенство(Структура.Ключ, "Значение");

	Структура.Ключ = "НовоеЗначение";
	Сам.ПроверитьРавенство(Структура.Ключ, "НовоеЗначение");

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

Процедура ТестПрямаяЗаписьПоИмениНесуществующегоКлюча() Экспорт
	Сам = Сам();

	Структура = Структура();

	фБылоИсключение = 0;
	Попытка
		Структура.Ключ = "Значение";
	Исключение
		фБылоИсключение = 1;
	КонецПопытки;

	Сам.ПроверитьРавенство(фБылоИсключение, 1);

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

Процедура ТестПрямаяЗаписьПоИмениНесуществующегоКлюча2() Экспорт
	Сам = Сам();

	Структура = Структура();
	Структура.Вставить("Ключ", "Значение");

	фБылоИсключение = 0;
	Попытка
		Структура.НеизвестныйКлюч = "Значение";
	Исключение
		фБылоИсключение = 1;
	КонецПопытки;

	Сам.ПроверитьРавенство(фБылоИсключение, 1);

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

Процедура ОчиститьСтруктуру(Структура)
Перем ИмяСвойства;
	Для ъ=1 По Структура.Количество() Цикл
		Структура.Получить(ъ, ИмяСвойства);
		//Сообщить(ИмяСвойства);
		Структура.Вставить(ИмяСвойства, 0);
	КонецЦикла;
КонецПроцедуры
//--------------------------------------------

Процедура Тест_ЦиклПоСтруктуреСоВставкой() Экспорт
	Сам = Сам();
	Структура = Структура();
	
	Структура.Вставить("Ключ1", 0);
	Структура.Вставить("Ключ2", 0);
	
	Структура.Ключ1=1;
	Структура.Ключ2=1;

	ОчиститьСтруктуру(Структура);

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