- 
            
               
              
                - 
                  Given Clean OpenHAB with latest Ruby Libraries
 
 
- 
            
               Rules support description
              
                - 
                  Given a rule:rule 'Test rule' do
  description 'This is the rule description'
  on_start
  run {}
end
 
- 
                  When I deploy the rule
- 
                  Then The rule 'Test rule' should have 'This is the rule description' as its description
 
 
- 
            
               Rules support tags
              
                - 
                  Given a rule:myrule = rule 'Test rule' do
  tags "tag1", "tag2", Semantics::LivingRoom
  on_start
  run {}
end
logger.info myrule.tags.to_a.sort
 
- 
                  When I deploy the rule
- 
                  Then It should log '["LivingRoom", "tag1", "tag2"]' within 5 seconds
 
 
- 
            
               Call function from rule
              
                - 
                  Given code in a rules filedef outer_function(message)
  logger.info("Outer Function #{message}")
end
rule 'Test Outer Function' do
  on_start
  run { outer_function("Test123") }
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Outer Function Test123' within 5 seconds
 
 
- 
            
               Iterate over group using array methods directly on group object
              
                - 
                  Given group "GarageDoors"
- 
                  And items:| type | name | label | group | state | 
|---|
 | Contact | LeftDoor | Left Door | GarageDoors | OPEN |  | Contact | RightDoor | Right Door | GarageDoors | CLOSED |  
 
- 
                  And code in a rules fileopen_doors = GarageDoors.select(&:open?)
open_doors.each { | door | logger.warn("Garage Door #{door.id} is OPEN") }
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Garage Door Left Door is OPEN' within 5 seconds
 
 
- 
            
               Number ranges should work with dimmer values
              
                - 
                  Given items:| type | name | label | state | 
|---|
 | Dimmer | TestDimmer | Dimmer Switch | 55 |  
 
- 
                  And code in a rules filecase TestDimmer
when 0...50
 logger.info("#{TestDimmer.id} Less than 50")
when 50..100
 logger.info("#{TestDimmer.id} More than 50")
else
 logger.info("#{TestDimmer} Not matched")
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'More than 50' within 5 seconds
 
 
- 
            
               Grep should work on Items by ItemType
              
                - 
                  Given items:| type | name | label | state | 
|---|
 | Dimmer | TestDimmer | Dimmer Switch | 55 |  
 
- 
                  And code in a rules fileitems.grep(Dimmer)
     .each { |item| logger.info("Found #{item.label}")}
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Found Dimmer Switch' within 5 seconds
 
 
- 
            
               Rule supports executing different block if guards are not satisfied
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | TestSwitch | ON |  
 
- 
                  And a rulerule 'Execute otherwise if guard is not satisfied' do
  on_start
  run { TestSwitch << ON }
  otherwise { TestSwitch << OFF }
  only_if { <condition> }
end
 
- 
                  When I deploy the rule
- 
                  Then "TestSwitch" should be in state "<outcome>" within 5 seconds
 
 
              
                Examples: Check different conditions
                  
                    
                      
                        | condition | outcome |  
                        | true | ON |  |  
                        | false | OFF |  |  
 
 
 
 
- 
            
               Terse rules are supported
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | TestSwitch | OFF |  
 
- 
                  And a rulechanged TestSwitch do
  logger.trace("Rule {#{OpenHAB::DSL::Rules::Rule.script_rules.first.name}}")
end
 
- 
                  When I deploy the rule
- 
                  And item "TestSwitch" state is changed to "ON"
- 
                  Then It should log 'Rule {TestSwitch changed}' within 5 seconds
 
 
- 
            
               Triggers return an OpenHAB TriggerImpl object
              
                - 
                  Given items:
- 
                  And a rulerule 'Check trigger return value' do
  trigger = <trigger> Alarm_Mode
  logger.info("<trigger> returns #{trigger&.first&.class}")
  run { }
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log '<trigger> returns Java::OrgOpenhabCoreAutomationInternal::TriggerImpl' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | trigger |  
                        | updated |  |  
                        | changed |  |  
                        | received_command |  |  
 
 
 
 
- 
            
               Rule logs a warning and isn't created if it contains no execution blocks
              
                - 
                  Given a rulerule 'No execution blocks' do
  on_start
end
 
- 
                  When I deploy the rule
- 
                  Then It should log 'has no execution blocks, not creating rule' within 5 seconds
 
 
- 
            
               Library version should be logged on start
              
                - 
                  Given code in a rules file:
- 
                  When I deploy the rules file
