Skip to content

Commit

Permalink
исправлены ФП
Browse files Browse the repository at this point in the history
  • Loading branch information
artbear committed Dec 14, 2023
1 parent 76ddd28 commit 473c87b
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ public class MagicDateDiagnostic extends AbstractVisitorDiagnostic {
);

private static final Pattern paramPattern = CaseInsensitivePattern.compile(
"\"\\d{8}.*"
"\"[0123]{1}\\d{7}\"|\"[0123]{1}\\d{13}\""
);
private static final Pattern zeroPattern = Pattern.compile("^0+");

private static final Pattern nonNumberPattern = CaseInsensitivePattern.compile(
"\\D"
Expand Down Expand Up @@ -109,6 +110,43 @@ private static boolean insideAssignmentWithDateMethodForSimpleDate(Optional<BSLP
.isPresent();
}

private static boolean isValidDate(BSLParser.StringContext ctx) {
final var text = ctx.getText();
if (!paramPattern.matcher(text).matches()) {
return false;
}
var strDate = text.substring(1, text.length() - 1); // убрать кавычки
return isValidDate(strDate);
}

private static boolean isValidDate(String strDate) {
var year = parseInt(strDate.substring(0, 4));
if (year < 1 || year > 3999) {
return false;
}
var month = parseInt(strDate.substring(4, 6));
var day = parseInt(strDate.substring(6, 8));
if (month < 1 || month > 12 || day < 1 || day > 31) {
return false;
}
if (strDate.length() == 8) {
return true;
}
var hh = parseInt(strDate.substring(8, 10));
var mm = parseInt(strDate.substring(10, 12));
var ss = parseInt(strDate.substring(12, 14));
return hh <= 24 && mm <= 60 && ss <= 60;
}

private static int parseInt(String text) {
String s = zeroPattern.matcher(text).replaceAll("");
try {
return Integer.parseInt(s);
} catch (NumberFormatException e) {
return 0;
}
}

@Override
public void configure(Map<String, Object> configuration) {
var authorizedDatesString = (String) configuration.getOrDefault("authorizedDates", DEFAULT_AUTHORIZED_DATES);
Expand All @@ -124,7 +162,7 @@ public ParseTree visitConstValue(BSLParser.ConstValueContext ctx) {
var tNode = ctx.DATETIME();
var sNode = ctx.string();
if ((tNode != null || sNode != null) && isAccepted(ctx)) {
if (sNode != null && !paramPattern.matcher(ctx.getText()).matches()) {
if (sNode != null && !isValidDate(sNode)) {
return defaultResult();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,21 @@ void test() {

List<Diagnostic> diagnostics = getDiagnostics();

assertThat(diagnostics).hasSize(12);
assertThat(diagnostics).hasSize(13);
assertThat(diagnostics, true)
.hasRange(1, 12, 22)
.hasRange(2, 12, 28)
.hasRange(3, 7, 17)
.hasRange(4, 14, 24)
.hasRange(13, 7, 26)
.hasRange(15, 87, 97)
.hasRange(16, 80, 90)
.hasRange(16, 92, 102)
.hasRange(17, 22, 32)
.hasRange(18, 19, 35)
.hasRange(19, 10, 26)
.hasRange(19, 29, 39);
.hasRange(11, 12, 22)
.hasRange(12, 12, 28)
.hasRange(13, 7, 17)
.hasRange(14, 14, 24)
.hasRange(23, 7, 26)
.hasRange(25, 87, 97)
.hasRange(26, 80, 90)
.hasRange(26, 92, 102)
.hasRange(27, 22, 32)
.hasRange(28, 19, 35)
.hasRange(29, 10, 26)
.hasRange(29, 29, 39)
.hasRange(31, 64, 80);

}

Expand All @@ -67,12 +68,11 @@ void testConfigure() {

assertThat(diagnostics).hasSize(5);
assertThat(diagnostics, true)
.hasRange(2, 12, 28)
.hasRange(3, 7, 17)
.hasRange(13, 7, 26)
.hasRange(13, 7, 26)
.hasRange(17, 22, 32)
.hasRange(19, 29, 39);
.hasRange(12, 12, 28)
.hasRange(13, 7, 17)
.hasRange(23, 7, 26)
.hasRange(27, 22, 32)
.hasRange(29, 29, 39);

}
}
40 changes: 39 additions & 1 deletion src/test/resources/diagnostics/MagicDateDiagnostic.bsl
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
Функция МаксимальнаяДата() Экспорт
//Возврат '39991231235959'; // TODO
КонецФункции

Функция МаксимальнаяДатаПриПродолжении()
//Возврат '39990101000000'; // TODO
КонецФункции

Процедура Тест3()

День = Дата("00020101");
День = Дата("00020101") + Шаг; // ошибка
День = Дата("00020101121314") + Шаг; // ошибка
Expand All @@ -19,7 +29,35 @@
Настройки.Свойство("00020501121314", ЗначениеЕдиничногоПараметра); // замечание
Выполнить("00020501121314" + '12350101'); // замечание

ОтборЭлемента.ПравоеЗначение = Новый СтандартнаяДатаНачала(Дата('19800101000000'));

Значение = Метод("%1/%2");
Если Условие Тогда
ВызватьИсключение "Не указано значение константы ХХХ";
КонецЕсли;
КонецЕсли;

УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
ПосторонниеСимволы = СтрСоединить(СтрРазделить(СтрокаСЧислом, "0123456789", Ложь), "");
Объект.GetStringValue("2147483649","Software\Buhphone","ProgramPath", Значение);
НедопустимыеСимволы = НедопустимыеСимволыВСтроке(СтрАдрес.АдресСервера,
"0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ_-.:*?");
НедопустимыеСимволы = НедопустимыеСимволы + "1234567890 ";

Дата = Метод("04937803-5dba-11df-a1d4-005056c00008");
Набор.Идентификатор = Новый УникальныйИдентификатор("70425541-23e3-4e5a-8bd3-9587cc949dfa");

НецифровыеСимволы = СтрСоединить(СтрРазделить(Значение, "1234567890,."));
Результат = Сред("0123456789abcdef", ОстатокОтДеления + 1, 1) + Результат;

Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'")));
КодСтроки = КодРодителя + Прав("00000000" + Формат(Счетчик, "ЧГ="), ЧислоЦифр);
КлючНаборовСвойств = НачалоКлюча + Лев(КлючНазначения + "00000000000000000000000000000000", 32);

КодыКЛАДР.Регион = Лев(КодКЛАДР, 2) + "00000000000";
КодыКЛАДР.Район = Лев(КодКЛАДР, 5) + "00000000";

//'39990202'
//'39991231235959'
//'39990101000000'

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

0 comments on commit 473c87b

Please sign in to comment.