Skip to content

Commit 877a682

Browse files
committed
Исправлена вставка ключа Null в соответствие fixes EvilBeaver#1647
1 parent b4e8fb8 commit 877a682

2 files changed

Lines changed: 139 additions & 5 deletions

File tree

src/ScriptEngine/Machine/GenericIValueComparer.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public class GenericIValueComparer : IEqualityComparer<IValue>, IComparer<IValue
2121

2222
static private readonly List<TypeDescriptor>orderedTypes = new List<TypeDescriptor>
2323
{ BasicTypes.Undefined, BasicTypes.Null, BasicTypes.Boolean,
24-
BasicTypes.Number, BasicTypes.String, BasicTypes.Date, BasicTypes.Type };
25-
24+
BasicTypes.Number, BasicTypes.String, BasicTypes.Date, BasicTypes.Type };
25+
2626
private const int INDEX_OF_TYPE = 6;
2727

2828
public GenericIValueComparer()
@@ -47,6 +47,9 @@ public int GetHashCode(IValue obj)
4747
if (obj is BslUndefinedValue)
4848
return obj.GetHashCode();
4949

50+
if (obj is BslNullValue)
51+
return obj.GetHashCode();
52+
5053
try
5154
{
5255
CLR_obj = ContextValuesMarshaller.ConvertToClrObject(obj);
@@ -56,6 +59,9 @@ public int GetHashCode(IValue obj)
5659
CLR_obj = obj;
5760
}
5861

62+
if (CLR_obj == null)
63+
return 0;
64+
5965
return CLR_obj.GetHashCode();
6066
}
6167

@@ -67,8 +73,8 @@ private int CompareAsStrings(IValue x, IValue y)
6773
private int CompareByPresentations(IValue x, IValue y)
6874
{
6975
return ((BslValue)x).ToString(_process).CompareTo(((BslValue)y).ToString(_process));
70-
}
71-
76+
}
77+
7278
/// <summary>
7379
/// Сравнение переменных разных типов. Правила сравнения соответствуют 1С v8.3.27:
7480
/// Переменные типа "Тип" следуют за всеми прочими;
@@ -82,7 +88,7 @@ private int CompareByTypes(IValue x, IValue y)
8288
var iy = orderedTypes.IndexOf(y.SystemType);
8389

8490
if (ix >= 0)
85-
if (iy >= 0)
91+
if (iy >= 0)
8692
return ix - iy;
8793
else
8894
return ix == INDEX_OF_TYPE ? 1 : -1;

tests/collections.os

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
ВсеТесты = Новый Массив;
88

99
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючНеопределеноВСоответствии");
10+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючNullВСоответствии");
11+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючБулевоВСоответствии");
12+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючЧислоВСоответствии");
13+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючСтрокаВСоответствии");
14+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючДатаВСоответствии");
15+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючУникальныйИдентификаторВСоответствии");
16+
ВсеТесты.Добавить("ТестДолжен_ПроверитьКлючТипВСоответствии");
17+
ВсеТесты.Добавить("ТестДолжен_ПроверитьРазличныеКлючиВСоответствии");
1018

1119
Возврат ВсеТесты;
1220
КонецФункции
@@ -18,4 +26,124 @@
1826
юТест.ПроверитьРавенство(1, Соотв.Количество());
1927
юТест.ПроверитьРавенство(Истина, Соотв[Неопределено]);
2028

