-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathnative-api.os
254 lines (186 loc) · 15.2 KB
/
native-api.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
Перем юТест;
Перем ЭтоWindows;
Перем DLLПодключенаУспешно;
Перем ЗаписьXML, ЗаписьZIP, КаталогСкрипта, КаталогПакета, СуффиксВерсии;
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
ПроверитьСуществованиеПрокси();
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
// TODO: сделать прогон этого теста еще и на 32-битной архитектуре, см. ошибку #1531
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыZIP");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыDLL");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойстваВнешнейКомпоненты");
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодыВнешнейКомпоненты");
#Если Windows Тогда
ЭтоWindows = Истина;
#ИначеЕсли Linux Тогда
ЭтоWindows = Ложь;
#Иначе
Возврат Новый Массив; // под макос не тестируем
#КонецЕсли
Возврат ВсеТесты;
КонецФункции
Процедура ПроверитьСуществованиеПрокси()
Каталог = КаталогПрограммы();
СистемнаяИнформация = Новый СистемнаяИнформация();
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi32.dll");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi64.dll");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда
ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi32.so");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi64.so");
Иначе
ПутьБиблиотеки = "";
КонецЕсли;
Сборка = Новый Файл(ПутьБиблиотеки);
Если Не Сборка.Существует() Тогда
ВызватьИсключение "Не собрана прокси-библиотека для NativeApi";
КонецЕсли;
КонецПроцедуры
Функция ПодключитьКомпонентуDLL()
Если DLLПодключенаУспешно <> Неопределено Тогда
Возврат DLLПодключенаУспешно;
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация();
КаталогСборок = ОбъединитьПути(ТекущийСценарий().Каталог, "native-api");
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "bin", "AddInNativeWin32.dll");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "bin64", "AddInNativeWin64.dll");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда
ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "build32", "AddInNativeLin32.so");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "build64", "AddInNativeLin64.so");
Иначе
ВызватьИсключение "Неподдерживаемый тип платформы: " + СистемнаяИнформация.ТипПлатформы;
КонецЕсли;
Идентификатор = "AddinNativeDLL";
ФайлКомпоненты = Новый Файл(ПутьБиблиотеки);
юТест.ПроверитьИстину(ФайлКомпоненты.Существует(),
"Файл компоненты '" + ФайлКомпоненты.ПолноеИмя + "' должен существовать");
DLLПодключенаУспешно = ПодключитьВнешнююКомпоненту(ФайлКомпоненты.ПолноеИмя, Идентификатор, ТипВнешнейКомпоненты.Native);
Возврат DLLПодключенаУспешно;
КонецФункции
Процедура ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыZIP() Экспорт
ИмяФайлаПакета = юТест.ИмяВременногоФайла();
ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайлаПакета);
МасивФайлов = Новый Массив;
Если ЭтоWindows Тогда
Каталог = ТекущийСценарий().Каталог + "\native-api\";
МасивФайлов.Добавить("bin\AddInNativeWin32.dll");
МасивФайлов.Добавить("bin64\AddInNativeWin64.dll");
Иначе
Каталог = ТекущийСценарий().Каталог + "/native-api/";
МасивФайлов.Добавить("build32/AddInNativeLin32.so");
МасивФайлов.Добавить("build64/AddInNativeLin64.so");
КонецЕсли;
ЗаписьZIP.Добавить(Каталог + "MANIFEST.XML", РежимСохраненияПутейZIP.НеСохранятьПути);
Для каждого ИмяФайла из МасивФайлов Цикл
ПутьФайла = Каталог + ИмяФайла;
Файл = Новый Файл(ПутьФайла);
Если Файл.Существует() Тогда
ЗаписьZIP.Добавить(ПутьФайла, РежимСохраненияПутейZIP.НеСохранятьПути);
КонецЕсли;
КонецЦикла;
ЗаписьZIP.Записать();
Идентификатор = "AddinNativeZip";
Успешно = ПодключитьВнешнююКомпоненту(ИмяФайлаПакета, Идентификатор, ТипВнешнейКомпоненты.Native);
юТест.ПроверитьРавенство(Успешно, Истина);
ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative";
ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты);
юТест.ПроверитьРавенство(Строка(ТипЗнч(ВнешняяКомпонента)), Строка(Тип(ИмяВнешнейКомпоненты)));
КонецПроцедуры
Процедура ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыDLL() Экспорт
Идентификатор = "AddinNativeDLL";
КомпонентаПодключена = ПодключитьКомпонентуDLL();
юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться");
ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative";
ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты);
ВнешняяКомпонента.Включить();
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина);
ВнешняяКомпонента.Выключить();
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь);
КонецПроцедуры
Процедура ТестДолжен_ПроверитьСвойстваВнешнейКомпоненты() Экспорт
Идентификатор = "AddinNativeDLL";
КомпонентаПодключена = ПодключитьКомпонентуDLL();
юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться");
ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative";
ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты);
ВнешняяКомпонента.Включен = Истина;
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина);
юТест.ПроверитьРавенство(ВнешняяКомпонента.IsEnabled, Истина);
ВнешняяКомпонента.Включен = Ложь;
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь);
юТест.ПроверитьРавенство(ВнешняяКомпонента.IsEnabled, Ложь);
ВнешняяКомпонента["Включен"] = Истина;
юТест.ПроверитьРавенство(ВнешняяКомпонента["Включен"], Истина);
юТест.ПроверитьРавенство(ВнешняяКомпонента["IsEnabled"], Истина);
СодержимоеСтроки = "Тест строки только на запись";
ВнешняяКомпонента.СтрокаТолькоЗапись = СодержимоеСтроки;
юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаЧтениеЗапись, СодержимоеСтроки);
юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаТолькоЧтение, СодержимоеСтроки);
СодержимоеСтроки = "Тест строки на чтение и запись";
ВнешняяКомпонента.СтрокаЧтениеЗапись = СодержимоеСтроки;
юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаЧтениеЗапись, СодержимоеСтроки);
юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаТолькоЧтение, СодержимоеСтроки);
Попытка
ВнешняяКомпонента.СтрокаТолькоЧтение = СодержимоеСтроки;
юТест.ТестПровален("Удалось изменить недоступное для записи свойство");
Исключение
юТест.ТестПройден();
КонецПопытки;
Попытка
СодержимоеСтроки = ВнешняяКомпонента.СтрокаТолькоЗапись;
юТест.ТестПровален("Удалось прочитать недоступное для чтения свойство");
Исключение
юТест.ТестПройден();
КонецПопытки;
Попытка
ВнешняяКомпонента.СвойствоОтсутствует = СодержимоеСтроки;
юТест.ТестПровален("Удалось обратиться к отсутствующему свойству");
Исключение
юТест.ТестПройден();
КонецПопытки;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьМетодыВнешнейКомпоненты() Экспорт
Идентификатор = "AddinNativeDLL";
КомпонентаПодключена = ПодключитьКомпонентуDLL();
юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться");
ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative";
ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты);
ВнешняяКомпонента.Включить();
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина);
ВнешняяКомпонента.Выключить();
юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь);
Попытка
ВнешняяКомпонента.Выключить(Истина);
юТест.ТестПровален("Удалось передать параметр в метод без параметров");
Исключение
юТест.ТестПройден();
КонецПопытки;
юТест.ПроверитьРавенство(ВнешняяКомпонента.ПараметрПоУмолчанию(), Истина);
юТест.ПроверитьРавенство(ВнешняяКомпонента.ПараметрПоУмолчанию(Ложь), Ложь);
Попытка
Значение = ВнешняяКомпонента.ПараметрПоУмолчанию(Истина, Ложь);
юТест.ТестПровален("Удалось передать лишний параметр в метод с одним параметром");
Исключение
юТест.ТестПройден();
КонецПопытки;
ПерваяСтрока = "Первая строка";
ВтораяСтрока = "Вторая тестовая строка";
КонкатенацияСтрок = ВнешняяКомпонента.КонкатенацияСтрок(ПерваяСтрока, ВтораяСтрока);
юТест.ПроверитьРавенство(КонкатенацияСтрок, ПерваяСтрока + ВтораяСтрока);
СодержимоеФайла = "Тест двоичных данных";
ВременныйФайл = юТест.ИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ДвоичныеДанные = Новый ДвоичныеДанные(ВременныйФайл);
ДвоичныеДанные = ВнешняяКомпонента.Петля(ДвоичныеДанные);
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ЧтениеТекста = Новый ЧтениеТекста(Поток, КодировкаТекста.UTF8);
юТест.ПроверитьРавенство(ЧтениеТекста.Прочитать(), СодержимоеФайла);
КонецПроцедуры