/*******************************************************************************
* Copyright (c) 2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.bot.test.beans.openon.template;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.tools.cdi.bot.test.CDITestBase;
import org.jboss.tools.cdi.reddeer.cdi.text.ext.hyperlink.xpl.HierarchyInformationControl;
import org.junit.After;
import org.junit.Test;
/**
* Test operates on finding right observer for event and vice versa
*
* @author Jaroslav Jankovic
*/
public abstract class FindObserverEventTemplate extends CDITestBase {
private static final Map<String,List<String>> eventWithObservers = new HashMap<String,List<String>>();
private static final Map<String,List<String>> observerWithEvents = new HashMap<String,List<String>>();
static{
eventWithObservers.put("myBean1Q1Event", Arrays.asList("observeQ1MyBean1",
"observeAnyMyBean1","observeNoQualifierMyBean1"));
eventWithObservers.put("myBean1AnyEvent", Arrays.asList("observeAnyMyBean1",
"observeNoQualifierMyBean1"));
eventWithObservers.put("myBean2Q1Event",Arrays.asList("observeQ1MyBean1",
"observeQ1MyBean2","observeAnyMyBean1","observeAnyMyBean2",
"observeNoQualifierMyBean1","observeNoQualifierMyBean1"));
eventWithObservers.put("myBean2AnyEvent", Arrays.asList("observeAnyMyBean1",
"observeAnyMyBean2","observeNoQualifierMyBean1","observeNoQualifierMyBean2"));
eventWithObservers.put("myBean1Q2Event", Arrays.asList("observeQ2MyBean1",
"observeAnyMyBean1", "observeNoQualifierMyBean1"));
eventWithObservers.put("myBean2Q2Event", Arrays.asList("observeQ2MyBean1",
"observeQ2MyBean2","observeAnyMyBean1","observeAnyMyBean2","observeNoQualifierMyBean1",
"observeNoQualifierMyBean2"));
observerWithEvents.put("observeNoQualifierMyBean1", Arrays.asList("myBean1Q1Event",
"myBean2Q1Event","myBean1AnyEvent","myBean2AnyEvent","myBean1Q2Event","myBean2Q2Event"));
observerWithEvents.put("observeAnyMyBean1", Arrays.asList("myBean1Q1Event",
"myBean2Q1Event","myBean1AnyEvent","myBean2AnyEvent","myBean1Q2Event","myBean2Q2Event"));
observerWithEvents.put("observeQ1MyBean1",Arrays.asList("myBean1Q1Event","myBean2Q1Event"));
observerWithEvents.put("observeNoQualifierMyBean2", Arrays.asList("myBean2Q1Event",
"myBean2AnyEvent","myBean2Q2Event"));
observerWithEvents.put("observeAnyMyBean2", Arrays.asList("myBean2Q1Event",
"myBean2AnyEvent","myBean2Q2Event"));
observerWithEvents.put("observeQ1MyBean2",Arrays.asList("myBean2Q1Event"));
observerWithEvents.put("observeQ2MyBean1", Arrays.asList("myBean1Q2Event",
"myBean2Q2Event"));
observerWithEvents.put("observeQ2MyBean2", Arrays.asList("myBean2Q2Event"));
}
@After
public void clean(){
deleteAllProjects();
}
@Test
public void testSimpleCaseObserverFinding() {
prepare();
for(String event: eventWithObservers.keySet()){
checkEvent(event, "EventsProducer", "ObserverBean");
openEvent(event, "EventsProducer", "ObserverBean");
}
for(String observer: observerWithEvents.keySet()){
checkObserver(observer, "ObserverBean", "EventsProducer");
openObserver(observer, "ObserverBean", "EventsProducer");
}
}
// not implemented yet
//@Test
public void testComplexCaseObserverFinding() {
//TODO
prepareComplexObserverFinding();
testComplexObserverFinding();
}
private void checkEvent(String eventName, String className, String observerClass){
openOnHelper.selectProposal(className, eventName, "Show CDI Observer Methods...");
HierarchyInformationControl hic = new HierarchyInformationControl(HierarchyInformationControl.OBSERVER_LABEL);
String packageProjectPath = getPackageName() + " - /" + getProjectName() + "/src";
List<String> expectedObservers = eventWithObservers.get(eventName);
assertEquals(expectedObservers.size(), hic.getProposals().size());
for(String expectedObserver : expectedObservers){
assertTrue(hic.getProposalsTable().containsItem(
observerClass + "."+expectedObserver+"() - " + packageProjectPath));
}
hic.close();
}
private void openEvent(String eventName, String className, String observerClass){
openOnHelper.selectProposal(className, eventName, "Show CDI Observer Methods...");
HierarchyInformationControl hc = new HierarchyInformationControl(HierarchyInformationControl.OBSERVER_LABEL);
List<String> proposals = hc.getProposals();
hc.close();
for(String proposal: proposals){
openOnHelper.selectProposal(className, eventName, "Show CDI Observer Methods...");
HierarchyInformationControl hic = new HierarchyInformationControl(HierarchyInformationControl.OBSERVER_LABEL);
hic.selectProposal(proposal);
String[] splitted = proposal.split("\\.");
TextEditor te = new TextEditor();
assertEquals(splitted[0]+".java",te.getTitle());
String[] splitted1 = splitted[1].split("\\(");
assertEquals(splitted1[0],te.getSelectedText());
}
}
private void openObserver(String observer, String className, String eventClass){
List<String> events = observerWithEvents.get(observer);
//no need to test with one, was tested previously
if(events.size()!=1){
openOnHelper.selectProposal(className, observer, "Show CDI Events...");
HierarchyInformationControl hc = new HierarchyInformationControl(HierarchyInformationControl.EVENTS_LABEL);
List<String> proposals = hc.getProposals();
hc.close();
for(String proposal: proposals){
openOnHelper.selectProposal(className, observer, "Show CDI Events...");
HierarchyInformationControl hic = new HierarchyInformationControl(HierarchyInformationControl.EVENTS_LABEL);
hic.selectProposal(proposal);
String[] splitted = proposal.split("\\.");
TextEditor te = new TextEditor();
assertEquals(splitted[0]+".java",te.getTitle());
String[] splitted1 = splitted[1].split(" ");
assertEquals(splitted1[0],te.getSelectedText());
}
}
}
private void checkObserver(String observer, String className, String eventClass){
List<String> events = observerWithEvents.get(observer);
if(events.size() == 1){
openOnHelper.selectProposal(className, observer, "Open CDI Event "+eventClass+"."+events.get(0));
TextEditor te = new TextEditor();
assertEquals(eventClass+".java",te.getTitle());
assertEquals(events.get(0),te.getSelectedText());
} else {
openOnHelper.selectProposal(className, observer, "Show CDI Events...");
HierarchyInformationControl hic = new HierarchyInformationControl(HierarchyInformationControl.EVENTS_LABEL);
String packageProjectPath = getPackageName() + " - /" + getProjectName() + "/src";
List<String> expectedEvents = observerWithEvents.get(observer);
assertEquals(expectedEvents.size(), hic.getProposals().size());
for(String expectedEvent : expectedEvents){
assertTrue(hic.getProposalsTable().containsItem(
eventClass + "."+expectedEvent+" - " + packageProjectPath));
}
hic.close();
}
}
// not implemented yet
private void prepareComplexObserverFinding() {
}
// not implemented yet
private void testComplexObserverFinding() {
/**
* main idea - check events which have multiple qualifiers defined
* (http://docs.jboss.org/weld/reference/1.0.0/en-US/html/events.html -
* 11.6) - check events with qualifiers which has members
* (http://docs.jboss.org/weld/reference/1.0.0/en-US/html/events.html -
* 11.5)
*/
}
private void prepare(){
beansHelper.createQualifier("Q1", getPackageName(), false, false);
beansHelper.createQualifier("Q2", getPackageName(), false, false);
beansHelper.createBean("MyBean1", getPackageName(), false, false, false,
false, false, true,false,null, null);
editResourceUtil.replaceClassContentByResource("MyBean1.java", readFile("resources/events/MyBean1.java.cdi"),false);
beansHelper.createBean("MyBean2", getPackageName(), false, false, false,
false, false, true,false,null, null);
editResourceUtil.replaceClassContentByResource("MyBean2.java", readFile("resources/events/MyBean2.java.cdi"),false);
beansHelper.createBean("EventsProducer", getPackageName(), false, false, false,
false, false, true,false,null, null);
editResourceUtil.replaceClassContentByResource("EventsProducer.java", readFile("resources/events/EventsProducer.java.cdi"),false);
beansHelper.createBean("ObserverBean", getPackageName(), false, false, false,
false, false, true,false,null, null);
editResourceUtil.replaceClassContentByResource("ObserverBean.java", readFile("resources/events/ObserverBean.java.cdi"),false);
}
}