Skip to content

Commit 75050e7

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents 2902327 + 44e0188 commit 75050e7

File tree

8 files changed

+272
-11
lines changed

8 files changed

+272
-11
lines changed

src/OneScript.Core/Values/BslBooleanValue.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ This Source Code Form is subject to the terms of the
99
using OneScript.Exceptions;
1010
using OneScript.Localization;
1111
using OneScript.Types;
12+
using ScriptEngine.Machine;
1213

1314
namespace OneScript.Values
1415
{
@@ -57,12 +58,15 @@ public override string ToString()
5758

5859
public override bool Equals(BslValue other)
5960
{
60-
if (ReferenceEquals(null, other))
61-
return false;
62-
if (ReferenceEquals(this, other))
63-
return true;
61+
if (other is null) return false;
62+
if (ReferenceEquals(this, other)) return true;
6463

65-
return false;
64+
return other switch
65+
{
66+
BslNumericValue num => num == ((decimal)this),
67+
BslBooleanValue boolean => _flag == boolean._flag,
68+
_ => false
69+
};
6670
}
6771

6872
public override int CompareTo(BslValue other)

src/OneScript.Core/Values/IValue.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,9 @@ public interface IValue : IComparable<IValue>, IEquatable<IValue>
1818
IValue GetRawValue();
1919
}
2020

21+
public static class IValueExtension
22+
{
23+
public static bool StrictEquals(this IValue value, IValue other)
24+
=> value.Equals(other) && value.SystemType == other.SystemType;
25+
}
2126
}

src/OneScript.StandardLibrary/Collections/ArrayImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void Insert(int index, IValue value = null)
113113
[ContextMethod("Найти", "Find")]
114114
public IValue Find(IValue what)
115115
{
116-
var idx = _values.FindIndex(x => x.Equals(what));
116+
var idx = _values.FindIndex(x => x.StrictEquals(what));
117117
if(idx < 0)
118118
{
119119
return ValueFactory.Create();

src/OneScript.StandardLibrary/Collections/ValueList/ValueListImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public int IndexOf(ValueListItem item)
182182
[ContextMethod("НайтиПоЗначению", "FindByValue")]
183183
public IValue FindByValue(IValue val)
184184
{
185-
var item = _items.FirstOrDefault(x => x.Value.Equals(val));
185+
var item = _items.FirstOrDefault(x => x.Value.StrictEquals(val));
186186
if(item == null)
187187
return ValueFactory.Create();
188188

src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ public IValue Find(IValue value, string columnNames = null)
258258
foreach (var col in processing_list)
259259
{
260260
var current = row.Get(col);
261-
if (value.Equals(current))
261+
if (value.StrictEquals(current))
262262
return row;
263263
}
264264
}
@@ -274,7 +274,7 @@ private bool CheckFilterCriteria(ValueTableRow Row, StructureImpl Filter)
274274
throw WrongColumnNameException(kv.Key.AsString());
275275

276276
IValue current = Row.Get(Column);
277-
if (!current.Equals(kv.Value))
277+
if (!current.StrictEquals(kv.Value))
278278
return false;
279279
}
280280
return true;

src/OneScript.StandardLibrary/Collections/ValueTree/ValueTreeRowCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ public IValue Find(IValue value, string columnNames = null, bool includeChildren
224224
foreach (ValueTreeColumn col in processingList)
225225
{
226226
IValue current = row.Get(col);
227-
if (value.Equals(current))
227+
if (value.StrictEquals(current))
228228
return row;
229229
}
230230
if (includeChildren)
@@ -248,7 +248,7 @@ private bool CheckFilterCriteria(ValueTreeRow row, StructureImpl filter)
248248
throw PropertyAccessException.PropNotFoundException(kv.Key.AsString());
249249

250250
IValue current = row.Get(column);
251-
if (!current.Equals(kv.Value))
251+
if (!current.StrictEquals(kv.Value))
252252
return false;
253253
}
254254
return true;

src/Tests/OneScript.Core.Tests/ValuesTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,37 @@ public void String_To_String_Comparison()
201201
str1.CompareTo(ValueFactory.Create("абв")).Should().BeGreaterThan(0);
202202
}
203203

