From 24324fba67abb1648a49eef2525f03d51f7ae4e5 Mon Sep 17 00:00:00 2001 From: Mr-Rm Date: Tue, 4 Feb 2025 17:47:20 +0400 Subject: [PATCH 1/3] =?UTF-8?q?fix#1500:=20=D1=81=D1=82=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Values/IValue.cs | 5 +++++ src/OneScript.StandardLibrary/Collections/ArrayImpl.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/OneScript.Core/Values/IValue.cs b/src/OneScript.Core/Values/IValue.cs index d5cb8bc59..a694b7e81 100644 --- a/src/OneScript.Core/Values/IValue.cs +++ b/src/OneScript.Core/Values/IValue.cs @@ -18,4 +18,9 @@ public interface IValue : IComparable, IEquatable IValue GetRawValue(); } + public static class IValueExtension + { + public static bool StrictEquals(this IValue value, IValue other) + => value.Equals(other) && value.SystemType == other.SystemType; + } } \ No newline at end of file diff --git a/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs b/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs index b9a6fcf76..7d6f7b29d 100644 --- a/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/ArrayImpl.cs @@ -113,7 +113,7 @@ public void Insert(int index, IValue value = null) [ContextMethod("Найти", "Find")] public IValue Find(IValue what) { - var idx = _values.FindIndex(x => x.Equals(what)); + var idx = _values.FindIndex(x => x.StrictEquals(what)); if(idx < 0) { return ValueFactory.Create(); From aea47c5ce06eddd00ae719761d819780f2597bdf Mon Sep 17 00:00:00 2001 From: Mr-Rm Date: Thu, 6 Feb 2025 15:59:38 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=BA=20#1500:=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D0=B5=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=D1=8F=D1=85=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20+=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Collections/ValueList/ValueListImpl.cs | 2 +- .../Collections/ValueTable/ValueTable.cs | 4 +- .../ValueTree/ValueTreeRowCollection.cs | 4 +- tests/find-in-collections.os | 221 ++++++++++++++++++ 4 files changed, 226 insertions(+), 5 deletions(-) create mode 100644 tests/find-in-collections.os diff --git a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs index c30aacc11..b360718e3 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs @@ -182,7 +182,7 @@ public int IndexOf(ValueListItem item) [ContextMethod("НайтиПоЗначению", "FindByValue")] public IValue FindByValue(IValue val) { - var item = _items.FirstOrDefault(x => x.Value.Equals(val)); + var item = _items.FirstOrDefault(x => x.Value.StrictEquals(val)); if(item == null) return ValueFactory.Create(); diff --git a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs index fc835be0b..f0be6aa91 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs @@ -258,7 +258,7 @@ public IValue Find(IValue value, string columnNames = null) foreach (var col in processing_list) { var current = row.Get(col); - if (value.Equals(current)) + if (value.StrictEquals(current)) return row; } } @@ -274,7 +274,7 @@ private bool CheckFilterCriteria(ValueTableRow Row, StructureImpl Filter) throw WrongColumnNameException(kv.Key.AsString()); IValue current = Row.Get(Column); - if (!current.Equals(kv.Value)) + if (!current.StrictEquals(kv.Value)) return false; } return true; diff --git a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs index bcacce1d5..6a39f7e95 100644 --- a/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs +++ b/src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs @@ -224,7 +224,7 @@ public IValue Find(IValue value, string columnNames = null, bool includeChildren foreach (ValueTreeColumn col in processingList) { IValue current = row.Get(col); - if (value.Equals(current)) + if (value.StrictEquals(current)) return row; } if (includeChildren) @@ -248,7 +248,7 @@ private bool CheckFilterCriteria(ValueTreeRow row, StructureImpl filter) throw PropertyAccessException.PropNotFoundException(kv.Key.AsString()); IValue current = row.Get(column); - if (!current.Equals(kv.Value)) + if (!current.StrictEquals(kv.Value)) return false; } return true; diff --git a/tests/find-in-collections.os b/tests/find-in-collections.os new file mode 100644 index 000000000..2fee1d27f --- /dev/null +++ b/tests/find-in-collections.os @@ -0,0 +1,221 @@ +Перем юТест; + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВМассиве"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВМассиве"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВФиксированномМассиве"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВФиксированномМассиве"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСпискеЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСпискеЗначений"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВТаблицеЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВТаблицеЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахТаблицыЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахТаблицыЗначений"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВДеревеЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВДеревеЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахДереваЗначений"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахДереваЗначений"); + + Возврат ВсеТесты; +КонецФункции + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВМассиве() Экспорт + Массив = Новый Массив; + Массив.Добавить(0); + Массив.Добавить(1); + ЕстьИстина = Массив.Найти(Истина) <> Неопределено; + ЕстьЛожь = Массив.Найти(Ложь) <> Неопределено; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВМассиве() Экспорт + Массив = Новый Массив; + Массив.Добавить(Ложь); + Массив.Добавить(Истина); + Есть1 = Массив.Найти(1) <> Неопределено; + Есть0 = Массив.Найти(0) <> Неопределено; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВФиксированномМассиве() Экспорт + Массив = Новый Массив; + Массив.Добавить(0); + Массив.Добавить(1); + ФиксированныйМассив = Новый ФиксированныйМассив(Массив); + ЕстьИстина = ФиксированныйМассив.Найти(Истина) <> Неопределено; + ЕстьЛожь = ФиксированныйМассив.Найти(Ложь) <> Неопределено; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВФиксированномМассиве() Экспорт + Массив = Новый Массив; + Массив.Добавить(Ложь); + Массив.Добавить(Истина); + ФиксированныйМассив = Новый ФиксированныйМассив(Массив); + Есть1 = ФиксированныйМассив.Найти(1) <> Неопределено; + Есть0 = ФиксированныйМассив.Найти(0) <> Неопределено; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСпискеЗначений() Экспорт + СписокЗначений = Новый СписокЗначений(); + СписокЗначений.Добавить(1); + СписокЗначений.Добавить(0); + ЕстьИстина = СписокЗначений.НайтиПоЗначению(Истина) <> Неопределено; + ЕстьЛожь = СписокЗначений.НайтиПоЗначению(Ложь) <> Неопределено; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСпискеЗначений() Экспорт + СписокЗначений = Новый СписокЗначений(); + СписокЗначений.Добавить(Истина); + СписокЗначений.Добавить(Ложь); + Есть1 = СписокЗначений.НайтиПоЗначению(1) <> Неопределено; + Есть0 = СписокЗначений.НайтиПоЗначению(0) <> Неопределено; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВТаблицеЗначений() Экспорт + ТаблицаЗначений = Новый ТаблицаЗначений(); + ТаблицаЗначений.Колонки.Добавить("Кол1"); + ТаблицаЗначений.Колонки.Добавить("Кол2"); + Строка1 = ТаблицаЗначений.Добавить(); + Строка2 = ТаблицаЗначений.Добавить(); + Строка1.Кол1 = 1; + Строка1.Кол2 = 0; + Строка2.Кол1 = 0; + Строка2.Кол2 = 1; + ЕстьИстина = ТаблицаЗначений.Найти(Истина) <> Неопределено; + ЕстьЛожь = ТаблицаЗначений.Найти(Ложь) <> Неопределено; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВТаблицеЗначений() Экспорт + ТаблицаЗначений = Новый ТаблицаЗначений(); + ТаблицаЗначений.Колонки.Добавить("Кол1"); + ТаблицаЗначений.Колонки.Добавить("Кол2"); + Строка1 = ТаблицаЗначений.Добавить(); + Строка2 = ТаблицаЗначений.Добавить(); + Строка1.Кол1 = Истина; + Строка1.Кол2 = Ложь; + Строка2.Кол1 = Ложь; + Строка2.Кол2 = Истина; + Есть1 = ТаблицаЗначений.Найти(1) <> Неопределено; + Есть0 = ТаблицаЗначений.Найти(0) <> Неопределено; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахТаблицыЗначений() Экспорт + ТаблицаЗначений = Новый ТаблицаЗначений(); + ТаблицаЗначений.Колонки.Добавить("Кол1"); + ТаблицаЗначений.Колонки.Добавить("Кол2"); + Строка1 = ТаблицаЗначений.Добавить(); + Строка2 = ТаблицаЗначений.Добавить(); + Строка1.Кол1 = 1; + Строка1.Кол2 = 0; + Строка2.Кол1 = 0; + Строка2.Кол2 = 1; + ЕстьИстина = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", Истина) ).Количество() > 0; + ЕстьЛожь = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", Ложь) ).Количество() > 0; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахТаблицыЗначений() Экспорт + ТаблицаЗначений = Новый ТаблицаЗначений(); + ТаблицаЗначений.Колонки.Добавить("Кол1"); + ТаблицаЗначений.Колонки.Добавить("Кол2"); + Строка1 = ТаблицаЗначений.Добавить(); + Строка2 = ТаблицаЗначений.Добавить(); + Строка1.Кол1 = Истина; + Строка1.Кол2 = Ложь; + Строка2.Кол1 = Ложь; + Строка2.Кол2 = Истина; + Есть1 = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", 1) ).Количество() > 0; + Есть0 = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", 0) ).Количество() > 0; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВДеревеЗначений() Экспорт + ДеревоЗначений = Новый ДеревоЗначений(); + ДеревоЗначений.Колонки.Добавить("Кол1"); + ДеревоЗначений.Колонки.Добавить("Кол2"); + Строка1 = ДеревоЗначений.Строки.Добавить(); + Строка2 = ДеревоЗначений.Строки.Добавить(); + Строка1.Кол1 = 1; + Строка1.Кол2 = 0; + Строка2.Кол1 = 0; + Строка2.Кол2 = 1; + ЕстьИстина = ДеревоЗначений.Строки.Найти(Истина) <> Неопределено; + ЕстьЛожь = ДеревоЗначений.Строки.Найти(Ложь) <> Неопределено; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВДеревеЗначений() Экспорт + ДеревоЗначений = Новый ДеревоЗначений(); + ДеревоЗначений.Колонки.Добавить("Кол1"); + ДеревоЗначений.Колонки.Добавить("Кол2"); + Строка1 = ДеревоЗначений.Строки.Добавить(); + Строка2 = ДеревоЗначений.Строки.Добавить(); + Строка1.Кол1 = Истина; + Строка1.Кол2 = Ложь; + Строка2.Кол1 = Ложь; + Строка2.Кол2 = Истина; + Есть1 = ДеревоЗначений.Строки.Найти(1) <> Неопределено; + Есть0 = ДеревоЗначений.Строки.Найти(0) <> Неопределено; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахДереваЗначений() Экспорт + ДеревоЗначений = Новый ДеревоЗначений(); + ДеревоЗначений.Колонки.Добавить("Кол1"); + ДеревоЗначений.Колонки.Добавить("Кол2"); + Строка1 = ДеревоЗначений.Строки.Добавить(); + Строка2 = ДеревоЗначений.Строки.Добавить(); + Строка1.Кол1 = 1; + Строка1.Кол2 = 0; + Строка2.Кол1 = 0; + Строка2.Кол2 = 1; + ЕстьИстина = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", Истина) ).Количество() > 0; + ЕстьЛожь = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", Ложь) ).Количество() > 0; + юТест.ПроверитьЛожь( ЕстьИстина ); + юТест.ПроверитьЛожь( ЕстьЛожь ); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахДереваЗначений() Экспорт + ДеревоЗначений = Новый ДеревоЗначений(); + ДеревоЗначений.Колонки.Добавить("Кол1"); + ДеревоЗначений.Колонки.Добавить("Кол2"); + Строка1 = ДеревоЗначений.Строки.Добавить(); + Строка2 = ДеревоЗначений.Строки.Добавить(); + Строка1.Кол1 = Истина; + Строка1.Кол2 = Ложь; + Строка2.Кол1 = Ложь; + Строка2.Кол2 = Истина; + Есть1 = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", 1) ).Количество() > 0; + Есть0 = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", 0) ).Количество() > 0; + юТест.ПроверитьЛожь( Есть1 ); + юТест.ПроверитьЛожь( Есть0 ); +КонецПроцедуры From e8547d8ba11686966ff6b91283b23182858853b1 Mon Sep 17 00:00:00 2001 From: Mr-Rm Date: Thu, 6 Feb 2025 16:30:02 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D1=83=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1=D1=83=D0=BB?= =?UTF-8?q?=D0=B5=D0=B2=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Core/Values/BslBooleanValue.cs | 14 +++++---- src/Tests/OneScript.Core.Tests/ValuesTest.cs | 31 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/OneScript.Core/Values/BslBooleanValue.cs b/src/OneScript.Core/Values/BslBooleanValue.cs index e852331b0..8adecc2d9 100644 --- a/src/OneScript.Core/Values/BslBooleanValue.cs +++ b/src/OneScript.Core/Values/BslBooleanValue.cs @@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the using OneScript.Exceptions; using OneScript.Localization; using OneScript.Types; +using ScriptEngine.Machine; namespace OneScript.Values { @@ -57,12 +58,15 @@ public override string ToString() public override bool Equals(BslValue other) { - if (ReferenceEquals(null, other)) - return false; - if (ReferenceEquals(this, other)) - return true; + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; - return false; + return other switch + { + BslNumericValue num => num == ((decimal)this), + BslBooleanValue boolean => _flag == boolean._flag, + _ => false + }; } public override int CompareTo(BslValue other) diff --git a/src/Tests/OneScript.Core.Tests/ValuesTest.cs b/src/Tests/OneScript.Core.Tests/ValuesTest.cs index 3848db782..1fafcc442 100644 --- a/src/Tests/OneScript.Core.Tests/ValuesTest.cs +++ b/src/Tests/OneScript.Core.Tests/ValuesTest.cs @@ -201,6 +201,37 @@ public void String_To_String_Comparison() str1.CompareTo(ValueFactory.Create("абв")).Should().BeGreaterThan(0); } + [Fact] + public void Boolean_Equality() + { + var bool1 = ValueFactory.Create(true); + var bool0 = ValueFactory.Create(false); + var num1 = ValueFactory.Create(1); + var num0 = ValueFactory.Create(0); + var num2 = ValueFactory.Create(2); + + Assert.True(bool0.Equals(bool0)); + Assert.True(bool1.Equals(bool1)); + Assert.False(bool0.Equals(bool1)); + Assert.False(bool1.Equals(bool0)); + + Assert.True(bool0.Equals(num0)); + Assert.True(bool1.Equals(num1)); + Assert.False(bool0.Equals(num1)); + Assert.False(bool1.Equals(num0)); + + Assert.False(bool0.Equals(num2)); + Assert.False(bool1.Equals(num2)); + + Assert.True(num0.Equals(bool0)); + Assert.True(num1.Equals(bool1)); + Assert.False(num0.Equals(bool1)); + Assert.False(num1.Equals(bool0)); + + Assert.False(num2.Equals(bool1)); + Assert.False(num2.Equals(bool0)); + } + [Fact] public void Boolean_Comparison() {