29+
КонецПроцедуры
30+
31+
Процедура ТестДолжен_ПроверитьКлючNullВСоответствии() Экспорт
32+
33+
Соотв = Новый Соответствие;
34+
Соотв.Вставить(Null, "Значение для Null");
35+
юТест.ПроверитьРавенство(1, Соотв.Количество());
36+
юТест.ПроверитьРавенство("Значение для Null", Соотв[Null]);
37+
38+
КонецПроцедуры
39+
40+
Процедура ТестДолжен_ПроверитьКлючБулевоВСоответствии() Экспорт
41+
42+
Соотв = Новый Соответствие;
43+
Соотв.Вставить(Истина, "Значение для Истина");
44+
Соотв.Вставить(Ложь, "Значение для Ложь");
45+
46+
юТест.ПроверитьРавенство(2, Соотв.Количество());
47+
юТест.ПроверитьРавенство("Значение для Истина", Соотв[Истина]);
48+
юТест.ПроверитьРавенство("Значение для Ложь", Соотв[Ложь]);
49+
50+
КонецПроцедуры
51+
52+
Процедура ТестДолжен_ПроверитьКлючЧислоВСоответствии() Экспорт
53+
54+
Соотв = Новый Соответствие;
55+
Соотв.Вставить(42, "Значение для 42");
56+
Соотв.Вставить(0, "Значение для 0");
57+
Соотв.Вставить(-100, "Значение для -100");
58+
Соотв.Вставить(3.14, "Значение для 3.14");
59+
60+
юТест.ПроверитьРавенство(4, Соотв.Количество());
61+
юТест.ПроверитьРавенство("Значение для 42", Соотв[42]);
62+
юТест.ПроверитьРавенство("Значение для 0", Соотв[0]);
63+
юТест.ПроверитьРавенство("Значение для -100", Соотв[-100]);
64+
юТест.ПроверитьРавенство("Значение для 3.14", Соотв[3.14]);
65+
66+
КонецПроцедуры
67+
68+
Процедура ТестДолжен_ПроверитьКлючСтрокаВСоответствии() Экспорт
69+
70+
Соотв = Новый Соответствие;
71+
Соотв.Вставить("Ключ1", "Значение1");
72+
Соотв.Вставить("Ключ2", "Значение2");
73+
Соотв.Вставить("", "Значение для пустой строки");
74+
75+
юТест.ПроверитьРавенство(3, Соотв.Количество());
76+
юТест.ПроверитьРавенство("Значение1", Соотв["Ключ1"]);
77+
юТест.ПроверитьРавенство("Значение2", Соотв["Ключ2"]);
78+
юТест.ПроверитьРавенство("Значение для пустой строки", Соотв[""]);
79+
80+
КонецПроцедуры
81+
82+
Процедура ТестДолжен_ПроверитьКлючДатаВСоответствии() Экспорт
83+
84+
Соотв = Новый Соответствие;
85+
Дата1 = '20151231';
86+
Дата2 = '20200101';
87+
88+
Соотв.Вставить(Дата1, "Значение для Дата1");
89+
Соотв.Вставить(Дата2, "Значение для Дата2");
90+
91+
юТест.ПроверитьРавенство(2, Соотв.Количество());
92+
юТест.ПроверитьРавенство("Значение для Дата1", Соотв[Дата1]);
93+
юТест.ПроверитьРавенство("Значение для Дата2", Соотв[Дата2]);
94+
95+
КонецПроцедуры
96+
97+
Процедура ТестДолжен_ПроверитьКлючУникальныйИдентификаторВСоответствии() Экспорт
98+
99+
Соотв = Новый Соответствие;
100+
УИД1 = Новый УникальныйИдентификатор;
101+
УИД2 = Новый УникальныйИдентификатор;
102+
103+
Соотв.Вставить(УИД1, "Значение для УИД1");
104+
Соотв.Вставить(УИД2, "Значение для УИД2");
105+
106+
юТест.ПроверитьРавенство(2, Соотв.Количество());
107+
юТест.ПроверитьРавенство("Значение для УИД1", Соотв[УИД1]);
108+
юТест.ПроверитьРавенство("Значение для УИД2", Соотв[УИД2]);
109+
110+
КонецПроцедуры
111+
112+
Процедура ТестДолжен_ПроверитьКлючТипВСоответствии() Экспорт
113+
114+
Соотв = Новый Соответствие;
115+
Тип1 = Тип("Строка");
116+
Тип2 = Тип("Число");
117+
118+
Соотв.Вставить(Тип1, "Значение для Тип Строка");
119+
Соотв.Вставить(Тип2, "Значение для Тип Число");
120+
121+
юТест.ПроверитьРавенство(2, Соотв.Количество());
122+
юТест.ПроверитьРавенство("Значение для Тип Строка", Соотв[Тип1]);
123+
юТест.ПроверитьРавенство("Значение для Тип Число", Соотв[Тип2]);
124+
125+
КонецПроцедуры
126+
127+
Процедура ТестДолжен_ПроверитьРазличныеКлючиВСоответствии() Экспорт
128+
129+
// Проверка, что различные типы значений могут быть одновременно ключами
130+
Соотв = Новый Соответствие;
131+
132+
Соотв[Неопределено] = "Неопределено";
133+
Соотв[Null] = "Null";
134+
Соотв[Истина] = "Истина";
135+
Соотв[42] = "Число";
136+
Соотв["Текст"] = "Строка";
137+
Соотв['20240101'] = "Дата";
138+
Соотв[Тип("Строка")] = "Тип";
139+
140+
юТест.ПроверитьРавенство(7, Соотв.Количество());
141+
юТест.ПроверитьРавенство("Неопределено", Соотв[Неопределено]);
142+
юТест.ПроверитьРавенство("Null", Соотв[Null]);
143+
юТест.ПроверитьРавенство("Истина", Соотв[Истина]);
144+
юТест.ПроверитьРавенство("Число", Соотв[42]);
145+
юТест.ПроверитьРавенство("Строка", Соотв["Текст"]);
146+
юТест.ПроверитьРавенство("Дата", Соотв['20240101']);
147+
юТест.ПроверитьРавенство("Тип", Соотв[Тип("Строка")]);
148+
21149
КонецПроцедуры

0 commit comments

Comments
 (0)