def test_DEC2OCT_checkBounds(self): self.assertEqual(engineering.DEC2OCT(2**29 - 1), func_xltypes.Text('3777777777')) self.assertEqual(engineering.DEC2OCT(-(2**29)), func_xltypes.Text('4000000000')) self.assertIsInstance(engineering.DEC2OCT(2**29), xlerrors.NumExcelError) self.assertIsInstance(engineering.DEC2OCT(-(2**29) - 1), xlerrors.NumExcelError)
def test__Boolean__(self): with self.assertRaises(xlerrors.ValueExcelError): self.value1.__Boolean__() boolean = func_xltypes.Text('true').__Boolean__() self.assertIsInstance(boolean, func_xltypes.Boolean) self.assertEqual(boolean.value, True) self.assertEqual(func_xltypes.Text('TRUE').__Boolean__().value, True) self.assertEqual(func_xltypes.Text('True').__Boolean__().value, True) self.assertEqual(func_xltypes.Text('False').__Boolean__().value, False) with self.assertRaises(xlerrors.ValueExcelError): self.assertEqual(func_xltypes.Text('').__Boolean__().value, False)
def test_SUM_with_nonnumbers_in_range(self): self.assertEqual(math.SUM(func_xltypes.Array([[1, 'bad'], [3, 4]])), 8) self.assertEqual(math.SUM( func_xltypes.Array([ [func_xltypes.Number(1), func_xltypes.Text('N/A')], [func_xltypes.Number(3), func_xltypes.Number(4)] ])), 8)
def test_BIN2HEX_checkBounds(self): self.assertEqual(engineering.BIN2HEX(1111111111), func_xltypes.Text('FFFFFFFFFF')) self.assertIsInstance(engineering.BIN2HEX(11000000000), xlerrors.NumExcelError) self.assertIsInstance(engineering.BIN2HEX(10000000000), xlerrors.NumExcelError)
def eval(self, context): if self.tsubtype == "logical": return func_xltypes.Boolean.cast(self.tvalue) elif self.tsubtype == 'text': return func_xltypes.Text(self.tvalue) elif self.tsubtype == 'error': if self.tvalue in xlerrors.ERRORS_BY_CODE: return xlerrors.ERRORS_BY_CODE[self.tvalue]( f'Error in cell ${context.ref}') return xlerrors.ExcelError(self.tvalue, f'Error in cell ${context.ref}') else: return func_xltypes.Number.cast(self.tvalue)
class DateTimeTest(AbstractExcelTypeTest, unittest.TestCase): value_zero = func_xltypes.DateTime(utils.EXCEL_EPOCH) value1 = func_xltypes.DateTime(datetime.datetime(1900, 1, 1)) native1 = datetime.datetime(1900, 1, 1) num1 = 1 value1_float = 1.0 value1_int = 1 value1_text = '1900-01-01 00:00:00' value1_bool = True value1_dt = datetime.datetime(1900, 1, 1) value2 = func_xltypes.DateTime(datetime.datetime(1900, 2, 1)) native2 = datetime.datetime(1900, 2, 1) num2 = 32 text2 = func_xltypes.Text('1900-02-01 00:00:00') bool2 = func_xltypes.Boolean(True) math_result_type = float def test__sub__(self): res = self.value1 - self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, float) self.assertEqual(res.value, self.num1 - self.num2) def test__bool__(self): self.assertEqual(bool(self.value1), True) self.assertEqual(bool(self.value_zero), True) def test__and__(self): # Bool of datetime will always be true. self.assertEqual((self.value1 & self.value2).value, True) self.assertEqual((self.value1 & self.value_zero).value, True) def test__or__(self): # Bool of datetime will always be true. self.assertEqual((self.value_zero | self.value1).value, True) self.assertEqual((self.value_zero | self.value_zero).value, True) def test__Blank__(self): blank = self.value1.__Blank__() self.assertIsNone(blank) def test__repr__(self): self.assertEqual(repr(self.value1), '<DateTime 1900-01-01T00:00:00>')
def test__bool__(self): self.assertEqual(bool(func_xltypes.Text('true')), True) self.assertEqual(bool(func_xltypes.Text('false')), False) self.assertEqual(bool(func_xltypes.Text('data')), True) self.assertEqual(bool(func_xltypes.Text('')), False)
def test__number___with_unvonvertable_data(self): with self.assertRaises(xlerrors.ValueExcelError): func_xltypes.Text('data').__number__()
def test__number__(self): self.assertEqual(func_xltypes.Text('1').__number__(), 1) self.assertEqual(func_xltypes.Text('1.0').__number__(), 1.0) self.assertEqual(func_xltypes.Text('true').__number__(), 1) self.assertEqual(func_xltypes.Text('1900-01-01').__number__(), 1)
def test_HEX2OCT(self): self.assertEqual(engineering.HEX2OCT(8), func_xltypes.Text('10')) self.assertEqual(engineering.HEX2OCT('1E3'), func_xltypes.Text('743'))
class BooleanTest(AbstractExcelTypeTest, unittest.TestCase): value_zero = func_xltypes.Boolean(False) value1 = func_xltypes.Boolean(True) native1 = True num1 = 1 value1_float = 1.0 value1_int = 1 value1_text = 'True' value1_bool = True value1_dt = datetime.datetime(1999, 12, 31) value2 = func_xltypes.Boolean(True) native2 = True num2 = 1 text2 = func_xltypes.Text('True') bool2 = func_xltypes.Boolean(True) def test__lt__(self): res = self.value_zero < self.value1 self.assertIsInstance(res, func_xltypes.Boolean) self.assertIsInstance(res.value, bool) self.assertEqual(res.value, True) def test__lt___with_Text(self): self.assertEqual((self.value1 < func_xltypes.Text('data')).value, False) def test__lt___with_Boolean(self): self.assertEqual((self.value_zero < self.bool2).value, True) def test__lt___with_DateTime(self): self.assertEqual((self.value1 < self.dt2).value, False) def test__le__(self): self.assertEqual((self.value_zero <= self.value2).value, True) self.assertEqual((self.value_zero <= self.value_zero).value, True) self.assertEqual((self.value2 <= self.value_zero).value, False) def test__eq__(self): self.assertEqual((self.value_zero == self.value2).value, False) self.assertEqual((self.value_zero == self.value_zero).value, True) def test__ne__(self): self.assertEqual((self.value_zero != self.value2).value, True) self.assertEqual((self.value_zero != self.value_zero).value, False) def test__gt__(self): self.assertEqual((self.value_zero > self.value2).value, False) self.assertEqual((self.value2 > self.value_zero).value, True) def test__ge__(self): self.assertEqual((self.value2 >= self.value_zero).value, True) self.assertEqual((self.value_zero >= self.value_zero).value, True) self.assertEqual((self.value_zero >= self.value2).value, False) def test__and__(self): self.assertEqual((self.value2 & self.value2).value, True) self.assertEqual((self.value2 & self.value_zero).value, False) def test__or__(self): self.assertEqual((self.value_zero | self.value2).value, True) self.assertEqual((self.value_zero | self.value_zero).value, False) def test__bool__(self): self.assertEqual(bool(self.value2), True) self.assertEqual(bool(self.value_zero), False) def test__Blank__(self): blank = self.value1.__Blank__() self.assertIsInstance(blank, func_xltypes.Boolean) self.assertEqual(blank.value, False)
def test_DEC2HEX(self): self.assertEqual(engineering.DEC2HEX(255), func_xltypes.Text('FF')) self.assertEqual(engineering.DEC2HEX(-1), func_xltypes.Text('FFFFFFFFFF')) self.assertEqual(engineering.DEC2HEX(-2), func_xltypes.Text('FFFFFFFFFE'))
def test_DEC2HEX_withPlaces(self): self.assertEqual(engineering.DEC2HEX(16, 5), func_xltypes.Text('00010')) self.assertEqual(engineering.DEC2HEX(-1, 1), func_xltypes.Text('FFFFFFFFFF'))
def test_DEC2BIN(self): self.assertEqual(engineering.DEC2BIN(10), func_xltypes.Text('1010'))
def test_DEC2OCT_withPlaces(self): self.assertEqual(engineering.DEC2OCT(8, 5), func_xltypes.Text('00010')) self.assertEqual(engineering.DEC2OCT(-1, 1), func_xltypes.Text('7777777777'))
def test_HEX2BIN_checkBounds(self): self.assertEqual(engineering.HEX2BIN('1FF'), func_xltypes.Text('111111111')) self.assertIsInstance(engineering.HEX2BIN('FFFFFFFDFF'), xlerrors.NumExcelError)
def test_DEC2OCT(self): self.assertEqual(engineering.DEC2OCT(8), func_xltypes.Text('10')) self.assertEqual(engineering.DEC2OCT(-1), func_xltypes.Text('7777777777')) self.assertEqual(engineering.DEC2OCT(-2), func_xltypes.Text('7777777776'))
def test_HEX2OCT_withPlaces(self): self.assertEqual(engineering.HEX2OCT(8, 5), func_xltypes.Text('00010')) self.assertEqual(engineering.HEX2OCT('FFFFFFFE00', 1), func_xltypes.Text('7777777000'))
def test__datetime__(self): self.assertEqual(func_xltypes.Text('1').__datetime__(), self.value1_dt) self.assertEqual( func_xltypes.Text('1900-01-01').__datetime__(), self.value1_dt)
def test_DEC2BIN_withPlaces(self): self.assertEqual(engineering.DEC2BIN(10, 5), func_xltypes.Text('01010'))
def test_HEX2BIN(self): self.assertEqual(engineering.HEX2BIN(2), func_xltypes.Text('10')) self.assertEqual(engineering.HEX2BIN('1E0'), func_xltypes.Text('111100000'))
def test_ISNUMBER(self): self.assertFalse(information.ISNUMBER(func_xltypes.Text("hello"))) self.assertTrue(information.ISNUMBER(func_xltypes.Number(1234))) self.assertFalse(information.ISNUMBER("hello")) self.assertTrue(information.ISNUMBER(1234)) self.assertFalse(information.ISNUMBER("1234"))
def test__lt___with_Text(self): self.assertEqual((self.value1 < func_xltypes.Text('data')).value, False)
def test_OCT2HEX_withPlaces(self): self.assertEqual(engineering.OCT2HEX(20, 5), func_xltypes.Text('00010')) self.assertEqual(engineering.OCT2HEX(4000000000, 1), func_xltypes.Text('FFE0000000'))
def test__add__with_unconvertible_Text(self): with self.assertRaises(xlerrors.ValueExcelError): self.value1 + func_xltypes.Text('data')
class TextTest(AbstractExcelTypeTest, unittest.TestCase): value_zero = func_xltypes.Text('') value1 = func_xltypes.Text('1') native1 = '1' num1 = 1 value1_float = 1.0 value1_int = 1 value1_text = '1' value1_bool = True value1_dt = datetime.datetime(1900, 1, 1) value2 = func_xltypes.Text('2') native2 = '2' num2 = 2 text2 = func_xltypes.Text('2') bool2 = func_xltypes.Boolean(True) def test__add__with_unconvertible_Text(self): with self.assertRaises(xlerrors.ValueExcelError): self.value1 + func_xltypes.Text('data') def test__lt___with_Boolean(self): self.assertEqual((self.value1 < self.bool2).value, True) def test__lt___with_DateTime(self): # Text is always greater for comparison and is not converted. self.assertEqual((self.value1 < self.dt2).value, False) def test__int___with_unvonvertable_data(self): with self.assertRaises(xlerrors.ValueExcelError): int(func_xltypes.Text('data')) def test__float___with_unvonvertable_data(self): with self.assertRaises(xlerrors.ValueExcelError): float(func_xltypes.Text('data')) def test__number__(self): self.assertEqual(func_xltypes.Text('1').__number__(), 1) self.assertEqual(func_xltypes.Text('1.0').__number__(), 1.0) self.assertEqual(func_xltypes.Text('true').__number__(), 1) self.assertEqual(func_xltypes.Text('1900-01-01').__number__(), 1) def test__number___with_unvonvertable_data(self): with self.assertRaises(xlerrors.ValueExcelError): func_xltypes.Text('data').__number__() def test__bool__(self): self.assertEqual(bool(func_xltypes.Text('true')), True) self.assertEqual(bool(func_xltypes.Text('false')), False) self.assertEqual(bool(func_xltypes.Text('data')), True) self.assertEqual(bool(func_xltypes.Text('')), False) def test__datetime__(self): self.assertEqual(func_xltypes.Text('1').__datetime__(), self.value1_dt) self.assertEqual( func_xltypes.Text('1900-01-01').__datetime__(), self.value1_dt) def test__Boolean__(self): with self.assertRaises(xlerrors.ValueExcelError): self.value1.__Boolean__() boolean = func_xltypes.Text('true').__Boolean__() self.assertIsInstance(boolean, func_xltypes.Boolean) self.assertEqual(boolean.value, True) self.assertEqual(func_xltypes.Text('TRUE').__Boolean__().value, True) self.assertEqual(func_xltypes.Text('True').__Boolean__().value, True) self.assertEqual(func_xltypes.Text('False').__Boolean__().value, False) with self.assertRaises(xlerrors.ValueExcelError): self.assertEqual(func_xltypes.Text('').__Boolean__().value, False) def test__Blank__(self): blank = self.value1.__Blank__() self.assertIsInstance(blank, func_xltypes.Text) self.assertEqual(blank.value, '')
def test_ISODD_error(self): self.assertIsInstance(information.ISODD(func_xltypes.Text("hello")), xlerrors.ValueExcelError)
def test_HEX2BIN_withPlaces(self): self.assertEqual(engineering.HEX2BIN(2, 5), func_xltypes.Text('00010')) self.assertEqual(engineering.HEX2BIN('FFFFFFFE00', 1), func_xltypes.Text('1000000000'))
def test_ISBLANK(self): self.assertTrue(information.ISBLANK(func_xltypes.Blank())) self.assertFalse(information.ISBLANK(func_xltypes.Text("hello"))) self.assertTrue(information.ISBLANK(func_xltypes.Text("")))
class AbstractExcelTypeTest: value_zero = func_xltypes.Number(0) value1 = func_xltypes.Number(1) native1 = 1 num1 = 1 value1_float = 1 value1_int = 1 value1_text = '1' value1_bool = True value1_dt = datetime.datetime(1900, 1, 1) value2 = func_xltypes.Number(2) native2 = 2 num2 = 2 text2 = func_xltypes.Text('2') bool2 = func_xltypes.Boolean(True) dt2 = func_xltypes.DateTime(datetime.datetime(2020, 1, 1, 12, 0, 0)) dt2_float = 6523831.0 math_result_type = int def test__add__(self): res = self.value1 + self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 + self.num2) def test__add___with_native_addend(self): res = self.value1 + self.native2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 + self.num2) def test__add__with_Text(self): res = self.value1 + self.text2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 + self.num2) def test__add__with_unconvertible_Text(self): with self.assertRaises(xlerrors.ValueExcelError): self.value1 + func_xltypes.Text('data') def test__add__with_Boolean(self): res = self.value1 + self.bool2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 + 1) def test__add__with_DateTime(self): res = self.value1 + self.dt2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, float) self.assertEqual(res.value, self.num1 + self.dt2_float) def test__sub__(self): res = self.value1 - self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 - self.num2) def test__sub___with_native_subtrahend(self): res = self.value1 - self.native2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 - self.num2) def test__mul__(self): res = self.value1 * self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 * self.num2) def test__mul___with_native_factor(self): res = self.value1 * self.num2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1 * self.num2) def test__mul__with_DateTime(self): self.assertEqual((self.value1 * self.dt2).value, self.num1 * self.dt2_float) def test__truediv__(self): res = self.value1 / self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, float) self.assertEqual(res.value, self.num1 / self.num2) def test__truediv___by_zero(self): with self.assertRaises(xlerrors.DivZeroExcelError): self.value1 / 0 def test__truediv___with_native_divisor(self): res = self.value1 / self.native2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, float) self.assertEqual(res.value, self.num1 / self.num2) def test__truediv__with_DateTime(self): self.assertEqual((self.value1 / self.dt2).value, self.num1 / self.dt2_float) def test__pow__(self): res = self.value1**self.value2 self.assertIsNot(res, self.value1) self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1**self.num2) def test__pow___with_native_exponent(self): res = self.value1**self.num2 self.assertIsInstance(res, func_xltypes.Number) self.assertIsInstance(res.value, self.math_result_type) self.assertEqual(res.value, self.num1**self.num2) def test__pow__with_DateTime(self): self.assertEqual((self.value1**self.dt2).value, self.num1**self.dt2_float) def test__lt__(self): res = self.value1 < self.value2 self.assertIsInstance(res, func_xltypes.Boolean) self.assertIsInstance(res.value, bool) self.assertEqual(res.value, True) def test__lt___with_Text(self): self.assertEqual((self.value1 < func_xltypes.Text('data')).value, True) def test__lt___with_Boolean(self): self.assertEqual((self.value_zero < self.bool2).value, True) self.assertEqual((self.value2 < self.bool2).value, True) def test__lt___with_DateTime(self): self.assertEqual((self.value1 < self.dt2).value, True) def test__le__(self): self.assertEqual((self.value1 <= self.value2).value, True) self.assertEqual((self.value1 <= self.value1).value, True) self.assertEqual((self.value2 <= self.value1).value, False) def test__eq__(self): self.assertEqual((self.value1 == self.value2).value, False) self.assertEqual((self.value1 == self.value1).value, True) def test__ne__(self): self.assertEqual((self.value1 != self.value2).value, True) self.assertEqual((self.value1 != self.value1).value, False) def test__gt__(self): self.assertEqual((self.value1 > self.value2).value, False) self.assertEqual((self.value2 > self.value1).value, True) def test__ge__(self): self.assertEqual((self.value2 >= self.value1).value, True) self.assertEqual((self.value1 >= self.value1).value, True) self.assertEqual((self.value1 >= self.value2).value, False) def test__and__(self): self.assertEqual((self.value1 & self.value2).value, True) self.assertEqual((self.value1 & self.value_zero).value, False) def test__or__(self): self.assertEqual((self.value_zero | self.value1).value, True) self.assertEqual((self.value_zero | self.value_zero).value, False) def test__int__(self): self.assertEqual(int(self.value1), self.value1_int) self.assertEqual(int(func_xltypes.Number(self.value1_float)), self.value1_int) def test__float__(self): self.assertEqual(float(self.value1), self.value1_float) self.assertEqual(float(func_xltypes.Number(self.value1_float)), self.value1_float) def test__str__(self): self.assertEqual(str(self.value1), self.value1_text) def test__bool__(self): self.assertEqual(bool(self.value1), True) self.assertEqual(bool(self.value_zero), False) def test__Number__(self): self.assertEqual(self.value1.__Number__().value, self.num1) def test__Text__(self): text = self.value1.__Text__() self.assertIsInstance(text, func_xltypes.Text) self.assertEqual(text.value, self.value1_text) def test__Boolean__(self): boolean = self.value1.__Boolean__() self.assertIsInstance(boolean, func_xltypes.Boolean) self.assertEqual(boolean.value, True) def test__DateTime__(self): dt = self.value1.__DateTime__() self.assertIsInstance(dt, func_xltypes.DateTime) self.assertEqual(dt.value, self.value1_dt) def test__hash__(self): self.assertEqual(hash(self.value1), hash(self.value1.value))