mortar_compiler 0.5.3

Mortar language compiler core library
Documentation
//! # performance_serialization_test.rs
//!
//! # performance_serialization_test.rs 文件
//!
//! ## Module Overview
//!
//! ## 模块概述
//!
//! Tests for serializing performance-related constructs.
//!
//! 性能相关构造的序列化测试。
//!
//! ## Source File Overview
//!
//! ## 源文件概述
//!
//! Verifies serialization of events, timelines, and run statements.
//!
//! 验证事件、时间轴和运行语句的序列化。

use crate::parser::ParseHandler;
use crate::serializer::Serializer;
use serde_json::Value;

#[test]
fn test_serialize_event_def() {
    let source = r#"
        event Basic {
            index: 0
            action: set_background("bg_forest.png")
        }
        
        fn set_background(file: String)
    "#;

    let program = ParseHandler::parse_source_code(source, false).unwrap();
    let json = Serializer::serialize_to_json(&program, true).unwrap();
    let value: Value = serde_json::from_str(&json).unwrap();

    let events = value["events"].as_array().unwrap();
    assert_eq!(events.len(), 1);

    let event = &events[0];
    assert_eq!(event["name"], "Basic");
    assert_eq!(event["index"], 0.0);
    assert_eq!(event["action"]["type"], "set_background");
}

#[test]
fn test_serialize_event_with_duration() {
    let source = r#"
        event ShowAlice {
            action: show_character("alice.png", "center")
            duration: 2.0
        }
        
        fn show_character(image: String, position: String)
    "#;

    let program = ParseHandler::parse_source_code(source, false).unwrap();
    let json = Serializer::serialize_to_json(&program, true).unwrap();
    let value: Value = serde_json::from_str(&json).unwrap();

    let events = value["events"].as_array().unwrap();
    let event = &events[0];
    assert_eq!(event["name"], "ShowAlice");
    assert_eq!(event["duration"], 2.0);
    assert!(event["index"].is_null());
}

#[test]
fn test_serialize_timeline_def() {
    let source = r#"
        timeline IntroScene {
            run ShowAlice
            wait 2.0
            run PlayMusic
        }
    "#;

    let program = ParseHandler::parse_source_code(source, false).unwrap();
    let json = Serializer::serialize_to_json(&program, true).unwrap();
    let value: Value = serde_json::from_str(&json).unwrap();

    let timelines = value["timelines"].as_array().unwrap();
    assert_eq!(timelines.len(), 1);

    let timeline = &timelines[0];
    assert_eq!(timeline["name"], "IntroScene");

    let statements = timeline["statements"].as_array().unwrap();
    assert_eq!(statements.len(), 3);

    assert_eq!(statements[0]["type"], "run");
    assert_eq!(statements[0]["event_name"], "ShowAlice");

    assert_eq!(statements[1]["type"], "wait");
    assert_eq!(statements[1]["duration"], 2.0);

    assert_eq!(statements[2]["type"], "run");
    assert_eq!(statements[2]["event_name"], "PlayMusic");
}

#[test]
fn test_serialize_timeline_with_args() {
    let source = r#"
        timeline IntroScene {
            run DialogueNode("Start")
        }
    "#;

    let program = ParseHandler::parse_source_code(source, false).unwrap();
    let json = Serializer::serialize_to_json(&program, true).unwrap();
    let value: Value = serde_json::from_str(&json).unwrap();

    let timelines = value["timelines"].as_array().unwrap();
    let timeline = &timelines[0];
    let statements = timeline["statements"].as_array().unwrap();

    assert_eq!(statements[0]["type"], "run");
    assert_eq!(statements[0]["event_name"], "DialogueNode");

    let args = statements[0]["args"].as_array().unwrap();
    assert_eq!(args.len(), 1);
    assert_eq!(args[0], "\"Start\"");
}

#[test]
fn test_serialize_multiple_events_and_timelines() {
    let source = r#"
        event EventA {
            index: 0
            action: func_a("a")
        }
        
        event EventB {
            action: func_b("b")
            duration: 1.5
        }
        
        timeline TimelineA {
            run EventA
        }
        
        timeline TimelineB {
            wait 1.0
            run EventB
        }
        
        fn func_a(arg: String)
        fn func_b(arg: String)
    "#;

    let program = ParseHandler::parse_source_code(source, false).unwrap();
    let json = Serializer::serialize_to_json(&program, true).unwrap();
    let value: Value = serde_json::from_str(&json).unwrap();

    let events = value["events"].as_array().unwrap();
    assert_eq!(events.len(), 2);
    assert_eq!(events[0]["name"], "EventA");
    assert_eq!(events[1]["name"], "EventB");

    let timelines = value["timelines"].as_array().unwrap();
    assert_eq!(timelines.len(), 2);
    assert_eq!(timelines[0]["name"], "TimelineA");
    assert_eq!(timelines[1]["name"], "TimelineB");
}