bms-rs 1.0.0

The BMS format parser.
Documentation
use bms_rs::bms::prelude::*;
use num::BigUint;

#[test]
fn nested_random() {
    const SRC: &str = r"
        #00111:11000000

        #RANDOM 2

        #IF 1
            #00112:00220000

            #RANDOM 2

            #IF 1
                #00115:00550000
            #ENDIF

            #IF 2
                #00116:00006600
            #ENDIF

            #ENDRANDOM

        #ENDIF

        #IF 2
            #00113:00003300
        #ENDIF

        #ENDRANDOM

        #00114:00000044
    ";

    let id11 = ObjId::try_from("11", false).unwrap();
    let id22 = ObjId::try_from("22", false).unwrap();
    let id33 = ObjId::try_from("33", false).unwrap();
    let id44 = ObjId::try_from("44", false).unwrap();
    let id55 = ObjId::try_from("55", false).unwrap();
    let id66 = ObjId::try_from("66", false).unwrap();

    super::test_bms_assert_objs(
        SRC,
        RngMock([BigUint::from(1u64)]),
        vec![
            WavObj {
                offset: ObjTime::start_of(1.into()),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(1))
                    .to_channel_id(),
                wav_id: id11,
            },
            WavObj {
                offset: ObjTime::new(1, 1, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(2))
                    .to_channel_id(),
                wav_id: id22,
            },
            WavObj {
                offset: ObjTime::new(1, 1, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(5))
                    .to_channel_id(),
                wav_id: id55,
            },
            WavObj {
                offset: ObjTime::new(1, 3, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(4))
                    .to_channel_id(),
                wav_id: id44,
            },
        ],
    );

    super::test_bms_assert_objs(
        SRC,
        RngMock([BigUint::from(1u64), BigUint::from(2u64)]),
        vec![
            WavObj {
                offset: ObjTime::start_of(1.into()),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(1))
                    .to_channel_id(),
                wav_id: id11,
            },
            WavObj {
                offset: ObjTime::new(1, 1, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(2))
                    .to_channel_id(),
                wav_id: id22,
            },
            WavObj {
                offset: ObjTime::new(1, 2, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(
                    PlayerSide::Player1,
                    NoteKind::Visible,
                    Key::Scratch(1),
                )
                .to_channel_id(),
                wav_id: id66,
            },
            WavObj {
                offset: ObjTime::new(1, 3, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(4))
                    .to_channel_id(),
                wav_id: id44,
            },
        ],
    );

    super::test_bms_assert_objs(
        SRC,
        RngMock([BigUint::from(2u64)]),
        vec![
            WavObj {
                offset: ObjTime::start_of(1.into()),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(1))
                    .to_channel_id(),
                wav_id: id11,
            },
            WavObj {
                offset: ObjTime::new(1, 2, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(3))
                    .to_channel_id(),
                wav_id: id33,
            },
            WavObj {
                offset: ObjTime::new(1, 3, 4).expect("4 should be a valid denominator"),
                channel_id: KeyLayoutBeat::new(PlayerSide::Player1, NoteKind::Visible, Key::Key(4))
                    .to_channel_id(),
                wav_id: id44,
            },
        ],
    );
}