screw-unit-server 0.3.0 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. data/CHANGES +23 -1
  2. data/README.markdown +10 -3
  3. data/Rakefile +27 -55
  4. data/VERSION.yml +4 -0
  5. data/bin/screw_unit_server +14 -4
  6. data/core/CHANGES +10 -0
  7. data/core/EXAMPLE.html +4 -4
  8. data/core/README.markdown +7 -7
  9. data/core/example/models/man.js +2 -2
  10. data/core/example/spec/suite.html +1 -1
  11. data/core/lib/jquery-1.3.2.js +4376 -0
  12. data/core/lib/jquery.fn.js +2 -1
  13. data/core/lib/jquery.print.js +13 -12
  14. data/core/lib/screw.behaviors.js +11 -9
  15. data/core/lib/screw.builder.js +26 -11
  16. data/core/lib/screw.css +2 -2
  17. data/core/lib/screw.events.js +11 -4
  18. data/core/lib/screw.matchers.js +192 -13
  19. data/core/spec/behaviors_spec.js +11 -1
  20. data/core/spec/matchers_spec.js +288 -9
  21. data/core/spec/print_spec.js +47 -8
  22. data/core/spec/suite.html +2 -1
  23. data/core/spec/with_screw_context_spec.js +9 -0
  24. data/lib/screw_unit.rb +13 -16
  25. data/lib/screw_unit/representations.rb +2 -0
  26. data/lib/screw_unit/representations/spec.html.rb +117 -0
  27. data/spec/functional/functional_spec.rb +14 -3
  28. data/spec/functional/functional_spec_helper.rb +22 -34
  29. data/spec/functional/functional_spec_server_starter.rb +68 -0
  30. data/spec/unit/js_test_core/specs/spec_file_spec.rb +45 -20
  31. data/spec/unit/unit_spec_helper.rb +24 -93
  32. data/vendor/js-test-core/CHANGES +19 -0
  33. data/vendor/js-test-core/Rakefile +2 -1
  34. data/vendor/js-test-core/lib/js_test_core.rb +26 -10
  35. data/vendor/js-test-core/lib/js_test_core/app.rb +12 -0
  36. data/vendor/js-test-core/lib/js_test_core/client.rb +97 -18
  37. data/vendor/js-test-core/lib/js_test_core/configuration.rb +35 -0
  38. data/vendor/js-test-core/lib/js_test_core/extensions.rb +3 -0
  39. data/vendor/js-test-core/lib/js_test_core/extensions/selenium/client/driver.rb +7 -0
  40. data/vendor/js-test-core/lib/js_test_core/extensions/time.rb +6 -0
  41. data/vendor/js-test-core/lib/js_test_core/models.rb +8 -0
  42. data/vendor/js-test-core/lib/js_test_core/models/selenium_session.rb +80 -0
  43. data/vendor/js-test-core/lib/js_test_core/representations.rb +11 -0
  44. data/vendor/js-test-core/lib/js_test_core/representations/dir.html.rb +24 -0
  45. data/vendor/js-test-core/lib/js_test_core/representations/not_found.html.rb +15 -0
  46. data/vendor/js-test-core/lib/js_test_core/representations/page.html.rb +41 -0
  47. data/vendor/js-test-core/lib/js_test_core/representations/spec.html.rb +24 -0
  48. data/vendor/js-test-core/lib/js_test_core/resources.rb +13 -8
  49. data/vendor/js-test-core/lib/js_test_core/resources/core_file.rb +19 -0
  50. data/vendor/js-test-core/lib/js_test_core/resources/file.rb +44 -14
  51. data/vendor/js-test-core/lib/js_test_core/resources/implementations_deprecation.rb +12 -0
  52. data/vendor/js-test-core/lib/js_test_core/resources/not_found.rb +35 -0
  53. data/vendor/js-test-core/lib/js_test_core/resources/resource.rb +16 -0
  54. data/vendor/js-test-core/lib/js_test_core/resources/selenium_session.rb +104 -0
  55. data/vendor/js-test-core/lib/js_test_core/resources/spec_file.rb +63 -0
  56. data/vendor/js-test-core/lib/js_test_core/resources/web_root.rb +5 -56
  57. data/vendor/js-test-core/lib/js_test_core/selenium_server_configuration.rb +48 -0
  58. data/vendor/js-test-core/spec/example_core/subdir/SubDirFile.js +0 -0
  59. data/vendor/js-test-core/spec/example_public/javascripts/large_file.js +59 -0
  60. data/vendor/js-test-core/spec/example_public/javascripts/subdir/bar.js +1 -0
  61. data/vendor/js-test-core/spec/example_specs/custom_dir_and_suite/passing_spec.js +6 -0
  62. data/vendor/js-test-core/spec/example_specs/custom_suite.html +8 -0
  63. data/vendor/js-test-core/spec/example_specs/foo/failing_spec.js +1 -1
  64. data/vendor/js-test-core/spec/example_specs/foo/passing_spec.js +1 -1
  65. data/vendor/js-test-core/spec/spec_helpers/be_http.rb +32 -0
  66. data/vendor/js-test-core/spec/spec_helpers/example_group.rb +36 -0
  67. data/vendor/js-test-core/spec/spec_helpers/fake_selenium_driver.rb +27 -0
  68. data/vendor/js-test-core/spec/spec_helpers/show_test_exceptions.rb +22 -0
  69. data/vendor/js-test-core/spec/unit/js_test_core/client_spec.rb +140 -85
  70. data/vendor/js-test-core/spec/unit/js_test_core/configuration_spec.rb +44 -0
  71. data/vendor/js-test-core/spec/unit/js_test_core/models/selenium_session_spec.rb +85 -0
  72. data/vendor/js-test-core/spec/unit/js_test_core/resources/core_file_spec.rb +60 -0
  73. data/vendor/js-test-core/spec/unit/js_test_core/resources/file_spec.rb +61 -68
  74. data/vendor/js-test-core/spec/unit/js_test_core/resources/implementations_deprecation_spec.rb +18 -0
  75. data/vendor/js-test-core/spec/unit/js_test_core/resources/not_found_spec.rb +51 -0
  76. data/vendor/js-test-core/spec/unit/js_test_core/resources/selenium_session_spec.rb +362 -0
  77. data/vendor/js-test-core/spec/unit/js_test_core/resources/spec_file_spec.rb +120 -0
  78. data/vendor/js-test-core/spec/unit/js_test_core/resources/web_root_spec.rb +14 -89
  79. data/vendor/js-test-core/spec/unit/js_test_core/selenium_server_configuration_spec.rb +49 -0
  80. data/vendor/js-test-core/spec/unit/unit_spec_helper.rb +16 -113
  81. data/vendor/js-test-core/vendor/lucky-luciano/README.markdown +7 -0
  82. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano.rb +4 -0
  83. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/resource.rb +135 -0
  84. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/rspec.rb +4 -0
  85. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/rspec/be_http.rb +32 -0
  86. data/vendor/js-test-core/vendor/lucky-luciano/spec/lucky_luciano/resource_spec.rb +231 -0
  87. data/vendor/js-test-core/vendor/lucky-luciano/spec/spec_helper.rb +48 -0
  88. data/vendor/js-test-core/vendor/lucky-luciano/spec/spec_suite.rb +4 -0
  89. metadata +143 -129
  90. data/core/TODO +0 -2
  91. data/core/lib/jquery-1.2.3.js +0 -3408
  92. data/core/lib/screw.assets.js +0 -36
  93. data/core/lib/screw.server.js +0 -21
  94. data/lib/screw_unit/resources.rb +0 -2
  95. data/lib/screw_unit/resources/spec.rb +0 -37
  96. data/spec/unit/js_test_core/specs/spec_dir_spec.rb +0 -43
  97. data/vendor/js-test-core/lib/js_test_core/rack.rb +0 -2
  98. data/vendor/js-test-core/lib/js_test_core/rack/commonlogger.rb +0 -5
  99. data/vendor/js-test-core/lib/js_test_core/rails_server.rb +0 -22
  100. data/vendor/js-test-core/lib/js_test_core/resources/dir.rb +0 -52
  101. data/vendor/js-test-core/lib/js_test_core/resources/file_not_found.rb +0 -15
  102. data/vendor/js-test-core/lib/js_test_core/resources/runners.rb +0 -15
  103. data/vendor/js-test-core/lib/js_test_core/resources/runners/firefox_runner.rb +0 -75
  104. data/vendor/js-test-core/lib/js_test_core/resources/specs/spec_dir.rb +0 -50
  105. data/vendor/js-test-core/lib/js_test_core/resources/specs/spec_file.rb +0 -17
  106. data/vendor/js-test-core/lib/js_test_core/resources/suite.rb +0 -24
  107. data/vendor/js-test-core/lib/js_test_core/resources/suite_finish.rb +0 -19
  108. data/vendor/js-test-core/lib/js_test_core/selenium.rb +0 -2
  109. data/vendor/js-test-core/lib/js_test_core/selenium/selenium_driver.rb +0 -5
  110. data/vendor/js-test-core/lib/js_test_core/server.rb +0 -111
  111. data/vendor/js-test-core/lib/js_test_core/thin.rb +0 -3
  112. data/vendor/js-test-core/lib/js_test_core/thin/backends/js_test_core_server.rb +0 -9
  113. data/vendor/js-test-core/lib/js_test_core/thin/js_test_core_connection.rb +0 -42
  114. data/vendor/js-test-core/spec/unit/js_test_core/rails_server_spec.rb +0 -45
  115. data/vendor/js-test-core/spec/unit/js_test_core/resources/dir_spec.rb +0 -42
  116. data/vendor/js-test-core/spec/unit/js_test_core/resources/file_not_found_spec.rb +0 -26
  117. data/vendor/js-test-core/spec/unit/js_test_core/resources/runner_spec.rb +0 -24
  118. data/vendor/js-test-core/spec/unit/js_test_core/resources/runners/firefox_runner_spec.rb +0 -197
  119. data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_dir_spec.rb +0 -79
  120. data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_file_spec.rb +0 -42
  121. data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_finish_spec.rb +0 -94
  122. data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_spec.rb +0 -44
  123. data/vendor/js-test-core/spec/unit/js_test_core/server_spec.rb +0 -131
  124. data/vendor/js-test-core/spec/unit/thin/js_test_core_connection_spec.rb +0 -92
