-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathjasmine-parameterize.js
118 lines (102 loc) · 3.15 KB
/
jasmine-parameterize.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
/*
* JasmineParameterize v 1.0
* A jasmine plugin for running parameterized tests
* https://github.com/kannokanno/jasmine-parameterize
* Released under the MIT license.
*/
var jasmine_parameterize = (function() {
"use strict";
function JasmineParameterize() {
}
JasmineParameterize.prototype._casesFunc = function(context) {
var that = this;
return function(params) {
if (notArray(params)) {
error('Required array for cases(). params=' + params);
} else if (params.length < 1) {
error('Params is empty');
}
return {
it: function(name, func) {
that._run(context, name, func, params, context.it);
},
xit: function(name, func) {
that._run(context, name, func, params, context.xit);
}
};
}
}
JasmineParameterize.prototype._run = function(context, name, func, params, action) {
var wrapFunc = function(context, func, args) {
return function() { func.apply(context, args); };
}
var that = this;
context.describe(name, function(){
var n = params.length;
for (var i = 0; i < n; i++) {
var value = params[i];
var param = isArray(value) ? value : [value];
action.call(context, that._buildSpecName(i, param), wrapFunc(context, func, param));
}
});
}
JasmineParameterize.prototype._validate = function(context) {
if (notExist(context) || notExist(context.jasmine)) {
error('Not found jasmine.');
}
return true;
}
JasmineParameterize.prototype._buildSpecName = function(index, params) {
var str = params.length > 0 ? joinParams(params) : '[]';
return 'cases[' + index + '] - (' + str + ')'
}
function error(msg) {
throw new Error('jasmine-parameterize: ' + msg);
}
function isExist(v) {
return typeof(v) !== 'undefined' && v !== null;
}
function notExist(v) {
return !isExist(v);
}
function isArray(value) {
return value !== null && value instanceof Array;
}
function notArray(value) {
return !isArray(value);
}
function joinParams(params) {
var r = [];
for (var i = 0; i < params.length; i++) {
r.push(getParamString(params[i]));
}
return r.join(', ');
}
function getParamString(param) {
var type = typeof param;
var typeName = Object.prototype.toString.call(param);
if (type === 'undefined') {
return 'undefined';
} else if(param === null) {
return 'null';
} else if(type === 'string') {
return '"' + param + '"';
} else if(type === 'number') {
return param;
} else if(param instanceof Array) {
// recursive
return param.length > 0 ? '[' + joinParams(param) + ']' : '[]';
} else if(type === 'function' && isExist(param.name)) {
return typeName + param.name;
} else if(isExist(param.constructor) && isExist(param.constructor.name)) {
return typeName + param.constructor.name;
}
return typeName;
}
return new JasmineParameterize();
})();
(function(global) {
"use strict";
jasmine_parameterize._validate(global);
global.cases = jasmine_parameterize._casesFunc(global);
})(typeof window === 'undefined' ? this : window);