[go: nahoru, domu]

blob: eb4dd55ee95c4f26b6898071f95baf1f186a457e [file] [log] [blame]
Jack Franklinb5bbcc02020-02-11 10:14:111"use strict";
2
3var arrayProto = require("@sinonjs/commons").prototypes.array;
4var color = require("./color");
5var match = require("@sinonjs/samsam").createMatcher;
6var timesInWords = require("./util/core/times-in-words");
7var sinonFormat = require("./util/core/format");
8var jsDiff = require("diff");
9
10var join = arrayProto.join;
11var map = arrayProto.map;
12var push = arrayProto.push;
13
14function colorSinonMatchText(matcher, calledArg, calledArgMessage) {
15 var calledArgumentMessage = calledArgMessage;
16 if (!matcher.test(calledArg)) {
17 matcher.message = color.red(matcher.message);
18 if (calledArgumentMessage) {
19 calledArgumentMessage = color.green(calledArgumentMessage);
20 }
21 }
22 return calledArgumentMessage + " " + matcher.message;
23}
24
25function colorDiffText(diff) {
26 var objects = map(diff, function(part) {
27 var text = part.value;
28 if (part.added) {
29 text = color.green(text);
30 } else if (part.removed) {
31 text = color.red(text);
32 }
33 if (diff.length === 2) {
34 text += " "; // format simple diffs
35 }
36 return text;
37 });
38 return join(objects, "");
39}
40
41module.exports = {
42 c: function(spyInstance) {
43 return timesInWords(spyInstance.callCount);
44 },
45
46 n: function(spyInstance) {
47 // eslint-disable-next-line local-rules/no-prototype-methods
48 return spyInstance.toString();
49 },
50
51 D: function(spyInstance, args) {
52 var message = "";
53
54 for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
55 // describe multiple calls
56 if (l > 1) {
57 message += "\nCall " + (i + 1) + ":";
58 }
59 var calledArgs = spyInstance.getCall(i).args;
60 for (var j = 0; j < calledArgs.length || j < args.length; ++j) {
61 message += "\n";
62 var calledArgMessage = j < calledArgs.length ? sinonFormat(calledArgs[j]) : "";
63 if (match.isMatcher(args[j])) {
64 message += colorSinonMatchText(args[j], calledArgs[j], calledArgMessage);
65 } else {
66 var expectedArgMessage = j < args.length ? sinonFormat(args[j]) : "";
67 var diff = jsDiff.diffJson(calledArgMessage, expectedArgMessage);
68 message += colorDiffText(diff);
69 }
70 }
71 }
72
73 return message;
74 },
75
76 C: function(spyInstance) {
77 var calls = [];
78
79 for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
80 // eslint-disable-next-line local-rules/no-prototype-methods
81 var stringifiedCall = " " + spyInstance.getCall(i).toString();
82 if (/\n/.test(calls[i - 1])) {
83 stringifiedCall = "\n" + stringifiedCall;
84 }
85 push(calls, stringifiedCall);
86 }
87
88 return calls.length > 0 ? "\n" + join(calls, "\n") : "";
89 },
90
91 t: function(spyInstance) {
92 var objects = [];
93
94 for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
95 push(objects, sinonFormat(spyInstance.thisValues[i]));
96 }
97
98 return join(objects, ", ");
99 },
100
101 "*": function(spyInstance, args) {
102 return join(
103 map(args, function(arg) {
104 return sinonFormat(arg);
105 }),
106 ", "
107 );
108 }
109};