@@ -23,4 +23,80 @@ Deno.test("Event", async (t) => {
23
23
} ) ;
24
24
assertEquals ( dispatchedEvents , [ ] ) ;
25
25
} ) ;
26
+
27
+ await t . step ( "multiple consumers receive all events in order" , ( ) => {
28
+ dispatch ( { type : "vim-cmdline-changed" , cmdline : "test1" } ) ;
29
+ dispatch ( { type : "vim-cmdpos-changed" , cmdpos : 5 } ) ;
30
+ dispatch ( { type : "vim-cmdline-changed" , cmdline : "test2" } ) ;
31
+
32
+ const results : Event [ ] [ ] = [ ] ;
33
+ consume ( ( event ) => {
34
+ if ( ! results [ 0 ] ) results [ 0 ] = [ ] ;
35
+ results [ 0 ] . push ( event ) ;
36
+ } ) ;
37
+
38
+ assertEquals ( results [ 0 ] , [
39
+ { type : "vim-cmdline-changed" , cmdline : "test1" } ,
40
+ { type : "vim-cmdpos-changed" , cmdpos : 5 } ,
41
+ { type : "vim-cmdline-changed" , cmdline : "test2" } ,
42
+ ] ) ;
43
+ } ) ;
44
+
45
+ await t . step ( "handles large number of events" , ( ) => {
46
+ const eventCount = 10000 ;
47
+ for ( let i = 0 ; i < eventCount ; i ++ ) {
48
+ dispatch ( { type : "vim-cmdpos-changed" , cmdpos : i } ) ;
49
+ }
50
+
51
+ let receivedCount = 0 ;
52
+ consume ( ( event ) => {
53
+ assertEquals ( event . type , "vim-cmdpos-changed" ) ;
54
+ receivedCount ++ ;
55
+ } ) ;
56
+
57
+ assertEquals ( receivedCount , eventCount ) ;
58
+ } ) ;
59
+
60
+ await t . step ( "events are cleared after consume" , ( ) => {
61
+ dispatch ( { type : "vim-cmdline-changed" , cmdline : "test" } ) ;
62
+
63
+ let firstConsumeCount = 0 ;
64
+ consume ( ( ) => {
65
+ firstConsumeCount ++ ;
66
+ } ) ;
67
+ assertEquals ( firstConsumeCount , 1 ) ;
68
+
69
+ let secondConsumeCount = 0 ;
70
+ consume ( ( ) => {
71
+ secondConsumeCount ++ ;
72
+ } ) ;
73
+ assertEquals ( secondConsumeCount , 0 ) ;
74
+ } ) ;
75
+
76
+ await t . step ( "handles events dispatched during consume" , ( ) => {
77
+ dispatch ( { type : "vim-cmdline-changed" , cmdline : "initial" } ) ;
78
+
79
+ const events : Event [ ] = [ ] ;
80
+ consume ( ( event ) => {
81
+ events . push ( event ) ;
82
+ if ( event . type === "vim-cmdline-changed" && event . cmdline === "initial" ) {
83
+ // This dispatch happens during consume - should not be consumed in this cycle
84
+ dispatch ( { type : "vim-cmdpos-changed" , cmdpos : 42 } ) ;
85
+ }
86
+ } ) ;
87
+
88
+ assertEquals ( events , [
89
+ { type : "vim-cmdline-changed" , cmdline : "initial" } ,
90
+ ] ) ;
91
+
92
+ // The event dispatched during consume should be available in next consume
93
+ const nextEvents : Event [ ] = [ ] ;
94
+ consume ( ( event ) => {
95
+ nextEvents . push ( event ) ;
96
+ } ) ;
97
+
98
+ assertEquals ( nextEvents , [
99
+ { type : "vim-cmdpos-changed" , cmdpos : 42 } ,
100
+ ] ) ;
101
+ } ) ;
26
102
} ) ;
0 commit comments