jasmine 1.0.1.1 → 1.0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/.gitignore +11 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +5 -0
  4. data/HOW_TO_TEST.markdown +11 -0
  5. data/README.markdown +42 -14
  6. data/RELEASE.markdown +22 -0
  7. data/Rakefile +76 -0
  8. data/generators/jasmine/jasmine_generator.rb +15 -13
  9. data/generators/jasmine/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  10. data/install.rb +2 -0
  11. data/jasmine.gemspec +52 -0
  12. data/jasmine/Gemfile +6 -0
  13. data/jasmine/MIT.LICENSE +20 -0
  14. data/jasmine/README.markdown +28 -0
  15. data/jasmine/Rakefile +182 -0
  16. data/jasmine/cruise_config.rb +21 -0
  17. data/jasmine/example/spec/PlayerSpec.js +58 -0
  18. data/jasmine/example/spec/SpecHelper.js +9 -0
  19. data/jasmine/example/src/Player.js +22 -0
  20. data/jasmine/example/src/Song.js +7 -0
  21. data/jasmine/images/fail-16.png +0 -0
  22. data/jasmine/images/fail.png +0 -0
  23. data/jasmine/images/go-16.png +0 -0
  24. data/jasmine/images/go.png +0 -0
  25. data/jasmine/images/pending-16.png +0 -0
  26. data/jasmine/images/pending.png +0 -0
  27. data/jasmine/images/question-bk.png +0 -0
  28. data/jasmine/images/questionbk-16.png +0 -0
  29. data/jasmine/images/spinner.gif +0 -0
  30. data/jasmine/jsdoc-template/allclasses.tmpl +17 -0
  31. data/jasmine/jsdoc-template/allfiles.tmpl +56 -0
  32. data/jasmine/jsdoc-template/class.tmpl +646 -0
  33. data/jasmine/jsdoc-template/index.tmpl +39 -0
  34. data/jasmine/jsdoc-template/publish.js +184 -0
  35. data/jasmine/jsdoc-template/static/default.css +162 -0
  36. data/jasmine/jsdoc-template/static/header.html +2 -0
  37. data/jasmine/jsdoc-template/static/index.html +19 -0
  38. data/jasmine/jsdoc-template/symbol.tmpl +35 -0
  39. data/jasmine/spec/runner.html +80 -0
  40. data/jasmine/spec/suites/BaseSpec.js +27 -0
  41. data/jasmine/spec/suites/CustomMatchersSpec.js +97 -0
  42. data/jasmine/spec/suites/EnvSpec.js +158 -0
  43. data/jasmine/spec/suites/ExceptionsSpec.js +107 -0
  44. data/jasmine/spec/suites/JsApiReporterSpec.js +103 -0
  45. data/jasmine/spec/suites/MatchersSpec.js +795 -0
  46. data/jasmine/spec/suites/MockClockSpec.js +38 -0
  47. data/jasmine/spec/suites/MultiReporterSpec.js +45 -0
  48. data/jasmine/spec/suites/NestedResultsSpec.js +54 -0
  49. data/jasmine/spec/suites/PrettyPrintSpec.js +93 -0
  50. data/jasmine/spec/suites/QueueSpec.js +23 -0
  51. data/jasmine/spec/suites/ReporterSpec.js +56 -0
  52. data/jasmine/spec/suites/RunnerSpec.js +267 -0
  53. data/jasmine/spec/suites/SpecRunningSpec.js +1253 -0
  54. data/jasmine/spec/suites/SpecSpec.js +124 -0
  55. data/jasmine/spec/suites/SpySpec.js +201 -0
  56. data/jasmine/spec/suites/SuiteSpec.js +120 -0
  57. data/jasmine/spec/suites/TrivialReporterSpec.js +238 -0
  58. data/jasmine/spec/suites/UtilSpec.js +40 -0
  59. data/jasmine/spec/suites/WaitsForBlockSpec.js +87 -0
  60. data/jasmine/src/Block.js +22 -0
  61. data/jasmine/src/Env.js +264 -0
  62. data/jasmine/src/JsApiReporter.js +102 -0
  63. data/jasmine/src/Matchers.js +354 -0
  64. data/jasmine/src/MultiReporter.js +35 -0
  65. data/jasmine/src/NestedResults.js +80 -0
  66. data/jasmine/src/PrettyPrinter.js +122 -0
  67. data/jasmine/src/Queue.js +99 -0
  68. data/jasmine/src/Reporter.js +31 -0
  69. data/jasmine/src/Runner.js +77 -0
  70. data/jasmine/src/Spec.js +242 -0
  71. data/jasmine/src/Suite.js +82 -0
  72. data/jasmine/src/WaitsBlock.js +13 -0
  73. data/jasmine/src/WaitsForBlock.js +52 -0
  74. data/jasmine/src/base.js +589 -0
  75. data/jasmine/src/html/TrivialReporter.js +188 -0
  76. data/jasmine/src/html/jasmine.css +166 -0
  77. data/jasmine/src/mock-timeout.js +183 -0
  78. data/jasmine/src/util.js +67 -0
  79. data/jasmine/src/version.json +5 -0
  80. data/lib/generators/jasmine/examples/USAGE +11 -0
  81. data/lib/generators/jasmine/examples/examples_generator.rb +19 -0
  82. data/lib/generators/jasmine/examples/templates/public/javascripts/jasmine_examples/Player.js +22 -0
  83. data/lib/generators/jasmine/examples/templates/public/javascripts/jasmine_examples/Song.js +7 -0
  84. data/lib/generators/jasmine/examples/templates/spec/javascripts/helpers/SpecHelper.js +9 -0
  85. data/lib/generators/jasmine/examples/templates/spec/javascripts/jasmine_examples/PlayerSpec.js +58 -0
  86. data/lib/generators/jasmine/install/USAGE +11 -0
  87. data/lib/generators/jasmine/install/install_generator.rb +18 -0
  88. data/lib/generators/jasmine/install/templates/spec/javascripts/helpers/.gitkeep +0 -0
  89. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +81 -0
  90. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  91. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine_runner.rb +20 -0
  92. data/lib/generators/jasmine/jasmine_generator.rb +32 -0
  93. data/lib/generators/jasmine/templates/INSTALL +9 -0
  94. data/lib/generators/jasmine/templates/lib/tasks/jasmine.rake +2 -0
  95. data/lib/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +81 -0
  96. data/lib/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +73 -0
  97. data/lib/generators/jasmine/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  98. data/lib/generators/jasmine/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
  99. data/lib/jasmine.rb +31 -6
  100. data/lib/jasmine/command_line_tool.rb +1 -0
  101. data/lib/jasmine/config.rb +16 -44
  102. data/lib/jasmine/generator.rb +9 -0
  103. data/lib/jasmine/selenium_driver.rb +18 -18
  104. data/lib/jasmine/server.rb +0 -24
  105. data/lib/jasmine/spec_builder.rb +4 -4
  106. data/lib/jasmine/tasks/jasmine.rake +2 -2
  107. data/lib/jasmine/version.rb +3 -0
  108. data/spec/config_spec.rb +174 -123
  109. data/spec/fixture/jasmine.erb.yml +4 -0
  110. data/spec/jasmine_pojs_spec.rb +51 -0
  111. data/spec/jasmine_rails2_spec.rb +93 -0
  112. data/spec/jasmine_rails3_spec.rb +71 -0
  113. data/spec/spec_helper.rb +8 -2
  114. metadata +215 -65
  115. data/spec/bug_fixes_spec.rb +0 -32
  116. data/spec/rails_generator_spec.rb +0 -31
