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
13pub trait Screen {
18 type C: Cell;
20
21 fn cell(&self, row: u16, col: u16) -> Option<&Self::C>;
23 fn hide_cursor(&self) -> bool;
25 fn cursor_position(&self) -> (u16, u16);
29}
30
31pub trait Cell {
33 fn has_contents(&self) -> bool;
35 fn apply(&self, cell: &mut ratatui_core::buffer::Cell);
37}
38
39#[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 #[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 #[inline]
121 #[must_use]
122 pub const fn style(mut self, style: Style) -> Self {
123 self.style = style;
124 self
125 }
126
127 #[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 #[inline]
152 #[must_use]
153 pub const fn visibility(mut self, show: bool) -> Self {
154 self.show = show;
155 self
156 }
157
158 #[inline]
160 pub fn show(&mut self) {
161 self.show = true;
162 }
163
164 #[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}"), 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 #[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 #[inline]
228 #[must_use]
229 pub fn block(mut self, block: Block<'a>) -> Self {
230 self.block = Some(block);
231 self
232 }
233
234 #[inline]
254 #[must_use]
255 pub fn cursor(mut self, cursor: Cursor) -> Self {
256 self.cursor = cursor;
257 self
258 }
259
260 #[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 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"[3mThis line will be displayed in italic.[0m 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"[4mThis line will be displayed with an underline.[0m 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"[1mThis line will be displayed bold.[0m 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"[7mThis line will be displayed inversed.[0m 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"[4m[3mThis line will be displayed in italic and underlined.[0m 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}