@@ -19,6 +19,7 @@ import {
1919 EventType ,
2020 ExtensibleEvent ,
2121 ExtensibleEvents ,
22+ InvalidEventError ,
2223 IPartialEvent ,
2324 IPartialLegacyContent ,
2425 M_EMOTE ,
@@ -44,10 +45,15 @@ import {
4445} from "../src" ;
4546
4647describe ( "ExtensibleEvents" , ( ) => {
47- // Note: we don't test the other static functions because it should be pretty
48- // obvious when they fail. We'll just make sure that the static accessor works.
49- it ( "should return an instance by default" , ( ) => {
50- expect ( ExtensibleEvents . defaultInstance ) . toBeDefined ( ) ;
48+ afterEach ( ( ) => {
49+ // gutwrench the default instance into something safe/new to "reset" it
50+ ( < any > ExtensibleEvents ) . _defaultInstance = new ExtensibleEvents ( ) ;
51+ } ) ;
52+
53+ describe ( "static api" , ( ) => {
54+ it ( "should return an instance by default" , ( ) => {
55+ expect ( ExtensibleEvents . defaultInstance ) . toBeDefined ( ) ;
56+ } ) ;
5157 } ) ;
5258
5359 describe ( "unknown events" , ( ) => {
@@ -84,6 +90,23 @@ describe("ExtensibleEvents", () => {
8490 const event = new ExtensibleEvents ( ) . parse ( input ) ;
8591 expect ( event ) . toBeFalsy ( ) ;
8692 } ) ;
93+
94+ describe ( "static api" , ( ) => {
95+ afterEach ( ( ) => {
96+ ExtensibleEvents . unknownInterpretOrder = new ExtensibleEvents ( ) . unknownInterpretOrder ;
97+ } ) ;
98+
99+ it ( "should persist the unknown interpret order" , ( ) => {
100+ expect ( ExtensibleEvents . unknownInterpretOrder . length ) . toBeGreaterThan ( 0 ) ;
101+
102+ const testValue1 = new UnstableValue ( null , "org.matrix.example.feature1" ) ;
103+ const testValue2 = new UnstableValue ( null , "org.matrix.example.feature2" ) ;
104+ const array = [ testValue1 , testValue2 ] ;
105+ ExtensibleEvents . unknownInterpretOrder = array ;
106+
107+ expect ( ExtensibleEvents . unknownInterpretOrder ) . toBe ( array ) ;
108+ } ) ;
109+ } ) ;
87110 } ) ;
88111
89112 describe ( "custom events" , ( ) => {
@@ -149,6 +172,25 @@ describe("ExtensibleEvents", () => {
149172 expect ( event ) . toBeDefined ( ) ;
150173 expect ( event instanceof MyCustomEvent ) . toBe ( true ) ;
151174 } ) ;
175+
176+ describe ( "static api" , ( ) => {
177+ it ( "should support custom interpreters" , ( ) => {
178+ const input : IPartialEvent < any > = {
179+ type : myNamespace . name ,
180+ content : {
181+ hello : "world" ,
182+ } ,
183+ } ;
184+
185+ let event = ExtensibleEvents . parse ( input ) ;
186+ expect ( event ) . toBeFalsy ( ) ;
187+
188+ ExtensibleEvents . registerInterpreter ( myNamespace , myInterpreter ) ;
189+ event = ExtensibleEvents . parse ( input ) ;
190+ expect ( event ) . toBeDefined ( ) ;
191+ expect ( event instanceof MyCustomEvent ) . toBe ( true ) ;
192+ } ) ;
193+ } ) ;
152194 } ) ;
153195
154196 describe ( "known events" , ( ) => {
@@ -278,4 +320,54 @@ describe("ExtensibleEvents", () => {
278320 expect ( poll instanceof PollEndEvent ) . toBe ( true ) ;
279321 } ) ;
280322 } ) ;
323+
324+ describe ( "parse errors" , ( ) => {
325+ function myForcedInvalidInterpreter ( wireEvent : IPartialEvent < any > ) : ExtensibleEvent {
326+ throw new InvalidEventError ( "deliberate throw of invalid type" ) ;
327+ }
328+
329+ function myExplodingInterpreter ( wireEvent : IPartialEvent < any > ) : ExtensibleEvent {
330+ throw new Error ( "deliberate throw" ) ;
331+ }
332+
333+ it ( "should return null when InvalidEventError is raised" , ( ) => {
334+ const extev = new ExtensibleEvents ( ) ;
335+ const namespace = new UnstableValue ( null , "org.matrix.example" ) ;
336+ extev . registerInterpreter ( namespace , myForcedInvalidInterpreter ) ;
337+ const result = extev . parse ( { type : namespace . name , content : { unused : true } } ) ;
338+ expect ( result ) . toBeNull ( ) ;
339+ } ) ;
340+
341+ it ( "should return null when no known parser is found" , ( ) => {
342+ const extev = new ExtensibleEvents ( ) ;
343+ const namespace = new UnstableValue ( null , "org.matrix.example" ) ;
344+ const result = extev . parse ( { type : namespace . name , content : { unused : true } } ) ;
345+ expect ( result ) . toBeNull ( ) ;
346+ } ) ;
347+
348+ it ( "should throw if the parser throws an unknown error" , ( ) => {
349+ const extev = new ExtensibleEvents ( ) ;
350+ const namespace = new UnstableValue ( null , "org.matrix.example" ) ;
351+ extev . registerInterpreter ( namespace , myExplodingInterpreter ) ;
352+ expect ( ( ) => extev . parse ( { type : namespace . name , content : { unused : true } } ) ) . toThrow ( "deliberate throw" ) ;
353+ } ) ;
354+
355+ it ( "should throw if the parser throws an unknown error during unknown interpret order" , ( ) => {
356+ const extev = new ExtensibleEvents ( ) ;
357+ const namespace = new UnstableValue ( null , "org.matrix.example" ) ;
358+ const namespace2 = new UnstableValue ( null , "org.matrix.example2" ) ;
359+ extev . registerInterpreter ( namespace , myExplodingInterpreter ) ;
360+ extev . unknownInterpretOrder = [ namespace ] ;
361+ expect ( ( ) => extev . parse ( { type : namespace2 . name , content : { unused : true } } ) ) . toThrow ( "deliberate throw" ) ;
362+ } ) ;
363+
364+ describe ( "static api" , ( ) => {
365+ it ( "should return null when InvalidEventError is raised" , ( ) => {
366+ const namespace = new UnstableValue ( null , "org.matrix.example" ) ;
367+ ExtensibleEvents . registerInterpreter ( namespace , myForcedInvalidInterpreter ) ;
368+ const result = ExtensibleEvents . parse ( { type : namespace . name , content : { unused : true } } ) ;
369+ expect ( result ) . toBeNull ( ) ;
370+ } ) ;
371+ } ) ;
372+ } ) ;
281373} ) ;
0 commit comments