unity-asset-binary 0.2.0

Unity binary file format parser (AssetBundle, SerializedFile)
Documentation
//! Advanced TypeTree parsing tests
//!
//! Note: This file has been simplified due to API changes.
//! The original tests used private methods that are no longer available.

#![allow(unused_imports)]
#![allow(clippy::approx_constant)]

use unity_asset_binary::typetree::{TypeTree, TypeTreeNode};

/// Test basic TypeTree functionality
#[test]
fn test_typetree_basic_functionality() {
    println!("Testing TypeTree basic functionality...");

    let mut tree = TypeTree::new();
    assert!(tree.is_empty(), "New TypeTree should be empty");
    assert_eq!(tree.node_count(), 0, "New TypeTree should have 0 nodes");

    // Add a root node
    let mut root_node = TypeTreeNode::new();
    root_node.type_name = "GameObject".to_string();
    root_node.name = "".to_string();
    root_node.level = 0;
    tree.add_node(root_node);

    assert!(
        !tree.is_empty(),
        "TypeTree should not be empty after adding node"
    );
    assert_eq!(tree.node_count(), 1, "TypeTree should have 1 node");

    // Add more nodes
    let mut name_node = TypeTreeNode::new();
    name_node.type_name = "string".to_string();
    name_node.name = "m_Name".to_string();
    name_node.level = 1;
    tree.add_node(name_node);

    let mut active_node = TypeTreeNode::new();
    active_node.type_name = "bool".to_string();
    active_node.name = "m_IsActive".to_string();
    active_node.level = 1;
    tree.add_node(active_node);

    assert_eq!(tree.node_count(), 3, "TypeTree should have 3 nodes");

    // Test node finding
    assert!(
        tree.find_node("m_Name").is_some(),
        "Should find m_Name node"
    );
    assert!(
        tree.find_node("m_IsActive").is_some(),
        "Should find m_IsActive node"
    );
    assert!(
        tree.find_node("nonexistent").is_none(),
        "Should not find nonexistent node"
    );

    // Test validation
    let validation_result = tree.validate();
    assert!(
        validation_result.is_ok(),
        "TypeTree validation should succeed"
    );

    // Test statistics
    let stats = tree.statistics();
    assert_eq!(stats.root_nodes, 3, "Should have 3 root nodes");
    assert!(stats.total_nodes >= 3, "Should have at least 3 total nodes");

    println!("  ✓ TypeTree basic functionality test passed");
}

/// Test TypeTree node operations
#[test]
fn test_typetree_node_operations() {
    println!("Testing TypeTree node operations...");

    let mut tree = TypeTree::new();

    // Create and add nodes
    let nodes_data = vec![
        ("GameObject", "", 0),
        ("string", "m_Name", 1),
        ("bool", "m_IsActive", 1),
        ("int", "m_Layer", 1),
    ];

    for (type_name, name, level) in nodes_data {
        let mut node = TypeTreeNode::new();
        node.type_name = type_name.to_string();
        node.name = name.to_string();
        node.level = level;
        tree.add_node(node);
    }

    // Test node names
    let node_names = tree.node_names();
    assert_eq!(node_names.len(), 4, "Should have 4 node names");
    assert!(node_names.contains(&""), "Should contain root node");
    assert!(node_names.contains(&"m_Name"), "Should contain m_Name");
    assert!(
        node_names.contains(&"m_IsActive"),
        "Should contain m_IsActive"
    );
    assert!(node_names.contains(&"m_Layer"), "Should contain m_Layer");

    // Test specific node properties
    if let Some(name_node) = tree.find_node("m_Name") {
        assert_eq!(name_node.type_name, "string");
        assert_eq!(name_node.level, 1);
    }

    if let Some(active_node) = tree.find_node("m_IsActive") {
        assert_eq!(active_node.type_name, "bool");
        assert_eq!(active_node.level, 1);
    }

    if let Some(layer_node) = tree.find_node("m_Layer") {
        assert_eq!(layer_node.type_name, "int");
        assert_eq!(layer_node.level, 1);
    }

    println!("  ✓ TypeTree node operations test passed");
}

/// Test TypeTree string buffer operations
#[test]
fn test_typetree_string_buffer() {
    println!("Testing TypeTree string buffer operations...");

    let mut tree = TypeTree::new();

    // Add strings to buffer
    let offset1 = tree.add_string("TestString1");
    let offset2 = tree.add_string("TestString2");
    let offset3 = tree.add_string("AnotherString");

    // Retrieve strings
    assert_eq!(tree.get_string(offset1), Some("TestString1".to_string()));
    assert_eq!(tree.get_string(offset2), Some("TestString2".to_string()));
    assert_eq!(tree.get_string(offset3), Some("AnotherString".to_string()));

    // Test invalid offset
    assert_eq!(tree.get_string(9999), None);

    println!("  ✓ TypeTree string buffer test passed");
}

/// Test TypeTree validation
#[test]
fn test_typetree_validation() {
    println!("Testing TypeTree validation...");

    // Test empty tree validation
    let empty_tree = TypeTree::new();
    let validation_result = empty_tree.validate();
    assert!(
        validation_result.is_err(),
        "Empty TypeTree should fail validation"
    );

    // Test valid tree
    let mut valid_tree = TypeTree::new();
    let mut root_node = TypeTreeNode::new();
    root_node.type_name = "GameObject".to_string();
    root_node.name = "".to_string();
    valid_tree.add_node(root_node);

    let validation_result = valid_tree.validate();
    assert!(
        validation_result.is_ok(),
        "Valid TypeTree should pass validation"
    );

    println!("  ✓ TypeTree validation test passed");
}

/// Test TypeTree statistics
#[test]
fn test_typetree_statistics() {
    println!("Testing TypeTree statistics...");

    let mut tree = TypeTree::new();

    // Add some nodes
    for i in 0..5 {
        let mut node = TypeTreeNode::new();
        node.type_name = format!("Type{}", i);
        node.name = format!("field{}", i);
        node.level = i;
        tree.add_node(node);
    }

    let stats = tree.statistics();
    assert_eq!(stats.root_nodes, 5, "Should have 5 root nodes");
    assert!(stats.total_nodes >= 5, "Should have at least 5 total nodes");
    // Note: max_depth is calculated from children, not root level
    // Since we only have root nodes, max_depth will be 0
    assert!(stats.max_depth >= 0, "Should have max depth of at least 0");

    println!("  ✓ TypeTree statistics test passed");
}