package.path = '../common/libs/?.lua;../common/vendor/?.lua;' .. package.path local lu = require('luaunit') require('Polo') require('source/ColumnLayout') TestColumnLayout = { AVAIL_WIDTH = 100 } function TestColumnLayout:stub(layout) layout._column_gap_calls = {} layout._column_gap = function (self, padding) table.insert(self._column_gap_calls, {padding}) end layout._get_avail_width_calls = 0 layout._get_avail_width = function (self) self._get_avail_width_calls = self._get_avail_width_calls + 1 return TestColumnLayout.AVAIL_WIDTH end layout._horiz_margin_calls = {} layout._horiz_margin = function (self, margin) table.insert(self._horiz_margin_calls, {margin}) end layout._vert_margin_calls = {} layout._vert_margin = function (self, margin, width) table.insert(self._vert_margin_calls, {margin, width}) end layout._with_group_calls = 0 layout._with_group = function (self, f) self._with_group_calls = self._with_group_calls + 1 f() end end function TestColumnLayout:testInitDefault() local layout = ColumnLayout.new { render_column = function () end } lu.assertEquals(layout.column_padding, ColumnLayout.DEFAULT_COLUMN_PADDING) lu.assertEquals(layout.margin_bottom, 0) lu.assertEquals(layout.margin_left, 0) lu.assertEquals(layout.margin_right, 0) lu.assertEquals(layout.margin_top, 0) lu.assertEquals(layout.num_columns, ColumnLayout.DEFAULT_NUM_COLUMNS) lu.assertEquals(layout.width, 0) end function TestColumnLayout:testRender() local column_padding = 20 local margin_bottom = 15 local margin_left = 10 local margin_right = 30 local margin_top = 5 local num_columns = 2 local expected_column_width = ( self.AVAIL_WIDTH - margin_left - margin_right - column_padding ) / num_columns local render_column_calls = {} local layout = ColumnLayout.new { column_padding = column_padding, margin_bottom = margin_bottom, margin_left = margin_left, margin_right = margin_right, margin_top = margin_top, num_columns = num_columns, render_column = function (column) table.insert(render_column_calls, {column}) end } self:stub(layout) layout:render() lu.assertEquals(layout._column_gap_calls, {{column_padding}}) lu.assertEquals(layout._get_avail_width_calls, 1) lu.assertEquals(layout._horiz_margin_calls, {{margin_left}}) lu.assertEquals(layout._vert_margin_calls, { {margin_top, expected_column_width}, {margin_bottom, expected_column_width}, {margin_top, expected_column_width}, {margin_bottom, expected_column_width}, }) lu.assertEquals(layout._with_group_calls, num_columns) lu.assertEquals(render_column_calls, { {{num = 1, width = expected_column_width}}, {{num = 2, width = expected_column_width}}, }) end function TestColumnLayout:testRenderWithWidth() local column_padding = 15 local margin_bottom = 10 local margin_left = 5 local margin_right = 20 local margin_top = 25 local num_columns = 3 local width = 205 local expected_column_width = 50 local render_column_calls = {} local layout = ColumnLayout.new { column_padding = column_padding, margin_bottom = margin_bottom, margin_left = margin_left, margin_right = margin_right, margin_top = margin_top, num_columns = num_columns, width = width, render_column = function (column) table.insert(render_column_calls, {column}) end } self:stub(layout) layout:render() lu.assertEquals(layout._column_gap_calls, {{column_padding}, {column_padding}}) lu.assertEquals(layout._get_avail_width_calls, 0) lu.assertEquals(layout._horiz_margin_calls, {{margin_left}}) lu.assertEquals(layout._vert_margin_calls, { {margin_top, expected_column_width}, {margin_bottom, expected_column_width}, {margin_top, expected_column_width}, {margin_bottom, expected_column_width}, {margin_top, expected_column_width}, {margin_bottom, expected_column_width}, }) lu.assertEquals(layout._with_group_calls, num_columns) lu.assertEquals(render_column_calls, { {{num = 1, width = expected_column_width}}, {{num = 2, width = expected_column_width}}, {{num = 3, width = expected_column_width}}, }) end function TestColumnLayout:testRenderNested() local inner_renders = {} local outer_renders = {} local outer_layout = ColumnLayout.new { column_padding = 0, num_columns = 2, width = 60, render_column = function (outer_column) table.insert(outer_renders, outer_column) local inner_layout = ColumnLayout.new { column_padding = 0, num_columns = 3, width = outer_column.width, render_column = function (inner_column) table.insert(inner_renders, inner_column) end } self:stub(inner_layout) inner_layout:render() end } self:stub(outer_layout) outer_layout:render() lu.assertEquals(inner_renders, { {num=1, width=10}, {num=2, width=10}, {num=3, width=10}, {num=1, width=10}, {num=2, width=10}, {num=3, width=10}, }) lu.assertEquals(outer_renders, { {num=1, width=30}, {num=2, width=30}, }) end os.exit(lu.LuaUnit.run())