/**
* YogaAnalysisTestHelper.java
* Created On 2007, Oct 27, 2007 7:56:59 PM
* @author E. Rajasekar
*/
package app.astrosoft.xps.yoga.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.EnumMap;
import java.util.Map;
import java.util.Set;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.event.DebugAgendaEventListener;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.rule.Package;
import org.drools.rule.Rule;
import app.astrosoft.beans.PlanetCharacter;
import app.astrosoft.consts.Planet;
import app.astrosoft.consts.Rasi;
import app.astrosoft.consts.Varga;
import app.astrosoft.consts.YogaCombination;
import app.astrosoft.core.Horoscope;
import app.astrosoft.test.SampleHoroscopes;
import app.astrosoft.xps.XpsUtil;
import app.astrosoft.xps.beans.PlanetChart;
import app.astrosoft.xps.beans.YogaFacts;
import app.astrosoft.xps.yoga.YogaResults;
import static app.astrosoft.util.CollectionUtil.newEnumMap;
import static app.astrosoft.xps.yoga.test.YogaAnalysisTestCase.*;
import static app.astrosoft.xps.yoga.test.YogaAnalysisTestHelper.YOGAS;
import static app.astrosoft.xps.yoga.test.YogaAnalysisTestHelper.buildPackage;
import static app.astrosoft.xps.yoga.test.YogaAnalysisTestHelper.getLogger;
import static app.astrosoft.xps.yoga.test.YogaAnalysisTestHelper.getSession;
public class YogaAnalysisTestHelper {
public static enum SAMPLE_HOROSCOPE {RAJA,SUBA};
private static PlanetCharacter character1;
private static PlanetCharacter character2;
private static String RULE_FILE = "YogaCombinations.dslr";
//private static String RULE_FILE = "astrosoft.drl";
private static String DSL_FILE = "YogaCombinations.dsl";
public static final String YOGAS = "yogas";
private static RuleBase ruleBase;
private static StatefulSession session;
private static Package pkg;
private static WorkingMemoryFileLogger logger;
private static Map<SAMPLE_HOROSCOPE, Horoscope> samples;
public static Package buildPackage() throws DroolsParserException, IOException {
final Reader rule = new InputStreamReader( XpsUtil.getRuleAsStream(RULE_FILE));
final Reader dsl = new InputStreamReader( XpsUtil.getRuleAsStream(DSL_FILE));
final PackageBuilder builder = new PackageBuilder();
//builder.addPackageFromDrl( rule );
builder.addPackageFromDrl( rule,dsl );
// Check the builder for errors
if ( builder.hasErrors() ) {
System.out.println( builder.getErrors().toString() );
throw new RuntimeException( "Compilation Errors in " + RULE_FILE);
}
return builder.getPackage();
}
public static void setUpBeforeClass() throws Exception {
System.out.println("setUpBeforeClass()");
pkg = buildPackage();
ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
setUpHoroscope();
//setUpChart();
setUpCharacter();
}
private static void setUpCharacter() {
Map<Planet, Boolean> c1 = new EnumMap<Planet, Boolean>(Planet.class);
Map<Planet, Boolean> c2 = new EnumMap<Planet, Boolean>(Planet.class);
for(Planet p : Planet.subaPlanets()){
c1.put(p, true);
c2.put(p, true);
}
for(Planet p : Planet.papaPlanets()){
c1.put(p, false);
c2.put(p, false);
}
c1.put(Planet.Moon, true);
c2.put(Planet.Moon, false);
character1 = new PlanetCharacter(c1);
character2 = new PlanetCharacter(c2);
}
private static void setUpHoroscope() {
samples = new EnumMap<SAMPLE_HOROSCOPE, Horoscope>(SAMPLE_HOROSCOPE.class);
Horoscope h = SampleHoroscopes.getMyHoroscope();
samples.put(SAMPLE_HOROSCOPE.RAJA, h);
samples.put(SAMPLE_HOROSCOPE.SUBA, SampleHoroscopes.getSubaHoroscope());
}
public static void setUp(String ruleName) throws Exception {
filterRule(ruleName);
printRules();
session = ruleBase.newStatefulSession();
registerListener(session);
logger = new WorkingMemoryFileLogger( session );
logger.setFileName( "C:/Astrosoft/yogaanalysis" );
YogaResults yogas = new YogaResults();
session.setGlobal(YOGAS, yogas);
}
/*public static void setUp(String ruleName) throws Exception {
setUp(ruleName,character1);
}*/
private static void registerListener(StatefulSession session) {
session.addEventListener( new DebugAgendaEventListener() );
session.addEventListener( new DebugWorkingMemoryEventListener() );
}
public static void filterRule(String ruleName) throws Exception{
pkg = buildPackage();
Rule[] rules = pkg.getRules();
for(Rule rule:rules ){
if (!rule.getName().equals(ruleName)){
//System.out.println("Removing " + rule.getName());
pkg.removeRule(pkg.getRule(rule.getName()));
//ruleBase.removeRule(pkg.getName(), rule.getName());
}
}
ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
}
public static void testYogaPresent(YogaCombination yoga, String efficacy){
YogaResults yogas = (YogaResults) session.getGlobal(YOGAS);
assertTrue(yogas.getYogas().contains(new YogaResults.Result(yoga,efficacy)));
}
public static void testYogaPresent(YogaCombination yoga){
testYogaPresent(yoga,"100%");
}
public static void testYogaNotPresent(YogaCombination yoga){
YogaResults yogas = (YogaResults) session.getGlobal(YOGAS);
assertFalse(yogas.hasYogaCombination(yoga));
}
public static PlanetChart constructChart(Varga varga, Map.Entry<Planet, Rasi> ...entries){
Map<Planet,Rasi> planetHouses = newEnumMap(Planet.class, entries);
return new PlanetChart(varga,planetHouses);
}
public static PlanetChart constructChart(Map.Entry<Planet, Rasi> ...entries){
return constructChart(Varga.Rasi,entries);
}
public static void loadFacts(SAMPLE_HOROSCOPE sample){
Horoscope h = samples.get(sample);
YogaFacts facts = new YogaFacts(h);
session.setGlobal("$facts", facts);
PlanetChart chart = new PlanetChart(Varga.Rasi, h.getPlanetaryInfo());
session.insert(chart);
}
public static void loadFacts(PlanetChart chart, PlanetCharacter character, Set<Planet> powerfulPlanets){
YogaFacts facts = new YogaFacts();
facts.setCharacter(character);
//if (powerfulPlanets != null) {
facts.setPowerfulPlanets(powerfulPlanets);
//}
session.setGlobal("$facts", facts);
session.insert(chart);
}
public static void loadFacts(PlanetChart chart){
loadFacts(chart,character1,null);
}
public static void loadFacts(PlanetChart chart,PlanetCharacter character){
loadFacts(chart,character,null);
}
public static void loadFacts(PlanetChart chart,Set<Planet> powerfulPlanets){
loadFacts(chart,character1,powerfulPlanets);
}
public static void loadFacts(PlanetChart chart, YogaFacts facts){
session.setGlobal("$facts", facts);
session.insert(chart);
}
public static void tearDown() throws Exception {
logger.writeToDisk();
System.out.println(getSession().getGlobal("yogas"));
session.dispose();
}
public static void printRules(){
System.out.println("Rules: ");
for(Rule rule:ruleBase.getPackage(pkg.getName()).getRules() ){
//rule.getLhs().;
System.out.println(rule.getName());
//System.out.println(rule.getLhs().getChildren());
}
}
public static StatefulSession getSession() {
return session;
}
public static WorkingMemoryFileLogger getLogger() {
return logger;
}
public static PlanetCharacter getCharacter1() {
return character1;
}
public static PlanetCharacter getCharacter2() {
return character2;
}
}