diff --git a/src/OneScript.Core/Exceptions/RuntimeException.cs b/src/OneScript.Core/Exceptions/RuntimeException.cs index 63e807fe5..82b470b11 100644 --- a/src/OneScript.Core/Exceptions/RuntimeException.cs +++ b/src/OneScript.Core/Exceptions/RuntimeException.cs @@ -175,15 +175,15 @@ public static RuntimeException InvalidEncoding(string encoding) return new RuntimeException( $"Неправильное имя кодировки '{encoding}'", $"Invalid encoding name '{encoding}'"); - } - + } + public static RuntimeException IncorrectOffset() { return new RuntimeException( "Неправильное смещение внутри коллекции", "Incorrect offset within collection"); - } - + } + public static RuntimeException IndexOutOfRange() { return new RuntimeException( @@ -191,6 +191,20 @@ public static RuntimeException IndexOutOfRange() "Index is out of range"); } + public static RuntimeException ClosedStream() + { + return new RuntimeException( + "Ошибка обращения к закрытому потоку", + "Cannot access a closed stream"); + } + + public static RuntimeException NonWritableStream() + { + return new RuntimeException( + "Попытка записи в поток не поддерживающий запись", + "Cannot write to a stream that does not support writing"); + } + #endregion } } \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs b/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs index ce717b3f2..cacfa1152 100644 --- a/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs +++ b/src/OneScript.StandardLibrary/Text/TextWriteImpl.cs @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the using OneScript.Execution; using OneScript.Types; using OneScript.Values; +using OneScript.StandardLibrary.Binary; using ScriptEngine.Machine; using ScriptEngine.Machine.Contexts; @@ -22,6 +23,8 @@ namespace OneScript.StandardLibrary.Text public class TextWriteImpl : AutoContext, IDisposable { StreamWriter _writer; + IStreamWrapper _streamWrapper; + Encoding _encoding; string _lineDelimiter = ""; string _eolReplacement = ""; @@ -29,45 +32,66 @@ public TextWriteImpl() { } - + public TextWriteImpl(string path, IValue encoding) { - Open(path, encoding); + Open(ValueFactory.Create(path), encoding); } public TextWriteImpl(string path, IValue encoding, bool append) { - Open(path, encoding, null, append); + Open(ValueFactory.Create(path), encoding, null, ValueFactory.Create(append)); } + public TextWriteImpl(IValue stream, IValue encoding, IValue writeBom) + { + Open(stream, encoding, null, null, writeBom); + } + /// - /// Открывает файл для записи. + /// Открывает файл или устанавливает поток для записи. /// - /// Путь к файлу + /// Имя файла или поток, в который будет выполнена запись. /// Кодировка (необязательный). По умолчанию используется utf-8 - /// Разделитель строк (необязательный). - /// Признак добавления в конец файла (необязательный) - /// Разделитель строк в файле (необязательный). + /// + /// Определяет строку, разделяющую строки в файле/потоке (необязательный). + /// Значение по умолчанию: ПС. + /// + /// Для файла: + /// Признак добавления в конец файла (необязательный). + /// Значение по умолчанию: Ложь. + /// Для потока: + /// Определяет разделение строк в потоке для конвертации в стандартный перевод строк ПС (необязательный). + /// Значение по умолчанию: ВК + ПС. + /// + /// Для файла: + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС (необязательный). + /// Значение по умолчанию: ВК + ПС. + /// Для потока: + /// Если в начало потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, + /// то данный параметр должен иметь значение Истина. + /// Значение по умолчанию: Ложь. [ContextMethod("Открыть", "Open")] - public void Open(string path, IValue encoding = null, string lineDelimiter = null, bool append = false, string eolReplacement = null) + public void Open(IValue fileOrStream, IValue encoding = null, string lineDelimiter = null, IValue param4 = null, IValue param5 = null) { - _lineDelimiter = lineDelimiter ?? "\n"; - _eolReplacement = eolReplacement ?? "\r\n"; - - Encoding enc; - if (encoding == null) + if (fileOrStream is IStreamWrapper streamWrapper) { - enc = new UTF8Encoding(true); + OpenStream( + streamWrapper, + encoding, + lineDelimiter, + ContextValuesMarshaller.ConvertValueStrict(param4), + ContextValuesMarshaller.ConvertValueStrict(param5)); } else { - enc = TextEncodingEnum.GetEncoding(encoding); - if (enc.WebName == "utf-8" && append == true) - enc = new UTF8Encoding(false); + OpenFile( + fileOrStream.ToString(), + encoding, + lineDelimiter, + ContextValuesMarshaller.ConvertValueStrict(param4), + ContextValuesMarshaller.ConvertValueStrict(param5)); } - - _writer = new StreamWriter(path, append, enc); - _writer.AutoFlush = true; } [ContextMethod("Закрыть","Close")] @@ -83,8 +107,8 @@ public void Close() [ContextMethod("Записать", "Write")] public void Write(string what) { - ThrowIfNotOpened(); - + PrepareForWriting(); + var stringToOutput = what.Replace ("\n", _eolReplacement); _writer.Write(stringToOutput); @@ -98,23 +122,21 @@ public void Write(string what) [ContextMethod("ЗаписатьСтроку", "WriteLine")] public void WriteLine(IBslProcess process, string what, BslValue delimiter = null) { - ThrowIfNotOpened(); - - Write (what); + Write(what); var sDelimiter = _lineDelimiter; if (delimiter != null && delimiter.SystemType != BasicTypes.Undefined) sDelimiter = delimiter.ToString(process); - Write (sDelimiter); + Write(sDelimiter); } public void ThrowIfNotOpened() { if (_writer == null) throw new RuntimeException("Файл не открыт"); - } - + } + public void Dispose() { if (_writer != null) @@ -122,29 +144,122 @@ public void Dispose() _writer.Dispose(); _writer = null; } + + _streamWrapper = null; + } + + private void PrepareForWriting() + { + ThrowIfClosedStream(); + ThrowIfNonWritableStream(); + + if (_writer == null && _streamWrapper != null) + { + _writer = new StreamWriter(_streamWrapper.GetUnderlyingStream(), _encoding, -1, true); + _writer.AutoFlush = true; + } + + ThrowIfNotOpened(); + } + + private void OpenFile(string path, IValue encoding = null, string lineDelimiter = null, bool append = false, string eolReplacement = null) + { + Dispose(); + + _lineDelimiter = lineDelimiter ?? "\n"; + _eolReplacement = eolReplacement ?? "\r\n"; + _encoding = ResolveEncodingForFile(encoding, append); + _streamWrapper = null; + + _writer = new StreamWriter(path, append, _encoding); + _writer.AutoFlush = true; } + private void OpenStream(IStreamWrapper streamWrapper, IValue encoding = null, string lineDelimiter = null, string eolReplacement = null, bool writeBom = false) + { + Dispose(); + + _lineDelimiter = lineDelimiter ?? "\n"; + _eolReplacement = eolReplacement ?? "\r\n"; + _encoding = ResolveEncodingForStream(encoding, writeBom); + _streamWrapper = streamWrapper; + } + + private Encoding ResolveEncodingForFile(IValue encoding, bool append) + { + Encoding enc; + if (encoding == null) + { + enc = new UTF8Encoding(true); + } + else + { + enc = TextEncodingEnum.GetEncoding(encoding); + if (enc.WebName == "utf-8" && append == true) + enc = new UTF8Encoding(false); + } + return enc; + } + + private Encoding ResolveEncodingForStream(IValue encoding, bool writeBom) + { + if (encoding == null) + { + return new UTF8Encoding(writeBom); + } + else + { + return TextEncodingEnum.GetEncoding(encoding, writeBom); + } + } + + private void ThrowIfClosedStream() + { + if (_streamWrapper != null) + { + var stream = _streamWrapper.GetUnderlyingStream(); + if (stream is { CanWrite: false, CanRead: false }) + throw RuntimeException.ClosedStream(); + } + } + + private void ThrowIfNonWritableStream() + { + if (_streamWrapper != null && _streamWrapper.IsReadOnly) + throw RuntimeException.NonWritableStream(); + } + /// - /// Создает объект с начальными значениями имени файла и кодировки. + /// Создает объект для записи текста в файл или поток. /// - /// Имя файла - /// Кодировка в виде строки - /// Символ - разделитель строк - /// Признак добавления в конец файла (необязательный) - /// Разделитель строк в файле (необязательный). + /// Имя файла или поток, в который будет выполнена запись. + /// Кодировка (необязательный). По умолчанию используется utf-8 + /// + /// Определяет строку, разделяющую строки в файле/потоке (необязательный). + /// Значение по умолчанию: ПС. + /// + /// Для файла: + /// Признак добавления в конец файла (необязательный). + /// Значение по умолчанию: Ложь. + /// Для потока: + /// Определяет разделение строк в потоке для конвертации в стандартный перевод строк ПС (необязательный). + /// Значение по умолчанию: ВК + ПС. + /// + /// Для файла: + /// Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС (необязательный). + /// Значение по умолчанию: ВК + ПС. + /// Для потока: + /// Если в начало потока требуется записать метку порядка байтов (BOM) для используемой кодировки текста, + /// то данный параметр должен иметь значение Истина. + /// Значение по умолчанию: Ложь. [ScriptConstructor(Name = "По имени файла")] - public static TextWriteImpl Constructor(string path, IValue encoding = null, string lineDelimiter = null, bool append = false, string eolReplacement = null) + public static TextWriteImpl Constructor(IValue fileOrStream, IValue encoding = null, string lineDelimiter = null, IValue param4 = null, IValue param5 = null) { var result = new TextWriteImpl(); - - string sLineDelimiter = lineDelimiter ?? "\n"; - string sEolReplacement = eolReplacement ?? "\r\n"; - - result.Open (path, encoding, sLineDelimiter, append, sEolReplacement); - + result.Open(fileOrStream, encoding, lineDelimiter, param4, param5); return result; } - + [ScriptConstructor(Name = "Формирование неинициализированного объекта")] public static TextWriteImpl Constructor() { @@ -152,4 +267,4 @@ public static TextWriteImpl Constructor() } } -} +} \ No newline at end of file diff --git a/tests/text-write.os b/tests/text-write.os index 665730312..f050e067e 100644 --- a/tests/text-write.os +++ b/tests/text-write.os @@ -6,6 +6,7 @@ ВсеТесты = Новый Массив; + // Работа с файлом ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартно"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартноСПеречислениемКодировкаТекста"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСПеречислениемКодировкаТекста"); @@ -13,11 +14,24 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНеоткрытыйФайлБросаетПравильноеИсключениеВМетодеЗаписатьСтроку"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетКонструкторПоИмениФайлаСНезаполненнымиНеобязательнымиПолями"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоЗаписьСтрокиВФайлПроисходитСразуБезКеширования"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуРазделителей"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей1"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей2"); ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей3"); ВсеТесты.Добавить("ТестДолжен_ПрочитатьИзФайлаСРазнымиПереводамиСтрок"); + + // Работа с потоком + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокПамяти"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокСКодировкой"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокСМеткойBOM"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьУстановкуПотокаДляЗаписи"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКонструкторНеБроситИсключениеДляЗакрытогоПотока"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНеоткрытыйПотокПриЗаписиБросаетПравильноеИсключение"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПотокДляЧтенияПриЗаписиБросаетПравильноеИсключение"); + + // Работа с файлом и потоком + ВсеТесты.Добавить("ТестДолжен_ПроверитьПереоткрытиеСФайлаНаПоток"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПереоткрытиеСПотокаНаФайл"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуРазделителей"); Возврат ВсеТесты; @@ -172,55 +186,6 @@ КонецПроцедуры -Функция ЭкранироватьПереносыСтрок(Знач Строка1) - - Возврат СтрЗаменить(СтрЗаменить(Строка1, Символы.ПС, ""), Символы.ВК, ""); - -КонецФункции - -Процедура ПодробноеСравнениеСтрок(Знач Строка1, Знач Строка2, Знач ТекстСообщения) - - Если Строка1 = Строка2 Тогда - Возврат; - КонецЕсли; - - Строка1 = ЭкранироватьПереносыСтрок(Строка1); - Строка2 = ЭкранироватьПереносыСтрок(Строка2); - - юТест.ПроверитьРавенство(Строка1, Строка2, ТекстСообщения); - -КонецПроцедуры - -Процедура ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(Знач Текст, Знач РазделительСтрокВФайле, Знач НаименованиеТеста) - - ИмяФайла = ПолучитьИмяВременногоФайла("txt"); - Запись = Новый ЗаписьТекста; - Запись.Открыть(ИмяФайла, "UTF-8", Символы.ПС, Ложь, РазделительСтрокВФайле); - Запись.Записать(Текст); - Запись.Закрыть(); - - Чтение = Новый ЧтениеТекста; - Чтение.Открыть(ИмяФайла, "UTF-8", Символы.ПС, РазделительСтрокВФайле); - - ПроверяемыйТекст = Чтение.Прочитать(); - - ПодробноеСравнениеСтрок(ПроверяемыйТекст, Текст, "Не сработало запись-чтение текста (" + НаименованиеТеста + ")"); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьРаботуРазделителей() Экспорт - - ТекстДляПроверки = "1 - |2 - |3" - ; - - ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ПС, "ПС"); - ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК + Символы.ПС, "ВК+ПС"); - ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК, "ВК"); - -КонецПроцедуры - Процедура ТестДолжен_ПроверитьРаботуНеобычныхРазделителей1() Экспорт ИмяФайла = ПолучитьИмяВременногоФайла("txt"); @@ -313,3 +278,255 @@ юТест.ПроверитьРавенство(125, СтрДлина(Стр)); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокПамяти() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + + // Когда + ЗаписьТекста = Новый ЗаписьТекста(Поток); + ЗаписьТекста.Записать("Привет"); + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекста = Новый ЧтениеТекста(Поток); + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекста.ПрочитатьСтроку(), "Привет"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокСКодировкой() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + + // Когда + ЗаписьТекста = Новый ЗаписьТекста(Поток, "windows-1251"); + ЗаписьТекста.Записать("Привет"); + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекста = Новый ЧтениеТекста(Поток, "windows-1251"); + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекста.ПрочитатьСтроку(), "Привет"); + юТест.ПроверитьРавенство(Поток.Размер(), 6); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьВПотокСМеткойBOM() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + + // Когда + ЗаписьТекста = Новый ЗаписьТекста(Поток, , , , Истина); + ЗаписьТекста.Записать("Привет"); + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекста = Новый ЧтениеТекста(Поток); + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекста.ПрочитатьСтроку(), "Привет"); + юТест.ПроверитьРавенство(Поток.Размер(), 15); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьУстановкуПотокаДляЗаписи() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + ЗаписьТекста = Новый ЗаписьТекста(); + + // Когда + ЗаписьТекста.Открыть(Поток); + ЗаписьТекста.Записать("Привет"); + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекста = Новый ЧтениеТекста(Поток); + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекста.ПрочитатьСтроку(), "Привет"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоКонструкторНеБроситИсключениеДляЗакрытогоПотока() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + Поток.Закрыть(); + + // Когда + ЗаписьТекста = Новый ЗаписьТекста(Поток); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоНеоткрытыйПотокПриЗаписиБросаетПравильноеИсключение() Экспорт + + Сценарий = " + |Поток = Новый ПотокВПамяти(); + |Поток.Закрыть(); + | + |ЗаписьТекста = Новый ЗаписьТекста(Поток); + |ЗаписьТекста.Записать(""Привет"")"; + + юТест.ПроверитьКодСОшибкой(Сценарий, "Ошибка обращения к закрытому потоку"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоПотокДляЧтенияПриЗаписиБросаетПравильноеИсключение() Экспорт + + Сценарий = " + |Поток = Новый ПотокВПамяти(); + |ПотокДляЧтения = Поток.ПолучитьПотокТолькоДляЧтения(); + | + |ЗаписьТекста = Новый ЗаписьТекста(ПотокДляЧтения); + | + |ЗаписьТекста.Записать(""Привет"")"; + + юТест.ПроверитьКодСОшибкой(Сценарий, "Попытка записи в поток не поддерживающий запись"); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПереоткрытиеСФайлаНаПоток() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + ИмяФайла = ПолучитьИмяВременногоФайла("txt"); + ЗаписьТекста = Новый ЗаписьТекста(); + + // Когда + ЗаписьТекста.Открыть(ИмяФайла); + ЗаписьТекста.Записать("Привет1"); + + ЗаписьТекста.Открыть(Поток); + ЗаписьТекста.Записать("Привет2"); + + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекстаИзФайла = Новый ЧтениеТекста(ИмяФайла); + ЧтениеТекстаИзПотока = Новый ЧтениеТекста(Поток); + + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекстаИзФайла.Прочитать(), "Привет1"); + юТест.ПроверитьРавенство(ЧтениеТекстаИзПотока.Прочитать(), "Привет2"); + + ЧтениеТекстаИзФайла.Закрыть(); + УдалитьФайлы(ИмяФайла); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПереоткрытиеСПотокаНаФайл() Экспорт + + // Дано + Поток = Новый ПотокВПамяти(); + ИмяФайла = ПолучитьИмяВременногоФайла("txt"); + ЗаписьТекста = Новый ЗаписьТекста(); + + // Когда + ЗаписьТекста.Открыть(Поток); + ЗаписьТекста.Записать("Привет1"); + + ЗаписьТекста.Открыть(ИмяФайла); + ЗаписьТекста.Записать("Привет2"); + + ЗаписьТекста.Закрыть(); + + // Тогда + ЧтениеТекстаИзФайла = Новый ЧтениеТекста(ИмяФайла); + ЧтениеТекстаИзПотока = Новый ЧтениеТекста(Поток); + + Поток.Перейти(0, ПозицияВПотоке.Начало); + + юТест.ПроверитьРавенство(ЧтениеТекстаИзПотока.Прочитать(), "Привет1"); + юТест.ПроверитьРавенство(ЧтениеТекстаИзФайла.Прочитать(), "Привет2"); + + ЧтениеТекстаИзФайла.Закрыть(); + УдалитьФайлы(ИмяФайла); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРаботуРазделителей() Экспорт + + ТекстДляПроверки = "1 + |2 + |3" + ; + + ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ПС, "ПС"); + ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК + Символы.ПС, "ВК+ПС"); + ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК, "ВК"); + ПроверитьЗаписьТекстаСРазделителемСтрокВПотоке(ТекстДляПроверки, Символы.ПС, "ПС"); + ПроверитьЗаписьТекстаСРазделителемСтрокВПотоке(ТекстДляПроверки, Символы.ВК + Символы.ПС, "ВК+ПС"); + ПроверитьЗаписьТекстаСРазделителемСтрокВПотоке(ТекстДляПроверки, Символы.ВК, "ВК"); + +КонецПроцедуры + +Процедура ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(Знач Текст, Знач РазделительСтрокВФайле, Знач НаименованиеТеста) + + // Дано + ИмяФайла = ПолучитьИмяВременногоФайла("txt"); + Запись = Новый ЗаписьТекста; + + // Когда + Запись.Открыть(ИмяФайла, "UTF-8", Символы.ПС, Ложь, РазделительСтрокВФайле); + Запись.Записать(Текст); + Запись.Закрыть(); + + // Тогда + Чтение = Новый ЧтениеТекста; + Чтение.Открыть(ИмяФайла, "UTF-8", Символы.ПС, РазделительСтрокВФайле); + + ПроверяемыйТекст = Чтение.Прочитать(); + + ПодробноеСравнениеСтрок(ПроверяемыйТекст, Текст, "Не сработало запись-чтение текста в файл (" + НаименованиеТеста + ")"); + +КонецПроцедуры + +Процедура ПроверитьЗаписьТекстаСРазделителемСтрокВПотоке(Знач Текст, Знач РазделительСтрокВФайле, Знач НаименованиеТеста) + + // Дано + Поток = Новый ПотокВПамяти(); + Запись = Новый ЗаписьТекста; + + // Когда + Запись.Открыть(Поток, "UTF-8", Символы.ПС, РазделительСтрокВФайле); + Запись.Записать(Текст); + Запись.Закрыть(); + + // Тогда + Чтение = Новый ЧтениеТекста; + Чтение.Открыть(Поток, "UTF-8", Символы.ПС, РазделительСтрокВФайле); + + Поток.Перейти(0, ПозицияВПотоке.Начало); + + ПроверяемыйТекст = Чтение.Прочитать(); + + ПодробноеСравнениеСтрок(ПроверяемыйТекст, Текст, "Не сработало запись-чтение текста в поток (" + НаименованиеТеста + ")"); + +КонецПроцедуры + +Процедура ПодробноеСравнениеСтрок(Знач Строка1, Знач Строка2, Знач ТекстСообщения) + + Если Строка1 = Строка2 Тогда + Возврат; + КонецЕсли; + + Строка1 = ЭкранироватьПереносыСтрок(Строка1); + Строка2 = ЭкранироватьПереносыСтрок(Строка2); + + юТест.ПроверитьРавенство(Строка1, Строка2, ТекстСообщения); + +КонецПроцедуры + +Функция ЭкранироватьПереносыСтрок(Знач Строка1) + + Возврат СтрЗаменить(СтрЗаменить(Строка1, Символы.ПС, ""), Символы.ВК, ""); + +КонецФункции \ No newline at end of file