пятница, 3 марта 2017 г.

Одноглазые тесты

Возникла у меня в приложении проблемка: при смене фильтра в моем гриде пропадало "выделение" строки, т.е. строка есть, ее видно, но она просто не "выделена". А выделение строки очень важно: кнопки Delete/Print и многие другие работают с выделенными записями, т.е. нет выделенных записей - кнопки недоступны.
И в результате поведение моего приложения выглядело ужасно: сменил пользователь фильтр, видит в гриде нужную запись, а удалить ее не может, потому что кнопка Delete недоступна. Кто виноват? Конечно же программист!

Я для этого сценария сделал костылик и написал тест с проверкой выделенных записей в этом сценарии:


        [Test]
        public void ChangeCollectionCriteriaFromEmptyToOneItem_V1() {
            using(Form form = new Form()) {
                Grid grid = new Grid();

                KeepSelectedRowsHelper helper = new KeepSelectedRowsHelper();
                helper.Attach(grid);
                grid.Parent = form;

                form.Show();
                ..

                list.Criteria = "empty list";

                grid.DataSource = list;

                Assert.AreEqual(0, list.Count);
                Assert.AreEqual(0, grid.RowCount);
                Assert.AreEqual(0, grid.GetSelectedRows().Count);
                Assert.AreEqual(Grid.InvalidRowHandle, grid.FocusedRowHandle);

                col.Criteria = null;

                Assert.AreEqual(1, list.Count);
                Assert.AreEqual(1, grid.RowCount);
                Assert.AreEqual(0, grid.FocusedRowHandle);
                Assert.AreEqual(1, grid.GetSelectedRows().Count);
            }
        }

Это было несколько лет назад. И вот я снова бодаюсь с этим сценарием: почему-то костылик перестал работать, там что-то авторы грида изменили. Плохо конечно, что сломали, но зато и починили быстро.
Только в процессе проверки "как починили" я неожиданно выяснил что и без моего костылика все работает!

А костылик-то немаленький, сильно грид переколбашивает:

        grid.BeginSelection();
        try {
            grid.ClearSelection();
            grid.SelectRow(rowHandle);
            grid.FocusedRowHandle = rowHandle;
        }
        finally {
            grid.EndSelection();
        }

Как же так вышло? Вроде и код писал "по методологии", и тест правильный, но в результате только тормозов добавил в эту операцию, да поимел ненужный код...

Такая ситуация у меня возникает не в первый раз и сейчас шаблон такого теста у меня изменился, я проверяю два варианта:
- "правильно работает с моим кодом"
- "НЕправильно работает без моего кода"

        [Test]
        public void ChangeCollectionCriteriaFromEmptyToOneItem_V2() {
            ChangeCollectionCriteriaFromEmptyToOneItem_V2(true);
            ChangeCollectionCriteriaFromEmptyToOneItem_V2(false);
        }
        private void ChangeCollectionCriteriaFromEmptyToOneItem_V2(bool enableHelper) {
                if(enableHelper) {
                    KeepSelectedRowsHelper helper = new KeepSelectedRowsHelper();
                    helper.Attach(grid);
                }
                ..

                col.Criteria = null;

                Assert.AreEqual(1, list.Count);
                Assert.AreEqual(1, grid.RowCount);
                Assert.AreEqual(0, grid.FocusedRowHandle);
                if(enableHelper) {
                    Assert.AreEqual(1, grid.GetSelectedRows().Count);
                }
                else {
                    Assert.AreEqual(0, grid.GetSelectedRows().Count);
                }
            }
        }

И в дополнение я тщательно выбираю ситуации, когда мой код должен работать:

if(grid.ContainsSortedColumn && grid.IsServerMode && (grid.MultiSelect == true))

В других ситуациях грид и сам сразу работает как мне хотелось бы и нечего в его правильную работу влезать со своим тормознутым костыликом.