воскресенье, 17 июня 2018 г.

Assert.AreEqual(DockStyle.Fill, mainPanel.Dock);

Написал я вот такой тест:

        public void Test_LayoutControls_Horizontal() {
            ...
            splitLayout.Direction = ExpressApp.Layout.FlowDirection.Horizontal;

            SidePanelLayout layout = new SidePanelLayout ();
            Panel panel1 = new Panel();
            Panel panel2 = new Panel();
            layout.LayoutControls(splitLayout, new Item("1", panel1), new Item("2", panel2));
            SidePanelContainer mainPanel = layout.Container as SidePanelContainer;

            Assert.IsNotNull(mainPanel);
            Assert.AreEqual(DockStyle.Fill, mainPanel.Dock);


            Assert.AreEqual(2, mainPanel.Controls.Count);

            SidePanel sidePanel1 = mainPanel.Controls[1] as SidePanel;
            SidePanel sidePanel2 = mainPanel.Controls[0] as SidePanel;

            Assert.IsNotNull(sidePanel1);
            Assert.IsNotNull(sidePanel2);
            Assert.AreEqual(Orientation.Horizontal, mainPanel.Orientation);
            Assert.AreEqual(mainPanel.FixedPanel, sidePanel1);
            Assert.AreEqual(mainPanel.FillPanel, sidePanel2);
            Assert.AreEqual(1, sidePanel1.Controls.Count);
            Assert.AreEqual(1, sidePanel2.Controls.Count);

            Assert.AreEqual(panel1, sidePanel1.Controls[0]);
            Assert.AreEqual(panel2, sidePanel2.Controls[0]);
            Assert.AreEqual(DockStyle.Fill, panel1.Dock);
            Assert.AreEqual(DockStyle.Fill, panel2.Dock);
        }


Посмотрел на него сейчас и вижу: тест этот выглядит как проверка результатов на внутренних элементах/этапах конкретно этой реализации...

В постановке задачи не зафиксировано, но в тесте проверяется:

  • одна там панель или другая
  • вложенные в два или три уровня промежуточных контролов
  • DockStyle.Fill или явные координаты
  • есть или нет Fixed и Fill свойства
  • в одном контроле должны лежать panel1/panel2 или в разных 
  • должен у них быть DockStyle.Fill или не должен.


Из-за проверок этих деталей потребовались сейчас изменения в тестах при замене Panel на SidePanelContainer в алгоритме, строку:

Panel mainPanel = layoutManager.Container as Panel;

заменил на

SidePanelContainer mainPanel = layoutManager.Container as SidePanelContainer;

Но ткого изменения в тесте не должно быть, ведь сценарий LayoutControls_Horizontal - это расположить мои panel1/panel2 внутри контрола layoutControl размером [100,50], что бы у панелей получились координаты [0,0,20,50] и [21,0,100,50] в координатной сетке layoutControl:

layoutControl.LeftControlFixedSize = 20;
layoutControl.Size = new Size(100, 50);
layoutControl.layout(panel1, panel2);
Assert.AreEqual(Rectangle(0, 0, 20, 50), GetPositionInControl(layoutControl, panel1));
Assert.AreEqual(Rectangle(21, 0, 100, 50), GetPositionInControl(layoutControl, panel1));

Пересчет координат можно сделать на PointToScreen/ScreenToClient.

Остальные эффекты типа fixedLeft/fillRight - это тоже нужные, но другие сценарии и их я смогу проверить в других тестах: поменяю размер внешнего элемента (Form?) и снова проверю размеры не полагаясь на свое знание алгоритма обработки DockStyle/MinSize/MaxSize (проверить только DockStyle и считать, что дальше "все будет правильно" тоже можно, это дешевле/быстрее, но бывают дорогие последствия типа "придется выбросить старые тесты и написать заново похожие") и не ограничивая применимость тестов только этой конкретной реализацией (реализация может быть не только на DockStyle/Min/MaxSize, вот сейчас я поменял совсем немного и уже надо менять тесты).

Дальше в тестах попадаются варианты получше:

Assert.AreEqual(100, mainPanel.MinimumSize.Width); //50 + 50

Хотя и тут я бы сейчас не стал полагаться на свои знания обработки MinimumSize в конкретном раскладе настроек парентовых контролов (ведь это может измениться) и попробовал бы рутовому контролу (Form?) выставить маленькие/большие размеры и проверить, что эти контролы не стали меньше нужных мне минимальных размеров/их можно увидеть/не перекрываются и где надо появился/исчез скроллер.

Подход сильно смахивает на скриншотное тестирование с попиксельным сравнением. Но из него я исключил отрисовку и полагаю что уж отрисовщик-то точно все правильно отрисует по моей модели... Со скриншотами тоже есть тесты, но очень уж они нестабильные.

Комментариев нет:

Отправить комментарий