evergreen 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/README.rdoc +4 -0
  2. data/bin/evergreen +18 -0
  3. data/lib/evergreen.rb +44 -0
  4. data/lib/evergreen/cli.rb +23 -0
  5. data/lib/evergreen/evergreen.js +3 -0
  6. data/lib/evergreen/runner.rb +56 -0
  7. data/lib/evergreen/server.rb +31 -0
  8. data/lib/evergreen/spec.rb +60 -0
  9. data/lib/evergreen/version.rb +3 -0
  10. data/lib/evergreen/views/list.erb +6 -0
  11. data/lib/evergreen/views/spec.erb +37 -0
  12. data/lib/jasmine/MIT.LICENSE +20 -0
  13. data/lib/jasmine/README.markdown +489 -0
  14. data/lib/jasmine/Rakefile +146 -0
  15. data/lib/jasmine/cruise_config.rb +21 -0
  16. data/lib/jasmine/doc/files.html +460 -0
  17. data/lib/jasmine/doc/index.html +322 -0
  18. data/lib/jasmine/doc/symbols/_global_.html +918 -0
  19. data/lib/jasmine/doc/symbols/jasmine.Block.html +417 -0
  20. data/lib/jasmine/doc/symbols/jasmine.Clock.html +678 -0
  21. data/lib/jasmine/doc/symbols/jasmine.Env.html +1169 -0
  22. data/lib/jasmine/doc/symbols/jasmine.JsApiReporter.html +822 -0
  23. data/lib/jasmine/doc/symbols/jasmine.Matchers.html +1474 -0
  24. data/lib/jasmine/doc/symbols/jasmine.MultiReporter.html +394 -0
  25. data/lib/jasmine/doc/symbols/jasmine.NestedResults.html +710 -0
  26. data/lib/jasmine/doc/symbols/jasmine.Reporter.html +574 -0
  27. data/lib/jasmine/doc/symbols/jasmine.Runner.html +710 -0
  28. data/lib/jasmine/doc/symbols/jasmine.Spec.html +1253 -0
  29. data/lib/jasmine/doc/symbols/jasmine.Spy.html +855 -0
  30. data/lib/jasmine/doc/symbols/jasmine.Suite.html +705 -0
  31. data/lib/jasmine/doc/symbols/jasmine.html +1345 -0
  32. data/lib/jasmine/doc/symbols/jasmine.util.html +535 -0
  33. data/lib/jasmine/doc/symbols/src/lib_TrivialReporter.js.html +124 -0
  34. data/lib/jasmine/doc/symbols/src/src_Block.js.html +29 -0
  35. data/lib/jasmine/doc/symbols/src/src_Env.js.html +248 -0
  36. data/lib/jasmine/doc/symbols/src/src_JsApiReporter.js.html +111 -0
  37. data/lib/jasmine/doc/symbols/src/src_Matchers.js.html +344 -0
  38. data/lib/jasmine/doc/symbols/src/src_MultiReporter.js.html +36 -0
  39. data/lib/jasmine/doc/symbols/src/src_NestedResults.js.html +88 -0
  40. data/lib/jasmine/doc/symbols/src/src_PrettyPrinter.js.html +130 -0
  41. data/lib/jasmine/doc/symbols/src/src_Queue.js.html +102 -0
  42. data/lib/jasmine/doc/symbols/src/src_Reporter.js.html +35 -0
  43. data/lib/jasmine/doc/symbols/src/src_Reporters.js.html +51 -0
  44. data/lib/jasmine/doc/symbols/src/src_Runner.js.html +75 -0
  45. data/lib/jasmine/doc/symbols/src/src_Spec.js.html +214 -0
  46. data/lib/jasmine/doc/symbols/src/src_Suite.js.html +77 -0
  47. data/lib/jasmine/doc/symbols/src/src_WaitsBlock.js.html +21 -0
  48. data/lib/jasmine/doc/symbols/src/src_WaitsForBlock.js.html +45 -0
  49. data/lib/jasmine/doc/symbols/src/src_base.js.html +585 -0
  50. data/lib/jasmine/doc/symbols/src/src_mock-timeout.js.html +185 -0
  51. data/lib/jasmine/doc/symbols/src/src_util.js.html +75 -0
  52. data/lib/jasmine/example/example_runner.html +22 -0
  53. data/lib/jasmine/example/spec/example_suite.js +11 -0
  54. data/lib/jasmine/images/fail-16.png +0 -0
  55. data/lib/jasmine/images/fail.png +0 -0
  56. data/lib/jasmine/images/go-16.png +0 -0
  57. data/lib/jasmine/images/go.png +0 -0
  58. data/lib/jasmine/images/pending-16.png +0 -0
  59. data/lib/jasmine/images/pending.png +0 -0
  60. data/lib/jasmine/images/question-bk.png +0 -0
  61. data/lib/jasmine/images/questionbk-16.png +0 -0
  62. data/lib/jasmine/images/spinner.gif +0 -0
  63. data/lib/jasmine/lib/TrivialReporter.js +171 -0
  64. data/lib/jasmine/lib/consolex.js +28 -0
  65. data/lib/jasmine/lib/jasmine-0.10.4.js +2371 -0
  66. data/lib/jasmine/lib/jasmine.css +166 -0
  67. data/lib/jasmine/lib/json2.js +478 -0
  68. data/lib/jasmine/spec/jasmine_helper.rb +44 -0
  69. data/lib/jasmine/spec/jasmine_spec.rb +31 -0
  70. data/lib/jasmine/spec/runner.html +80 -0
  71. data/lib/jasmine/spec/saucelabs.yml +24 -0
  72. data/lib/jasmine/spec/suites/CustomMatchersSpec.js +112 -0
  73. data/lib/jasmine/spec/suites/EnvSpec.js +158 -0
  74. data/lib/jasmine/spec/suites/ExceptionsSpec.js +107 -0
  75. data/lib/jasmine/spec/suites/JsApiReporterSpec.js +96 -0
  76. data/lib/jasmine/spec/suites/MatchersSpec.js +709 -0
  77. data/lib/jasmine/spec/suites/MockClockSpec.js +34 -0
  78. data/lib/jasmine/spec/suites/MultiReporterSpec.js +30 -0
  79. data/lib/jasmine/spec/suites/NestedResultsSpec.js +54 -0
  80. data/lib/jasmine/spec/suites/PrettyPrintSpec.js +93 -0
  81. data/lib/jasmine/spec/suites/QueueSpec.js +23 -0
  82. data/lib/jasmine/spec/suites/ReporterSpec.js +60 -0
  83. data/lib/jasmine/spec/suites/RunnerSpec.js +267 -0
  84. data/lib/jasmine/spec/suites/SpecRunningSpec.js +1195 -0
  85. data/lib/jasmine/spec/suites/SpecSpec.js +110 -0
  86. data/lib/jasmine/spec/suites/SpySpec.js +201 -0
  87. data/lib/jasmine/spec/suites/SuiteSpec.js +120 -0
  88. data/lib/jasmine/spec/suites/TrivialReporterSpec.js +158 -0
  89. data/lib/jasmine/spec/suites/UtilSpec.js +40 -0
  90. data/lib/jasmine/spec/suites/WaitsForBlockSpec.js +88 -0
  91. data/lib/jasmine/src/Block.js +22 -0
  92. data/lib/jasmine/src/Env.js +263 -0
  93. data/lib/jasmine/src/JsApiReporter.js +104 -0
  94. data/lib/jasmine/src/Matchers.js +336 -0
  95. data/lib/jasmine/src/MultiReporter.js +28 -0
  96. data/lib/jasmine/src/NestedResults.js +80 -0
  97. data/lib/jasmine/src/PrettyPrinter.js +122 -0
  98. data/lib/jasmine/src/Queue.js +94 -0
  99. data/lib/jasmine/src/Reporter.js +27 -0
  100. data/lib/jasmine/src/Reporters.js +43 -0
  101. data/lib/jasmine/src/Runner.js +77 -0
  102. data/lib/jasmine/src/Spec.js +206 -0
  103. data/lib/jasmine/src/Suite.js +82 -0
  104. data/lib/jasmine/src/WaitsBlock.js +13 -0
  105. data/lib/jasmine/src/WaitsForBlock.js +37 -0
  106. data/lib/jasmine/src/base.js +586 -0
  107. data/lib/jasmine/src/mock-timeout.js +177 -0
  108. data/lib/jasmine/src/util.js +67 -0
  109. data/lib/jasmine/src/version.json +5 -0
  110. metadata +238 -0
