/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
tests/goto.os
208 строк
8 KB
Diversus23
fix #1468 #6 #1329: Реализация оператора Перейти / Goto в компиляторе стековой машины
08 апр 2026, 14:00
08 апр 2026, 14:00
82af84a
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////// // // Тест оператора Перейти (Goto) // /////////////////////////////////////////////////////////////////////// Перем юТест; //////////////////////////////////////////////////////////////////// // Программный интерфейс Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт юТест = ЮнитТестирование; ВсеТесты = Новый Массив; ВсеТесты.Добавить("ТестДолжен_ПроверитьПереходВперед"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПереходНазад"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВыходИзВложенныхЦиклов"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВыходИзУсловия"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВыходИзПопытки"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПереходВПроцедуре"); ВсеТесты.Добавить("ТестДолжен_ПроверитьНесколькоМетокВМодуле"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПереходВФункции"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЭмуляциюЦиклаЧерезGoto"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЭмуляциюRepeatUntil"); Возврат ВсеТесты; КонецФункции Процедура ТестДолжен_ПроверитьПереходВперед() Экспорт А = 1; Перейти ~Метка; А = 999; ~Метка: юТест.ПроверитьРавенство(А, 1, "Переход вперед: код между goto и меткой не должен выполняться"); КонецПроцедуры Процедура ТестДолжен_ПроверитьПереходНазад() Экспорт Счетчик = 0; ~Начало: Счетчик = Счетчик + 1; Если Счетчик < 5 Тогда Перейти ~Начало; КонецЕсли; юТест.ПроверитьРавенство(Счетчик, 5, "Переход назад: цикл через goto должен отработать 5 раз"); КонецПроцедуры Процедура ТестДолжен_ПроверитьВыходИзВложенныхЦиклов() Экспорт Результат = 0; Для Индекс1 = 1 По 10 Цикл Для Индекс2 = 1 По 10 Цикл Результат = Результат + 1; Если Индекс2 = 3 Тогда Перейти ~ВыходИзЦиклов; КонецЕсли; КонецЦикла; КонецЦикла; ~ВыходИзЦиклов: юТест.ПроверитьРавенство(Результат, 3, "Выход из вложенных циклов: должно быть 3 итерации внутреннего цикла"); КонецПроцедуры Процедура ТестДолжен_ПроверитьВыходИзУсловия() Экспорт А = 1; Б = 0; Если А = 1 Тогда Б = 10; Перейти ~ПослеУсловия; Б = 999; КонецЕсли; ~ПослеУсловия: юТест.ПроверитьРавенство(Б, 10, "Выход из условия: код после goto не должен выполняться"); КонецПроцедуры Процедура ТестДолжен_ПроверитьВыходИзПопытки() Экспорт А = 0; Попытка А = 1; Перейти ~ПослеПопытки; А = 999; Исключение А = -1; КонецПопытки; ~ПослеПопытки: юТест.ПроверитьРавенство(А, 1, "Выход из попытки: должно быть значение до goto"); КонецПроцедуры Процедура ТестДолжен_ПроверитьПереходВПроцедуре() Экспорт Результат = ВспомогательнаяПроцедураСGoto(); юТест.ПроверитьРавенство(Результат, 42, "Переход в процедуре: goto внутри функции"); КонецПроцедуры Функция ВспомогательнаяПроцедураСGoto() А = 42; Перейти ~Конец; А = 0; ~Конец: Возврат А; КонецФункции Процедура ТестДолжен_ПроверитьНесколькоМетокВМодуле() Экспорт А = 0; Б = 0; Перейти ~Первая; А = 999; ~Первая: А = 1; Перейти ~Вторая; Б = 999; ~Вторая: Б = 2; юТест.ПроверитьРавенство(А, 1, "Несколько меток: первая метка"); юТест.ПроверитьРавенство(Б, 2, "Несколько меток: вторая метка"); КонецПроцедуры Процедура ТестДолжен_ПроверитьПереходВФункции() Экспорт Результат = ФункцияСНесколькимиПереходами(3); юТест.ПроверитьРавенство(Результат, "три", "Переход в функции с несколькими метками"); Результат = ФункцияСНесколькимиПереходами(1); юТест.ПроверитьРавенство(Результат, "один", "Переход в функции с несколькими метками"); Результат = ФункцияСНесколькимиПереходами(99); юТест.ПроверитьРавенство(Результат, "другое", "Переход в функции с несколькими метками"); КонецПроцедуры Процедура ТестДолжен_ПроверитьЭмуляциюЦиклаЧерезGoto() Экспорт // Эмуляция цикла Для Сч = 1 По 10 через Goto Сумма = 0; Сч = 1; ~НачалоЦикла: Если Сч > 10 Тогда Перейти ~ВыходЦикла; КонецЕсли; Сумма = Сумма + Сч; Сч = Сч + 1; Перейти ~НачалоЦикла; ~ВыходЦикла: юТест.ПроверитьРавенство(Сумма, 55, "Эмуляция цикла: сумма чисел от 1 до 10 должна быть 55"); юТест.ПроверитьРавенство(Сч, 11, "Эмуляция цикла: счетчик должен быть 11 после выхода"); КонецПроцедуры Процедура ТестДолжен_ПроверитьЭмуляциюRepeatUntil() Экспорт // Эмуляция repeat...until: тело выполняется минимум 1 раз, // условие выхода проверяется в конце Сч = 0; Произведение = 1; ~ТелоЦикла: Сч = Сч + 1; Произведение = Произведение * Сч; // until Сч >= 5 Если Сч < 5 Тогда Перейти ~ТелоЦикла; КонецЕсли; // 1*2*3*4*5 = 120 юТест.ПроверитьРавенство(Произведение, 120, "Repeat/Until: факториал 5 должен быть 120"); юТест.ПроверитьРавенство(Сч, 5, "Repeat/Until: счетчик должен быть 5"); КонецПроцедуры Функция ФункцияСНесколькимиПереходами(Знач Номер) Если Номер = 1 Тогда Перейти ~Метка1; ИначеЕсли Номер = 3 Тогда Перейти ~Метка3; Иначе Перейти ~МеткаДругое; КонецЕсли; ~Метка1: Возврат "один"; ~Метка3: Возврат "три"; ~МеткаДругое: Возврат "другое"; КонецФункции