1 | var assert = require('assert');
|
2 | var Traverse = require('../');
|
3 | var deepEqual = require('./lib/deep_equal');
|
4 | var util = require('util');
|
5 |
|
6 | exports.circular = function () {
|
7 | var obj = { x : 3 };
|
8 | obj.y = obj;
|
9 | var foundY = false;
|
10 | Traverse(obj).forEach(function (x) {
|
11 | if (this.path.join('') == 'y') {
|
12 | assert.equal(
|
13 | util.inspect(this.circular.node),
|
14 | util.inspect(obj)
|
15 | );
|
16 | foundY = true;
|
17 | }
|
18 | });
|
19 | assert.ok(foundY);
|
20 | };
|
21 |
|
22 | exports.deepCirc = function () {
|
23 | var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] };
|
24 | obj.y[2] = obj;
|
25 |
|
26 | var times = 0;
|
27 | Traverse(obj).forEach(function (x) {
|
28 | if (this.circular) {
|
29 | assert.deepEqual(this.circular.path, []);
|
30 | assert.deepEqual(this.path, [ 'y', 2 ]);
|
31 | times ++;
|
32 | }
|
33 | });
|
34 |
|
35 | assert.deepEqual(times, 1);
|
36 | };
|
37 |
|
38 | exports.doubleCirc = function () {
|
39 | var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] };
|
40 | obj.y[2] = obj;
|
41 | obj.x.push(obj.y);
|
42 |
|
43 | var circs = [];
|
44 | Traverse(obj).forEach(function (x) {
|
45 | if (this.circular) {
|
46 | circs.push({ circ : this.circular, self : this, node : x });
|
47 | }
|
48 | });
|
49 |
|
50 | assert.deepEqual(circs[0].self.path, [ 'x', 3, 2 ]);
|
51 | assert.deepEqual(circs[0].circ.path, []);
|
52 |
|
53 | assert.deepEqual(circs[1].self.path, [ 'y', 2 ]);
|
54 | assert.deepEqual(circs[1].circ.path, []);
|
55 |
|
56 | assert.deepEqual(circs.length, 2);
|
57 | };
|
58 |
|
59 | exports.circDubForEach = function () {
|
60 | var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] };
|
61 | obj.y[2] = obj;
|
62 | obj.x.push(obj.y);
|
63 |
|
64 | Traverse(obj).forEach(function (x) {
|
65 | if (this.circular) this.update('...');
|
66 | });
|
67 |
|
68 | assert.deepEqual(obj, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] });
|
69 | };
|
70 |
|
71 | exports.circDubMap = function () {
|
72 | var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] };
|
73 | obj.y[2] = obj;
|
74 | obj.x.push(obj.y);
|
75 |
|
76 | var c = Traverse(obj).map(function (x) {
|
77 | if (this.circular) {
|
78 | this.update('...');
|
79 | }
|
80 | });
|
81 |
|
82 | assert.deepEqual(c, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] });
|
83 | };
|
84 |
|
85 | exports.circClone = function () {
|
86 | var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] };
|
87 | obj.y[2] = obj;
|
88 | obj.x.push(obj.y);
|
89 |
|
90 | var clone = Traverse.clone(obj);
|
91 | assert.ok(obj !== clone);
|
92 |
|
93 | assert.ok(clone.y[2] === clone);
|
94 | assert.ok(clone.y[2] !== obj);
|
95 | assert.ok(clone.x[3][2] === clone);
|
96 | assert.ok(clone.x[3][2] !== obj);
|
97 | assert.deepEqual(clone.x.slice(0,3), [1,2,3]);
|
98 | assert.deepEqual(clone.y.slice(0,2), [4,5]);
|
99 | };
|
100 |
|
101 | exports.circMapScrub = function () {
|
102 | var obj = { a : 1, b : 2 };
|
103 | obj.c = obj;
|
104 |
|
105 | var scrubbed = Traverse(obj).map(function (node) {
|
106 | if (this.circular) this.remove();
|
107 | });
|
108 | assert.deepEqual(
|
109 | Object.keys(scrubbed).sort(),
|
110 | [ 'a', 'b' ]
|
111 | );
|
112 | assert.ok(deepEqual(scrubbed, { a : 1, b : 2 }));
|
113 |
|
114 | assert.equal(obj.c, obj);
|
115 | };
|