Skip to main content

tui_term/
widget.rs

1use std::borrow::Cow;
2
3use ratatui_core::{
4    buffer::Buffer,
5    layout::Rect,
6    style::{Color, Modifier, Style},
7    widgets::Widget,
8};
9use ratatui_widgets::{block::Block, clear::Clear};
10
11use crate::state;
12
13/// A trait representing a pseudo-terminal screen.
14///
15/// Implementing this trait allows for backends other than `vt100` to be used
16/// with the `PseudoTerminal` widget.
17pub trait Screen {
18    /// The type of cell this screen contains
19    type C: Cell;
20
21    /// Returns the cell at the given location if it exists.
22    fn cell(&self, row: u16, col: u16) -> Option<&Self::C>;
23    /// Returns whether the terminal should be hidden
24    fn hide_cursor(&self) -> bool;
25    /// Returns cursor position of screen.
26    ///
27    /// The return value is expected to be (row, column)
28    fn cursor_position(&self) -> (u16, u16);
29}
30
31/// A trait for representing a single cell on a screen.
32pub trait Cell {
33    /// Whether the cell has any contents that could be rendered to the screen.
34    fn has_contents(&self) -> bool;
35    /// Apply the contents and styling of this cell to the provided buffer cell.
36    fn apply(&self, cell: &mut ratatui_core::buffer::Cell);
37}
38
39/// A widget representing a pseudo-terminal screen.
40///
41/// The `PseudoTerminal` widget displays the contents of a pseudo-terminal screen,
42/// which is typically populated with text and control sequences from a terminal emulator.
43/// It provides a visual representation of the terminal output within a TUI application.
44///
45/// The contents of the pseudo-terminal screen are represented by a `vt100::Screen` object.
46/// The `vt100` library provides functionality for parsing and processing terminal control sequences
47/// and handling terminal state, allowing the `PseudoTerminal` widget to accurately render the
48/// terminal output.
49///
50/// # Examples
51///
52/// ```rust
53/// use ratatui_core::style::{Color, Modifier, Style};
54/// use ratatui_widgets::{block::Block, borders::Borders};
55/// use tui_term::widget::PseudoTerminal;
56/// use vt100::Parser;
57///
58/// let mut parser = vt100::Parser::new(24, 80, 0);
59/// let pseudo_term = PseudoTerminal::new(parser.screen())
60///     .block(Block::default().title("Terminal").borders(Borders::ALL))
61///     .style(
62///         Style::default()
63///             .fg(Color::White)
64///             .bg(Color::Black)
65///             .add_modifier(Modifier::BOLD),
66///     );
67/// ```
68#[non_exhaustive]
69pub struct PseudoTerminal<'a, S> {
70    screen: &'a S,
71    pub(crate) block: Option<Block<'a>>,
72    style: Option<Style>,
73    pub(crate) cursor: Cursor,
74}
75
76#[non_exhaustive]
77pub struct Cursor {
78    pub(crate) show: bool,
79    pub(crate) symbol: Cow<'static, str>,
80    pub(crate) style: Style,
81    pub(crate) overlay_style: Style,
82}
83
84impl Cursor {
85    /// Sets the symbol for the cursor.
86    ///
87    /// # Arguments
88    ///
89    /// * `symbol`: The symbol to set as the cursor.
90    ///
91    /// # Example
92    ///
93    /// ```
94    /// use ratatui_core::style::Style;
95    /// use tui_term::widget::Cursor;
96    ///
97    /// let cursor = Cursor::default().symbol("|");
98    /// ```
99    #[inline]
100    #[must_use]
101    pub fn symbol(mut self, symbol: impl Into<Cow<'static, str>>) -> Self {
102        self.symbol = symbol.into();
103        self
104    }
105
106    /// Sets the style for the cursor.
107    ///
108    /// # Arguments
109    ///
110    /// * `style`: The `Style` to set for the cursor.
111    ///
112    /// # Example
113    ///
114    /// ```
115    /// use ratatui_core::style::Style;
116    /// use tui_term::widget::Cursor;
117    ///
118    /// let cursor = Cursor::default().style(Style::default());
119    /// ```
120    #[inline]
121    #[must_use]
122    pub const fn style(mut self, style: Style) -> Self {
123        self.style = style;
124        self
125    }
126
127    /// Sets the overlay style for the cursor.
128    ///
129    /// The overlay style is used when the cursor overlaps with existing content on the screen.
130    ///
131    /// # Arguments
132    ///
133    /// * `overlay_style`: The `Style` to set as the overlay style for the cursor.
134    ///
135    /// # Example
136    ///
137    /// ```
138    /// use ratatui_core::style::Style;
139    /// use tui_term::widget::Cursor;
140    ///
141    /// let cursor = Cursor::default().overlay_style(Style::default());
142    /// ```
143    #[inline]
144    #[must_use]
145    pub const fn overlay_style(mut self, overlay_style: Style) -> Self {
146        self.overlay_style = overlay_style;
147        self
148    }
149
150    /// Set the visibility of the cursor (default = shown)
151    #[inline]
152    #[must_use]
153    pub const fn visibility(mut self, show: bool) -> Self {
154        self.show = show;
155        self
156    }
157
158    /// Show the cursor (default)
159    #[inline]
160    pub fn show(&mut self) {
161        self.show = true;
162    }
163
164    /// Hide the cursor
165    #[inline]
166    pub fn hide(&mut self) {
167        self.show = false;
168    }
169}
170
171impl Default for Cursor {
172    #[inline]
173    fn default() -> Self {
174        Self {
175            show: true,
176            symbol: Cow::Borrowed("\u{2588}"), //"█".
177            style: Style::default().fg(Color::Gray),
178            overlay_style: Style::default().add_modifier(Modifier::REVERSED),
179        }
180    }
181}
182
183impl<'a, S: Screen> PseudoTerminal<'a, S> {
184    /// Creates a new instance of `PseudoTerminal`.
185    ///
186    /// # Arguments
187    ///
188    /// * `screen`: The reference to the `Screen`.
189    ///
190    /// # Example
191    ///
192    /// ```
193    /// use tui_term::widget::PseudoTerminal;
194    /// use vt100::Parser;
195    ///
196    /// let mut parser = vt100::Parser::new(24, 80, 0);
197    /// let pseudo_term = PseudoTerminal::new(parser.screen());
198    /// ```
199    #[inline]
200    #[must_use]
201    pub fn new(screen: &'a S) -> Self {
202        PseudoTerminal {
203            screen,
204            block: None,
205            style: None,
206            cursor: Cursor::default(),
207        }
208    }
209
210    /// Sets the block for the `PseudoTerminal`.
211    ///
212    /// # Arguments
213    ///
214    /// * `block`: The `Block` to set.
215    ///
216    /// # Example
217    ///
218    /// ```
219    /// use ratatui_widgets::block::Block;
220    /// use tui_term::widget::PseudoTerminal;
221    /// use vt100::Parser;
222    ///
223    /// let mut parser = vt100::Parser::new(24, 80, 0);
224    /// let block = Block::default();
225    /// let pseudo_term = PseudoTerminal::new(parser.screen()).block(block);
226    /// ```
227    #[inline]
228    #[must_use]
229    pub fn block(mut self, block: Block<'a>) -> Self {
230        self.block = Some(block);
231        self
232    }
233
234    /// Sets the cursor configuration for the `PseudoTerminal`.
235    ///
236    /// The `cursor` method allows configuring the appearance of the cursor within the
237    /// `PseudoTerminal` widget.
238    ///
239    /// # Arguments
240    ///
241    /// * `cursor`: The `Cursor` configuration to set.
242    ///
243    /// # Example
244    ///
245    /// ```rust
246    /// use ratatui_core::style::Style;
247    /// use tui_term::widget::{Cursor, PseudoTerminal};
248    ///
249    /// let mut parser = vt100::Parser::new(24, 80, 0);
250    /// let cursor = Cursor::default().symbol("|").style(Style::default());
251    /// let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
252    /// ```
253    #[inline]
254    #[must_use]
255    pub fn cursor(mut self, cursor: Cursor) -> Self {
256        self.cursor = cursor;
257        self
258    }
259
260    /// Sets the style for `PseudoTerminal`.
261    ///
262    /// # Arguments
263    ///
264    /// * `style`: The `Style` to set.
265    ///
266    /// # Example
267    ///
268    /// ```
269    /// use ratatui_core::style::Style;
270    /// use tui_term::widget::PseudoTerminal;
271    ///
272    /// let mut parser = vt100::Parser::new(24, 80, 0);
273    /// let style = Style::default();
274    /// let pseudo_term = PseudoTerminal::new(parser.screen()).style(style);
275    /// ```
276    #[inline]
277    #[must_use]
278    pub const fn style(mut self, style: Style) -> Self {
279        self.style = Some(style);
280        self
281    }
282
283    #[inline]
284    #[must_use]
285    pub const fn screen(&self) -> &S {
286        self.screen
287    }
288}
289
290impl<S: Screen> Widget for &PseudoTerminal<'_, S> {
291    #[inline]
292    fn render(self, area: Rect, buf: &mut Buffer) {
293        Clear.render(area, buf);
294        let area = self.block.as_ref().map_or(area, |b| {
295            let inner_area = b.inner(area);
296            b.clone().render(area, buf);
297            inner_area
298        });
299        state::handle(self, area, buf);
300    }
301}
302
303impl<S: Screen> Widget for PseudoTerminal<'_, S> {
304    #[inline]
305    fn render(self, area: Rect, buf: &mut Buffer) {
306        (&self).render(area, buf);
307    }
308}
309
310#[cfg(all(test, feature = "vt100"))]
311mod tests {
312    use ratatui::Terminal;
313    use ratatui_core::backend::TestBackend;
314    use ratatui_widgets::borders::Borders;
315
316    use super::*;
317
318    fn snapshot_typescript(stream: &[u8]) -> String {
319        let backend = TestBackend::new(80, 24);
320        let mut terminal = Terminal::new(backend).unwrap();
321        let mut parser = vt100::Parser::new(24, 80, 0);
322        parser.process(stream);
323        let pseudo_term = PseudoTerminal::new(parser.screen());
324        terminal
325            .draw(|f| {
326                f.render_widget(pseudo_term, f.area());
327            })
328            .unwrap();
329        format!("{:?}", terminal.backend().buffer())
330    }
331
332    #[test]
333    fn empty_actions() {
334        let backend = TestBackend::new(80, 24);
335        let mut terminal = Terminal::new(backend).unwrap();
336        let mut parser = vt100::Parser::new(24, 80, 0);
337        parser.process(b" ");
338        let pseudo_term = PseudoTerminal::new(parser.screen());
339        terminal
340            .draw(|f| {
341                f.render_widget(pseudo_term, f.area());
342            })
343            .unwrap();
344        let view = format!("{:?}", terminal.backend().buffer());
345        insta::assert_snapshot!(view);
346    }
347    #[test]
348    fn boundary_rows_overshot_no_panic() {
349        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
350        // Make the backend on purpose much smaller
351        let backend = TestBackend::new(80, 4);
352        let mut terminal = Terminal::new(backend).unwrap();
353        let mut parser = vt100::Parser::new(24, 80, 0);
354        parser.process(stream);
355        let pseudo_term = PseudoTerminal::new(parser.screen());
356        terminal
357            .draw(|f| {
358                f.render_widget(pseudo_term, f.area());
359            })
360            .unwrap();
361        let view = format!("{:?}", terminal.backend().buffer());
362        insta::assert_snapshot!(view);
363    }
364
365    #[test]
366    fn simple_ls() {
367        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
368        let view = snapshot_typescript(stream);
369        insta::assert_snapshot!(view);
370    }
371    #[test]
372    fn simple_cursor_alternate_symbol() {
373        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
374        let backend = TestBackend::new(80, 24);
375        let mut terminal = Terminal::new(backend).unwrap();
376        let mut parser = vt100::Parser::new(24, 80, 0);
377        let cursor = Cursor::default().symbol("|");
378        parser.process(stream);
379        let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
380        terminal
381            .draw(|f| {
382                f.render_widget(pseudo_term, f.area());
383            })
384            .unwrap();
385        let view = format!("{:?}", terminal.backend().buffer());
386        insta::assert_snapshot!(view);
387    }
388    #[test]
389    fn simple_cursor_styled() {
390        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
391        let backend = TestBackend::new(80, 24);
392        let mut terminal = Terminal::new(backend).unwrap();
393        let mut parser = vt100::Parser::new(24, 80, 0);
394        let style = Style::default().bg(Color::Cyan).fg(Color::LightRed);
395        let cursor = Cursor::default().symbol("|").style(style);
396        parser.process(stream);
397        let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
398        terminal
399            .draw(|f| {
400                f.render_widget(pseudo_term, f.area());
401            })
402            .unwrap();
403        let view = format!("{:?}", terminal.backend().buffer());
404        insta::assert_snapshot!(view);
405    }
406    #[test]
407    fn simple_cursor_hide() {
408        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
409        let backend = TestBackend::new(80, 24);
410        let mut terminal = Terminal::new(backend).unwrap();
411        let mut parser = vt100::Parser::new(24, 80, 0);
412        let cursor = Cursor::default().visibility(false);
413        parser.process(stream);
414        let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
415        terminal
416            .draw(|f| {
417                f.render_widget(pseudo_term, f.area());
418            })
419            .unwrap();
420        let view = format!("{:?}", terminal.backend().buffer());
421        insta::assert_snapshot!(view);
422    }
423    #[test]
424    fn simple_cursor_hide_alt() {
425        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
426        let backend = TestBackend::new(80, 24);
427        let mut terminal = Terminal::new(backend).unwrap();
428        let mut parser = vt100::Parser::new(24, 80, 0);
429        let mut cursor = Cursor::default();
430        cursor.hide();
431        parser.process(stream);
432        let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
433        terminal
434            .draw(|f| {
435                f.render_widget(pseudo_term, f.area());
436            })
437            .unwrap();
438        let view = format!("{:?}", terminal.backend().buffer());
439        insta::assert_snapshot!(view);
440    }
441    #[test]
442    fn overlapping_cursor() {
443        let stream = include_bytes!("../test/typescript/overlapping_cursor.typescript");
444        let view = snapshot_typescript(stream);
445        insta::assert_snapshot!(view);
446    }
447    #[test]
448    fn overlapping_cursor_alternate_style() {
449        let stream = include_bytes!("../test/typescript/overlapping_cursor.typescript");
450        let backend = TestBackend::new(80, 24);
451        let mut terminal = Terminal::new(backend).unwrap();
452        let mut parser = vt100::Parser::new(24, 80, 0);
453        let style = Style::default().bg(Color::Cyan).fg(Color::LightRed);
454        let cursor = Cursor::default().overlay_style(style);
455        parser.process(stream);
456        let pseudo_term = PseudoTerminal::new(parser.screen()).cursor(cursor);
457        terminal
458            .draw(|f| {
459                f.render_widget(pseudo_term, f.area());
460            })
461            .unwrap();
462        let view = format!("{:?}", terminal.backend().buffer());
463        insta::assert_snapshot!(view);
464    }
465    #[test]
466    fn simple_ls_with_block() {
467        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
468        let backend = TestBackend::new(100, 24);
469        let mut terminal = Terminal::new(backend).unwrap();
470        let mut parser = vt100::Parser::new(24, 80, 0);
471        parser.process(stream);
472        let block = Block::default().borders(Borders::ALL).title("ls");
473        let pseudo_term = PseudoTerminal::new(parser.screen()).block(block);
474        terminal
475            .draw(|f| {
476                f.render_widget(pseudo_term, f.area());
477            })
478            .unwrap();
479        let view = format!("{:?}", terminal.backend().buffer());
480        insta::assert_snapshot!(view);
481    }
482    #[test]
483    fn simple_ls_no_style_from_block() {
484        let stream = include_bytes!("../test/typescript/simple_ls.typescript");
485        let backend = TestBackend::new(100, 24);
486        let mut terminal = Terminal::new(backend).unwrap();
487        let mut parser = vt100::Parser::new(24, 80, 0);
488        parser.process(stream);
489        let block = Block::default()
490            .borders(Borders::ALL)
491            .style(Style::default().add_modifier(Modifier::BOLD))
492            .title("ls");
493        let pseudo_term = PseudoTerminal::new(parser.screen()).block(block);
494        terminal
495            .draw(|f| {
496                f.render_widget(pseudo_term, f.area());
497            })
498            .unwrap();
499        let view = format!("{:?}", terminal.backend().buffer());
500        insta::assert_snapshot!(view);
501    }
502    #[test]
503    fn italic_text() {
504        let stream = b"This line will be displayed in italic. This should have no style.";
505        let view = snapshot_typescript(stream);
506        insta::assert_snapshot!(view);
507    }
508    #[test]
509    fn underlined_text() {
510        let stream =
511            b"This line will be displayed with an underline. This should have no style.";
512        let view = snapshot_typescript(stream);
513        insta::assert_snapshot!(view);
514    }
515    #[test]
516    fn bold_text() {
517        let stream = b"This line will be displayed bold. This should have no style.";
518        let view = snapshot_typescript(stream);
519        insta::assert_snapshot!(view);
520    }
521    #[test]
522    fn inverse_text() {
523        let stream = b"This line will be displayed inversed. This should have no style.";
524        let view = snapshot_typescript(stream);
525        insta::assert_snapshot!(view);
526    }
527    #[test]
528    fn dim_text() {
529        let stream =
530            b"\x1b[2mThis line will be displayed dim/faint.\x1b[0m This should have no style.";
531        let view = snapshot_typescript(stream);
532        insta::assert_snapshot!(view);
533    }
534    #[test]
535    fn combined_modifier_text() {
536        let stream =
537            b"This line will be displayed in italic and underlined. This should have no style.";
538        let view = snapshot_typescript(stream);
539        insta::assert_snapshot!(view);
540    }
541    #[test]
542    fn dim_bold_text() {
543        let stream = b"\x1b[2m\x1b[1mThis is dim and bold. Bold takes precedence.\x1b[0m Normal.";
544        let view = snapshot_typescript(stream);
545        insta::assert_snapshot!(view);
546    }
547
548    #[test]
549    fn vttest_02_01() {
550        let stream = include_bytes!("../test/typescript/vttest_02_01.typescript");
551        let view = snapshot_typescript(stream);
552        insta::assert_snapshot!(view);
553    }
554    #[test]
555    fn vttest_02_02() {
556        let stream = include_bytes!("../test/typescript/vttest_02_02.typescript");
557        let view = snapshot_typescript(stream);
558        insta::assert_snapshot!(view);
559    }
560    #[test]
561    fn vttest_02_03() {
562        let stream = include_bytes!("../test/typescript/vttest_02_03.typescript");
563        let view = snapshot_typescript(stream);
564        insta::assert_snapshot!(view);
565    }
566    #[test]
567    fn vttest_02_04() {
568        let stream = include_bytes!("../test/typescript/vttest_02_04.typescript");
569        let view = snapshot_typescript(stream);
570        insta::assert_snapshot!(view);
571    }
572    #[test]
573    fn vttest_02_05() {
574        let stream = include_bytes!("../test/typescript/vttest_02_05.typescript");
575        let view = snapshot_typescript(stream);
576        insta::assert_snapshot!(view);
577    }
578    #[test]
579    fn vttest_02_06() {
580        let stream = include_bytes!("../test/typescript/vttest_02_06.typescript");
581        let view = snapshot_typescript(stream);
582        insta::assert_snapshot!(view);
583    }
584    #[test]
585    fn vttest_02_07() {
586        let stream = include_bytes!("../test/typescript/vttest_02_07.typescript");
587        let view = snapshot_typescript(stream);
588        insta::assert_snapshot!(view);
589    }
590    #[test]
591    fn vttest_02_08() {
592        let stream = include_bytes!("../test/typescript/vttest_02_08.typescript");
593        let view = snapshot_typescript(stream);
594        insta::assert_snapshot!(view);
595    }
596    #[test]
597    fn vttest_02_09() {
598        let stream = include_bytes!("../test/typescript/vttest_02_09.typescript");
599        let view = snapshot_typescript(stream);
600        insta::assert_snapshot!(view);
601    }
602    #[test]
603    fn vttest_02_10() {
604        let stream = include_bytes!("../test/typescript/vttest_02_10.typescript");
605        let view = snapshot_typescript(stream);
606        insta::assert_snapshot!(view);
607    }
608    #[test]
609    fn vttest_02_11() {
610        let stream = include_bytes!("../test/typescript/vttest_02_11.typescript");
611        let view = snapshot_typescript(stream);
612        insta::assert_snapshot!(view);
613    }
614    #[test]
615    fn vttest_02_12() {
616        let stream = include_bytes!("../test/typescript/vttest_02_12.typescript");
617        let view = snapshot_typescript(stream);
618        insta::assert_snapshot!(view);
619    }
620    #[test]
621    fn vttest_02_13() {
622        let stream = include_bytes!("../test/typescript/vttest_02_13.typescript");
623        let view = snapshot_typescript(stream);
624        insta::assert_snapshot!(view);
625    }
626    #[test]
627    fn vttest_02_14() {
628        let stream = include_bytes!("../test/typescript/vttest_02_14.typescript");
629        let view = snapshot_typescript(stream);
630        insta::assert_snapshot!(view);
631    }
632    #[test]
633    fn vttest_02_15() {
634        let stream = include_bytes!("../test/typescript/vttest_02_15.typescript");
635        let view = snapshot_typescript(stream);
636        insta::assert_snapshot!(view);
637    }
638
639    #[test]
640    fn vttest_03_01() {
641        let stream = include_bytes!("../test/typescript/vttest_03_01.typescript");
642        let view = snapshot_typescript(stream);
643        insta::assert_snapshot!(view);
644    }
645
646    #[test]
647    fn vttest_01_01() {
648        let stream = include_bytes!("../test/typescript/vttest_01_01.typescript");
649        let view = snapshot_typescript(stream);
650        insta::assert_snapshot!(view);
651    }
652
653    #[test]
654    fn vttest_01_02() {
655        let stream = include_bytes!("../test/typescript/vttest_01_02.typescript");
656        let view = snapshot_typescript(stream);
657        insta::assert_snapshot!(view);
658    }
659
660    #[test]
661    fn vttest_01_03() {
662        let stream = include_bytes!("../test/typescript/vttest_01_03.typescript");
663        let view = snapshot_typescript(stream);
664        insta::assert_snapshot!(view);
665    }
666
667    #[test]
668    fn vttest_01_04() {
669        let stream = include_bytes!("../test/typescript/vttest_01_04.typescript");
670        let view = snapshot_typescript(stream);
671        insta::assert_snapshot!(view);
672    }
673
674    #[test]
675    fn vttest_01_05() {
676        let stream = include_bytes!("../test/typescript/vttest_01_05.typescript");
677        let view = snapshot_typescript(stream);
678        insta::assert_snapshot!(view);
679    }
680
681    #[test]
682    fn vttest_menu() {
683        let stream = include_bytes!("../test/typescript/vttest_menu.typescript");
684        let view = snapshot_typescript(stream);
685        insta::assert_snapshot!(view);
686    }
687
688    #[test]
689    fn vttest_08_01() {
690        let stream = include_bytes!("../test/typescript/vttest_08_01.typescript");
691        let view = snapshot_typescript(stream);
692        insta::assert_snapshot!(view);
693    }
694
695    #[test]
696    fn vttest_08_02() {
697        let stream = include_bytes!("../test/typescript/vttest_08_02.typescript");
698        let view = snapshot_typescript(stream);
699        insta::assert_snapshot!(view);
700    }
701
702    #[test]
703    fn vttest_08_03() {
704        let stream = include_bytes!("../test/typescript/vttest_08_03.typescript");
705        let view = snapshot_typescript(stream);
706        insta::assert_snapshot!(view);
707    }
708
709    #[test]
710    fn vttest_08_04() {
711        let stream = include_bytes!("../test/typescript/vttest_08_04.typescript");
712        let view = snapshot_typescript(stream);
713        insta::assert_snapshot!(view);
714    }
715
716    #[test]
717    fn vttest_08_05() {
718        let stream = include_bytes!("../test/typescript/vttest_08_05.typescript");
719        let view = snapshot_typescript(stream);
720        insta::assert_snapshot!(view);
721    }
722
723    #[test]
724    fn vttest_08_06() {
725        let stream = include_bytes!("../test/typescript/vttest_08_06.typescript");
726        let view = snapshot_typescript(stream);
727        insta::assert_snapshot!(view);
728    }
729
730    #[test]
731    fn vttest_08_07() {
732        let stream = include_bytes!("../test/typescript/vttest_08_07.typescript");
733        let view = snapshot_typescript(stream);
734        insta::assert_snapshot!(view);
735    }
736
737    #[test]
738    fn vttest_08_08() {
739        let stream = include_bytes!("../test/typescript/vttest_08_08.typescript");
740        let view = snapshot_typescript(stream);
741        insta::assert_snapshot!(view);
742    }
743
744    #[test]
745    fn vttest_08_09() {
746        let stream = include_bytes!("../test/typescript/vttest_08_09.typescript");
747        let view = snapshot_typescript(stream);
748        insta::assert_snapshot!(view);
749    }
750
751    #[test]
752    fn vttest_08_10() {
753        let stream = include_bytes!("../test/typescript/vttest_08_10.typescript");
754        let view = snapshot_typescript(stream);
755        insta::assert_snapshot!(view);
756    }
757
758    #[test]
759    fn vttest_08_11() {
760        let stream = include_bytes!("../test/typescript/vttest_08_11.typescript");
761        let view = snapshot_typescript(stream);
762        insta::assert_snapshot!(view);
763    }
764
765    #[test]
766    fn vttest_08_12() {
767        let stream = include_bytes!("../test/typescript/vttest_08_12.typescript");
768        let view = snapshot_typescript(stream);
769        insta::assert_snapshot!(view);
770    }
771
772    #[test]
773    fn vttest_08_13() {
774        let stream = include_bytes!("../test/typescript/vttest_08_13.typescript");
775        let view = snapshot_typescript(stream);
776        insta::assert_snapshot!(view);
777    }
778
779    #[test]
780    fn vttest_08_14() {
781        let stream = include_bytes!("../test/typescript/vttest_08_14.typescript");
782        let view = snapshot_typescript(stream);
783        insta::assert_snapshot!(view);
784    }
785
786    #[test]
787    fn vttest_11_06_02() {
788        let stream = include_bytes!("../test/typescript/vttest_11_06_02.typescript");
789        let view = snapshot_typescript(stream);
790        insta::assert_snapshot!(view);
791    }
792
793    #[test]
794    fn vttest_11_06_03() {
795        let stream = include_bytes!("../test/typescript/vttest_11_06_03.typescript");
796        let view = snapshot_typescript(stream);
797        insta::assert_snapshot!(view);
798    }
799
800    #[test]
801    fn vttest_11_06_04() {
802        let stream = include_bytes!("../test/typescript/vttest_11_06_04.typescript");
803        let view = snapshot_typescript(stream);
804        insta::assert_snapshot!(view);
805    }
806
807    #[test]
808    fn vttest_11_06_05() {
809        let stream = include_bytes!("../test/typescript/vttest_11_06_05.typescript");
810        let view = snapshot_typescript(stream);
811        insta::assert_snapshot!(view);
812    }
813
814    #[test]
815    fn vttest_09_01() {
816        let stream = include_bytes!("../test/typescript/vttest_09_01.typescript");
817        let view = snapshot_typescript(stream);
818        insta::assert_snapshot!(view);
819    }
820
821    #[test]
822    fn vttest_09_02() {
823        let stream = include_bytes!("../test/typescript/vttest_09_02.typescript");
824        let view = snapshot_typescript(stream);
825        insta::assert_snapshot!(view);
826    }
827
828    #[test]
829    fn vttest_09_03() {
830        let stream = include_bytes!("../test/typescript/vttest_09_03.typescript");
831        let view = snapshot_typescript(stream);
832        insta::assert_snapshot!(view);
833    }
834
835    #[test]
836    fn vttest_09_04() {
837        let stream = include_bytes!("../test/typescript/vttest_09_04.typescript");
838        let view = snapshot_typescript(stream);
839        insta::assert_snapshot!(view);
840    }
841
842    #[test]
843    fn vttest_09_05() {
844        let stream = include_bytes!("../test/typescript/vttest_09_05.typescript");
845        let view = snapshot_typescript(stream);
846        insta::assert_snapshot!(view);
847    }
848
849    #[test]
850    fn vttest_09_06() {
851        let stream = include_bytes!("../test/typescript/vttest_09_06.typescript");
852        let view = snapshot_typescript(stream);
853        insta::assert_snapshot!(view);
854    }
855
856    #[test]
857    fn vttest_09_07() {
858        let stream = include_bytes!("../test/typescript/vttest_09_07.typescript");
859        let view = snapshot_typescript(stream);
860        insta::assert_snapshot!(view);
861    }
862
863    #[test]
864    fn vttest_09_08() {
865        let stream = include_bytes!("../test/typescript/vttest_09_08.typescript");
866        let view = snapshot_typescript(stream);
867        insta::assert_snapshot!(view);
868    }
869
870    #[test]
871    fn vttest_09_09() {
872        let stream = include_bytes!("../test/typescript/vttest_09_09.typescript");
873        let view = snapshot_typescript(stream);
874        insta::assert_snapshot!(view);
875    }
876
877    #[test]
878    fn vttest_11_05_01() {
879        let stream = include_bytes!("../test/typescript/vttest_11_05_01.typescript");
880        let view = snapshot_typescript(stream);
881        insta::assert_snapshot!(view);
882    }
883
884    #[test]
885    fn vttest_11_05_02() {
886        let stream = include_bytes!("../test/typescript/vttest_11_05_02.typescript");
887        let view = snapshot_typescript(stream);
888        insta::assert_snapshot!(view);
889    }
890
891    #[test]
892    fn vttest_11_05_03() {
893        let stream = include_bytes!("../test/typescript/vttest_11_05_03.typescript");
894        let view = snapshot_typescript(stream);
895        insta::assert_snapshot!(view);
896    }
897
898    #[test]
899    fn vttest_11_05_04() {
900        let stream = include_bytes!("../test/typescript/vttest_11_05_04.typescript");
901        let view = snapshot_typescript(stream);
902        insta::assert_snapshot!(view);
903    }
904
905    #[test]
906    fn vttest_11_05_05() {
907        let stream = include_bytes!("../test/typescript/vttest_11_05_05.typescript");
908        let view = snapshot_typescript(stream);
909        insta::assert_snapshot!(view);
910    }
911
912    #[test]
913    fn vttest_11_05_06() {
914        let stream = include_bytes!("../test/typescript/vttest_11_05_06.typescript");
915        let view = snapshot_typescript(stream);
916        insta::assert_snapshot!(view);
917    }
918
919    #[test]
920    fn vttest_11_05_07() {
921        let stream = include_bytes!("../test/typescript/vttest_11_05_07.typescript");
922        let view = snapshot_typescript(stream);
923        insta::assert_snapshot!(view);
924    }
925
926    #[test]
927    fn vttest_11_05_08() {
928        let stream = include_bytes!("../test/typescript/vttest_11_05_08.typescript");
929        let view = snapshot_typescript(stream);
930        insta::assert_snapshot!(view);
931    }
932
933    #[test]
934    fn vttest_11_05_09() {
935        let stream = include_bytes!("../test/typescript/vttest_11_05_09.typescript");
936        let view = snapshot_typescript(stream);
937        insta::assert_snapshot!(view);
938    }
939
940    #[test]
941    fn vttest_11_07_02() {
942        let stream = include_bytes!("../test/typescript/vttest_11_07_02.typescript");
943        let view = snapshot_typescript(stream);
944        insta::assert_snapshot!(view);
945    }
946}