-
Notifications
You must be signed in to change notification settings - Fork 16
/
tosource.test.ts
131 lines (120 loc) · 2.84 KB
/
tosource.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import toSource from './tosource';
// Various types
describe('toSource', () => {
it('works on kitchen sink', () => {
const date = new Date();
const a = undefined;
function foo(bar: any) {
console.log('woo! a is ' + a);
console.log('and bar is ' + bar);
}
const bar = () => 45;
const v = toSource([
0,
-0,
4,
5,
6,
'hello',
{
0: 1,
a: 2,
b: 3,
'1': 4,
if: 5,
yes: true,
no: false,
nan: NaN,
infinity: Infinity,
undefined: undefined,
null: null,
foo,
bar,
map: new Map<any, any>([
['hello', 45],
[45, 'hello'],
]),
set: new Set(['hello', 45]),
},
/we$/gi,
new RegExp('/w/e/', 'ig'),
/\/w\/e\//gim,
date,
new Date('Wed, 09 Aug 1995 00:00:00 GMT'),
]);
expect(v).toEqual(
`[ 0,
-0,
4,
5,
6,
"hello",
{ 0:1,
1:4,
a:2,
b:3,
"if":5,
yes:true,
no:false,
nan:NaN,
infinity:Infinity,
"undefined":undefined,
"null":null,
foo:function foo(bar) {
console.log('woo! a is ' + a);
console.log('and bar is ' + bar);
},
bar:() => 45,
map:new Map([ [ "hello",
45 ],
[ 45,
"hello" ] ]),
set:new Set([ "hello",
45 ]) },
/we$/gi,
/\\/w\\/e\\//gi,
/\\/w\\/e\\//gim,
new Date(${date.getTime()}),
new Date(807926400000) ]`,
);
});
it('zero', () => {
expect(toSource(-0)).toEqual('-0');
expect(toSource(0)).toEqual('0');
});
it('sparse array', () => {
expect(toSource([1, , ,], undefined, false)).toEqual('[1,,]');
});
it('sparse array 2', () => {
expect(toSource([1, , , 3], undefined, false)).toEqual('[1,,,3]');
});
it('negative Infinity', () => {
expect(toSource(-Infinity)).toEqual('-Infinity');
});
it('filters parameter', () => {
// Filter parameter (applies to every object recursively before serializing)
expect(
toSource([4, 5, 6, { bar: 3 }], function numbersToStrings(value) {
return typeof value === 'number' ? '<' + value + '>' : value;
}),
).toEqual(`[ "<4>",\n "<5>",\n "<6>",\n { bar:"<3>" } ]`);
});
it('generates with no indent', () => {
expect(toSource([4, 5, 6, { bar: 3 }], undefined, false)).toEqual(
'[4,5,6,{bar:3}]',
);
});
it('handles circular reference', () => {
const object: any = { a: 1, b: 2 };
object.c = object;
expect(toSource(object)).toEqual(
'{ a:1,\n' + ' b:2,\n' + ' c:{$circularReference:1} }',
);
});
it('allows multiple references to the same object', () => {
// Not a circular reference
const foo = {};
const object = { a: foo, b: foo };
expect(toSource(object)).toEqual('{ a:{},\n' + ' b:{} }');
});
});