204+
[Fact]
205+
public void Boolean_Equality()
206+
{
207+
var bool1 = ValueFactory.Create(true);
208+
var bool0 = ValueFactory.Create(false);
209+
var num1 = ValueFactory.Create(1);
210+
var num0 = ValueFactory.Create(0);
211+
var num2 = ValueFactory.Create(2);
212+
213+
Assert.True(bool0.Equals(bool0));
214+
Assert.True(bool1.Equals(bool1));
215+
Assert.False(bool0.Equals(bool1));
216+
Assert.False(bool1.Equals(bool0));
217+
218+
Assert.True(bool0.Equals(num0));
219+
Assert.True(bool1.Equals(num1));
220+
Assert.False(bool0.Equals(num1));
221+
Assert.False(bool1.Equals(num0));
222+
223+
Assert.False(bool0.Equals(num2));
224+
Assert.False(bool1.Equals(num2));
225+
226+
Assert.True(num0.Equals(bool0));
227+
Assert.True(num1.Equals(bool1));
228+
Assert.False(num0.Equals(bool1));
229+
Assert.False(num1.Equals(bool0));
230+
231+
Assert.False(num2.Equals(bool1));
232+
Assert.False(num2.Equals(bool0));
233+
}
234+
204235
[Fact]
205236
public void Boolean_Comparison()
206237
{

tests/find-in-collections.os

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
Перем юТест;
2+
3+
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
4+
юТест = ЮнитТестирование;
5+
6+
ВсеТесты = Новый Массив;
7+
8+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВМассиве");
9+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВМассиве");
10+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВФиксированномМассиве");
11+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВФиксированномМассиве");
12+
13+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСпискеЗначений");
14+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСпискеЗначений");
15+
16+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВТаблицеЗначений");
17+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВТаблицеЗначений");
18+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахТаблицыЗначений");
19+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахТаблицыЗначений");
20+
21+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВДеревеЗначений");
22+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВДеревеЗначений");
23+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахДереваЗначений");
24+
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахДереваЗначений");
25+
26+
Возврат ВсеТесты;
27+
КонецФункции
28+
29+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВМассиве() Экспорт
30+
Массив = Новый Массив;
31+
Массив.Добавить(0);
32+
Массив.Добавить(1);
33+
ЕстьИстина = Массив.Найти(Истина) <> Неопределено;
34+
ЕстьЛожь = Массив.Найти(Ложь) <> Неопределено;
35+
юТест.ПроверитьЛожь( ЕстьИстина );
36+
юТест.ПроверитьЛожь( ЕстьЛожь );
37+
КонецПроцедуры
38+
39+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВМассиве() Экспорт
40+
Массив = Новый Массив;
41+
Массив.Добавить(Ложь);
42+
Массив.Добавить(Истина);
43+
Есть1 = Массив.Найти(1) <> Неопределено;
44+
Есть0 = Массив.Найти(0) <> Неопределено;
45+
юТест.ПроверитьЛожь( Есть1 );
46+
юТест.ПроверитьЛожь( Есть0 );
47+
КонецПроцедуры
48+
49+
50+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВФиксированномМассиве() Экспорт
51+
Массив = Новый Массив;
52+
Массив.Добавить(0);
53+
Массив.Добавить(1);
54+
ФиксированныйМассив = Новый ФиксированныйМассив(Массив);
55+
ЕстьИстина = ФиксированныйМассив.Найти(Истина) <> Неопределено;
56+
ЕстьЛожь = ФиксированныйМассив.Найти(Ложь) <> Неопределено;
57+
юТест.ПроверитьЛожь( ЕстьИстина );
58+
юТест.ПроверитьЛожь( ЕстьЛожь );
59+
КонецПроцедуры
60+
61+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВФиксированномМассиве() Экспорт
62+
Массив = Новый Массив;
63+
Массив.Добавить(Ложь);
64+
Массив.Добавить(Истина);
65+
ФиксированныйМассив = Новый ФиксированныйМассив(Массив);
66+
Есть1 = ФиксированныйМассив.Найти(1) <> Неопределено;
67+
Есть0 = ФиксированныйМассив.Найти(0) <> Неопределено;
68+
юТест.ПроверитьЛожь( Есть1 );
69+
юТест.ПроверитьЛожь( Есть0 );
70+
КонецПроцедуры
71+
72+
73+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСпискеЗначений() Экспорт
74+
СписокЗначений = Новый СписокЗначений();
75+
СписокЗначений.Добавить(1);
76+
СписокЗначений.Добавить(0);
77+
ЕстьИстина = СписокЗначений.НайтиПоЗначению(Истина) <> Неопределено;
78+
ЕстьЛожь = СписокЗначений.НайтиПоЗначению(Ложь) <> Неопределено;
79+
юТест.ПроверитьЛожь( ЕстьИстина );
80+
юТест.ПроверитьЛожь( ЕстьЛожь );
81+
КонецПроцедуры
82+
83+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСпискеЗначений() Экспорт
84+
СписокЗначений = Новый СписокЗначений();
85+
СписокЗначений.Добавить(Истина);
86+
СписокЗначений.Добавить(Ложь);
87+
Есть1 = СписокЗначений.НайтиПоЗначению(1) <> Неопределено;
88+
Есть0 = СписокЗначений.НайтиПоЗначению(0) <> Неопределено;
89+
юТест.ПроверитьЛожь( Есть1 );
90+
юТест.ПроверитьЛожь( Есть0 );
91+
КонецПроцедуры
92+
93+
94+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВТаблицеЗначений() Экспорт
95+
ТаблицаЗначений = Новый ТаблицаЗначений();
96+
ТаблицаЗначений.Колонки.Добавить("Кол1");
97+
ТаблицаЗначений.Колонки.Добавить("Кол2");
98+
Строка1 = ТаблицаЗначений.Добавить();
99+
Строка2 = ТаблицаЗначений.Добавить();
100+
Строка1.Кол1 = 1;
101+
Строка1.Кол2 = 0;
102+
Строка2.Кол1 = 0;
103+
Строка2.Кол2 = 1;
104+
ЕстьИстина = ТаблицаЗначений.Найти(Истина) <> Неопределено;
105+
ЕстьЛожь = ТаблицаЗначений.Найти(Ложь) <> Неопределено;
106+
юТест.ПроверитьЛожь( ЕстьИстина );
107+
юТест.ПроверитьЛожь( ЕстьЛожь );
108+
КонецПроцедуры
109+
110+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВТаблицеЗначений() Экспорт
111+
ТаблицаЗначений = Новый ТаблицаЗначений();
112+
ТаблицаЗначений.Колонки.Добавить("Кол1");
113+
ТаблицаЗначений.Колонки.Добавить("Кол2");
114+
Строка1 = ТаблицаЗначений.Добавить();
115+
Строка2 = ТаблицаЗначений.Добавить();
116+
Строка1.Кол1 = Истина;
117+
Строка1.Кол2 = Ложь;
118+
Строка2.Кол1 = Ложь;
119+
Строка2.Кол2 = Истина;
120+
Есть1 = ТаблицаЗначений.Найти(1) <> Неопределено;
121+
Есть0 = ТаблицаЗначений.Найти(0) <> Неопределено;
122+
юТест.ПроверитьЛожь( Есть1 );
123+
юТест.ПроверитьЛожь( Есть0 );
124+
КонецПроцедуры
125+
126+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахТаблицыЗначений() Экспорт
127+
ТаблицаЗначений = Новый ТаблицаЗначений();
128+
ТаблицаЗначений.Колонки.Добавить("Кол1");
129+
ТаблицаЗначений.Колонки.Добавить("Кол2");
130+
Строка1 = ТаблицаЗначений.Добавить();
131+
Строка2 = ТаблицаЗначений.Добавить();
132+
Строка1.Кол1 = 1;
133+
Строка1.Кол2 = 0;
134+
Строка2.Кол1 = 0;
135+
Строка2.Кол2 = 1;
136+
ЕстьИстина = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", Истина) ).Количество() > 0;
137+
ЕстьЛожь = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", Ложь) ).Количество() > 0;
138+
юТест.ПроверитьЛожь( ЕстьИстина );
139+
юТест.ПроверитьЛожь( ЕстьЛожь );
140+
КонецПроцедуры
141+
142+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахТаблицыЗначений() Экспорт
143+
ТаблицаЗначений = Новый ТаблицаЗначений();
144+
ТаблицаЗначений.Колонки.Добавить("Кол1");
145+
ТаблицаЗначений.Колонки.Добавить("Кол2");
146+
Строка1 = ТаблицаЗначений.Добавить();
147+
Строка2 = ТаблицаЗначений.Добавить();
148+
Строка1.Кол1 = Истина;
149+
Строка1.Кол2 = Ложь;
150+
Строка2.Кол1 = Ложь;
151+
Строка2.Кол2 = Истина;
152+
Есть1 = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", 1) ).Количество() > 0;
153+
Есть0 = ТаблицаЗначений.НайтиСтроки( Новый Структура("Кол1", 0) ).Количество() > 0;
154+
юТест.ПроверитьЛожь( Есть1 );
155+
юТест.ПроверитьЛожь( Есть0 );
156+
КонецПроцедуры
157+
158+
159+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВДеревеЗначений() Экспорт
160+
ДеревоЗначений = Новый ДеревоЗначений();
161+
ДеревоЗначений.Колонки.Добавить("Кол1");
162+
ДеревоЗначений.Колонки.Добавить("Кол2");
163+
Строка1 = ДеревоЗначений.Строки.Добавить();
164+
Строка2 = ДеревоЗначений.Строки.Добавить();
165+
Строка1.Кол1 = 1;
166+
Строка1.Кол2 = 0;
167+
Строка2.Кол1 = 0;
168+
Строка2.Кол2 = 1;
169+
ЕстьИстина = ДеревоЗначений.Строки.Найти(Истина) <> Неопределено;
170+
ЕстьЛожь = ДеревоЗначений.Строки.Найти(Ложь) <> Неопределено;
171+
юТест.ПроверитьЛожь( ЕстьИстина );
172+
юТест.ПроверитьЛожь( ЕстьЛожь );
173+
КонецПроцедуры
174+
175+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВДеревеЗначений() Экспорт
176+
ДеревоЗначений = Новый ДеревоЗначений();
177+
ДеревоЗначений.Колонки.Добавить("Кол1");
178+
ДеревоЗначений.Колонки.Добавить("Кол2");
179+
Строка1 = ДеревоЗначений.Строки.Добавить();
180+
Строка2 = ДеревоЗначений.Строки.Добавить();
181+
Строка1.Кол1 = Истина;
182+
Строка1.Кол2 = Ложь;
183+
Строка2.Кол1 = Ложь;
184+
Строка2.Кол2 = Истина;
185+
Есть1 = ДеревоЗначений.Строки.Найти(1) <> Неопределено;
186+
Есть0 = ДеревоЗначений.Строки.Найти(0) <> Неопределено;
187+
юТест.ПроверитьЛожь( Есть1 );
188+
юТест.ПроверитьЛожь( Есть0 );
189+
КонецПроцедуры
190+
191+
Процедура ТестДолжен_ПроверитьПоиск_БулеваСредиЧисел_ВСтрокахДереваЗначений() Экспорт
192+
ДеревоЗначений = Новый ДеревоЗначений();
193+
ДеревоЗначений.Колонки.Добавить("Кол1");
194+
ДеревоЗначений.Колонки.Добавить("Кол2");
195+
Строка1 = ДеревоЗначений.Строки.Добавить();
196+
Строка2 = ДеревоЗначений.Строки.Добавить();
197+
Строка1.Кол1 = 1;
198+
Строка1.Кол2 = 0;
199+
Строка2.Кол1 = 0;
200+
Строка2.Кол2 = 1;
201+
ЕстьИстина = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", Истина) ).Количество() > 0;
202+
ЕстьЛожь = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", Ложь) ).Количество() > 0;
203+
юТест.ПроверитьЛожь( ЕстьИстина );
204+
юТест.ПроверитьЛожь( ЕстьЛожь );
205+
КонецПроцедуры
206+
207+
Процедура ТестДолжен_ПроверитьПоиск_ЧислаСредиБулевых_ВСтрокахДереваЗначений() Экспорт
208+
ДеревоЗначений = Новый ДеревоЗначений();
209+
ДеревоЗначений.Колонки.Добавить("Кол1");
210+
ДеревоЗначений.Колонки.Добавить("Кол2");
211+
Строка1 = ДеревоЗначений.Строки.Добавить();
212+
Строка2 = ДеревоЗначений.Строки.Добавить();
213+
Строка1.Кол1 = Истина;
214+
Строка1.Кол2 = Ложь;
215+
Строка2.Кол1 = Ложь;
216+
Строка2.Кол2 = Истина;
217+
Есть1 = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", 1) ).Количество() > 0;
218+
Есть0 = ДеревоЗначений.Строки.НайтиСтроки( Новый Структура("Кол1", 0) ).Количество() > 0;
219+
юТест.ПроверитьЛожь( Есть1 );
220+
юТест.ПроверитьЛожь( Есть0 );
221+
КонецПроцедуры

0 commit comments

Comments
 (0)