@@ -10,7 +10,7 @@
10
10
  });
11
11
  return self;
12
12
  }
13
- }
13
+ };
14
14
  function define(self, name, fn) {
15
15
  self.data(namespacedName(name), fn);
16
16
  };
@@ -21,6 +21,7 @@
21
21
  if (fn) result = fn.apply(item, args)
22
22
  else throw(name + " is not defined");
23
23
  });
24
+
24
25
  return result;
25
26
  };
26
27
  function namespacedName(name) {
@@ -18,10 +18,14 @@
18
18
  var extra = {
19
19
  'input': ['type', 'name', 'value'],
20
20
  'a': ['href', 'target'],
21
- 'form': ['method', 'action']
21
+ 'form': ['method', 'action'],
22
+ 'script': ['src'],
23
+ 'link': ['href'],
24
+ 'img': ['src']
22
25
  };
23
- $.each(properties.concat(extra[obj.tagName.toLowerCase()] || []), function() {
24
- if (obj[this])
26
+
27
+ $.each(properties.concat(extra[obj.tagName.toLowerCase()] || []), function(){
28
+ if (obj[this])
25
29
  result.push(' ' + this.replace('className', 'class') + "=" + $.print(obj[this]))
26
30
  });
27
31
  return "<" + obj.tagName.toLowerCase()
@@ -30,7 +34,7 @@
30
34
  }
31
35
 
32
36
  function print_object(obj, opts) {
33
- var seen = opts.seen || [];
37
+ var seen = opts.seen || [ obj ];
34
38
 
35
39
  var result = [], key, value;
36
40
  for (var k in obj) {
@@ -45,9 +49,6 @@
45
49
  return "{ " + result.join(", ") + " }";
46
50
  }
47
51
 
48
- function print_jquery(obj) {
49
- }
50
-
51
52
  function print_string(value, opts) {
52
53
  var character_substitutions = {
53
54
  '\b': '\\b',
@@ -81,18 +82,18 @@
81
82
  return "undefined";
82
83
  else if (typeof obj == 'boolean')
83
84
  return obj.toString();
84
- else if (!obj && typeof obj == 'number')
85
- return 'NaN';
85
+ else if (typeof obj == 'number')
86
+ return obj.toString();
86
87
  else if (!obj)
87
88
  return "null";
88
89
  else if (typeof obj == 'string')
89
90
  return print_string(obj, opts);
90
91
  else if (obj instanceof RegExp)
91
92
  return obj.toString();
93
+ else if (obj instanceof Array || obj.callee || obj.item)
94
+ return print_array(obj, opts);
92
95
  else if (typeof obj == 'function' || obj instanceof Function)
93
96
  return obj.toString().match(/^([^)]*\))/)[1];
94
- else if (obj instanceof Array)
95
- return print_array(obj, opts);
96
97
  else if (obj.nodeType)
97
98
  return print_element(obj);
98
99
  else if (obj instanceof jQuery)
@@ -104,5 +105,5 @@
104
105
  else
105
106
  return obj.toString().replace(/\n\s*/g, '');
106
107
  }
107
-
108
+
108
109
  })(jQuery);
