Перем
		КаталогОбразов Экспорт
		;


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

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

//*************************************************************************
Процедура ПолучитьДанныеОТипе(ТипОбъектаИлиОбъектКласса, ТабМетоды, ТабСвойства) Экспорт

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

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

// -------------------------------- -------------------------------------
Процедура Конструктор()                                   
	КаталогОбразов = КаталогИБ()+"UnitTests\SpecialClasses\Образы классов\";
КонецПроцедуры // Конструктор

//======================================================================
Процедура ЗаписатьОбразОбъекта(ТипОбъектаИлиОбъектКласса) Экспорт
	Перем ТабМетоды, ТабСвойства;

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


//*************************************************************************
Процедура ВосстановитьОбразОбъекта(ТипОбъекта, ТабМетоды, ТабСвойства) Экспорт
	Перем лСписок;

	лСписок = "";
	Если ФС.СуществуетФайл(КаталогОбразов+ТипОбъекта+".lst") = 0 Тогда
		Модуль = ВМ();               
		лСтрокаИсключения = "Нет файла образа для объекта """+ТипОбъекта+"""";
		Модуль.ВыброситьИскл(лСтрокаИсключения, лСтрокаИсключения);
	КонецЕсли;
	
	ЗначениеИзФайла(КаталогОбразов+ТипОбъекта+".lst", лСписок, 1);
	
	Если ТипЗначенияСтр(лСписок) <> "СписокЗначений" Тогда
		Модуль = ВМ();               
		лСтрокаИсключения = "Неверный образ для объекта '"+ТипОбъекта+"'";
		Модуль.ВыброситьИскл(лСтрокаИсключения, лСтрокаИсключения);
	КонецЕсли;
	
	ТабМетоды = лСписок.Получить("Методы");
	ТабСвойства = лСписок.Получить("Свойства");
	
	Если ТипЗначенияСтр(ТабМетоды) <> "ТаблицаЗначений" Тогда
		Модуль = ВМ();               
		лСтрокаИсключения = "Неверный образ для объекта '"+ТипОбъекта+"' - неверная таблица методов";
		Модуль.ВыброситьИскл(лСтрокаИсключения, лСтрокаИсключения);
	КонецЕсли;
	
	Если ТипЗначенияСтр(ТабСвойства) <> "ТаблицаЗначений" Тогда
		Модуль = ВМ();               
		лСтрокаИсключения = "Неверный образ для объекта '"+ТипОбъекта+"' - неверная таблица свойств";
		Модуль.ВыброситьИскл(лСтрокаИсключения, лСтрокаИсключения);
	КонецЕсли;
	
КонецПроцедуры //ПолучитьДанныеОТипе

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

	ТабМетоды_Образ = "";
	ТабСвойства_Образ = "";

	Сам.ВосстановитьОбразОбъекта(ТипОбъекта, ТабМетоды_Образ, ТабСвойства_Образ);

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

	Сам.ПолучитьДанныеОТипе(ТипОбъекта, ТабМетоды, ТабСвойства);

	стрКолонкиМетоды = "Number,NameRus,NameEng,HasRetVal,NParams";
	стрКолонкиСвойства = "Number,NameRus,NameEng,IsReadable,IsWritable";

    ЮнитТест.ПроверитьРавенствоТаблиц(ТабМетоды_Образ, ТабМетоды, стрКолонкиМетоды, стрКолонкиМетоды);
    ЮнитТест.ПроверитьРавенствоТаблиц(ТабСвойства_Образ, ТабСвойства, стрКолонкиСвойства, стрКолонкиСвойства);

КонецПроцедуры	// СверитьМетодыИСвойстваОбъекта

Функция ТаблицаМетодов_Создать() Экспорт

	табМетодовИсходная = СоздатьОбъект("ТаблицаЗначений");
	табМетодовИсходная.НоваяКолонка("Number");
	табМетодовИсходная.НоваяКолонка("NameEng");
	табМетодовИсходная.НоваяКолонка("NameRus");
	табМетодовИсходная.НоваяКолонка("HasRetVal");
	табМетодовИсходная.НоваяКолонка("NParams");
	
	Возврат табМетодовИсходная;
КонецФункции
                                              
Функция ТаблицаСвойств_Создать() Экспорт
	
	ТабСвойствИсходная = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойствИсходная.НоваяКолонка("Number");
	ТабСвойствИсходная.НоваяКолонка("NameEng");
	ТабСвойствИсходная.НоваяКолонка("NameRus");
	ТабСвойствИсходная.НоваяКолонка("IsReadable");
	ТабСвойствИсходная.НоваяКолонка("IsWritable");
	
	Возврат ТабСвойствИсходная;
КонецФункции

Процедура ТаблицаМетодов_ДобавитьСтроку(Таб, Number1, NameRus, NameEng, HasRetVal, NParams) Экспорт
	//Таб = СоздатьОбъект("ТаблицаЗначений");
	Таб.НоваяСтрока();
	Таб.Number = Number1;
	Таб.NameRus = NameRus;
	Таб.NameEng = NameEng;
	Таб.HasRetVal = HasRetVal;
	Таб.NParams = NParams;
КонецПроцедуры

Процедура ТаблицаСвойств_ДобавитьСтроку(Таб, Number1, NameRus, NameEng, IsReadable, IsWritable) Экспорт
	//Таб = СоздатьОбъект("ТаблицаЗначений");
	Таб.НоваяСтрока();
	Таб.Number = Number1;
	Таб.NameRus = NameRus;
	Таб.NameEng = NameEng;
	Таб.IsReadable = IsReadable;
	Таб.IsWritable = IsWritable;
КонецПроцедуры

// проверка идет без учета базовых методов и свойств, т.е. в обратную сторону, от конца к началу
//
//Процедура СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(ЮнитТест, ТипОбъектаИлиСамОбъект, КоличествоМетодовСКонца, КоличествоСвойствСКонца) Экспорт
Процедура СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(ЮнитТест, ТипОбъектаИлиСамОбъект, табМетодовИсходная, ТабСвойствИсходная) Экспорт
	Сам = Сам();

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

	Сам.ПолучитьДанныеОТипе(ТипОбъектаИлиСамОбъект, табМетодов, ТабСвойств);

	КоличествоМетодовСКонца = табМетодовИсходная.КоличествоСтрок();
	КоличествоСвойствСКонца = ТабСвойствИсходная.КоличествоСтрок();
	
	ЮнитТест.ПроверитьБольшеИлиРавно(табМетодов.КоличествоСтрок(), КоличествоМетодовСКонца);
	ЮнитТест.ПроверитьБольшеИлиРавно(ТабСвойств.КоличествоСтрок(), КоличествоСвойствСКонца);

	табМетодов2 = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств2 = СоздатьОбъект("ТаблицаЗначений");
	табМетодов.Выгрузить(табМетодов2, табМетодов.КоличествоСтрок()-КоличествоМетодовСКонца+1, табМетодов.КоличествоСтрок());
	ТабСвойств.Выгрузить(ТабСвойств2, ТабСвойств.КоличествоСтрок()-КоличествоСвойствСКонца+1, ТабСвойств.КоличествоСтрок());
	
	// теперь нужно выровнять номера строк в полученных таблицах свойств и методов
	табМетодов2.ВыбратьСтроки();
	Пока табМетодов2.ПолучитьСтроку() = 1 Цикл
		н = табМетодов2.НомерСтроки;
		табМетодов2.УстановитьЗначение(н, "Number", н-1);
	КонецЦикла;
	
	ТабСвойств2.ВыбратьСтроки();
	Пока ТабСвойств2.ПолучитьСтроку() = 1 Цикл
		н = ТабСвойств2.НомерСтроки;
		ТабСвойств2.УстановитьЗначение(н, "Number", н-1);
	КонецЦикла;

	ЮнитТест.ПроверитьРавенство(табМетодов2.КоличествоСтрок(), КоличествоМетодовСКонца);
	ЮнитТест.ПроверитьРавенство(ТабСвойств2.КоличествоСтрок(), КоличествоСвойствСКонца);

	стрКолонкиМетоды = "Number,NameEng,NameRus,HasRetVal,NParams";
	стрКолонкиСвойства = "Number,NameEng,NameRus,IsReadable,IsWritable";
                     
////Если ТипЗначенияСтр(ТипОбъектаИлиСамОбъект) = "ВыполняемыйМодуль" Тогда
////Если ТипЗначенияСтр(ТипОбъектаИлиСамОбъект) = "ГрупповойКонтекст" Тогда
//ТабСвойствИсходная.ВыбратьСтроку("");
//ТабСвойств2.ВыбратьСтроку("");
//ТабСвойств2.ВыбратьСтроку("");
////КонецЕсли;

	ЮнитТест.ПроверитьРавенствоТаблиц(ТабСвойствИсходная, ТабСвойств2, стрКолонкиСвойства, стрКолонкиСвойства);

////Если ТипЗначенияСтр(ТипОбъектаИлиСамОбъект) = "ВыполняемыйМодуль" Тогда
////Если ТипЗначенияСтр(ТипОбъектаИлиСамОбъект) = "ГрупповойКонтекст" Тогда
//табМетодовИсходная.ВыбратьСтроку("");	
//табМетодов.ВыбратьСтроку("");	
//табМетодов2.ВыбратьСтроку("");	
////КонецЕсли;

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

// TODO добавить метод для проверки свойств и методов всех классов, 
// чьи образы есть в папке сохраненных образов