Skip to content

Commit 8c8f083

Browse files
committed
СтрНайти сделано совместимо с платформой +тесты
1 parent 49da761 commit 8c8f083

File tree

2 files changed

+82
-13
lines changed

2 files changed

+82
-13
lines changed

src/OneScript.StandardLibrary/StringOperations.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,13 @@ public int StrCompare(string first, string second)
138138
/// <param name="occurance">Указывает номер вхождения искомой подстроки в исходной строке</param>
139139
/// <returns>Позицию искомой строки в исходной строке. Возвращает 0, если подстрока не найдена.</returns>
140140
[ContextMethod("СтрНайти", "StrFind")]
141-
public int StrFind(string haystack, string needle, SearchDirection direction = SearchDirection.FromBegin, int startPos = 0, int occurance = 0)
141+
public int StrFind(string haystack, string needle, SearchDirection direction = SearchDirection.FromBegin, int startPos = 0, int occurance = 1)
142142
{
143+
if (needle.Length == 0)
144+
return 1;
145+
143146
int len = haystack.Length;
144-
if (len == 0 || needle.Length == 0)
147+
if (len == 0)
145148
return 0;
146149

147150
bool fromBegin = direction == SearchDirection.FromBegin;
@@ -150,12 +153,13 @@ public int StrFind(string haystack, string needle, SearchDirection direction = S
150153
{
151154
startPos = fromBegin ? 1 : len;
152155
}
156+
else if (startPos < 1 || startPos > len)
157+
throw RuntimeException.InvalidNthArgumentValue(4);
153158

154-
if (startPos < 1 || startPos > len)
155-
throw RuntimeException.InvalidArgumentValue();
156-
157-
if (occurance == 0)
158-
occurance = 1;
159+
if (occurance < 0)
160+
return 0;
161+
else if (occurance == 0)
162+
throw RuntimeException.InvalidNthArgumentValue(5);
159163

160164
int startIndex = startPos - 1;
161165
int foundTimes = 0;
@@ -174,7 +178,6 @@ public int StrFind(string haystack, string needle, SearchDirection direction = S
174178
if (startIndex >= len)
175179
break;
176180
}
177-
178181
}
179182
else
180183
{
@@ -189,13 +192,9 @@ public int StrFind(string haystack, string needle, SearchDirection direction = S
189192
if (startIndex < 0)
190193
break;
191194
}
192-
193195
}
194196

195-
if (foundTimes == occurance)
196-
return index + 1;
197-
else
198-
return 0;
197+
return foundTimes == occurance ? index + 1 : 0;
199198
}
200199

201200
/// <summary>

tests/stringoperations.os

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@
4848
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_ВтороеВхождениеСНачала");
4949
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_ВтороеВхождениеСКонца");
5050
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_ВтороеВхождениеСКонцаНачинаяСПредпоследнегоСимвола");
51+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СПустойСтрокой");
52+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СПустойПодстрокойПоиска");
53+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СПропущеннымиСтроками");
54+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СНевернойНачальнойПозицией");
55+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СНулевымЧисломВхождений");
56+
ВсеТесты.Добавить("ТестДолжен_ВызватьМетод_СтрНайти_СОтрицательнымЧисломВхождений");
57+
5158
ВсеТесты.Добавить("Тест_ДолженПроверитьНСтрВозвращаетПервуюСтроку");
5259
ВсеТесты.Добавить("ТестДолжен_Проверить_Что_НСТР_С_СуществующимПараметром_ВозвращаетНужнуюСтроку");
5360
ВсеТесты.Добавить("ТестДолжен_Проверить_Что_НСТР_С_НесуществующимПараметром_ВозвращаетПустуюСтроку");
@@ -459,6 +466,69 @@
459466

460467
КонецПроцедуры
461468

469+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СПустойСтрокой() Экспорт
470+
471+
ГдеИщем = "";
472+
ЧтоИщем = ",";
473+
474+
юТест.ПроверитьРавенство(0, СтрНайти(ГдеИщем, ЧтоИщем));
475+
476+
КонецПроцедуры
477+
478+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СПустойПодстрокойПоиска() Экспорт
479+
480+
ГдеИщем = "Один,Два,Три,";
481+
ЧтоИщем = "";
482+
483+
юТест.ПроверитьРавенство(1, СтрНайти(ГдеИщем, ЧтоИщем));
484+
485+
КонецПроцедуры
486+
487+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СПропущеннымиСтроками() Экспорт
488+
юТест.ПроверитьРавенство(1, СтрНайти(,));
489+
КонецПроцедуры
490+
491+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СНевернойНачальнойПозицией() Экспорт
492+
493+
ГдеИщем = "Один,Два,Три,";
494+
ЧтоИщем = ",";
495+
496+
Попытка
497+
СтрНайти(ГдеИщем, ЧтоИщем, , 999);
498+
Исключение
499+
юТест.ТестПройден();
500+
Возврат;
501+
КонецПопытки;
502+
503+
юТест.ТестПровален("Ожидаемое исключение не возникло.");
504+
505+
КонецПроцедуры
506+
507+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СНулевымЧисломВхождений() Экспорт
508+
509+
ГдеИщем = "Один,Два,Три,";
510+
ЧтоИщем = ",";
511+
512+
Попытка
513+
СтрНайти(ГдеИщем, ЧтоИщем,,, 0);
514+
Исключение
515+
юТест.ТестПройден();
516+
Возврат;
517+
КонецПопытки;
518+
519+
юТест.ТестПровален("Ожидаемое исключение не возникло.");
520+
521+
КонецПроцедуры
522+
523+
Процедура ТестДолжен_ВызватьМетод_СтрНайти_СОтрицательнымЧисломВхождений() Экспорт
524+
525+
ГдеИщем = "Один,Два,Три,";
526+
ЧтоИщем = ",";
527+
528+
юТест.ПроверитьРавенство(0, СтрНайти(ГдеИщем, ЧтоИщем,,, -2));
529+
530+
КонецПроцедуры
531+
462532
Процедура Тест_ДолженПроверитьНСтрВозвращаетПервуюСтроку() Экспорт
463533

464534
Стр = НСтр("ru = 'Строка1'; en = 'Строка2'", "ru");

0 commit comments

Comments
 (0)