use anyhow::Result;
use dx_forge::storage::blob::Blob;
use std::path::PathBuf;
#[tokio::main]
async fn main() -> Result<()> {
println!("๐ฅ Forge Quick Feature Test\n");
println!("1๏ธโฃ Testing Blob Storage...");
let blob1 = Blob::from_content("test.txt", b"Hello Forge!".to_vec());
let blob2 = Blob::from_content("test2.txt", b"Hello Forge!".to_vec());
println!(" โ
Blob 1 hash: {}", &blob1.metadata.hash[..16]);
println!(" โ
Blob 2 hash: {}", &blob2.metadata.hash[..16]);
println!(
" โ
Same content = same hash: {}",
blob1.metadata.hash == blob2.metadata.hash
);
println!("\n2๏ธโฃ Testing Binary Format...");
let binary = blob1.to_binary()?;
println!(" โ
Serialized: {} bytes", binary.len());
let restored = Blob::from_binary(&binary)?;
println!(" โ
Deserialized: {} bytes", restored.content.len());
println!(
" โ
Round-trip OK: {}",
blob1.metadata.hash == restored.metadata.hash
);
println!("\n3๏ธโฃ Testing R2 Configuration...");
match dx_forge::storage::r2::R2Config::from_env() {
Ok(config) => {
println!(" โ
R2 Account: {}", config.account_id);
println!(" โ
R2 Bucket: {}", config.bucket_name);
if let Some(domain) = config.custom_domain {
println!(" โ
Custom Domain: {}", domain);
}
}
Err(e) => println!(" โ ๏ธ R2 not configured: {}", e),
}
println!("\n4๏ธโฃ Testing Event Types...");
use dx_forge::watcher::ForgeEvent;
let rapid = ForgeEvent::Rapid {
path: "test.rs".to_string(),
time_us: 25,
sequence: 1,
};
println!(" โ
Rapid event created (25ยตs)");
if let ForgeEvent::Rapid { time_us, .. } = rapid {
println!(" โ
Event time: {}ยตs < 35ยตs threshold", time_us);
}
println!("\n5๏ธโฃ Testing CRDT Types...");
use dx_forge::crdt::Position;
let pos = Position {
lamport_timestamp: 1000,
actor_id: "alice".to_string(),
line: 10,
offset: 42,
column: 10,
};
println!(
" โ
Position created: offset={}, line={}, timestamp={}",
pos.offset, pos.line, pos.lamport_timestamp
);
println!("\n6๏ธโฃ Testing Traffic Branch Detection...");
unsafe {
std::env::set_var("CI", "true");
}
let is_ci = std::env::var("CI").is_ok();
println!(" โ
CI detection: {}", is_ci);
unsafe {
std::env::remove_var("CI");
}
println!("\n7๏ธโฃ Testing Database...");
let temp_db = std::env::temp_dir().join("forge-quick-test.db");
match dx_forge::storage::Database::new(&temp_db) {
Ok(_db) => {
println!(" โ
Database created at: {:?}", temp_db);
let _ = std::fs::remove_file(temp_db);
}
Err(e) => println!(" โ ๏ธ Database error: {}", e),
}
println!("\n8๏ธโฃ Checking forge-demo files...");
let demo_dir = PathBuf::from("examples/forge-demo");
if demo_dir.exists() {
println!(" โ
forge-demo directory exists");
let files = vec![
"README.md",
"Cargo.toml",
"src/main.rs",
"src/lib.rs",
".forge/config.toml",
];
for file in files {
let path = demo_dir.join(file);
if path.exists() {
println!(" โ
{}", file);
}
}
} else {
println!(" โ ๏ธ forge-demo not found");
}
println!("\n9๏ธโฃ Testing Parallel Operations...");
use tokio::task::JoinSet;
let mut tasks = JoinSet::new();
for i in 0..5 {
tasks.spawn(async move {
Blob::from_content(
&format!("file{}.txt", i),
format!("Content {}", i).into_bytes(),
)
});
}
let mut count = 0;
while let Some(result) = tasks.join_next().await {
if result.is_ok() {
count += 1;
}
}
println!(" โ
Created {} blobs in parallel", count);
println!("\n๐ Testing Component State...");
let temp_forge = std::env::temp_dir().join("forge-state-test");
std::fs::create_dir_all(&temp_forge)?;
match dx_forge::context::ComponentStateManager::new(&temp_forge) {
Ok(_manager) => {
println!(" โ
State manager created");
println!(" โ
Can manage component states");
}
Err(e) => println!(" โ ๏ธ State manager error: {}", e),
}
let _ = std::fs::remove_dir_all(temp_forge);
println!("\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
println!("๐ All manual tests completed!");
println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
Ok(())
}