Skip to content

Commit 50cfeb6

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents 3cadb89 + 80e0162 commit 50cfeb6

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

src/OneScript.StandardLibrary/Binary/GenericStream.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the
88
using System;
99
using System.IO;
1010
using OneScript.Contexts;
11+
using OneScript.Exceptions;
1112
using ScriptEngine.Machine;
1213
using ScriptEngine.Machine.Contexts;
1314

@@ -135,6 +136,8 @@ public void Close()
135136
[ContextMethod("Записать", "Write")]
136137
public void Write(BinaryDataBuffer buffer, int positionInBuffer, int number)
137138
{
139+
if (!CanWrite)
140+
throw new RuntimeException("Попытка записи в поток не поддерживающий запись", "Cannot write to a stream that does not support writing");
138141
_commonImpl.Write(buffer, positionInBuffer, number);
139142
}
140143

@@ -271,6 +274,8 @@ public long CurrentPosition()
271274
[ContextMethod("УстановитьРазмер", "SetSize")]
272275
public void SetSize(long size)
273276
{
277+
if (!CanWrite)
278+
throw new RuntimeException("Попытка записи в поток не поддерживающий запись", "Cannot write to a stream that does not support writing");
274279
_commonImpl.SetSize(size);
275280
}
276281

tests/binary-objects.os

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПриЗаписиВБуферСНевернымИндексомВыбрасываетсяИсключение");
3030
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКорректноРаботаютПобитовыеОперацииЗаписиВБуферДвоичныхДанных");
3131
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоМетодОткрытьПотокДляЧтенияВозвращаетПотокТолькоДляЧтения");
32+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияЗапрещаетЗапись");
33+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПолучитьПотокТолькоДляЧтенияРазделяетДанныеИПозицию");
3234
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком");
3335
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоХешированиеРаботаетСДвоичнымиДанными");
3436
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПрочитатьБайтНеВыбрасываетИсключениеВКонцеПотока");
@@ -325,6 +327,112 @@
325327

326328
КонецПроцедуры
327329

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+
328436
Процедура ТестДолжен_ПроверитьЧтоХешированиеРаботаетСПотоком() Экспорт
329437

330438
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");

0 commit comments

Comments
 (0)