Skip to content

Commit bcf9e6a

Browse files
authored
Merge pull request EvilBeaver#1629 from Mr-Rm/v2/fix-vtrow
V2 Исправления к СтрокаТаблицыЗначений
2 parents 03b0459 + 80b01c5 commit bcf9e6a

File tree

4 files changed

+87
-47
lines changed

4 files changed

+87
-47
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,13 @@ public ValueTableColumn FindColumnByName(string name)
156156
return _columns.Find(column => _namesComparer.Equals(name, column.Name));
157157
}
158158

159-
public ValueTableColumn FindColumnByIndex(int index) => _columns[index];
159+
public ValueTableColumn FindColumnByIndex(int index)
160+
{
161+
if (index < 0 || index >= _columns.Count)
162+
throw RuntimeException.IndexOutOfRange();
163+
return _columns[index];
164+
}
165+
160166

161167
public IEnumerator<ValueTableColumn> GetEnumerator()
162168
{
@@ -209,11 +215,7 @@ public ValueTableColumn GetColumnByIIndex(IValue index)
209215

210216
if (index.SystemType == BasicTypes.Number)
211217
{
212-
int i_index = Decimal.ToInt32(index.AsNumber());
213-
if (i_index < 0 || i_index >= Count())
214-
throw RuntimeException.IndexOutOfRange();
215-
216-
return FindColumnByIndex(i_index);
218+
return FindColumnByIndex(decimal.ToInt32(index.AsNumber()));
217219
}
218220

219221
if (index is ValueTableColumn column)

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

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace OneScript.StandardLibrary.Collections.ValueTable
1616
[ContextClass("СтрокаТаблицыЗначений", "ValueTableRow")]
1717
public class ValueTableRow : AutoContext<ValueTableRow>, ICollectionContext<IValue>, IDebugPresentationAcceptor
1818
{
19-
private readonly Dictionary<IValue, IValue> _data = new Dictionary<IValue, IValue>();
19+
private readonly Dictionary<ValueTableColumn, IValue> _data = new Dictionary<ValueTableColumn, IValue>();
2020
private readonly ValueTable _owner;
2121

2222
public ValueTableRow(ValueTable owner)
@@ -26,7 +26,7 @@ public ValueTableRow(ValueTable owner)
2626

2727
public int Count()
2828
{
29-
return Owner().Columns.Count();
29+
return _owner.Columns.Count();
3030
}
3131

3232
public int Count(IBslProcess process) => Count();
@@ -43,12 +43,11 @@ public ValueTable Owner()
4343

4444
private IValue TryValue(ValueTableColumn Column)
4545
{
46-
IValue Value;
47-
if (_data.TryGetValue(Column, out Value))
48-
{
49-
return Value;
50-
}
51-
return Column.ValueType.AdjustValue();
46+
if (_data.TryGetValue(Column, out IValue Value))
47+
{
48+
return Value;
49+
}
50+
return Column.ValueType.AdjustValue();
5251
}
5352

5453
/// <summary>
@@ -59,19 +58,17 @@ private IValue TryValue(ValueTableColumn Column)
5958
[ContextMethod("Получить", "Get")]
6059
public IValue Get(int index)
6160
{
62-
var C = Owner().Columns.FindColumnByIndex(index);
63-
return TryValue(C);
61+
return TryValue(_owner.Columns.FindColumnByIndex(index));
6462
}
6563

6664
public IValue Get(IValue index)
6765
{
68-
var C = Owner().Columns.GetColumnByIIndex(index);
69-
return TryValue(C);
66+
return TryValue(_owner.Columns.GetColumnByIIndex(index));
7067
}
7168

72-
public IValue Get(ValueTableColumn c)
69+
public IValue Get(ValueTableColumn column)
7370
{
74-
return TryValue(c);
71+
return TryValue(column);
7572
}
7673

7774
/// <summary>
@@ -82,31 +79,29 @@ public IValue Get(ValueTableColumn c)
8279
[ContextMethod("Установить", "Set")]
8380
public void Set(int index, IValue value)
8481
{
85-
var C = Owner().Columns.FindColumnByIndex(index);
86-
Set(C, value);
82+
Set(_owner.Columns.FindColumnByIndex(index), value);
8783
}
8884

8985
public void Set(IValue index, IValue value)
9086
{
91-
var C = Owner().Columns.GetColumnByIIndex(index);
92-
Set(C, value);
87+
Set(_owner.Columns.GetColumnByIIndex(index), value);
9388
}
9489

9590
public void Set(ValueTableColumn column, IValue value)
9691
{
97-
Owner().Indexes.ElementRemoved(this);
92+
_owner.Indexes.ElementRemoved(this);
9893
_data[column] = column.ValueType.AdjustValue(value);
99-
Owner().Indexes.ElementAdded(this);
94+
_owner.Indexes.ElementAdded(this);
10095
}
10196

102-
public void OnOwnerColumnRemoval(IValue column)
97+
public void OnOwnerColumnRemoval(ValueTableColumn column)
10398
{
10499
_data.Remove(column);
105100
}
106101

107102
public IEnumerator<IValue> GetEnumerator()
108103
{
109-
foreach (var item in Owner().Columns)
104+
foreach (var item in _owner.Columns)
110105
{
111106
yield return TryValue(item);
112107
}
@@ -124,51 +119,41 @@ public override int GetPropCount()
124119

125120
public override string GetPropName(int propNum)
126121
{
127-
return Owner().Columns.GetPropName(propNum);
122+
return _owner.Columns.GetPropName(propNum);
128123
}
129124

130125
public override int GetPropertyNumber(string name)
131126
{
132-
return Owner().Columns.GetPropertyNumber(name);
127+
return _owner.Columns.GetPropertyNumber(name);
133128
}
134129

135-
public override bool IsPropReadable(int propNum)
136-
{
137-
return true;
138-
}
130+
public override bool IsPropReadable(int propNum) => true;
139131

140-
public override bool IsPropWritable(int propNum)
141-
{
142-
return true;
143-
}
132+
public override bool IsPropWritable(int propNum) => true;
144133

145134
public override IValue GetPropValue(int propNum)
146135
{
147-
var C = Owner().Columns.FindColumnByIndex(propNum);
148-
return TryValue(C);
136+
return TryValue(_owner.Columns.FindColumnByIndex(propNum));
149137
}
150138

151139
public override void SetPropValue(int propNum, IValue newVal)
152140
{
153-
var C = Owner().Columns.FindColumnByIndex(propNum);
154-
Set(C, newVal);
141+
Set(_owner.Columns.FindColumnByIndex(propNum), newVal);
155142
}
156143

157144
private ValueTableColumn GetColumnByIIndex(IValue index)
158145
{
159-
return Owner().Columns.GetColumnByIIndex(index);
146+
return _owner.Columns.GetColumnByIIndex(index);
160147
}
161148

162149
public override IValue GetIndexedValue(IValue index)
163150
{
164-
ValueTableColumn C = GetColumnByIIndex(index);
165-
return TryValue(C);
151+
return TryValue(GetColumnByIIndex(index));
166152
}
167153

168154
public override void SetIndexedValue(IValue index, IValue val)
169155
{
170-
var C = GetColumnByIIndex(index);
171-
_data[C] = C.ValueType.AdjustValue(val);
156+
Set(GetColumnByIIndex(index), val);
172157
}
173158

174159
void IDebugPresentationAcceptor.Accept(IDebugValueVisitor visitor)

tests/ValueTableIndex.os

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоискСИндексом");
2525
ВсеТесты.Добавить("ТестДолжен_ПоведениеИндексовПриУдаленииКолонок");
2626
ВсеТесты.Добавить("ТестДолжен_ПоведениеИндексовПриИзмененииЗначенийИндексированныхПолей");
27+
ВсеТесты.Добавить("ТестДолжен_ПоведениеИндексовПриИзмененииЗначенийИндексированныхПолейПоИндексу");
2728
ВсеТесты.Добавить("ТестДолжен_ПроверитьВыбросИсключений");
2829
ВсеТесты.Добавить("ТестДолжен_ПроверитьПоискПоИндексированнойКолонкеСЗаданнымТипом");
2930

@@ -179,6 +180,29 @@
179180

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

183+
Процедура ТестДолжен_ПоведениеИндексовПриИзмененииЗначенийИндексированныхПолейПоИндексу() Экспорт
184+
185+
Т = Новый ТаблицаЗначений;
186+
Т.Колонки.Добавить("К1");
187+
Т.Колонки.Добавить("К2");
188+
Т.Индексы.Добавить("К2");
189+
Т.Индексы.Добавить("К2, К1");
190+
Т.Индексы.Добавить("К1");
191+
Т.Добавить().К1 = 1;
192+
Т.Добавить().К1 = 2;
193+
Т.Добавить().К1 = 3;
194+
195+
Т[0]["К1"] = 3;
196+
Т[1]["К1"] = 2;
197+
Т[2]["К1"] = 1;
198+
199+
СтруктураПоиска = Новый Структура("К1", 1);
200+
НайденныеСтроки = Т.НайтиСтроки(СтруктураПоиска);
201+
юТест.ПроверитьРавенство(НайденныеСтроки.Количество(), 1);
202+
юТест.ПроверитьРавенство(НайденныеСтроки[0], Т[2]);
203+
204+
КонецПроцедуры
205+
182206
Процедура ТестДолжен_ПроверитьВыбросИсключений() Экспорт
183207

184208
Т = Новый ТаблицаЗначений;

tests/valuetable.os

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@
8383
ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымПримитивнымТипом");
8484
ВсеТесты.Добавить("ТестДолжен_ВызватьИсключениеНаПоискеИндексаКолонкиСНевернымОбъектнымТипом");
8585

86+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИсключениеПолученияКолонкиСНевернымНомером");
87+
8688

8789
Возврат ВсеТесты;
8890

@@ -1288,3 +1290,30 @@
12881290

12891291
ВызватьИсключение "Должно было быть выдано исключение, но его не было";
12901292
КонецПроцедуры
1293+
1294+
Процедура ТестДолжен_ПроверитьИсключениеПолученияКолонкиСНевернымНомером() Экспорт
1295+
ТЗ = Новый ТаблицаЗначений();
1296+
ТЗ.Колонки.Добавить("Тест");
1297+
СтрокаТЗ = ТЗ.Добавить();
1298+
1299+
БылоИсключение = Ложь;
1300+
Попытка
1301+
Рез = СтрокаТЗ.Получить(-1);
1302+
Исключение
1303+
Ошибка = ИнформацияОбОшибке().Описание;
1304+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Значение индекса выходит за пределы"), 0, "Неверный вид ошибки: "+Ошибка);
1305+
БылоИсключение = Истина;
1306+
КонецПопытки;
1307+
юТест.ПроверитьИстину(БылоИсключение, "Получение колонки с неверным номером");
1308+
1309+
БылоИсключение = Ложь;
1310+
Попытка
1311+
Рез = СтрокаТЗ[-1];
1312+
Исключение
1313+
Ошибка = ИнформацияОбОшибке().Описание;
1314+
юТест.ПроверитьНеРавенство(Найти(Ошибка,"Значение индекса выходит за пределы"), 0, "Неверный вид ошибки: "+Ошибка);
1315+
БылоИсключение = Истина;
1316+
КонецПопытки;
1317+
юТест.ПроверитьИстину(БылоИсключение, "Получение колонки по неверному индексу");
1318+
1319+
КонецПроцедуры

0 commit comments

Comments
 (0)