aslakhellesoy-cucumber 0.0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/License.txt +1 -1
- data/Manifest.txt +38 -24
- data/README.textile +31 -0
- data/TODO.txt +30 -0
- data/config/hoe.rb +6 -7
- data/examples/java/README.textile +52 -0
- data/examples/java/Rakefile +12 -0
- data/examples/java/features/hello.feature +11 -0
- data/examples/java/features/steps/hello_steps.rb +25 -0
- data/examples/java/features/steps/tree_steps.rb +14 -0
- data/examples/java/features/tree.feature +9 -0
- data/examples/java/src/cucumber/demo/Hello.java +15 -0
- data/examples/pure_ruby/Rakefile +6 -0
- data/examples/pure_ruby/features/addition.rb +23 -0
- data/examples/pure_ruby/{steps → features/steps}/addition_steps.rb +0 -0
- data/examples/simple_norwegian/Rakefile +6 -0
- data/examples/simple_norwegian/{steg → features/steps}/matte_steg.rb.rb +0 -0
- data/examples/simple_norwegian/{summering.story → features/summering.feature} +4 -1
- data/examples/web/Rakefile +6 -0
- data/examples/web/features/search.feature +9 -0
- data/examples/web/features/steps/stories_steps.rb +51 -0
- data/gem_tasks/treetop.rake +8 -14
- data/lib/cucumber.rb +10 -3
- data/lib/cucumber/cli.rb +29 -19
- data/lib/cucumber/core_ext/proc.rb +13 -5
- data/lib/cucumber/executor.rb +8 -10
- data/lib/cucumber/formatters/ansicolor.rb +2 -2
- data/lib/cucumber/formatters/html_formatter.rb +6 -6
- data/lib/cucumber/formatters/pretty_formatter.rb +68 -15
- data/lib/cucumber/{parser/languages.yml → languages.yml} +0 -4
- data/lib/cucumber/rake/task.rb +24 -26
- data/lib/cucumber/step_mother.rb +3 -3
- data/lib/cucumber/tree.rb +8 -117
- data/lib/cucumber/tree/feature.rb +45 -0
- data/lib/cucumber/tree/features.rb +21 -0
- data/lib/cucumber/tree/scenario.rb +79 -0
- data/lib/cucumber/tree/step.rb +133 -0
- data/lib/cucumber/tree/table.rb +26 -0
- data/lib/cucumber/{parser → tree}/top_down_visitor.rb +5 -8
- data/lib/cucumber/treetop_parser/feature.treetop.erb +98 -0
- data/lib/cucumber/treetop_parser/feature_en.rb +923 -0
- data/lib/cucumber/treetop_parser/feature_fr.rb +923 -0
- data/lib/cucumber/treetop_parser/feature_no.rb +923 -0
- data/lib/cucumber/treetop_parser/feature_parser.rb +32 -0
- data/lib/cucumber/treetop_parser/feature_pt.rb +923 -0
- data/lib/cucumber/version.rb +2 -2
- data/script/console +1 -1
- data/spec/cucumber/executor_spec.rb +9 -9
- data/spec/cucumber/formatters/{stories.html → features.html} +9 -9
- data/spec/cucumber/formatters/html_formatter_spec.rb +11 -11
- data/spec/cucumber/{sell_cucumbers.story → sell_cucumbers.feature} +1 -1
- data/spec/spec_helper.rb +8 -1
- metadata +61 -30
- data/README.txt +0 -78
- data/examples/Rakefile +0 -7
- data/examples/pure_ruby/addition.rb +0 -16
- data/examples/simple/addition.story +0 -12
- data/examples/simple/division.story +0 -17
- data/examples/simple/steps/addition_steps.rb +0 -43
- data/examples/web/run_stories.story +0 -10
- data/examples/web/steps/stories_steps.rb +0 -39
- data/lib/cucumber/parser/nodes.rb +0 -88
- data/lib/cucumber/parser/story_parser.rb +0 -13
- data/lib/cucumber/parser/story_parser.treetop.erb +0 -41
- data/lib/cucumber/parser/story_parser_en.rb +0 -554
- data/lib/cucumber/parser/story_parser_fr.rb +0 -554
- data/lib/cucumber/parser/story_parser_no.rb +0 -554
- data/lib/cucumber/parser/story_parser_pt.rb +0 -554
- data/lib/cucumber/ruby_tree.rb +0 -14
- data/lib/cucumber/ruby_tree/nodes.rb +0 -68
data/License.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -1,21 +1,33 @@
|
|
1
1
|
History.txt
|
2
2
|
License.txt
|
3
3
|
Manifest.txt
|
4
|
-
README.
|
4
|
+
README.textile
|
5
5
|
Rakefile
|
6
|
+
TODO.txt
|
6
7
|
bin/cucumber
|
7
8
|
config/hoe.rb
|
8
9
|
config/requirements.rb
|
9
|
-
examples/Rakefile
|
10
|
-
examples/
|
11
|
-
examples/
|
12
|
-
examples/
|
13
|
-
examples/
|
14
|
-
examples/
|
15
|
-
examples/
|
16
|
-
examples/
|
17
|
-
examples/
|
18
|
-
examples/
|
10
|
+
examples/calculator/Rakefile
|
11
|
+
examples/calculator/features/addition.feature
|
12
|
+
examples/calculator/features/division.feature
|
13
|
+
examples/calculator/features/steps/addition_steps.rb
|
14
|
+
examples/calculator/lib/calculator.rb
|
15
|
+
examples/java/README.textile
|
16
|
+
examples/java/Rakefile
|
17
|
+
examples/java/features/hello.feature
|
18
|
+
examples/java/features/steps/hello_steps.rb
|
19
|
+
examples/java/features/steps/tree_steps.rb
|
20
|
+
examples/java/features/tree.feature
|
21
|
+
examples/java/src/cucumber/demo/Hello.java
|
22
|
+
examples/pure_ruby/Rakefile
|
23
|
+
examples/pure_ruby/features/addition.rb
|
24
|
+
examples/pure_ruby/features/steps/addition_steps.rb
|
25
|
+
examples/simple_norwegian/Rakefile
|
26
|
+
examples/simple_norwegian/features/steps/matte_steg.rb.rb
|
27
|
+
examples/simple_norwegian/features/summering.feature
|
28
|
+
examples/web/Rakefile
|
29
|
+
examples/web/features/search.feature
|
30
|
+
examples/web/features/steps/stories_steps.rb
|
19
31
|
gem_tasks/deployment.rake
|
20
32
|
gem_tasks/environment.rake
|
21
33
|
gem_tasks/fix_cr_lf.rake
|
@@ -32,22 +44,24 @@ lib/cucumber/formatters/ansicolor.rb
|
|
32
44
|
lib/cucumber/formatters/html_formatter.rb
|
33
45
|
lib/cucumber/formatters/pretty_formatter.rb
|
34
46
|
lib/cucumber/formatters/progress_formatter.rb
|
35
|
-
lib/cucumber/
|
36
|
-
lib/cucumber/parser/nodes.rb
|
37
|
-
lib/cucumber/parser/story_parser.rb
|
38
|
-
lib/cucumber/parser/story_parser.treetop.erb
|
39
|
-
lib/cucumber/parser/story_parser_en.rb
|
40
|
-
lib/cucumber/parser/story_parser_fr.rb
|
41
|
-
lib/cucumber/parser/story_parser_no.rb
|
42
|
-
lib/cucumber/parser/story_parser_pt.rb
|
43
|
-
lib/cucumber/parser/top_down_visitor.rb
|
47
|
+
lib/cucumber/languages.yml
|
44
48
|
lib/cucumber/rails/world.rb
|
45
49
|
lib/cucumber/rake/task.rb
|
46
|
-
lib/cucumber/ruby_tree.rb
|
47
|
-
lib/cucumber/ruby_tree/nodes.rb
|
48
50
|
lib/cucumber/step_methods.rb
|
49
51
|
lib/cucumber/step_mother.rb
|
50
52
|
lib/cucumber/tree.rb
|
53
|
+
lib/cucumber/tree/feature.rb
|
54
|
+
lib/cucumber/tree/features.rb
|
55
|
+
lib/cucumber/tree/scenario.rb
|
56
|
+
lib/cucumber/tree/step.rb
|
57
|
+
lib/cucumber/tree/table.rb
|
58
|
+
lib/cucumber/tree/top_down_visitor.rb
|
59
|
+
lib/cucumber/treetop_parser/feature.treetop.erb
|
60
|
+
lib/cucumber/treetop_parser/feature_en.rb
|
61
|
+
lib/cucumber/treetop_parser/feature_fr.rb
|
62
|
+
lib/cucumber/treetop_parser/feature_no.rb
|
63
|
+
lib/cucumber/treetop_parser/feature_parser.rb
|
64
|
+
lib/cucumber/treetop_parser/feature_pt.rb
|
51
65
|
lib/cucumber/version.rb
|
52
66
|
script/console
|
53
67
|
script/console.cmd
|
@@ -61,9 +75,9 @@ setup.rb
|
|
61
75
|
spec/cucumber/core_ext/string_spec.rb
|
62
76
|
spec/cucumber/executor_spec.rb
|
63
77
|
spec/cucumber/formatters/ansicolor_spec.rb
|
78
|
+
spec/cucumber/formatters/features.html
|
64
79
|
spec/cucumber/formatters/html_formatter_spec.rb
|
65
|
-
spec/cucumber/
|
66
|
-
spec/cucumber/sell_cucumbers.story
|
80
|
+
spec/cucumber/sell_cucumbers.feature
|
67
81
|
spec/spec.opts
|
68
82
|
spec/spec_helper.rb
|
69
83
|
website/index.html
|
data/README.textile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
h1. Cucumber
|
2
|
+
|
3
|
+
"Cucumber":http://github.com/aslakhellesoy/cucumber is a tool that can execute documentation written in plain text. Cucumber targets non technical domain experts as well as
|
4
|
+
programmers and QA people. Cucumber itself is written in Ruby, but it can be used to "test" code written in Ruby, Java
|
5
|
+
(or web applications written in any language). When "IronRuby":http://www.ironruby.net/ matures it can be used to "test"
|
6
|
+
.NET code too.
|
7
|
+
|
8
|
+
While Cucumber can be thought of as a "testing" tool, most people use it to support "BDD":http://behaviour-driven.org/, so
|
9
|
+
the "tests" are typically the first thing that gets written, and the production code is then written outside-in, to make
|
10
|
+
the test pass.
|
11
|
+
|
12
|
+
h2. Installation
|
13
|
+
|
14
|
+
After you have installed Ruby or JRuby - install Cucumber with the following commands:
|
15
|
+
|
16
|
+
Ruby:
|
17
|
+
<pre><code>gem sources --add http://gems.github.com/
|
18
|
+
gem install aslakhellesoy-cucumber
|
19
|
+
</code></pre>
|
20
|
+
|
21
|
+
JRuby:
|
22
|
+
<pre><code>jruby -S gem sources --add http://gems.github.com/
|
23
|
+
jruby -S gem install aslakhellesoy-cucumber
|
24
|
+
</code></pre>
|
25
|
+
|
26
|
+
h2. Getting started
|
27
|
+
|
28
|
+
I haven't written a tutorial yet. Take a look at the "examples":http://github.com/aslakhellesoy/cucumber/tree/master/examples.
|
29
|
+
Each example directory has a Rakefile, and you can run the features with
|
30
|
+
|
31
|
+
<pre><code>rake features</code></pre>
|
data/TODO.txt
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
== FEATURES/PROBLEMS:
|
2
|
+
|
3
|
+
* Run examples with:
|
4
|
+
** ruby -Ilib bin/cucumber examples/simple --require examples/simple/steps
|
5
|
+
** ruby -Ilib bin/cucumber examples/web --require examples/web/steps
|
6
|
+
|
7
|
+
* TODO: OK Refactor: Extract explicit node classes with RDoc (for better API doc)
|
8
|
+
* TODO: OK Get rid of the compile method. Compile the parser in Rake.
|
9
|
+
* TODO: OK Make grammar support \r\n, \r and \n (Add some fixture features for that)
|
10
|
+
* TODO: OK Make grammar support indentation
|
11
|
+
* TODO: OK Make grammar be totally relaxed about narrative
|
12
|
+
* TODO: OK Add a yaml file for different languages
|
13
|
+
* TODO: OK Custom nodes for the syntax tree
|
14
|
+
* TODO: OK Actually execute the features
|
15
|
+
* TODO: Make rake run specs by default
|
16
|
+
* TODO: OK Make it work with pure ruby regexen
|
17
|
+
* TODO: Make it work with string steps
|
18
|
+
* TODO: bin/cucumber --require [dir|file|glob]* --language no --format [file]*
|
19
|
+
* TODO: OK Pending steps shold print a block of code that can be pasted into code
|
20
|
+
* TODO: cucumber --where "Some text from a step" that prints "__FILE__:__LINE__ (STEP PATTERN)"
|
21
|
+
* TODO: Customisable trace output (like javascriptlint)
|
22
|
+
* TODO: Experiment: Make $variables become @variables
|
23
|
+
* TODO: GivenScenario
|
24
|
+
* TODO: OK PureRuby
|
25
|
+
* Make two trees include accept mixin
|
26
|
+
* TODO: Call steps from steps
|
27
|
+
* TODO: i18n in ruby too
|
28
|
+
* TODO: Don't load any treetop files if no .feature files are found
|
29
|
+
* TODO: Summary prints execution time
|
30
|
+
* TODO: --nocolor option
|
data/config/hoe.rb
CHANGED
@@ -2,11 +2,10 @@ require 'cucumber/version'
|
|
2
2
|
|
3
3
|
AUTHOR = 'Aslak Hellesøy' # can also be an array of Authors
|
4
4
|
EMAIL = "aslak.hellesoy@gmail.com"
|
5
|
-
DESCRIPTION = "Executable
|
5
|
+
DESCRIPTION = "Executable Feature scenarios"
|
6
6
|
GEM_NAME = 'cucumber' # what ppl will type to install your gem
|
7
|
-
|
8
|
-
|
9
|
-
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
7
|
+
HOMEPATH = "http://github.com/aslakhellesoy/cucumber"
|
8
|
+
RUBYFORGE_PROJECT = nil
|
10
9
|
|
11
10
|
@config_file = "~/.rubyforge/user-config.yml"
|
12
11
|
@config = nil
|
@@ -32,7 +31,7 @@ REV = nil
|
|
32
31
|
# UNCOMMENT IF REQUIRED:
|
33
32
|
# REV = YAML.load(`svn info`)['Revision']
|
34
33
|
VERS = Cucumber::VERSION::STRING + (REV ? ".#{REV}" : "")
|
35
|
-
RDOC_OPTS = ['--quiet', '--title', '
|
34
|
+
RDOC_OPTS = ['--quiet', '--title', 'Cucumber documentation',
|
36
35
|
"--opname", "index.html",
|
37
36
|
"--line-numbers",
|
38
37
|
"--main", "README",
|
@@ -53,12 +52,12 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
53
52
|
p.summary = DESCRIPTION
|
54
53
|
p.url = HOMEPATH
|
55
54
|
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
56
|
-
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
55
|
+
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store', '**/*.class', '**/*.jar'] #An array of file patterns to delete on clean.
|
57
56
|
|
58
57
|
# == Optional
|
59
58
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
60
59
|
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
61
|
-
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'] ]
|
60
|
+
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['rspec', '>= 1.1.4'], ['diff-lcs', '>= 1.1.2'] ]
|
62
61
|
|
63
62
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
64
63
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
h1. Using Cucumber with Java
|
2
|
+
|
3
|
+
This directory contains code to demonstrate how Cucumber can be used to develop Java code.
|
4
|
+
You need JRuby 1.1.3 or higher installed and JRuby's bin directory on your PATH.
|
5
|
+
|
6
|
+
h2. Installing required gems
|
7
|
+
|
8
|
+
jruby -S gem install aslakhellesoy-cucumber
|
9
|
+
jruby -S gem install diff-lcs
|
10
|
+
|
11
|
+
h2. Running the scenarios
|
12
|
+
|
13
|
+
Open a shell in this directory (java) and execute the following command:
|
14
|
+
|
15
|
+
<pre><code>
|
16
|
+
jruby -S rake features
|
17
|
+
</code></pre>
|
18
|
+
|
19
|
+
This will compile the java code and package it in a jar file, and then run Cucumber against
|
20
|
+
that code.
|
21
|
+
|
22
|
+
There is a deliberate error. See if you can fix it!
|
23
|
+
|
24
|
+
h2. Background and Credits
|
25
|
+
|
26
|
+
Cucumber is a rewrite of RSpec's "Story runner", which was originally written by Dan North. Dan's original
|
27
|
+
implementation required that stories be written in Ruby. Shortly after, David Chelimsky added
|
28
|
+
"plain text":http://blog.davidchelimsky.net/articles/2007/10/21/story-runner-in-plain-english support.
|
29
|
+
|
30
|
+
This brought executable stories a little closer to non-technical users, which is one of the target audiences
|
31
|
+
for this kind of tool.
|
32
|
+
|
33
|
+
However, the RSpec Story runner has several shortcomings which is rather common for tools that move into new territory.
|
34
|
+
Some of the biggest problems with it are:
|
35
|
+
|
36
|
+
* Hard to get started with. A special "all.rb" file must be written before it can be used.
|
37
|
+
* No out of the box Rake support, which puts a lot of people off.
|
38
|
+
* No i18n, so if you want to write stories in a different language than English you're out of luck.
|
39
|
+
* Poor error reporting. No way to know on what line a plain text story failed during execution or parsing.
|
40
|
+
* Limited colouring of output.
|
41
|
+
* No simple way to execute only one scenario.
|
42
|
+
* No command line tool to run stories.
|
43
|
+
|
44
|
+
While all of this could have been fixed in the existing codebase, I figured it would be easier to do a rewrite from scratch.
|
45
|
+
I also had some ideas for extensions of the story grammar, so I decided to use "Treetop":http://treetop.rubyforge.org/
|
46
|
+
and base it on a proper "grammar":http://github.com/aslakhellesoy/cucumber/tree/master/lib/cucumber/treetop_parser/feature.treetop.erb
|
47
|
+
|
48
|
+
Cucumber addresses all of the shortcomings of RSpec's Story runner. If the community likes it, we'll consider phasing out
|
49
|
+
the RSpec story runner.
|
50
|
+
|
51
|
+
The term "Feature" has been adopted in favour of "Story" because I believe it is a more appropriate term. A feature's scenarios
|
52
|
+
typically increases over time - fed by several user stories.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
+
require 'cucumber/rake/task'
|
3
|
+
|
4
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
5
|
+
t.cucumber_opts = "--format pretty"
|
6
|
+
end
|
7
|
+
|
8
|
+
task :features => :compile
|
9
|
+
|
10
|
+
task :compile do
|
11
|
+
sh "javac src/cucumber/demo/Hello.java && jar cf src/cucumber_demo.jar -C src cucumber/demo/Hello.class"
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Hello
|
2
|
+
In order to have more friends
|
3
|
+
I want to say hello
|
4
|
+
|
5
|
+
Scenario: Personal greeting
|
6
|
+
Given my name is Aslak
|
7
|
+
When I greet David
|
8
|
+
Then he should hear Hi, David. I'm Aslak.
|
9
|
+
And I should remember David as a friend
|
10
|
+
And I should get David's phone number
|
11
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec' # so we can call .should
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../src') # so the jar is found
|
3
|
+
require 'cucumber_demo' # puts the jar on the classpath
|
4
|
+
include_class 'cucumber.demo.Hello'
|
5
|
+
|
6
|
+
Given /my name is (\w+)/ do |name|
|
7
|
+
@hello = Hello.new # A java object
|
8
|
+
@name = name
|
9
|
+
end
|
10
|
+
|
11
|
+
When /I greet (.*)/ do |someone|
|
12
|
+
@greeting = @hello.greet(someone, @name)
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /he should hear (.*)\./ do |message|
|
16
|
+
@greeting.should == message
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /I should remember (\w+) as a friend/ do |name|
|
20
|
+
@hello.friend?(name).should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /I should get (\w+)'s phone number/ do |name|
|
24
|
+
@hello.getPhoneNumber(name).should_not == nil
|
25
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec'
|
2
|
+
include_class 'java.util.TreeSet'
|
3
|
+
|
4
|
+
Given /I have an empty set/ do
|
5
|
+
@set = TreeSet.new
|
6
|
+
end
|
7
|
+
|
8
|
+
When /I add (\w+)/ do |s|
|
9
|
+
@set.add(s)
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /the contents should be (.*)/ do |s|
|
13
|
+
@set.to_a.join(" ").should == s
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
package cucumber.demo;
|
2
|
+
|
3
|
+
public class Hello {
|
4
|
+
public String greet(String who, String from) {
|
5
|
+
return "Hi, " + who + ". I'm " + from;
|
6
|
+
}
|
7
|
+
|
8
|
+
public boolean isFriend(String who) {
|
9
|
+
return true;
|
10
|
+
}
|
11
|
+
|
12
|
+
public String getPhoneNumber(String who) {
|
13
|
+
return "99999";
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'cucumber/cli' # Needed in order to run the feature with ruby
|
2
|
+
|
3
|
+
Feature %|Addition
|
4
|
+
As a math idiot
|
5
|
+
I want to be told the sum of two numbers
|
6
|
+
So that I don't make silly mistakes| do
|
7
|
+
|
8
|
+
Scenario "Add two numbers" do
|
9
|
+
Given "I have entered 50 into the calculator"
|
10
|
+
And "I have entered 70 into the calculator"
|
11
|
+
When "I add"
|
12
|
+
Then "the result should be 120 on the screen"
|
13
|
+
And "the result class should be Float"
|
14
|
+
end
|
15
|
+
|
16
|
+
Table do |t|
|
17
|
+
t | "input_1" | "input_2" | "output" | "class" | t
|
18
|
+
# This is kind of dumb - but it illustrates how scenarios can be "generated" in code.
|
19
|
+
10.times do |n|
|
20
|
+
t | n | n*2 | n*3 | Fixnum | t
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
File without changes
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
Egenskap: Summering
|
2
2
|
Som en matteidiot
|
3
3
|
Vil jeg bli fortalt summen av to tall
|
4
4
|
Slik at jeg ikke gjør dumme feil
|
@@ -8,3 +8,6 @@ Historie: Addition
|
|
8
8
|
Og at jeg har tastet inn 7
|
9
9
|
Når jeg summerer
|
10
10
|
Så skal resultatet være 12
|
11
|
+
|
12
|
+
|a|b|s|
|
13
|
+
|2|3|5|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: Search
|
2
|
+
As an information seeker
|
3
|
+
I want to find more information
|
4
|
+
So that I can learn more
|
5
|
+
|
6
|
+
Scenario: Find what I'm looking for
|
7
|
+
Given I am on the Google search page
|
8
|
+
When I search for "rspec"
|
9
|
+
Then I should see a link to "RSpec-1.1.4: Overview":http://rspec.info/
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
case PLATFORM
|
4
|
+
when /darwin/
|
5
|
+
require 'safariwatir'
|
6
|
+
Browser = Watir::Safari
|
7
|
+
when /win32|mingw/
|
8
|
+
require 'watir'
|
9
|
+
Browser = Watir::IE
|
10
|
+
when /java/
|
11
|
+
require 'celerity'
|
12
|
+
Browser = Celerity::Browser
|
13
|
+
else
|
14
|
+
raise "This platform is not supported (#{PLATFORM})"
|
15
|
+
end
|
16
|
+
|
17
|
+
class GoogleSearch
|
18
|
+
def initialize(b)
|
19
|
+
@b = b
|
20
|
+
end
|
21
|
+
|
22
|
+
def goto
|
23
|
+
@b.goto 'http://www.google.com/'
|
24
|
+
end
|
25
|
+
|
26
|
+
def search(text)
|
27
|
+
@b.text_field(:name, 'q').set(text)
|
28
|
+
@b.button(:name, 'btnG').click
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Before do
|
33
|
+
@b = Browser.new
|
34
|
+
end
|
35
|
+
|
36
|
+
After do
|
37
|
+
@b.close
|
38
|
+
end
|
39
|
+
|
40
|
+
Given 'I am on the Google search page' do
|
41
|
+
@page = GoogleSearch.new(@b)
|
42
|
+
@page.goto
|
43
|
+
end
|
44
|
+
|
45
|
+
When /I search for "(.*)"/ do |query|
|
46
|
+
@page.search(query)
|
47
|
+
end
|
48
|
+
|
49
|
+
Then /I should see a link to "(.*)":(.*)/ do |text, url|
|
50
|
+
@b.link(:url, url).text.should == text
|
51
|
+
end
|