- 
            
               
              
                - 
                  Given Clean OpenHAB with latest Ruby Libraries
 
 
- 
            
               QuantityType is constructuble with | from numeric
              
                - 
                  Given code in a rules file  logger.info("Result is #{(<quantity>).format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | result |  
                        | 50 |'°F' | 50.0 °F |  |  
                        | 50.0 |'°F' | 50.0 °F |  |  
                        | 50.to_d |'°F' | 50.0 °F |  |  
 
 
 
 
- 
            
               QuantityType is constructuble with | from numeric from within rule
              
                - 
                  Given items:| type | name | state | 
|---|
 | Number | NumberItem1 | 0 |  
 
- 
                  And code in a rules file  rule '| test' do
    changed NumberItem1
    run { logger.info("Result is #{(<quantity>).format('%.1f %unit%')}") }
  end
 
- 
                  When I deploy the rules file
- 
                  And item "NumberItem1" state is changed to "1"
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | result |  
                        | 50 |'°F' | 50.0 °F |  |  
                        | 50.0 |'°F' | 50.0 °F |  |  
                        | 50.to_d |'°F' | 50.0 °F |  |  
 
 
 
 
- 
            
               Numeric item triggers NoMethodError when | is applied to a NULL/UNDEF state
              
                - 
                  Given items:| type | name | state | 
|---|
 | Number | NumberItem1 | <state> |  
 
- 
                  And code in a rules file  begin
    NumberItem1 | 'W'
    logger.info("All Good!")
  rescue NoMethodError
    logger.info("NoMethodError caught!")
  end
 
- 
                  When I deploy the rules file
- 
                  Then It should log '<result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | state | result |  
                        | NULL | NoMethodError caught! |  |  
                        | UNDEF | NoMethodError caught! |  |  
                        | 10 | All Good! |  |  
 
 
 
 
- 
            
               QuantityType responds to math operations where operand is a quantity type
              
                - 
                  Given code in a rules file  logger.debug("<quantity> <operator> <operand> = <result>")
  result = <quantity> <operator> <operand>
  logger.info("Result is #{result.format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | operator | operand | result |  
                        | QuantityType.new('50 °F') | + | QuantityType.new('50 °F') | 100.0 °F |  |  
                        | QuantityType.new('50 °F') | - | QuantityType.new('25 °F') | 25.0 °F |  |  
                        | QuantityType.new('100 °F') | / | QuantityType.new('2 °F') | 50.0 |  |  
                        | QuantityType.new('50 °F') | + | -QuantityType.new('25 °F') | 25.0 °F |  |  
 
 
 
 
- 
            
               QuantityType responds to math operations where operand is a string
              
                - 
                  Given code in a rules file  result = <quantity><operator> <operand>
  logger.info("Result is #{result.format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | operator | operand | result |  
                        | QuantityType.new('50 °F') | + | '50 °F' | 100.0 °F |  |  
                        | QuantityType.new('50 °F') | - | '25 °F' | 25.0 °F |  |  
 
 
 
 
- 
            
               QuantityType responds to math operations where operand is Numeric
              
                - 
                  Given code in a rules file  result = <quantity><operator> <operand>
  logger.info("Result is #{result.format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | operator | operand | result |  
                        | QuantityType.new('50 °F') | * | 2 | 100.0 °F |  |  
                        | QuantityType.new('100 °F') | / | 2 | 50.0 °F |  |  
                        | QuantityType.new('50 °F') | * | 2.0 | 100.0 °F |  |  
                        | QuantityType.new('100 °F') | / | 2.0 | 50.0 °F |  |  
 
 
 
 
- 
            
               QuantityType responds to math operations where operand is a NumberItem with or without dimensions
              
                - 
                  Given items:| type | name | label | state | pattern | 
|---|
 | Number:Temperature | NumberF | Number Fahrenheit | 2 | %.5f °F |  | Number:Temperature | NumberC | Number Celsius | 2 | %.5f °C |  | Number | Dimensionless | Number Dimensionless | 2 |  |  
 
- 
                  And code in a rules file  result = <quantity> <operator> <operand>
  logger.info("Result is #{result.format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | operator | operand | result |  
                        | QuantityType.new('50 °F') | + | NumberF | 52.0 °F |  |  
                        | QuantityType.new('50 °F') | * | Dimensionless | 100.0 °F |  |  
                        | QuantityType.new('50 °F') | / | Dimensionless | 25.0 °F |  |  
 
 
 
 
- 
            
               Quantity types can be compared
              
                - 
                  Given code in a rules file  result = <quantity> <comparator> <compare_to>
  logger.info("Result is #{result}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | comparator | compare_to | result |  
                        | QuantityType.new('50 °F') | > | QuantityType.new('25 °F') | true |  |  
                        | QuantityType.new('50 °F') | > | QuantityType.new('525 °F') | false |  |  
                        | QuantityType.new('50 °F') | >= | QuantityType.new('50 °F') | true |  |  
                        | QuantityType.new('50 °F') | == | QuantityType.new('50 °F') | true |  |  
                        | QuantityType.new('50 °F') | < | QuantityType.new('25 °C') | true |  |  
 
 
 
 
- 
            
               QuantityType can be compared and the compare-to can be a string
              
                - 
                  Given code in a rules file  result = <quantity> <comparator> <compare_to>
  logger.info("Result is #{result}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | comparator | compare_to | result |  
                        | QuantityType.new('50 °F') | == | '50 °F' | true |  |  
                        | QuantityType.new('50 °F') | < | '25 °C' | true |  |  
 
 
 
 
- 
            
               QuantityType responds to math operations where operand is DecimalType
              
                - 
                  Given code in a rules file  java_import org.openhab.core.library.types.DecimalType
  result = <quantity><operator> <operand>
  logger.info("Result is #{result.format('%.1f %unit%')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Result is <result>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | quantity | operator | operand | result |  
                        | QuantityType.new('50 °F') | * | DecimalType.new(2) | 100.0 °F |  |  
                        | QuantityType.new('100 °F') | / | DecimalType.new(2) | 50.0 °F |  |  
                        | QuantityType.new('50 °F') | * | DecimalType.new(2.0) | 100.0 °F |  |  
                        | QuantityType.new('100 °F') | / | DecimalType.new(2.0) | 50.0 °F |  |  
 
 
 
 
- 
            
               QuantityType responds to positive?, negative?, and zero?
              
                - 
                  Given items:| type | name | state | pattern | 
|---|
 | Number:Temperature | NumberF | 2 °F | %d °F |  | Number:Temperature | NumberC | 2 °C | %d °C |  | Number:Power | PowerPos | 100 W |  |  | Number:Power | PowerNeg | -100 W |  |  | Number:Power | PowerZero | 0 W |  |  | Number | Number1 | 20 |  |  
 
- 
                  And code in a rules filelogger.info("<object>.<test> #{<object>.<test>}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "<object>.<test> <result>" within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | object | test | result |  
                        | QuantityType.new('50°F') | positive? | true |  |  
                        | QuantityType.new('-50°F') | negative? | true |  |  
                        | QuantityType.new('10W') | positive? | true |  |  
                        | QuantityType.new('-1kW') | positive? | false |  |  
                        | QuantityType.new('0W') | zero? | true |  |  
                        | NumberF | positive? | true |  |  
                        | NumberC | negative? | false |  |  
                        | PowerPos | positive? | true |  |  
                        | PowerNeg | negative? | true |  |  
                        | PowerZero | zero? | true |  |  
                        | Number1 | positive? | true |  |  
 
 
 
 
- 
            
               QuantityType can be converted to another unit with |
              
                - 
                  Given code in a rules filequantity = <source>|'<unit1>'
quantity = quantity|'<unit2>'
logger.info("quantity in the target unit is #{quantity.to_i}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "quantity in the target unit is <target>" within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | source | unit1 | unit2 | target |  
                        | 0 | °C | °F | 32 |  |  
                        | 1 | h | s | 3600 |  |  
 
 
 
 
- 
            
               Triggers support ranges with string quantity
              
                - 
                  Given items:| type | name | state | 
|---|
 | Number:Power | Item_Power | <initial> |  
 
- 
                  And a rule:rule 'Execute rule with range conditions' do
  <trigger> Item_Power, <conditions>
  run { |event| logger.info("Item Power: <trigger>") }
end
Item_Power << '<change>'
 
- 
                  When I deploy the rule
- 
                  Then It <should> log "Item Power: <trigger>" within 5 seconds
 
 
              
                Examples: From range
                  
                    
                      
                        | trigger | initial | conditions | change | should |  
                        | changed | 0 W | from: '0 W'..'10 W' | 14 W | should |  |  
                        | changed | 12 W | from: '0 W'..'10 W' | 10 W | should not |  |  
                        | changed | 0 W | to: '0 W'..'10 W' | 14 W | should not |  |  
                        | changed | 0 W | to: '0 W'..'10 W' | 10 W | should |  |  
                        | updated | 0 W | to: '0 W'..'10 W' | 10 W | should |  |  
                        | updated | 0 W | to: '0 W'..'10 W' | 14 W | should not |  |