from __future__ import absolute_import
# Copyright (c) 2010-2017 openpyxl
import pytest
from copy import copy
from openpyxl.utils.indexed_list import IndexedList
from openpyxl.styles.styleable import StyleArray
from openpyxl.xml.functions import tostring
from openpyxl.tests.helper import compare_xml
[docs]class DummyWorkbook:
def __init__(self):
self.shared_styles = IndexedList()
self._cell_styles = IndexedList()
self._cell_styles.add(StyleArray())
self._cell_styles.add(StyleArray([10,0,0,0,0,0,0,0,0,0]))
self.sheetnames = []
[docs]class DummyWorksheet:
def __init__(self):
self.parent = DummyWorkbook()
[docs]def test_dimension_interface():
from .. dimensions import Dimension
d = Dimension(1, True, 1, False, DummyWorksheet())
assert isinstance(d.parent, DummyWorksheet)
assert dict(d) == {'hidden': '1', 'outlineLevel': '1'}
[docs]def test_invalid_dimension_ctor():
from .. dimensions import Dimension
with pytest.raises(TypeError):
Dimension()
@pytest.fixture
[docs]def RowDimension():
from ..dimensions import RowDimension
return RowDimension
[docs]class TestRowDimension:
@pytest.mark.parametrize("key, value, expected",
[
('ht', 1, {'ht':'1', 'customHeight':'1'}),
('_font_id', 10, {'s':'1', 'customFormat':'1'}),
('thickBot', True, {'thickBot':'1'}),
('thickTop', True, {'thickTop':'1'}),
]
)
def test_row_dimension(self, RowDimension, key, value, expected):
rd = RowDimension(worksheet=DummyWorksheet())
setattr(rd, key, value)
assert dict(rd) == expected
[docs] def test_row_dimension(self, RowDimension):
from ..worksheet import Worksheet
ws = Worksheet(DummyWorkbook())
row_info = ws.row_dimensions
assert isinstance(row_info[1], RowDimension)
[docs] def test_copy(self, RowDimension):
rd1 = RowDimension(worksheet=DummyWorksheet(), s=[])
rd2 = copy(rd1)
assert rd1._style is not rd2._style
assert dict(rd1) == dict(rd2)
@pytest.fixture
[docs]def ColumnDimension():
from ..dimensions import ColumnDimension
return ColumnDimension
[docs]class TestColDimension:
@pytest.mark.parametrize("key, value, expected",
[
('width', 1, {'width':'1', 'customWidth':'1'}),
('bestFit', True, {'bestFit':'1'}),
]
)
[docs] def test_col_dimensions(self, ColumnDimension, key, value, expected):
cd = ColumnDimension(worksheet=DummyWorksheet())
setattr(cd, key, value)
assert dict(cd) == expected
[docs] def test_column_dimension(self, ColumnDimension):
from ..worksheet import Worksheet
ws = Worksheet(DummyWorkbook())
cols = ws.column_dimensions
assert isinstance(cols['A'], ColumnDimension)
[docs] def test_col_reindex(self, ColumnDimension):
cd = ColumnDimension(DummyWorksheet(), index="D")
assert dict(cd) == {}
cd.reindex()
assert dict(cd) == {'max': '4', 'min': '4'}
[docs] def test_col_width(self, ColumnDimension):
cd = ColumnDimension(DummyWorksheet(), index="A", width=4)
cd.reindex()
col = cd.to_tree()
xml = tostring(col)
expected = """<col width="4" min="1" max="1" customWidth="1" />"""
diff = compare_xml(xml, expected)
assert diff is None, diff
[docs] def test_col_style(self, ColumnDimension):
from ..worksheet import Worksheet
from openpyxl import Workbook
from openpyxl.styles import Font
ws = Worksheet(Workbook())
cd = ColumnDimension(ws, index="A")
cd.font = Font(color="FF0000")
cd.reindex()
col = cd.to_tree()
xml = tostring(col)
expected = """<col max="1" min="1" style="1" />"""
diff = compare_xml(xml, expected)
assert diff is None, diff
[docs] def test_outline_cols(self, ColumnDimension):
ws = DummyWorksheet()
cd = ColumnDimension(ws, index="B", outline_level=1)
cd.reindex()
col = cd.to_tree()
xml = tostring(col)
expected = """<col max="2" min="2" outlineLevel="1"/>"""
diff = compare_xml(expected, xml)
assert diff is None, diff
[docs] def test_copy(self, ColumnDimension):
cd1 = ColumnDimension(worksheet=DummyWorksheet(), style=[])
cd2 = copy(cd1)
assert cd1._style is not cd2._style
assert dict(cd1) == dict(cd2)
[docs] def test_no_named_style(self, ColumnDimension):
cd = ColumnDimension(worksheet=DummyWorksheet())
with pytest.raises(AttributeError):
cd.style = "Normal"
[docs]class TestGrouping:
[docs] def test_group_columns_simple(self):
from ..worksheet import Worksheet
ws = Worksheet(DummyWorkbook())
dims = ws.column_dimensions
dims.group('A', 'C', 1)
assert len(dims) == 1
group = list(dims.values())[0]
assert group.outline_level == 1
assert group.min == 1
assert group.max == 3
[docs] def test_group_columns_collapse(self):
from ..worksheet import Worksheet
ws = Worksheet(DummyWorkbook())
dims = ws.column_dimensions
dims.group('A', 'C', 1, hidden=True)
group = list(dims.values())[0]
assert group.hidden
[docs] def test_no_cols(self):
from ..dimensions import DimensionHolder
dh = DimensionHolder(None)
node = dh.to_tree()
assert node is None