about summary refs log tree commit diff stats
path: root/crates/libmpv2/src/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libmpv2/src/tests.rs')
-rw-r--r--crates/libmpv2/src/tests.rs222
1 files changed, 222 insertions, 0 deletions
diff --git a/crates/libmpv2/src/tests.rs b/crates/libmpv2/src/tests.rs
new file mode 100644
index 0000000..1e7635d
--- /dev/null
+++ b/crates/libmpv2/src/tests.rs
@@ -0,0 +1,222 @@
+// yt - A fully featured command line YouTube client
+//
+// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of Yt.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+use crate::events::{Event, EventContext, PropertyData};
+use crate::mpv_node::MpvNode;
+use crate::*;
+
+use std::collections::HashMap;
+use std::thread;
+use std::time::Duration;
+
+#[test]
+fn initializer() {
+    let mpv = Mpv::with_initializer(|init| {
+        init.set_property("osc", true)?;
+        init.set_property("input-default-bindings", true)?;
+        init.set_property("volume", 30)?;
+
+        Ok(())
+    })
+    .unwrap();
+
+    assert_eq!(true, mpv.get_property("osc").unwrap());
+    assert_eq!(true, mpv.get_property("input-default-bindings").unwrap());
+    assert_eq!(30i64, mpv.get_property("volume").unwrap());
+}
+
+#[test]
+fn properties() {
+    let mpv = Mpv::new().unwrap();
+    mpv.set_property("volume", 0).unwrap();
+    mpv.set_property("vo", "null").unwrap();
+    mpv.set_property("ytdl-format", "best[width<240]").unwrap();
+    mpv.set_property("sub-gauss", 0.6).unwrap();
+
+    assert_eq!(0i64, mpv.get_property("volume").unwrap());
+    let vo: MpvStr = mpv.get_property("vo").unwrap();
+    assert_eq!("null", &*vo);
+    assert_eq!(true, mpv.get_property("ytdl").unwrap());
+    let subg: f64 = mpv.get_property("sub-gauss").unwrap();
+    assert_eq!(
+        0.6,
+        f64::round(subg * f64::powi(10.0, 4)) / f64::powi(10.0, 4)
+    );
+    mpv.command(
+        "loadfile",
+        &["test-data/speech_12kbps_mb.wav", "append-play"],
+    )
+    .unwrap();
+    thread::sleep(Duration::from_millis(250));
+
+    let title: MpvStr = mpv.get_property("media-title").unwrap();
+    assert_eq!(&*title, "speech_12kbps_mb.wav");
+}
+
+macro_rules! assert_event_occurs {
+    ($ctx:ident, $timeout:literal, $( $expected:pat),+) => {
+        loop {
+            match $ctx.wait_event($timeout) {
+                $( Some($expected) )|+ => {
+                    break;
+                },
+                None => {
+                    continue
+                },
+                other => panic!("Event did not occur, got: {:?}", other),
+            }
+        }
+    }
+}
+
+#[test]
+fn events() {
+    let mpv = Mpv::new().unwrap();
+    let mut ev_ctx = EventContext::new(mpv.ctx);
+    ev_ctx.disable_deprecated_events().unwrap();
+
+    ev_ctx.observe_property("volume", Format::Int64, 0).unwrap();
+    ev_ctx
+        .observe_property("media-title", Format::String, 1)
+        .unwrap();
+
+    mpv.set_property("vo", "null").unwrap();
+
+    // speed up playback so test finishes faster
+    mpv.set_property("speed", 100).unwrap();
+
+    assert_event_occurs!(
+        ev_ctx,
+        3.,
+        Ok(Event::PropertyChange {
+            name: "volume",
+            change: PropertyData::Int64(100),
+            reply_userdata: 0,
+        })
+    );
+
+    mpv.set_property("volume", 0).unwrap();
+    assert_event_occurs!(
+        ev_ctx,
+        10.,
+        Ok(Event::PropertyChange {
+            name: "volume",
+            change: PropertyData::Int64(0),
+            reply_userdata: 0,
+        })
+    );
+    assert!(ev_ctx.wait_event(3.).is_none());
+    mpv.command("loadfile", &["test-data/jellyfish.mp4", "append-play"])
+        .unwrap();
+    assert_event_occurs!(ev_ctx, 10., Ok(Event::StartFile));
+    assert_event_occurs!(
+        ev_ctx,
+        10.,
+        Ok(Event::PropertyChange {
+            name: "media-title",
+            change: PropertyData::Str("jellyfish.mp4"),
+            reply_userdata: 1,
+        })
+    );
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::FileLoaded));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::VideoReconfig));
+
+    mpv.command("loadfile", &["test-data/speech_12kbps_mb.wav", "replace"])
+        .unwrap();
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::VideoReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::VideoReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::EndFile(mpv_end_file_reason::Stop)));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::StartFile));
+    assert_event_occurs!(
+        ev_ctx,
+        3.,
+        Ok(Event::PropertyChange {
+            name: "media-title",
+            change: PropertyData::Str("speech_12kbps_mb.wav"),
+            reply_userdata: 1,
+        })
+    );
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::VideoReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::FileLoaded));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::PlaybackRestart));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert_event_occurs!(ev_ctx, 10., Ok(Event::EndFile(mpv_end_file_reason::Eof)));
+    assert_event_occurs!(ev_ctx, 3., Ok(Event::AudioReconfig));
+    assert!(ev_ctx.wait_event(3.).is_none());
+}
+
+#[test]
+fn node_map() -> Result<()> {
+    let mpv = Mpv::new()?;
+
+    mpv.command(
+        "loadfile",
+        &["test-data/speech_12kbps_mb.wav", "append-play"],
+    )
+    .unwrap();
+
+    thread::sleep(Duration::from_millis(250));
+    let audio_params = mpv.get_property::<MpvNode>("audio-params")?;
+    let params = audio_params.map().unwrap().collect::<HashMap<_, _>>();
+
+    assert_eq!(params.len(), 5);
+
+    let format = params.get("format").unwrap();
+    assert_eq!(format, &MpvNode::String("s16".to_string()));
+
+    let samplerate = params.get("samplerate").unwrap();
+    assert_eq!(samplerate, &MpvNode::Int64(48_000));
+
+    let channels = params.get("channels").unwrap();
+    assert_eq!(channels, &MpvNode::String("mono".to_string()));
+
+    let hr_channels = params.get("hr-channels").unwrap();
+    assert_eq!(hr_channels, &MpvNode::String("mono".to_string()));
+
+    let channel_count = params.get("channel-count").unwrap();
+    assert_eq!(channel_count, &MpvNode::Int64(1));
+
+    Ok(())
+}
+
+#[test]
+fn node_array() -> Result<()> {
+    let mpv = Mpv::new()?;
+
+    mpv.command(
+        "loadfile",
+        &["test-data/speech_12kbps_mb.wav", "append-play"],
+    )
+    .unwrap();
+
+    thread::sleep(Duration::from_millis(250));
+    let playlist = mpv.get_property::<MpvNode>("playlist")?;
+    let items = playlist.array().unwrap().collect::<Vec<_>>();
+
+    assert_eq!(items.len(), 1);
+    let track = items[0].clone().map().unwrap().collect::<HashMap<_, _>>();
+
+    let filename = track.get("filename").unwrap();
+
+    assert_eq!(
+        filename,
+        &MpvNode::String("test-data/speech_12kbps_mb.wav".to_string())
+    );
+
+    Ok(())
+}