- 
                  Then It should log 'Scripting Library (Version' within 5 seconds
 
 
- 
            
               Ruby version should be logged on start
              
                - 
                  Given code in a rules file:
- 
                  When I deploy the rules file
- 
                  Then It should log ' Ruby (Version' within 5 seconds
 
 
- 
            
               JRuby version should be logged on start
              
                - 
                  Given code in a rules file:
- 
                  When I deploy the rules file
- 
                  Then It should log 'JRuby (Version' within 5 seconds
 
 
- 
            
               Ruby description should be logged on start
              
                - 
                  Given code in a rules file:
- 
                  When I deploy the rules file
- 
                  Then It should log 'Ruby Description (' within 5 seconds
 
 
- 
            
               Library waits until automation manager is ready before processing rules
              
                - 
                  Given code in a rules file:
- 
                  When I deploy the rules file
- 
                  Then It should log 'OpenHAB ready for rule processing' within 5 seconds
 
 
- 
            
              Tags: @log_level_changed Errors in blocks are logged with stack trace and exits rule
 
              
                - 
                  Given log level INFO
- 
                  And code in a rules filedef test
  test2
end
def test2
  raise 'Something is wrong'
end
rule 'test' do
  on_start
  <block> { test }
  delay 1.seconds
  run { logger.info('This one works!') }
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Something is wrong (RuntimeError)' within 5 seconds
- 
                  And It should log 'In rule: test' within 5 seconds
- 
                  And It should log "in `test2'" within 5 seconds
- 
                  And It should log "in `test'" within 5 seconds
- 
                  And It should log "in `block in <main>'" within 5 seconds
- 
                  And It should log "in `<main>'" within 5 seconds
- 
                  But It should not log 'This one works!' within 10 seconds
 
 
              
                Examples: Checks different block types
 
 
- 
            
              Tags: @log_level_changed Native java exceptions are handled during rule execution
 
              
                - 
                  Given log level INFO
- 
                  And code in a rules filedef test
  Java::JavaLang::Integer.parseInt('k')
end
rule 'test' do
  on_start
  run { test }
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'For input string: "k" (Java::JavaLang::NumberFormatException)' within 5 seconds
- 
                  And It should log 'In rule: test' within 5 seconds
- 
                  And It should log "RUBY.test" within 5 seconds
- 
                  And It should log "RUBY.<main>" within 5 seconds
 
 
- 
            
              Tags: @log_level_changed Native java exceptions are handled during rule creation
 
              
                - 
                  Given log level INFO
- 
                  And code in a rules filedef test
  Java::JavaLang::Integer.parseInt('k')
end
rule 'test' do
  test
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'For input string: "k" (Java::JavaLang::NumberFormatException)' within 5 seconds
- 
                  And It should log 'In rule: test' within 5 seconds
- 
                  And It should log "RUBY.test" within 5 seconds
- 
                  And It should log "RUBY.<main>" within 5 seconds
 
 
- 
            
               OpenHAB config directory is available
              
                - 
                  Given code in a rules file:  logger.info("Conf #{OpenHAB.conf_root}")
  logger.info("Conf directory is #{OpenHAB.conf_root.each_filename.to_a.last(2).join('/')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Conf directory is openhab/conf' within 5 seconds
 
 
- 
            
               Rule method returns the rule object with Rule UID
              
                - 
                  Given code in a rules file:rule = rule 'test' do
  on_start
  run { logger.info('inside rule') }
end
logger.info "Rule UID: '#{rule.uid}'"
 
- 
                  When I deploy the rules file
- 
                  Then It should log /Rule UID: '.+'/ within 5 seconds
 
 
- 
            
               DSL methods don't leak into other objects
              
                - 
                  Given a raw rule:original_methods = Class.methods
require 'openhab'
leaked_methods = (Class.methods - original_methods).sort
logger.info "Leaked methods: #{leaked_methods}"
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Leaked methods: []" within 5 seconds
 
 
- 
            
              Tags: @wip Check constants introduced by the library
 
              
                - 
                  Given a raw rule:def all_constants
  Object.ancestors.map(&:constants).concat(Object.constants).flatten.uniq.sort
end
original_constants = all_constants
require 'openhab'
added_constants = (all_constants - original_constants).sort
# added_constants.each {|s| logger.info "#{s} => #{Object.const_get(s).class.name}" }
logger.info "Added constants: #{added_constants}"
logger.info "OK"
 
- 
                  When I deploy the rules file
- 
                  Then It should log "OK" within 5 seconds