@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,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for network.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const network_1 = require("../../../src/types/network");
|
|
7
|
+
describe('network', () => {
|
|
8
|
+
describe('createIP4Address', () => {
|
|
9
|
+
it('should create IPv4 address', () => {
|
|
10
|
+
const addr = (0, network_1.createIP4Address)('192.168.1.1');
|
|
11
|
+
expect(addr).toBe('192.168.1.1');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
describe('createIP6Address', () => {
|
|
15
|
+
it('should create IPv6 address', () => {
|
|
16
|
+
const addr = (0, network_1.createIP6Address)('2001:db8::1');
|
|
17
|
+
expect(addr).toBe('2001:db8::1');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('createFQDN', () => {
|
|
21
|
+
it('should create FQDN', () => {
|
|
22
|
+
const fqdn = (0, network_1.createFQDN)('example.com');
|
|
23
|
+
expect(fqdn).toBe('example.com');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('createIP4MulticastAddress', () => {
|
|
27
|
+
it('should create IPv4 multicast address', () => {
|
|
28
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
29
|
+
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
30
|
+
expect(multicast.kind).toBe('ip4-multicast');
|
|
31
|
+
expect(multicast.address).toBe('224.0.1.1');
|
|
32
|
+
expect(multicast.ttl).toBe(127);
|
|
33
|
+
expect(multicast.numAddresses).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it('should create IPv4 multicast with numAddresses', () => {
|
|
36
|
+
const addr = (0, network_1.createIP4Address)('239.255.255.255');
|
|
37
|
+
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 32, 3);
|
|
38
|
+
expect(multicast.kind).toBe('ip4-multicast');
|
|
39
|
+
expect(multicast.address).toBe('239.255.255.255');
|
|
40
|
+
expect(multicast.ttl).toBe(32);
|
|
41
|
+
expect(multicast.numAddresses).toBe(3);
|
|
42
|
+
});
|
|
43
|
+
it('should throw for invalid TTL', () => {
|
|
44
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
45
|
+
expect(() => (0, network_1.createIP4MulticastAddress)(addr, -1)).toThrow('Invalid TTL');
|
|
46
|
+
expect(() => (0, network_1.createIP4MulticastAddress)(addr, 256)).toThrow('Invalid TTL');
|
|
47
|
+
});
|
|
48
|
+
it('should throw for invalid numAddresses', () => {
|
|
49
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
50
|
+
expect(() => (0, network_1.createIP4MulticastAddress)(addr, 127, 0)).toThrow('Invalid numAddresses');
|
|
51
|
+
expect(() => (0, network_1.createIP4MulticastAddress)(addr, 127, -1)).toThrow('Invalid numAddresses');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('createIP6MulticastAddress', () => {
|
|
55
|
+
it('should create IPv6 multicast address', () => {
|
|
56
|
+
const addr = (0, network_1.createIP6Address)('FF02::1');
|
|
57
|
+
const multicast = (0, network_1.createIP6MulticastAddress)(addr);
|
|
58
|
+
expect(multicast.kind).toBe('ip6-multicast');
|
|
59
|
+
expect(multicast.address).toBe('FF02::1');
|
|
60
|
+
expect(multicast.numAddresses).toBeUndefined();
|
|
61
|
+
});
|
|
62
|
+
it('should create IPv6 multicast with numAddresses', () => {
|
|
63
|
+
const addr = (0, network_1.createIP6Address)('FF05::2');
|
|
64
|
+
const multicast = (0, network_1.createIP6MulticastAddress)(addr, 5);
|
|
65
|
+
expect(multicast.kind).toBe('ip6-multicast');
|
|
66
|
+
expect(multicast.address).toBe('FF05::2');
|
|
67
|
+
expect(multicast.numAddresses).toBe(5);
|
|
68
|
+
});
|
|
69
|
+
it('should throw for invalid numAddresses', () => {
|
|
70
|
+
const addr = (0, network_1.createIP6Address)('FF02::1');
|
|
71
|
+
expect(() => (0, network_1.createIP6MulticastAddress)(addr, 0)).toThrow('Invalid numAddresses');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('createFQDNMulticastAddress', () => {
|
|
75
|
+
it('should create FQDN multicast address', () => {
|
|
76
|
+
const fqdn = (0, network_1.createFQDN)('multicast.example.com');
|
|
77
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn);
|
|
78
|
+
expect(multicast.kind).toBe('fqdn-multicast');
|
|
79
|
+
expect(multicast.address).toBe('multicast.example.com');
|
|
80
|
+
expect(multicast.ttl).toBeUndefined();
|
|
81
|
+
expect(multicast.numAddresses).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
it('should create FQDN multicast with TTL and numAddresses', () => {
|
|
84
|
+
const fqdn = (0, network_1.createFQDN)('multicast.example.com');
|
|
85
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn, 64, 2);
|
|
86
|
+
expect(multicast.kind).toBe('fqdn-multicast');
|
|
87
|
+
expect(multicast.address).toBe('multicast.example.com');
|
|
88
|
+
expect(multicast.ttl).toBe(64);
|
|
89
|
+
expect(multicast.numAddresses).toBe(2);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('type guards', () => {
|
|
93
|
+
it('isMulticastAddress should detect multicast', () => {
|
|
94
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
95
|
+
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
96
|
+
expect((0, network_1.isMulticastAddress)(multicast)).toBe(true);
|
|
97
|
+
const unicast = (0, network_1.createIP4Address)('192.168.1.1');
|
|
98
|
+
expect((0, network_1.isMulticastAddress)(unicast)).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('isUnicastAddress should detect unicast', () => {
|
|
101
|
+
const unicast = (0, network_1.createIP4Address)('192.168.1.1');
|
|
102
|
+
expect((0, network_1.isUnicastAddress)(unicast)).toBe(true);
|
|
103
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
104
|
+
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
105
|
+
expect((0, network_1.isUnicastAddress)(multicast)).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
it('isIP4MulticastAddress should detect IPv4 multicast', () => {
|
|
108
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
109
|
+
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
110
|
+
expect((0, network_1.isIP4MulticastAddress)(multicast)).toBe(true);
|
|
111
|
+
const addr6 = (0, network_1.createIP6Address)('FF02::1');
|
|
112
|
+
const multicast6 = (0, network_1.createIP6MulticastAddress)(addr6);
|
|
113
|
+
expect((0, network_1.isIP4MulticastAddress)(multicast6)).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
it('isIP6MulticastAddress should detect IPv6 multicast', () => {
|
|
116
|
+
const addr = (0, network_1.createIP6Address)('FF02::1');
|
|
117
|
+
const multicast = (0, network_1.createIP6MulticastAddress)(addr);
|
|
118
|
+
expect((0, network_1.isIP6MulticastAddress)(multicast)).toBe(true);
|
|
119
|
+
const addr4 = (0, network_1.createIP4Address)('224.0.1.1');
|
|
120
|
+
const multicast4 = (0, network_1.createIP4MulticastAddress)(addr4, 127);
|
|
121
|
+
expect((0, network_1.isIP6MulticastAddress)(multicast4)).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
it('isFQDNMulticastAddress should detect FQDN multicast', () => {
|
|
124
|
+
const fqdn = (0, network_1.createFQDN)('multicast.example.com');
|
|
125
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn);
|
|
126
|
+
expect((0, network_1.isFQDNMulticastAddress)(multicast)).toBe(true);
|
|
127
|
+
const addr = (0, network_1.createIP4Address)('224.0.1.1');
|
|
128
|
+
const multicast4 = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
129
|
+
expect((0, network_1.isFQDNMulticastAddress)(multicast4)).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/types/primitives.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for primitives.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const primitives_1 = require("../../../src/types/primitives");
|
|
7
|
+
describe('primitives', () => {
|
|
8
|
+
describe('createVersion', () => {
|
|
9
|
+
it('should create version 0', () => {
|
|
10
|
+
const version = (0, primitives_1.createVersion)(0);
|
|
11
|
+
expect(version).toBe(0);
|
|
12
|
+
});
|
|
13
|
+
it('should throw for non-zero version', () => {
|
|
14
|
+
expect(() => (0, primitives_1.createVersion)(1)).toThrow('Invalid SDP version');
|
|
15
|
+
expect(() => (0, primitives_1.createVersion)(2)).toThrow('Invalid SDP version');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('createSessionName', () => {
|
|
19
|
+
it('should create valid session name', () => {
|
|
20
|
+
const name = (0, primitives_1.createSessionName)('My Session');
|
|
21
|
+
expect(name).toBe('My Session');
|
|
22
|
+
});
|
|
23
|
+
it('should throw for empty session name', () => {
|
|
24
|
+
expect(() => (0, primitives_1.createSessionName)('')).toThrow('Session name cannot be empty');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('createUsername', () => {
|
|
28
|
+
it('should create valid username', () => {
|
|
29
|
+
const username = (0, primitives_1.createUsername)('jdoe');
|
|
30
|
+
expect(username).toBe('jdoe');
|
|
31
|
+
});
|
|
32
|
+
it('should throw for empty username', () => {
|
|
33
|
+
expect(() => (0, primitives_1.createUsername)('')).toThrow('Username cannot be empty');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('createNtpTime', () => {
|
|
37
|
+
it('should create valid NTP time', () => {
|
|
38
|
+
const time = (0, primitives_1.createNtpTime)(0);
|
|
39
|
+
expect(time).toBe(0);
|
|
40
|
+
const time2 = (0, primitives_1.createNtpTime)(3724394400);
|
|
41
|
+
expect(time2).toBe(3724394400);
|
|
42
|
+
});
|
|
43
|
+
it('should throw for negative time', () => {
|
|
44
|
+
expect(() => (0, primitives_1.createNtpTime)(-1)).toThrow('NTP time cannot be negative');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('createTypedTime', () => {
|
|
48
|
+
it('should create typed time with seconds', () => {
|
|
49
|
+
const time = (0, primitives_1.createTypedTime)(3600, 'seconds');
|
|
50
|
+
expect(time.value).toBe(3600);
|
|
51
|
+
expect(time.unit).toBe('seconds');
|
|
52
|
+
});
|
|
53
|
+
it('should create typed time with minutes', () => {
|
|
54
|
+
const time = (0, primitives_1.createTypedTime)(60, 'minutes');
|
|
55
|
+
expect(time.value).toBe(60);
|
|
56
|
+
expect(time.unit).toBe('minutes');
|
|
57
|
+
});
|
|
58
|
+
it('should create typed time with hours', () => {
|
|
59
|
+
const time = (0, primitives_1.createTypedTime)(24, 'hours');
|
|
60
|
+
expect(time.value).toBe(24);
|
|
61
|
+
expect(time.unit).toBe('hours');
|
|
62
|
+
});
|
|
63
|
+
it('should create typed time with days', () => {
|
|
64
|
+
const time = (0, primitives_1.createTypedTime)(7, 'days');
|
|
65
|
+
expect(time.value).toBe(7);
|
|
66
|
+
expect(time.unit).toBe('days');
|
|
67
|
+
});
|
|
68
|
+
it('should create negative typed time (for timezone offsets)', () => {
|
|
69
|
+
const time = (0, primitives_1.createTypedTime)(-1, 'hours');
|
|
70
|
+
expect(time.value).toBe(-1);
|
|
71
|
+
expect(time.unit).toBe('hours');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('isNumericString', () => {
|
|
75
|
+
it('should return true for valid numeric strings (RFC 8866 1*DIGIT)', () => {
|
|
76
|
+
expect((0, primitives_1.isNumericString)('0')).toBe(true);
|
|
77
|
+
expect((0, primitives_1.isNumericString)('123')).toBe(true);
|
|
78
|
+
expect((0, primitives_1.isNumericString)('2890844526')).toBe(true);
|
|
79
|
+
expect((0, primitives_1.isNumericString)('9876543210')).toBe(true);
|
|
80
|
+
expect((0, primitives_1.isNumericString)('00123')).toBe(true); // Leading zeros are valid digits
|
|
81
|
+
});
|
|
82
|
+
it('should return false for empty string', () => {
|
|
83
|
+
expect((0, primitives_1.isNumericString)('')).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('should return false for strings with non-digit characters', () => {
|
|
86
|
+
expect((0, primitives_1.isNumericString)('abc')).toBe(false);
|
|
87
|
+
expect((0, primitives_1.isNumericString)('123abc')).toBe(false);
|
|
88
|
+
expect((0, primitives_1.isNumericString)('abc123')).toBe(false);
|
|
89
|
+
expect((0, primitives_1.isNumericString)('12a34')).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it('should return false for strings with spaces', () => {
|
|
92
|
+
expect((0, primitives_1.isNumericString)(' 123')).toBe(false);
|
|
93
|
+
expect((0, primitives_1.isNumericString)('123 ')).toBe(false);
|
|
94
|
+
expect((0, primitives_1.isNumericString)('12 34')).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
it('should return false for strings with special characters', () => {
|
|
97
|
+
expect((0, primitives_1.isNumericString)('-123')).toBe(false); // Negative sign
|
|
98
|
+
expect((0, primitives_1.isNumericString)('+123')).toBe(false); // Plus sign
|
|
99
|
+
expect((0, primitives_1.isNumericString)('123.456')).toBe(false); // Decimal point
|
|
100
|
+
expect((0, primitives_1.isNumericString)('1,234')).toBe(false); // Comma
|
|
101
|
+
expect((0, primitives_1.isNumericString)('1e10')).toBe(false); // Scientific notation
|
|
102
|
+
});
|
|
103
|
+
it('should return false for strings with unicode digits', () => {
|
|
104
|
+
// Only ASCII digits 0-9 are valid per RFC 8866
|
|
105
|
+
expect((0, primitives_1.isNumericString)('١٢٣')).toBe(false); // Arabic numerals
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-parser.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/utils/address-parser.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for address-parser.ts
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const address_parser_1 = require("../../../src/utils/address-parser");
|
|
7
|
+
describe('address-parser', () => {
|
|
8
|
+
describe('IPv4 validation', () => {
|
|
9
|
+
describe('isIP4Address', () => {
|
|
10
|
+
it('should validate valid IPv4 addresses', () => {
|
|
11
|
+
expect((0, address_parser_1.isIP4Address)('0.0.0.0')).toBe(true);
|
|
12
|
+
expect((0, address_parser_1.isIP4Address)('192.168.1.1')).toBe(true);
|
|
13
|
+
expect((0, address_parser_1.isIP4Address)('10.0.0.1')).toBe(true);
|
|
14
|
+
expect((0, address_parser_1.isIP4Address)('172.16.0.1')).toBe(true);
|
|
15
|
+
expect((0, address_parser_1.isIP4Address)('198.51.100.1')).toBe(true);
|
|
16
|
+
expect((0, address_parser_1.isIP4Address)('255.255.255.255')).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it('should reject invalid IPv4 addresses', () => {
|
|
19
|
+
expect((0, address_parser_1.isIP4Address)('256.1.1.1')).toBe(false);
|
|
20
|
+
expect((0, address_parser_1.isIP4Address)('192.168.1')).toBe(false);
|
|
21
|
+
expect((0, address_parser_1.isIP4Address)('192.168.1.1.1')).toBe(false);
|
|
22
|
+
expect((0, address_parser_1.isIP4Address)('192.168.-1.1')).toBe(false);
|
|
23
|
+
expect((0, address_parser_1.isIP4Address)('192.168.1.256')).toBe(false);
|
|
24
|
+
expect((0, address_parser_1.isIP4Address)('abc.def.ghi.jkl')).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it('should reject leading zeros', () => {
|
|
27
|
+
expect((0, address_parser_1.isIP4Address)('192.168.01.1')).toBe(false);
|
|
28
|
+
expect((0, address_parser_1.isIP4Address)('192.168.001.1')).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
it('should accept single zero', () => {
|
|
31
|
+
expect((0, address_parser_1.isIP4Address)('0.0.0.0')).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('isIP4MulticastAddress', () => {
|
|
35
|
+
it('should validate IPv4 multicast addresses', () => {
|
|
36
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('224.0.0.1')).toBe(true);
|
|
37
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('239.255.255.255')).toBe(true);
|
|
38
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('225.1.2.3')).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it('should reject non-multicast IPv4 addresses', () => {
|
|
41
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('192.168.1.1')).toBe(false);
|
|
42
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('223.255.255.255')).toBe(false);
|
|
43
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('240.0.0.1')).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it('should reject invalid addresses', () => {
|
|
46
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('invalid')).toBe(false);
|
|
47
|
+
expect((0, address_parser_1.isIP4MulticastAddress)('256.1.1.1')).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('parseIP4Address', () => {
|
|
51
|
+
it('should parse valid IPv4 address', () => {
|
|
52
|
+
const addr = (0, address_parser_1.parseIP4Address)('192.168.1.1');
|
|
53
|
+
expect(addr).toBe('192.168.1.1');
|
|
54
|
+
});
|
|
55
|
+
it('should throw for invalid IPv4 address', () => {
|
|
56
|
+
expect(() => (0, address_parser_1.parseIP4Address)('256.1.1.1')).toThrow('Invalid IPv4 address');
|
|
57
|
+
expect(() => (0, address_parser_1.parseIP4Address)('invalid')).toThrow('Invalid IPv4 address');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('IPv6 validation', () => {
|
|
62
|
+
describe('isIP6Address', () => {
|
|
63
|
+
it('should validate full IPv6 addresses', () => {
|
|
64
|
+
expect((0, address_parser_1.isIP6Address)('2001:0db8:0000:0000:0000:0000:0000:0001')).toBe(true);
|
|
65
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8:0:0:0:0:0:1')).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('should validate compressed IPv6 addresses', () => {
|
|
68
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8::1')).toBe(true);
|
|
69
|
+
expect((0, address_parser_1.isIP6Address)('::1')).toBe(true);
|
|
70
|
+
expect((0, address_parser_1.isIP6Address)('::')).toBe(true);
|
|
71
|
+
expect((0, address_parser_1.isIP6Address)('fe80::1')).toBe(true);
|
|
72
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8:85a3::8a2e:370:7334')).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('should validate IPv6 with mixed IPv4', () => {
|
|
75
|
+
expect((0, address_parser_1.isIP6Address)('::ffff:192.0.2.1')).toBe(true);
|
|
76
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8::192.0.2.1')).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('should reject invalid IPv6 addresses', () => {
|
|
79
|
+
expect((0, address_parser_1.isIP6Address)('gggg::1')).toBe(false);
|
|
80
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8:::1')).toBe(false);
|
|
81
|
+
expect((0, address_parser_1.isIP6Address)('2001:db8::1::2')).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
it('should reject addresses with too many groups', () => {
|
|
84
|
+
expect((0, address_parser_1.isIP6Address)('1:2:3:4:5:6:7:8:9')).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('isIP6MulticastAddress', () => {
|
|
88
|
+
it('should validate IPv6 multicast addresses', () => {
|
|
89
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('FF02::1')).toBe(true);
|
|
90
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('FF05::2')).toBe(true);
|
|
91
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('ff01::1')).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it('should reject non-multicast IPv6 addresses', () => {
|
|
94
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('2001:db8::1')).toBe(false);
|
|
95
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('fe80::1')).toBe(false);
|
|
96
|
+
expect((0, address_parser_1.isIP6MulticastAddress)('::1')).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('parseIP6Address', () => {
|
|
100
|
+
it('should parse valid IPv6 address', () => {
|
|
101
|
+
const addr = (0, address_parser_1.parseIP6Address)('2001:db8::1');
|
|
102
|
+
expect(addr).toBe('2001:db8::1');
|
|
103
|
+
});
|
|
104
|
+
it('should throw for invalid IPv6 address', () => {
|
|
105
|
+
expect(() => (0, address_parser_1.parseIP6Address)('invalid')).toThrow('Invalid IPv6 address');
|
|
106
|
+
expect(() => (0, address_parser_1.parseIP6Address)('gggg::1')).toThrow('Invalid IPv6 address');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('FQDN validation', () => {
|
|
111
|
+
describe('isFQDN', () => {
|
|
112
|
+
it('should validate valid FQDNs', () => {
|
|
113
|
+
expect((0, address_parser_1.isFQDN)('example.com')).toBe(true);
|
|
114
|
+
expect((0, address_parser_1.isFQDN)('www.example.com')).toBe(true);
|
|
115
|
+
expect((0, address_parser_1.isFQDN)('sub.domain.example.com')).toBe(true);
|
|
116
|
+
expect((0, address_parser_1.isFQDN)('sip.example.org')).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
it('should validate single label', () => {
|
|
119
|
+
expect((0, address_parser_1.isFQDN)('localhost')).toBe(true);
|
|
120
|
+
expect((0, address_parser_1.isFQDN)('server1')).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
it('should validate labels with hyphens', () => {
|
|
123
|
+
expect((0, address_parser_1.isFQDN)('my-server.example.com')).toBe(true);
|
|
124
|
+
expect((0, address_parser_1.isFQDN)('example-1.com')).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it('should reject invalid FQDNs', () => {
|
|
127
|
+
expect((0, address_parser_1.isFQDN)('')).toBe(false);
|
|
128
|
+
expect((0, address_parser_1.isFQDN)('-invalid.com')).toBe(false);
|
|
129
|
+
expect((0, address_parser_1.isFQDN)('invalid-.com')).toBe(false);
|
|
130
|
+
expect((0, address_parser_1.isFQDN)('invalid..com')).toBe(false);
|
|
131
|
+
expect((0, address_parser_1.isFQDN)('.invalid.com')).toBe(false);
|
|
132
|
+
expect((0, address_parser_1.isFQDN)('invalid.com.')).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
it('should reject labels that are too long', () => {
|
|
135
|
+
const longLabel = 'a'.repeat(64);
|
|
136
|
+
expect((0, address_parser_1.isFQDN)(`${longLabel}.com`)).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
it('should reject FQDNs that are too long', () => {
|
|
139
|
+
const longFQDN = 'a'.repeat(254);
|
|
140
|
+
expect((0, address_parser_1.isFQDN)(longFQDN)).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('should accept labels with numbers', () => {
|
|
143
|
+
expect((0, address_parser_1.isFQDN)('server1.example.com')).toBe(true);
|
|
144
|
+
expect((0, address_parser_1.isFQDN)('123.example.com')).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('parseFQDN', () => {
|
|
148
|
+
it('should parse valid FQDN', () => {
|
|
149
|
+
const fqdn = (0, address_parser_1.parseFQDN)('example.com');
|
|
150
|
+
expect(fqdn).toBe('example.com');
|
|
151
|
+
});
|
|
152
|
+
it('should throw for invalid FQDN', () => {
|
|
153
|
+
expect(() => (0, address_parser_1.parseFQDN)('-invalid.com')).toThrow('Invalid FQDN');
|
|
154
|
+
expect(() => (0, address_parser_1.parseFQDN)('')).toThrow('Invalid FQDN');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('parseUnicastAddress', () => {
|
|
159
|
+
it('should parse IPv4 address for IP4 type', () => {
|
|
160
|
+
const addr = (0, address_parser_1.parseUnicastAddress)('192.168.1.1', 'IP4');
|
|
161
|
+
expect(addr).toBe('192.168.1.1');
|
|
162
|
+
});
|
|
163
|
+
it('should parse FQDN for IP4 type', () => {
|
|
164
|
+
const addr = (0, address_parser_1.parseUnicastAddress)('example.com', 'IP4');
|
|
165
|
+
expect(addr).toBe('example.com');
|
|
166
|
+
});
|
|
167
|
+
it('should parse IPv6 address for IP6 type', () => {
|
|
168
|
+
const addr = (0, address_parser_1.parseUnicastAddress)('2001:db8::1', 'IP6');
|
|
169
|
+
expect(addr).toBe('2001:db8::1');
|
|
170
|
+
});
|
|
171
|
+
it('should parse FQDN for IP6 type', () => {
|
|
172
|
+
const addr = (0, address_parser_1.parseUnicastAddress)('example.com', 'IP6');
|
|
173
|
+
expect(addr).toBe('example.com');
|
|
174
|
+
});
|
|
175
|
+
it('should parse extension address for unknown type', () => {
|
|
176
|
+
const addr = (0, address_parser_1.parseUnicastAddress)('some-address', 'ATM');
|
|
177
|
+
expect(addr).toBe('some-address');
|
|
178
|
+
});
|
|
179
|
+
it('should throw for invalid IPv4 with IP4 type', () => {
|
|
180
|
+
expect(() => (0, address_parser_1.parseUnicastAddress)('-invalid.', 'IP4')).toThrow('Invalid address for type IP4');
|
|
181
|
+
});
|
|
182
|
+
it('should throw for invalid IPv6 with IP6 type', () => {
|
|
183
|
+
expect(() => (0, address_parser_1.parseUnicastAddress)('-invalid.', 'IP6')).toThrow('Invalid address for type IP6');
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('detectAddressType', () => {
|
|
187
|
+
it('should detect IPv4 addresses', () => {
|
|
188
|
+
expect((0, address_parser_1.detectAddressType)('192.168.1.1')).toBe('IP4');
|
|
189
|
+
expect((0, address_parser_1.detectAddressType)('10.0.0.1')).toBe('IP4');
|
|
190
|
+
});
|
|
191
|
+
it('should detect IPv6 addresses', () => {
|
|
192
|
+
expect((0, address_parser_1.detectAddressType)('2001:db8::1')).toBe('IP6');
|
|
193
|
+
expect((0, address_parser_1.detectAddressType)('::1')).toBe('IP6');
|
|
194
|
+
});
|
|
195
|
+
it('should detect FQDNs as IP4', () => {
|
|
196
|
+
expect((0, address_parser_1.detectAddressType)('example.com')).toBe('IP4');
|
|
197
|
+
expect((0, address_parser_1.detectAddressType)('www.example.com')).toBe('IP4');
|
|
198
|
+
});
|
|
199
|
+
it('should detect unknown types as extension', () => {
|
|
200
|
+
expect((0, address_parser_1.detectAddressType)('-invalid.')).toBe('extension');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-validators.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/utils/format-validators.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|