@@ -0,0 +1,107 @@
1
+ describe('Exceptions:', function() {
2
+ var env;
3
+
4
+ beforeEach(function() {
5
+ env = new jasmine.Env();
6
+ env.updateInterval = 0;
7
+ });
8
+
9
+ it('jasmine.formatException formats Firefox exception messages as expected', function() {
10
+ var sampleFirefoxException = {
11
+ fileName: 'foo.js',
12
+ line: '1978',
13
+ message: 'you got your foo in my bar',
14
+ name: 'A Classic Mistake'
15
+ };
16
+
17
+ var expected = 'A Classic Mistake: you got your foo in my bar in foo.js (line 1978)';
18
+
19
+ expect(jasmine.util.formatException(sampleFirefoxException)).toEqual(expected);
20
+ });
21
+
22
+ it('jasmine.formatException formats Webkit exception messages as expected', function() {
23
+ var sampleWebkitException = {
24
+ sourceURL: 'foo.js',
25
+ lineNumber: '1978',
26
+ message: 'you got your foo in my bar',
27
+ name: 'A Classic Mistake'
28
+ };
29
+
30
+ var expected = 'A Classic Mistake: you got your foo in my bar in foo.js (line 1978)';
31
+
32
+ expect(jasmine.util.formatException(sampleWebkitException)).toEqual(expected);
33
+ });
34
+
35
+ it('should handle exceptions thrown, but continue', function() {
36
+ var fakeTimer = new jasmine.FakeTimer();
37
+ env.setTimeout = fakeTimer.setTimeout;
38
+ env.clearTimeout = fakeTimer.clearTimeout;
39
+ env.setInterval = fakeTimer.setInterval;
40
+ env.clearInterval = fakeTimer.clearInterval;
41
+
42
+ //we run two exception tests to make sure we continue after throwing an exception
43
+ var suite = env.describe('Suite for handles exceptions', function () {
44
+ env.it('should be a test that fails because it throws an exception', function() {
45
+ throw new Error('fake error 1');
46
+ });
47
+
48
+ env.it('should be another test that fails because it throws an exception', function() {
49
+ this.runs(function () {
50
+ throw new Error('fake error 2');
51
+ });
52
+ this.runs(function () {
53
+ this.expect(true).toEqual(true);
54
+ });
55
+ });
56
+
57
+ env.it('should be a passing test that runs after exceptions are thrown', function() {
58
+ this.expect(true).toEqual(true);
59
+ });
60
+
61
+ env.it('should be another test that fails because it throws an exception after a wait', function() {
62
+ this.runs(function () {
63
+ var foo = 'foo';
64
+ });
65
+ this.waits(250);
66
+ this.runs(function () {
67
+ throw new Error('fake error 3');
68
+ });
69
+ });
70
+
71
+ env.it('should be a passing test that runs after exceptions are thrown from a async test', function() {
72
+ this.expect(true).toEqual(true);
73
+ });
74
+ });
75
+
76
+ var runner = env.currentRunner();
77
+ suite.execute();
78
+ fakeTimer.tick(2500);
79
+
80
+ var suiteResults = suite.results();
81
+ var specResults = suiteResults.getItems();
82
+
83
+ expect(suiteResults.passed()).toEqual(false);
84
+ //
85
+ expect(specResults.length).toEqual(5);
86
+ expect(specResults[0].passed()).toMatch(false);
87
+ var blockResults = specResults[0].getItems();
88
+ expect(blockResults[0].passed()).toEqual(false);
89
+ expect(blockResults[0].message).toMatch(/fake error 1/);
90
+
91
+ expect(specResults[1].passed()).toEqual(false);
92
+ var blockResults = specResults[1].getItems();
93
+ expect(blockResults[0].passed()).toEqual(false);
94
+ expect(blockResults[0].message).toMatch(/fake error 2/),
95
+ expect(blockResults[1].passed()).toEqual(true);
96
+
97
+ expect(specResults[2].passed()).toEqual(true);
98
+
99
+ expect(specResults[3].passed()).toEqual(false);
100
+ blockResults = specResults[3].getItems();
101
+ expect(blockResults[0].message).toMatch(/fake error 3/);
102
+
103
+ expect(specResults[4].passed()).toEqual(true);
104
+
105
+ });
106
+
107
+ });
@@ -0,0 +1,96 @@
1
+ describe('jasmine.jsApiReporter', function() {
2
+
3
+
4
+ describe('results', function () {
5
+ var reporter, spec1, spec2, spec3, expectedSpec1Results, expectedSpec2Results;
6
+ var env;
7
+ var suite, nestedSuite, nestedSpec;
8
+
9
+ beforeEach(function() {
10
+ env = new jasmine.Env();
11
+ env.updateInterval = 0;
12
+
13
+ suite = env.describe("top-level suite", function() {
14
+ spec1 = env.it("spec 1", function() {
15
+ this.expect(true).toEqual(true);
16
+
17
+ });
18
+
19
+ spec2 = env.it("spec 2", function() {
20
+ this.expect(true).toEqual(false);
21
+ });
22
+
23
+ nestedSuite = env.describe("nested suite", function() {
24
+ nestedSpec = env.it("nested spec", function() {
25
+ expect(true).toEqual(true);
26
+ })
27
+ });
28
+
29
+ spec3 = env.it("spec 3", function() {
30
+ this.log('some debug message');
31
+ });
32
+ });
33
+
34
+ reporter = new jasmine.JsApiReporter();
35
+ env.addReporter(reporter);
36
+
37
+ env.execute();
38
+ });
39
+
40
+ xit('resultForSpec() should return the result for the given spec', function () {
41
+ expect(reporter.resultsForSpec(spec1.id)).toEqual(expectedSpec1Results);
42
+ expect(reporter.resultsForSpec(spec2.id)).toEqual(expectedSpec2Results);
43
+
44
+ });
45
+
46
+ xit('results() should return a hash of all results, indexed by spec id', function () {
47
+ expect(reporter.results()[spec1.id]).toEqual(expectedSpec1Results);
48
+ expect(reporter.results()[spec2.id]).toEqual(expectedSpec2Results);
49
+ });
50
+
51
+ it("should return nested suites as children of their parents", function() {
52
+ expect(reporter.suites()).toEqual([
53
+ { id: 0, name: 'top-level suite', type: 'suite',
54
+ children: [
55
+ { id: 0, name: 'spec 1', type: 'spec', children: [ ] },
56
+ { id: 1, name: 'spec 2', type: 'spec', children: [ ] },
57
+ { id: 1, name: 'nested suite', type: 'suite',
58
+ children: [
59
+ { id: 2, name: 'nested spec', type: 'spec', children: [ ] }
60
+ ]
61
+ },
62
+ { id: 3, name: 'spec 3', type: 'spec', children: [ ] }
63
+ ]
64
+ }
65
+ ]);
66
+ });
67
+
68
+ xdescribe("#summarizeResult_", function() {
69
+ it("should summarize a passing result", function() {
70
+ var result = reporter.results()[spec1.id];
71
+ var summarizedResult = reporter.summarizeResult_(result);
72
+ expect(summarizedResult.result).toEqual('passed');
73
+ expect(summarizedResult.messages.length).toEqual(1);
74
+ expect(summarizedResult.messages[0].message).toEqual(result.messages[0].message);
75
+ expect(summarizedResult.messages[0].passed).toBeTruthy();
76
+ expect(summarizedResult.messages[0].type).toEqual('ExpectationResult');
77
+ expect(summarizedResult.messages[0].text).toEqual(jasmine.undefined);
78
+ expect(summarizedResult.messages[0].trace.stack).toEqual(jasmine.undefined);
79
+ });
80
+
81
+ it("should have a stack trace for failing specs", function() {
82
+ var result = reporter.results()[spec2.id];
83
+ var summarizedResult = reporter.summarizeResult_(result);
84
+ expect(summarizedResult.result).toEqual('failed');
85
+ expect(summarizedResult.messages[0].trace.stack).toEqual(result.messages[0].trace.stack);
86
+ });
87
+
88
+ it("should have messages for specs with messages", function() {
89
+ var result = reporter.results()[spec3.id];
90
+ var summarizedResult = reporter.summarizeResult_(result);
91
+ expect(summarizedResult.result).toEqual('passed');
92
+ expect(summarizedResult.messages[0].text).toEqual('some debug message');
93
+ });
94
+ });
95
+ });
96
+ });
@@ -0,0 +1,709 @@
1
+ describe("jasmine.Matchers", function() {
2
+ var env, spec;
3
+
4
+ beforeEach(function() {
5
+ env = new jasmine.Env();
6
+ env.updateInterval = 0;
7
+
8
+ var suite = env.describe("suite", function() {
9
+ spec = env.it("spec", function() {
10
+ });
11
+ });
12
+ spyOn(spec, 'addMatcherResult');
13
+ });
14
+
15
+ function match(value) {
16
+ return spec.expect(value);
17
+ }
18
+
19
+ function lastResult() {
20
+ return spec.addMatcherResult.mostRecentCall.args[0];
21
+ }
22
+
23
+ it("toEqual with primitives, objects, dates, html nodes, etc.", function() {
24
+ expect(match(true).toEqual(true)).toEqual(true);
25
+
26
+ expect(match({foo:'bar'}).toEqual(null)).toEqual(false);
27
+
28
+ var functionA = function() {
29
+ return 'hi';
30
+ };
31
+ var functionB = function() {
32
+ return 'hi';
33
+ };
34
+ expect(match({foo:functionA}).toEqual({foo:functionB})).toEqual(false);
35
+ expect(match({foo:functionA}).toEqual({foo:functionA})).toEqual(true);
36
+
37
+ expect((match(false).toEqual(true))).toEqual(false);
38
+
39
+ var circularGraph = {};
40
+ circularGraph.referenceToSelf = circularGraph;
41
+ expect((match(circularGraph).toEqual(circularGraph))).toEqual(true);
42
+
43
+ var nodeA = document.createElement('div');
44
+ var nodeB = document.createElement('div');
45
+ expect((match(nodeA).toEqual(nodeA))).toEqual(true);
46
+ expect((match(nodeA).toEqual(nodeB))).toEqual(false);
47
+
48
+ expect((match(new Date(2008, 1, 3, 15, 17, 19, 1234)).toEqual(new Date(2009, 1, 3, 15, 17, 19, 1234)))).toEqual(false);
49
+ expect((match(new Date(2008, 1, 3, 15, 17, 19, 1234)).toEqual(new Date(2008, 1, 3, 15, 17, 19, 1234)))).toEqual(true);
50
+
51
+
52
+ expect(match(true).toNotEqual(false)).toEqual(true);
53
+ expect((match(true).toNotEqual(true))).toEqual(false);
54
+
55
+ expect((match(['a', 'b']).toEqual(['a', jasmine.undefined]))).toEqual(false);
56
+ expect((match(['a', 'b']).toEqual(['a', 'b', jasmine.undefined]))).toEqual(false);
57
+
58
+ expect((match(new String("cat")).toEqual("cat"))).toBe(true);
59
+ expect((match(new String("cat")).toNotEqual("cat"))).toBe(false);
60
+
61
+ expect((match(new Number(5)).toEqual(5))).toBe(true);
62
+ expect((match(new Number('5')).toEqual(5))).toBe(true);
63
+ expect((match(new Number(5)).toNotEqual(5))).toBe(false);
64
+ expect((match(new Number('5')).toNotEqual(5))).toBe(false);
65
+ });
66
+
67
+ it("toEqual to build an Expectation Result", function() {
68
+ var actual = 'a';
69
+ var matcher = match(actual);
70
+ var expected = 'b';
71
+ matcher.toEqual(expected);
72
+
73
+ var result = lastResult();
74
+
75
+ expect(result.matcherName).toEqual("toEqual");
76
+ expect(result.passed()).toEqual(false);
77
+ expect(result.message).toMatch(jasmine.pp(actual));
78
+ expect(result.message).toMatch(jasmine.pp(expected));
79
+ expect(result.expected).toEqual(expected);
80
+ expect(result.actual).toEqual(actual);
81
+ });
82
+
83
+ it("toNotEqual to build an Expectation Result", function() {
84
+ var str = 'a';
85
+ var matcher = match(str);
86
+ matcher.toNotEqual(str);
87
+
88
+ var result = lastResult();
89
+
90
+ expect(result.matcherName).toEqual("toNotEqual");
91
+ expect(result.passed()).toEqual(false);
92
+ expect(result.message).toMatch(jasmine.pp(str));
93
+ expect(result.message).toMatch('not');
94
+ expect(result.expected).toEqual(str);
95
+ expect(result.actual).toEqual(str);
96
+ });
97
+
98
+ it('toBe should return true only if the expected and actual items === each other', function() {
99
+ var a = {};
100
+ var b = {};
101
+ //noinspection UnnecessaryLocalVariableJS
102
+ var c = a;
103
+ expect((match(a).toBe(b))).toEqual(false);
104
+ expect((match(a).toBe(a))).toEqual(true);
105
+ expect((match(a).toBe(c))).toEqual(true);
106
+ expect((match(a).toNotBe(b))).toEqual(true);
107
+ expect((match(a).toNotBe(a))).toEqual(false);
108
+ expect((match(a).toNotBe(c))).toEqual(false);
109
+ });
110
+
111
+ it("toBe to build an ExpectationResult", function() {
112
+ var expected = 'b';
113
+ var actual = 'a';
114
+ var matcher = match(actual);
115
+ matcher.toBe(expected);
116
+
117
+ var result = lastResult();
118
+
119
+ expect(result.matcherName).toEqual("toBe");
120
+ expect(result.passed()).toEqual(false);
121
+ expect(result.message).toMatch(jasmine.pp(actual));
122
+ expect(result.message).toMatch(jasmine.pp(expected));
123
+ expect(result.expected).toEqual(expected);
124
+ expect(result.actual).toEqual(actual);
125
+ });
126
+
127
+ it("toNotBe to build an ExpectationResult", function() {
128
+ var str = 'a';
129
+ var matcher = match(str);
130
+ matcher.toNotBe(str);
131
+
132
+ var result = lastResult();
133
+
134
+ expect(result.matcherName).toEqual("toNotBe");
135
+ expect(result.passed()).toEqual(false);
136
+ expect(result.message).toMatch(str);
137
+ expect(result.expected).toEqual(str);
138
+ expect(result.actual).toEqual(str);
139
+ });
140
+
141
+ it("toMatch and #toNotMatch should perform regular expression matching on strings", function() {
142
+ expect((match('foobarbel').toMatch(/bar/))).toEqual(true);
143
+ expect((match('foobazbel').toMatch(/bar/))).toEqual(false);
144
+
145
+ expect((match('foobarbel').toMatch("bar"))).toEqual(true);
146
+ expect((match('foobazbel').toMatch("bar"))).toEqual(false);
147
+
148
+ expect((match('foobarbel').toNotMatch(/bar/))).toEqual(false);
149
+ expect((match('foobazbel').toNotMatch(/bar/))).toEqual(true);
150
+
151
+ expect((match('foobarbel').toNotMatch("bar"))).toEqual(false);
152
+ expect((match('foobazbel').toNotMatch("bar"))).toEqual(true);
153
+ });
154
+
155
+ it("toMatch w/ RegExp to build an ExpectationResult", function() {
156
+ var actual = 'a';
157
+ var matcher = match(actual);
158
+ var expected = /b/;
159
+ matcher.toMatch(expected);
160
+
161
+ var result = lastResult();
162
+
163
+ expect(result.matcherName).toEqual("toMatch");
164
+ expect(result.passed()).toEqual(false);
165
+ expect(result.message).toMatch(jasmine.pp(actual));
166
+ expect(result.message).toMatch(expected.toString());
167
+ expect(result.expected).toEqual(expected);
168
+ expect(result.actual).toEqual(actual);
169
+ });
170
+
171
+ it("toMatch w/ String to build an ExpectationResult", function() {
172
+ var actual = 'a';
173
+ var matcher = match(actual);
174
+ var expected = 'b';
175
+ matcher.toMatch(expected);
176
+
177
+ var result = lastResult();
178
+
179
+ expect(result.matcherName).toEqual("toMatch");
180
+ expect(result.passed()).toEqual(false);
181
+ expect(result.message).toEqual("Expected 'a' to match 'b'.");
182
+ expect(result.expected).toEqual(expected);
183
+ expect(result.actual).toEqual(actual);
184
+ });
185
+
186
+ it("toNotMatch w/ RegExp to build an ExpectationResult", function() {
187
+ var actual = 'a';
188
+ var matcher = match(actual);
189
+ var expected = /a/;
190
+ matcher.toNotMatch(expected);
191
+
192
+ var result = lastResult();
193
+
194
+ expect(result.matcherName).toEqual("toNotMatch");
195
+ expect(result.passed()).toEqual(false);
196
+ expect(result.message).toEqual("Expected 'a' to not match /a/.");
197
+ expect(result.expected).toEqual(expected);
198
+ expect(result.actual).toEqual(actual);
199
+ });
200
+
201
+ it("toNotMatch w/ String to build an ExpectationResult", function() {
202
+ var str = 'a';
203
+ var matcher = match(str);
204
+ matcher.toNotMatch(str);
205
+
206
+ var result = lastResult();
207
+
208
+ expect(result.matcherName).toEqual("toNotMatch");
209
+ expect(result.passed()).toEqual(false);
210
+ expect(result.message).toEqual("Expected 'a' to not match 'a'.");
211
+ expect(result.expected).toEqual(str);
212
+ expect(result.actual).toEqual(str);
213
+ });
214
+
215
+ it("toBeDefined", function() {
216
+ expect(match('foo').toBeDefined()).toEqual(true);
217
+ expect(match(jasmine.undefined).toBeDefined()).toEqual(false);
218
+ });
219
+
220
+ it("toBeDefined to build an ExpectationResult", function() {
221
+ var matcher = match(jasmine.undefined);
222
+ matcher.toBeDefined();
223
+
224
+ var result = lastResult();
225
+
226
+ expect(result.matcherName).toEqual("toBeDefined");
227
+ expect(result.passed()).toEqual(false);
228
+ expect(result.message).toEqual('Expected undefined to be defined.');
229
+ expect(result.actual).toEqual(jasmine.undefined);
230
+ });
231
+
232
+ it("toBeUndefined", function() {
233
+ expect(match('foo').toBeUndefined()).toEqual(false);
234
+ expect(match(jasmine.undefined).toBeUndefined()).toEqual(true);
235
+ });
236
+
237
+ it("toBeNull", function() {
238
+ expect(match(null).toBeNull()).toEqual(true);
239
+ expect(match(jasmine.undefined).toBeNull()).toEqual(false);
240
+ expect(match("foo").toBeNull()).toEqual(false);
241
+ });
242
+
243
+ it("toBeNull w/ String to build an ExpectationResult", function() {
244
+ var actual = 'a';
245
+ var matcher = match(actual);
246
+ matcher.toBeNull();
247
+
248
+ var result = lastResult();
249
+
250
+ expect(result.matcherName).toEqual("toBeNull");
251
+ expect(result.passed()).toEqual(false);
252
+ expect(result.message).toMatch(jasmine.pp(actual));
253
+ expect(result.message).toMatch('null');
254
+ expect(result.actual).toEqual(actual);
255
+ });
256
+
257
+ it("toBeNull w/ Object to build an ExpectationResult", function() {
258
+ var actual = {a: 'b'};
259
+ var matcher = match(actual);
260
+ matcher.toBeNull();
261
+
262
+ var result = lastResult();
263
+
264
+ expect(result.matcherName).toEqual("toBeNull");
265
+ expect(result.passed()).toEqual(false);
266
+ expect(result.message).toMatch(jasmine.pp(actual));
267
+ expect(result.message).toMatch('null');
268
+ expect(result.actual).toEqual(actual);
269
+ });
270
+
271
+ it("toBeFalsy", function() {
272
+ expect(match(false).toBeFalsy()).toEqual(true);
273
+ expect(match(true).toBeFalsy()).toEqual(false);
274
+ expect(match(jasmine.undefined).toBeFalsy()).toEqual(true);
275
+ expect(match(0).toBeFalsy()).toEqual(true);
276
+ expect(match("").toBeFalsy()).toEqual(true);
277
+ });
278
+
279
+ it("toBeFalsy to build an ExpectationResult", function() {
280
+ var actual = 'a';
281
+ var matcher = match(actual);
282
+ matcher.toBeFalsy();
283
+
284
+ var result = lastResult();
285
+
286
+ expect(result.matcherName).toEqual("toBeFalsy");
287
+ expect(result.passed()).toEqual(false);
288
+ expect(result.message).toMatch(jasmine.pp(actual));
289
+ expect(result.message).toMatch('falsy');
290
+ expect(result.actual).toEqual(actual);
291
+ });
292
+
293
+ it("toBeTruthy", function() {
294
+ expect(match(false).toBeTruthy()).toEqual(false);
295
+ expect(match(true).toBeTruthy()).toEqual(true);
296
+ expect(match(jasmine.undefined).toBeTruthy()).toEqual(false);
297
+ expect(match(0).toBeTruthy()).toEqual(false);
298
+ expect(match("").toBeTruthy()).toEqual(false);
299
+ expect(match("hi").toBeTruthy()).toEqual(true);
300
+ expect(match(5).toBeTruthy()).toEqual(true);
301
+ expect(match({foo: 1}).toBeTruthy()).toEqual(true);
302
+ });
303
+
304
+ it("toBeTruthy to build an ExpectationResult", function() {
305
+ var matcher = match(false);
306
+ matcher.toBeTruthy();
307
+
308
+ var result = lastResult();
309
+
310
+ expect(result.matcherName).toEqual("toBeTruthy");
311
+ expect(result.passed()).toEqual(false);
312
+ expect(result.message).toEqual("Expected false to be truthy.");
313
+ expect(result.actual).toEqual(false);
314
+ });
315
+
316
+ it("toEqual", function() {
317
+ expect(match(jasmine.undefined).toEqual(jasmine.undefined)).toEqual(true);
318
+ expect(match({foo:'bar'}).toEqual({foo:'bar'})).toEqual(true);
319
+ expect(match("foo").toEqual({bar: jasmine.undefined})).toEqual(false);
320
+ expect(match({foo: jasmine.undefined}).toEqual("goo")).toEqual(false);
321
+ expect(match({foo: {bar :jasmine.undefined}}).toEqual("goo")).toEqual(false);
322
+ });
323
+
324
+ it("toEqual with jasmine.any()", function() {
325
+ expect(match("foo").toEqual(jasmine.any(String))).toEqual(true);
326
+ expect(match(3).toEqual(jasmine.any(Number))).toEqual(true);
327
+ expect(match("foo").toEqual(jasmine.any(Function))).toEqual(false);
328
+ expect(match("foo").toEqual(jasmine.any(Object))).toEqual(false);
329
+ expect(match({someObj:'foo'}).toEqual(jasmine.any(Object))).toEqual(true);
330
+ expect(match({someObj:'foo'}).toEqual(jasmine.any(Function))).toEqual(false);
331
+ expect(match(function() {
332
+ }).toEqual(jasmine.any(Object))).toEqual(false);
333
+ expect(match(["foo", "goo"]).toEqual(["foo", jasmine.any(String)])).toEqual(true);
334
+ expect(match(function() {
335
+ }).toEqual(jasmine.any(Function))).toEqual(true);
336
+ expect(match(["a", function() {
337
+ }]).toEqual(["a", jasmine.any(Function)])).toEqual(true);
338
+ });
339
+
340
+ it("toEqual handles circular objects ok", function() {
341
+ expect(match({foo: "bar", baz: jasmine.undefined}).toEqual({foo: "bar", baz: jasmine.undefined})).toEqual(true);
342
+ expect(match({foo:['bar','baz','quux']}).toEqual({foo:['bar','baz','quux']})).toEqual(true);
343
+ expect(match({foo: {bar:'baz'}, quux:'corge'}).toEqual({foo:{bar:'baz'}, quux:'corge'})).toEqual(true);
344
+
345
+ var circularObject = {};
346
+ var secondCircularObject = {};
347
+ circularObject.field = circularObject;
348
+ secondCircularObject.field = secondCircularObject;
349
+ expect(match(circularObject).toEqual(secondCircularObject)).toEqual(true);
350
+ });
351
+
352
+ it("toNotEqual as slightly surprising behavior, but is it intentional?", function() {
353
+ expect(match({x:"x", y:"y", z:"w"}).toNotEqual({x:"x", y:"y", z:"z"})).toEqual(true);
354
+ expect(match({x:"x", y:"y", w:"z"}).toNotEqual({x:"x", y:"y", z:"z"})).toEqual(true);
355
+ expect(match({x:"x", y:"y", z:"z"}).toNotEqual({w: "w", x:"x", y:"y", z:"z"})).toEqual(true);
356
+ expect(match({w: "w", x:"x", y:"y", z:"z"}).toNotEqual({x:"x", y:"y", z:"z"})).toEqual(true);
357
+ });
358
+
359
+ it("toEqual handles arrays", function() {
360
+ expect(match([1, "A"]).toEqual([1, "A"])).toEqual(true);
361
+ });
362
+
363
+ it("toContain and toNotContain", function() {
364
+ expect(match('ABC').toContain('A')).toEqual(true);
365
+ expect(match('ABC').toContain('X')).toEqual(false);
366
+
367
+ expect(match(['A', 'B', 'C']).toContain('A')).toEqual(true);
368
+ expect(match(['A', 'B', 'C']).toContain('F')).toEqual(false);
369
+ expect(match(['A', 'B', 'C']).toNotContain('F')).toEqual(true);
370
+ expect(match(['A', 'B', 'C']).toNotContain('A')).toEqual(false);
371
+
372
+ expect(match(['A', {some:'object'}, 'C']).toContain({some:'object'})).toEqual(true);
373
+ expect(match(['A', {some:'object'}, 'C']).toContain({some:'other object'})).toEqual(false);
374
+ });
375
+
376
+ it("toContain to build an ExpectationResult", function() {
377
+ var actual = ['a','b','c'];
378
+ var matcher = match(actual);
379
+ var expected = 'x';
380
+ matcher.toContain(expected);
381
+
382
+ var result = lastResult();
383
+
384
+ expect(result.matcherName).toEqual("toContain");
385
+ expect(result.passed()).toEqual(false);
386
+ expect(result.message).toMatch(jasmine.pp(actual));
387
+ expect(result.message).toMatch('contain');
388
+ expect(result.message).toMatch(jasmine.pp(expected));
389
+ expect(result.actual).toEqual(actual);
390
+ expect(result.expected).toEqual(expected);
391
+ });
392
+
393
+ it("toNotContain to build an ExpectationResult", function() {
394
+ var actual = ['a','b','c'];
395
+ var matcher = match(actual);
396
+ var expected = 'b';
397
+ matcher.toNotContain(expected);
398
+
399
+ var result = lastResult();
400
+
401
+ expect(result.matcherName).toEqual("toNotContain");
402
+ expect(result.passed()).toEqual(false);
403
+ expect(result.message).toMatch(jasmine.pp(actual));
404
+ expect(result.message).toMatch('not contain');
405
+ expect(result.message).toMatch(jasmine.pp(expected));
406
+ expect(result.actual).toEqual(actual);
407
+ expect(result.expected).toEqual(expected);
408
+ });
409
+
410
+ it("toBeLessThan should pass if actual is less than expected", function() {
411
+ expect(match(37).toBeLessThan(42)).toEqual(true);
412
+ expect(match(37).toBeLessThan(-42)).toEqual(false);
413
+ expect(match(37).toBeLessThan(37)).toEqual(false);
414
+ });
415
+
416
+ it("toBeLessThan to build an ExpectationResult", function() {
417
+ var actual = 3;
418
+ var matcher = match(actual);
419
+ var expected = 1;
420
+ matcher.toBeLessThan(expected);
421
+
422
+ var result = lastResult();
423
+
424
+ expect(result.matcherName).toEqual("toBeLessThan");
425
+ expect(result.passed()).toEqual(false);
426
+ expect(result.message).toMatch(jasmine.pp(actual) + ' to be less than');
427
+ expect(result.message).toMatch(jasmine.pp(expected));
428
+ expect(result.actual).toEqual(actual);
429
+ expect(result.expected).toEqual(expected);
430
+ });
431
+
432
+ it("toBeGreaterThan should pass if actual is greater than expected", function() {
433
+ expect(match(37).toBeGreaterThan(42)).toEqual(false);
434
+ expect(match(37).toBeGreaterThan(-42)).toEqual(true);
435
+ expect(match(37).toBeGreaterThan(37)).toEqual(false);
436
+ });
437
+
438
+ it("toBeGreaterThan to build an ExpectationResult", function() {
439
+ var actual = 1;
440
+ var matcher = match(actual);
441
+ var expected = 3;
442
+ matcher.toBeGreaterThan(expected);
443
+
444
+ var result = lastResult();
445
+
446
+ expect(result.matcherName).toEqual("toBeGreaterThan");
447
+ expect(result.passed()).toEqual(false);
448
+ expect(result.message).toMatch(jasmine.pp(actual) + ' to be greater than');
449
+ expect(result.message).toMatch(jasmine.pp(expected));
450
+ expect(result.actual).toEqual(actual);
451
+ expect(result.expected).toEqual(expected);
452
+ });
453
+
454
+ it("toThrow", function() {
455
+ var expected = match(function() {
456
+ throw new Error("Fake Error");
457
+ });
458
+ expect(expected.toThrow()).toEqual(true);
459
+ expect(expected.toThrow("Fake Error")).toEqual(true);
460
+ expect(expected.toThrow(new Error("Fake Error"))).toEqual(true);
461
+
462
+ expect(expected.toThrow("Other Error")).toEqual(false);
463
+ var result = lastResult();
464
+ expect(result.message).toMatch("Other Error");
465
+
466
+ expect(expected.toThrow(new Error("Other Error"))).toEqual(false);
467
+ result = lastResult();
468
+ expect(result.message).toMatch("Other Error");
469
+
470
+ var exception;
471
+ try {
472
+ (function () {
473
+ new jasmine.Matchers(env, 'not-a-function', spec).toThrow();
474
+ })();
475
+ } catch (e) {
476
+ exception = e;
477
+ }
478
+
479
+ expect(exception).toBeDefined();
480
+ expect(exception.message).toEqual('Actual is not a function');
481
+
482
+
483
+ expect(match(function() {
484
+ }).toThrow()).toEqual(false);
485
+ result = lastResult();
486
+ expect(result.message).toEqual('Expected function to throw an exception.');
487
+ });
488
+
489
+ describe(".not.matcher", function() {
490
+ it("should invert the sense of any matcher", function() {
491
+ expect(match(37).not.toBeGreaterThan(42)).toEqual(true);
492
+ expect(match(42).not.toBeGreaterThan(37)).toEqual(false);
493
+ expect(match("abc").not.toEqual("def")).toEqual(true);
494
+ expect(match("abc").not.toEqual("abc")).toEqual(false);
495
+ });
496
+
497
+ it("should provide an inverted default message", function() {
498
+ match(37).not.toBeGreaterThan(42);
499
+ expect(lastResult().message).toEqual("Passed.");
500
+
501
+ match(42).not.toBeGreaterThan(37);
502
+ expect(lastResult().message).toEqual("Expected 42 not to be greater than 37.");
503
+ });
504
+
505
+ it("should use the second message when the matcher sets an array of custom messages", function() {
506
+ spec.addMatchers({
507
+ custom: function() {
508
+ this.message = function() {
509
+ return ['Expected it was called.', 'Expected it wasn\'t called.'];
510
+ };
511
+ return this.actual;
512
+ }
513
+ });
514
+
515
+ match(true).custom();
516
+ expect(lastResult().message).toEqual("Passed.");
517
+ match(false).custom();
518
+ expect(lastResult().message).toEqual("Expected it was called.");
519
+ match(true).not.custom();
520
+ expect(lastResult().message).toEqual("Expected it wasn't called.");
521
+ match(false).not.custom();
522
+ expect(lastResult().message).toEqual("Passed.");
523
+ });
524
+
525
+ it("should make old-style custom matchers blow up, but only when negated", function() {
526
+ spec.addMatchers({
527
+ custom: function() {
528
+ this.report();
529
+ }
530
+ });
531
+
532
+ expect(function() {
533
+ match(true).custom();
534
+ }).not.toThrow();
535
+
536
+ expect(function() {
537
+ match(true).not.custom();
538
+ }).toThrow();
539
+ });
540
+ });
541
+
542
+ describe("spy matchers >>", function() {
543
+ var TestClass;
544
+ beforeEach(function() {
545
+ TestClass = {
546
+ normalFunction: function() {
547
+ },
548
+ spyFunction: jasmine.createSpy("My spy")
549
+ };
550
+ });
551
+
552
+ function shouldThrowAnExceptionWhenInvokedOnANonSpy(methodName) {
553
+ return function() {
554
+ expect(function() {
555
+ match(TestClass.normalFunction)[methodName]();
556
+ }).toThrow('Expected a spy, but got Function.');
557
+
558
+ expect(function() {
559
+ match(jasmine.undefined)[methodName]();
560
+ }).toThrow('Expected a spy, but got undefined.');
561
+
562
+ expect(function() {
563
+ match({some:'object'})[methodName]();
564
+ }).toThrow('Expected a spy, but got { some : \'object\' }.');
565
+
566
+ expect(function() {
567
+ match("<b>")[methodName]();
568
+ }).toThrow('Expected a spy, but got \'<b>\'.');
569
+ };
570
+ }
571
+
572
+ describe("wasCalled", function() {
573
+ it("should pass iff the spy was called", function() {
574
+ expect(match(TestClass.spyFunction).wasCalled()).toEqual(false);
575
+
576
+ TestClass.spyFunction();
577
+ expect(match(TestClass.spyFunction).wasCalled()).toEqual(true);
578
+ });
579
+
580
+ it("should throw an exception when invoked with any arguments", function() {
581
+ expect(function() {
582
+ match(TestClass.normalFunction).wasCalled("unwanted argument");
583
+ }).toThrow('wasCalled does not take arguments, use wasCalledWith');
584
+ });
585
+
586
+ it('should throw an exception when invoked on a non-spy', shouldThrowAnExceptionWhenInvokedOnANonSpy('wasCalled'));
587
+ });
588
+
589
+ describe("wasNotCalled", function() {
590
+ it("should pass iff the spy was not called", function() {
591
+ expect(match(TestClass.spyFunction).wasNotCalled()).toEqual(true);
592
+
593
+ TestClass.spyFunction();
594
+ expect(match(TestClass.spyFunction).wasNotCalled()).toEqual(false);
595
+ });
596
+
597
+ it("should throw an exception when invoked with any arguments", function() {
598
+ expect(function() {
599
+ match(TestClass.normalFunction).wasNotCalled("unwanted argument");
600
+ }).toThrow('wasNotCalled does not take arguments');
601
+ });
602
+
603
+ it('should throw an exception when invoked on a non-spy', shouldThrowAnExceptionWhenInvokedOnANonSpy('wasNotCalled'));
604
+ });
605
+
606
+ describe("wasCalledWith", function() {
607
+ it('wasCalledWith should return true if it was called with the expected args', function() {
608
+ TestClass.spyFunction('a', 'b', 'c');
609
+ expect(match(TestClass.spyFunction).wasCalledWith('a', 'b', 'c')).toEqual(true);
610
+ });
611
+
612
+ it('should return false if it was not called with the expected args', function() {
613
+ TestClass.spyFunction('a', 'b', 'c');
614
+ var expected = match(TestClass.spyFunction);
615
+ expect(expected.wasCalledWith('c', 'b', 'a')).toEqual(false);
616
+ var result = lastResult();
617
+ expect(result.passed()).toEqual(false);
618
+ expect(result.expected).toEqual(['c', 'b', 'a']);
619
+ expect(result.actual.mostRecentCall.args).toEqual(['a', 'b', 'c']);
620
+ expect(result.message).toContain(jasmine.pp(result.expected));
621
+ expect(result.message).toContain(jasmine.pp(result.actual.mostRecentCall.args));
622
+ });
623
+
624
+ it('should return false if it was not called', function() {
625
+ var expected = match(TestClass.spyFunction);
626
+ expect(expected.wasCalledWith('c', 'b', 'a')).toEqual(false);
627
+ var result = lastResult();
628
+ expect(result.passed()).toEqual(false);
629
+ expect(result.expected).toEqual(['c', 'b', 'a']);
630
+ expect(result.actual.argsForCall).toEqual([]);
631
+ expect(result.message).toContain(jasmine.pp(result.expected));
632
+ });
633
+
634
+ it('should allow matches across multiple calls', function() {
635
+ var expected = match(TestClass.spyFunction);
636
+ TestClass.spyFunction('a', 'b', 'c');
637
+ TestClass.spyFunction('d', 'e', 'f');
638
+ expect(expected.wasCalledWith('a', 'b', 'c')).toEqual(true);
639
+ expect(expected.wasCalledWith('d', 'e', 'f')).toEqual(true);
640
+ expect(expected.wasCalledWith('x', 'y', 'z')).toEqual(false);
641
+ });
642
+
643
+ it('should throw an exception when invoked on a non-spy', shouldThrowAnExceptionWhenInvokedOnANonSpy('wasCalledWith'));
644
+
645
+ describe("to build an ExpectationResult", function () {
646
+ beforeEach(function() {
647
+ var currentSuite;
648
+ var spec;
649
+ currentSuite = env.describe('default current suite', function() {
650
+ spec = env.it();
651
+ }, spec);
652
+ TestClass = { someFunction: function(a, b) {
653
+ } };
654
+ spec.spyOn(TestClass, 'someFunction');
655
+ });
656
+
657
+ it("should should handle the case of a spy", function() {
658
+ TestClass.someFunction('a', 'c');
659
+ var matcher = match(TestClass.someFunction);
660
+ matcher.wasCalledWith('a', 'b');
661
+
662
+ var result = lastResult();
663
+ expect(result.matcherName).toEqual("wasCalledWith");
664
+ expect(result.passed()).toEqual(false);
665
+ expect(result.message).toContain(jasmine.pp(['a', 'b']));
666
+ expect(result.message).toContain(jasmine.pp(['a', 'c']));
667
+ expect(result.actual).toEqual(TestClass.someFunction);
668
+ expect(result.expected).toEqual(['a','b']);
669
+ });
670
+ });
671
+ });
672
+
673
+ describe("wasNotCalledWith", function() {
674
+ it('should return true if the spy was NOT called with the expected args', function() {
675
+ TestClass.spyFunction('a', 'b', 'c');
676
+ expect(match(TestClass.spyFunction).wasNotCalledWith('c', 'b', 'a')).toEqual(true);
677
+ });
678
+
679
+ it('should return false if it WAS called with the expected args', function() {
680
+ TestClass.spyFunction('a', 'b', 'c');
681
+ var expected = match(TestClass.spyFunction);
682
+ expect(expected.wasNotCalledWith('a', 'b', 'c')).toEqual(false);
683
+ var result = lastResult();
684
+ expect(result.passed()).toEqual(false);
685
+ expect(result.expected).toEqual(['a', 'b', 'c']);
686
+ expect(result.actual.mostRecentCall.args).toEqual(['a', 'b', 'c']);
687
+ expect(result.message).toContain(jasmine.pp(result.expected));
688
+ });
689
+
690
+ it('should return true if it was not called', function() {
691
+ var expected = match(TestClass.spyFunction);
692
+ expect(expected.wasNotCalledWith('c', 'b', 'a')).toEqual(true);
693
+ });
694
+
695
+ it('should allow matches across multiple calls', function() {
696
+ var expected = match(TestClass.spyFunction);
697
+ TestClass.spyFunction('a', 'b', 'c');
698
+ TestClass.spyFunction('d', 'e', 'f');
699
+ expect(expected.wasNotCalledWith('a', 'b', 'c')).toEqual(false);
700
+ expect(expected.wasNotCalledWith('d', 'e', 'f')).toEqual(false);
701
+ expect(expected.wasNotCalledWith('x', 'y', 'z')).toEqual(true);
702
+ });
703
+
704
+ it('should throw an exception when invoked on a non-spy', shouldThrowAnExceptionWhenInvokedOnANonSpy('wasNotCalledWith'));
705
+
706
+ });
707
+
708
+ });
709
+ });