/
smwwiki
/
OneScript_fork
Обзор
Документация
Войти
/
smwwiki
/
OneScript_fork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
tests/json/test-json_reader.os
221 строка
13 KB
Michael Rybakin
fix #1373, #1404 для v2: чтение JSON
23 май 2024, 17:03
23 май 2024, 17:03
c6c3205
Код
Авторство
О чём код?
#Использовать asserts Перем юТест; Перем ТекстПроверки; Функция ПолучитьСписокТестов(Тестирование) Экспорт юТест = Тестирование; СписокТестов = Новый Массив; СписокТестов.Добавить("Тест_Должен_ПроверитьПолучениеВсехЭлементовПеречисленияТипЗначенияJSON"); СписокТестов.Добавить("Тест_Должен_СверитьСвойствоСДвойнымиКавычками"); СписокТестов.Добавить("Тест_Должен_ПроверитьПреобразованиеNullВНеопределено"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSON"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONВСтруктуру"); СписокТестов.Добавить("Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONМассива"); СписокТестов.Добавить("Тест_ДолженВызватьОшибку_ДляUndefined"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускЗначения"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускМассива"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускНезавершенногоМассива"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускМассиваСВложенными"); СписокТестов.Добавить("Тест_Должен_ПроверитьПропускОбъектаСВложениями"); Возврат СписокТестов; КонецФункции Процедура Тест_Должен_ПроверитьПолучениеВсехЭлементовПеречисленияТипЗначения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", Истина); юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 960829385); КонецПроцедуры Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсингаJSONВСтруктуру() Экспорт СтруктураДанных = ПолучитьСтруктуруДанных("json/json-mock_struct.json", Ложь); юТест.ПроверитьРавенство(РассчитатьХешСумму(СтруктураДанных), 2800700943); КонецПроцедуры Процедура Тест_Должен_СверитьХешСуммуРезультатаПарсинга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, Чтение.ТекущееЗначение); КонецПроцедуры