Skip to content

Commit 4a2a809

Browse files
author
e.ivanov
committed
Сериализатор
1 parent bc4601b commit 4a2a809

11 files changed

+1186
-1
lines changed

correct_array.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- name: first
2+
value: 1
3+
- name: second
4+
value: 2

src/internal/Модули/Сериализатор.os

Lines changed: 411 additions & 0 deletions
Large diffs are not rendered by default.

src/Классы/ПарсерYaml.os

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@
4242
Возврат ВыполнитьОсновнойПарсинг(СтрокаYaml);
4343
КонецФункции
4444

45+
46+
// YAML сериализатор
47+
//
48+
// Параметры:
49+
// Значение - Произвольный - Набор данных сериализуемых в формат;
50+
//
51+
// Возвращаемое значение:
52+
// Строка - Строка данных в формате YAML согласно содержимому входящих данных.
53+
//
54+
Функция ЗаписатьYaml(Знач Значение) Экспорт
55+
56+
Возврат Сериализатор.Сериализовать(Значение);
57+
58+
КонецФункции
59+
60+
4561
// Проверяет, является ли YAML-строка скалярным значением
4662
//
4763
// Параметры:
@@ -250,7 +266,6 @@
250266
КонецФункции
251267

252268

253-
254269
// Обработка значения ключа
255270
//
256271
// Параметры:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- apple
2+
- banana
3+
- orange
4+
- grape
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
items:
2+
- name: first
3+
value: 1
4+
active: true
5+
- name: second
6+
value: 2
7+
active: false
8+
- name: third
9+
value: 3
10+
active: true
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
user:
2+
name: John Doe
3+
age: 30
4+
address:
5+
street: 123 Main St
6+
city: New York
7+
country: USA
8+
hobbies:
9+
- reading
10+
- swimming
11+
- coding
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name: John Doe
2+
age: 30
3+
active: true
4+
salary: 75000.50
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#Использовать asserts
2+
#Использовать ".."
3+
#Использовать "."
4+
5+
&ТестовыйНабор
6+
Процедура ПриСозданииОбъекта() Экспорт
7+
КонецПроцедуры
8+
9+
&Тест
10+
Процедура ТестКруговойСериализацииПростыхДанных() Экспорт
11+
// Дано
12+
СодержимоеФайла = ТестовыеУтилиты.ПрочитатьТекстФайла(ТестовыеУтилиты.ПолучитьПутьКТестовымДанным("serialization_simple.yaml"));
13+
Парсер = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
14+
15+
// Когда - читаем исходные данные
16+
ИсходныеДанные = Парсер.ПрочитатьYaml(СодержимоеФайла);
17+
18+
// Сериализуем обратно в YAML
19+
СериализованныеДанные = Парсер.ЗаписатьYaml(ИсходныеДанные);
20+
21+
// Читаем сериализованные данные
22+
ВосстановленныеДанные = Парсер.ПрочитатьYaml(СериализованныеДанные);
23+
24+
// Тогда - данные должны остаться неизменными
25+
Ожидаем.Что(ВосстановленныеДанные.Получить("name")).Равно(ИсходныеДанные.Получить("name"));
26+
Ожидаем.Что(ВосстановленныеДанные.Получить("age")).Равно(ИсходныеДанные.Получить("age"));
27+
Ожидаем.Что(ВосстановленныеДанные.Получить("active")).Равно(ИсходныеДанные.Получить("active"));
28+
Ожидаем.Что(ВосстановленныеДанные.Получить("salary")).Равно(ИсходныеДанные.Получить("salary"));
29+
КонецПроцедуры
30+
31+
&Тест
32+
Процедура ТестКруговойСериализацииМассива() Экспорт
33+
// Дано
34+
СодержимоеФайла = ТестовыеУтилиты.ПрочитатьТекстФайла(ТестовыеУтилиты.ПолучитьПутьКТестовымДанным("serialization_array.yaml"));
35+
Парсер = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
36+
37+
// Когда - круговая сериализация
38+
ИсходныеДанные = Парсер.ПрочитатьYaml(СодержимоеФайла);
39+
СериализованныеДанные = Парсер.ЗаписатьYaml(ИсходныеДанные);
40+
ВосстановленныеДанные = Парсер.ПрочитатьYaml(СериализованныеДанные);
41+
42+
// Тогда - массивы должны быть идентичными
43+
Ожидаем.Что(ТипЗнч(ВосстановленныеДанные)).Равно(Тип("Массив"));
44+
Ожидаем.Что(ВосстановленныеДанные.Количество()).Равно(ИсходныеДанные.Количество());
45+
46+
Для Индекс = 0 По ИсходныеДанные.ВГраница() Цикл
47+
Ожидаем.Что(ВосстановленныеДанные[Индекс]).Равно(ИсходныеДанные[Индекс]);
48+
КонецЦикла;
49+
КонецПроцедуры
50+
51+
&Тест
52+
Процедура ТестКруговойСериализацииВложенныхСтруктур() Экспорт
53+
// Дано
54+
СодержимоеФайла = ТестовыеУтилиты.ПрочитатьТекстФайла(ТестовыеУтилиты.ПолучитьПутьКТестовымДанным("serialization_nested.yaml"));
55+
Парсер = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
56+
57+
// Когда - круговая сериализация
58+
ИсходныеДанные = Парсер.ПрочитатьYaml(СодержимоеФайла);
59+
СериализованныеДанные = Парсер.ЗаписатьYaml(ИсходныеДанные);
60+
ВосстановленныеДанные = Парсер.ПрочитатьYaml(СериализованныеДанные);
61+
62+
// Тогда - вложенные структуры должны сохраниться
63+
ИсходныйПользователь = ИсходныеДанные.Получить("user");
64+
ВосстановленныйПользователь = ВосстановленныеДанные.Получить("user");
65+
66+
Ожидаем.Что(ВосстановленныйПользователь.Получить("name")).Равно(ИсходныйПользователь.Получить("name"));
67+
Ожидаем.Что(ВосстановленныйПользователь.Получить("age")).Равно(ИсходныйПользователь.Получить("age"));
68+
69+
// Проверяем вложенный адрес
70+
ИсходныйАдрес = ИсходныйПользователь.Получить("address");
71+
ВосстановленныйАдрес = ВосстановленныйПользователь.Получить("address");
72+
73+
Ожидаем.Что(ВосстановленныйАдрес.Получить("street")).Равно(ИсходныйАдрес.Получить("street"));
74+
Ожидаем.Что(ВосстановленныйАдрес.Получить("city")).Равно(ИсходныйАдрес.Получить("city"));
75+
Ожидаем.Что(ВосстановленныйАдрес.Получить("country")).Равно(ИсходныйАдрес.Получить("country"));
76+
77+
// Проверяем массив хобби
78+
ИсходныеХобби = ИсходныйПользователь.Получить("hobbies");
79+
ВосстановленныеХобби = ВосстановленныйПользователь.Получить("hobbies");
80+
81+
Ожидаем.Что(ВосстановленныеХобби.Количество()).Равно(ИсходныеХобби.Количество());
82+
Для Индекс = 0 По ИсходныеХобби.ВГраница() Цикл
83+
Ожидаем.Что(ВосстановленныеХобби[Индекс]).Равно(ИсходныеХобби[Индекс]);
84+
КонецЦикла;
85+
КонецПроцедуры
86+
87+
&Тест
88+
Процедура ТестКруговойСериализацииМассиваОбъектов() Экспорт
89+
// Дано
90+
СодержимоеФайла = ТестовыеУтилиты.ПрочитатьТекстФайла(ТестовыеУтилиты.ПолучитьПутьКТестовымДанным("serialization_array_objects.yaml"));
91+
Парсер = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
92+
93+
// Когда - круговая сериализация
94+
ИсходныеДанные = Парсер.ПрочитатьYaml(СодержимоеФайла);
95+
СериализованныеДанные = Парсер.ЗаписатьYaml(ИсходныеДанные);
96+
ВосстановленныеДанные = Парсер.ПрочитатьYaml(СериализованныеДанные);
97+
98+
// Тогда - структура с массивом объектов должна сохраниться
99+
Ожидаем.Что(ТипЗнч(ВосстановленныеДанные)).Равно(Тип("Соответствие"));
100+
101+
ИсходныйМассив = ИсходныеДанные.Получить("items");
102+
ВосстановленныйМассив = ВосстановленныеДанные.Получить("items");
103+
104+
Ожидаем.Что(ТипЗнч(ВосстановленныйМассив)).Равно(Тип("Массив"));
105+
Ожидаем.Что(ВосстановленныйМассив.Количество()).Равно(ИсходныйМассив.Количество());
106+
107+
Для Индекс = 0 По ИсходныйМассив.ВГраница() Цикл
108+
ИсходныйОбъект = ИсходныйМассив[Индекс];
109+
ВосстановленныйОбъект = ВосстановленныйМассив[Индекс];
110+
111+
Ожидаем.Что(ВосстановленныйОбъект.Получить("name")).Равно(ИсходныйОбъект.Получить("name"));
112+
Ожидаем.Что(ВосстановленныйОбъект.Получить("value")).Равно(ИсходныйОбъект.Получить("value"));
113+
Ожидаем.Что(ВосстановленныйОбъект.Получить("active")).Равно(ИсходныйОбъект.Получить("active"));
114+
КонецЦикла;
115+
КонецПроцедуры
116+
117+
&Тест
118+
Процедура ТестСериализацииИдентичностиДанных() Экспорт
119+
// Дано - создаем сложную структуру программно
120+
Парсер = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
121+
122+
КорневаяСтруктура = Новый Структура;
123+
124+
// Простые типы
125+
КорневаяСтруктура.Вставить("строка", "тестовая строка");
126+
КорневаяСтруктура.Вставить("число", 42);
127+
КорневаяСтруктура.Вставить("вещественное", 3.14159);
128+
КорневаяСтруктура.Вставить("булево_истина", Истина);
129+
КорневаяСтруктура.Вставить("булево_ложь", Ложь);
130+
КорневаяСтруктура.Вставить("неопределено", Неопределено);
131+
132+
// Массив смешанных типов
133+
СмешанныйМассив = Новый Массив;
134+
СмешанныйМассив.Добавить("строка в массиве");
135+
СмешанныйМассив.Добавить(123);
136+
СмешанныйМассив.Добавить(Истина);
137+
КорневаяСтруктура.Вставить("смешанный_массив", СмешанныйМассив);
138+
139+
// Вложенная структура
140+
ВложеннаяСтруктура = Новый Структура;
141+
ВложеннаяСтруктура.Вставить("вложенная_строка", "значение");
142+
ВложеннаяСтруктура.Вставить("вложенное_число", 999);
143+
КорневаяСтруктура.Вставить("вложенная_структура", ВложеннаяСтруктура);
144+
145+
// Когда - выполняем круговую сериализацию
146+
СериализованныеДанные = Парсер.ЗаписатьYaml(КорневаяСтруктура);
147+
ВосстановленныеДанные = Парсер.ПрочитатьYaml(СериализованныеДанные);
148+
149+
// Тогда - проверяем все типы данных
150+
Ожидаем.Что(ВосстановленныеДанные.Получить("строка")).Равно("тестовая строка");
151+
Ожидаем.Что(ВосстановленныеДанные.Получить("число")).Равно(42);
152+
Ожидаем.Что(ВосстановленныеДанные.Получить("вещественное")).Равно(3.14159);
153+
Ожидаем.Что(ВосстановленныеДанные.Получить("булево_истина")).Равно(Истина);
154+
Ожидаем.Что(ВосстановленныеДанные.Получить("булево_ложь")).Равно(Ложь);
155+
Ожидаем.Что(ВосстановленныеДанные.Получить("неопределено")).Равно(Неопределено);
156+
157+
// Проверяем массив
158+
ВосстановленныйМассив = ВосстановленныеДанные.Получить("смешанный_массив");
159+
Ожидаем.Что(ТипЗнч(ВосстановленныйМассив)).Равно(Тип("Массив"));
160+
Ожидаем.Что(ВосстановленныйМассив.Количество()).Равно(3);
161+
Ожидаем.Что(ВосстановленныйМассив[0]).Равно("строка в массиве");
162+
Ожидаем.Что(ВосстановленныйМассив[1]).Равно(123);
163+
Ожидаем.Что(ВосстановленныйМассив[2]).Равно(Истина);
164+
165+
// Проверяем вложенную структуру
166+
ВосстановленнаяВложеннаяСтруктура = ВосстановленныеДанные.Получить("вложенная_структура");
167+
Ожидаем.Что(ВосстановленнаяВложеннаяСтруктура.Получить("вложенная_строка")).Равно("значение");
168+
Ожидаем.Что(ВосстановленнаяВложеннаяСтруктура.Получить("вложенное_число")).Равно(999);
169+
КонецПроцедуры

0 commit comments

Comments
 (0)