diff --git a/features/step_definitions/precommitonec_feature.os b/features/step_definitions/precommitonec_feature.os index bba34a7..e2bda79 100644 --- a/features/step_definitions/precommitonec_feature.os +++ b/features/step_definitions/precommitonec_feature.os @@ -17,6 +17,7 @@ ВсеШаги.Добавить("ВКаталогеРепозиторияЕстьФайл"); ВсеШаги.Добавить("ЯКопируюФайлВКаталогРепозитория"); ВсеШаги.Добавить("ЯФиксируюИзмененияВРепозиторииСКомментарием"); + ВсеШаги.Добавить("ЯУстанавливаюКодировкуВыводаКоманды"); Возврат ВсеШаги; КонецФункции @@ -102,4 +103,15 @@ РепозиторийGit.Закоммитить(ТекстКомментария, ИСТИНА); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +// я устанавливаю кодировку вывода "Кодировка" команды "ИмяКоманды" +Процедура ЯУстанавливаюКодировкуВыводаКоманды(Кодировка, ИмяКоманды) Экспорт + КлючКонтекста = КлючКоманды(ИмяКоманды); + Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста); + Команда.УстановитьКодировкуВывода(Кодировка); +КонецПроцедуры + +Функция КлючКоманды(Знач ИмяКоманды) + Возврат "Команда-" + ИмяКоманды; +КонецФункции diff --git a/features/ВыполнениеПрекоммита.feature b/features/ВыполнениеПрекоммита.feature index 2e8a036..ceb5f1c 100644 --- a/features/ВыполнениеПрекоммита.feature +++ b/features/ВыполнениеПрекоммита.feature @@ -10,33 +10,51 @@ И я включаю отладку лога с именем "oscript.app.precommit4onec" И я создаю временный каталог и запоминаю его как "КаталогРепозиториев" И я переключаюсь во временный каталог "КаталогРепозиториев" - И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий1" - И я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1" + И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "РабочийКаталог" + И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1" -Сценарий: Фиксация изменений - Когда Я копирую файл "features/demo/DemoОбработка.epf" в каталог репозитория "Репозиторий1" - И я копирую файл "features/demo/DemoОтчет.erf" в каталог репозитория "Репозиторий1" - И я копирую файл "features/demo/DemoРасширение.cfe" в каталог репозитория "Репозиторий1" - И я фиксирую изменения в репозитории "Репозиторий1" с комментарием "demo коммит" - Тогда В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\Module.bsl" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\form" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных\Ext\Template.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form.bin" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ\Ext\Form.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form.bin" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ\Ext\Form.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl" - И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\form" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\ConfigDumpInfo.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Configuration.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo\Ext\Module.bsl" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Subsystems\DemoРасш_Demo.xml" - И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Languages\Русский.xml" +Сценарий: Разбор отчетов, обработок, конфигурации на исходники. + Когда Я копирую файл "fixtures/demo/DemoОбработка.epf" в каталог репозитория "РабочийКаталог" + И я копирую файл "fixtures/demo/DemoОтчет.erf" в каталог репозитория "РабочийКаталог" + И я копирую файл "fixtures/demo/DemoРасширение.cfe" в каталог репозитория "РабочийКаталог" + И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит" + Тогда В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\Module.bsl" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\form" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных\Ext\Template.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form.bin" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ\Ext\Form.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form.bin" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ\Ext\Form.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\form" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\ConfigDumpInfo.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Configuration.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo\Ext\Module.bsl" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Subsystems\DemoРасш_Demo.xml" + И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Languages\Русский.xml" + +Сценарий: Успешный коммит в репозиторий + Когда Я копирую файл "fixtures\ПроверкаДублейПроцедурПоложительныйТест.bsl" в каталог репозитория "РабочийКаталог" + И Я очищаю параметры команды "git" в контексте + И Я установил рабочий каталог как текущий каталог + И Я устанавливаю кодировку вывода "utf-8" команды "git" + И Я выполняю команду "git" с параметрами "add --all" + И Я выполняю команду "git" с параметрами "commit -m addProcedure" + Тогда Вывод команды "git" не содержит "обнаружены неуникальные имена методов" + +Сценарий: Прекоммит заблокировал коммит в репозиторий + Когда Я копирую файл "fixtures\ПроверкаДублейПроцедурНегативныйТест.bsl" в каталог репозитория "РабочийКаталог" + И Я очищаю параметры команды "git" в контексте + И Я установил рабочий каталог как текущий каталог + И Я устанавливаю кодировку вывода "utf-8" команды "git" + И Я выполняю команду "git" с параметрами "add --all" + И Я выполняю команду "git" с параметрами "commit -m addProcedure" + Тогда Вывод команды "git" содержит "обнаружены неуникальные имена методов" diff --git a/features/Конфигурирование.feature b/features/Конфигурирование.feature index f024ab8..9a7dc51 100644 --- a/features/Конфигурирование.feature +++ b/features/Конфигурирование.feature @@ -7,7 +7,7 @@ Чтобы автоматически выполнять обработку исходников перед фиксацией изменений в репозитории Сценарий: Печать текущих настроек precommit4onec - Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global" Тогда Код возврата команды "oscript" равен 0 И Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2" @@ -17,9 +17,9 @@ И Вывод команды "oscript" содержит "ГлобальныеСценарии =" Сценарий: Сброс настроек к значениям по умолчанию - Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global -reset" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global -reset" Тогда Код возврата команды "oscript" равен 0 - И Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os configure -global" + И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global" И Код возврата команды "oscript" равен 0 И Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит @@ -28,5 +28,5 @@ Установленные настройки: ИспользоватьСценарииРепозитория = Нет КаталогЛокальныхСценариев = - ГлобальныеСценарии = КорректировкаXMLФорм.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os + ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ЗапретИспользованияПерейти.os,КорректировкаXMLФорм.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиОбластей.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os """ diff --git a/features/ПростыеКоманды.feature b/features/ПростыеКоманды.feature index d1c5508..8cf8e18 100644 --- a/features/ПростыеКоманды.feature +++ b/features/ПростыеКоманды.feature @@ -12,14 +12,14 @@ # И я включаю отладку лога с именем "bdd" Сценарий: Получение версии продукта - Когда Я выполняю команду "oscript" c параметрами "src/main.os version" + Когда Я выполняю команду "oscript" с параметрами "src/main.os version" Тогда Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит "1.0.12.2" И Вывод команды "oscript" не содержит "precommit4onec v" И Код возврата команды "oscript" равен 0 Сценарий: Получение помощи продукта - Когда Я выполняю команду "oscript" c параметрами "src/main.os help" + Когда Я выполняю команду "oscript" с параметрами "src/main.os help" Тогда Вывод команды "oscript" содержит """ precommit4onec v1.0.12.2 @@ -33,7 +33,7 @@ И Код возврата команды "oscript" равен 0 Сценарий: Вызов исполняемого файла без параметров - Когда Я выполняю команду "oscript" c параметрами "src/main.os" + Когда Я выполняю команду "oscript" с параметрами "src/main.os" Тогда Вывод команды "oscript" содержит """ precommit4onec v1.0.12.2 diff --git a/features/УстановкаПрекоммита.feature b/features/УстановкаПрекоммита.feature index 972df84..f2bd78c 100644 --- a/features/УстановкаПрекоммита.feature +++ b/features/УстановкаПрекоммита.feature @@ -15,7 +15,7 @@ И я создаю новый репозиторий "rep2" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий2" Сценарий: Установка precommit4onec в репозиторий - Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1" Тогда Код возврата команды "oscript" равен 0 И Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2" @@ -23,14 +23,16 @@ И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit" Сценарий: precommit4onec не устанавливается в пустой каталог - Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./" - Тогда Код возврата команды "oscript" равен 0 + Когда я создаю временный каталог и запоминаю его как "ПустойКаталог" + И я переключаюсь во временный каталог "ПустойКаталог" + И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./" + Тогда Код возврата команды "oscript" равен 1 И Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2" - И Вывод команды "oscript" содержит "не является репозиторием git" + И Вывод команды "oscript" содержит "can only be used inside a git repository" Сценарий: Установка precommit4onec во вложенные каталоги - Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./ -r" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./ -r" Тогда Код возврата команды "oscript" равен 0 И Я сообщаю вывод команды "oscript" И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2" diff --git a/features/demo/DemoОбработка.epf b/fixtures/demo/DemoОбработка.epf similarity index 100% rename from features/demo/DemoОбработка.epf rename to fixtures/demo/DemoОбработка.epf diff --git a/features/demo/DemoОтчет.erf b/fixtures/demo/DemoОтчет.erf similarity index 100% rename from features/demo/DemoОтчет.erf rename to fixtures/demo/DemoОтчет.erf diff --git a/features/demo/DemoРасширение.cfe b/fixtures/demo/DemoРасширение.cfe similarity index 100% rename from features/demo/DemoРасширение.cfe rename to fixtures/demo/DemoРасширение.cfe diff --git a/fixtures/ПроверкаДублейПроцедурНегативныйТест.bsl b/fixtures/ПроверкаДублейПроцедурНегативныйТест.bsl new file mode 100644 index 0000000..439b981 --- /dev/null +++ b/fixtures/ПроверкаДублейПроцедурНегативныйТест.bsl @@ -0,0 +1,34 @@ +Процедура Проц() Экспорт +КонецПроцедуры + +//ПРоцедура Проц() +Функция Проц() Экспорт +КонецПроцедуры // Процедура проц() + +Процедура УпроститьLevel() Экспорт +КонецПроцедуры + +Процедура level_Forma1t() Экспорт +КонецПроцедуры + +Процедура Проц1_() Экспорт +КонецПроцедуры + +Процедура _Проц12() Экспорт +КонецПроцедуры + + пРоцедура проц2 (парам1) +КонецПроцедуры; + + Функция функё1() Экспорт +КонецФункции + +Процедура ПРоц3() +КонецПроцедуры + +Функция Функ1() +КонецФункции + +Функция _Функ1() +КонецФункции + diff --git a/fixtures/ПроверкаДублейПроцедурПоложительныйТест.bsl b/fixtures/ПроверкаДублейПроцедурПоложительныйТест.bsl new file mode 100644 index 0000000..307c726 --- /dev/null +++ b/fixtures/ПроверкаДублейПроцедурПоложительныйТест.bsl @@ -0,0 +1,30 @@ +Процедура Проц() Экспорт +КонецПроцедуры + +Процедура УпроститьLevel() Экспорт +КонецПроцедуры + +Процедура level_Forma1t() Экспорт +КонецПроцедуры + +Процедура Проц1_() Экспорт +КонецПроцедуры + +Процедура _Проц12() Экспорт +КонецПроцедуры + + пРоцедура проц2 (парам1) +КонецПроцедуры; + + Функция функё1() Экспорт +КонецФункции + +Процедура ПРоц3() +КонецПроцедуры + +Функция Функ1() +КонецФункции + +Функция _Функ1() +КонецФункции + diff --git a/packagedef b/packagedef index 0bb2942..1a36190 100644 --- a/packagedef +++ b/packagedef @@ -1,4 +1,4 @@ -ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); +ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров); ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта()); @@ -6,14 +6,12 @@ Описание.Имя(ИмяПродукта) .ВерсияСреды("1.0.17") .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта()) - .ЗависитОт("logos", "0.5") - .ЗависитОт("cmdline", "0.4.1") - .ЗависитОт("1bdd", "1.5.2") - .ЗависитОт("gitrunner", "1.4.0") - .ЗависитОт("v8runner", "0.4.1") - .ЗависитОт("v8unpack", "1.0.1") + .ЗависитОт("logos", "1.2.0") + .ЗависитОт("cmdline", "1.0.0") + .ЗависитОт("1bdd", "1.9.0") + .ЗависитОт("gitrunner", "1.6.0") + .ЗависитОт("v8runner", "1.3.0") + .ЗависитОт("v8unpack", "1.0.3") .ВключитьФайл("src") - .ВключитьФайл("features") - .ВключитьФайл("tasks") .ВключитьФайл("v8config.json") .ИсполняемыйФайл("src/main.os", ИмяПродукта); diff --git a/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os b/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os new file mode 100644 index 0000000..755a6f3 --- /dev/null +++ b/src/СценарииОбработки/ПроверкаДублейПроцедурИФункций.os @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией сценариев обработки файлов <ИмяСценария> +// +/////////////////////////////////////////////////////////////////////////////// +Перем Лог; + +// ИмяСценария +// Возвращает имя сценария обработки файлов +// +// Возвращаемое значение: +// Строка - Имя текущего сценария обработки файлов +// +Функция ИмяСценария() Экспорт + + Возврат "ПроверкаДублейПроцедурИФункций"; + +КонецФункции // ИмяСценария() + +// ОбработатьФайл +// Выполняет обработку файла +// +// Параметры: +// АнализируемыйФайл - Файл - Файл из журнала git для анализа +// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория +// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать +// * Лог - Объект - Текущий лог +// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс +// * КаталогРепозитория - Строка - Адрес каталога репозитория +// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария +// и которые необходимо дообработать +// +// Возвращаемое значение: +// Булево - Признак выполненной обработки файла +// +Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт + + Лог = ДополнительныеПараметры.Лог; + НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария()); + + Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда + + Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); + + ПроверитьНаДублированиеМетодов(АнализируемыйФайл.ПолноеИмя); + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции // ОбработатьФайл() + +// ПроверитьНаДублированиеМетодов +// Выполняет поиск дублей имен процедур и функций файла +// +// Параметры: +// ПутьКФайлуМодуля - Строка - Путь до файла +// +Процедура ПроверитьНаДублированиеМетодов(ПутьКФайлуМодуля) + + Текст = Новый ЧтениеТекста(); + Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM); + + ТекстМодуля = Текст.Прочитать(); + Текст.Закрыть(); + + ТекстОшибки = ""; + + ШаблонПоиска = Новый РегулярноеВыражение("^\s*(?:Процедура|Функция|procedure|function)\s+?([а-яА-ЯёЁ0-9_\w]+?)\s*?\(\)"); + ШаблонПоиска.Многострочный = Истина; + ШаблонПоиска.ИгнорироватьРегистр = Истина; + + Если НЕ ПустаяСтрока(ТекстМодуля) Тогда + + Совпадения = ШаблонПоиска.НайтиСовпадения(ТекстМодуля); + + Если Совпадения.Количество() Тогда + + ТЗПроцедуры = Новый ТаблицаЗначений; + ТЗПроцедуры.Колонки.Добавить("ИмяПроцедуры"); + ТЗПроцедуры.Колонки.Добавить("Количество"); + + Для Каждого Совпадение Из Совпадения Цикл + + СтрокаТЗ = ТЗПроцедуры.Добавить(); + СтрокаТЗ.ИмяПроцедуры = НРЕГ(Совпадение.Группы[1].Значение); + СтрокаТЗ.Количество = 1; + + КонецЦикла; + + КоличествоПроцедур = ТЗПроцедуры.Количество(); + ТЗПроцедуры.Свернуть("ИмяПроцедуры", "Количество"); + КоличествоУникальных = ТЗПроцедуры.Количество(); + + Если КоличествоПроцедур <> КоличествоУникальных Тогда + + ТекстОшибки = СтрШаблон("В файле '%1' обнаружены неуникальные имена методов " + Символы.ПС, ПутьКФайлуМодуля); + + Для Каждого СтрокаТЗ Из ТЗПроцедуры Цикл + + ТекстОшибки = ТекстОшибки + ?(СтрокаТЗ.Количество > 1, СтрокаТЗ.ИмяПроцедуры + Символы.ПС, ""); + + КонецЦикла; + + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры // ПроверитьНаДублированиеМетодов() diff --git a/tests/ПроверкаСцераниевОбработки.os b/tests/ПроверкаСцераниевОбработки.os new file mode 100644 index 0000000..bdee8c5 --- /dev/null +++ b/tests/ПроверкаСцераниевОбработки.os @@ -0,0 +1,127 @@ +#Использовать asserts +#Использовать logos +#Использовать tempfiles + +Перем юТест; +Перем Лог; +Перем МенеджерВременныхФайлов; + +// Основная точка входа +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНеИсходник"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт + + ВремТестер = Новый Тестер; + Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога()); + + ВключитьПоказОтладки(); + + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов; + +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + + МенеджерВременныхФайлов.Удалить(); + МенеджерВременныхФайлов = Неопределено; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение() Экспорт + + ОбъектСценария = ПолучитьСценарийОбработкиПроверкаДублейПроцедурИФункций(); + Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурНегативныйТест.bsl")); + + ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "обнаружены неуникальные имена методов"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл() Экспорт + + Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурПоложительныйТест.bsl")); + ОбъектСценария = ПолучитьСценарийОбработкиПроверкаДублейПроцедурИФункций(); + Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки()); + + Ожидаем.Что(Результат, Истина).ЭтоИстина(); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл() Экспорт + + Файл = Новый Файл(ПолучитьИмяВременногоФайла("bsl")); + ОбъектСценария = ПолучитьСценарийОбработкиПроверкаДублейПроцедурИФункций(); + Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки()); + + Ожидаем.Что(Результат, Истина).ЭтоЛожь(); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНеИсходник() Экспорт + + Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("xml")); + ОбъектСценария = ПолучитьСценарийОбработкиПроверкаДублейПроцедурИФункций(); + Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки()); + + Ожидаем.Что(Результат, Истина).ЭтоЛожь(); + +КонецПроцедуры + +Процедура ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, ТекстИсключения) + + ДополнительныеНастройки = ПолучитьДополнительныеНастройки(); + ПараметрыМетода = Новый Массив; + + ПараметрыМетода.Добавить(Файл); + ПараметрыМетода.Добавить(Файл.Путь); + ПараметрыМетода.Добавить(ДополнительныеНастройки); + + Ожидаем.Что(ОбъектСценария).Метод("ОбработатьФайл", ПараметрыМетода).ВыбрасываетИсключение(ТекстИсключения); + +КонецПроцедуры + +Функция ПолучитьСценарийОбработкиПроверкаДублейПроцедурИФункций() + + Сценарий = ОбъединитьПути(КаталогИсходников(), "src", "СценарииОбработки", "ПроверкаДублейПроцедурИФункций.os"); + ОбъектСценария = ЗагрузитьСценарий(Сценарий); + + Возврат ОбъектСценария; + +КонецФункции + +Процедура ВключитьПоказОтладки() + Лог.УстановитьУровень(УровниЛога.Отладка); +КонецПроцедуры + +Процедура ВыключитьПоказОтладки() + Лог.УстановитьУровень(УровниЛога.Информация); +КонецПроцедуры + +Функция КаталогТестовыхФикстур() + Возврат ОбъединитьПути(КаталогИсходников(), "fixtures"); +КонецФункции + +Функция КаталогИсходников() + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, ".."); +КонецФункции + +Функция ПолучитьДополнительныеНастройки() + + УправлениеНастройками = Новый НастройкиРепозитория(ТекущийКаталог()); + ДополнительныеНастройки = Новый Структура("Лог, УправлениеНастройками", Лог, УправлениеНастройками); + + Возврат ДополнительныеНастройки; + +КонецФункции diff --git a/v8config.json b/v8config.json index 80b6bcf..3d15b2d 100644 --- a/v8config.json +++ b/v8config.json @@ -6,6 +6,7 @@ "ДобавлениеПробеловПередКлючевымиСловами.os", "ЗапретИспользованияПерейти.os", "КорректировкаXMLФорм.os", + "ПроверкаДублейПроцедурИФункций.os", "ПроверкаКорректностиОбластей.os", "РазборОбычныхФормНаИсходники.os", "РазборОтчетовОбработокРасширений.os",