@tomgiee/tsdp 1.0.1 → 1.1.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/README.md +0 -39
- package/dist/src/builder/media-builder.d.ts.map +1 -1
- package/dist/src/builder/media-builder.js +5 -12
- package/dist/src/builder/session-builder.d.ts.map +1 -1
- package/dist/src/builder/session-builder.js +4 -14
- package/dist/src/index.d.ts +6 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +37 -49
- package/dist/src/parser/core.d.ts +366 -0
- package/dist/src/parser/core.d.ts.map +1 -0
- package/dist/src/parser/core.js +802 -0
- package/dist/src/parser/field-parser.d.ts +51 -8
- package/dist/src/parser/field-parser.d.ts.map +1 -1
- package/dist/src/parser/field-parser.js +91 -23
- package/dist/src/parser/media-parser.d.ts +1 -1
- package/dist/src/parser/media-parser.d.ts.map +1 -1
- package/dist/src/parser/media-parser.js +9 -15
- package/dist/src/parser/session-parser.d.ts.map +1 -1
- package/dist/src/parser/session-parser.js +16 -17
- package/dist/src/parser/time-parser.d.ts +1 -1
- package/dist/src/parser/time-parser.d.ts.map +1 -1
- package/dist/src/parser/time-parser.js +8 -8
- package/dist/src/serializer/fields.d.ts +167 -0
- package/dist/src/serializer/fields.d.ts.map +1 -0
- package/dist/src/serializer/fields.js +320 -0
- package/dist/src/serializer/media-serializer.js +6 -7
- package/dist/src/serializer/session-serializer.js +13 -15
- package/dist/src/types/attributes.d.ts.map +1 -1
- package/dist/src/types/fields.d.ts +5 -5
- package/dist/src/types/fields.d.ts.map +1 -1
- package/dist/src/types/fields.js +4 -4
- package/dist/src/types/media.d.ts +9 -10
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js +2 -4
- package/dist/src/types/network.d.ts +15 -56
- package/dist/src/types/network.d.ts.map +1 -1
- package/dist/src/types/network.js +3 -34
- package/dist/src/types/primitives.d.ts +3 -147
- package/dist/src/types/primitives.d.ts.map +1 -1
- package/dist/src/types/primitives.js +2 -171
- package/dist/src/types/session.d.ts +14 -14
- package/dist/src/types/session.d.ts.map +1 -1
- package/dist/src/types/time.d.ts +4 -4
- package/dist/src/types/time.d.ts.map +1 -1
- package/dist/src/types/time.js +8 -6
- package/dist/src/utils/address-parser.d.ts +4 -4
- package/dist/src/utils/address-parser.d.ts.map +1 -1
- package/dist/src/utils/address-parser.js +9 -16
- package/dist/src/validator/validator.d.ts +94 -0
- package/dist/src/validator/validator.d.ts.map +1 -0
- package/dist/src/validator/validator.js +573 -0
- package/dist/tests/unit/parser/attribute-parser.test.js +106 -107
- package/dist/tests/unit/parser/field-parser.test.js +66 -66
- package/dist/tests/unit/parser/media-parser.test.js +38 -38
- package/dist/tests/unit/parser/primitive-parser.test.js +89 -90
- package/dist/tests/unit/parser/scanner.test.js +32 -32
- package/dist/tests/unit/parser/time-parser.test.js +22 -22
- package/dist/tests/unit/serializer/attribute-serializer.test.js +22 -22
- package/dist/tests/unit/serializer/field-serializer.test.js +57 -57
- package/dist/tests/unit/serializer/media-serializer.test.js +5 -6
- package/dist/tests/unit/serializer/session-serializer.test.js +24 -24
- package/dist/tests/unit/serializer/time-serializer.test.js +16 -16
- package/dist/tests/unit/types/network.test.js +21 -56
- package/dist/tests/unit/types/primitives.test.js +0 -39
- package/dist/tests/unit/validator/media-validator.test.js +34 -35
- package/dist/tests/unit/validator/semantic-validator.test.js +36 -37
- package/dist/tests/unit/validator/session-validator.test.js +54 -54
- package/package.json +1 -1
|
@@ -3,28 +3,28 @@
|
|
|
3
3
|
* Tests for scanner.ts
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const core_1 = require("../../../src/parser/core");
|
|
7
7
|
const errors_1 = require("../../../src/types/errors");
|
|
8
8
|
describe('Scanner', () => {
|
|
9
9
|
describe('basic operations', () => {
|
|
10
10
|
it('should peek at current character', () => {
|
|
11
|
-
const scanner = new
|
|
11
|
+
const scanner = new core_1.Scanner('abc');
|
|
12
12
|
expect(scanner.peek()).toBe('a');
|
|
13
13
|
expect(scanner.peek()).toBe('a'); // Peek doesn't advance
|
|
14
14
|
});
|
|
15
15
|
it('should return null when peeking at EOF', () => {
|
|
16
|
-
const scanner = new
|
|
16
|
+
const scanner = new core_1.Scanner('');
|
|
17
17
|
expect(scanner.peek()).toBeNull();
|
|
18
18
|
});
|
|
19
19
|
it('should advance through characters', () => {
|
|
20
|
-
const scanner = new
|
|
20
|
+
const scanner = new core_1.Scanner('abc');
|
|
21
21
|
expect(scanner.advance()).toBe('a');
|
|
22
22
|
expect(scanner.advance()).toBe('b');
|
|
23
23
|
expect(scanner.advance()).toBe('c');
|
|
24
24
|
expect(scanner.advance()).toBeNull();
|
|
25
25
|
});
|
|
26
26
|
it('should peek ahead', () => {
|
|
27
|
-
const scanner = new
|
|
27
|
+
const scanner = new core_1.Scanner('abcdef');
|
|
28
28
|
expect(scanner.peekAhead(0)).toBe('a');
|
|
29
29
|
expect(scanner.peekAhead(1)).toBe('b');
|
|
30
30
|
expect(scanner.peekAhead(5)).toBe('f');
|
|
@@ -33,7 +33,7 @@ describe('Scanner', () => {
|
|
|
33
33
|
});
|
|
34
34
|
describe('position tracking', () => {
|
|
35
35
|
it('should track line and column', () => {
|
|
36
|
-
const scanner = new
|
|
36
|
+
const scanner = new core_1.Scanner('abc\ndef');
|
|
37
37
|
const pos1 = scanner.getPosition();
|
|
38
38
|
expect(pos1.line).toBe(1);
|
|
39
39
|
expect(pos1.column).toBe(1);
|
|
@@ -51,7 +51,7 @@ describe('Scanner', () => {
|
|
|
51
51
|
expect(pos3.column).toBe(1);
|
|
52
52
|
});
|
|
53
53
|
it('should handle CRLF line endings', () => {
|
|
54
|
-
const scanner = new
|
|
54
|
+
const scanner = new core_1.Scanner('a\r\nb');
|
|
55
55
|
scanner.advance(); // 'a'
|
|
56
56
|
scanner.advance(); // '\r\n'
|
|
57
57
|
const pos = scanner.getPosition();
|
|
@@ -60,7 +60,7 @@ describe('Scanner', () => {
|
|
|
60
60
|
expect(scanner.peek()).toBe('b');
|
|
61
61
|
});
|
|
62
62
|
it('should handle CR line endings', () => {
|
|
63
|
-
const scanner = new
|
|
63
|
+
const scanner = new core_1.Scanner('a\rb');
|
|
64
64
|
scanner.advance(); // 'a'
|
|
65
65
|
scanner.advance(); // '\r'
|
|
66
66
|
const pos = scanner.getPosition();
|
|
@@ -69,7 +69,7 @@ describe('Scanner', () => {
|
|
|
69
69
|
expect(scanner.peek()).toBe('b');
|
|
70
70
|
});
|
|
71
71
|
it('should handle LF line endings', () => {
|
|
72
|
-
const scanner = new
|
|
72
|
+
const scanner = new core_1.Scanner('a\nb');
|
|
73
73
|
scanner.advance(); // 'a'
|
|
74
74
|
scanner.advance(); // '\n'
|
|
75
75
|
const pos = scanner.getPosition();
|
|
@@ -80,19 +80,19 @@ describe('Scanner', () => {
|
|
|
80
80
|
});
|
|
81
81
|
describe('readUntil', () => {
|
|
82
82
|
it('should read until string delimiter', () => {
|
|
83
|
-
const scanner = new
|
|
83
|
+
const scanner = new core_1.Scanner('hello world');
|
|
84
84
|
const result = scanner.readUntil(' ');
|
|
85
85
|
expect(result).toBe('hello');
|
|
86
86
|
expect(scanner.peek()).toBe(' ');
|
|
87
87
|
});
|
|
88
88
|
it('should read until regex delimiter', () => {
|
|
89
|
-
const scanner = new
|
|
89
|
+
const scanner = new core_1.Scanner('abc123def');
|
|
90
90
|
const result = scanner.readUntil(/\d/);
|
|
91
91
|
expect(result).toBe('abc');
|
|
92
92
|
expect(scanner.peek()).toBe('1');
|
|
93
93
|
});
|
|
94
94
|
it('should read entire input if delimiter not found', () => {
|
|
95
|
-
const scanner = new
|
|
95
|
+
const scanner = new core_1.Scanner('hello');
|
|
96
96
|
const result = scanner.readUntil('x');
|
|
97
97
|
expect(result).toBe('hello');
|
|
98
98
|
expect(scanner.isEOF()).toBe(true);
|
|
@@ -100,13 +100,13 @@ describe('Scanner', () => {
|
|
|
100
100
|
});
|
|
101
101
|
describe('readWhile', () => {
|
|
102
102
|
it('should read while predicate is true', () => {
|
|
103
|
-
const scanner = new
|
|
103
|
+
const scanner = new core_1.Scanner('12345abc');
|
|
104
104
|
const result = scanner.readWhile(ch => ch >= '0' && ch <= '9');
|
|
105
105
|
expect(result).toBe('12345');
|
|
106
106
|
expect(scanner.peek()).toBe('a');
|
|
107
107
|
});
|
|
108
108
|
it('should return empty string if predicate immediately false', () => {
|
|
109
|
-
const scanner = new
|
|
109
|
+
const scanner = new core_1.Scanner('abc');
|
|
110
110
|
const result = scanner.readWhile(ch => ch >= '0' && ch <= '9');
|
|
111
111
|
expect(result).toBe('');
|
|
112
112
|
expect(scanner.peek()).toBe('a');
|
|
@@ -114,17 +114,17 @@ describe('Scanner', () => {
|
|
|
114
114
|
});
|
|
115
115
|
describe('whitespace handling', () => {
|
|
116
116
|
it('should skip spaces and tabs', () => {
|
|
117
|
-
const scanner = new
|
|
117
|
+
const scanner = new core_1.Scanner(' \t abc');
|
|
118
118
|
scanner.skipWhitespace();
|
|
119
119
|
expect(scanner.peek()).toBe('a');
|
|
120
120
|
});
|
|
121
121
|
it('should not skip newlines', () => {
|
|
122
|
-
const scanner = new
|
|
122
|
+
const scanner = new core_1.Scanner(' \n abc');
|
|
123
123
|
scanner.skipWhitespace();
|
|
124
124
|
expect(scanner.peek()).toBe('\n');
|
|
125
125
|
});
|
|
126
126
|
it('should skip to next line', () => {
|
|
127
|
-
const scanner = new
|
|
127
|
+
const scanner = new core_1.Scanner('hello world\nnext line');
|
|
128
128
|
scanner.skipToNextLine();
|
|
129
129
|
expect(scanner.peek()).toBe('n');
|
|
130
130
|
const pos = scanner.getPosition();
|
|
@@ -133,39 +133,39 @@ describe('Scanner', () => {
|
|
|
133
133
|
});
|
|
134
134
|
describe('expect methods', () => {
|
|
135
135
|
it('should expect exact string', () => {
|
|
136
|
-
const scanner = new
|
|
136
|
+
const scanner = new core_1.Scanner('v=0');
|
|
137
137
|
scanner.expect('v=');
|
|
138
138
|
expect(scanner.peek()).toBe('0');
|
|
139
139
|
});
|
|
140
140
|
it('should throw if string not matched', () => {
|
|
141
|
-
const scanner = new
|
|
141
|
+
const scanner = new core_1.Scanner('o=test');
|
|
142
142
|
expect(() => scanner.expect('v=')).toThrow(errors_1.ParseError);
|
|
143
143
|
});
|
|
144
144
|
it('should throw if string extends past EOF', () => {
|
|
145
|
-
const scanner = new
|
|
145
|
+
const scanner = new core_1.Scanner('v');
|
|
146
146
|
expect(() => scanner.expect('v=')).toThrow(errors_1.ParseError);
|
|
147
147
|
});
|
|
148
148
|
it('should expect character with predicate', () => {
|
|
149
|
-
const scanner = new
|
|
149
|
+
const scanner = new core_1.Scanner('a123');
|
|
150
150
|
const ch = scanner.expectChar(c => c >= 'a' && c <= 'z', 'lowercase letter');
|
|
151
151
|
expect(ch).toBe('a');
|
|
152
152
|
expect(scanner.peek()).toBe('1');
|
|
153
153
|
});
|
|
154
154
|
it('should throw if character does not match predicate', () => {
|
|
155
|
-
const scanner = new
|
|
155
|
+
const scanner = new core_1.Scanner('123');
|
|
156
156
|
expect(() => scanner.expectChar(c => c >= 'a' && c <= 'z', 'lowercase letter')).toThrow(errors_1.ParseError);
|
|
157
157
|
});
|
|
158
158
|
it('should expect space', () => {
|
|
159
|
-
const scanner = new
|
|
159
|
+
const scanner = new core_1.Scanner(' abc');
|
|
160
160
|
scanner.expectSpace();
|
|
161
161
|
expect(scanner.peek()).toBe('a');
|
|
162
162
|
});
|
|
163
163
|
it('should throw if not space', () => {
|
|
164
|
-
const scanner = new
|
|
164
|
+
const scanner = new core_1.Scanner('abc');
|
|
165
165
|
expect(() => scanner.expectSpace()).toThrow(errors_1.ParseError);
|
|
166
166
|
});
|
|
167
167
|
it('should expect end of line (CRLF)', () => {
|
|
168
|
-
const scanner = new
|
|
168
|
+
const scanner = new core_1.Scanner('test\r\nnext');
|
|
169
169
|
scanner.advance();
|
|
170
170
|
scanner.advance();
|
|
171
171
|
scanner.advance();
|
|
@@ -174,7 +174,7 @@ describe('Scanner', () => {
|
|
|
174
174
|
expect(scanner.peek()).toBe('n');
|
|
175
175
|
});
|
|
176
176
|
it('should expect end of line (LF)', () => {
|
|
177
|
-
const scanner = new
|
|
177
|
+
const scanner = new core_1.Scanner('test\nnext');
|
|
178
178
|
scanner.advance();
|
|
179
179
|
scanner.advance();
|
|
180
180
|
scanner.advance();
|
|
@@ -183,7 +183,7 @@ describe('Scanner', () => {
|
|
|
183
183
|
expect(scanner.peek()).toBe('n');
|
|
184
184
|
});
|
|
185
185
|
it('should accept EOF as EOL', () => {
|
|
186
|
-
const scanner = new
|
|
186
|
+
const scanner = new core_1.Scanner('test');
|
|
187
187
|
scanner.advance();
|
|
188
188
|
scanner.advance();
|
|
189
189
|
scanner.advance();
|
|
@@ -191,13 +191,13 @@ describe('Scanner', () => {
|
|
|
191
191
|
scanner.expectEOL(); // Should not throw at EOF
|
|
192
192
|
});
|
|
193
193
|
it('should throw if not at EOL', () => {
|
|
194
|
-
const scanner = new
|
|
194
|
+
const scanner = new core_1.Scanner('test');
|
|
195
195
|
expect(() => scanner.expectEOL()).toThrow(errors_1.ParseError);
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
198
|
describe('utility methods', () => {
|
|
199
199
|
it('should check if at EOF', () => {
|
|
200
|
-
const scanner = new
|
|
200
|
+
const scanner = new core_1.Scanner('ab');
|
|
201
201
|
expect(scanner.isEOF()).toBe(false);
|
|
202
202
|
scanner.advance();
|
|
203
203
|
expect(scanner.isEOF()).toBe(false);
|
|
@@ -205,13 +205,13 @@ describe('Scanner', () => {
|
|
|
205
205
|
expect(scanner.isEOF()).toBe(true);
|
|
206
206
|
});
|
|
207
207
|
it('should get remaining input', () => {
|
|
208
|
-
const scanner = new
|
|
208
|
+
const scanner = new core_1.Scanner('hello world');
|
|
209
209
|
scanner.advance();
|
|
210
210
|
scanner.advance();
|
|
211
211
|
expect(scanner.getRemainingInput()).toBe('llo world');
|
|
212
212
|
});
|
|
213
213
|
it('should get substring', () => {
|
|
214
|
-
const scanner = new
|
|
214
|
+
const scanner = new core_1.Scanner('hello world');
|
|
215
215
|
scanner.advance();
|
|
216
216
|
scanner.advance();
|
|
217
217
|
scanner.advance();
|
|
@@ -221,7 +221,7 @@ describe('Scanner', () => {
|
|
|
221
221
|
});
|
|
222
222
|
describe('error context', () => {
|
|
223
223
|
it('should provide context in error messages', () => {
|
|
224
|
-
const scanner = new
|
|
224
|
+
const scanner = new core_1.Scanner('v=0\no=test 123 456 IN IP4 192.168.1.1\ns=Session');
|
|
225
225
|
scanner.advance();
|
|
226
226
|
scanner.advance();
|
|
227
227
|
scanner.advance();
|
|
@@ -3,46 +3,46 @@
|
|
|
3
3
|
* Tests for time-parser.ts
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const core_1 = require("../../../src/parser/core");
|
|
7
7
|
const time_parser_1 = require("../../../src/parser/time-parser");
|
|
8
8
|
const errors_1 = require("../../../src/types/errors");
|
|
9
9
|
const time_1 = require("../../../src/types/time");
|
|
10
10
|
describe('time-parser', () => {
|
|
11
11
|
describe('parseTimingField', () => {
|
|
12
12
|
it('should parse permanent timing (0 to 0)', () => {
|
|
13
|
-
const scanner = new
|
|
13
|
+
const scanner = new core_1.Scanner('0 0');
|
|
14
14
|
const timing = (0, time_parser_1.parseTimingField)(scanner);
|
|
15
15
|
expect(timing.startTime).toBe(0);
|
|
16
16
|
expect(timing.stopTime).toBe(0);
|
|
17
17
|
});
|
|
18
18
|
it('should parse bounded timing', () => {
|
|
19
|
-
const scanner = new
|
|
19
|
+
const scanner = new core_1.Scanner('2873397496 2873404696');
|
|
20
20
|
const timing = (0, time_parser_1.parseTimingField)(scanner);
|
|
21
21
|
expect(timing.startTime).toBe(2873397496);
|
|
22
22
|
expect(timing.stopTime).toBe(2873404696);
|
|
23
23
|
});
|
|
24
24
|
it('should parse open-ended session (0 stop time)', () => {
|
|
25
|
-
const scanner = new
|
|
25
|
+
const scanner = new core_1.Scanner('3724394400 0');
|
|
26
26
|
const timing = (0, time_parser_1.parseTimingField)(scanner);
|
|
27
27
|
expect(timing.startTime).toBe(3724394400);
|
|
28
28
|
expect(timing.stopTime).toBe(0);
|
|
29
29
|
});
|
|
30
30
|
it('should throw for missing stop time', () => {
|
|
31
|
-
const scanner = new
|
|
31
|
+
const scanner = new core_1.Scanner('123456');
|
|
32
32
|
expect(() => (0, time_parser_1.parseTimingField)(scanner)).toThrow(errors_1.ParseError);
|
|
33
33
|
});
|
|
34
34
|
it('should throw for negative start time', () => {
|
|
35
|
-
const scanner = new
|
|
35
|
+
const scanner = new core_1.Scanner('-1 0');
|
|
36
36
|
expect(() => (0, time_parser_1.parseTimingField)(scanner)).toThrow(errors_1.ParseError);
|
|
37
37
|
});
|
|
38
38
|
it('should throw when start > stop (both non-zero)', () => {
|
|
39
|
-
expect(() => (0, time_parser_1.parseTimingField)(new
|
|
40
|
-
expect(() => (0, time_parser_1.parseTimingField)(new
|
|
39
|
+
expect(() => (0, time_parser_1.parseTimingField)(new core_1.Scanner('2000 1000'))).toThrow(errors_1.ParseError);
|
|
40
|
+
expect(() => (0, time_parser_1.parseTimingField)(new core_1.Scanner('2000 1000'))).toThrow('Start time must be before');
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
43
|
describe('parseRepeatField', () => {
|
|
44
44
|
it('should parse repeat with single offset', () => {
|
|
45
|
-
const scanner = new
|
|
45
|
+
const scanner = new core_1.Scanner('7d 1h 0');
|
|
46
46
|
const repeat = (0, time_parser_1.parseRepeatField)(scanner);
|
|
47
47
|
expect(repeat.interval).toEqual({ value: 7, unit: 'days' });
|
|
48
48
|
expect(repeat.duration).toEqual({ value: 1, unit: 'hours' });
|
|
@@ -50,7 +50,7 @@ describe('time-parser', () => {
|
|
|
50
50
|
expect(repeat.offsets[0]).toEqual({ value: 0, unit: 'seconds' });
|
|
51
51
|
});
|
|
52
52
|
it('should parse repeat with multiple offsets', () => {
|
|
53
|
-
const scanner = new
|
|
53
|
+
const scanner = new core_1.Scanner('7d 1h 0 25h');
|
|
54
54
|
const repeat = (0, time_parser_1.parseRepeatField)(scanner);
|
|
55
55
|
expect(repeat.interval).toEqual({ value: 7, unit: 'days' });
|
|
56
56
|
expect(repeat.duration).toEqual({ value: 1, unit: 'hours' });
|
|
@@ -59,14 +59,14 @@ describe('time-parser', () => {
|
|
|
59
59
|
expect(repeat.offsets[1]).toEqual({ value: 25, unit: 'hours' });
|
|
60
60
|
});
|
|
61
61
|
it('should parse repeat with seconds (no suffix)', () => {
|
|
62
|
-
const scanner = new
|
|
62
|
+
const scanner = new core_1.Scanner('604800 3600 0 90000');
|
|
63
63
|
const repeat = (0, time_parser_1.parseRepeatField)(scanner);
|
|
64
64
|
expect(repeat.interval).toEqual({ value: 604800, unit: 'seconds' });
|
|
65
65
|
expect(repeat.duration).toEqual({ value: 3600, unit: 'seconds' });
|
|
66
66
|
expect(repeat.offsets).toHaveLength(2);
|
|
67
67
|
});
|
|
68
68
|
it('should parse repeat with mixed units', () => {
|
|
69
|
-
const scanner = new
|
|
69
|
+
const scanner = new core_1.Scanner('7d 90m 0 1800 25h');
|
|
70
70
|
const repeat = (0, time_parser_1.parseRepeatField)(scanner);
|
|
71
71
|
expect(repeat.interval).toEqual({ value: 7, unit: 'days' });
|
|
72
72
|
expect(repeat.duration).toEqual({ value: 90, unit: 'minutes' });
|
|
@@ -76,24 +76,24 @@ describe('time-parser', () => {
|
|
|
76
76
|
expect(repeat.offsets[2]).toEqual({ value: 25, unit: 'hours' });
|
|
77
77
|
});
|
|
78
78
|
it('should throw for missing duration', () => {
|
|
79
|
-
const scanner = new
|
|
79
|
+
const scanner = new core_1.Scanner('7d');
|
|
80
80
|
expect(() => (0, time_parser_1.parseRepeatField)(scanner)).toThrow(errors_1.ParseError);
|
|
81
81
|
});
|
|
82
82
|
it('should throw for missing offsets', () => {
|
|
83
|
-
expect(() => (0, time_parser_1.parseRepeatField)(new
|
|
84
|
-
expect(() => (0, time_parser_1.parseRepeatField)(new
|
|
83
|
+
expect(() => (0, time_parser_1.parseRepeatField)(new core_1.Scanner('7d 1h'))).toThrow(errors_1.ParseError);
|
|
84
|
+
expect(() => (0, time_parser_1.parseRepeatField)(new core_1.Scanner('7d 1h'))).toThrow('at least one offset');
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
87
|
describe('parseTimezoneField', () => {
|
|
88
88
|
it('should parse single timezone adjustment', () => {
|
|
89
|
-
const scanner = new
|
|
89
|
+
const scanner = new core_1.Scanner('2882844526 -1h');
|
|
90
90
|
const timezone = (0, time_parser_1.parseTimezoneField)(scanner);
|
|
91
91
|
expect(timezone.adjustments).toHaveLength(1);
|
|
92
92
|
expect(timezone.adjustments[0].time).toBe(2882844526);
|
|
93
93
|
expect(timezone.adjustments[0].offset).toEqual({ value: -1, unit: 'hours' });
|
|
94
94
|
});
|
|
95
95
|
it('should parse multiple timezone adjustments', () => {
|
|
96
|
-
const scanner = new
|
|
96
|
+
const scanner = new core_1.Scanner('2882844526 -1h 2898848070 0');
|
|
97
97
|
const timezone = (0, time_parser_1.parseTimezoneField)(scanner);
|
|
98
98
|
expect(timezone.adjustments).toHaveLength(2);
|
|
99
99
|
expect(timezone.adjustments[0].time).toBe(2882844526);
|
|
@@ -102,29 +102,29 @@ describe('time-parser', () => {
|
|
|
102
102
|
expect(timezone.adjustments[1].offset).toEqual({ value: 0, unit: 'seconds' });
|
|
103
103
|
});
|
|
104
104
|
it('should parse timezone with positive offset', () => {
|
|
105
|
-
const scanner = new
|
|
105
|
+
const scanner = new core_1.Scanner('3034423619 1h');
|
|
106
106
|
const timezone = (0, time_parser_1.parseTimezoneField)(scanner);
|
|
107
107
|
expect(timezone.adjustments).toHaveLength(1);
|
|
108
108
|
expect(timezone.adjustments[0].offset).toEqual({ value: 1, unit: 'hours' });
|
|
109
109
|
});
|
|
110
110
|
it('should parse timezone with seconds offset', () => {
|
|
111
|
-
const scanner = new
|
|
111
|
+
const scanner = new core_1.Scanner('2882844526 -3600');
|
|
112
112
|
const timezone = (0, time_parser_1.parseTimezoneField)(scanner);
|
|
113
113
|
expect(timezone.adjustments[0].offset).toEqual({ value: -3600, unit: 'seconds' });
|
|
114
114
|
});
|
|
115
115
|
it('should parse timezone with days offset', () => {
|
|
116
|
-
const scanner = new
|
|
116
|
+
const scanner = new core_1.Scanner('2882844526 -1d 2898848070 1d');
|
|
117
117
|
const timezone = (0, time_parser_1.parseTimezoneField)(scanner);
|
|
118
118
|
expect(timezone.adjustments).toHaveLength(2);
|
|
119
119
|
expect(timezone.adjustments[0].offset).toEqual({ value: -1, unit: 'days' });
|
|
120
120
|
expect(timezone.adjustments[1].offset).toEqual({ value: 1, unit: 'days' });
|
|
121
121
|
});
|
|
122
122
|
it('should throw for missing offset', () => {
|
|
123
|
-
const scanner = new
|
|
123
|
+
const scanner = new core_1.Scanner('2882844526');
|
|
124
124
|
expect(() => (0, time_parser_1.parseTimezoneField)(scanner)).toThrow(errors_1.ParseError);
|
|
125
125
|
});
|
|
126
126
|
it('should throw for empty timezone field', () => {
|
|
127
|
-
const scanner = new
|
|
127
|
+
const scanner = new core_1.Scanner('');
|
|
128
128
|
expect(() => (0, time_parser_1.parseTimezoneField)(scanner)).toThrow(errors_1.ParseError);
|
|
129
129
|
expect(() => (0, time_parser_1.parseTimezoneField)(scanner)).toThrow('at least one adjustment');
|
|
130
130
|
});
|
|
@@ -3,75 +3,75 @@
|
|
|
3
3
|
* Tests for attribute-serializer.ts
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const fields_1 = require("../../../src/serializer/fields");
|
|
7
7
|
const attributes_1 = require("../../../src/types/attributes");
|
|
8
8
|
describe('attribute-serializer', () => {
|
|
9
9
|
describe('serializeAttributeField', () => {
|
|
10
10
|
describe('property attributes', () => {
|
|
11
11
|
it('should serialize recvonly attribute', () => {
|
|
12
|
-
expect((0,
|
|
12
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createRecvonly)())).toBe('a=recvonly');
|
|
13
13
|
});
|
|
14
14
|
it('should serialize sendrecv attribute', () => {
|
|
15
|
-
expect((0,
|
|
15
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createSendrecv)())).toBe('a=sendrecv');
|
|
16
16
|
});
|
|
17
17
|
it('should serialize sendonly attribute', () => {
|
|
18
|
-
expect((0,
|
|
18
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createSendonly)())).toBe('a=sendonly');
|
|
19
19
|
});
|
|
20
20
|
it('should serialize inactive attribute', () => {
|
|
21
|
-
expect((0,
|
|
21
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createInactive)())).toBe('a=inactive');
|
|
22
22
|
});
|
|
23
23
|
it('should serialize custom property attribute', () => {
|
|
24
|
-
expect((0,
|
|
24
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createPropertyAttribute)('myattr'))).toBe('a=myattr');
|
|
25
25
|
});
|
|
26
26
|
});
|
|
27
27
|
describe('value attributes', () => {
|
|
28
28
|
it('should serialize rtpmap attribute', () => {
|
|
29
|
-
expect((0,
|
|
29
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createRtpmap)(0, 'PCMU', 8000))).toBe('a=rtpmap:0 PCMU/8000');
|
|
30
30
|
});
|
|
31
31
|
it('should serialize rtpmap with encoding params', () => {
|
|
32
|
-
expect((0,
|
|
32
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createRtpmap)(97, 'L16', 8000, 2))).toBe('a=rtpmap:97 L16/8000/2');
|
|
33
33
|
});
|
|
34
34
|
it('should serialize fmtp attribute', () => {
|
|
35
|
-
expect((0,
|
|
35
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createFmtp)('96', 'profile-level-id=42e01f'))).toBe('a=fmtp:96 profile-level-id=42e01f');
|
|
36
36
|
});
|
|
37
37
|
it('should serialize ptime attribute', () => {
|
|
38
|
-
expect((0,
|
|
38
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createPtime)(20))).toBe('a=ptime:20');
|
|
39
39
|
});
|
|
40
40
|
it('should serialize maxptime attribute', () => {
|
|
41
|
-
expect((0,
|
|
41
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createMaxptime)(150))).toBe('a=maxptime:150');
|
|
42
42
|
});
|
|
43
43
|
it('should serialize custom value attribute', () => {
|
|
44
|
-
expect((0,
|
|
44
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('customattr', 'customvalue'))).toBe('a=customattr:customvalue');
|
|
45
45
|
});
|
|
46
46
|
it('should serialize value with colons', () => {
|
|
47
|
-
expect((0,
|
|
47
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('candidate', '1 1 UDP 2130706431 192.168.1.1 8998 typ host'))).toBe('a=candidate:1 1 UDP 2130706431 192.168.1.1 8998 typ host');
|
|
48
48
|
});
|
|
49
49
|
it('should serialize cat attribute', () => {
|
|
50
|
-
expect((0,
|
|
50
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('cat', 'conference'))).toBe('a=cat:conference');
|
|
51
51
|
});
|
|
52
52
|
it('should serialize tool attribute', () => {
|
|
53
|
-
expect((0,
|
|
53
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('tool', 'my-sdp-tool v1.0'))).toBe('a=tool:my-sdp-tool v1.0');
|
|
54
54
|
});
|
|
55
55
|
it('should serialize orient attribute', () => {
|
|
56
|
-
expect((0,
|
|
56
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('orient', 'landscape'))).toBe('a=orient:landscape');
|
|
57
57
|
});
|
|
58
58
|
it('should serialize type attribute', () => {
|
|
59
|
-
expect((0,
|
|
59
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('type', 'broadcast'))).toBe('a=type:broadcast');
|
|
60
60
|
});
|
|
61
61
|
it('should serialize charset attribute', () => {
|
|
62
|
-
expect((0,
|
|
62
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('charset', 'UTF-8'))).toBe('a=charset:UTF-8');
|
|
63
63
|
});
|
|
64
64
|
it('should serialize sdplang attribute', () => {
|
|
65
|
-
expect((0,
|
|
65
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('sdplang', 'en-US'))).toBe('a=sdplang:en-US');
|
|
66
66
|
});
|
|
67
67
|
it('should serialize lang attribute', () => {
|
|
68
|
-
expect((0,
|
|
68
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('lang', 'fr'))).toBe('a=lang:fr');
|
|
69
69
|
});
|
|
70
70
|
it('should serialize framerate attribute', () => {
|
|
71
|
-
expect((0,
|
|
71
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('framerate', '29.97'))).toBe('a=framerate:29.97');
|
|
72
72
|
});
|
|
73
73
|
it('should serialize quality attribute', () => {
|
|
74
|
-
expect((0,
|
|
74
|
+
expect((0, fields_1.serializeAttributeField)((0, attributes_1.createValueAttribute)('quality', '8'))).toBe('a=quality:8');
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
77
|
});
|