/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.informer.rules; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.event.rule.DebugAgendaEventListener; import org.drools.informer.*; import org.drools.io.ResourceFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; import org.drools.runtime.rule.QueryResults; import org.drools.runtime.rule.QueryResultsRow; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; import static org.junit.Assert.*; /** * @author Damon * * TODO add tests for InvalidAnswer - should be active only if question is active (and exists of course) */ public class ActiveTest { private static final Logger logger = LoggerFactory.getLogger(ActiveTest.class); private KnowledgeBase knowledgeBase; /** * @throws Exception */ @Before public void setUp() throws Exception { KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); knowledgeBuilder.add(ResourceFactory.newClassPathResource("org/drools/informer/Active.drl"), ResourceType.DRL); knowledgeBuilder.add(ResourceFactory.newClassPathResource("org/drools/informer/Queries.drl"), ResourceType.DRL); logger.debug(Arrays.toString(knowledgeBuilder.getErrors().toArray())); System.err.println( knowledgeBuilder.getErrors() ); assertFalse(knowledgeBuilder.hasErrors()); knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(); knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages()); } @Test public void testActiveObjects() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); // knowledgeSession.addEventListener( new DebugAgendaEventListener( ) ); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group1 = new Group("group1"); Group group2 = new Group("group2"); Note note1 = new Note("note1"); Note note2 = new Note("note2"); Note note3 = new Note("note3"); Note note4 = new Note("note4"); Note note5 = new Note("note5"); Note note6 = new Note("note6"); questionnaire.setItems(new String[] { group1.getId(), group2.getId(), note4.getId() }); group1.setItems(new String[] { note1.getId(), note2.getId() }); group2.setItems(new String[] { note3.getId() }); FactHandle handleQuestionnaire = knowledgeSession.insert(questionnaire); FactHandle handleGroup1 = knowledgeSession.insert(group1); knowledgeSession.insert(group2); knowledgeSession.insert(note1); knowledgeSession.insert(note2); knowledgeSession.insert(note3); knowledgeSession.insert(note4); knowledgeSession.insert(note5); knowledgeSession.insert(note6); knowledgeSession.fireAllRules(); QueryResults queryResults = knowledgeSession.getQueryResults("activeObjects"); assertArrayEquals(new String[] { "object" }, queryResults.getIdentifiers()); Set<String> itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), group2.getId(), note1.getId(), note2.getId(), note3.getId(), note4.getId(), note5.getId(), note6.getId() })), itemIds); System.out.println( "------------------------------------------"); questionnaire.setActiveItem(group1.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem(group2.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group2.getId(), note3.getId() })), itemIds); questionnaire.setActiveItem(note4.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), note4.getId() })), itemIds); questionnaire.setActiveItem("unknown"); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId() })), itemIds); questionnaire.setActiveItem(group1.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); group1.setItems(new String[] { note1.getId(), note2.getId(), note5.getId() }); knowledgeSession.update(handleGroup1, group1); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals( new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId(), note2.getId(), note5.getId() })), itemIds); group1.setItems(new String[] { note1.getId(), note2.getId() }); knowledgeSession.update(handleGroup1, group1); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId(), note2.getId() })), itemIds); } finally { knowledgeSession.dispose(); } } @Test public void testDuplicateSameGroup() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group1 = new Group("group1"); Group group2 = new Group("group2"); Note note1 = new Note("note1"); Note note2 = new Note("note2"); questionnaire.setItems(new String[] { group1.getId(), group2.getId() }); group1.setItems(new String[] { note1.getId(), note1.getId() }); group2.setItems(new String[] { note2.getId() }); FactHandle handleQuestionnaire = knowledgeSession.insert(questionnaire); knowledgeSession.insert(group1); knowledgeSession.insert(group2); knowledgeSession.insert(note1); knowledgeSession.insert(note2); knowledgeSession.fireAllRules(); QueryResults queryResults = knowledgeSession.getQueryResults("activeObjects"); assertArrayEquals(new String[] { "object" }, queryResults.getIdentifiers()); Set<String> itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays .asList(new String[] { questionnaire.getId(), group1.getId(), group2.getId(), note1.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem(group1.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId() })), itemIds); questionnaire.setActiveItem(group2.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group2.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem("unknown"); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId() })), itemIds); } finally { knowledgeSession.dispose(); } } @Test public void testDuplicateSamePage() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group1 = new Group("group1"); Group group2 = new Group("group2"); Group group3 = new Group("group3"); Group group4 = new Group("group4"); Note note1 = new Note("note1"); Note note2 = new Note("note2"); FactHandle handleQuestionnaire = knowledgeSession.insert(questionnaire); questionnaire.setItems(new String[] { group1.getId(), group2.getId() }); group1.setItems(new String[] { group3.getId(), group4.getId() }); group2.setItems(new String[] { note2.getId() }); group3.setItems(new String[] { note1.getId() }); group4.setItems(new String[] { note1.getId() }); knowledgeSession.insert(group1); knowledgeSession.insert(group2); knowledgeSession.insert(group3); knowledgeSession.insert(group4); knowledgeSession.insert(note1); knowledgeSession.insert(note2); knowledgeSession.fireAllRules(); QueryResults queryResults = knowledgeSession.getQueryResults("activeObjects"); assertArrayEquals(new String[] { "object" }, queryResults.getIdentifiers()); Set<String> itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), group2.getId(), group3.getId(), group4.getId(), note1.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem(group1.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays .asList(new String[] { questionnaire.getId(), group1.getId(), group3.getId(), group4.getId(), note1.getId() })), itemIds); questionnaire.setActiveItem(group2.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group2.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem("unknown"); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId() })), itemIds); } finally { knowledgeSession.dispose(); } } @Test public void testDuplicateDifferentPage() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group1 = new Group("group1"); Group group2 = new Group("group2"); Note note1 = new Note("note1"); Note note2 = new Note("note2"); questionnaire.setItems(new String[]{group1.getId(), group2.getId()}); group1.setItems(new String[] { note1.getId() }); group2.setItems(new String[] { note1.getId(), note2.getId() }); FactHandle handleQuestionnaire = knowledgeSession.insert(questionnaire); knowledgeSession.insert(group1); knowledgeSession.insert(group2); knowledgeSession.insert(note1); knowledgeSession.insert(note2); knowledgeSession.fireAllRules(); QueryResults queryResults = knowledgeSession.getQueryResults("activeObjects"); assertArrayEquals(new String[] { "object" }, queryResults.getIdentifiers()); Set<String> itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays .asList(new String[] { questionnaire.getId(), group1.getId(), group2.getId(), note1.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem(group1.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId() })), itemIds); questionnaire.setActiveItem(group2.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group2.getId(), note1.getId(), note2.getId() })), itemIds); questionnaire.setActiveItem("unknown"); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId() })), itemIds); } finally { knowledgeSession.dispose(); } } @Test public void testNavigationReturn() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group1 = new Group("group1"); Group group2 = new Group("group2"); Group group3 = new Group("group3"); Note note1 = new Note("note1"); Note note2 = new Note("note2"); Note note3 = new Note("note3"); questionnaire.setItems(new String[] { group1.getId(), group2.getId() }); questionnaire.setActiveItem(group1.getId()); group1.setItems(new String[] { note1.getId() }); group2.setItems(new String[] { note1.getId(), note2.getId() }); group3.setItems(new String[]{note3.getId()}); FactHandle handleQuestionnaire = knowledgeSession.insert(questionnaire); knowledgeSession.insert(group1); knowledgeSession.insert(group2); knowledgeSession.insert(group3); knowledgeSession.insert(note1); knowledgeSession.insert(note2); knowledgeSession.insert(note3); knowledgeSession.fireAllRules(); QueryResults queryResults = knowledgeSession.getQueryResults("activeObjects"); assertArrayEquals(new String[] { "object" }, queryResults.getIdentifiers()); Set<String> itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[]{questionnaire.getId(), group1.getId(), note1.getId()})), itemIds); questionnaire.navigationBranch(new String[]{group3.getId()}, group3.getId()); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[]{questionnaire.getId(), group3.getId(), note3.getId()})), itemIds); questionnaire.setActiveItem(Questionnaire.COMPLETION_ACTION_RETURN); knowledgeSession.update(handleQuestionnaire, questionnaire); knowledgeSession.fireAllRules(); queryResults = knowledgeSession.getQueryResults("activeObjects"); itemIds = getItemIds(queryResults); assertEquals(new HashSet<String>(Arrays.asList(new String[] { questionnaire.getId(), group1.getId(), note1.getId() })), itemIds); } finally { knowledgeSession.dispose(); } } @Test public void testAvailableItems() { StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession(); try { Questionnaire questionnaire = new Questionnaire("questionnaire"); Group group2 = new Group("group2"); Group group5 = new Group("group5"); Group group6 = new Group("group6"); questionnaire.setItems(new String[] { "group1UUID", group2.getId(), "group3UUID", "group4UUID", group5.getId(), group6.getId(), "group7UUID" }); knowledgeSession.insert(questionnaire); knowledgeSession.insert(group2); knowledgeSession.insert(group5); knowledgeSession.insert(group6); knowledgeSession.fireAllRules(); for (String s : new String[] { group2.getId(), group5.getId(), group6.getId() }) { assertTrue(questionnaire.getAvailableItemSet().contains(s)); } } finally { knowledgeSession.dispose(); } } private Set<String> getItemIds(QueryResults queryResults) { Set<String> itemIds = new HashSet<String>(); for (Iterator<QueryResultsRow> iterator = queryResults.iterator(); iterator.hasNext();) { QueryResultsRow row = iterator.next(); Item item = (Item) row.get("object"); itemIds.add(item.getId()); } return itemIds; } }