3d73924ccb1251a76a2d9daafec186eee805149d.svn-base
2.07 KB
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
const Format = require('./format.js')
const Has = require('./has.js')
class Match extends Has {
test () {
const obj = this.object
const pattern = this.expect
return (
super.test() === true ? true
// failures that would also fail in the super class
// but if they didn't pass, then should fail here, too
: pattern == null || obj == null ? false
: pattern instanceof RegExp && obj instanceof RegExp ? false
: Buffer.isBuffer(obj) && Buffer.isBuffer(pattern) ? false
: typeof pattern === 'symbol' ? false
// ok, Match-specific stuff
: pattern instanceof RegExp ? pattern.test('' + obj)
: typeof obj === 'string' && typeof pattern === 'string' && pattern
? obj.indexOf(pattern) !== -1
: obj instanceof Date && typeof pattern === 'string'
? obj.getTime() === new Date(pattern).getTime()
: pattern === Buffer ? Buffer.isBuffer(obj)
: pattern === Function ? typeof obj === 'function'
: pattern === Number
? typeof obj === 'number' && obj === obj && isFinite(obj)
: pattern === String ? typeof obj === 'string'
: pattern === Symbol ? typeof obj === 'symbol'
: pattern === Boolean ? typeof obj === 'boolean'
: pattern === Map ? this.isMap()
: pattern === Set ? this.isSet()
: pattern === Object ? obj && typeof obj === 'object'
: pattern === Array ? new Format(obj).isArray()
: !this.isError() && (pattern instanceof Error) ? false
: this.isError() && (
pattern.message &&
!new Match(obj.message, {expect:pattern.message}).test() ||
pattern.name &&
!new Match(obj.name, {expect:pattern.name}).test()) ? false
// standard deep matching stuff, same as parent, but not simple.
: this.isSet() && !(pattern instanceof Set) ? false
: this.isMap() && !(pattern instanceof Map) ? false
: typeof pattern === 'function' && typeof obj === 'object'
? obj instanceof pattern
: typeof obj !== 'object' || typeof pattern !== 'object' ? false
: 'COMPLEX'
)
}
}
module.exports = Match