Написал я вот такой тест:
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);
}
В постановке задачи не зафиксировано, но в тесте проверяется:
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.
Assert.AreEqual(100, mainPanel.MinimumSize.Width); //50 + 50
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;
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.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, вот сейчас я поменял совсем немного и уже надо менять тесты).
Дальше в тестах попадаются варианты получше:
Хотя и тут я бы сейчас не стал полагаться на свои знания обработки MinimumSize в конкретном раскладе настроек парентовых контролов (ведь это может измениться) и попробовал бы рутовому контролу (Form?) выставить маленькие/большие размеры и проверить, что эти контролы не стали меньше нужных мне минимальных размеров/их можно увидеть/не перекрываются и где надо появился/исчез скроллер.
Подход сильно смахивает на скриншотное тестирование с попиксельным сравнением. Но из него я исключил отрисовку и полагаю что уж отрисовщик-то точно все правильно отрисует по моей модели... Со скриншотами тоже есть тесты, но очень уж они нестабильные.
Комментариев нет:
Отправить комментарий