#
# Copyright (c) 2006-2018 Wade Alcorn - wade@bindshell.net
# Browser Exploitation Framework (BeEF) - http://beefproject.com
# See the file 'doc/COPYING' for copying permission
#
require 'test/unit'
require '../common/beef_test'
require '../common/test_constants'

class TC_Jools < Test::Unit::TestCase

    #test jools can be acces and a new object can be instantiated
    def test_jools_exists
        victim = BeefTest.new_victim
        script = "return require('jools');"
        jools = victim.execute_script(script)
        assert_not_nil jools
        script = "var Jools = require('jools');
        return new Jools([]);"
        jools_obj = victim.execute_script(script)
        assert_not_nil jools_obj
        victim.driver.browser.close
    end

    #test simple jools rule example
    def test_jools_simple
        victim = BeefTest.new_victim
        script = " var Jools = require('jools');
            var rules = [{
            'name':'Lights on after 8pm',
            'condition': function(hour){
                return hour >= 8;
            },
            'consequence': function(){
                this.state = 'on';
            }
            }];
            var fact = {
                'hour':8,
                'minute':21
            };
            var j = new Jools(rules);
            var result = j.execute(fact);
            return result.state;"
       result = victim.execute_script(script)
       assert_equal 'on',result
       victim.driver.browser.close
    end

    #test jools chaining example
    def test_jools_chaning
        victim = BeefTest.new_victim
        script = " var Jools = require('jools');
            var rules = [
            {'name':'frog is green',
            'condition': function(animal){
                return animal == 'frog';
            },
            'consequence': function(){
                this.color = 'green';
            }},
            {'name':'canary is yellow',
            'condition': function(animal){
                return animal == 'canary';
            },
            'consequence': function(){
                this.color = 'yellow';
            }},
            {'name':'croaks and eats flies',
            'condition' : function(eats){
                return eats && eats.indexOf('croaks') >= 0 && eats.indexOf('flies') >=0;
            },
            'consequence': function(){
                this.animal = 'frog';
            }},
            {'name':'chirps and sings',
            'condition' : function(does){
                return does && does.indexOf('chirps') >= 0 && does.indexOf('sings') >=0;
            },
            'consequence': function(){
                this.animal = 'canary';
            }}
            ];
            var fact_1 = {
                'name':'fritz',
                'eats': ['croaks','flies']
            };
            var fact_2 = {
                'name':'fritz',
                'eats': ['croaks','rocks']
            };
            var fact_3 = {
                'name':'tweety',
                'does': ['sings','chirps']
            };
            var fact_4 = {
                'name':'tweety',
                'does': ['chrips','howls']
            };

            var j = new Jools(rules);
            var results = [];
             results.push(j.execute(fact_1));
             results.push(j.execute(fact_2));
             results.push(j.execute(fact_3));
             results.push(j.execute(fact_4));
            return results;"
       results = victim.execute_script(script)
       assert_not_nil results
       assert_equal 'green',results[0]['color']
       assert_not_equal results[1]['color'], 'green'
       assert_equal 'yellow',results[2]['color']
       assert_not_equal results[3]['color'], 'yellow'
       victim.driver.browser.close
    end
end
