aslakhellesoy-cucumber 0.1.5 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. data/History.txt +228 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +226 -0
  4. data/README.txt +41 -0
  5. data/Rakefile +9 -0
  6. data/TODO.txt +26 -0
  7. data/bin/cucumber +5 -0
  8. data/config/hoe.rb +69 -0
  9. data/config/requirements.rb +15 -0
  10. data/cucumber.yml +1 -0
  11. data/examples/calculator_ruby_features/Rakefile +6 -0
  12. data/examples/calculator_ruby_features/features/addition.rb +23 -0
  13. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +43 -0
  14. data/examples/cs/README.textile +22 -0
  15. data/examples/cs/Rakefile +12 -0
  16. data/examples/cs/features/hello.feature +11 -0
  17. data/examples/cs/features/step_definitons/hello_steps.rb +25 -0
  18. data/examples/cs/features/step_definitons/tree_steps.rb +14 -0
  19. data/examples/cs/features/tree.feature +9 -0
  20. data/examples/cs/src/Hello.cs +18 -0
  21. data/examples/dos_line_endings/Rakefile +6 -0
  22. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  23. data/examples/i18n/README.textile +18 -0
  24. data/examples/i18n/Rakefile +16 -0
  25. data/examples/i18n/ar/Rakefile +6 -0
  26. data/examples/i18n/ar/features/addition.feature +17 -0
  27. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +31 -0
  28. data/examples/i18n/ar/lib/calculator.rb +10 -0
  29. data/examples/i18n/da/Rakefile +6 -0
  30. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +22 -0
  31. data/examples/i18n/da/features/summering.feature +17 -0
  32. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  33. data/examples/i18n/en/Rakefile +5 -0
  34. data/examples/i18n/en/features/addition.feature +17 -0
  35. data/examples/i18n/en/features/division.feature +10 -0
  36. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +31 -0
  37. data/examples/i18n/en/lib/calculator.rb +14 -0
  38. data/examples/i18n/es/Rakefile +6 -0
  39. data/examples/i18n/es/features/adicion.feature +17 -0
  40. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +22 -0
  41. data/examples/i18n/es/lib/calculador.rb +11 -0
  42. data/examples/i18n/et/Rakefile +6 -0
  43. data/examples/i18n/et/features/liitmine.feature +17 -0
  44. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +26 -0
  45. data/examples/i18n/et/lib/kalkulaator.rb +10 -0
  46. data/examples/i18n/fr/Rakefile +6 -0
  47. data/examples/i18n/fr/features/addition.feature +13 -0
  48. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +22 -0
  49. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  50. data/examples/i18n/id/Rakefile +6 -0
  51. data/examples/i18n/id/features/addition.feature +17 -0
  52. data/examples/i18n/id/features/division.feature +10 -0
  53. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +31 -0
  54. data/examples/i18n/id/lib/calculator.rb +14 -0
  55. data/examples/i18n/it/Rakefile +6 -0
  56. data/examples/i18n/it/features/somma.feature +10 -0
  57. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +22 -0
  58. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  59. data/examples/i18n/ja/README.txt +5 -0
  60. data/examples/i18n/ja/Rakefile +6 -0
  61. data/examples/i18n/ja/features/addition.feature +17 -0
  62. data/examples/i18n/ja/features/division.feature +10 -0
  63. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +30 -0
  64. data/examples/i18n/ja/lib/calculator.rb +14 -0
  65. data/examples/i18n/no/Rakefile +6 -0
  66. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +22 -0
  67. data/examples/i18n/no/features/summering.feature +17 -0
  68. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  69. data/examples/i18n/pt/Rakefile +6 -0
  70. data/examples/i18n/pt/features/adicao.feature +10 -0
  71. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +22 -0
  72. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  73. data/examples/i18n/ro/Rakefile +6 -0
  74. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +22 -0
  75. data/examples/i18n/ro/features/suma.feature +10 -0
  76. data/examples/i18n/ro/lib/calculator.rb +11 -0
  77. data/examples/i18n/se/Rakefile +6 -0
  78. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +22 -0
  79. data/examples/i18n/se/features/summering.feature +17 -0
  80. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  81. data/examples/i18n/zh-CN/Rakefile +6 -0
  82. data/examples/i18n/zh-CN/features/addition.feature +17 -0
  83. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +24 -0
  84. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  85. data/examples/java/README.textile +22 -0
  86. data/examples/java/Rakefile +12 -0
  87. data/examples/java/features/hello.feature +11 -0
  88. data/examples/java/features/step_definitons/hello_steps.rb +25 -0
  89. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  90. data/examples/java/features/tree.feature +9 -0
  91. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  92. data/examples/selenium/Rakefile +6 -0
  93. data/examples/selenium/features/search.feature +9 -0
  94. data/examples/selenium/features/step_definitons/stories_steps.rb +41 -0
  95. data/examples/tickets/Rakefile +11 -0
  96. data/examples/tickets/cucumber.yml +2 -0
  97. data/examples/tickets/features/step_definitons/tickets_steps.rb +32 -0
  98. data/examples/tickets/features/tickets.feature +22 -0
  99. data/examples/watir/Rakefile +6 -0
  100. data/examples/watir/features/search.feature +9 -0
  101. data/examples/watir/features/step_definitons/stories_steps.rb +51 -0
  102. data/features/see_features.feature +8 -0
  103. data/features/steps/features_steps.rb +9 -0
  104. data/gem_tasks/deployment.rake +34 -0
  105. data/gem_tasks/environment.rake +7 -0
  106. data/gem_tasks/features.rake +6 -0
  107. data/gem_tasks/fix_cr_lf.rake +10 -0
  108. data/gem_tasks/flog.rake +4 -0
  109. data/gem_tasks/gemspec.rake +6 -0
  110. data/gem_tasks/rspec.rake +21 -0
  111. data/gem_tasks/treetop.rake +41 -0
  112. data/lib/autotest/cucumber.rb +6 -0
  113. data/lib/autotest/cucumber_mixin.rb +109 -0
  114. data/lib/autotest/cucumber_rails.rb +6 -0
  115. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  116. data/lib/autotest/cucumber_rspec.rb +6 -0
  117. data/lib/autotest/discover.rb +9 -0
  118. data/lib/cucumber.rb +39 -0
  119. data/lib/cucumber/broadcaster.rb +20 -0
  120. data/lib/cucumber/cli.rb +269 -0
  121. data/lib/cucumber/core_ext/proc.rb +54 -0
  122. data/lib/cucumber/core_ext/string.rb +22 -0
  123. data/lib/cucumber/executor.rb +170 -0
  124. data/lib/cucumber/formatters.rb +1 -0
  125. data/lib/cucumber/formatters/ansicolor.rb +111 -0
  126. data/lib/cucumber/formatters/autotest_formatter.rb +23 -0
  127. data/lib/cucumber/formatters/cucumber.css +132 -0
  128. data/lib/cucumber/formatters/cucumber.js +11 -0
  129. data/lib/cucumber/formatters/html_formatter.rb +128 -0
  130. data/lib/cucumber/formatters/jquery.js +32 -0
  131. data/lib/cucumber/formatters/pretty_formatter.rb +234 -0
  132. data/lib/cucumber/formatters/profile_formatter.rb +92 -0
  133. data/lib/cucumber/formatters/progress_formatter.rb +58 -0
  134. data/lib/cucumber/languages.yml +235 -0
  135. data/lib/cucumber/model.rb +1 -0
  136. data/lib/cucumber/model/table.rb +28 -0
  137. data/lib/cucumber/rails/rspec.rb +12 -0
  138. data/lib/cucumber/rails/world.rb +73 -0
  139. data/lib/cucumber/rake/task.rb +101 -0
  140. data/lib/cucumber/step_methods.rb +49 -0
  141. data/lib/cucumber/step_mother.rb +89 -0
  142. data/lib/cucumber/tree.rb +18 -0
  143. data/lib/cucumber/tree/feature.rb +61 -0
  144. data/lib/cucumber/tree/features.rb +21 -0
  145. data/lib/cucumber/tree/given_scenario.rb +13 -0
  146. data/lib/cucumber/tree/scenario.rb +158 -0
  147. data/lib/cucumber/tree/step.rb +134 -0
  148. data/lib/cucumber/tree/table.rb +26 -0
  149. data/lib/cucumber/tree/top_down_visitor.rb +23 -0
  150. data/lib/cucumber/treetop_parser/feature.treetop.erb +206 -0
  151. data/lib/cucumber/treetop_parser/feature_ar.rb +1591 -0
  152. data/lib/cucumber/treetop_parser/feature_cy.rb +1591 -0
  153. data/lib/cucumber/treetop_parser/feature_da.rb +1591 -0
  154. data/lib/cucumber/treetop_parser/feature_de.rb +1591 -0
  155. data/lib/cucumber/treetop_parser/feature_en-tx.rb +1591 -0
  156. data/lib/cucumber/treetop_parser/feature_en.rb +1591 -0
  157. data/lib/cucumber/treetop_parser/feature_es.rb +1591 -0
  158. data/lib/cucumber/treetop_parser/feature_et.rb +1591 -0
  159. data/lib/cucumber/treetop_parser/feature_fr.rb +1591 -0
  160. data/lib/cucumber/treetop_parser/feature_id.rb +1591 -0
  161. data/lib/cucumber/treetop_parser/feature_it.rb +1591 -0
  162. data/lib/cucumber/treetop_parser/feature_ja.rb +1591 -0
  163. data/lib/cucumber/treetop_parser/feature_nl.rb +1591 -0
  164. data/lib/cucumber/treetop_parser/feature_no.rb +1591 -0
  165. data/lib/cucumber/treetop_parser/feature_parser.rb +34 -0
  166. data/lib/cucumber/treetop_parser/feature_pl.rb +1591 -0
  167. data/lib/cucumber/treetop_parser/feature_pt.rb +1591 -0
  168. data/lib/cucumber/treetop_parser/feature_ro.rb +1591 -0
  169. data/lib/cucumber/treetop_parser/feature_ro2.rb +1591 -0
  170. data/lib/cucumber/treetop_parser/feature_ru.rb +1591 -0
  171. data/lib/cucumber/treetop_parser/feature_se.rb +1591 -0
  172. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +1591 -0
  173. data/lib/cucumber/version.rb +9 -0
  174. data/rails_generators/cucumber/USAGE +11 -0
  175. data/rails_generators/cucumber/cucumber_generator.rb +30 -0
  176. data/rails_generators/cucumber/templates/cucumber +7 -0
  177. data/rails_generators/cucumber/templates/cucumber.rake +7 -0
  178. data/rails_generators/cucumber/templates/env.rb +8 -0
  179. data/rails_generators/cucumber/templates/webrat_steps.rb +46 -0
  180. data/rails_generators/feature/USAGE +12 -0
  181. data/rails_generators/feature/feature_generator.rb +16 -0
  182. data/rails_generators/feature/templates/feature.erb +28 -0
  183. data/rails_generators/feature/templates/steps.erb +22 -0
  184. data/script/console +10 -0
  185. data/script/console.cmd +1 -0
  186. data/script/destroy +14 -0
  187. data/script/destroy.cmd +1 -0
  188. data/script/generate +14 -0
  189. data/script/generate.cmd +1 -0
  190. data/script/txt2html +74 -0
  191. data/script/txt2html.cmd +1 -0
  192. data/setup.rb +1585 -0
  193. data/spec/cucumber/broadcaster_spec.rb +27 -0
  194. data/spec/cucumber/cli_spec.rb +242 -0
  195. data/spec/cucumber/core_ext/proc_spec.rb +45 -0
  196. data/spec/cucumber/core_ext/string_spec.rb +34 -0
  197. data/spec/cucumber/executor_spec.rb +222 -0
  198. data/spec/cucumber/formatters/ansicolor_spec.rb +35 -0
  199. data/spec/cucumber/formatters/autotest_formatter_spec.rb +26 -0
  200. data/spec/cucumber/formatters/features.html +269 -0
  201. data/spec/cucumber/formatters/html_formatter_spec.rb +74 -0
  202. data/spec/cucumber/formatters/pretty_formatter_spec.rb +204 -0
  203. data/spec/cucumber/formatters/profile_formatter_spec.rb +192 -0
  204. data/spec/cucumber/formatters/progress_formatter_spec.rb +65 -0
  205. data/spec/cucumber/model/table_spec.rb +20 -0
  206. data/spec/cucumber/rails/stubs/mini_rails.rb +17 -0
  207. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  208. data/spec/cucumber/rails/world_spec.rb +11 -0
  209. data/spec/cucumber/sell_cucumbers.feature +19 -0
  210. data/spec/cucumber/step_mother_spec.rb +74 -0
  211. data/spec/cucumber/tree/feature_spec.rb +12 -0
  212. data/spec/cucumber/tree/row_scenario_spec.rb +25 -0
  213. data/spec/cucumber/tree/scenario_spec.rb +76 -0
  214. data/spec/cucumber/tree/step_spec.rb +50 -0
  215. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  216. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  217. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +98 -0
  218. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  219. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  220. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  221. data/spec/cucumber/treetop_parser/multiple_tables.feature +29 -0
  222. data/spec/cucumber/treetop_parser/spaces.feature +10 -0
  223. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  224. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  225. data/spec/spec.opts +2 -0
  226. data/spec/spec_helper.rb +19 -0
  227. metadata +151 -35
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatters/ansicolor'
3
+
4
+ module Cucumber
5
+ module Formatters
6
+ describe ANSIColor do
7
+ include ANSIColor
8
+
9
+ before do
10
+ ::Term::ANSIColor.coloring = true
11
+ end
12
+
13
+ after do
14
+ ::Term::ANSIColor.coloring = false
15
+ end
16
+
17
+ it "should wrap string in bold green for #passed with string arg" do
18
+ passed("foo").should == "\e[0m\e[1m\e[32mfoo\e[0m\e[0m"
19
+ end
20
+
21
+ it "should return bold green without wrapping for #passed without arg" do
22
+ passed.should == "\e[0m\e[1m\e[32m"
23
+ end
24
+
25
+ it "should return grey for #comment" do
26
+ comment("foo").should == "\e[0m\e[90mfoo\e[0m"
27
+ end
28
+
29
+ it "should not generate ansi codes when colors are disabled" do
30
+ ::Term::ANSIColor.coloring = false
31
+ passed("foo").should == "foo"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Cucumber::Formatters
4
+ describe AutotestFormatter do
5
+ before(:each) do
6
+ @io = StringIO.new
7
+ @formatter = AutotestFormatter.new @io
8
+ @scenario = mock('scenario', :name => "Doing tricky things")
9
+ @step = mock('step', :scenario => @scenario)
10
+ end
11
+
12
+ %w{failed skipped pending}.each do |didnt_pass|
13
+ it "should print a scenario's name when it has a #{didnt_pass} step" do
14
+ @formatter.send("step_#{didnt_pass}".to_sym, @step, mock('regexp'), mock('args'))
15
+ @io.string.should == "Doing tricky things\n"
16
+ end
17
+ end
18
+
19
+ it "should not print the same scenario's name twice" do
20
+ another_step = mock('another step', :scenario => @scenario)
21
+ @formatter.send("step_failed".to_sym, @step, mock('regexp'), mock('args'))
22
+ @formatter.send("step_skipped".to_sym, another_step, mock('regexp'), mock('args'))
23
+ @io.string.should == "Doing tricky things\n"
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,269 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+ <head>
7
+ <title>Stories</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+ <meta http-equiv="Expires" content="-1" />
10
+ <meta http-equiv="Pragma" content="no-cache" />
11
+ <script type="text/javascript">
12
+ /*
13
+ * jQuery 1.2.6 - New Wave Javascript
14
+ *
15
+ * Copyright (c) 2008 John Resig (jquery.com)
16
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
17
+ * and GPL (GPL-LICENSE.txt) licenses.
18
+ *
19
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
20
+ * $Rev: 5685 $
21
+ */
22
+ (function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
23
+ return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
24
+ return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
25
+ selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
26
+ return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
27
+ this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
28
+ return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
29
+ jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
30
+ script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
31
+ for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
32
+ for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
33
+ jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
34
+ ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
35
+ while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
36
+ while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
37
+ for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
38
+ jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
39
+ xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
40
+ jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
41
+ for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
42
+ s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
43
+ e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
44
+
45
+ function stepPassed(id) {
46
+ $("#"+id).removeClass("new").addClass("passed");
47
+ }
48
+
49
+ function stepPending(id) {
50
+ $("#"+id).removeClass("new").addClass("pending");
51
+ }
52
+
53
+ function stepFailed(id, message, backtrace) {
54
+ $("#"+id).removeClass("new").addClass("failed").append("<div>" + message + "</div>").append("<pre>" + backtrace + "</pre>");
55
+ }
56
+ </script>
57
+ <style>
58
+ body {
59
+ background: #fff;
60
+ font-size: 80%;
61
+ margin:0pt;
62
+ padding:0pt;
63
+ }
64
+
65
+ #container {
66
+ background:white none repeat scroll 0%;
67
+ font-family:Helvetica,Arial,sans-serif;
68
+ margin:0pt auto;
69
+ position:relative;
70
+ text-align:left;
71
+ top:1.0em;
72
+ width:78em;
73
+ }
74
+
75
+ span {
76
+ font-weight: bold;
77
+ text-decoration: underline;
78
+ }
79
+
80
+ dl {
81
+ font: normal 11px "Lucida Grande", Helvetica, sans-serif;
82
+ margin-left: 5px;
83
+ }
84
+
85
+ dl.new {
86
+ border-left: 5px solid #444444;
87
+ }
88
+
89
+ dl.pending {
90
+ border-left: 5px solid #FAF834;
91
+ }
92
+
93
+ dl.failed {
94
+ border-left: 5px solid #C20000;
95
+ }
96
+
97
+ dl.passed {
98
+ border-left: 5px solid #65C400;
99
+ }
100
+
101
+ dt {
102
+ color: #fff;
103
+ padding: 3px;
104
+ font-weight: bold;
105
+ }
106
+
107
+ dl.new > dt {
108
+ background: #444444;
109
+ }
110
+
111
+ dl.pending > dt {
112
+ color: #131313;
113
+ background: #FAF834;
114
+ }
115
+
116
+ dl.failed > dt {
117
+ background: #C20000;
118
+ }
119
+
120
+ dl.passed > dt {
121
+ background: #65C400;
122
+ }
123
+
124
+ dd {
125
+ margin: 0px 0px 0px 0px;
126
+ }
127
+
128
+ dd p, pre {
129
+ padding: 5px;
130
+ margin-top: 0;
131
+ margin-bottom: 5px;
132
+ }
133
+
134
+ dl.passed > dd > p, li.passed {
135
+ background: #DBFFB4; color: #3D7700;
136
+ border-bottom: 1px solid #65C400;
137
+ }
138
+
139
+ dl.failed > dd > p, li.failed {
140
+ color: #C20000; background: #FFFBD3;
141
+ border-bottom: 1px solid #C20000;
142
+ }
143
+
144
+ dl.pending > dd > p, li.pending {
145
+ color: #131313; background: #FCFB98;
146
+ border-bottom: 1px solid #FAF834;
147
+ }
148
+
149
+ dl.new > dd > p, li.new {
150
+ color: #444444; background: #DDDDDD;
151
+ border-bottom: 1px solid #444444;
152
+ }
153
+
154
+ span.param, span.param_editor {
155
+ font-weight: bold;
156
+ }
157
+
158
+ input {
159
+ width: 100%;
160
+ }
161
+
162
+ ul {
163
+ padding: 0px;
164
+ list-style: none;
165
+ }
166
+
167
+ ul > li {
168
+ margin: 5px 0px 5px 5px;
169
+ padding: 3px 3px 3px 5px;
170
+ }
171
+
172
+ div.auto_complete ul {
173
+ list-style-type: none;
174
+ border: 2px solid #F0F0F0;
175
+ margin: 0px;
176
+ padding: 0px;
177
+ }
178
+
179
+ div.auto_complete ul li {
180
+ background-color: white;
181
+ list-style-type: none;
182
+ display: block;
183
+ margin: 0;
184
+ padding: 2px;
185
+ }
186
+
187
+ div.auto_complete ul li.selected {
188
+ color: #444444; background: #DDDDDD;
189
+ }
190
+ </style>
191
+ </head>
192
+ <body>
193
+ <div id="container">
194
+ <dl class="feature new">
195
+ <dt>Feature: Addition
196
+ </dt>
197
+ <dd>
198
+ <p>
199
+ As a math idiot <br />
200
+ I want to be told the sum of two numbers<br />
201
+ So that I don't make silly mistakes
202
+ </p>
203
+ <dl class="new">
204
+ <dt>Scenario: 50+70</dt>
205
+ <dd>
206
+ <ul>
207
+ <li class="new" id="0">Given <span>I</span> have entered 50 into the calculator</li>
208
+ <li class="new" id="1">Given <span>foo</span> bar</li>
209
+ <li class="new" id="2">And <span>I</span> have entered 70 into the calculator</li>
210
+ <li class="new" id="3">When <span>I</span> add</li>
211
+ <li class="new" id="4">Then <span>the</span> result should be 12 on the screen</li>
212
+ <li class="new" id="5">And <span>the</span> result class should be Float</li>
213
+ </ul>
214
+ </dd>
215
+ </dl>
216
+ </dd>
217
+ </dl>
218
+ <dl class="feature new">
219
+ <dt>Feature: Division
220
+ </dt>
221
+ <dd>
222
+ <p>
223
+ As a math genius <br />
224
+ I want to be told the division of two floats<br />
225
+ So that I don't make silly mistakes
226
+ </p>
227
+ <dl class="new">
228
+ <dt>Scenario: 7/2</dt>
229
+ <dd>
230
+ <ul>
231
+ <li class="new" id="6">Given <span>I</span> have entered 3 into the calculator</li>
232
+ <li class="new" id="7">And <span>I</span> have entered 2 into the calculator</li>
233
+ <li class="new" id="8">When <span>I</span> divide</li>
234
+ <li class="new" id="9">Then <span>the</span> result should be 2.5 on the screen</li>
235
+ <li class="new" id="10">And <span>the</span> result class should be Float</li>
236
+ </ul>
237
+ </dd>
238
+ </dl>
239
+ <dl class="new">
240
+ <dt>Scenario: 3/0</dt>
241
+ <dd>
242
+ <ul>
243
+ <li class="new" id="11">Given <span>I</span> have entered 3 into the calculator</li>
244
+ <li class="new" id="12">And <span>I</span> have entered 2 into the calculator</li>
245
+ <li class="new" id="13">When <span>I</span> divide</li>
246
+ <li class="new" id="14">Then <span>the</span> result should be NaN on the screen</li>
247
+ </ul>
248
+ </dd>
249
+ </dl>
250
+ </dd>
251
+ </dl>
252
+ </div>
253
+ <script type="text/javascript">stepPending(0)</script>
254
+ <script type="text/javascript">stepFailed(1, "This one failed", "./spec/cucumber/formatters/html_formatter_spec.rb:20:in `Given WHATEVER'\n./spec/cucumber/formatters/../../../examples/simple/addition.feature:8:in `Given foo bar'")</script>
255
+ <script type="text/javascript">stepPassed(2)</script>
256
+ <script type="text/javascript">stepPending(3)</script>
257
+ <script type="text/javascript">stepFailed(4, "This one failed", "./spec/cucumber/formatters/html_formatter_spec.rb:20:in `Then WHATEVER'\n./spec/cucumber/formatters/../../../examples/simple/addition.feature:11:in `Then the result should be 12 on the screen'")</script>
258
+ <script type="text/javascript">stepPassed(5)</script>
259
+ <script type="text/javascript">stepPending(6)</script>
260
+ <script type="text/javascript">stepFailed(7, "This one failed", "./spec/cucumber/formatters/html_formatter_spec.rb:20:in `And WHATEVER'\n./spec/cucumber/formatters/../../../examples/simple/division.feature:8:in `And I have entered 2 into the calculator'")</script>
261
+ <script type="text/javascript">stepPassed(8)</script>
262
+ <script type="text/javascript">stepPending(9)</script>
263
+ <script type="text/javascript">stepFailed(10, "This one failed", "./spec/cucumber/formatters/html_formatter_spec.rb:20:in `And WHATEVER'\n./spec/cucumber/formatters/../../../examples/simple/division.feature:11:in `And the result class should be Float'")</script>
264
+ <script type="text/javascript">stepPassed(11)</script>
265
+ <script type="text/javascript">stepPending(12)</script>
266
+ <script type="text/javascript">stepFailed(13, "This one failed", "./spec/cucumber/formatters/html_formatter_spec.rb:20:in `When WHATEVER'\n./spec/cucumber/formatters/../../../examples/simple/division.feature:16:in `When I divide'")</script>
267
+ <script type="text/javascript">stepPassed(14)</script>
268
+ </body>
269
+ </html>
@@ -0,0 +1,74 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'stringio'
3
+ require 'cucumber/tree/top_down_visitor'
4
+
5
+ module Cucumber
6
+ module Formatters
7
+ class MiniExecutor < Cucumber::Tree::TopDownVisitor
8
+ def initialize(f)
9
+ @f = f
10
+ end
11
+
12
+ def visit_step(step)
13
+ if step.regexp == //
14
+ # Just make sure there are some params so we can get <span>s
15
+ proc = lambda do |_|
16
+ case(step.id % 3)
17
+ when 0
18
+ raise Pending
19
+ when 1
20
+ raise "This one failed"
21
+ end
22
+ end
23
+ proc.extend(CoreExt::CallIn)
24
+ proc.name = "WHATEVER"
25
+ step.attach(/(\w+).*/, proc, ['xxx'])
26
+ o = Object.new
27
+ step.execute_in(o) rescue nil
28
+ else
29
+ @f.step_executed(step)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe HtmlFormatter do
35
+ SIMPLE_DIR = File.dirname(__FILE__) + '/../../../examples/simple'
36
+
37
+ before do
38
+ p = Cucumber::TreetopParser::FeatureParser.new
39
+ @features = Tree::Features.new
40
+ Dir["#{SIMPLE_DIR}/*.feature"].each do |f|
41
+ @features << p.parse_feature(f)
42
+ end
43
+ @io = StringIO.new
44
+ step_mother = mock('step mother')
45
+ @formatter = HtmlFormatter.new(@io, step_mother)
46
+ @me = MiniExecutor.new(@formatter)
47
+ end
48
+
49
+ xit "should render HTML" do
50
+ @me.visit_features(@features) # set regexp+proc+args and execute
51
+ @formatter.visit_features(@features)
52
+ @me.visit_features(@features) # output result of execution
53
+ @formatter.dump
54
+ expected_html = File.dirname(__FILE__) + '/features.html'
55
+ #File.open(expected_html, 'w') {|io| io.write(@io.string)}
56
+ @io.string.should eql(IO.read(expected_html))
57
+ end
58
+
59
+ it "should render FIT table headers" do
60
+ scenario = mock('scenario', :name => 'test', :accept => nil)
61
+ row_scenario = mock('row scenario', :name => 'test', :accept => nil)
62
+ scenario.stub!(:table_header).and_return(['test', 'fit', 'headers'])
63
+
64
+ @formatter.visit_regular_scenario(scenario)
65
+ @formatter.visit_row_scenario(row_scenario)
66
+
67
+ ['test', 'fit' ,'headers'].each do |column_header|
68
+ @io.string.should include(column_header)
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,204 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Cucumber
4
+ module Formatters
5
+ describe PrettyFormatter do
6
+
7
+ def mock_step(stubs={})
8
+ stub('step', {
9
+ :keyword => 'Given',
10
+ :format => 'formatted yes',
11
+ :name => 'example',
12
+ :error => nil,
13
+ :padding_length => 2,
14
+ :file => 'test',
15
+ :line => 1,
16
+ :row? => false}.merge(stubs))
17
+ end
18
+
19
+ def mock_scenario(stubs={})
20
+ stub('scenario', {
21
+ :name => 'test',
22
+ :row? => false,
23
+ :pending? => false,
24
+ :file => 'file',
25
+ :line => 1,
26
+ :padding_length => 2}.merge(stubs))
27
+ end
28
+
29
+ def mock_feature(stubs={})
30
+ stub("feature", stubs)
31
+ end
32
+
33
+ def mock_error(stubs={})
34
+ stub('error', {
35
+ :message => 'failed',
36
+ :backtrace => 'example backtrace'}.merge(stubs))
37
+ end
38
+
39
+ def mock_proc
40
+ stub(Proc, :to_comment_line => '# steps/example_steps.rb:11')
41
+ end
42
+
43
+ it "should print step file and line when passed" do
44
+ io = StringIO.new
45
+ formatter = PrettyFormatter.new io, StepMother.new
46
+ step = stub('step',
47
+ :error => nil, :row? => false, :keyword => 'Given', :format => 'formatted yes'
48
+ )
49
+ formatter.step_passed(step, nil, nil)
50
+ io.string.should == " Given formatted yes\n"
51
+ end
52
+
53
+ describe "scenario without any steps" do
54
+ before :each do
55
+ @io = StringIO.new
56
+ @formatter = PrettyFormatter.new(@io, StepMother.new)
57
+ @scenario = mock_scenario(:name => "title", :pending? => true)
58
+ end
59
+
60
+ it "should display as pending when executing" do
61
+ @formatter.should_receive(:pending).with(" Scenario: title")
62
+ @formatter.scenario_executing(@scenario)
63
+ end
64
+
65
+ it "should display as pending in the dump" do
66
+ @formatter.scenario_executing(@scenario)
67
+ @formatter.dump
68
+ @io.string.should include("1 scenarios pending")
69
+ end
70
+ end
71
+
72
+ it "should put a line between last row scenario and new scenario" do
73
+ io = StringIO.new
74
+ formatter = PrettyFormatter.new io, mock('step_mother'), :source => true
75
+ scenario = mock_scenario(:row? => true)
76
+
77
+ formatter.scenario_executing(scenario)
78
+ formatter.scenario_executed(scenario)
79
+ formatter.scenario_executing(mock_scenario(:name => 'spacey', :row? => false))
80
+
81
+ io.string.should =~ /\n\n Scenario: spacey/
82
+ end
83
+
84
+ {'should' => true, 'should not' => false}.each do |should_or_should_not, show_snippet|
85
+ describe "snippets option #{show_snippet}" do
86
+
87
+ it "#{should_or_should_not} show snippet for pending step" do
88
+ @io = StringIO.new
89
+ step_mother = mock('step_mother', :has_step_definition? => false)
90
+ @formatter = PrettyFormatter.new @io, step_mother, :snippets => show_snippet
91
+
92
+ @formatter.step_pending(mock_step(:actual_keyword => 'Given', :name => 'pending step snippet'), nil, nil)
93
+ @formatter.dump
94
+
95
+ @io.string.send(should_or_should_not.gsub(' ','_').to_sym, include("Given /^pending step snippet$/ do"))
96
+ end
97
+
98
+ end
99
+ end
100
+
101
+ it "should escape snippets which have special regular expression characters" do
102
+ @io = StringIO.new
103
+ step_mother = mock('step_mother', :has_step_definition? => false)
104
+ @formatter = PrettyFormatter.new @io, step_mother, :snippets => true
105
+
106
+ @formatter.step_pending(mock_step(:actual_keyword => 'Given', :name => "$1 millon /'s"), nil, nil)
107
+ @formatter.dump
108
+
109
+ @io.string.should include("Given /^\\$1 millon \\/'s$/ do")
110
+ end
111
+
112
+ it "should not show the snippet for a step which already has a step definition" do
113
+ @io = StringIO.new
114
+ step_mother = mock('step_mother', :has_step_definition? => true)
115
+ @formatter = PrettyFormatter.new @io, step_mother, :snippets => true
116
+
117
+ @formatter.step_pending(mock_step(:actual_keyword => 'Given', :name => 'pending step snippet'), nil, nil)
118
+ @formatter.dump
119
+
120
+ @io.string.should_not include("Given /^pending step snippet$/ do")
121
+ end
122
+
123
+ describe "show source option true" do
124
+
125
+ before(:each) do
126
+ @io = StringIO.new
127
+ step_mother = mock('step_mother')
128
+ @formatter = PrettyFormatter.new @io, step_mother, :source => true
129
+ end
130
+
131
+ %w{passed failed skipped}.each do |result|
132
+ it "should display step source for #{result} step" do
133
+ @formatter.send("step_#{result}".to_sym, mock_step(:regexp_args_proc => [nil, nil, mock_proc], :error => StandardError.new, :padding_length => 2), nil, nil)
134
+
135
+ @io.string.should include("Given formatted yes # steps/example_steps.rb:11")
136
+ end
137
+ end
138
+
139
+ it "should display feature file and line for pending step" do
140
+ @formatter.step_pending(mock_step(:name => 'test', :file => 'features/example.feature', :line => 5, :padding_length => 2), nil, nil)
141
+
142
+ @io.string.should include("Given test # features/example.feature:5")
143
+ end
144
+
145
+ it "should display file and line for scenario" do
146
+ @formatter.scenario_executing(mock_scenario(:name => "title", :file => 'features/example.feature', :line => 2 , :padding_length => 2, :pending? => false))
147
+
148
+ @io.string.should include("Scenario: title # features/example.feature:2")
149
+ end
150
+
151
+ it "should display file for feature" do
152
+ @formatter.feature_executing(mock_feature(:file => 'features/example.feature', :padding_length => 2))
153
+ @formatter.header_executing("Feature: test\n In order to ...\n As a ...\n I want to ...\n")
154
+
155
+ @io.string.should include("Feature: test # features/example.feature\n")
156
+ @io.string.should include("In order to ...\n")
157
+ @io.string.should include("As a ...\n")
158
+ @io.string.should include("I want to ...\n")
159
+ end
160
+
161
+ it "should align step comments" do
162
+ step_1 = mock_step(:regexp_args_proc => [nil, nil, mock_proc], :format => "1", :padding_length => 10)
163
+ step_4 = mock_step(:regexp_args_proc => [nil, nil, mock_proc], :format => "4444", :padding_length => 7)
164
+ step_9 = mock_step(:regexp_args_proc => [nil, nil, mock_proc], :format => "999999999", :padding_length => 2)
165
+
166
+ @formatter.step_passed(step_1, nil, nil)
167
+ @formatter.step_passed(step_4, nil, nil)
168
+ @formatter.step_passed(step_9, nil, nil)
169
+
170
+ @io.string.should include("Given 1 # steps/example_steps.rb:11")
171
+ @io.string.should include("Given 4444 # steps/example_steps.rb:11")
172
+ @io.string.should include("Given 999999999 # steps/example_steps.rb:11")
173
+ end
174
+
175
+ it "should align step comments with respect to their scenario's comment" do
176
+ step = mock_step(:regexp_args_proc => [nil, nil, mock_proc], :error => StandardError.new, :padding_length => 6)
177
+
178
+ @formatter.scenario_executing(mock_scenario(:name => "very long title", :file => 'features/example.feature', :line => 5, :steps => [step], :padding_length => 2, :pending? => false))
179
+ @formatter.step_passed(step, nil, nil)
180
+
181
+ @io.string.should include("Scenario: very long title # features/example.feature:5")
182
+ @io.string.should include(" Given formatted yes # steps/example_steps.rb:11")
183
+ end
184
+
185
+ end
186
+
187
+ it "should reset the column count correctly" do
188
+ io = StringIO.new
189
+ formatter = PrettyFormatter.new io, mock('step_mother'), :source => true
190
+
191
+ large_scenario = mock_scenario(:row? => false, :table_column_widths => [3,3,5,4,4], :table_header => %w(one two three four five))
192
+ formatter.scenario_executing(large_scenario)
193
+ formatter.scenario_executed(large_scenario)
194
+
195
+ small_scenario = mock_scenario(:row? => false, :table_column_widths => [3,3], :table_header => %w(one two))
196
+ formatter.scenario_executing(small_scenario)
197
+ lambda {
198
+ formatter.scenario_executed(small_scenario)
199
+ }.should_not raise_error(TypeError)
200
+ end
201
+
202
+ end
203
+ end
204
+ end