|
29 | 29 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПриЗаписиВБуферСНевернымИндексомВыбрасываетсяИсключение"); |
30 | 30 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКорректноРаботаютПобитовыеОперацииЗаписиВБуферДвоичныхДанных"); |
31 | 31 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМетодОткрытьПотокДляЧтенияВозвращаетПотокТолькоДляЧтения"); |
| 32 | + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияЗапрещаетЗапись"); |
| 33 | + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияРазделяетДанныеИПозицию"); |
32 | 34 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком"); |
33 | 35 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСДвоичнымиДанными"); |
34 | 36 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПрочитатьБайтНеВыбрасываетИсключениеВКонцеПотока"); |
|
325 | 327 |
|
326 | 328 | КонецПроцедуры |
327 | 329 |
|
| 330 | +Процедура ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияЗапрещаетЗапись() Экспорт |
| 331 | + |
| 332 | + Поток = Новый ПотокВПамяти(); |
| 333 | + Буфер = Новый БуферДвоичныхДанных(10); |
| 334 | + Поток.Записать(Буфер, 0, 10); // Запишем какие-то данные |
| 335 | + |
| 336 | + // Получим поток только для чтения |
| 337 | + ПотокДляЧтения = Поток.ПолучитьПотокТолькоДляЧтения(); |
| 338 | + |
| 339 | + // Проверим, что поток помечен как read-only |
| 340 | + юТест.ПроверитьЛожь(ПотокДляЧтения.ДоступнаЗапись); |
| 341 | + |
| 342 | + // Попытаемся записать в поток только для чтения - должно выбросить исключение |
| 343 | + Попытка |
| 344 | + ПотокДляЧтения.Записать(Новый БуферДвоичныхДанных(10), 0, 10); |
| 345 | + ВызватьИсключение "Ожидали исключение при записи в поток только для чтения, но его не было"; |
| 346 | + Исключение |
| 347 | + ОписаниеОшибки = ИнформацияОбОшибке().Описание; |
| 348 | + юТест.ПроверитьВхождение(ОписаниеОшибки, "Попытка записи в поток не поддерживающий запись"); |
| 349 | + КонецПопытки; |
| 350 | + |
| 351 | + // Также проверим, что изменение размера тоже запрещено |
| 352 | + Попытка |
| 353 | + ПотокДляЧтения.УстановитьРазмер(20); |
| 354 | + ВызватьИсключение "Ожидали исключение при изменении размера потока только для чтения, но его не было"; |
| 355 | + Исключение |
| 356 | + ОписаниеОшибки = ИнформацияОбОшибке().Описание; |
| 357 | + юТест.ПроверитьВхождение(ОписаниеОшибки, "Попытка записи в поток не поддерживающий запись"); |
| 358 | + КонецПопытки; |
| 359 | + |
| 360 | +КонецПроцедуры |
| 361 | + |
| 362 | +Процедура ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияРазделяетДанныеИПозицию() Экспорт |
| 363 | + |
| 364 | + // Создаем поток с данными |
| 365 | + Поток = Новый ПотокВПамяти(); |
| 366 | + Буфер = Новый БуферДвоичныхДанных(20); |
| 367 | + |
| 368 | + // Заполним буфер данными |
| 369 | + Для Индекс = 0 По 19 Цикл |
| 370 | + Буфер.Установить(Индекс, Индекс + 1); |
| 371 | + КонецЦикла; |
| 372 | + |
| 373 | + Поток.Записать(Буфер, 0, 20); |
| 374 | + юТест.ПроверитьРавенство(20, Поток.Размер()); |
| 375 | + юТест.ПроверитьРавенство(20, Поток.ТекущаяПозиция()); |
| 376 | + |
| 377 | + // Сбросим позицию на начало |
| 378 | + Поток.Перейти(0, ПозицияВПотоке.Начало); |
| 379 | + юТест.ПроверитьРавенство(0, Поток.ТекущаяПозиция()); |
| 380 | + |
| 381 | + // Получим поток только для чтения |
| 382 | + ПотокДляЧтения = Поток.ПолучитьПотокТолькоДляЧтения(); |
| 383 | + |
| 384 | + // Проверим, что начальная позиция общая |
| 385 | + юТест.ПроверитьРавенство(0, ПотокДляЧтения.ТекущаяПозиция()); |
| 386 | + |
| 387 | + // Прочитаем из основного потока 5 байт - позиция должна сдвинуться в обоих потоках |
| 388 | + БуферЧтения = Новый БуферДвоичныхДанных(5); |
| 389 | + Поток.Прочитать(БуферЧтения, 0, 5); |
| 390 | + |
| 391 | + // Проверим, что позиция изменилась в обоих потоках |
| 392 | + юТест.ПроверитьРавенство(5, Поток.ТекущаяПозиция()); |
| 393 | + юТест.ПроверитьРавенство(5, ПотокДляЧтения.ТекущаяПозиция()); |
| 394 | + |
| 395 | + // Прочитаем из потока только для чтения еще 3 байта |
| 396 | + БуферЧтения2 = Новый БуферДвоичныхДанных(3); |
| 397 | + ПотокДляЧтения.Прочитать(БуферЧтения2, 0, 3); |
| 398 | + |
| 399 | + // Проверим, что позиция изменилась в обоих потоках |
| 400 | + юТест.ПроверитьРавенство(8, Поток.ТекущаяПозиция()); |
| 401 | + юТест.ПроверитьРавенство(8, ПотокДляЧтения.ТекущаяПозиция()); |
| 402 | + |
| 403 | + // Проверим, что данные одинаковые - прочитали байты с 6-го по 8-й (значения 6, 7, 8) |
| 404 | + юТест.ПроверитьРавенство(6, БуферЧтения2.Получить(0)); |
| 405 | + юТест.ПроверитьРавенство(7, БуферЧтения2.Получить(1)); |
| 406 | + юТест.ПроверитьРавенство(8, БуферЧтения2.Получить(2)); |
| 407 | + |
| 408 | + // Изменим позицию в потоке только для чтения |
| 409 | + ПотокДляЧтения.Перейти(15, ПозицияВПотоке.Начало); |
| 410 | + |
| 411 | + // Проверим, что позиция изменилась в обоих потоках |
| 412 | + юТест.ПроверитьРавенство(15, Поток.ТекущаяПозиция()); |
| 413 | + юТест.ПроверитьРавенство(15, ПотокДляЧтения.ТекущаяПозиция()); |
| 414 | + |
| 415 | + // Запишем данные в основной поток (в позицию 15) |
| 416 | + БуферЗаписи = Новый БуферДвоичныхДанных(2); |
| 417 | + БуферЗаписи.Установить(0, 100); |
| 418 | + БуферЗаписи.Установить(1, 200); |
| 419 | + Поток.Записать(БуферЗаписи, 0, 2); |
| 420 | + |
| 421 | + // Позиция должна сдвинуться в обоих потоках |
| 422 | + юТест.ПроверитьРавенство(17, Поток.ТекущаяПозиция()); |
| 423 | + юТест.ПроверитьРавенство(17, ПотокДляЧтения.ТекущаяПозиция()); |
| 424 | + |
| 425 | + // Вернемся к позиции 15 и прочитаем из потока только для чтения |
| 426 | + ПотокДляЧтения.Перейти(15, ПозицияВПотоке.Начало); |
| 427 | + БуферЧтения3 = Новый БуферДвоичныхДанных(2); |
| 428 | + ПотокДляЧтения.Прочитать(БуферЧтения3, 0, 2); |
| 429 | + |
| 430 | + // Проверим, что мы прочитали измененные данные - данные общие между потоками |
| 431 | + юТест.ПроверитьРавенство(100, БуферЧтения3.Получить(0)); |
| 432 | + юТест.ПроверитьРавенство(200, БуферЧтения3.Получить(1)); |
| 433 | + |
| 434 | +КонецПроцедуры |
| 435 | + |
328 | 436 | Процедура ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком() Экспорт |
329 | 437 |
|
330 | 438 | ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709"); |
|
0 commit comments