@@ -0,0 +1,124 @@
1
+ describe('Spec', function () {
2
+ var env, suite;
3
+ beforeEach(function() {
4
+ env = new jasmine.Env();
5
+ env.updateInterval = 0;
6
+ suite = new jasmine.Suite(env, 'suite 1');
7
+ });
8
+
9
+ describe('initialization', function () {
10
+
11
+ it('should raise an error if an env is not passed', function () {
12
+ try {
13
+ new jasmine.Spec();
14
+ }
15
+ catch (e) {
16
+ expect(e.message).toEqual('jasmine.Env() required');
17
+ }
18
+ });
19
+
20
+ it('should raise an error if a suite is not passed', function () {
21
+ try {
22
+ new jasmine.Spec(env);
23
+ }
24
+ catch (e) {
25
+ expect(e.message).toEqual('jasmine.Suite() required');
26
+ }
27
+ });
28
+
29
+ it('should assign sequential ids for specs belonging to the same env', function () {
30
+ var spec1 = new jasmine.Spec(env, suite);
31
+ var spec2 = new jasmine.Spec(env, suite);
32
+ var spec3 = new jasmine.Spec(env, suite);
33
+ expect(spec1.id).toEqual(0);
34
+ expect(spec2.id).toEqual(1);
35
+ expect(spec3.id).toEqual(2);
36
+ });
37
+ });
38
+
39
+ it('getFullName returns suite & spec description', function () {
40
+ var spec = new jasmine.Spec(env, suite, 'spec 1');
41
+ expect(spec.getFullName()).toEqual('suite 1 spec 1.')
42
+ });
43
+
44
+ describe('results', function () {
45
+ var spec, results;
46
+ beforeEach(function () {
47
+ spec = new jasmine.Spec(env, suite);
48
+ results = spec.results();
49
+ expect(results.totalCount).toEqual(0);
50
+ spec.runs(function () {
51
+ this.expect(true).toEqual(true);
52
+ this.expect(true).toEqual(true);
53
+ });
54
+ });
55
+
56
+
57
+ it('results shows the total number of expectations for each spec after execution', function () {
58
+ expect(results.totalCount).toEqual(0);
59
+ spec.execute();
60
+ expect(results.totalCount).toEqual(2);
61
+ });
62
+
63
+ it('results shows the number of passed expectations for each spec after execution', function () {
64
+ expect(results.passedCount).toEqual(0);
65
+ spec.execute();
66
+ expect(results.passedCount).toEqual(2);
67
+ });
68
+
69
+ it('results shows the number of failed expectations for each spec after execution', function () {
70
+ spec.runs(function () {
71
+ this.expect(true).toEqual(false);
72
+ });
73
+ expect(results.failedCount).toEqual(0);
74
+ spec.execute();
75
+ expect(results.failedCount).toEqual(1);
76
+ });
77
+
78
+ describe('results.passed', function () {
79
+ it('is true if all spec expectations pass', function () {
80
+ spec.runs(function () {
81
+ this.expect(true).toEqual(true);
82
+ });
83
+ spec.execute();
84
+ expect(results.passed()).toEqual(true);
85
+ });
86
+
87
+ it('is false if one spec expectation fails', function () {
88
+ spec.runs(function () {
89
+ this.expect(true).toEqual(false);
90
+ });
91
+ spec.execute();
92
+ expect(results.passed()).toEqual(false);
93
+ });
94
+
95
+ it('a spec with no expectations will return true', function () {
96
+ var specWithoutExpectations = new jasmine.Spec(env, suite);
97
+ specWithoutExpectations.runs(function() {
98
+
99
+ });
100
+ specWithoutExpectations.execute();
101
+ expect(results.passed()).toEqual(true);
102
+ });
103
+
104
+ it('an unexecuted spec will return true', function () {
105
+ expect(results.passed()).toEqual(true);
106
+ });
107
+ });
108
+
109
+ it("includes log messages, which may contain arbitary objects", function() {
110
+ spec.runs(function() {
111
+ this.log("here's some log message", {key: 'value'}, 123);
112
+ });
113
+ spec.execute();
114
+ var items = results.getItems();
115
+ expect(items).toEqual([
116
+ jasmine.any(jasmine.ExpectationResult),
117
+ jasmine.any(jasmine.ExpectationResult),
118
+ jasmine.any(jasmine.MessageResult)
119
+ ]);
120
+ var logResult = items[2];
121
+ expect(logResult.values).toEqual(["here's some log message", {key: 'value'}, 123]);
122
+ });
123
+ });
124
+ });
@@ -0,0 +1,201 @@
1
+ describe('Spies', function () {
2
+ it('should replace the specified function with a spy object', function() {
3
+ var originalFunctionWasCalled = false;
4
+ var TestClass = {
5
+ someFunction: function() {
6
+ originalFunctionWasCalled = true;
7
+ }
8
+ };
9
+ this.spyOn(TestClass, 'someFunction');
10
+
11
+ expect(TestClass.someFunction.wasCalled).toEqual(false);
12
+ expect(TestClass.someFunction.callCount).toEqual(0);
13
+ TestClass.someFunction('foo');
14
+ expect(TestClass.someFunction.wasCalled).toEqual(true);
15
+ expect(TestClass.someFunction.callCount).toEqual(1);
16
+ expect(TestClass.someFunction.mostRecentCall.args).toEqual(['foo']);
17
+ expect(TestClass.someFunction.mostRecentCall.object).toEqual(TestClass);
18
+ expect(originalFunctionWasCalled).toEqual(false);
19
+
20
+ TestClass.someFunction('bar');
21
+ expect(TestClass.someFunction.callCount).toEqual(2);
22
+ expect(TestClass.someFunction.mostRecentCall.args).toEqual(['bar']);
23
+ });
24
+
25
+ it('should allow you to view args for a particular call', function() {
26
+ var originalFunctionWasCalled = false;
27
+ var TestClass = {
28
+ someFunction: function() {
29
+ originalFunctionWasCalled = true;
30
+ }
31
+ };
32
+ this.spyOn(TestClass, 'someFunction');
33
+
34
+ TestClass.someFunction('foo');
35
+ TestClass.someFunction('bar');
36
+ expect(TestClass.someFunction.calls[0].args).toEqual(['foo']);
37
+ expect(TestClass.someFunction.calls[1].args).toEqual(['bar']);
38
+ expect(TestClass.someFunction.mostRecentCall.args).toEqual(['bar']);
39
+ });
40
+
41
+ it('should be possible to call through to the original method, or return a specific result', function() {
42
+ var originalFunctionWasCalled = false;
43
+ var passedArgs;
44
+ var passedObj;
45
+ var TestClass = {
46
+ someFunction: function() {
47
+ originalFunctionWasCalled = true;
48
+ passedArgs = arguments;
49
+ passedObj = this;
50
+ return "return value from original function";
51
+ }
52
+ };
53
+
54
+ this.spyOn(TestClass, 'someFunction').andCallThrough();
55
+ var result = TestClass.someFunction('arg1', 'arg2');
56
+ expect(result).toEqual("return value from original function");
57
+ expect(originalFunctionWasCalled).toEqual(true);
58
+ expect(passedArgs).toEqual(['arg1', 'arg2']);
59
+ expect(passedObj).toEqual(TestClass);
60
+ expect(TestClass.someFunction.wasCalled).toEqual(true);
61
+ });
62
+
63
+ it('should be possible to return a specific value', function() {
64
+ var originalFunctionWasCalled = false;
65
+ var TestClass = {
66
+ someFunction: function() {
67
+ originalFunctionWasCalled = true;
68
+ return "return value from original function";
69
+ }
70
+ };
71
+
72
+ this.spyOn(TestClass, 'someFunction').andReturn("some value");
73
+ originalFunctionWasCalled = false;
74
+ var result = TestClass.someFunction('arg1', 'arg2');
75
+ expect(result).toEqual("some value");
76
+ expect(originalFunctionWasCalled).toEqual(false);
77
+ });
78
+
79
+ it('should be possible to throw a specific error', function() {
80
+ var originalFunctionWasCalled = false;
81
+ var TestClass = {
82
+ someFunction: function() {
83
+ originalFunctionWasCalled = true;
84
+ return "return value from original function";
85
+ }
86
+ };
87
+
88
+ this.spyOn(TestClass, 'someFunction').andThrow(new Error('fake error'));
89
+ var exception;
90
+ try {
91
+ TestClass.someFunction('arg1', 'arg2');
92
+ } catch (e) {
93
+ exception = e;
94
+ }
95
+ expect(exception.message).toEqual('fake error');
96
+ expect(originalFunctionWasCalled).toEqual(false);
97
+ });
98
+
99
+ it('should be possible to call a specified function', function() {
100
+ var originalFunctionWasCalled = false;
101
+ var fakeFunctionWasCalled = false;
102
+ var passedArgs;
103
+ var passedObj;
104
+ var TestClass = {
105
+ someFunction: function() {
106
+ originalFunctionWasCalled = true;
107
+ return "return value from original function";
108
+ }
109
+ };
110
+
111
+ this.spyOn(TestClass, 'someFunction').andCallFake(function() {
112
+ fakeFunctionWasCalled = true;
113
+ passedArgs = arguments;
114
+ passedObj = this;
115
+ return "return value from fake function";
116
+ });
117
+
118
+ var result = TestClass.someFunction('arg1', 'arg2');
119
+ expect(result).toEqual("return value from fake function");
120
+ expect(originalFunctionWasCalled).toEqual(false);
121
+ expect(fakeFunctionWasCalled).toEqual(true);
122
+ expect(passedArgs).toEqual(['arg1', 'arg2']);
123
+ expect(passedObj).toEqual(TestClass);
124
+ expect(TestClass.someFunction.wasCalled).toEqual(true);
125
+ });
126
+
127
+ it('is torn down when this.removeAllSpies is called', function() {
128
+ var originalFunctionWasCalled = false;
129
+ var TestClass = {
130
+ someFunction: function() {
131
+ originalFunctionWasCalled = true;
132
+ }
133
+ };
134
+ this.spyOn(TestClass, 'someFunction');
135
+
136
+ TestClass.someFunction('foo');
137
+ expect(originalFunctionWasCalled).toEqual(false);
138
+
139
+ this.removeAllSpies();
140
+
141
+ TestClass.someFunction('foo');
142
+ expect(originalFunctionWasCalled).toEqual(true);
143
+ });
144
+
145
+ it('calls removeAllSpies during spec finish', function() {
146
+ var test = new jasmine.Spec(new jasmine.Env(), {}, 'sample test');
147
+
148
+ this.spyOn(test, 'removeAllSpies');
149
+
150
+ test.finish();
151
+
152
+ expect(test.removeAllSpies).wasCalled();
153
+ });
154
+
155
+ it('throws an exception when some method is spied on twice', function() {
156
+ var TestClass = { someFunction: function() {
157
+ } };
158
+ this.spyOn(TestClass, 'someFunction');
159
+ var exception;
160
+ try {
161
+ this.spyOn(TestClass, 'someFunction');
162
+ } catch (e) {
163
+ exception = e;
164
+ }
165
+ expect(exception).toBeDefined();
166
+ });
167
+
168
+ it('should be able to reset a spy', function() {
169
+ var TestClass = { someFunction: function() {} };
170
+ this.spyOn(TestClass, 'someFunction');
171
+
172
+ expect(TestClass.someFunction).not.toHaveBeenCalled();
173
+ TestClass.someFunction();
174
+ expect(TestClass.someFunction).toHaveBeenCalled();
175
+ TestClass.someFunction.reset();
176
+ expect(TestClass.someFunction).not.toHaveBeenCalled();
177
+ expect(TestClass.someFunction.callCount).toEqual(0);
178
+ });
179
+
180
+ describe("createSpyObj", function() {
181
+ it("should create an object with a bunch of spy methods when you call jasmine.createSpyObj()", function() {
182
+ var spyObj = jasmine.createSpyObj('BaseName', ['method1', 'method2']);
183
+ expect(spyObj).toEqual({ method1: jasmine.any(Function), method2: jasmine.any(Function)});
184
+ expect(spyObj.method1.identity).toEqual('BaseName.method1');
185
+ expect(spyObj.method2.identity).toEqual('BaseName.method2');
186
+ });
187
+
188
+ it("should throw if you do not pass an array argument", function() {
189
+ expect(function() {
190
+ jasmine.createSpyObj('BaseName');
191
+ }).toThrow('createSpyObj requires a non-empty array of method names to create spies for');
192
+ });
193
+
194
+ it("should throw if you pass an empty array argument", function() {
195
+ expect(function() {
196
+ jasmine.createSpyObj('BaseName');
197
+ }).toThrow('createSpyObj requires a non-empty array of method names to create spies for');
198
+ });
199
+ });
200
+
201
+ });
@@ -0,0 +1,120 @@
1
+ describe('Suite', function() {
2
+ var fakeTimer;
3
+ var env;
4
+
5
+ beforeEach(function() {
6
+ env = new jasmine.Env();
7
+ env.updateInterval = 0;
8
+
9
+ fakeTimer = new jasmine.FakeTimer();
10
+ env.setTimeout = fakeTimer.setTimeout;
11
+ env.clearTimeout = fakeTimer.clearTimeout;
12
+ env.setInterval = fakeTimer.setInterval;
13
+ env.clearInterval = fakeTimer.clearInterval;
14
+ });
15
+
16
+ describe('Specs', function () {
17
+ var suite;
18
+
19
+ beforeEach(function() {
20
+ suite = env.describe('Suite 1', function () {
21
+ env.it('Spec 1', function() {
22
+ this.runs(function () {
23
+ this.expect(true).toEqual(true);
24
+ });
25
+ });
26
+ env.it('Spec 2', function() {
27
+ this.runs(function () {
28
+ this.expect(true).toEqual(true);
29
+ });
30
+ });
31
+ env.describe('Suite 2', function () {
32
+ env.it('Spec 3', function() {
33
+ this.runs(function () {
34
+ this.expect(true).toEqual(true);
35
+ });
36
+ });
37
+ });
38
+ env.it('Spec 4', function() {
39
+ this.runs(function () {
40
+ this.expect(true).toEqual(true);
41
+ });
42
+ });
43
+ });
44
+ });
45
+
46
+ it('#specs should return all immediate children that are specs.', function () {
47
+ var suiteSpecs = suite.specs();
48
+ expect(suiteSpecs.length).toEqual(3);
49
+ expect(suiteSpecs[0].description).toEqual('Spec 1');
50
+ expect(suiteSpecs[1].description).toEqual('Spec 2');
51
+ expect(suiteSpecs[2].description).toEqual('Spec 4');
52
+ });
53
+
54
+ it("#suites should return all immediate children that are suites.", function() {
55
+ var nestedSuites = suite.suites();
56
+ expect(nestedSuites.length).toEqual(1);
57
+ expect(nestedSuites[0].description).toEqual('Suite 2');
58
+ });
59
+
60
+ it("#children should return all immediate children including suites and specs.", function() {
61
+ var children = suite.children();
62
+ expect(children.length).toEqual(4);
63
+ expect(children[0].description).toEqual('Spec 1');
64
+ expect(children[1].description).toEqual('Spec 2');
65
+ expect(children[2].description).toEqual('Suite 2');
66
+ expect(children[3].description).toEqual('Spec 4');
67
+ });
68
+ });
69
+
70
+ describe('SpecCount', function () {
71
+
72
+ it('should keep a count of the number of specs that are run', function() {
73
+ var suite = env.describe('one suite description', function () {
74
+ env.it('should be a test', function() {
75
+ this.runs(function () {
76
+ this.expect(true).toEqual(true);
77
+ });
78
+ });
79
+ env.it('should be another test', function() {
80
+ this.runs(function () {
81
+ this.expect(true).toEqual(true);
82
+ });
83
+ });
84
+ env.it('should be a third test', function() {
85
+ this.runs(function () {
86
+ this.expect(true).toEqual(true);
87
+ });
88
+ });
89
+ });
90
+
91
+ expect(suite.specs().length).toEqual(3);
92
+ });
93
+
94
+ it('specCount should be correct even with runs/waits blocks', function() {
95
+ var suite = env.describe('one suite description', function () {
96
+ env.it('should be a test', function() {
97
+ this.runs(function () {
98
+ this.expect(true).toEqual(true);
99
+ });
100
+ });
101
+ env.it('should be another test', function() {
102
+ this.runs(function () {
103
+ this.expect(true).toEqual(true);
104
+ });
105
+ this.waits(10);
106
+ this.runs(function () {
107
+ this.expect(true).toEqual(true);
108
+ });
109
+ });
110
+ env.it('should be a third test', function() {
111
+ this.runs(function () {
112
+ this.expect(true).toEqual(true);
113
+ });
114
+ });
115
+ });
116
+
117
+ expect(suite.specs().length).toEqual(3);
118
+ });
119
+ });
120
+ });
@@ -0,0 +1,238 @@
1
+ describe("TrivialReporter", function() {
2
+ var env;
3
+ var trivialReporter;
4
+ var body;
5
+ var fakeDocument;
6
+
7
+ beforeEach(function() {
8
+ env = new jasmine.Env();
9
+ env.updateInterval = 0;
10
+
11
+ body = document.createElement("body");
12
+ fakeDocument = { body: body, location: { search: "" } };
13
+ trivialReporter = new jasmine.TrivialReporter(fakeDocument);
14
+ });
15
+
16
+ function fakeSpec(name) {
17
+ return {
18
+ getFullName: function() {
19
+ return name;
20
+ }
21
+ };
22
+ }
23
+
24
+ function findElements(divs, withClass) {
25
+ var els = [];
26
+ for (var i = 0; i < divs.length; i++) {
27
+ if (divs[i].className == withClass) els.push(divs[i]);
28
+ }
29
+ return els;
30
+ }
31
+
32
+ function findElement(divs, withClass) {
33
+ var els = findElements(divs, withClass);
34
+ if (els.length > 0) return els[0];
35
+ throw new Error("couldn't find div with class " + withClass);
36
+ }
37
+
38
+ it("should run only specs beginning with spec parameter", function() {
39
+ fakeDocument.location.search = "?spec=run%20this";
40
+ expect(trivialReporter.specFilter(fakeSpec("run this"))).toBeTruthy();
41
+ expect(trivialReporter.specFilter(fakeSpec("not the right spec"))).toBeFalsy();
42
+ expect(trivialReporter.specFilter(fakeSpec("not run this"))).toBeFalsy();
43
+ });
44
+
45
+ it("should display empty divs for every suite when the runner is starting", function() {
46
+ trivialReporter.reportRunnerStarting({
47
+ env: env,
48
+ suites: function() {
49
+ return [ new jasmine.Suite({}, "suite 1", null, null) ];
50
+ }
51
+ });
52
+
53
+ var divs = findElements(body.getElementsByTagName("div"), "suite");
54
+ expect(divs.length).toEqual(1);
55
+ expect(divs[0].innerHTML).toContain("suite 1");
56
+ });
57
+
58
+ describe('Matcher reporting', function () {
59
+ var getResultMessageDiv = function (body) {
60
+ var divs = body.getElementsByTagName("div");
61
+ for (var i = 0; i < divs.length; i++) {
62
+ if (divs[i].className.match(/resultMessage/)) {
63
+ return divs[i];
64
+ }
65
+ }
66
+ };
67
+
68
+ var runner, spec, fakeTimer;
69
+ beforeEach(function () {
70
+ fakeTimer = new jasmine.FakeTimer();
71
+ env.setTimeout = fakeTimer.setTimeout;
72
+ env.clearTimeout = fakeTimer.clearTimeout;
73
+ env.setInterval = fakeTimer.setInterval;
74
+ env.clearInterval = fakeTimer.clearInterval;
75
+ runner = env.currentRunner();
76
+ var suite = new jasmine.Suite(env, 'some suite');
77
+ runner.add(suite);
78
+ spec = new jasmine.Spec(env, suite, 'some spec');
79
+ suite.add(spec);
80
+ fakeDocument.location.search = "?";
81
+ env.addReporter(trivialReporter);
82
+ });
83
+
84
+ describe('toContain', function () {
85
+ it('should show actual and expected', function () {
86
+ spec.runs(function () {
87
+ this.expect('foo').toContain('bar');
88
+ });
89
+ runner.execute();
90
+ fakeTimer.tick(0);
91
+
92
+ var resultEl = getResultMessageDiv(body);
93
+ expect(resultEl.innerHTML).toMatch(/foo/);
94
+ expect(resultEl.innerHTML).toMatch(/bar/);
95
+ });
96
+ });
97
+ });
98
+
99
+
100
+ describe("failure messages (integration)", function () {
101
+ var spec, results, expectationResult;
102
+
103
+ beforeEach(function() {
104
+ results = {
105
+ passed: function() {
106
+ return false;
107
+ },
108
+ getItems: function() {
109
+ }};
110
+
111
+ var suite1 = new jasmine.Suite(env, "suite 1", null, null);
112
+
113
+ spec = {
114
+ suite: suite1,
115
+ getFullName: function() {
116
+ return "foo";
117
+ },
118
+ results: function() {
119
+ return results;
120
+ }
121
+ };
122
+
123
+ trivialReporter.reportRunnerStarting({
124
+ env: env,
125
+ suites: function() {
126
+ return [ suite1 ];
127
+ }
128
+ });
129
+ });
130
+
131
+ it("should add the failure message to the DOM (non-toEquals matchers)", function() {
132
+ expectationResult = new jasmine.ExpectationResult({
133
+ matcherName: "toBeNull", passed: false, message: "Expected 'a' to be null, but it was not"
134
+ });
135
+
136
+ spyOn(results, 'getItems').andReturn([expectationResult]);
137
+
138
+ trivialReporter.reportSpecResults(spec);
139
+
140
+ var divs = body.getElementsByTagName("div");
141
+ var errorDiv = findElement(divs, 'resultMessage fail');
142
+ expect(errorDiv.innerHTML).toEqual("Expected 'a' to be null, but it was not");
143
+ });
144
+
145
+ it("should add the failure message to the DOM (non-toEquals matchers) html escaping", function() {
146
+ expectationResult = new jasmine.ExpectationResult({
147
+ matcherName: "toBeNull", passed: false, message: "Expected '1 < 2' to <b>e null, & it was not"
148
+ });
149
+
150
+ spyOn(results, 'getItems').andReturn([expectationResult]);
151
+
152
+ trivialReporter.reportSpecResults(spec);
153
+
154
+ var divs = body.getElementsByTagName("div");
155
+ var errorDiv = findElement(divs, 'resultMessage fail');
156
+ expect(errorDiv.innerHTML).toEqual("Expected '1 &lt; 2' to &lt;b&gt;e null, &amp; it was not");
157
+ });
158
+ });
159
+
160
+ describe("log messages", function() {
161
+ it("should appear in the report", function() {
162
+ env.describe("suite", function() {
163
+ env.it("will have log messages", function() {
164
+ this.log("this is a", "multipart log message");
165
+ });
166
+ });
167
+
168
+ env.addReporter(trivialReporter);
169
+ env.execute();
170
+
171
+ var divs = body.getElementsByTagName("div");
172
+ var errorDiv = findElement(divs, 'resultMessage log');
173
+ expect(errorDiv.innerHTML).toEqual("this is a multipart log message");
174
+ });
175
+
176
+ xit("should work on IE without console.log.apply", function() {
177
+ });
178
+ });
179
+
180
+ describe("duplicate example names", function() {
181
+ it("should report failures correctly", function() {
182
+ var suite1 = env.describe("suite", function() {
183
+ env.it("will have log messages", function() {
184
+ this.log("this one fails!");
185
+ this.expect(true).toBeFalsy();
186
+ });
187
+ });
188
+
189
+ var suite2 = env.describe("suite", function() {
190
+ env.it("will have log messages", function() {
191
+ this.log("this one passes!");
192
+ this.expect(true).toBeTruthy();
193
+ });
194
+ });
195
+
196
+ env.addReporter(trivialReporter);
197
+ env.execute();
198
+
199
+ var divs = body.getElementsByTagName("div");
200
+ var passedSpecDiv = findElement(divs, 'suite passed');
201
+ expect(passedSpecDiv.className).toEqual('suite passed');
202
+ expect(passedSpecDiv.innerHTML).toContain("this one passes!");
203
+ expect(passedSpecDiv.innerHTML).not.toContain("this one fails!");
204
+
205
+ var failedSpecDiv = findElement(divs, 'suite failed');
206
+ expect(failedSpecDiv.className).toEqual('suite failed');
207
+ expect(failedSpecDiv.innerHTML).toContain("this one fails!");
208
+ expect(failedSpecDiv.innerHTML).not.toContain("this one passes!");
209
+ });
210
+ });
211
+
212
+ describe('#reportSpecStarting', function() {
213
+ var spec1;
214
+ beforeEach(function () {
215
+ env.describe("suite 1", function() {
216
+ spec1 = env.it("spec 1", function() {
217
+ });
218
+ });
219
+ });
220
+
221
+ it('DOES NOT log running specs by default', function() {
222
+ spyOn(trivialReporter, 'log');
223
+
224
+ trivialReporter.reportSpecStarting(spec1);
225
+
226
+ expect(trivialReporter.log).not.toHaveBeenCalled();
227
+ });
228
+
229
+ it('logs running specs when log_running_specs is true', function() {
230
+ trivialReporter.logRunningSpecs = true;
231
+ spyOn(trivialReporter, 'log');
232
+
233
+ trivialReporter.reportSpecStarting(spec1);
234
+
235
+ expect(trivialReporter.log).toHaveBeenCalledWith('>> Jasmine Running suite 1 spec 1...');
236
+ });
237
+ });
238
+ });