Changeset 49

Show
Ignore:
Timestamp:
22/09/05 09:40:35 (3 years ago)
Author:
steve
Message:

Ensure that None is interpreted as False in conditionals and binary logical expressions

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/airspeed.py

    r48 r49  
    2727    operator.__eq__ = lambda a, b: a == b 
    2828    operator.__ne__ = lambda a, b: a != b 
    29     operator.__or__ = lambda a, b: a or b 
    30     operator.__and__ = lambda a, b: a and b 
    3129try: 
    3230    basestring 
     
    3836# Public interface 
    3937############################################################################### 
     38 
     39def boolean_value(variable_value): 
     40    if variable_value == False: return False 
     41    return not (variable_value is None) 
     42 
    4043 
    4144class Template: 
     
    443446                 '<' : operator.__lt__, '<=': operator.__le__, 
    444447                 '==': operator.__eq__, '!=': operator.__ne__, 
    445                  '||': operator.__or__, '&&': operator.__and__} 
     448                 '||': lambda a,b : boolean_value(a) or boolean_value(b), 
     449                 '&&': lambda a,b : boolean_value(a) and boolean_value(b)} 
    446450    def parse(self): 
    447451        op_string, = self.identity_match(self.BINARY_OP) 
  • trunk/airspeed_test.py

    r48 r49  
    8686        namespace["is_birthday"] = True 
    8787        self.assertEquals("Hello your name is Steve. Happy Birthday. Good to see you", template.merge(namespace)) 
     88 
     89    def test_if_statement_considers_None_to_be_false(self): 
     90        template = airspeed.Template("#if ($some_value)hide me#end") 
     91        self.assertEquals('', template.merge({})) 
     92        self.assertEquals('', template.merge({'some_value': None})) 
    8893 
    8994    def test_new_lines_in_templates_are_permitted(self): 
     
    314319        self.assertEquals('yes', template.merge({'value1': False, 'value2': True})) 
    315320 
     321    def test_or_operator_considers_not_None_values_true(self): 
     322        class SomeClass: pass 
     323        template = airspeed.Template('#if ( $value1 || $value2 )yes#end') 
     324        self.assertEquals('', template.merge({'value1': None, 'value2': None})) 
     325        self.assertEquals('yes', template.merge({'value1': SomeClass(), 'value2': False})) 
     326        self.assertEquals('yes', template.merge({'value1': False, 'value2': SomeClass()})) 
     327 
    316328    def test_and_operator(self): 
    317329        template = airspeed.Template('#if ( $value1 && $value2 )yes#end') 
     
    321333        self.assertEquals('yes', template.merge({'value1': True, 'value2': True})) 
    322334 
     335    def test_and_operator_considers_not_None_values_true(self): 
     336        class SomeClass: pass 
     337        template = airspeed.Template('#if ( $value1 && $value2 )yes#end') 
     338        self.assertEquals('', template.merge({'value1': None, 'value2': None})) 
     339        self.assertEquals('yes', template.merge({'value1': SomeClass(), 'value2': True})) 
     340        self.assertEquals('yes', template.merge({'value1': True, 'value2': SomeClass()})) 
     341 
    323342    def test_parenthesised_value(self): 
    324343        template = airspeed.Template('#if ( ($value1 == 1) && ($value2 == 2) )yes#end') 
     
    337356        self.assertEquals('yes', template.merge({'value': False})) 
    338357        self.assertEquals('', template.merge({'value': True})) 
     358 
     359    def test_logical_negation_operator_yields_true_for_None(self): 
     360        template = airspeed.Template('#if ( !$value )yes#end') 
     361        self.assertEquals('yes', template.merge({'value': None})) 
    339362 
    340363    def test_compound_binary_and_unary_operators(self):