@@ -2,8 +2,9 @@
2
2
  $(Screw).bind('loaded', function() {
3
3
  $('.status').fn({
4
4
  display: function() {
5
- $(this).text(
6
- $('.passed').length + $('.failed').length + ' test(s), ' + $('.failed').length + ' failure(s)'
5
+ $(this).html(
6
+ $('.passed').length + $('.failed').length + ' test(s), ' + $('.failed').length + ' failure(s)<br />' +
7
+ ((new Date() - Screw.suite_start_time)/1000.0).toString() + " seconds elapsed"
7
8
  );
8
9
  }
9
10
  });
@@ -35,7 +36,7 @@
35
36
  });
36
37
 
37
38
  $('body > .describe').fn({
38
- selector: function() { return 'body > .describe' }
39
+ selector: function() { return 'body > .describe'; }
39
40
  });
40
41
 
41
42
  $('.it').fn({
@@ -62,7 +63,7 @@
62
63
  $(Screw)
63
64
  .queue(function() {
64
65
  self.fn('run');
65
- setTimeout(function() { $(Screw).dequeue() }, 0);
66
+ setTimeout(function() { $(Screw).dequeue(); }, 0);
66
67
  });
67
68
  },
68
69
 
@@ -72,12 +73,13 @@
72
73
  }
73
74
  });
