1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! Asset system for ISSUN
//!
//! Assets represent game content data (enemies, items, cards, etc.)
/// Asset trait for game content data
///
/// Assets are typically const data or loaded from files.
/// Examples: EnemyAsset, ItemAsset, CardAsset
pub trait Asset: Send + Sync {
/// Asset type name
fn asset_type(&self) -> &'static str {
std::any::type_name::<Self>()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Asset; // Import derive macro
// Test Asset derive macro
#[derive(Asset)]
struct EnemyAsset {
name: &'static str,
hp: i32,
attack: i32,
}
#[test]
fn test_derived_asset() {
let enemy = EnemyAsset {
name: "Goblin",
hp: 30,
attack: 5,
};
// Asset trait should be implemented
assert!(enemy.asset_type().contains("EnemyAsset"));
// Verify fields are accessible
assert_eq!(enemy.name, "Goblin");
assert_eq!(enemy.hp, 30);
assert_eq!(enemy.attack, 5);
}
#[derive(Asset)]
struct ItemAsset {
name: &'static str,
value: i32,
}
#[test]
fn test_multiple_assets() {
let enemy = EnemyAsset {
name: "Dragon",
hp: 100,
attack: 20,
};
let item = ItemAsset {
name: "Sword",
value: 50,
};
assert!(enemy.asset_type().contains("EnemyAsset"));
assert!(item.asset_type().contains("ItemAsset"));
// Verify fields are accessible
assert_eq!(enemy.name, "Dragon");
assert_eq!(item.name, "Sword");
assert_eq!(item.value, 50);
}
}