Skip to main content

kozan_core/html/
html_audio_element.rs

1//! `HTMLAudioElement` — an audio playback element.
2//!
3//! Chrome equivalent: `HTMLAudioElement` (inherits from `HTMLMediaElement`).
4//! Not a replaced element (no visual content unless controls are shown).
5
6use super::media_element::MediaElement;
7use crate::Handle;
8use kozan_macros::Element;
9
10/// An audio playback element (`<audio>`).
11///
12/// Chrome equivalent: `HTMLAudioElement`.
13/// Inherits all playback behavior from `MediaElement`.
14#[derive(Copy, Clone, Element)]
15#[element(tag = "audio")]
16pub struct HtmlAudioElement(Handle);
17
18impl MediaElement for HtmlAudioElement {}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use crate::dom::document::Document;
24    use crate::dom::traits::Element;
25    use crate::html::media_element::{MediaNetworkState, MediaReadyState};
26
27    #[test]
28    fn audio_tag_name() {
29        let doc = Document::new();
30        let audio = doc.create::<HtmlAudioElement>();
31        assert_eq!(audio.tag_name(), "audio");
32    }
33
34    #[test]
35    fn audio_src_roundtrip() {
36        let doc = Document::new();
37        let audio = doc.create::<HtmlAudioElement>();
38
39        assert_eq!(audio.src(), "");
40        audio.set_src("song.mp3");
41        assert_eq!(audio.src(), "song.mp3");
42    }
43
44    #[test]
45    fn audio_autoplay_toggle() {
46        let doc = Document::new();
47        let audio = doc.create::<HtmlAudioElement>();
48
49        assert!(!audio.autoplay());
50        audio.set_autoplay(true);
51        assert!(audio.autoplay());
52        audio.set_autoplay(false);
53        assert!(!audio.autoplay());
54    }
55
56    #[test]
57    fn audio_loop_toggle() {
58        let doc = Document::new();
59        let audio = doc.create::<HtmlAudioElement>();
60
61        assert!(!audio.loop_playback());
62        audio.set_loop_playback(true);
63        assert!(audio.loop_playback());
64        audio.set_loop_playback(false);
65        assert!(!audio.loop_playback());
66    }
67
68    #[test]
69    fn audio_muted_toggle() {
70        let doc = Document::new();
71        let audio = doc.create::<HtmlAudioElement>();
72
73        assert!(!audio.muted());
74        audio.set_muted(true);
75        assert!(audio.muted());
76        audio.set_muted(false);
77        assert!(!audio.muted());
78    }
79
80    #[test]
81    fn audio_controls_toggle() {
82        let doc = Document::new();
83        let audio = doc.create::<HtmlAudioElement>();
84
85        assert!(!audio.controls());
86        audio.set_controls(true);
87        assert!(audio.controls());
88        audio.set_controls(false);
89        assert!(!audio.controls());
90    }
91
92    #[test]
93    fn audio_preload_default_and_set() {
94        let doc = Document::new();
95        let audio = doc.create::<HtmlAudioElement>();
96
97        // Default preload is "auto".
98        assert_eq!(audio.preload(), "auto");
99        audio.set_preload("none");
100        assert_eq!(audio.preload(), "none");
101        audio.set_preload("metadata");
102        assert_eq!(audio.preload(), "metadata");
103    }
104
105    #[test]
106    fn audio_default_ready_and_network_state() {
107        let doc = Document::new();
108        let audio = doc.create::<HtmlAudioElement>();
109
110        // current_time/duration/paused are unimplemented — no backend yet.
111        assert_eq!(audio.ready_state(), MediaReadyState::HaveNothing);
112        assert_eq!(audio.network_state(), MediaNetworkState::Empty);
113    }
114}