def test_defined_name_formula(self): self.assertASTNodesEqual( xltypes.XLFormula('=SUM(A1:B1)').tokens, [ f_token(tvalue='SUM', ttype='function', tsubtype='start'), f_token(tvalue='A1:B1', ttype='operand', tsubtype='range'), f_token(tvalue='', ttype='function', tsubtype='stop') ])
def test_cell_minus_with_sheet(self): self.assertASTNodesEqual( self.parse('-Sheet1!A1'), [ f_token(tvalue='-', ttype='operator-prefix', tsubtype=''), f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range') ] )
def create_node(self): node = ast_nodes.OperatorNode( f_token(tvalue='+', ttype='operator-infix', tsubtype='math')) node.left = ast_nodes.OperandNode( f_token(tvalue='1', ttype='operand', tsubtype='number')) node.right = ast_nodes.OperandNode( f_token(tvalue='2', ttype='operand', tsubtype='number')) return node
def test_cells_union(self): self.assertASTNodesEqual( self.parse('A1,B1'), [ f_token(tvalue='A1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='operator-infix', tsubtype='union'), f_token(tvalue='B1', ttype='operand', tsubtype='range') ] )
def test_cells_union_with_different_sheet(self): self.assertASTNodesEqual( self.parse('Sheet1!A1,Sheet2!B1'), [ f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='operator-infix', tsubtype='union'), f_token(tvalue='Sheet2!B1', ttype='operand', tsubtype='range') ] )
def test_cells_addition(self): self.assertASTNodesEqual( self.parse('A1+B1'), [ f_token(tvalue='A1', ttype='operand', tsubtype='range'), f_token(tvalue='+', ttype='operator-infix', tsubtype='math'), f_token(tvalue='B1', ttype='operand', tsubtype='range') ] )
def test_range_address_function(self): self.assertASTNodesEqual( self.parse('SUM(A1:B1)'), [ f_token(tvalue='SUM', ttype='function', tsubtype='start'), f_token(tvalue='A1:B1', ttype='operand', tsubtype='range'), f_token(tvalue='', ttype='function', tsubtype='stop'), ] )
def test_range_address_union(self): self.assertASTNodesEqual( self.parse('A1:B1,A2:B2'), [ f_token(tvalue='A1:B1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='operator-infix', tsubtype='union'), f_token(tvalue='A2:B2', ttype='operand', tsubtype='range') ] )
def test_cells_addition_with_same_sheet(self): self.assertASTNodesEqual( self.parse('Sheet1!A1+Sheet1!B1'), [ f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range'), f_token(tvalue='+', ttype='operator-infix', tsubtype='math'), f_token(tvalue='Sheet1!B1', ttype='operand', tsubtype='range') ] )
def create_node(self): node = ast_nodes.FunctionNode( f_token(tvalue='MOD', ttype='function', tsubtype='start')) node.args = [ ast_nodes.OperandNode( f_token(tvalue='3', ttype='operand', tsubtype='number')), ast_nodes.OperandNode( f_token(tvalue='2', ttype='operand', tsubtype='number')), ] return node
def test_eval_expr_var_positional(self): node = ast_nodes.FunctionNode( f_token(tvalue='AND', ttype='function', tsubtype='start')) node.args = [ ast_nodes.OperandNode( f_token(tvalue='3', ttype='operand', tsubtype='number')), ast_nodes.OperandNode( f_token(tvalue='2', ttype='operand', tsubtype='number')), ] self.assertEqual(node.eval(context('A1')), True)
def test_cells_function_with_trailing_comma(self): self.assertASTNodesEqual( self.parse('SUM(A1,)'), [ f_token(tvalue='SUM', ttype='function', tsubtype='start'), f_token(tvalue='A1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='argument', tsubtype=''), f_token(tvalue='', ttype='function', tsubtype='stop') ] )
def test_cells_is_equal_with_sheet(self): self.assertASTNodesEqual( self.parse('Sheet1!A1=Sheet1!B1'), [ f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range'), f_token( tvalue='=', ttype='operator-infix', tsubtype='logical'), f_token(tvalue='Sheet1!B1', ttype='operand', tsubtype='range') ] )
def test_cells_function_with_sheet(self): self.assertASTNodesEqual( self.parse('SUM(Sheet1!A1,Sheet1!B1)'), [ f_token(tvalue='SUM', ttype='function', tsubtype='start'), f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='argument', tsubtype=''), f_token(tvalue='Sheet1!B1', ttype='operand', tsubtype='range'), f_token(tvalue='', ttype='function', tsubtype='stop') ] )
def test_concat(self): self.assertASTNodesEqual( self.parse('"hi" & "de"'), [ f_token(tvalue='hi', ttype='operand', tsubtype='text'), f_token( tvalue='&', ttype='operator-infix', tsubtype='concatenate'), f_token(tvalue='de', ttype='operand', tsubtype='text'), ] )
def test_text(self): self.assertASTNodesEqual( self.parse('"data"'), [ f_token(tvalue='data', ttype='operand', tsubtype='text'), ] )
def test_float(self): self.assertASTNodesEqual( self.parse('1.0'), [ f_token(tvalue='1.0', ttype='operand', tsubtype='number'), ] )
def test_cell_address_with_sheet(self): self.assertASTNodesEqual( self.parse('Sheet1!A1'), [ f_token(tvalue='Sheet1!A1', ttype='operand', tsubtype='range') ] )
def test_bool(self): self.assertASTNodesEqual( self.parse('TRUE'), [ f_token(tvalue='TRUE', ttype='operand', tsubtype='logical'), ] )
def test_cell_address_by_number(self): self.assertASTNodesEqual( self.parse('R[1]C[1]'), [ f_token(tvalue='R[1]C[1]', ttype='operand', tsubtype='range') ] )
def test_cell_address(self): self.assertASTNodesEqual( self.parse('A1'), [ f_token(tvalue='A1', ttype='operand', tsubtype='range') ] )
def test_null(self): self.assertASTNodesEqual( self.parse('NULL'), [ f_token(tvalue='NULL', ttype='operand', tsubtype='range'), ] )
def test_error(self): self.assertASTNodesEqual( self.parse('#NUM!'), [ f_token(tvalue='#NUM!', ttype='operand', tsubtype='error'), ] )
def test_range_address_with_same_sheets(self): self.assertASTNodesEqual( self.parse('Sh1!A1:Sh1!B1'), [ f_token(tvalue='Sh1!A1:Sh1!B1', ttype='operand', tsubtype='range') ] )
def test_range_address_with_different_sheets(self): # THIS CAN'T HAPPEN IN REAL LIFE self.assertASTNodesEqual( self.parse('Sh1!A1:Sh2!B1'), [ f_token(tvalue='Sh1!A1:Sh2!B1', ttype='operand', tsubtype='range') ] )
def test_cells_function_and_operator(self): self.assertASTNodesEqual( self.parse('SUM(A1+B1,C1)'), [ f_token(tvalue='SUM', ttype='function', tsubtype='start'), f_token(tvalue='A1', ttype='operand', tsubtype='range'), f_token(tvalue='+', ttype='operator-infix', tsubtype='math'), f_token(tvalue='B1', ttype='operand', tsubtype='range'), f_token(tvalue=',', ttype='argument', tsubtype=''), f_token(tvalue='C1', ttype='operand', tsubtype='range'), f_token(tvalue='', ttype='function', tsubtype='stop') ] )
def test_array_formula(self): self.assertASTNodesEqual( self.parse('{=1}'), [ f_token(tvalue='ARRAY', ttype='function', tsubtype='start'), f_token(tvalue='ARRAYROW', ttype='function', tsubtype='start'), f_token( tvalue='=', ttype='operator-infix', tsubtype='logical'), f_token(tvalue='1', ttype='operand', tsubtype='number'), f_token(tvalue='', ttype='function', tsubtype='stop'), f_token(tvalue='', ttype='function', tsubtype='stop'), ] )
def test_eval_expr(self): cond_node = ast_nodes.OperatorNode( f_token(tvalue='>', ttype='operator-infix', tsubtype='math')) cond_node.left = ast_nodes.OperandNode( f_token(tvalue='1', ttype='operand', tsubtype='number')) cond_node.right = ast_nodes.OperandNode( f_token(tvalue='0', ttype='operand', tsubtype='number')) node = ast_nodes.FunctionNode( f_token(tvalue='IF', ttype='function', tsubtype='start')) node.args = [ cond_node, ast_nodes.OperandNode( f_token(tvalue='3', ttype='operand', tsubtype='number')), ast_nodes.OperandNode( f_token(tvalue='2', ttype='operand', tsubtype='number')), ] self.assertEqual(node.eval(context('A1')), 3)
def create_node(self, value='1', type='nuber'): return ast_nodes.OperandNode( f_token(tvalue=value, ttype='operand', tsubtype=type))
def create_node(self): return ast_nodes.ASTNode( f_token(tvalue='tv', ttype='tt', tsubtype='tst'))