kosmas58-cucumber 0.1.99.23 → 0.1.100.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -23
- data/Manifest.txt +14 -2
- data/examples/i18n/en-lol/Rakefile +6 -0
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
- data/examples/i18n/en-lol/features/stuffing.feature +8 -0
- data/examples/i18n/en-lol/features/support/env.rb +8 -0
- data/examples/i18n/en-lol/lib/basket.rb +12 -0
- data/examples/i18n/en-lol/lib/belly.rb +11 -0
- data/examples/i18n/et/features/jagamine.feature +9 -0
- data/examples/jbehave/README.textile +4 -1
- data/examples/jbehave/features/trading.feature +4 -0
- data/examples/jbehave/pom.xml +5 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +6 -1
- data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium/features/support/env.rb +19 -0
- data/examples/selenium_webrat/Rakefile +6 -0
- data/examples/selenium_webrat/features/search.feature +9 -0
- data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium_webrat/features/support/env.rb +41 -0
- data/examples/self_test/Rakefile +1 -1
- data/examples/self_test/features/background/failing_background.feature +1 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +1 -1
- data/examples/self_test/features/support/tag_count_formatter.rb +1 -1
- data/examples/tickets/Rakefile +13 -8
- data/examples/tickets/cucumber.yml +2 -1
- data/examples/tickets/features/236.feature +13 -0
- data/examples/tickets/features/241.feature +13 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +17 -4
- data/examples/tickets/features/tickets.feature +1 -1
- data/features/background.feature +9 -11
- data/features/cucumber_cli.feature +24 -1
- data/features/cucumber_cli_outlines.feature +10 -19
- data/features/report_called_undefined_steps.feature +2 -0
- data/gem_tasks/rspec.rake +3 -2
- data/lib/cucumber.rb +7 -15
- data/lib/cucumber/ast.rb +3 -3
- data/lib/cucumber/ast/background.rb +28 -66
- data/lib/cucumber/ast/examples.rb +15 -3
- data/lib/cucumber/ast/feature.rb +20 -24
- data/lib/cucumber/ast/feature_element.rb +46 -0
- data/lib/cucumber/ast/features.rb +2 -21
- data/lib/cucumber/ast/outline_table.rb +46 -14
- data/lib/cucumber/ast/py_string.rb +9 -3
- data/lib/cucumber/ast/scenario.rb +34 -73
- data/lib/cucumber/ast/scenario_outline.rb +40 -42
- data/lib/cucumber/ast/step.rb +51 -90
- data/lib/cucumber/ast/step_collection.rb +66 -0
- data/lib/cucumber/ast/step_invocation.rb +110 -0
- data/lib/cucumber/ast/table.rb +41 -21
- data/lib/cucumber/ast/tags.rb +4 -11
- data/lib/cucumber/ast/visitor.rb +35 -19
- data/lib/cucumber/broadcaster.rb +1 -3
- data/lib/cucumber/cli/configuration.rb +25 -17
- data/lib/cucumber/cli/language_help_formatter.rb +4 -4
- data/lib/cucumber/cli/main.rb +6 -4
- data/lib/cucumber/core_ext/proc.rb +2 -2
- data/lib/cucumber/formatter/ansicolor.rb +0 -1
- data/lib/cucumber/formatter/console.rb +24 -34
- data/lib/cucumber/formatter/html.rb +18 -11
- data/lib/cucumber/formatter/pretty.rb +48 -36
- data/lib/cucumber/formatter/profile.rb +6 -6
- data/lib/cucumber/formatter/progress.rb +14 -22
- data/lib/cucumber/formatter/rerun.rb +6 -6
- data/lib/cucumber/jbehave.rb +21 -26
- data/lib/cucumber/languages.yml +17 -2
- data/lib/cucumber/parser/feature.rb +26 -29
- data/lib/cucumber/parser/feature.tt +17 -12
- data/lib/cucumber/parser/treetop_ext.rb +13 -13
- data/lib/cucumber/platform.rb +0 -1
- data/lib/cucumber/rails/world.rb +2 -2
- data/lib/cucumber/rake/task.rb +1 -2
- data/lib/cucumber/step_definition.rb +21 -12
- data/lib/cucumber/step_match.rb +49 -0
- data/lib/cucumber/step_mother.rb +100 -80
- data/lib/cucumber/version.rb +2 -2
- data/lib/cucumber/world.rb +53 -0
- data/rails_generators/cucumber/templates/paths.rb +1 -1
- data/rails_generators/cucumber/templates/webrat_steps.rb +17 -17
- data/rails_generators/feature/feature_generator.rb +5 -1
- data/rails_generators/feature/templates/steps.erb +0 -4
- data/spec/cucumber/ast/background_spec.rb +32 -41
- data/spec/cucumber/ast/feature_factory.rb +10 -1
- data/spec/cucumber/ast/feature_spec.rb +7 -30
- data/spec/cucumber/ast/py_string_spec.rb +7 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +3 -0
- data/spec/cucumber/ast/scenario_spec.rb +8 -25
- data/spec/cucumber/ast/step_collection_spec.rb +8 -0
- data/spec/cucumber/ast/step_spec.rb +49 -28
- data/spec/cucumber/ast/table_spec.rb +13 -3
- data/spec/cucumber/ast/tags_spec.rb +2 -18
- data/spec/cucumber/broadcaster_spec.rb +6 -5
- data/spec/cucumber/cli/configuration_spec.rb +7 -0
- data/spec/cucumber/cli/main_spec.rb +1 -1
- data/spec/cucumber/parser/feature_parser_spec.rb +6 -5
- data/spec/cucumber/step_definition_spec.rb +16 -5
- data/spec/cucumber/step_mother_spec.rb +6 -6
- data/spec/cucumber/world/pending_spec.rb +1 -1
- metadata +24 -5
- data/lib/cucumber/ast/filter.rb +0 -22
- data/lib/cucumber/ast/steps.rb +0 -13
data/History.txt
CHANGED
@@ -56,29 +56,12 @@ which is a richer DSL than JBehave's language. -Over 20 spoken languages, Tables
|
|
56
56
|
Scenario Outlines, the rich command line, the nice output format and everything
|
57
57
|
pure Ruby users have been enjoying for a while.
|
58
58
|
|
59
|
-
== TODO Before 0.2 release
|
60
|
-
* Make sure all features and specs pass on Windows, JRuby and Ruby 1.9
|
61
|
-
* Tighten up and simplify the grammar. More edge case features/specs.
|
62
|
-
* Reintroduce StepInvocation. Reduce some of the redundant calls to StepDefinition/StepMother. Align with JBehave.
|
63
|
-
* Make some class diagrams.
|
64
|
-
* Implement at least a basic HTML formatter
|
65
|
-
* Run a single cucumber feature from rake "rake features FEATURE=/path/to/feature:line"
|
66
|
-
* Wiki page about running subsets
|
67
|
-
** file:line
|
68
|
-
*** scenario (or step within)
|
69
|
-
*** scenario outline
|
70
|
-
*** scenario outline examples
|
71
|
-
*** line in an example table
|
72
|
-
*** background (same as whole file)
|
73
|
-
*** fix bugs in any of those cases (there are some)
|
74
|
-
** --tags
|
75
|
-
*** Link to page about tags
|
76
|
-
* Tags with arguments
|
77
|
-
* cucumber.jar + examples
|
78
|
-
** Remove need for -S cucumber
|
79
|
-
** Full jar and simple jar
|
80
|
-
|
81
59
|
== Bugfixes
|
60
|
+
* New StepInvocation breaks console formatter for pending steps. (#241 Jacob Radford)
|
61
|
+
* Within Scenario Outlines when replacing with a nil in a step name use empty string instead. (#237 Joseph Wilk)
|
62
|
+
* Fixed bug with Scenario Outlines incorrectly replacing values in step tables with nil. (#237 Joseph Wilk)
|
63
|
+
* Within Scenario Outlines when replacing with a nil in multiline strings use empty string instead. (#238 Joseph Wilk)
|
64
|
+
* Re-structure the ast: Feature -> Background -> (Scenario|ScenarioOutline)*. Fixes bug with background being called outside transactions. (#181 Joseph Wilk)
|
82
65
|
* --strict always exits with status 1 (#230 Tim Cuthbertson)
|
83
66
|
* Fix error with nil values in tables raising an exception (#227 Joseph Wilk)
|
84
67
|
* Add support for using << in formatters to ensure the html formatter works (#210 Joseph Wilk)
|
@@ -96,6 +79,8 @@ pure Ruby users have been enjoying for a while.
|
|
96
79
|
* Pending steps in > steps called from steps (#65 Aslak Hellesøy)
|
97
80
|
|
98
81
|
=== New features
|
82
|
+
* Australian translation (Josh Graham)
|
83
|
+
* Added World#announce(announcment) which lets you output text to the formatted output (#222 Rob Kaufmann)
|
99
84
|
* Added Table#transpose to to allow use of vertically aligned table keys (Torbjørn Vatn, Aslak Hellesøy)
|
100
85
|
* Added Table#map_headers to to allow use of more readable headers (Rob Holland)
|
101
86
|
* New -S/--step-definitions option. Useful (among other things) for tools that implement automcompletion. (#208 Aslak Hellesøy).
|
@@ -136,7 +121,7 @@ pure Ruby users have been enjoying for a while.
|
|
136
121
|
* Pure Ruby features are no longer supported.
|
137
122
|
* Remove --color option in autotest. Can be added manually in cucumber.yml (#215 Jean-Michel Garnier)
|
138
123
|
|
139
|
-
== (0.16.4 aslakhellesoy-
|
124
|
+
== (0.16.4 aslakhellesoy-cucumber gem on GitHub)
|
140
125
|
|
141
126
|
Bugfix release.
|
142
127
|
|
data/Manifest.txt
CHANGED
@@ -30,6 +30,12 @@ examples/i18n/de/features/addition.feature
|
|
30
30
|
examples/i18n/de/features/division.feature
|
31
31
|
examples/i18n/de/features/step_definitons/calculator_steps.rb
|
32
32
|
examples/i18n/de/lib/calculator.rb
|
33
|
+
examples/i18n/en-lol/Rakefile
|
34
|
+
examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb
|
35
|
+
examples/i18n/en-lol/features/stuffing.feature
|
36
|
+
examples/i18n/en-lol/features/support/env.rb
|
37
|
+
examples/i18n/en-lol/lib/basket.rb
|
38
|
+
examples/i18n/en-lol/lib/belly.rb
|
33
39
|
examples/i18n/en/Rakefile
|
34
40
|
examples/i18n/en/features/addition.feature
|
35
41
|
examples/i18n/en/features/division.feature
|
@@ -169,6 +175,8 @@ examples/tickets/features/177/1.feature
|
|
169
175
|
examples/tickets/features/177/2.feature
|
170
176
|
examples/tickets/features/177/3.feature
|
171
177
|
examples/tickets/features/180.feature
|
178
|
+
examples/tickets/features/236.feature
|
179
|
+
examples/tickets/features/241.feature
|
172
180
|
examples/tickets/features/lib/eatting_machine.rb
|
173
181
|
examples/tickets/features/lib/pantry.rb
|
174
182
|
examples/tickets/features/scenario_outline.feature
|
@@ -210,14 +218,15 @@ lib/cucumber/ast/background.rb
|
|
210
218
|
lib/cucumber/ast/comment.rb
|
211
219
|
lib/cucumber/ast/examples.rb
|
212
220
|
lib/cucumber/ast/feature.rb
|
221
|
+
lib/cucumber/ast/feature_element.rb
|
213
222
|
lib/cucumber/ast/features.rb
|
214
|
-
lib/cucumber/ast/filter.rb
|
215
223
|
lib/cucumber/ast/outline_table.rb
|
216
224
|
lib/cucumber/ast/py_string.rb
|
217
225
|
lib/cucumber/ast/scenario.rb
|
218
226
|
lib/cucumber/ast/scenario_outline.rb
|
219
227
|
lib/cucumber/ast/step.rb
|
220
|
-
lib/cucumber/ast/
|
228
|
+
lib/cucumber/ast/step_collection.rb
|
229
|
+
lib/cucumber/ast/step_invocation.rb
|
221
230
|
lib/cucumber/ast/table.rb
|
222
231
|
lib/cucumber/ast/tags.rb
|
223
232
|
lib/cucumber/ast/visitor.rb
|
@@ -257,8 +266,10 @@ lib/cucumber/rails/rspec.rb
|
|
257
266
|
lib/cucumber/rails/world.rb
|
258
267
|
lib/cucumber/rake/task.rb
|
259
268
|
lib/cucumber/step_definition.rb
|
269
|
+
lib/cucumber/step_match.rb
|
260
270
|
lib/cucumber/step_mother.rb
|
261
271
|
lib/cucumber/version.rb
|
272
|
+
lib/cucumber/world.rb
|
262
273
|
rails_generators/cucumber/USAGE
|
263
274
|
rails_generators/cucumber/cucumber_generator.rb
|
264
275
|
rails_generators/cucumber/templates/cucumber
|
@@ -280,6 +291,7 @@ spec/cucumber/ast/feature_spec.rb
|
|
280
291
|
spec/cucumber/ast/py_string_spec.rb
|
281
292
|
spec/cucumber/ast/scenario_outline_spec.rb
|
282
293
|
spec/cucumber/ast/scenario_spec.rb
|
294
|
+
spec/cucumber/ast/step_collection_spec.rb
|
283
295
|
spec/cucumber/ast/step_spec.rb
|
284
296
|
spec/cucumber/ast/table_spec.rb
|
285
297
|
spec/cucumber/ast/tags_spec.rb
|
@@ -0,0 +1,16 @@
|
|
1
|
+
ICANHAZ /^IN TEH BEGINNIN (\d+) CUCUMBRZ$/ do |n|
|
2
|
+
@basket = Basket.new(n.to_i)
|
3
|
+
end
|
4
|
+
|
5
|
+
WEN /^I EAT (\d+) CUCUMBRZ$/ do |n|
|
6
|
+
@belly = Belly.new
|
7
|
+
@belly.eat(@basket.take(n.to_i))
|
8
|
+
end
|
9
|
+
|
10
|
+
DEN /^I HAS (\d+) CUCUMBERZ IN MAH BELLY$/ do |n|
|
11
|
+
@belly.cukes.should == n.to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
AN /^IN TEH END (\d+) CUCUMBRZ KTHXBAI$/ do |n|
|
15
|
+
@basket.cukes.should == n.to_i
|
16
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Omadus: Jagamine
|
2
|
+
Rumalate vigade vältimiseks
|
3
|
+
Peavad kassapidajad saama arvutada murdudes
|
4
|
+
|
5
|
+
Stsenaarium: Tavalised numrbid
|
6
|
+
Eeldades et olen sisestanud kalkulaatorisse numbri 3
|
7
|
+
Ja olen sisestanud kalkulaatorisse numbri 2
|
8
|
+
Kui ma vajutan jaga
|
9
|
+
Siis vastuseks peab ekraanil kuvatama 1.5
|
@@ -8,7 +8,10 @@ First, compile the java code (and JBehave steps)
|
|
8
8
|
|
9
9
|
<code>mvn compile jar:jar</code>
|
10
10
|
|
11
|
-
Second,
|
11
|
+
Second, set your CLASSPATH
|
12
|
+
<code>export CLASSPATH=~/.m2/repository/cucumber/cucumber-support/0.2/cucumber-support-0.2.jar:~/.m2/repository/org/jbehave/jbehave-core/2.1.1/jbehave-core-2.1.1.jar:~/.m2/repository/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar:~/.m2/repository/junit/junit/4.4/junit-4.4.jar</code>
|
13
|
+
|
14
|
+
Third, run Cucumber:
|
12
15
|
|
13
16
|
<code>jruby -S cucumber features</code>
|
14
17
|
|
@@ -17,6 +17,10 @@ Feature: Trading
|
|
17
17
|
Then the alert status should be OFF
|
18
18
|
|
19
19
|
Scenario: Trader sells all stocks
|
20
|
+
# Given the following table
|
21
|
+
# | a | b |
|
22
|
+
# | 1 | 2 |
|
23
|
+
# | 3 | 4 |
|
20
24
|
Given a trader of name Mauro
|
21
25
|
Given a stock of prices 0.5,1.0 and a threshold of 1.5
|
22
26
|
When the stock is traded at 2.0
|
data/examples/jbehave/pom.xml
CHANGED
@@ -18,6 +18,11 @@
|
|
18
18
|
</repositories>
|
19
19
|
|
20
20
|
<dependencies>
|
21
|
+
<dependency>
|
22
|
+
<groupId>cucumber</groupId>
|
23
|
+
<artifactId>cucumber-support</artifactId>
|
24
|
+
<version>0.2</version>
|
25
|
+
</dependency>
|
21
26
|
<dependency>
|
22
27
|
<groupId>org.jbehave</groupId>
|
23
28
|
<artifactId>jbehave-core</artifactId>
|
data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java
CHANGED
@@ -18,6 +18,7 @@ import org.jbehave.scenario.steps.ParameterConverters;
|
|
18
18
|
import org.jbehave.scenario.steps.SilentStepMonitor;
|
19
19
|
import org.jbehave.scenario.steps.Steps;
|
20
20
|
import org.jbehave.scenario.steps.StepsConfiguration;
|
21
|
+
import cucumber.ast.Table;
|
21
22
|
|
22
23
|
public class TraderSteps extends Steps {
|
23
24
|
|
@@ -46,6 +47,11 @@ public class TraderSteps extends Steps {
|
|
46
47
|
stock = new Stock(prices, threshold);
|
47
48
|
}
|
48
49
|
|
50
|
+
@Given("the following table")
|
51
|
+
public void theFollowingTable(Table table) {
|
52
|
+
System.out.println("My table:" + table);
|
53
|
+
}
|
54
|
+
|
49
55
|
@When("the stock is traded at %price")
|
50
56
|
public void theStockIsTradedAt(double price) {
|
51
57
|
stock.tradeAt(price);
|
@@ -61,5 +67,4 @@ public class TraderSteps extends Steps {
|
|
61
67
|
trader.sellAllStocks();
|
62
68
|
ensureThat(trader.getStocks().size(), equalTo(0));
|
63
69
|
}
|
64
|
-
|
65
70
|
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Given 'I am on the Google search page' do
|
2
|
+
@browser.open('http://www.google.com/')
|
3
|
+
end
|
4
|
+
|
5
|
+
When /I search for "(.*)"/ do |query|
|
6
|
+
@browser.type('q', query)
|
7
|
+
@browser.click 'btnG'
|
8
|
+
@browser.wait_for_page_to_load
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /I should see a link to (.*)/ do |expected_url|
|
12
|
+
@browser.is_element_present("css=a[href='#{expected_url}']").should be_true
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec/expectations'
|
2
|
+
require 'selenium'
|
3
|
+
|
4
|
+
# "before all"
|
5
|
+
browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)
|
6
|
+
|
7
|
+
Before do
|
8
|
+
@browser = browser
|
9
|
+
@browser.start
|
10
|
+
end
|
11
|
+
|
12
|
+
After do
|
13
|
+
@browser.stop
|
14
|
+
end
|
15
|
+
|
16
|
+
# "after all"
|
17
|
+
at_exit do
|
18
|
+
browser.close rescue nil
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Given 'I am on the Google search page' do
|
2
|
+
visit('http://www.google.com/')
|
3
|
+
end
|
4
|
+
|
5
|
+
When /I search for "(.*)"/ do |query|
|
6
|
+
fill_in('q', :with => query)
|
7
|
+
click_button('btnG')
|
8
|
+
selenium.wait_for_page_to_load
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /I should see a link to (.*)/ do |expected_url|
|
12
|
+
click_link(expected_url)
|
13
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec/expectations'
|
2
|
+
|
3
|
+
# START HACK
|
4
|
+
# Webrat's Selenium wrongly assumes Rails in available. # We'll just fool it...
|
5
|
+
module ActionController
|
6
|
+
class IntegrationTest
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def silence_stream(*args)
|
11
|
+
yield if block_given?
|
12
|
+
end
|
13
|
+
# END HACK
|
14
|
+
|
15
|
+
# RSpec
|
16
|
+
require 'spec/expectations'
|
17
|
+
|
18
|
+
# Webrat
|
19
|
+
require 'webrat'
|
20
|
+
Webrat.configure do |config|
|
21
|
+
config.mode = :selenium
|
22
|
+
end
|
23
|
+
|
24
|
+
World do
|
25
|
+
session = Webrat::SeleniumSession.new
|
26
|
+
session.extend(Webrat::Methods)
|
27
|
+
session.extend(Webrat::Selenium::Methods)
|
28
|
+
session.extend(Webrat::Selenium::Matchers)
|
29
|
+
session
|
30
|
+
end
|
31
|
+
|
32
|
+
# START HACK
|
33
|
+
# Disable Rails-specific code
|
34
|
+
module Webrat
|
35
|
+
def self.start_app_server
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.stop_app_server
|
39
|
+
end
|
40
|
+
end
|
41
|
+
# END HACK
|
data/examples/self_test/Rakefile
CHANGED
@@ -19,7 +19,7 @@ module Tag
|
|
19
19
|
def print_summary
|
20
20
|
matrix = @counts.to_a.sort{|paira, pairb| paira[0] <=> pairb[0]}.transpose
|
21
21
|
table = Cucumber::Ast::Table.new(matrix)
|
22
|
-
Cucumber::Formatter::Pretty.new(@step_mother, @io, {}).visit_multiline_arg(table
|
22
|
+
Cucumber::Formatter::Pretty.new(@step_mother, @io, {}).visit_multiline_arg(table)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/examples/tickets/Rakefile
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
2
|
require 'cucumber/rake/task'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Cucumber::Rake::Task.new do |t|
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
Cucumber::Rake::Task.new(:pretty) do |t|
|
5
|
+
t.cucumber_opts = "--format pretty"
|
6
|
+
end
|
7
|
+
|
8
|
+
Cucumber::Rake::Task.new(:html) do |t|
|
9
|
+
t.cucumber_opts = "--format html --out features.html"
|
10
|
+
end
|
11
|
+
|
12
|
+
Cucumber::Rake::Task.new(:progress) do |t|
|
13
|
+
t.cucumber_opts = "--format progress -i -n"
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => [:pretty, :html, :progress]
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Unsubstituted argument placeholder
|
2
|
+
|
3
|
+
Scenario Outline: See Annual Leave Details (as Management & Human Resource)
|
4
|
+
Given the following users exist in the system
|
5
|
+
| name | email | role_assignments | group_memberships |
|
6
|
+
| Jane | jane@fmail.com | <role> | Sales (manager) |
|
7
|
+
| Max | max@fmail.com | | Sales (member) |
|
8
|
+
| Carol | carol@fmail.com | | Sales (member) |
|
9
|
+
| Cat | cat@fmail.com | | |
|
10
|
+
|
11
|
+
Examples:
|
12
|
+
| role |
|
13
|
+
| HUMAN RESOURCE |
|