diff --git "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index de4b485..5dbc611 100644 --- "a/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/features/core/step_definitions/\320\237\320\265\321\200\320\265\320\264\320\260\321\207\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -11,6 +11,8 @@ ВсеШаги.Добавить("ЯПередаюПараметр"); ВсеШаги.Добавить("ЯПолучаюПараметрСТипом"); ВсеШаги.Добавить("ЯИспользуюСтроку_В_Которой_Есть_Минус"); + ВсеШаги.Добавить("КоличествоСтрокУПараметраРавно"); + ВсеШаги.Добавить("СтрокаУПараметраРавна"); Возврат ВсеШаги; КонецФункции @@ -34,6 +36,20 @@ ДобавитьВЖурнал("ЯИспользуюСтроку_в_которой_есть_минус"); КонецПроцедуры +//количество строк у параметра равно 2 +Процедура КоличествоСтрокУПараметраРавно(ЧислоСтрок) Экспорт + Ожидаем.Что(СтрЧислоСтрок(ИсходныйПараметр), "СтрЧислоСтрок(ИсходныйПараметр)").Равно(ЧислоСтрок); +КонецПроцедуры + +//1 строка у параметра равна "первая строка" +Процедура СтрокаУПараметраРавна(СтрокаПоНомеру, НомерСтроки) Экспорт + ОжидаемаяСтрока = "первая строка"; + Если НомерСтроки = 2 Тогда + ОжидаемаяСтрока = "вторая строка"; + КонецЕсли; + Ожидаем.Что(СтрПолучитьСтроку(ИсходныйПараметр, НомерСтроки), "СтрПолучитьСтроку(ИсходныйПараметр, НомерСтроки)").Равно(ОжидаемаяСтрока); +КонецПроцедуры + Процедура ДобавитьВЖурнал(Строка, Параметр = "", Параметр2 = "") Экспорт Журнал.Вставить(КлючЖурнала, Журнал[КлючЖурнала]+Строка+";"); @@ -41,6 +57,7 @@ ПредставлениеПараметра(Параметр), ПредставлениеПараметра(Параметр2)); КонецПроцедуры + Функция ПредставлениеПараметра(Параметр) Возврат ?(ПустаяСтрока(Параметр), "", "<"+Параметр+">"); КонецФункции diff --git "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" index 74fa8bb..a5a2370 100644 --- "a/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" +++ "b/features/core/step_definitions/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270.os" @@ -6,8 +6,8 @@ // TODO следующие экспорты нужны для работы соседних скриптов/шагов до появления повторно используемых шагов Перем ВременныйКаталогФичи Экспорт; -Перем ФайлИсходнойФичи Экспорт; -Перем ФайлФичи Экспорт; +Перем ФайлИсходнойФичи; +Перем ФайлФичи; Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт БДД = КонтекстФреймворкаBDD; diff --git a/src/gherkin-read.os b/src/gherkin-read.os index 18ed563..016f4f1 100644 --- a/src/gherkin-read.os +++ b/src/gherkin-read.os @@ -128,7 +128,7 @@ ПредыдущиеПараметрыЛексемы = Неопределено; Пока Истина Цикл - ОчереднаяСтрока = ПолучитьОчереднуюСтрокуСценария(Фича); + ОчереднаяСтрока = ПолучитьОчереднуюСтрокуФичи(Фича); Если ОчереднаяСтрока = Неопределено Тогда Прервать; КонецЕсли; @@ -184,6 +184,7 @@ СтрокаДляПоиска = НРег(Строка); Для каждого КлючЗначение Из СоответствиеКлючевыеСлова Цикл Лексема = КлючЗначение.Ключ; + КлючевоеСлово = КлючЗначение.Значение; Позиция = Найти(СтрокаДляПоиска, Лексема); Если Позиция = 1 Тогда ДлинаЛексемы = СтрДлина(Лексема); @@ -195,10 +196,17 @@ КонецЕсли; ПраваяЧасть = СокрЛП(Сред(Строка, ДлинаЛексемы + 1)); - Рез = Новый Структура; - Рез.Вставить("Лексема", КлючЗначение.Значение); + ДалееБудутДополнительныеПараметры = Ложь; + Если Прав(ПраваяЧасть, 1) = ":" Тогда + ДалееБудутДополнительныеПараметры = Истина; + ПраваяЧасть = Лев(ПраваяЧасть, СтрДлина(ПраваяЧасть) - 1); + КонецЕсли; + Рез = Новый Структура; + Рез.Вставить("Лексема", КлючевоеСлово); Рез.Вставить("ПраваяЧасть", ПраваяЧасть); + Рез.Вставить("ДалееБудутДополнительныеПараметры", ДалееБудутДополнительныеПараметры); + лог.Отладка("Нашел лексему <"+Рез.Лексема+">, правая часть <"+ПраваяЧасть+">"); Возврат Рез; КонецЕсли; @@ -206,7 +214,7 @@ Возврат Неопределено; КонецФункции -Функция ПолучитьОчереднуюСтрокуСценария(Знач Фича) +Функция ПолучитьОчереднуюСтрокуФичи(Знач Фича) Рез = ""; Пока Истина Цикл ОчереднаяСтрока = Фича.ПрочитатьСтроку(); @@ -240,13 +248,13 @@ УровеньЛексемы = УровниЛексем[ОчереднаяЛексема]; Лог.Отладка("Получил Очередная лексема <"+ОчереднаяЛексема+">, Индекс "+Индекс+", уровень <"+УровеньЛексемы+">, тело <"+ПараметрыОчереднойЛексемы.ПраваяЧасть+">"); - ПараметрыИзСтроки = Новый Массив; - НоваяПраваяЧасть = ИзвлечьПараметры(ПараметрыОчереднойЛексемы.ПраваяЧасть, ПараметрыИзСтроки); + НайденныеПараметры = Новый Массив; + НоваяПраваяЧасть = ИзвлечьПараметры(ПараметрыОчереднойЛексемы.ПраваяЧасть, ПараметрыОчереднойЛексемы.ДалееБудутДополнительныеПараметры, НайденныеПараметры); Лог.Отладка("НоваяПраваяЧасть "+НоваяПраваяЧасть); НоваяСтрока = ЗаполнитьУзелДереваФич(СтрокиДерева, ОчереднаяЛексема, ПараметрыОчереднойЛексемы.ПраваяЧасть); //НоваяПраваяЧасть); Лог.Отладка("НоваяСтрока.Лексема <"+НоваяСтрока.Лексема+">"); - НоваяСтрока.Параметры = ПараметрыИзСтроки; + НоваяСтрока.Параметры = НайденныеПараметры; НоваяСтрока.ТипШага = НайтиТипШагаПоЛексеме(ОчереднаяЛексема); НоваяСтрока.АдресШага = СформироватьАдресШага(НоваяПраваяЧасть); @@ -280,16 +288,20 @@ Возврат НоваяСтрока; КонецФункции -Функция ИзвлечьПараметры(Знач Тело, ПараметрыИзСтроки) +Функция ИзвлечьПараметры(Знач Тело, Знач ДалееБудутДополнительныеПараметры, НайденныеПараметры) НовоеТело = Тело; - НовоеТело = ВыделитьСтроковыеПараметры(НовоеТело, ПараметрыИзСтроки, "'"); - НовоеТело = ВыделитьСтроковыеПараметры(НовоеТело, ПараметрыИзСтроки, """"); + Если ДалееБудутДополнительныеПараметры Тогда + НовоеТело = ВыделитьПараметрыИзМногострочногоТекста(НовоеТело, НайденныеПараметры); + КонецЕсли; + + НовоеТело = ВыделитьСтроковыеПараметры(НовоеТело, НайденныеПараметры, "'"); + НовоеТело = ВыделитьСтроковыеПараметры(НовоеТело, НайденныеПараметры, """"); //Лог.Отладка("НовоеТело (после обработки строк) <"+ НовоеТело+">"); - НовоеТело = ВыделитьПараметрыДата(НовоеТело, ПараметрыИзСтроки); + НовоеТело = ВыделитьПараметрыДата(НовоеТело, НайденныеПараметры); - НовоеТело = ВыделитьЧисловыеПараметры(НовоеТело, ПараметрыИзСтроки); + НовоеТело = ВыделитьЧисловыеПараметры(НовоеТело, НайденныеПараметры); Возврат НовоеТело; КонецФункции @@ -330,6 +342,31 @@ Возврат НоваяСтрока; КонецФункции +Функция ВыделитьПараметрыИзМногострочногоТекста(Знач Тело, Параметры) + РегулярноеВыражение = РегулярныеВыражения.МногострочныйТекст; + КоллекцияГруппСовпадений = РегулярноеВыражение.НайтиСовпадения(Тело); + Если КоллекцияГруппСовпадений.Количество() = 0 Тогда + Возврат Тело; + КонецЕсли; + + НовоеТело = Тело; + + Группа = КоллекцияГруппСовпадений[0]; + + ЗначениеПараметра = Группа.Группы[1].Значение; + Если Прав(ЗначениеПараметра, 1) = Символы.ПС Тогда + ЗначениеПараметра = Сред(ЗначениеПараметра, 1, СтрДлина(ЗначениеПараметра) - 1); + КонецЕсли; + + ОписаниеПараметра = ВозможныеКлючиПараметров.Строка; + ДобавитьПараметр(Параметры, ВозможныеКлючиПараметров.Строка, ЗначениеПараметра); + + Начало = Группа.Индекс; + //Окончание = Группа.Индекс + Группа.Длина; + НовоеТело = СтрШаблон("%1 %2", СтрПолучитьСтроку(Лев(НовоеТело, Начало), 1), ОписаниеПараметра); + Возврат НовоеТело; +КонецФункции // ВыделитьПараметрыИзМногострочногоТекста(НовоеТело, НайденныеПараметры) + Функция ВыделитьЧисловыеПараметры(Знач Тело, Параметры) РегулярноеВыражение = РегулярныеВыражения.ЧислоИлиСловоСЧислом; КоллекцияГруппСовпадений = РегулярноеВыражение.НайтиСовпадения(Тело); @@ -582,6 +619,7 @@ Рез.Вставить("НеЧисло", Новый РегулярноеВыражение("[^\d]+")); Рез.Вставить("Дата", Новый РегулярноеВыражение("(\d{2}).(\d{2}).(\d{2,4})")); Рез.Вставить("ЧислоИлиСловоСЧислом", Новый РегулярноеВыражение("([а-яё\w]*\d+[а-яё\w]*)|(-?\d+(,\d)*)+")); //Когда я использую 5 как 5число5 + Рез.Вставить("МногострочныйТекст", Новый РегулярноеВыражение("^\s*""""""\n\r*((.+\n\r*)+)^\s*""""""")); //РегулярноеВыражение = Новый РегулярноеВыражение("(-?\d+(,\d)*)+"); //РегулярноеВыражение = Новый РегулярноеВыражение("([а-яё\w]*\d+[а-яё\w]*)|(-?\d+(,\d)*)+"); //Когда я использую 5 как 5число5 //РегулярноеВыражение = Новый РегулярноеВыражение("(-{1}\d+)+"); diff --git a/tests/steps-generate-tests.os b/tests/steps-generate-tests.os index be68e93..9881e6a 100644 --- a/tests/steps-generate-tests.os +++ b/tests/steps-generate-tests.os @@ -19,6 +19,7 @@ Перем Лог; Перем ГенераторШагов; Перем ИсполнительБДД; +Перем ЧитательГеркин; Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт @@ -141,6 +142,10 @@ ДопЛог = Логирование.ПолучитьЛог(ИсполнительБДД.ИмяЛога()); ДопЛог.УстановитьУровень(НовыйУровеньЛога); + + ДопЛог = Логирование.ПолучитьЛог(ЧитательГеркин.ИмяЛога()); + ДопЛог.УстановитьУровень(НовыйУровеньЛога); + КонецПроцедуры //////////////////////////////////////////////////////////////////// @@ -150,6 +155,8 @@ Лог = Логирование.ПолучитьЛог("oscript.app.bdd-gen-tests"); Лог.УстановитьУровень(УровниЛога.Отладка); + ЧитательГеркин = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/gherkin-read.os")); + ГенераторШагов = ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "../src/bdd-generate.os")); Контекст = Новый Структура("Контекст", Новый Структура("Журнал", Новый Структура));