from __future__ import absolute_import
# Copyright (c) 2010-2017 openpyxl
import datetime
import pytest
from openpyxl.cell.read_only import ReadOnlyCell
from openpyxl.utils.indexed_list import IndexedList
from openpyxl.styles.styleable import StyleArray
@pytest.fixture(scope='module')
[docs]def dummy_sheet():
class DummyWorkbook(object):
shared_styles = IndexedList()
style = StyleArray()
shared_styles.add(style) # Workbooks always have a default style
_cell_styles = IndexedList()
_cell_styles.add(style)
_number_formats = IndexedList()
_fonts = IndexedList()
_fonts.add(None)
class DummySheet(object):
base_date = 2415018.5
style_table = {}
shared_strings = ['Hello world']
parent = DummyWorkbook()
return DummySheet()
[docs]def test_ctor(dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, '10', 'n')
assert cell.value == 10
[docs]def test_empty_cell(dummy_sheet):
from openpyxl.cell.read_only import EMPTY_CELL
assert EMPTY_CELL.value is None
assert EMPTY_CELL.data_type == 'n'
[docs]def test_base_date(dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, '10', 'n')
assert cell.base_date == 2415018.5
[docs]def test_string_table(dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, '0', 's')
assert cell.shared_strings == ['Hello world']
assert cell.value == 'Hello world'
[docs]def test_coordinate(dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, 1, 1, 10, None)
assert cell.coordinate == "A1"
@pytest.mark.parametrize("value, expected",
[
('1', True),
('0', False),
])
[docs]def test_bool(dummy_sheet, value, expected):
cell = ReadOnlyCell(dummy_sheet, None, None, value, 'b')
assert cell.value is expected
[docs]def test_inline_String(dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, "Hello World!", 'inlineStr')
assert cell.value == "Hello World!"
@pytest.mark.parametrize("value, expected",
[
("24555", 24555),
("1.5", 1.5),
(None, None),
])
[docs]def test_numeric(dummy_sheet, value, expected):
cell = ReadOnlyCell(dummy_sheet, None, None, value, 'n')
v = cell.value
assert v == expected
assert hasattr(v, 'is_integer') == hasattr(expected, 'is_integer'),\
"Expected {0}, {1}".format(type(expected), type(v))
@pytest.fixture(scope="class")
[docs]def DummyCell(dummy_sheet):
dummy_sheet.parent._number_formats.add('d-mmm-yy')
style = StyleArray([0,0,0,164,0,0,0,0,0])
dummy_sheet.parent._cell_styles.add(style)
cell = ReadOnlyCell(dummy_sheet, None, None, "23596", 'n', 1)
return cell
[docs]class TestDateTime:
[docs] def test_is_date(self, DummyCell):
assert DummyCell.is_date is True
[docs] def test_conversion(self, DummyCell):
assert DummyCell.value == datetime.datetime(1964, 8, 7, 0, 0, 0)
[docs] def test_interal_value(self, DummyCell):
assert DummyCell.internal_value == 23596
[docs]class TestStyle:
[docs] def test_style_array(self, dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, None)
assert cell.style_array == StyleArray()
[docs] def test_font(self, dummy_sheet):
cell = ReadOnlyCell(dummy_sheet, None, None, None)
assert cell.font == None
[docs]def test_read_only(dummy_sheet):
cell = ReadOnlyCell(sheet=dummy_sheet, row=None, column=None, value='1')
assert cell.value == 1
with pytest.raises(AttributeError):
cell.value = 10
with pytest.raises(AttributeError):
cell.style = 1
[docs]def test_equality():
c1 = ReadOnlyCell(None, None, 10, None)
c2 = ReadOnlyCell(None, None, 10, None)
assert c1 is not c2
assert c1 == c2
c3 = ReadOnlyCell(None, None, 5, None)
assert c3 != c1
@pytest.mark.parametrize("value, expected",
[
('4.2', 4.2),
('-42.000', -42),
('0', 0),
('0.9999', 0.9999),
('99E-02', 0.99),
('4', 4),
('-1E3', -1000),
('1E-3', 0.001),
('2e+2', 200.0),
]
)
[docs]def test_number_convesion(value, expected):
from .. read_only import _cast_number
assert _cast_number(value) == expected