74
75
 
75
- $('.before').fn({
76
- run: function() { $(this).data('screwunit.run')() }
76
+ $('body .before').fn({
77
+ run: function() { $(this).data('screwunit.run')(); }
77
78
  });
78
79
 
79
- $('.after').fn({
80
- run: function() { $(this).data('screwunit.run')() }
80
+ $('body .after').fn({
81
+ run: function() {
82
+ $(this).data('screwunit.run')(); }
81
83
  });
82
84
 
83
85
  $(Screw).trigger('before');
@@ -87,5 +89,5 @@
87
89
  .eq(0).trigger('scroll').end()
88
90
  .fn('enqueue');
89
91
  $(Screw).queue(function() { $(Screw).trigger('after') });
90
- })
92
+ });
91
93
  })(jQuery);
@@ -1,14 +1,28 @@
1
1
  var Screw = (function($) {
2
2
  var screw = {
3
3
  Unit: function(fn) {
4
- var contents = fn.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1];
5
- var fn = new Function("matchers", "specifications",
4
+ var wrappedFn;
5
+ if(fn.length == 0) {
6
+ var contents = fn.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1];
7
+ wrappedFn = new Function("matchers", "specifications",
6
8
  "with (specifications) { with (matchers) { " + contents + " } }"
7
- );
9
+ );
10
+ } else {
11
+ wrappedFn = function(matchers, specifications) {
12
+ var screwContext = {};
13
+ for(var method in matchers) {
14
+ screwContext[method] = matchers[method];
15
+ }
16
+ for(var method in specifications) {
17
+ screwContext[method] = specifications[method];
18
+ }
19
+ fn(screwContext);
20
+ }
21
+ }
8
22
 
9
23
  $(Screw).queue(function() {
10
24
  Screw.Specifications.context.push($('body > .describe'));
11
- fn.call(this, Screw.Matchers, Screw.Specifications);
25
+ wrappedFn.call(this, Screw.Matchers, Screw.Specifications);
12
26
  Screw.Specifications.context.pop();
13
27
  $(this).dequeue();
14
28
  });
@@ -19,7 +33,7 @@ var Screw = (function($) {
19
33
 
20
34
  describe: function(name, fn) {
21
35
  var describe = $('<li class="describe">')
22
- .append($('<h1>').text(name))
36
+ .append($('<h1 />').text(name))
23
37
  .append('<ol class="befores">')
24
38
  .append('<ul class="its">')
25
39
  .append('<ul class="describes">')
@@ -36,7 +50,7 @@ var Screw = (function($) {
36
50
 
37
51
  it: function(name, fn) {
38
52
  var it = $('<li class="it">')
39
- .append($('<h2>').text(name))
53
+ .append($('<h2 />').text(name))
40
54
  .data('screwunit.run', fn);
41
55
 
42
56
  this.context[this.context.length-1]
@@ -45,7 +59,7 @@ var Screw = (function($) {
45
59
  },
46
60
 
47
61
  before: function(fn) {
48
- var before = $('<li class="before">')
62
+ var before = $('<li class="before"></li>')
49
63
  .data('screwunit.run', fn);
50
64
 
51
65
  this.context[this.context.length-1]
@@ -54,7 +68,7 @@ var Screw = (function($) {
54
68
  },
55
69
 
56
70
  after: function(fn) {
57
- var after = $('<li class="after">')
71
+ var after = $('<li class="after"></li>')
58
72
  .data('screwunit.run', fn);
59
73
 
60
74
  this.context[this.context.length-1]
@@ -65,16 +79,17 @@ var Screw = (function($) {
65
79
  };
66
80
 
67
81
  $(screw).queue(function() { $(screw).trigger('loading') });
68
- $(function() {
82
+ $(window).load(function(){
69
83
  $('<div class="describe">')
70
- .append('<h3 class="status">')
84
+ .append('<h3 class="status" />')
71
85
  .append('<ol class="befores">')
72
86
  .append('<ul class="describes">')
73
87
  .append('<ol class="afters">')
74
88
  .appendTo('body');
75
-
89
+
76
90
  $(screw).dequeue();
77
91
  $(screw).trigger('loaded');
78
92
  });
93
+
79
94
  return screw;
80
95
  })(jQuery);
@@ -42,7 +42,7 @@ html {
42
42
  .describes .describe {
43
43
  margin-left: 0.6em;
44
44
  padding-left: 0.6em;
45
- border: 1px dashed grey;
45
+ border: 1px dashed #6E6E6E;
46
46
  }
47
47
 
48
48
  .describes .describe .its {}
@@ -87,4 +87,4 @@ html {
87
87
  cursor: pointer;
88
88
  color: #000 !important;
89
89
  border-bottom: 1px solid #9A8E51;
90
- }
90
+ }
@@ -27,12 +27,19 @@
27
27
  $(this)
28
28
  .addClass('failed')
29
29
  .append($('<p class="error">').text(reason.toString()));
30
- })
30
+
31
+ var file = reason.fileName || reason.sourceURL;
32
+ var line = reason.lineNumber || reason.line;
33
+ if (file || line) {
34
+ $(this).append($('<p class="error"></p>').text('line ' + line + ', ' + file));
35
+ }
36
+ });
31
37
  })
32
38
  .bind('before', function() {
39
+ Screw.suite_start_time = new Date();
33
40
  $('.status').text('Running...');
34
41
  })
35
42
  .bind('after', function() {
36
- $('.status').fn('display')
37
- })
38
- })(jQuery);
43
+ $('body .status').fn('display');
44
+ });
45
+ })(jQuery);
@@ -1,6 +1,21 @@
1
1
  Screw.Matchers = (function($) {
2
2
  return matchers = {
3
3
  expect: function(actual) {
4
+ var funcname = function(f) {
5
+ var s = f.toString().match(/function (\w*)/)[1];
6
+ if ((s == null) || (s.length == 0)) return "anonymous";
7
+ return s;
8
+ };
9
+
10
+ var stacktrace = function() {
11
+ var s = "";
12
+ for(var a = arguments.caller; a != null; a = a.caller) {
13
+ s += funcname(a.callee) + "\n";
14
+ if (a.caller == a) break;
15
+ }
16
+ return s;
17
+ };
18
+
4
19
  return {
5
20
  to: function(matcher, expected, not) {
6
21
  var matched = matcher.match(expected, actual);
@@ -8,35 +23,77 @@ Screw.Matchers = (function($) {
8
23
  throw(matcher.failure_message(expected, actual, not));
9
24
  }
10
25
  },
11
-
26
+
12
27
  to_not: function(matcher, expected) {
13
28
  this.to(matcher, expected, true);
14
29
  }
15
30
  }
16
31
  },
17
-
32
+
18
33
  equal: {
19
34
  match: function(expected, actual) {
35
+ if(expected == actual) return true;
36
+ if(actual == undefined) return false;
37
+
20
38
  if (expected instanceof Array) {
21
39
  for (var i = 0; i < actual.length; i++)
22
40
  if (!Screw.Matchers.equal.match(expected[i], actual[i])) return false;
23
41
  return actual.length == expected.length;
24
42
  } else if (expected instanceof Object) {
25
43
  for (var key in expected)
26
- if (expected[key] != actual[key]) return false;
44
+ if (!this.match(expected[key], actual[key])) return false;
27
45
  for (var key in actual)
28
- if (actual[key] != expected[key]) return false;
46
+ if (!this.match(actual[key], expected[key])) return false;
29
47
  return true;
30
- } else {
31
- return expected == actual;
32
48
  }
49
+ return false;
33
50
  },
34
-
51
+
35
52
  failure_message: function(expected, actual, not) {
36
53
  return 'expected ' + $.print(actual) + (not ? ' to not equal ' : ' to equal ') + $.print(expected);
37
54
  }
38
55
  },
39
-
56
+
57
+ be_gt: {
58
+ match: function(expected, actual) {
59
+ return actual > expected;
60
+ },
61
+
62
+ failure_message: function(expected, actual, not) {
63
+ return 'expected ' + $.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than ' + $.print(expected);
64
+ }
65
+ },
66
+
67
+ be_gte: {
68
+ match: function(expected, actual) {
69
+ return actual >= expected;
70
+ },
71
+
72
+ failure_message: function(expected, actual, not) {
73
+ return 'expected ' + $.print(actual) + (not ? ' to not ' : ' to ') + 'be greater than or equal to ' + $.print(expected);
74
+ }
75
+ },
76
+
77
+ be_lt: {
78
+ match: function(expected, actual) {
79
+ return actual < expected;
80
+ },
81
+
82
+ failure_message: function(expected, actual, not) {
83
+ return 'expected ' + $.print(actual) + (not ? ' to not ' : ' to ') + 'be less than ' + $.print(expected);
84
+ }
85
+ },
86
+
87
+ be_lte: {
88
+ match: function(expected, actual) {
89
+ return actual <= expected;
90
+ },
91
+
92
+ failure_message: function(expected, actual, not) {
93
+ return 'expected ' + $.print(actual) + (not ? ' to not ' : ' to ') + 'be less than or equal to ' + $.print(expected);
94
+ }
95
+ },
96
+
40
97
  match: {
41
98
  match: function(expected, actual) {
42
99
  if (expected.constructor == RegExp)
@@ -44,22 +101,144 @@ Screw.Matchers = (function($) {
44
101
  else
45
102
  return actual.indexOf(expected) > -1;
46
103
  },
47
-
104
+
48
105
  failure_message: function(expected, actual, not) {
49
106
  return 'expected ' + $.print(actual) + (not ? ' to not match ' : ' to match ') + $.print(expected);
50
107
  }
51
108
  },
52
-
109
+
53
110
  be_empty: {
54
111
  match: function(expected, actual) {
55
112
  if (actual.length == undefined) throw(actual.toString() + " does not respond to length");
56
-
113
+
57
114
  return actual.length == 0;
58
115
  },
59
-
116
+
60
117
  failure_message: function(expected, actual, not) {
61
118
  return 'expected ' + $.print(actual) + (not ? ' to not be empty' : ' to be empty');
62
119
  }
120
+ },
121
+
122
+ be_blank: {
123
+ match: function(expected, actual) {
124
+ if (actual == undefined) return true;
125
+ if (typeof(actual) == "string") actual = actual.replace(/^\s*(.*?)\s*$/, "$1");
126
+ return Screw.Matchers.be_empty.match(expected, actual);
127
+ },
128
+
129
+ failure_message: function(expected, actual, not) {
130
+ return 'expected ' + $.print(actual) + (not ? ' to not be blank' : ' to be blank');
131
+ }
132
+ },
133
+
134
+ have_length: {
135
+ match: function(expected, actual) {
136
+ if (actual.length == undefined) throw(actual.toString() + " does not respond to length");
137
+
138
+ return actual.length == expected;
139
+ },
140
+
141
+ failure_message: function(expected, actual, not) {
142
+ return 'expected ' + $.print(actual) + (not ? ' to not' : ' to') + ' have length ' + expected;
143
+ }
144
+ },
145
+
146
+ be_null: {
147
+ match: function(expected, actual) {
148
+ return actual == null;
149
+ },
150
+
151
+ failure_message: function(expected, actual, not) {
152
+ return 'expected ' + $.print(actual) + (not ? ' to not be null' : ' to be null');
153
+ }
154
+ },
155
+
156
+ be_undefined: {
157
+ match: function(expected, actual) {
158
+ return actual == undefined;
159
+ },
160
+
161
+ failure_message: function(expected, actual, not) {
162
+ return 'expected ' + $.print(actual) + (not ? ' to not be undefined' : ' to be undefined');
163
+ }
164
+ },
165
+
166
+ be_true: {
167
+ match: function(expected, actual) {
168
+ return actual;
169
+ },
170
+
171
+ failure_message: function(expected, actual, not) {
172
+ return 'expected ' + $.print(actual) + (not ? ' to not be true' : ' to be true');
173
+ }
174
+ },
175
+
176
+ be_false: {
177
+ match: function(expected, actual) {
178
+ return !actual;
179
+ },
180
+
181
+ failure_message: function(expected, actual, not) {
182
+ return 'expected ' + $.print(actual) + (not ? ' to not be false' : ' to be false');
183
+ }
184
+ },
185
+
186
+ match_html: {
187
+ munge: function(mungee) {
188
+ if (mungee instanceof jQuery) {
189
+ mungee = mungee.html();
190
+ } else if (typeof(mungee) == "string") {
191
+ var span = document.createElement("span");
192
+ span.innerHTML = mungee;
193
+ mungee = span.innerHTML;
194
+ }
195
+
196
+ var regEx = /\sjQuery\d+=['"]\d+['"]/g;
197
+ mungee = mungee.replace(regEx, "");
198
+
199
+ return mungee;
200
+ },
201
+
202
+ match: function(expected, actual) {
203
+ var trimmedExpected = this.munge(expected);
204
+ var trimmedActual = this.munge(actual);
205
+ return trimmedActual.indexOf(trimmedExpected) > -1;
206
+ },
207
+
208
+ failure_message: function(expected, actual, not) {
209
+ var trimmedExpected = this.munge(expected);
210
+ var trimmedActual = this.munge(actual);
211
+ return 'expected ' + $.print(trimmedActual, { max_string: 300 }) +
212
+ (not ? ' to not contain ' : ' to contain ') + $.print(trimmedExpected, { max_string: 300 });
213
+ }
214
+ },
215
+
216
+ match_selector: {
217
+ match: function(expected, actual) {
218
+ if (!(actual instanceof jQuery)) {
219
+ throw expected.toString() + " must be an instance of jQuery to match against a selector"
220
+ }
221
+
222
+ return actual.is(expected);
223
+ },
224
+
225
+ failure_message: function(expected, actual, not) {
226
+ return 'expected ' + $.print(actual) + (not ? ' to not match selector ' : ' to match selector ') + expected;
227
+ }
228
+ },
229
+
230
+ contain_selector: {
231
+ match: function(expected, actual) {
232
+ if (!(actual instanceof jQuery)) {
233
+ throw expected.toString() + " must be an instance of jQuery to match against a selector"
234
+ }
235
+
236
+ return actual.find(expected).length > 0;
237
+ },
238
+
239
+ failure_message: function(expected, actual, not) {
240
+ return 'expected ' + $.print(actual) + (not ? ' to not contain selector ' : ' to contain selector ') + expected;
241
+ }
63
242
  }
64
243
  }
65
- })(jQuery);
244
+ })(jQuery);