/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
tests/json/test-json_reader.os
379 строк
22 KB
Тимур Кашафутдинов
Исправил хеш-суммы тестов чтения json
19 май 2026, 23:42
19 май 2026, 23:42
23221a1
Код
Авторство
О чём код?
#Использовать asserts Перем юТест; Перем ТекстПроверки; Функция ПолучитьСписокТестов(Тестирование) Экспорт юТест = Тестирование; СписокТестов = Новый Массив; СписокТестов.Добавить("Тест_Должен_ПроверитьПолучениеВсехЭлементовПеречисленияТипЗначенияJSON"); СписокТестов.Добавить("Тест_Должен_СверитьСвойствоСДвойнымиКавычками"); СписокТестов.Добавить("Тест_Должен_ПроверитьПреобразованиеNullВНеопределено"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSON"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONВСтруктуру"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONМассива"); СписокТестов.Добавить("Тест_ДолженВызватьОшибку_ДляUndefined"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускЗначения"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускМассива"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускНезавершенногоМассива"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускМассиваСВложенными"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускОбъектаСВложениями"); СписокТестов.Добавить("Тест_Должен_ПроверитьОткрытиеПотока"); СписокТестов.Добавить("Тест_Должен_ПроверитьПовторноеОткрытиеПотока"); СписокТестов.Добавить("Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытияЧтения"); СписокТестов.Добавить("Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку"); СписокТестов.Добавить("Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку"); СписокТестов.Добавить("Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку"); СписокТестов.Добавить("Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку"); СписокТестов.Добавить("Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON"); Возврат СписокТестов; КонецФункции Процедура Тест_Должен_ПроверитьПолучениеВсехЭлементовПеречисленияТипЗначенияJSON() Экспорт юТест.ПроверитьРавенство("Null", Строка(ТипЗначенияJSON.Null)); юТест.ПроверитьРавенство("Комментарий", Строка(ТипЗначенияJSON.Комментарий)); юТест.ПроверитьРавенство("ИмяСвойства", Строка(ТипЗначенияJSON.ИмяСвойства)); юТест.ПроверитьРавенство("КонецМассива", Строка(ТипЗначенияJSON.КонецМассива)); юТест.ПроверитьРавенство("КонецОбъекта", Строка(ТипЗначенияJSON.КонецОбъекта)); юТест.ПроверитьРавенство("НачалоМассива", Строка(ТипЗначенияJSON.НачалоМассива)); юТест.ПроверитьРавенство("НачалоОбъекта", Строка(ТипЗначенияJSON.НачалоОбъекта)); юТест.ПроверитьРавенство("Ничего", Строка(ТипЗначенияJSON.Ничего)); юТест.ПроверитьРавенство("Строка", Строка(ТипЗначенияJSON.Строка)); юТест.ПроверитьРавенство("Число", Строка(ТипЗначенияJSON.Число)); КонецПроцедуры Процедура Тест_Должен_СверитьСвойствоСДвойнымиКавычками() Экспорт СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock_struct.json"); юТест.ПроверитьРавенство(СтруктураДанных.lastName, """Иванов"""); КонецПроцедуры Процедура Тест_Должен_ПроверитьПреобразованиеNullВНеопределено() Экспорт Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку("{""Null"": null}"); СтруктураДанных = ПрочитатьJSON(Чтение,Ложь); юТест.ПроверитьРавенство(ТипЗнч(СтруктураДанных.Null), Тип("Неопределено")); КонецПроцедуры Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSON() Экспорт СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock.json", Истина); юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 3868110149); КонецПроцедуры Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONВСтруктуру() Экспорт СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock_struct.json", Ложь); юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 856251251); КонецПроцедуры Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONМассива() Экспорт СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock_array.json", Истина); юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 3633637665); КонецПроцедуры Функция ЗначениеВСтроку(Значение, Уровень = 0) Текст = ""; Отступы = ""; Для Счетчик = 1 По Уровень Цикл Отступы = Отступы + Символы.Таб; КонецЦикла; Если ТипЗнч(Значение) = Тип("Массив") Тогда Для Каждого Элемент Из Значение Цикл Если ТипЗнч(Элемент) = Тип("Структура") ИЛИ ТипЗнч(Элемент) = Тип("Соответствие") ИЛИ ТипЗнч(Элемент) = Тип("Массив") Тогда Текст = Текст + ЗначениеВСтроку(Элемент, Уровень + 1); Иначе Текст = Текст + Отступы + ?(Элемент = Undefined, "Undefined", Элемент) + Символы.ПС; КонецЕсли; КонецЦикла; Иначе Для Каждого ТекСтрока Из Значение Цикл Если ТипЗнч(ТекСтрока.Значение) = Тип("Структура") ИЛИ ТипЗнч(ТекСтрока.Значение) = Тип("Соответствие") ИЛИ ТипЗнч(ТекСтрока.Значение) = Тип("Массив") Тогда Текст = Текст + Отступы + ТекСтрока.Ключ + ":" + Символы.ПС + ЗначениеВСтроку(ТекСтрока.Значение, Уровень + 1); Иначе Текст = Текст + Отступы + ТекСтрока.Ключ + ":" + ?(ТекСтрока.Значение = Undefined, "Undefined", ТекСтрока.Значение) + Символы.ПС; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Текст; КонецФункции Функция РассчитатьХешСумму(СтруктураДанных) Текст = ЗначениеВСтроку(СтруктураДанных); Хеширование = Новый ХешированиеДанных(ХешФункция.CRC32); Хеширование.Добавить(Текст); Возврат Хеширование.ХешСумма; КонецФункции Функция ПолучитьСтруктуруДанных(ПутьКФайлу, КакСоответствие = Ложь) Текст = Новый ТекстовыйДокумент(); Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8); Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(Текст.ПолучитьТекст()); Результат = ПрочитатьJSON(Чтение, КакСоответствие); Возврат Результат; КонецФункции Процедура Тест_ДолженВызватьОшибку_ДляUndefined() Экспорт Текст = "undefined"; Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(Текст); Попытка Результат = Чтение.Прочитать(); Исключение Возврат; КонецПопытки; ВызватьИсключение "Должно было быть выдано исключение, но его не было"; КонецПроцедуры Процедура Тест_Должен_ПроверитьПропускЗначения() Экспорт Текст = "1,2,3,4,5"; Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(Текст); Чтение.Прочитать(); Результат = Чтение.Пропустить(); юТест.ПроверитьРавенство(Истина, Результат); юТест.ПроверитьРавенство(ТипЗначенияJSON.Число, Чтение.ТипТекущегоЗначения); юТест.ПроверитьРавенство(2, Чтение.ТекущееЗначение); КонецПроцедуры Процедура Тест_Должен_ПроверитьПропускМассива() Экспорт Текст = "1,[2,3],4,5"; Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(Текст); Чтение.Прочитать(); // считывает 1 Чтение.Прочитать(); // считывает [ Результат = Чтение.Пропустить(); юТест.ПроверитьРавенство(Истина, Результат); юТест.ПроверитьРавенство(ТипЗначенияJSON.Число, Чтение.ТипТекущегоЗначения); юТест.ПроверитьРавенство(4, Чтение.ТекущееЗначение); КонецПроцедуры Процедура Тест_Должен_ПроверитьПропускНезавершенногоМассива() Экспорт Текст = "1,[2,"; Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(Текст); Чтение.Прочитать(); Чтение.Прочитать(); Результат = Чтение.Пропустить(); юТест.ПроверитьРавенство(Ложь, Результат); юТест.ПроверитьРавенство(ТипЗначенияJSON.Ничего, Чтение.ТипТекущегоЗначения); КонецПроцедуры Процедура Тест_Должен_ПроверитьПропускМассиваСВложенными() Экспорт Текст = "1,[2,[-1,-2],[-3,-4],3],4,5"; Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(Текст); Чтение.Прочитать(); // считывает 1 Чтение.Прочитать(); // считывает НачалоМассива Результат = Чтение.Пропустить(); // должно пропустить масиив от '[2,' до ',3]' и считать 4 юТест.ПроверитьРавенство(Истина, Результат); юТест.ПроверитьРавенство(ТипЗначенияJSON.Число, Чтение.ТипТекущегоЗначения); юТест.ПроверитьРавенство(4, Чтение.ТекущееЗначение); КонецПроцедуры Процедура Тест_Должен_ПроверитьПропускОбъектаСВложениями() Экспорт Текст = "1, {""a"":[2,[-1,-2],[-3,-4],3], ""b"":{ ""C"":""D""} }, 4, 5, {}"; Чтение = Новый ЧтениеJSON(); Чтение.УстановитьСтроку(Текст); Чтение.Прочитать(); Чтение.Прочитать(); Чтение.Пропустить(); Результат = Чтение.Прочитать(); юТест.ПроверитьРавенство(Истина, Результат); юТест.ПроверитьРавенство(ТипЗначенияJSON.Число, Чтение.ТипТекущегоЗначения); юТест.ПроверитьРавенство(5, Чтение.ТекущееЗначение); КонецПроцедуры Процедура Тест_Должен_ПроверитьОткрытиеПотока() Экспорт БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("{""ответ"":42}"); Поток = Новый ПотокВПамяти(БДД); Чтение = Новый ЧтениеJSON; Чтение.ОткрытьПоток(Поток); Json = ПрочитатьJSON(Чтение); юТест.ПроверитьРавенство(42, Json.Ответ); КонецПроцедуры Процедура Тест_Должен_ПроверитьПовторноеОткрытиеПотока() Экспорт БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("{""ответ"":42}"); Поток = Новый ПотокВПамяти(БДД); Чтение = Новый ЧтениеJSON; Чтение.ОткрытьПоток(Поток); Чтение.ОткрытьПоток(Поток); // повторно Json = ПрочитатьJSON(Чтение); юТест.ПроверитьРавенство(42, Json.Ответ); КонецПроцедуры Процедура Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытияЧтения() Экспорт БДД = ПолучитьБуферДвоичныхДанныхИзСтроки("{""ответ"":42}"); Поток = Новый ПотокВПамяти(БДД); Чтение = Новый ЧтениеJSON; Чтение.ОткрытьПоток(Поток); Чтение.Закрыть(); Чтение.ОткрытьПоток(Поток); // Поток должен остаться открытым Json = ПрочитатьJSON(Чтение); юТест.ПроверитьРавенство(42, Json.Ответ); КонецПроцедуры Процедура Тест_Должен_ОпределятьСтрокуСДатойВФорматеISOКакСтроку() Экспорт // проверяемая строка json СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; // какие типы должны быть при последовательном чтении ЭталонЗначения = Новый Массив; ЭталонЗначения.Добавить( ТипЗначенияJSON.НачалоОбъекта ); ЭталонЗначения.Добавить( ТипЗначенияJSON.ИмяСвойства ); ЭталонЗначения.Добавить( ТипЗначенияJSON.Строка ); ЭталонЗначения.Добавить( ТипЗначенияJSON.КонецОбъекта ); // читаем последовательно строку json и собираем типы значений по порядку ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); ФактЗначения = Новый Массив; Пока ЧтениеJSON.Прочитать() Цикл ФактЗначения.Добавить( ЧтениеJSON.ТипТекущегоЗначения ); КонецЦикла; ЧтениеJSON.Закрыть(); юТест.ПроверитьРавенство( ЭталонЗначения.Количество(), ФактЗначения.Количество() ); Для Сч = 0 По ЭталонЗначения.ВГраница() Цикл юТест.ПроверитьРавенство(ЭталонЗначения[Сч], ФактЗначения[Сч]); КонецЦикла; КонецПроцедуры Процедура Тест_Должен_ЧитатьСтрокуСДатойВФорматеISOКакСтроку() Экспорт // проверяемая строка json СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; // читаем последовательно строку json и собираем типы значений по порядку ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); ЧтениеJSON.Прочитать(); // НачалоОбъекта ЧтениеJSON.Прочитать(); // ИмяСвойства ЧтениеJSON.Прочитать(); // Строка ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; ТекущийТип = ЧтениеJSON.ТипТекущегоЗначения; ЧтениеJSON.Закрыть(); юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); юТест.ПроверитьРавенство(ТекущийТип, ТипЗначенияJSON.Строка); КонецПроцедуры Процедура Тест_Должен_ЧитатьДатуВФорматеISOКакСтрокуПриИспользованииПрочитатьJSON() Экспорт // проверяемая строка json СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46.230Z"" }"; // читаем json в структуру ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); Объект = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Эталон = Тип("Строка"); Факт = ТипЗнч( Объект.lastSignInTime ); юТест.ПроверитьРавенство(Эталон, Факт); юТест.ПроверитьРавенство(Объект.lastSignInTime, "2026-05-13T22:51:46.230Z"); КонецПроцедуры Процедура Тест_Должен_ОткрытьПотокЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт // проверяемая строка json СтрокаJSON = "{ ""lastSignInTime"": ""2026-05-13T22:51:46Z"" }"; БДД = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаJSON); Поток = Новый ПотокВПамяти(БДД); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.ОткрытьПоток(Поток); ЧтениеJSON.Прочитать(); // НачалоОбъекта ЧтениеJSON.Прочитать(); // ИмяСвойства ЧтениеJSON.Прочитать(); // Строка ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения; ЧтениеJSON.Закрыть(); юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка); КонецПроцедуры Процедура Тест_Должен_ОткрытьФайлЧитаетСтрокуСДатойВФорматеISOКакСтроку() Экспорт ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.ОткрытьФайл("json/json-mock_isodate.json"); ЧтениеJSON.Прочитать(); // НачалоОбъекта ЧтениеJSON.Прочитать(); // ИмяСвойства ЧтениеJSON.Прочитать(); // Строка ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; ТипТекущегоЗначения = ЧтениеJSON.ТипТекущегоЗначения; ЧтениеJSON.Закрыть(); юТест.ПроверитьРавенство(ТекущееЗначение, "2026-05-13T22:51:46Z"); юТест.ПроверитьРавенство(ТипТекущегоЗначения, ТипЗначенияJSON.Строка); КонецПроцедуры