jasmine-core 2.3.4 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jasmine-core/boot.js +9 -0
- data/lib/jasmine-core/boot/boot.js +9 -0
- data/lib/jasmine-core/jasmine-html.js +87 -60
- data/lib/jasmine-core/jasmine.css +51 -51
- data/lib/jasmine-core/jasmine.js +176 -20
- data/lib/jasmine-core/spec/core/EnvSpec.js +20 -0
- data/lib/jasmine-core/spec/core/JsApiReporterSpec.js +8 -0
- data/lib/jasmine-core/spec/core/PrettyPrintSpec.js +8 -0
- data/lib/jasmine-core/spec/core/SpyRegistrySpec.js +29 -0
- data/lib/jasmine-core/spec/core/SuiteSpec.js +15 -0
- data/lib/jasmine-core/spec/core/TreeProcessorSpec.js +63 -0
- data/lib/jasmine-core/spec/core/asymmetric_equality/AnySpec.js +7 -0
- data/lib/jasmine-core/spec/core/integration/EnvSpec.js +80 -6
- data/lib/jasmine-core/spec/core/integration/SpecRunningSpec.js +102 -3
- data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledTimesSpec.js +81 -0
- data/lib/jasmine-core/spec/core/matchers/toThrowErrorSpec.js +8 -8
- data/lib/jasmine-core/spec/html/HtmlReporterSpec.js +190 -54
- data/lib/jasmine-core/version.rb +1 -1
- metadata +4 -3
data/lib/jasmine-core/jasmine.js
CHANGED
@@ -24,7 +24,11 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
24
24
|
var jasmineRequire;
|
25
25
|
|
26
26
|
if (typeof module !== 'undefined' && module.exports) {
|
27
|
-
|
27
|
+
if (typeof global !== 'undefined') {
|
28
|
+
jasmineGlobal = global;
|
29
|
+
} else {
|
30
|
+
jasmineGlobal = {};
|
31
|
+
}
|
28
32
|
jasmineRequire = exports;
|
29
33
|
} else {
|
30
34
|
if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') {
|
@@ -68,6 +72,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
68
72
|
j$.Timer = jRequire.Timer();
|
69
73
|
j$.TreeProcessor = jRequire.TreeProcessor();
|
70
74
|
j$.version = jRequire.version();
|
75
|
+
j$.Order = jRequire.Order();
|
71
76
|
|
72
77
|
j$.matchers = jRequire.requireMatchers(jRequire, j$);
|
73
78
|
|
@@ -93,6 +98,7 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
|
|
93
98
|
'toEqual',
|
94
99
|
'toHaveBeenCalled',
|
95
100
|
'toHaveBeenCalledWith',
|
101
|
+
'toHaveBeenCalledTimes',
|
96
102
|
'toMatch',
|
97
103
|
'toThrow',
|
98
104
|
'toThrowError'
|
@@ -447,6 +453,53 @@ if (typeof window == void 0 && typeof exports == 'object') {
|
|
447
453
|
exports.Spec = jasmineRequire.Spec;
|
448
454
|
}
|
449
455
|
|
456
|
+
/*jshint bitwise: false*/
|
457
|
+
|
458
|
+
getJasmineRequireObj().Order = function() {
|
459
|
+
function Order(options) {
|
460
|
+
this.random = 'random' in options ? options.random : true;
|
461
|
+
var seed = this.seed = options.seed || generateSeed();
|
462
|
+
this.sort = this.random ? randomOrder : naturalOrder;
|
463
|
+
|
464
|
+
function naturalOrder(items) {
|
465
|
+
return items;
|
466
|
+
}
|
467
|
+
|
468
|
+
function randomOrder(items) {
|
469
|
+
var copy = items.slice();
|
470
|
+
copy.sort(function(a, b) {
|
471
|
+
return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id);
|
472
|
+
});
|
473
|
+
return copy;
|
474
|
+
}
|
475
|
+
|
476
|
+
function generateSeed() {
|
477
|
+
return String(Math.random()).slice(-5);
|
478
|
+
}
|
479
|
+
|
480
|
+
// Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function
|
481
|
+
// used to get a different output when the key changes slighly.
|
482
|
+
// We use your return to sort the children randomly in a consistent way when
|
483
|
+
// used in conjunction with a seed
|
484
|
+
|
485
|
+
function jenkinsHash(key) {
|
486
|
+
var hash, i;
|
487
|
+
for(hash = i = 0; i < key.length; ++i) {
|
488
|
+
hash += key.charCodeAt(i);
|
489
|
+
hash += (hash << 10);
|
490
|
+
hash ^= (hash >> 6);
|
491
|
+
}
|
492
|
+
hash += (hash << 3);
|
493
|
+
hash ^= (hash >> 11);
|
494
|
+
hash += (hash << 15);
|
495
|
+
return hash;
|
496
|
+
}
|
497
|
+
|
498
|
+
}
|
499
|
+
|
500
|
+
return Order;
|
501
|
+
};
|
502
|
+
|
450
503
|
getJasmineRequireObj().Env = function(j$) {
|
451
504
|
function Env(options) {
|
452
505
|
options = options || {};
|
@@ -469,6 +522,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|
469
522
|
var currentlyExecutingSuites = [];
|
470
523
|
var currentDeclarationSuite = null;
|
471
524
|
var throwOnExpectationFailure = false;
|
525
|
+
var random = false;
|
526
|
+
var seed = null;
|
472
527
|
|
473
528
|
var currentSuite = function() {
|
474
529
|
return currentlyExecutingSuites[currentlyExecutingSuites.length - 1];
|
@@ -557,7 +612,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
557
612
|
|
558
613
|
while(suite) {
|
559
614
|
befores = befores.concat(suite.beforeFns);
|
560
|
-
afters = afters.concat(suite.afterFns);
|
615
|
+
afters = afters.concat(suite.afterFns.reverse());
|
561
616
|
|
562
617
|
suite = suite.parentSuite;
|
563
618
|
}
|
@@ -618,6 +673,21 @@ getJasmineRequireObj().Env = function(j$) {
|
|
618
673
|
return throwOnExpectationFailure;
|
619
674
|
};
|
620
675
|
|
676
|
+
this.randomizeTests = function(value) {
|
677
|
+
random = !!value;
|
678
|
+
};
|
679
|
+
|
680
|
+
this.randomTests = function() {
|
681
|
+
return random;
|
682
|
+
};
|
683
|
+
|
684
|
+
this.seed = function(value) {
|
685
|
+
if (value) {
|
686
|
+
seed = value;
|
687
|
+
}
|
688
|
+
return seed;
|
689
|
+
};
|
690
|
+
|
621
691
|
var queueRunnerFactory = function(options) {
|
622
692
|
options.catchException = catchException;
|
623
693
|
options.clearStack = options.clearStack || clearStack;
|
@@ -649,6 +719,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|
649
719
|
runnablesToRun = [topSuite.id];
|
650
720
|
}
|
651
721
|
}
|
722
|
+
|
723
|
+
var order = new j$.Order({
|
724
|
+
random: random,
|
725
|
+
seed: seed
|
726
|
+
});
|
727
|
+
|
652
728
|
var processor = new j$.TreeProcessor({
|
653
729
|
tree: topSuite,
|
654
730
|
runnableIds: runnablesToRun,
|
@@ -664,6 +740,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|
664
740
|
}
|
665
741
|
currentlyExecutingSuites.pop();
|
666
742
|
reporter.suiteDone(result);
|
743
|
+
},
|
744
|
+
orderChildren: function(node) {
|
745
|
+
return order.sort(node.children);
|
667
746
|
}
|
668
747
|
});
|
669
748
|
|
@@ -675,7 +754,11 @@ getJasmineRequireObj().Env = function(j$) {
|
|
675
754
|
totalSpecsDefined: totalSpecsDefined
|
676
755
|
});
|
677
756
|
|
678
|
-
processor.execute(
|
757
|
+
processor.execute(function() {
|
758
|
+
reporter.jasmineDone({
|
759
|
+
order: order
|
760
|
+
});
|
761
|
+
});
|
679
762
|
};
|
680
763
|
|
681
764
|
this.addReporter = function(reporterToAdd) {
|
@@ -710,13 +793,20 @@ getJasmineRequireObj().Env = function(j$) {
|
|
710
793
|
|
711
794
|
this.describe = function(description, specDefinitions) {
|
712
795
|
var suite = suiteFactory(description);
|
796
|
+
if (specDefinitions.length > 0) {
|
797
|
+
throw new Error('describe does not expect a done parameter');
|
798
|
+
}
|
799
|
+
if (currentDeclarationSuite.markedPending) {
|
800
|
+
suite.pend();
|
801
|
+
}
|
713
802
|
addSpecsToSuite(suite, specDefinitions);
|
714
803
|
return suite;
|
715
804
|
};
|
716
805
|
|
717
806
|
this.xdescribe = function(description, specDefinitions) {
|
718
|
-
var suite =
|
719
|
-
suite.
|
807
|
+
var suite = suiteFactory(description);
|
808
|
+
suite.pend();
|
809
|
+
addSpecsToSuite(suite, specDefinitions);
|
720
810
|
return suite;
|
721
811
|
};
|
722
812
|
|
@@ -822,19 +912,22 @@ getJasmineRequireObj().Env = function(j$) {
|
|
822
912
|
|
823
913
|
this.it = function(description, fn, timeout) {
|
824
914
|
var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
|
915
|
+
if (currentDeclarationSuite.markedPending) {
|
916
|
+
spec.pend();
|
917
|
+
}
|
825
918
|
currentDeclarationSuite.addChild(spec);
|
826
919
|
return spec;
|
827
920
|
};
|
828
921
|
|
829
922
|
this.xit = function() {
|
830
923
|
var spec = this.it.apply(this, arguments);
|
831
|
-
spec.pend();
|
924
|
+
spec.pend('Temporarily disabled with xit');
|
832
925
|
return spec;
|
833
926
|
};
|
834
927
|
|
835
|
-
this.fit = function(){
|
836
|
-
var spec =
|
837
|
-
|
928
|
+
this.fit = function(description, fn, timeout){
|
929
|
+
var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
|
930
|
+
currentDeclarationSuite.addChild(spec);
|
838
931
|
focusedRunnables.push(spec.id);
|
839
932
|
unfocusAncestor();
|
840
933
|
return spec;
|
@@ -918,6 +1011,7 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
918
1011
|
|
919
1012
|
this.started = false;
|
920
1013
|
this.finished = false;
|
1014
|
+
this.runDetails = {};
|
921
1015
|
|
922
1016
|
this.jasmineStarted = function() {
|
923
1017
|
this.started = true;
|
@@ -927,8 +1021,9 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
927
1021
|
|
928
1022
|
var executionTime;
|
929
1023
|
|
930
|
-
this.jasmineDone = function() {
|
1024
|
+
this.jasmineDone = function(runDetails) {
|
931
1025
|
this.finished = true;
|
1026
|
+
this.runDetails = runDetails;
|
932
1027
|
executionTime = timer.elapsed();
|
933
1028
|
status = 'done';
|
934
1029
|
};
|
@@ -1606,6 +1701,8 @@ getJasmineRequireObj().pp = function(j$) {
|
|
1606
1701
|
this.emitScalar('HTMLNode');
|
1607
1702
|
} else if (value instanceof Date) {
|
1608
1703
|
this.emitScalar('Date(' + value + ')');
|
1704
|
+
} else if (value.toString && typeof value === 'object' && !(value instanceof Array) && value.toString !== Object.prototype.toString) {
|
1705
|
+
this.emitScalar(value.toString());
|
1609
1706
|
} else if (j$.util.arrayContains(this.seen, value)) {
|
1610
1707
|
this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>');
|
1611
1708
|
} else if (j$.isArray_(value) || j$.isA_('Object', value)) {
|
@@ -1810,7 +1907,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|
1810
1907
|
if (queueableFn.timeout) {
|
1811
1908
|
timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() {
|
1812
1909
|
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
1813
|
-
onException(error
|
1910
|
+
onException(error);
|
1814
1911
|
next();
|
1815
1912
|
}, queueableFn.timeout()]]);
|
1816
1913
|
}
|
@@ -1823,12 +1920,12 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|
1823
1920
|
}
|
1824
1921
|
}
|
1825
1922
|
|
1826
|
-
function onException(e
|
1923
|
+
function onException(e) {
|
1827
1924
|
self.onException(e);
|
1828
1925
|
}
|
1829
1926
|
|
1830
1927
|
function handleException(e, queueableFn) {
|
1831
|
-
onException(e
|
1928
|
+
onException(e);
|
1832
1929
|
if (!self.catchException(e)) {
|
1833
1930
|
//TODO: set a var when we catch an exception and
|
1834
1931
|
//use a finally block to close the loop in a nice way..
|
@@ -1900,6 +1997,17 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
|
|
1900
1997
|
throw new Error(methodName + ' has already been spied upon');
|
1901
1998
|
}
|
1902
1999
|
|
2000
|
+
var descriptor;
|
2001
|
+
try {
|
2002
|
+
descriptor = Object.getOwnPropertyDescriptor(obj, methodName);
|
2003
|
+
} catch(e) {
|
2004
|
+
// IE 8 doesn't support `definePropery` on non-DOM nodes
|
2005
|
+
}
|
2006
|
+
|
2007
|
+
if (descriptor && !(descriptor.writable || descriptor.set)) {
|
2008
|
+
throw new Error(methodName + ' is not declared writable or has no setter');
|
2009
|
+
}
|
2010
|
+
|
1903
2011
|
var spy = j$.createSpy(methodName, obj[methodName]);
|
1904
2012
|
|
1905
2013
|
currentSpies().push({
|
@@ -2030,6 +2138,10 @@ getJasmineRequireObj().Suite = function(j$) {
|
|
2030
2138
|
this.disabled = true;
|
2031
2139
|
};
|
2032
2140
|
|
2141
|
+
Suite.prototype.pend = function(message) {
|
2142
|
+
this.markedPending = true;
|
2143
|
+
};
|
2144
|
+
|
2033
2145
|
Suite.prototype.beforeEach = function(fn) {
|
2034
2146
|
this.beforeFns.unshift(fn);
|
2035
2147
|
};
|
@@ -2055,6 +2167,10 @@ getJasmineRequireObj().Suite = function(j$) {
|
|
2055
2167
|
return 'disabled';
|
2056
2168
|
}
|
2057
2169
|
|
2170
|
+
if (this.markedPending) {
|
2171
|
+
return 'pending';
|
2172
|
+
}
|
2173
|
+
|
2058
2174
|
if (this.result.failedExpectations.length > 0) {
|
2059
2175
|
return 'failed';
|
2060
2176
|
} else {
|
@@ -2184,6 +2300,7 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|
2184
2300
|
queueRunnerFactory = attrs.queueRunnerFactory,
|
2185
2301
|
nodeStart = attrs.nodeStart || function() {},
|
2186
2302
|
nodeComplete = attrs.nodeComplete || function() {},
|
2303
|
+
orderChildren = attrs.orderChildren || function(node) { return node.children; },
|
2187
2304
|
stats = { valid: true },
|
2188
2305
|
processed = false,
|
2189
2306
|
defaultMin = Infinity,
|
@@ -2247,8 +2364,10 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|
2247
2364
|
} else {
|
2248
2365
|
var hasExecutableChild = false;
|
2249
2366
|
|
2250
|
-
|
2251
|
-
|
2367
|
+
var orderedChildren = orderChildren(node);
|
2368
|
+
|
2369
|
+
for (var i = 0; i < orderedChildren.length; i++) {
|
2370
|
+
var child = orderedChildren[i];
|
2252
2371
|
|
2253
2372
|
processNode(child, parentEnabled);
|
2254
2373
|
|
@@ -2265,7 +2384,7 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|
2265
2384
|
executable: hasExecutableChild
|
2266
2385
|
};
|
2267
2386
|
|
2268
|
-
segmentChildren(node, stats[node.id], executableIndex);
|
2387
|
+
segmentChildren(node, orderedChildren, stats[node.id], executableIndex);
|
2269
2388
|
|
2270
2389
|
if (!node.canBeReentered() && stats[node.id].segments.length > 1) {
|
2271
2390
|
stats = { valid: false };
|
@@ -2281,11 +2400,11 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|
2281
2400
|
return executableIndex === undefined ? defaultMax : executableIndex;
|
2282
2401
|
}
|
2283
2402
|
|
2284
|
-
function segmentChildren(node, nodeStats, executableIndex) {
|
2403
|
+
function segmentChildren(node, orderedChildren, nodeStats, executableIndex) {
|
2285
2404
|
var currentSegment = { index: 0, owner: node, nodes: [], min: startingMin(executableIndex), max: startingMax(executableIndex) },
|
2286
2405
|
result = [currentSegment],
|
2287
2406
|
lastMax = defaultMax,
|
2288
|
-
orderedChildSegments = orderChildSegments(
|
2407
|
+
orderedChildSegments = orderChildSegments(orderedChildren);
|
2289
2408
|
|
2290
2409
|
function isSegmentBoundary(minIndex) {
|
2291
2410
|
return lastMax !== defaultMax && minIndex !== defaultMin && lastMax < minIndex - 1;
|
@@ -2384,6 +2503,12 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|
2384
2503
|
getJasmineRequireObj().Any = function(j$) {
|
2385
2504
|
|
2386
2505
|
function Any(expectedObject) {
|
2506
|
+
if (typeof expectedObject === 'undefined') {
|
2507
|
+
throw new TypeError(
|
2508
|
+
'jasmine.any() expects to be passed a constructor function. ' +
|
2509
|
+
'Please pass one or use jasmine.anything() to match any object.'
|
2510
|
+
);
|
2511
|
+
}
|
2387
2512
|
this.expectedObject = expectedObject;
|
2388
2513
|
}
|
2389
2514
|
|
@@ -2976,6 +3101,37 @@ getJasmineRequireObj().toHaveBeenCalled = function(j$) {
|
|
2976
3101
|
return toHaveBeenCalled;
|
2977
3102
|
};
|
2978
3103
|
|
3104
|
+
getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
|
3105
|
+
|
3106
|
+
function toHaveBeenCalledTimes() {
|
3107
|
+
return {
|
3108
|
+
compare: function(actual, expected) {
|
3109
|
+
if (!j$.isSpy(actual)) {
|
3110
|
+
throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.');
|
3111
|
+
}
|
3112
|
+
|
3113
|
+
var args = Array.prototype.slice.call(arguments, 0),
|
3114
|
+
result = { pass: false };
|
3115
|
+
|
3116
|
+
if(!expected){
|
3117
|
+
throw new Error('Expected times failed is required as an argument.');
|
3118
|
+
}
|
3119
|
+
|
3120
|
+
actual = args[0];
|
3121
|
+
var calls = actual.calls.count();
|
3122
|
+
var timesMessage = expected === 1 ? 'once' : expected + ' times';
|
3123
|
+
result.pass = calls === expected;
|
3124
|
+
result.message = result.pass ?
|
3125
|
+
'Expected spy ' + actual.and.identity() + ' not to have been called ' + timesMessage + '. It was called ' + calls + ' times.' :
|
3126
|
+
'Expected spy ' + actual.and.identity() + ' to have been called ' + timesMessage + '. It was called ' + calls + ' times.';
|
3127
|
+
return result;
|
3128
|
+
}
|
3129
|
+
};
|
3130
|
+
}
|
3131
|
+
|
3132
|
+
return toHaveBeenCalledTimes;
|
3133
|
+
};
|
3134
|
+
|
2979
3135
|
getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
|
2980
3136
|
|
2981
3137
|
function toHaveBeenCalledWith(util, customEqualityTesters) {
|
@@ -3079,7 +3235,7 @@ getJasmineRequireObj().toThrow = function(j$) {
|
|
3079
3235
|
};
|
3080
3236
|
|
3081
3237
|
getJasmineRequireObj().toThrowError = function(j$) {
|
3082
|
-
function toThrowError (
|
3238
|
+
function toThrowError () {
|
3083
3239
|
return {
|
3084
3240
|
compare: function(actual) {
|
3085
3241
|
var threw = false,
|
@@ -3294,5 +3450,5 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
3294
3450
|
};
|
3295
3451
|
|
3296
3452
|
getJasmineRequireObj().version = function() {
|
3297
|
-
return '2.
|
3453
|
+
return '2.4.0';
|
3298
3454
|
};
|
@@ -26,6 +26,15 @@ describe("Env", function() {
|
|
26
26
|
});
|
27
27
|
});
|
28
28
|
|
29
|
+
describe('#describe', function () {
|
30
|
+
var spec = function(done){};
|
31
|
+
it("throws the error", function() {
|
32
|
+
expect(function() {
|
33
|
+
env.describe('done method', spec);
|
34
|
+
}).toThrow(new Error('describe does not expect a done parameter'));
|
35
|
+
});
|
36
|
+
});
|
37
|
+
|
29
38
|
it('can configure specs to throw errors on expectation failures', function() {
|
30
39
|
env.throwOnExpectationFailure(true);
|
31
40
|
|
@@ -45,4 +54,15 @@ describe("Env", function() {
|
|
45
54
|
throwOnExpectationFailure: true
|
46
55
|
}));
|
47
56
|
});
|
57
|
+
|
58
|
+
describe('#xit', function() {
|
59
|
+
it('calls spec.pend with "Temporarily disabled with xit"', function() {
|
60
|
+
var pendSpy = jasmine.createSpy();
|
61
|
+
spyOn(env, 'it').and.returnValue({
|
62
|
+
pend: pendSpy
|
63
|
+
});
|
64
|
+
env.xit();
|
65
|
+
expect(pendSpy).toHaveBeenCalledWith('Temporarily disabled with xit');
|
66
|
+
});
|
67
|
+
});
|
48
68
|
});
|
@@ -248,4 +248,12 @@ describe("JsApiReporter", function() {
|
|
248
248
|
});
|
249
249
|
});
|
250
250
|
});
|
251
|
+
|
252
|
+
describe('#runDetails', function() {
|
253
|
+
it('should have details about the run', function() {
|
254
|
+
var reporter = new j$.JsApiReporter({});
|
255
|
+
reporter.jasmineDone({some: {run: 'details'}});
|
256
|
+
expect(reporter.runDetails).toEqual({some: {run: 'details'}});
|
257
|
+
});
|
258
|
+
});
|
251
259
|
});
|
@@ -181,6 +181,14 @@ describe("j$.pp", function () {
|
|
181
181
|
expect(j$.pp(obj)).toEqual("strung");
|
182
182
|
});
|
183
183
|
|
184
|
+
it("should stringify objects that implement custom toString", function () {
|
185
|
+
var obj = {
|
186
|
+
toString: function () { return "my toString"; }
|
187
|
+
};
|
188
|
+
|
189
|
+
expect(j$.pp(obj)).toEqual("my toString");
|
190
|
+
});
|
191
|
+
|
184
192
|
it("should handle objects with null prototype", function() {
|
185
193
|
if (jasmine.getEnv().ieVersion < 9) { return; }
|
186
194
|
|