/
assert.js
119 lines (93 loc) · 2.74 KB
/
assert.js
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
/*!
* Copyright (C) 2017 Glayzzle (BSD3 License)
* @authors https://github.com/glayzzle/php-writer/graphs/contributors
* @url http://glayzzle.com/php-writer
*/
'use strict';
var parser = require('php-parser');
var should = require('should');
should.Assertion.add(
'AST',
function(code) {
this.params = { operator: 'to be AST' }
var ast;
(function parseCode() {
ast = parser.parseEval(code, {
parser: {
extractDoc: true
}
});
}).should.not.throw(code);
this.obj.should.be.Object();
if (typeof this.obj.kind === 'string') {
// just check one node
this.obj.should.deepEqual(ast.children[0]);
} else {
// check a body
this.obj.should.deepEqual(ast.children);
}
}, false
);
should.Assertion.add(
'Extend',
function(name) {
this.params = { operator: 'extend class' };
this.obj.should.be.Object('should contain AST');
(this.obj.extends === null).should.be.false('should contain an extends property');
this.obj.extends.name.should.be.equal(name);
}, false
);
should.Assertion.add('extendClass', function (name) {
this.obj.ast.extends.name.should.equal('bar');
});
should.Assertion.add('notExtendAnyClass', function () {
should(this.obj.ast.extends).be.null();
});
should.Assertion.add('implementInterface', function (name) {
var index = this.obj.ast.implements.findIndex(function (node) {
return node.name === name;
});
index.should.be.greaterThan(-1);
});
should.Assertion.add('implementedInterfacesCount', function (n) {
this.obj.ast.implements.should.have.length(n);
});
should.Assertion.add('notImplementAnyInterfaces', function (name) {
should(this.obj.ast.implements).be.null();
});
var getTraituse = function (subject) {
return subject.ast.body.find(function (node) {
return node.kind === 'traituse';
});
}
should.Assertion.add('traits', function (names) {
var subject = this.obj;
var traituse = getTraituse(subject);
should(traituse).not.be.null();
if (names) {
names.forEach(function (name) {
subject.should.have.trait(name);
})
}
});
should.Assertion.add('trait', function (name) {
var subject = this.obj;
var traituse = getTraituse(subject);
should(traituse).not.be.null();
var index = traituse.traits.findIndex(function (node) {
return node.name === name;
});
index.should.be.greaterThan(-1);
});
should.Assertion.add('traitsCount', function (n) {
var subject = this.obj;
var traituse = getTraituse(subject);
should(traituse).not.be.null();
traituse.traits.should.have.length(n);
});
should.Assertion.add('notHaveAnyTraits', function (name) {
var subject = this.obj;
var traituse = getTraituse(subject);
should(!!traituse).be.false();
});
module.exports = should;