@tomgiee/tsdp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/src/builder/media-builder.d.ts +221 -0
- package/dist/src/builder/media-builder.d.ts.map +1 -0
- package/dist/src/builder/media-builder.js +385 -0
- package/dist/src/builder/session-builder.d.ts +195 -0
- package/dist/src/builder/session-builder.d.ts.map +1 -0
- package/dist/src/builder/session-builder.js +366 -0
- package/dist/src/index.d.ts +67 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +250 -0
- package/dist/src/parser/attribute-parser.d.ts +100 -0
- package/dist/src/parser/attribute-parser.d.ts.map +1 -0
- package/dist/src/parser/attribute-parser.js +217 -0
- package/dist/src/parser/field-parser.d.ts +124 -0
- package/dist/src/parser/field-parser.d.ts.map +1 -0
- package/dist/src/parser/field-parser.js +335 -0
- package/dist/src/parser/media-parser.d.ts +45 -0
- package/dist/src/parser/media-parser.d.ts.map +1 -0
- package/dist/src/parser/media-parser.js +157 -0
- package/dist/src/parser/primitive-parser.d.ts +138 -0
- package/dist/src/parser/primitive-parser.d.ts.map +1 -0
- package/dist/src/parser/primitive-parser.js +316 -0
- package/dist/src/parser/scanner.d.ts +142 -0
- package/dist/src/parser/scanner.d.ts.map +1 -0
- package/dist/src/parser/scanner.js +284 -0
- package/dist/src/parser/session-parser.d.ts +35 -0
- package/dist/src/parser/session-parser.d.ts.map +1 -0
- package/dist/src/parser/session-parser.js +207 -0
- package/dist/src/parser/time-parser.d.ts +74 -0
- package/dist/src/parser/time-parser.d.ts.map +1 -0
- package/dist/src/parser/time-parser.js +168 -0
- package/dist/src/serializer/attribute-serializer.d.ts +18 -0
- package/dist/src/serializer/attribute-serializer.d.ts.map +1 -0
- package/dist/src/serializer/attribute-serializer.js +34 -0
- package/dist/src/serializer/field-serializer.d.ts +112 -0
- package/dist/src/serializer/field-serializer.d.ts.map +1 -0
- package/dist/src/serializer/field-serializer.js +212 -0
- package/dist/src/serializer/media-serializer.d.ts +31 -0
- package/dist/src/serializer/media-serializer.d.ts.map +1 -0
- package/dist/src/serializer/media-serializer.js +83 -0
- package/dist/src/serializer/session-serializer.d.ts +29 -0
- package/dist/src/serializer/session-serializer.d.ts.map +1 -0
- package/dist/src/serializer/session-serializer.js +99 -0
- package/dist/src/serializer/time-serializer.d.ts +46 -0
- package/dist/src/serializer/time-serializer.d.ts.map +1 -0
- package/dist/src/serializer/time-serializer.js +86 -0
- package/dist/src/types/attributes.d.ts +318 -0
- package/dist/src/types/attributes.d.ts.map +1 -0
- package/dist/src/types/attributes.js +225 -0
- package/dist/src/types/errors.d.ts +129 -0
- package/dist/src/types/errors.d.ts.map +1 -0
- package/dist/src/types/errors.js +186 -0
- package/dist/src/types/fields.d.ts +100 -0
- package/dist/src/types/fields.d.ts.map +1 -0
- package/dist/src/types/fields.js +48 -0
- package/dist/src/types/media.d.ts +148 -0
- package/dist/src/types/media.d.ts.map +1 -0
- package/dist/src/types/media.js +137 -0
- package/dist/src/types/network.d.ts +136 -0
- package/dist/src/types/network.d.ts.map +1 -0
- package/dist/src/types/network.js +130 -0
- package/dist/src/types/primitives.d.ts +193 -0
- package/dist/src/types/primitives.d.ts.map +1 -0
- package/dist/src/types/primitives.js +195 -0
- package/dist/src/types/session.d.ts +122 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +81 -0
- package/dist/src/types/time.d.ts +129 -0
- package/dist/src/types/time.d.ts.map +1 -0
- package/dist/src/types/time.js +84 -0
- package/dist/src/utils/address-parser.d.ts +100 -0
- package/dist/src/utils/address-parser.d.ts.map +1 -0
- package/dist/src/utils/address-parser.js +338 -0
- package/dist/src/utils/format-validators.d.ts +77 -0
- package/dist/src/utils/format-validators.d.ts.map +1 -0
- package/dist/src/utils/format-validators.js +504 -0
- package/dist/src/utils/line-reader.d.ts +84 -0
- package/dist/src/utils/line-reader.d.ts.map +1 -0
- package/dist/src/utils/line-reader.js +169 -0
- package/dist/src/utils/time-converter.d.ts +99 -0
- package/dist/src/utils/time-converter.d.ts.map +1 -0
- package/dist/src/utils/time-converter.js +195 -0
- package/dist/src/validator/media-validator.d.ts +27 -0
- package/dist/src/validator/media-validator.d.ts.map +1 -0
- package/dist/src/validator/media-validator.js +241 -0
- package/dist/src/validator/semantic-validator.d.ts +47 -0
- package/dist/src/validator/semantic-validator.d.ts.map +1 -0
- package/dist/src/validator/semantic-validator.js +207 -0
- package/dist/src/validator/session-validator.d.ts +36 -0
- package/dist/src/validator/session-validator.d.ts.map +1 -0
- package/dist/src/validator/session-validator.js +280 -0
- package/dist/tests/integration/round-trip.test.d.ts +5 -0
- package/dist/tests/integration/round-trip.test.d.ts.map +1 -0
- package/dist/tests/integration/round-trip.test.js +320 -0
- package/dist/tests/integration/voip-examples.test.d.ts +5 -0
- package/dist/tests/integration/voip-examples.test.d.ts.map +1 -0
- package/dist/tests/integration/voip-examples.test.js +361 -0
- package/dist/tests/unit/builder/media-builder.test.d.ts +5 -0
- package/dist/tests/unit/builder/media-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/builder/media-builder.test.js +524 -0
- package/dist/tests/unit/builder/session-builder.test.d.ts +5 -0
- package/dist/tests/unit/builder/session-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/builder/session-builder.test.js +367 -0
- package/dist/tests/unit/parser/attribute-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/attribute-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/attribute-parser.test.js +319 -0
- package/dist/tests/unit/parser/field-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/field-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/field-parser.test.js +355 -0
- package/dist/tests/unit/parser/media-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/media-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/media-parser.test.js +241 -0
- package/dist/tests/unit/parser/primitive-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/primitive-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/primitive-parser.test.js +261 -0
- package/dist/tests/unit/parser/scanner.test.d.ts +5 -0
- package/dist/tests/unit/parser/scanner.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/scanner.test.js +241 -0
- package/dist/tests/unit/parser/session-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/session-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/session-parser.test.js +346 -0
- package/dist/tests/unit/parser/time-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/time-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/time-parser.test.js +173 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.js +78 -0
- package/dist/tests/unit/serializer/field-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/field-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/field-serializer.test.js +159 -0
- package/dist/tests/unit/serializer/media-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/media-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/media-serializer.test.js +155 -0
- package/dist/tests/unit/serializer/session-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/session-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/session-serializer.test.js +317 -0
- package/dist/tests/unit/serializer/time-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/time-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/time-serializer.test.js +115 -0
- package/dist/tests/unit/types/errors.test.d.ts +5 -0
- package/dist/tests/unit/types/errors.test.d.ts.map +1 -0
- package/dist/tests/unit/types/errors.test.js +127 -0
- package/dist/tests/unit/types/network.test.d.ts +5 -0
- package/dist/tests/unit/types/network.test.d.ts.map +1 -0
- package/dist/tests/unit/types/network.test.js +132 -0
- package/dist/tests/unit/types/primitives.test.d.ts +5 -0
- package/dist/tests/unit/types/primitives.test.d.ts.map +1 -0
- package/dist/tests/unit/types/primitives.test.js +108 -0
- package/dist/tests/unit/utils/address-parser.test.d.ts +5 -0
- package/dist/tests/unit/utils/address-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/address-parser.test.js +203 -0
- package/dist/tests/unit/utils/format-validators.test.d.ts +5 -0
- package/dist/tests/unit/utils/format-validators.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/format-validators.test.js +224 -0
- package/dist/tests/unit/utils/line-reader.test.d.ts +5 -0
- package/dist/tests/unit/utils/line-reader.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/line-reader.test.js +157 -0
- package/dist/tests/unit/utils/time-converter.test.d.ts +5 -0
- package/dist/tests/unit/utils/time-converter.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/time-converter.test.js +190 -0
- package/dist/tests/unit/validator/media-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/media-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/media-validator.test.js +313 -0
- package/dist/tests/unit/validator/semantic-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/semantic-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/semantic-validator.test.js +262 -0
- package/dist/tests/unit/validator/session-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/session-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/session-validator.test.js +447 -0
- package/package.json +50 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for session-serializer.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const session_serializer_1 = require("../../../src/serializer/session-serializer");
|
|
7
|
+
const session_1 = require("../../../src/types/session");
|
|
8
|
+
const fields_1 = require("../../../src/types/fields");
|
|
9
|
+
const network_1 = require("../../../src/types/network");
|
|
10
|
+
const time_1 = require("../../../src/types/time");
|
|
11
|
+
const media_1 = require("../../../src/types/media");
|
|
12
|
+
const attributes_1 = require("../../../src/types/attributes");
|
|
13
|
+
const primitives_1 = require("../../../src/types/primitives");
|
|
14
|
+
describe('session-serializer', () => {
|
|
15
|
+
describe('serializeSessionDescription', () => {
|
|
16
|
+
it('should serialize minimal valid SDP', () => {
|
|
17
|
+
const session = (0, session_1.createSessionDescription)({
|
|
18
|
+
version: 0,
|
|
19
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
20
|
+
sessionName: 'SDP Seminar',
|
|
21
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
22
|
+
});
|
|
23
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
24
|
+
expect(sdp).toBe('v=0\r\n' +
|
|
25
|
+
'o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5\r\n' +
|
|
26
|
+
's=SDP Seminar\r\n' +
|
|
27
|
+
't=0 0\r\n');
|
|
28
|
+
});
|
|
29
|
+
it('should serialize SDP with session information', () => {
|
|
30
|
+
const session = (0, session_1.createSessionDescription)({
|
|
31
|
+
version: 0,
|
|
32
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
33
|
+
sessionName: 'SDP Seminar',
|
|
34
|
+
sessionInformation: 'A Seminar on the session description protocol',
|
|
35
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
36
|
+
});
|
|
37
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
38
|
+
expect(sdp).toContain('i=A Seminar on the session description protocol\r\n');
|
|
39
|
+
});
|
|
40
|
+
it('should serialize SDP with URI', () => {
|
|
41
|
+
const session = (0, session_1.createSessionDescription)({
|
|
42
|
+
version: 0,
|
|
43
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
44
|
+
sessionName: 'SDP Seminar',
|
|
45
|
+
uri: 'http://www.example.com/seminars/sdp.pdf',
|
|
46
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
47
|
+
});
|
|
48
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
49
|
+
expect(sdp).toContain('u=http://www.example.com/seminars/sdp.pdf\r\n');
|
|
50
|
+
});
|
|
51
|
+
it('should serialize SDP with emails and phones', () => {
|
|
52
|
+
const session = (0, session_1.createSessionDescription)({
|
|
53
|
+
version: 0,
|
|
54
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
55
|
+
sessionName: 'SDP Seminar',
|
|
56
|
+
emails: ['j.doe@example.com (Jane Doe)', 'jane@example.com'],
|
|
57
|
+
phones: ['+1 617 555-6011'],
|
|
58
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
59
|
+
});
|
|
60
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
61
|
+
expect(sdp).toContain('e=j.doe@example.com (Jane Doe)\r\n');
|
|
62
|
+
expect(sdp).toContain('e=jane@example.com\r\n');
|
|
63
|
+
expect(sdp).toContain('p=+1 617 555-6011\r\n');
|
|
64
|
+
});
|
|
65
|
+
it('should serialize SDP with connection', () => {
|
|
66
|
+
const session = (0, session_1.createSessionDescription)({
|
|
67
|
+
version: 0,
|
|
68
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
69
|
+
sessionName: 'SDP Seminar',
|
|
70
|
+
connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4MulticastAddress)((0, network_1.createIP4Address)('224.2.17.12'), 127)),
|
|
71
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
72
|
+
});
|
|
73
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
74
|
+
expect(sdp).toContain('c=IN IP4 224.2.17.12/127\r\n');
|
|
75
|
+
});
|
|
76
|
+
it('should serialize SDP with bandwidth', () => {
|
|
77
|
+
const session = (0, session_1.createSessionDescription)({
|
|
78
|
+
version: 0,
|
|
79
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
80
|
+
sessionName: 'SDP Seminar',
|
|
81
|
+
bandwidths: [(0, fields_1.createBandwidth)('AS', 128)],
|
|
82
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
83
|
+
});
|
|
84
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
85
|
+
expect(sdp).toContain('b=AS:128\r\n');
|
|
86
|
+
});
|
|
87
|
+
it('should serialize SDP with multiple time descriptions', () => {
|
|
88
|
+
const session = (0, session_1.createSessionDescription)({
|
|
89
|
+
version: 0,
|
|
90
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
91
|
+
sessionName: 'SDP Seminar',
|
|
92
|
+
timeDescriptions: [
|
|
93
|
+
(0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696)),
|
|
94
|
+
(0, time_1.createTimeDescription)((0, time_1.createTiming)(3034423619, 3042462419)),
|
|
95
|
+
],
|
|
96
|
+
});
|
|
97
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
98
|
+
expect(sdp).toContain('t=2873397496 2873404696\r\n');
|
|
99
|
+
expect(sdp).toContain('t=3034423619 3042462419\r\n');
|
|
100
|
+
});
|
|
101
|
+
it('should serialize SDP with repeat times', () => {
|
|
102
|
+
const session = (0, session_1.createSessionDescription)({
|
|
103
|
+
version: 0,
|
|
104
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
105
|
+
sessionName: 'SDP Seminar',
|
|
106
|
+
timeDescriptions: [
|
|
107
|
+
(0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [
|
|
108
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds'), (0, primitives_1.createTypedTime)(25, 'hours')]),
|
|
109
|
+
]),
|
|
110
|
+
],
|
|
111
|
+
});
|
|
112
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
113
|
+
expect(sdp).toContain('r=7d 1h 0 25h\r\n');
|
|
114
|
+
});
|
|
115
|
+
it('should serialize SDP with timezone adjustments', () => {
|
|
116
|
+
const session = (0, session_1.createSessionDescription)({
|
|
117
|
+
version: 0,
|
|
118
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
119
|
+
sessionName: 'SDP Seminar',
|
|
120
|
+
timeDescriptions: [
|
|
121
|
+
(0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [], (0, time_1.createTimezone)([
|
|
122
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'hours')),
|
|
123
|
+
(0, time_1.createTimezoneAdjustment)(2898848070, (0, primitives_1.createTypedTime)(0, 'seconds')),
|
|
124
|
+
])),
|
|
125
|
+
],
|
|
126
|
+
});
|
|
127
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
128
|
+
expect(sdp).toContain('z=2882844526 -1h 2898848070 0\r\n');
|
|
129
|
+
});
|
|
130
|
+
it('should serialize SDP with session-level key', () => {
|
|
131
|
+
const session = (0, session_1.createSessionDescription)({
|
|
132
|
+
version: 0,
|
|
133
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
134
|
+
sessionName: 'SDP Seminar',
|
|
135
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
136
|
+
key: 'clear:mypassword',
|
|
137
|
+
});
|
|
138
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
139
|
+
expect(sdp).toContain('k=clear:mypassword\r\n');
|
|
140
|
+
});
|
|
141
|
+
it('should serialize SDP with session-level attributes', () => {
|
|
142
|
+
const session = (0, session_1.createSessionDescription)({
|
|
143
|
+
version: 0,
|
|
144
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
145
|
+
sessionName: 'SDP Seminar',
|
|
146
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
147
|
+
attributes: [(0, attributes_1.createRecvonly)(), (0, attributes_1.createValueAttribute)('type', 'broadcast')],
|
|
148
|
+
});
|
|
149
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
150
|
+
expect(sdp).toContain('a=recvonly\r\n');
|
|
151
|
+
expect(sdp).toContain('a=type:broadcast\r\n');
|
|
152
|
+
});
|
|
153
|
+
it('should serialize SDP with single media description', () => {
|
|
154
|
+
const session = (0, session_1.createSessionDescription)({
|
|
155
|
+
version: 0,
|
|
156
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
157
|
+
sessionName: 'SDP Seminar',
|
|
158
|
+
connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4MulticastAddress)((0, network_1.createIP4Address)('224.2.17.12'), 127)),
|
|
159
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
160
|
+
mediaDescriptions: [
|
|
161
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0'])),
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
165
|
+
expect(sdp).toContain('m=audio 49170 RTP/AVP 0\r\n');
|
|
166
|
+
});
|
|
167
|
+
it('should serialize SDP with multiple media descriptions', () => {
|
|
168
|
+
const session = (0, session_1.createSessionDescription)({
|
|
169
|
+
version: 0,
|
|
170
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
171
|
+
sessionName: 'SDP Seminar',
|
|
172
|
+
connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4MulticastAddress)((0, network_1.createIP4Address)('224.2.17.12'), 127)),
|
|
173
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
174
|
+
mediaDescriptions: [
|
|
175
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0'])),
|
|
176
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['99'])),
|
|
177
|
+
],
|
|
178
|
+
});
|
|
179
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
180
|
+
expect(sdp).toContain('m=audio 49170 RTP/AVP 0\r\n');
|
|
181
|
+
expect(sdp).toContain('m=video 51372 RTP/AVP 99\r\n');
|
|
182
|
+
});
|
|
183
|
+
it('should serialize SDP with media-level fields', () => {
|
|
184
|
+
const session = (0, session_1.createSessionDescription)({
|
|
185
|
+
version: 0,
|
|
186
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
187
|
+
sessionName: 'SDP Seminar',
|
|
188
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
189
|
+
mediaDescriptions: [
|
|
190
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0', '8']), {
|
|
191
|
+
information: 'Audio Stream',
|
|
192
|
+
connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.100'))],
|
|
193
|
+
bandwidths: [(0, fields_1.createBandwidth)('AS', 64)],
|
|
194
|
+
attributes: [
|
|
195
|
+
(0, attributes_1.createRtpmap)(0, 'PCMU', 8000),
|
|
196
|
+
(0, attributes_1.createRtpmap)(8, 'PCMA', 8000),
|
|
197
|
+
(0, attributes_1.createPtime)(20),
|
|
198
|
+
(0, attributes_1.createSendrecv)(),
|
|
199
|
+
],
|
|
200
|
+
}),
|
|
201
|
+
],
|
|
202
|
+
});
|
|
203
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
204
|
+
expect(sdp).toContain('m=audio 49170 RTP/AVP 0 8\r\n');
|
|
205
|
+
expect(sdp).toContain('i=Audio Stream\r\n');
|
|
206
|
+
expect(sdp).toContain('c=IN IP4 192.168.1.100\r\n');
|
|
207
|
+
expect(sdp).toContain('b=AS:64\r\n');
|
|
208
|
+
expect(sdp).toContain('a=rtpmap:0 PCMU/8000\r\n');
|
|
209
|
+
expect(sdp).toContain('a=rtpmap:8 PCMA/8000\r\n');
|
|
210
|
+
expect(sdp).toContain('a=ptime:20\r\n');
|
|
211
|
+
expect(sdp).toContain('a=sendrecv\r\n');
|
|
212
|
+
});
|
|
213
|
+
it('should serialize complete SDP with all fields', () => {
|
|
214
|
+
const session = (0, session_1.createSessionDescription)({
|
|
215
|
+
version: 0,
|
|
216
|
+
origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
|
|
217
|
+
sessionName: 'SDP Seminar',
|
|
218
|
+
sessionInformation: 'A Seminar on the session description protocol',
|
|
219
|
+
uri: 'http://www.example.com/seminars/sdp.pdf',
|
|
220
|
+
emails: ['j.doe@example.com (Jane Doe)'],
|
|
221
|
+
phones: ['+1 617 555-6011'],
|
|
222
|
+
connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4MulticastAddress)((0, network_1.createIP4Address)('224.2.17.12'), 127)),
|
|
223
|
+
bandwidths: [(0, fields_1.createBandwidth)('AS', 128)],
|
|
224
|
+
timeDescriptions: [
|
|
225
|
+
(0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [
|
|
226
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds'), (0, primitives_1.createTypedTime)(25, 'hours')]),
|
|
227
|
+
], (0, time_1.createTimezone)([
|
|
228
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'hours')),
|
|
229
|
+
(0, time_1.createTimezoneAdjustment)(2898848070, (0, primitives_1.createTypedTime)(0, 'seconds')),
|
|
230
|
+
])),
|
|
231
|
+
],
|
|
232
|
+
key: 'clear:mypassword',
|
|
233
|
+
attributes: [(0, attributes_1.createRecvonly)(), (0, attributes_1.createValueAttribute)('type', 'broadcast')],
|
|
234
|
+
mediaDescriptions: [
|
|
235
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
236
|
+
information: 'Audio Stream',
|
|
237
|
+
connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.100'))],
|
|
238
|
+
bandwidths: [(0, fields_1.createBandwidth)('AS', 64)],
|
|
239
|
+
key: 'clear:mediakey',
|
|
240
|
+
attributes: [(0, attributes_1.createRtpmap)(0, 'PCMU', 8000), (0, attributes_1.createPtime)(20)],
|
|
241
|
+
}),
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
245
|
+
// Verify it starts with v= and ends with CRLF
|
|
246
|
+
expect(sdp.startsWith('v=0\r\n')).toBe(true);
|
|
247
|
+
expect(sdp.endsWith('\r\n')).toBe(true);
|
|
248
|
+
// Verify all major sections are present
|
|
249
|
+
expect(sdp).toContain('o=jdoe');
|
|
250
|
+
expect(sdp).toContain('s=SDP Seminar');
|
|
251
|
+
expect(sdp).toContain('i=A Seminar on the session description protocol');
|
|
252
|
+
expect(sdp).toContain('u=http://www.example.com/seminars/sdp.pdf');
|
|
253
|
+
expect(sdp).toContain('e=j.doe@example.com (Jane Doe)');
|
|
254
|
+
expect(sdp).toContain('p=+1 617 555-6011');
|
|
255
|
+
expect(sdp).toContain('c=IN IP4 224.2.17.12/127');
|
|
256
|
+
expect(sdp).toContain('b=AS:128');
|
|
257
|
+
expect(sdp).toContain('t=2873397496 2873404696');
|
|
258
|
+
expect(sdp).toContain('r=7d 1h 0 25h');
|
|
259
|
+
expect(sdp).toContain('z=2882844526 -1h 2898848070 0');
|
|
260
|
+
expect(sdp).toContain('k=clear:mypassword');
|
|
261
|
+
expect(sdp).toContain('a=recvonly');
|
|
262
|
+
expect(sdp).toContain('a=type:broadcast');
|
|
263
|
+
expect(sdp).toContain('m=audio 49170 RTP/AVP 0');
|
|
264
|
+
expect(sdp).toContain('i=Audio Stream');
|
|
265
|
+
expect(sdp).toContain('c=IN IP4 192.168.1.100');
|
|
266
|
+
expect(sdp).toContain('b=AS:64');
|
|
267
|
+
expect(sdp).toContain('k=clear:mediakey');
|
|
268
|
+
expect(sdp).toContain('a=rtpmap:0 PCMU/8000');
|
|
269
|
+
expect(sdp).toContain('a=ptime:20');
|
|
270
|
+
});
|
|
271
|
+
it('should use CRLF line endings', () => {
|
|
272
|
+
const session = (0, session_1.createSessionDescription)({
|
|
273
|
+
version: 0,
|
|
274
|
+
origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
|
|
275
|
+
sessionName: 'Test',
|
|
276
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
277
|
+
});
|
|
278
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
279
|
+
// Check that all lines end with CRLF, not just LF
|
|
280
|
+
const lines = sdp.split('\r\n');
|
|
281
|
+
expect(lines.length).toBeGreaterThan(1);
|
|
282
|
+
expect(sdp.includes('\n')).toBe(true); // Has newlines
|
|
283
|
+
expect(sdp.includes('\r\n')).toBe(true); // Has CRLF
|
|
284
|
+
expect(sdp.split('\n').every((line) => line === '' || line.endsWith('\r'))).toBe(true);
|
|
285
|
+
});
|
|
286
|
+
it('should serialize VoIP call SDP', () => {
|
|
287
|
+
const session = (0, session_1.createSessionDescription)({
|
|
288
|
+
version: 0,
|
|
289
|
+
origin: (0, fields_1.createOrigin)('-', '1234567890', '1234567890', 'IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.100')),
|
|
290
|
+
sessionName: 'VoIP Call',
|
|
291
|
+
timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
|
|
292
|
+
mediaDescriptions: [
|
|
293
|
+
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(10000), 'RTP/AVP', ['0', '8', '101']), {
|
|
294
|
+
connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.100'))],
|
|
295
|
+
attributes: [
|
|
296
|
+
(0, attributes_1.createRtpmap)(0, 'PCMU', 8000),
|
|
297
|
+
(0, attributes_1.createRtpmap)(8, 'PCMA', 8000),
|
|
298
|
+
(0, attributes_1.createRtpmap)(101, 'telephone-event', 8000),
|
|
299
|
+
(0, attributes_1.createFmtp)('101', '0-15'),
|
|
300
|
+
(0, attributes_1.createPtime)(20),
|
|
301
|
+
(0, attributes_1.createSendrecv)(),
|
|
302
|
+
],
|
|
303
|
+
}),
|
|
304
|
+
],
|
|
305
|
+
});
|
|
306
|
+
const sdp = (0, session_serializer_1.serializeSessionDescription)(session);
|
|
307
|
+
expect(sdp).toContain('s=VoIP Call');
|
|
308
|
+
expect(sdp).toContain('m=audio 10000 RTP/AVP 0 8 101');
|
|
309
|
+
expect(sdp).toContain('a=rtpmap:0 PCMU/8000');
|
|
310
|
+
expect(sdp).toContain('a=rtpmap:8 PCMA/8000');
|
|
311
|
+
expect(sdp).toContain('a=rtpmap:101 telephone-event/8000');
|
|
312
|
+
expect(sdp).toContain('a=fmtp:101 0-15');
|
|
313
|
+
expect(sdp).toContain('a=ptime:20');
|
|
314
|
+
expect(sdp).toContain('a=sendrecv');
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-serializer.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/serializer/time-serializer.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for time-serializer.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const time_serializer_1 = require("../../../src/serializer/time-serializer");
|
|
7
|
+
const time_1 = require("../../../src/types/time");
|
|
8
|
+
const primitives_1 = require("../../../src/types/primitives");
|
|
9
|
+
describe('time-serializer', () => {
|
|
10
|
+
describe('serializeTimingField', () => {
|
|
11
|
+
it('should serialize permanent timing (0 to 0)', () => {
|
|
12
|
+
const timing = (0, time_1.createTiming)(0, 0);
|
|
13
|
+
expect((0, time_serializer_1.serializeTimingField)(timing)).toBe('t=0 0');
|
|
14
|
+
});
|
|
15
|
+
it('should serialize bounded timing', () => {
|
|
16
|
+
const timing = (0, time_1.createTiming)(2873397496, 2873404696);
|
|
17
|
+
expect((0, time_serializer_1.serializeTimingField)(timing)).toBe('t=2873397496 2873404696');
|
|
18
|
+
});
|
|
19
|
+
it('should serialize open-ended session', () => {
|
|
20
|
+
const timing = (0, time_1.createTiming)(3724394400, 0);
|
|
21
|
+
expect((0, time_serializer_1.serializeTimingField)(timing)).toBe('t=3724394400 0');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('serializeRepeatField', () => {
|
|
25
|
+
it('should serialize repeat with days', () => {
|
|
26
|
+
const repeat = (0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds')]);
|
|
27
|
+
expect((0, time_serializer_1.serializeRepeatField)(repeat)).toBe('r=7d 1h 0');
|
|
28
|
+
});
|
|
29
|
+
it('should serialize repeat with multiple offsets', () => {
|
|
30
|
+
const repeat = (0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds'), (0, primitives_1.createTypedTime)(25, 'hours')]);
|
|
31
|
+
expect((0, time_serializer_1.serializeRepeatField)(repeat)).toBe('r=7d 1h 0 25h');
|
|
32
|
+
});
|
|
33
|
+
it('should serialize repeat with seconds (no suffix)', () => {
|
|
34
|
+
const repeat = (0, time_1.createRepeat)((0, primitives_1.createTypedTime)(604800, 'seconds'), (0, primitives_1.createTypedTime)(3600, 'seconds'), [(0, primitives_1.createTypedTime)(0, 'seconds'), (0, primitives_1.createTypedTime)(90000, 'seconds')]);
|
|
35
|
+
expect((0, time_serializer_1.serializeRepeatField)(repeat)).toBe('r=604800 3600 0 90000');
|
|
36
|
+
});
|
|
37
|
+
it('should serialize repeat with mixed units', () => {
|
|
38
|
+
const repeat = (0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(90, 'minutes'), [
|
|
39
|
+
(0, primitives_1.createTypedTime)(0, 'seconds'),
|
|
40
|
+
(0, primitives_1.createTypedTime)(1800, 'seconds'),
|
|
41
|
+
(0, primitives_1.createTypedTime)(25, 'hours'),
|
|
42
|
+
]);
|
|
43
|
+
expect((0, time_serializer_1.serializeRepeatField)(repeat)).toBe('r=7d 90m 0 1800 25h');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('serializeTimezoneField', () => {
|
|
47
|
+
it('should serialize single timezone adjustment', () => {
|
|
48
|
+
const timezone = (0, time_1.createTimezone)([
|
|
49
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'hours')),
|
|
50
|
+
]);
|
|
51
|
+
expect((0, time_serializer_1.serializeTimezoneField)(timezone)).toBe('z=2882844526 -1h');
|
|
52
|
+
});
|
|
53
|
+
it('should serialize multiple timezone adjustments', () => {
|
|
54
|
+
const timezone = (0, time_1.createTimezone)([
|
|
55
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'hours')),
|
|
56
|
+
(0, time_1.createTimezoneAdjustment)(2898848070, (0, primitives_1.createTypedTime)(0, 'seconds')),
|
|
57
|
+
]);
|
|
58
|
+
expect((0, time_serializer_1.serializeTimezoneField)(timezone)).toBe('z=2882844526 -1h 2898848070 0');
|
|
59
|
+
});
|
|
60
|
+
it('should serialize timezone with positive offset', () => {
|
|
61
|
+
const timezone = (0, time_1.createTimezone)([
|
|
62
|
+
(0, time_1.createTimezoneAdjustment)(3034423619, (0, primitives_1.createTypedTime)(1, 'hours')),
|
|
63
|
+
]);
|
|
64
|
+
expect((0, time_serializer_1.serializeTimezoneField)(timezone)).toBe('z=3034423619 1h');
|
|
65
|
+
});
|
|
66
|
+
it('should serialize timezone with days offset', () => {
|
|
67
|
+
const timezone = (0, time_1.createTimezone)([
|
|
68
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'days')),
|
|
69
|
+
(0, time_1.createTimezoneAdjustment)(2898848070, (0, primitives_1.createTypedTime)(1, 'days')),
|
|
70
|
+
]);
|
|
71
|
+
expect((0, time_serializer_1.serializeTimezoneField)(timezone)).toBe('z=2882844526 -1d 2898848070 1d');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('serializeTimeDescription', () => {
|
|
75
|
+
it('should serialize time description with timing only', () => {
|
|
76
|
+
const td = (0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0));
|
|
77
|
+
const lines = (0, time_serializer_1.serializeTimeDescription)(td);
|
|
78
|
+
expect(lines).toHaveLength(1);
|
|
79
|
+
expect(lines[0]).toBe('t=0 0');
|
|
80
|
+
});
|
|
81
|
+
it('should serialize time description with timing and repeats', () => {
|
|
82
|
+
const td = (0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [
|
|
83
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds')]),
|
|
84
|
+
]);
|
|
85
|
+
const lines = (0, time_serializer_1.serializeTimeDescription)(td);
|
|
86
|
+
expect(lines).toHaveLength(2);
|
|
87
|
+
expect(lines[0]).toBe('t=2873397496 2873404696');
|
|
88
|
+
expect(lines[1]).toBe('r=7d 1h 0');
|
|
89
|
+
});
|
|
90
|
+
it('should serialize time description with all fields', () => {
|
|
91
|
+
const td = (0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [
|
|
92
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds'), (0, primitives_1.createTypedTime)(25, 'hours')]),
|
|
93
|
+
], (0, time_1.createTimezone)([
|
|
94
|
+
(0, time_1.createTimezoneAdjustment)(2882844526, (0, primitives_1.createTypedTime)(-1, 'hours')),
|
|
95
|
+
(0, time_1.createTimezoneAdjustment)(2898848070, (0, primitives_1.createTypedTime)(0, 'seconds')),
|
|
96
|
+
]));
|
|
97
|
+
const lines = (0, time_serializer_1.serializeTimeDescription)(td);
|
|
98
|
+
expect(lines).toHaveLength(3);
|
|
99
|
+
expect(lines[0]).toBe('t=2873397496 2873404696');
|
|
100
|
+
expect(lines[1]).toBe('r=7d 1h 0 25h');
|
|
101
|
+
expect(lines[2]).toBe('z=2882844526 -1h 2898848070 0');
|
|
102
|
+
});
|
|
103
|
+
it('should serialize time description with multiple repeats', () => {
|
|
104
|
+
const td = (0, time_1.createTimeDescription)((0, time_1.createTiming)(2873397496, 2873404696), [
|
|
105
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(7, 'days'), (0, primitives_1.createTypedTime)(1, 'hours'), [(0, primitives_1.createTypedTime)(0, 'seconds')]),
|
|
106
|
+
(0, time_1.createRepeat)((0, primitives_1.createTypedTime)(1, 'days'), (0, primitives_1.createTypedTime)(30, 'minutes'), [(0, primitives_1.createTypedTime)(0, 'seconds')]),
|
|
107
|
+
]);
|
|
108
|
+
const lines = (0, time_serializer_1.serializeTimeDescription)(td);
|
|
109
|
+
expect(lines).toHaveLength(3);
|
|
110
|
+
expect(lines[0]).toBe('t=2873397496 2873404696');
|
|
111
|
+
expect(lines[1]).toBe('r=7d 1h 0');
|
|
112
|
+
expect(lines[2]).toBe('r=1d 30m 0');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/types/errors.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for errors.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const errors_1 = require("../../../src/types/errors");
|
|
7
|
+
describe('errors', () => {
|
|
8
|
+
describe('SdpError', () => {
|
|
9
|
+
it('should create base SDP error', () => {
|
|
10
|
+
const error = new errors_1.SdpError('Test error', 'TEST_ERROR');
|
|
11
|
+
expect(error.message).toBe('Test error');
|
|
12
|
+
expect(error.code).toBe('TEST_ERROR');
|
|
13
|
+
expect(error.name).toBe('SdpError');
|
|
14
|
+
expect(error).toBeInstanceOf(Error);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('ParseError', () => {
|
|
18
|
+
it('should create parse error with position', () => {
|
|
19
|
+
const error = new errors_1.ParseError('Unexpected character', 5, 10);
|
|
20
|
+
expect(error.message).toContain('line 5, column 10');
|
|
21
|
+
expect(error.message).toContain('Unexpected character');
|
|
22
|
+
expect(error.line).toBe(5);
|
|
23
|
+
expect(error.column).toBe(10);
|
|
24
|
+
expect(error.code).toBe('PARSE_ERROR');
|
|
25
|
+
expect(error.name).toBe('ParseError');
|
|
26
|
+
});
|
|
27
|
+
it('should create parse error with input', () => {
|
|
28
|
+
const error = new errors_1.ParseError('Invalid field', 1, 3, 'v=1\no=bad');
|
|
29
|
+
expect(error.input).toBe('v=1\no=bad');
|
|
30
|
+
});
|
|
31
|
+
it('should create from position object', () => {
|
|
32
|
+
const error = errors_1.ParseError.fromPosition('Test error', { offset: 42, line: 3, column: 7 }, 'some input');
|
|
33
|
+
expect(error.line).toBe(3);
|
|
34
|
+
expect(error.column).toBe(7);
|
|
35
|
+
expect(error.input).toBe('some input');
|
|
36
|
+
});
|
|
37
|
+
it('should format detailed message with context', () => {
|
|
38
|
+
const input = 'v=0\no=bad value\ns=test';
|
|
39
|
+
const error = new errors_1.ParseError('Invalid origin', 2, 3, input);
|
|
40
|
+
const detailed = error.getDetailedMessage();
|
|
41
|
+
expect(detailed).toContain('line 2, column 3');
|
|
42
|
+
expect(detailed).toContain('o=bad value');
|
|
43
|
+
expect(detailed).toContain('^');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('GrammarError', () => {
|
|
47
|
+
it('should create grammar error', () => {
|
|
48
|
+
const error = new errors_1.GrammarError('Field mismatch', 1, 1, 'version field', 'invalid field');
|
|
49
|
+
expect(error.message).toContain('expected: version field');
|
|
50
|
+
expect(error.message).toContain('found: invalid field');
|
|
51
|
+
expect(error.expected).toBe('version field');
|
|
52
|
+
expect(error.actual).toBe('invalid field');
|
|
53
|
+
expect(error.name).toBe('GrammarError');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('ValidationError', () => {
|
|
57
|
+
it('should create validation error', () => {
|
|
58
|
+
const error = new errors_1.ValidationError('Invalid value');
|
|
59
|
+
expect(error.message).toBe('Invalid value');
|
|
60
|
+
expect(error.code).toBe('VALIDATION_ERROR');
|
|
61
|
+
expect(error.name).toBe('ValidationError');
|
|
62
|
+
});
|
|
63
|
+
it('should create validation error with field', () => {
|
|
64
|
+
const error = new errors_1.ValidationError('Invalid value', 'origin');
|
|
65
|
+
expect(error.message).toContain("field 'origin'");
|
|
66
|
+
expect(error.field).toBe('origin');
|
|
67
|
+
});
|
|
68
|
+
it('should create validation error with constraint', () => {
|
|
69
|
+
const error = new errors_1.ValidationError('Must be 0', 'version', 'RFC8866:5.1');
|
|
70
|
+
expect(error.message).toContain('RFC8866:5.1');
|
|
71
|
+
expect(error.constraint).toBe('RFC8866:5.1');
|
|
72
|
+
});
|
|
73
|
+
it('should create missing field error', () => {
|
|
74
|
+
const error = errors_1.ValidationError.missingField('origin', 'RFC8866:5.2');
|
|
75
|
+
expect(error.message).toContain('Required field is missing');
|
|
76
|
+
expect(error.field).toBe('origin');
|
|
77
|
+
expect(error.constraint).toBe('RFC8866:5.2');
|
|
78
|
+
});
|
|
79
|
+
it('should create invalid value error', () => {
|
|
80
|
+
const error = errors_1.ValidationError.invalidValue('version', 1, 'must be 0');
|
|
81
|
+
expect(error.message).toContain('version');
|
|
82
|
+
expect(error.message).toContain('1');
|
|
83
|
+
expect(error.message).toContain('must be 0');
|
|
84
|
+
});
|
|
85
|
+
it('should create incorrect ordering error', () => {
|
|
86
|
+
const error = errors_1.ValidationError.incorrectOrdering('origin', 'version');
|
|
87
|
+
expect(error.message).toContain('origin');
|
|
88
|
+
expect(error.message).toContain('version');
|
|
89
|
+
});
|
|
90
|
+
it('should create constraint violation error', () => {
|
|
91
|
+
const error = errors_1.ValidationError.constraintViolation('Test constraint', 'RFC8866:5.0');
|
|
92
|
+
expect(error.message).toContain('Test constraint');
|
|
93
|
+
expect(error.constraint).toBe('RFC8866:5.0');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('SerializationError', () => {
|
|
97
|
+
it('should create serialization error', () => {
|
|
98
|
+
const error = new errors_1.SerializationError('Cannot serialize');
|
|
99
|
+
expect(error.message).toBe('Cannot serialize');
|
|
100
|
+
expect(error.code).toBe('SERIALIZATION_ERROR');
|
|
101
|
+
expect(error.name).toBe('SerializationError');
|
|
102
|
+
});
|
|
103
|
+
it('should create serialization error with field', () => {
|
|
104
|
+
const error = new errors_1.SerializationError('Invalid format', 'connection');
|
|
105
|
+
expect(error.message).toContain('connection');
|
|
106
|
+
expect(error.field).toBe('connection');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('BuilderError', () => {
|
|
110
|
+
it('should create builder error', () => {
|
|
111
|
+
const error = new errors_1.BuilderError('Build failed');
|
|
112
|
+
expect(error.message).toBe('Build failed');
|
|
113
|
+
expect(error.code).toBe('BUILDER_ERROR');
|
|
114
|
+
expect(error.name).toBe('BuilderError');
|
|
115
|
+
});
|
|
116
|
+
it('should create missing required error', () => {
|
|
117
|
+
const error = errors_1.BuilderError.missingRequired('origin');
|
|
118
|
+
expect(error.message).toContain('origin');
|
|
119
|
+
expect(error.message).toContain('has not been set');
|
|
120
|
+
});
|
|
121
|
+
it('should create invalid configuration error', () => {
|
|
122
|
+
const error = errors_1.BuilderError.invalidConfiguration('Cannot set both');
|
|
123
|
+
expect(error.message).toContain('Invalid configuration');
|
|
124
|
+
expect(error.message).toContain('Cannot set both');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/types/network.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|