Changeset 48

Show
Ignore:
Timestamp:
15/09/05 10:01:39 (3 years ago)
Author:
steve
Message:

Add ! unary operator

Files:

Legend:

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

    r47 r48  
    319319class Value(_Element): 
    320320    def parse(self): 
    321         self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral, InterpolatedStringLiteral, ArrayLiteral, Condition)) 
     321        self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral, InterpolatedStringLiteral, ArrayLiteral, Condition, UnaryOperatorValue)) 
    322322 
    323323    def calculate(self, namespace, loader): 
     
    449449 
    450450 
     451class UnaryOperatorValue(_Element): 
     452    UNARY_OP = re.compile(r'\s*(!)\s*(.*)$', re.S) 
     453    OPERATORS = {'!': operator.__not__} 
     454    def parse(self): 
     455        op_string, = self.identity_match(self.UNARY_OP) 
     456        self.value = self.next_element(Value) 
     457        self.op = self.OPERATORS[op_string] 
     458 
     459    def calculate(self, namespace, loader): 
     460        return self.op(self.value.calculate(namespace, loader)) 
     461 
     462 
    451463class Condition(_Element): 
    452464    START = re.compile(r'\(\s*(.*)$', re.S) 
  • trunk/airspeed_test.py

    r47 r48  
    332332        self.assertEquals('', template.merge({'value': False})) 
    333333        self.assertEquals('yes', template.merge({'value': True})) 
     334 
     335    def test_logical_negation_operator(self): 
     336        template = airspeed.Template('#if ( !$value )yes#end') 
     337        self.assertEquals('yes', template.merge({'value': False})) 
     338        self.assertEquals('', template.merge({'value': True})) 
     339 
     340    def test_compound_binary_and_unary_operators(self): 
     341        template = airspeed.Template('#if ( !$value1 && !$value2 )yes#end') 
     342        self.assertEquals('', template.merge({'value1': False, 'value2': True})) 
     343        self.assertEquals('', template.merge({'value1': True, 'value2': False})) 
     344        self.assertEquals('', template.merge({'value1': True, 'value2': True})) 
     345        self.assertEquals('yes', template.merge({'value1': False, 'value2': False})) 
    334346 
    335347    def test_cannot_define_macro_to_override_reserved_statements(self):