func TestCreditPay(t *testing.T) {
	engine := NewRuleEngine()
	engine.AddExpression("($behavior.money > $behavior.user.limit * 0.9) && $behavior.type == \"consume\"", "creditpay_consume_larger_than_90_percent_limit")
	engine.AddRule(&logic.Rule{Expression: "creditpay_consume_larger_than_90_percent_limit", Action: "alert"})

	data := facts.NewFactCollection()
	user := `
		{
			"type" : "consume",
			"money" : 91,
			"user" : {
				"limit" : 100
			}
		}
	`
	fact := facts.NewFact(user)
	data.Add("behavior", fact)

	exprNames := engine.GetFiredExpressions(data)
	if len(exprNames) == 0 {
		t.Error()
	}

	actions := engine.GetAction(data)
	if len(actions) == 0 {
		t.Error()
	}
	if actions[0].Name != "alert" {
		t.Error()
	}
}
func Test(t *testing.T) {
	engine := NewRuleEngine()
	engine.AddExpression("$user.age > 35", "age_larger_than_35")
	engine.AddExpression("$user.gender == \"male\"", "male")
	engine.AddExpression("$user.gender == \"female\"", "female")
	engine.AddRule(&logic.Rule{Expression: "age_larger_than_35 & male", Action: "Pass"})

	data := facts.NewFactCollection()
	user := `
		{
			"age" : 47,
			"gender" : "male"
		}
	`
	fact := facts.NewFact(user)
	data.Add("user", fact)

	exprNames := engine.GetFiredExpressions(data)
	if len(exprNames) == 0 {
		t.Error()
	}

	actions := engine.GetAction(data)
	if actions[0].Name != "Pass" {
		t.Error(actions)
	}
}
func (self *RuleService) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	defer func() {
		if r := recover(); r != nil {
			log.Fatalln(r)
			debug.PrintStack()
		}
	}()
	log.Println(req.RemoteAddr, req.RequestURI, req.Method)
	w.Header().Set("Content-Type", "application/json")
	factCollection := facts.NewFactCollection()
	for _, key := range self.keys {
		fact := facts.NewFact(req.PostFormValue(key))
		factCollection.Add(key, fact)
	}
	actions := self.ruleEngine.GetAction(factCollection)
	output := rulengine.ConverActionListToActionRecords(actions)
	results, _ := json.Marshal(output)
	fmt.Fprint(w, string(results))
}