talk 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +10 -0
  5. data/README.md +6 -0
  6. data/Rakefile +9 -0
  7. data/features/class-field.feature +226 -0
  8. data/features/class.feature +95 -0
  9. data/features/enumeration-constant.feature +76 -0
  10. data/features/enumeration.feature +35 -0
  11. data/features/glossary-term.feature +46 -0
  12. data/features/glossary.feature +35 -0
  13. data/features/step_definitions/class-field.rb +74 -0
  14. data/features/step_definitions/class.rb +50 -0
  15. data/features/step_definitions/enumeration-constant.rb +42 -0
  16. data/features/step_definitions/enumeration.rb +29 -0
  17. data/features/step_definitions/glossary-term.rb +31 -0
  18. data/features/step_definitions/glossary.rb +23 -0
  19. data/features/support/env.rb +261 -0
  20. data/lib/context.rb +282 -0
  21. data/lib/context_class.rb +224 -0
  22. data/lib/contexts/README.md +274 -0
  23. data/lib/contexts/base.rb +6 -0
  24. data/lib/contexts/boolean.rb +5 -0
  25. data/lib/contexts/class.rb +11 -0
  26. data/lib/contexts/constant.rb +5 -0
  27. data/lib/contexts/enumeration.rb +20 -0
  28. data/lib/contexts/field.rb +47 -0
  29. data/lib/contexts/glossary.rb +7 -0
  30. data/lib/contexts/inherits.rb +3 -0
  31. data/lib/contexts/map.rb +7 -0
  32. data/lib/contexts/meta.rb +2 -0
  33. data/lib/contexts/method.rb +15 -0
  34. data/lib/contexts/numeric.rb +5 -0
  35. data/lib/contexts/protocol.rb +8 -0
  36. data/lib/contexts/reference.rb +6 -0
  37. data/lib/contexts/string.rb +5 -0
  38. data/lib/contexts/target.rb +11 -0
  39. data/lib/contexts/term.rb +11 -0
  40. data/lib/languages/java/java.rb +145 -0
  41. data/lib/languages/java/templates/class.java.erb +22 -0
  42. data/lib/languages/java/templates/enumeration.java.erb +10 -0
  43. data/lib/languages/java/templates/glossary.java.erb +8 -0
  44. data/lib/languages/language.rb +172 -0
  45. data/lib/languages/objc/objc.rb +162 -0
  46. data/lib/languages/objc/templates/TalkClasses.h.erb +3 -0
  47. data/lib/languages/objc/templates/TalkClassesForward.h.erb +2 -0
  48. data/lib/languages/objc/templates/TalkConstants.h.erb +22 -0
  49. data/lib/languages/objc/templates/TalkObjectList.h.erb +4 -0
  50. data/lib/languages/objc/templates/class.h.erb +21 -0
  51. data/lib/languages/objc/templates/class.m.erb +43 -0
  52. data/lib/parse_error.rb +4 -0
  53. data/lib/parser.rb +119 -0
  54. data/lib/registry.rb +151 -0
  55. data/lib/talk.rb +5 -0
  56. data/talk.gemspec +18 -0
  57. metadata +71 -3
@@ -0,0 +1,35 @@
1
+ Feature: @enumeration
2
+ Scenario Outline: Define an @enumeration with explicit @description
3
+ Given I define an enumeration named <name> with description <description>
4
+ When I get the result hash
5
+ Then there should be an enumeration named <name>
6
+ And the enumeration named <name> should have description <description>
7
+
8
+ Examples:
9
+ | name | description |
10
+ | AnEnumeration | This is a test enum |
11
+ | AnotherEnumeration | Here is another one! |
12
+
13
+
14
+ Scenario Outline: Define an @enumeration with implicit description
15
+ Given I define an enumeration named <name> with implicit description <description>
16
+ When I get the result hash
17
+ Then there should be an enumeration named <name>
18
+ And the enumeration named <name> should have description <description>
19
+
20
+ Examples:
21
+ | name | description |
22
+ | AnEnumeration | This is a test enum |
23
+ | AnotherEnumeration | Here is another one! |
24
+
25
+ Scenario: Define an @enumeration with no description
26
+ Given I define an enumeration named SomeEnumeration
27
+ But I don't give it a description
28
+ When I get the result hash
29
+ Then there should be a parse error
30
+
31
+ Scenario: Define an @enumeration with no name
32
+ Given I define an enumeration
33
+ But I don't give it a name
34
+ When I get the result hash
35
+ Then there should be a parse error
@@ -0,0 +1,46 @@
1
+ Feature: @glossary -> @term
2
+ Scenario Outline: Define an @term with an explicit @description
3
+ Given I have defined a valid glossary named <glossary>
4
+ And I define a term named <term> with value <value> and description <description>
5
+ When I get the result hash
6
+ Then the glossary <glossary> should contain a term named <term>
7
+ And the term <term> of glossary <glossary> should have value <value>
8
+ And the term <term> of glossary <glossary> should have description <description>
9
+
10
+ Examples:
11
+ | glossary | term | value | description |
12
+ | SomeGlossary | SomeTerm | SomeValue | I am a description |
13
+ | AnotherGlossary | AnotherTerm | AValue | I am a silly description with a silly hat |
14
+
15
+ Scenario Outline: Define an @term with no description
16
+ Given I have defined a valid glossary named TestGlossary
17
+ And I define a term named <name> with value <value>
18
+ But I don't give it a description
19
+ When I get the result hash
20
+ Then the glossary TestGlossary should contain a term named <name>
21
+ And the term <name> of glossary TestGlossary should have value <value>
22
+
23
+ Examples:
24
+ | name | value |
25
+ | ATerm | AValue |
26
+ | AnotherTerm | AnotherValue |
27
+
28
+ Scenario: Define an @term with no name
29
+ Given I have defined a valid glossary
30
+ And I define a term
31
+ But I don't give it a name
32
+ When I get the result hash
33
+ Then there should be a parse error
34
+
35
+ Scenario Outline: Define an @term with no value
36
+ Given I have defined a valid glossary named TestGlossary
37
+ And I define a term named <name>
38
+ But I don't give it a name
39
+ When I get the result hash
40
+ Then the glossary TestGlossary should contain a term named <name>
41
+ And the term <name> of glossary TestGlossary should have value <name>
42
+
43
+ Examples:
44
+ | name |
45
+ | ATerm |
46
+ | AnotherTerm |
@@ -0,0 +1,35 @@
1
+ Feature: @glossary
2
+ Scenario Outline: Define an @glossary with an explicit @description
3
+ Given I define a glossary named <name> with description <description>
4
+ When I get the result hash
5
+ Then there should be a glossary named <name>
6
+ And the glossary named <name> should have description <description>
7
+
8
+ Examples:
9
+ | name | description |
10
+ | AGlossary | A test glossary |
11
+ | AnotherGlossary | More testing please |
12
+
13
+ Scenario Outline: Define an @glossary with an implicit description
14
+ Given I define a glossary named <name> with implicit description <description>
15
+ When I get the result hash
16
+ Then there should be a glossary named <name>
17
+ And the glossary named <name> should have description <description>
18
+
19
+ Examples:
20
+ | name | description |
21
+ | AGlossary | A test glossary |
22
+ | AnotherGlossary | More testing please |
23
+
24
+ Scenario: Define an @glossary with no description
25
+ Given I define a glossary named SomeGlossary
26
+ But I don't give it a description
27
+ When I get the result hash
28
+ Then there should be a parse error
29
+
30
+ Scenario: Define an @glossary with no name
31
+ Given I define a glossary
32
+ But I don't give it a name
33
+ When I get the result hash
34
+ Then there should be a parse error
35
+
@@ -0,0 +1,74 @@
1
+ Given(/^I give it a field named (\S+) of type (\S+) and description (.+)$/) do |name, type, description|
2
+ last_class.add_child(make_field(name, type).add_child(make_description(description)))
3
+ end
4
+
5
+ Then(/^the field (\S+) should have type (\S+) and description (.+)$/) do |name, type, description|
6
+ field = field_in_result_class("SomeClass", name)
7
+ expect(field).not_to be_nil
8
+ expect(field[:description]).to eq(description)
9
+ expect(field[:type].length).to eq(1)
10
+ expect(field[:type][0]).to eq(type)
11
+ end
12
+
13
+ Given(/^I give it a field named (\S+) of type (\S+) and implicit description (.+)$/) do |name, type, description|
14
+ last_class.add_child(make_field(name, type, description))
15
+ end
16
+
17
+ Given(/^I give it a valid field named (\S+) of type (\S+)$/) do |name, type|
18
+ last_class.add_child(make_field(name, type, "A description"))
19
+ end
20
+
21
+ Then(/^the field (\S+) should have type (\S+)$/) do |name, type|
22
+ field = field_in_result_class(last_class.words[0], name)
23
+ expect(field).not_to be_nil
24
+ expect(field[:type].length).to eq(1)
25
+ expect(field[:type][0]).to eq(type)
26
+ end
27
+
28
+ Given(/^I give it a valid field named (\S+)$/) do |name|
29
+ last_class.add_child(make_field(name, "uint32", "A description"))
30
+ end
31
+
32
+ Given(/^I give (\S+) @see (\S+) (\S+)$/) do |field_name, ref_type, ref_name|
33
+ last_class.find_child("@field", field_name, 1).add_child(make_see(ref_type, ref_name))
34
+ end
35
+
36
+ Then(/^the field (\S+) should have an @see (\S+) (\S+)$/) do |field_name, ref_type, ref_name|
37
+ ref_type = "enumeration" if(ref_type) == "enum"
38
+ result_field = field_in_result_class(last_class.words[0], field_name)
39
+ expect(result_field[:see]).not_to be_nil
40
+
41
+ matches = result_field[:see].select { |x| x[:type] == ref_type and x[:name] == ref_name }
42
+ expect(matches.length).to eq(1)
43
+ end
44
+
45
+ Given(/^I give (\S+) @caveat (.+)$/) do |field_name, caveat_text|
46
+ caveat = TalkTag.new("@caveat").add_data(caveat_text)
47
+ last_class.find_child("@field", field_name, 1).add_child(caveat)
48
+ end
49
+
50
+ Then(/^the field (\S+) should have a @caveat (.+)$/) do |field_name, caveat_text|
51
+ field = field_in_result_class("SomeClass", field_name)
52
+ expect(field[:caveat]).to include(caveat_text)
53
+ end
54
+
55
+ Given(/^I give (\S+) @deprecated (.+)$/) do |field_name, deprecation_text|
56
+ deprecated = TalkTag.new("@deprecated").add_data(deprecation_text)
57
+ last_class.find_child("@field", field_name, 1).add_child(deprecated)
58
+ end
59
+
60
+ Then(/^the field (\S+) should have @deprecated (.+)$/) do |field_name, deprecation_text|
61
+ field = field_in_result_class("SomeClass", field_name)
62
+ expect(field[:deprecated]).to eq(deprecation_text)
63
+ end
64
+
65
+ Given(/^I give (\S+) @version (.+)$/) do |field_name, version_string|
66
+ version = TalkTag.new("@version").add_data(version_string)
67
+ last_class.find_child("@field", field_name, 1).add_child(version)
68
+ end
69
+
70
+ Then(/^the field (\S+) should have @version (.+)$/) do |field_name, version_string|
71
+ field = field_in_result_class("SomeClass", field_name)
72
+ expect(field[:version]).to eq(version_string)
73
+ end
74
+
@@ -0,0 +1,50 @@
1
+ Given(/^I have defined a class named (.+)$/) do |class_name|
2
+ make_class(class_name)
3
+ end
4
+
5
+ Given(/^I have given (.+) as a @description$/) do |description|
6
+ last_class.add_child(make_description(description))
7
+ end
8
+
9
+ Then(/^there should be a class named (.+)$/) do |class_name|
10
+ expect(result_class(class_name)).not_to be_nil
11
+ end
12
+
13
+ Then(/^it should have description (.+)$/) do |description|
14
+ expect(result_class(last_class)[:description]).to eq(description)
15
+ end
16
+
17
+ Given(/^I have given (.+) as an implied description$/) do |description|
18
+ last_class.add_data(description)
19
+ end
20
+
21
+ Given(/^I don't give a description$/) do
22
+ end
23
+
24
+ Given(/^I define another class also named (.+)$/) do |class_name|
25
+ make_class(class_name).add_data("A description")
26
+ end
27
+
28
+ Given(/^I give it @inherits (.+)$/) do |base_class|
29
+ last_class.add_child(TalkTag.new("@inherits").add_data(base_class))
30
+ end
31
+
32
+ Then(/^the class (.+) should have @inherits (.+)$/) do |child_class, base_class|
33
+ expect(result_class(child_class)[:inherits]).to eq(base_class)
34
+ end
35
+
36
+ Given(/^I give it @implement (.+)$/) do |is_implemented|
37
+ last_class.add_child(TalkTag.new("@implement").add_data(is_implemented))
38
+ end
39
+
40
+ Then(/^the class (.+) should have @implement (.+)$/) do |class_name, is_implemented|
41
+ implemented = case is_implemented
42
+ when 'false'
43
+ false
44
+ when 'true'
45
+ true
46
+ else
47
+ 'wtf'
48
+ end
49
+ expect(result_class(class_name)[:implement]).to eq(implemented)
50
+ end
@@ -0,0 +1,42 @@
1
+ Given(/^I define a valid constant named (\S+)$/) do |constant_name|
2
+ @enumerations.last.add_child(make_constant(constant_name))
3
+ end
4
+
5
+ Given(/^I define a valid constant named (\S+) with value (.+)$/) do |constant_name, value|
6
+ @enumerations.last.add_child(make_constant(constant_name, value))
7
+ end
8
+
9
+ Given(/^I define a constant named (\S+) with value (\S+) and description (.+)$/) do |constant_name, value, description_text|
10
+ @enumerations.last.add_child(make_constant(constant_name, value).add_child(make_description(description_text)))
11
+ end
12
+
13
+ Given(/^I define a constant named (\S+) with value (\S+) and implicit description (.+)$/) do |constant_name, value, description_text|
14
+ @enumerations.last.add_child(make_constant(constant_name, value, description_text))
15
+ end
16
+
17
+ Then(/^the enumeration (\S+) should contain a constant named (\S+)$/) do |enumeration_name, constant_name|
18
+ enum = result_enumeration(enumeration_name)
19
+ expect(enum).not_to be_nil
20
+
21
+ constant = constant_in_result_enumeration(enum, constant_name)
22
+ expect(constant).not_to be_nil
23
+ end
24
+
25
+ Then(/^the constant (\S+) should have value (.+)$/) do |constant_name, value|
26
+ enum = result_enumeration(@enumerations.last)
27
+ constant = constant_in_result_enumeration(enum, constant_name)
28
+ expect(constant[:value]).to eq(value.to_f)
29
+ end
30
+
31
+ Then(/^the constant (\S+) of enumeration (\S+) should have value (\S+)$/) do |constant_name, enumeration_name, value|
32
+ enum = result_enumeration(enumeration_name)
33
+ constant = constant_in_result_enumeration(enum, constant_name)
34
+ expect(constant[:value]).to eq(value.to_f)
35
+ end
36
+
37
+ Then(/^the constant (\S+) of enumeration (\S+) should have description (.+)$/) do |constant_name, enumeration_name, description_text|
38
+ enum = result_enumeration(@enumerations.last)
39
+ constant = constant_in_result_enumeration(enum, constant_name)
40
+ expect(constant[:description]).to eq(description_text)
41
+ end
42
+
@@ -0,0 +1,29 @@
1
+ Given(/^I define an enumeration named (\S+) with description (.+)$/) do |enum_name, description_text|
2
+ make_enumeration(enum_name).add_child(make_description(description_text))
3
+ end
4
+
5
+ Then(/^there should be an enumeration named (\S+)$/) do |enum_name|
6
+ expect(result_enumeration(enum_name)).not_to be_nil
7
+ end
8
+
9
+ Then(/^the enumeration named (\S+) should have description (.+)$/) do |enum_name, description_text|
10
+ expect(result_enumeration(enum_name)[:description]).to eq(description_text)
11
+ end
12
+
13
+ Given(/^I define an enumeration named (\S+) with implicit description (.+)$/) do |enum_name, description_text|
14
+ make_enumeration(enum_name).add_data(description_text)
15
+ end
16
+
17
+ Given(/^I define an enumeration$/) do
18
+ make_enumeration
19
+ end
20
+
21
+ Given(/^I define an enumeration named (\S+)$/) do |enum_name|
22
+ make_enumeration(enum_name)
23
+ end
24
+
25
+ Given(/^I don't give it a description$/) do
26
+ end
27
+
28
+ Given(/^I don't give it a name$/) do
29
+ end
@@ -0,0 +1,31 @@
1
+ Given(/^I define a term$/) do
2
+ @glossaries.last.add_child(make_term)
3
+ end
4
+
5
+ Given(/^I define a term named (\S+)$/) do |term_name|
6
+ @glossaries.last.add_child(make_term(term_name))
7
+ end
8
+
9
+ Given(/^I define a term named (\S+) with value (\S+)$/) do |term_name, value|
10
+ term = make_term(term_name, value)
11
+ @glossaries.last.add_child(term)
12
+ end
13
+
14
+ Given(/^I define a term named (\S+) with value (\S+) and description (.+)$/) do |term_name, value, description_text|
15
+ @glossaries.last.add_child(make_term(term_name, value, description_text))
16
+ end
17
+
18
+ Then(/^the glossary (\S+) should contain a term named (\S+)$/) do |glossary_name, term_name|
19
+ term = term_in_result_glossary(result_glossary(glossary_name), term_name)
20
+ expect(term).not_to be_nil
21
+ end
22
+
23
+ Then(/^the term (\S+) of glossary (\S+) should have value (\S+)$/) do |term_name, glossary_name, value|
24
+ term = term_in_result_glossary(result_glossary(glossary_name), term_name)
25
+ expect(term[:value]).to eq(value)
26
+ end
27
+
28
+ Then(/^the term (\S+) of glossary (\S+) should have description (.+)$/) do |term_name, glossary_name, description_text|
29
+ term = term_in_result_glossary(result_glossary(glossary_name), term_name)
30
+ expect(term[:description]).to eq(description_text)
31
+ end
@@ -0,0 +1,23 @@
1
+ Given(/^I define a glossary named (\S+) with description (.+)$/) do |glossary_name, description_text|
2
+ make_glossary(glossary_name).add_child(make_description(description_text))
3
+ end
4
+
5
+ Then(/^there should be a glossary named (\S+)$/) do |glossary_name|
6
+ expect(result_glossary(glossary_name)).not_to be_nil
7
+ end
8
+
9
+ Then(/^the glossary named (\S+) should have description (.+)$/) do |glossary_name, description_text|
10
+ expect(result_glossary(glossary_name)[:description]).to eq(description_text)
11
+ end
12
+
13
+ Given(/^I define a glossary named (\S+) with implicit description (.+)$/) do |glossary_name, description_text|
14
+ make_glossary(glossary_name).add_data(description_text)
15
+ end
16
+
17
+ Given(/^I define a glossary$/) do
18
+ make_glossary
19
+ end
20
+
21
+ Given(/^I define a glossary named (\S+)$/) do |glossary_name|
22
+ make_glossary(glossary_name)
23
+ end
@@ -0,0 +1,261 @@
1
+ basepath = File.expand_path(File.dirname(__FILE__) + '/../../')
2
+ lib = File.join(basepath, 'lib')
3
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
4
+
5
+ require 'talk'
6
+ require 'pp'
7
+ require 'rspec/expectations'
8
+
9
+ class TalkTag
10
+ attr_reader :children, :words, :tag
11
+
12
+ def initialize(tag)
13
+ @children = []
14
+ @words = []
15
+ @tag = tag
16
+ end
17
+
18
+ def add_child(child)
19
+ @children.push child
20
+ self
21
+ end
22
+
23
+ def add_data(new_words)
24
+ new_words = new_words.split("\s+") if new_words.is_a? String
25
+ @words += new_words
26
+ self
27
+ end
28
+
29
+ def render(depth=0)
30
+ indent = "\t" * depth
31
+ s = "#{indent}#{@tag}\n"
32
+ s += "#{indent}\t#{@words.join(' ')}\n" unless @words.empty?
33
+ s += (@children.collect { |x| x.render(depth+1) }).join("\n\n") + "\n" unless @children.empty?
34
+
35
+ s
36
+ end
37
+
38
+ def find_child(tag, name=nil, index=0)
39
+ matches = @children.select { |x| x.tag == tag }
40
+ matches.select! { |x| x.words[index] == name } unless name.nil?
41
+ matches.last
42
+ end
43
+
44
+ def to_s
45
+ render
46
+ end
47
+ end
48
+
49
+ # Define a new @class
50
+ def make_class(name=nil, description=nil)
51
+ new_class = TalkTag.new("@class")
52
+ new_class.add_data(name) unless name.nil?
53
+ new_class.add_data(description) unless description.nil?
54
+ @classes.push new_class
55
+ @last_object = new_class
56
+ end
57
+
58
+ # Define a new @description
59
+ def make_description(text)
60
+ @last_object = TalkTag.new("@description").add_data(text)
61
+ end
62
+
63
+ # Define a new @field
64
+ def make_field(name=nil, type=nil, description=nil)
65
+ field = TalkTag.new("@field")
66
+ field.add_data(type) unless type.nil?
67
+ field.add_data(name) unless name.nil?
68
+ field.add_data(description) unless description.nil?
69
+
70
+ @last_object = field
71
+ end
72
+
73
+ # Define a new @see
74
+ def make_see(ref_type, ref_name)
75
+ @last_object = TalkTag.new("@see").add_data([ref_type, ref_name])
76
+ end
77
+
78
+ # Define a new @glossary
79
+ def make_glossary(name=nil, description=nil)
80
+ glossary = TalkTag.new("@glossary")
81
+ glossary.add_data(name) unless name.nil?
82
+ glossary.add_data(description) unless description.nil?
83
+ @glossaries.push glossary
84
+
85
+ @last_object = glossary
86
+ end
87
+
88
+ # Define a new @term
89
+ def make_term(name=nil, value=nil, description=nil)
90
+ term = TalkTag.new("@term")
91
+ term.add_data(name) unless name.nil?
92
+ term.add_data(value) unless value.nil?
93
+ term.add_child(make_description(description)) unless description.nil?
94
+
95
+ @last_object = term
96
+ end
97
+
98
+ # Define a new @constant
99
+ def make_constant(name=nil, value=nil, description=nil)
100
+ constant = TalkTag.new("@constant")
101
+ constant.add_data(name) unless name.nil?
102
+ constant.add_data(value) unless value.nil?
103
+ constant.add_data(description) unless description.nil?
104
+
105
+ @last_object = constant
106
+ end
107
+
108
+ # Define a new @enumeration
109
+ def make_enumeration(name=nil, description=nil)
110
+ enumeration = TalkTag.new("@enumeration")
111
+ enumeration.add_data(name) unless name.nil?
112
+ enumeration.add_data(description) unless description.nil?
113
+ @enumerations.push enumeration
114
+
115
+ @last_object = enumeration
116
+ end
117
+
118
+ # Find an @class by name
119
+ def class_named(class_name)
120
+ @classes.each { |x| return x if x.words[0] == class_name }
121
+ nil
122
+ end
123
+
124
+ # Find an @enumeration by name
125
+ def enumeration_named(enumeration_name)
126
+ @enumerations.each { |x| return x if x.words[0] == enumeration_name }
127
+ nil
128
+ end
129
+
130
+ # Find an @glossary by name
131
+ def glossary_named(glossary_name)
132
+ @glossaries.each { |x| return x if x.words[0] == glossary_name }
133
+ nil
134
+ end
135
+
136
+ # Last @class defined via make_class
137
+ def last_class
138
+ @classes.nil? ? nil : @classes.last
139
+ end
140
+
141
+ # Last object created using one of the make_* methods
142
+ def last_object
143
+ @last_object
144
+ end
145
+
146
+ # Renders actual talk string to give to parser
147
+ def render
148
+ all_tags = @classes + @glossaries + @enumerations
149
+ talk = (all_tags.map { |x| x.to_s }).join("\n\n")
150
+ end
151
+
152
+ # Finds an item with a given name in the specified tag set in the result hash
153
+ def result_object_named_in_set(basis, set)
154
+ name = basis
155
+ name = basis.words[0] if basis.is_a? TalkTag
156
+
157
+ @results[set].each do |item|
158
+ return item if item[:name] == name
159
+ end
160
+
161
+ return nil
162
+ end
163
+
164
+ # Finds a class in the result hash
165
+ def result_class(cls)
166
+ result_object_named_in_set(cls, :class)
167
+ end
168
+
169
+ # Finds a class in the result hash
170
+ def result_enumeration(enum)
171
+ result_object_named_in_set(enum, :enumeration)
172
+ end
173
+
174
+ # Finds a class in the result hash
175
+ def result_glossary(glossary)
176
+ result_object_named_in_set(glossary, :glossary)
177
+ end
178
+
179
+ # Finds a specific field in a result class
180
+ def field_in_result_class(res_cls, field_name)
181
+ res_cls = result_class(res_cls) if res_cls.is_a? String
182
+ return nil if res_cls.nil?
183
+
184
+ res_cls[:field].each do |f|
185
+ return f if f[:name] == field_name
186
+ end
187
+
188
+ nil
189
+ end
190
+
191
+ # Finds a specific term in a result glossary
192
+ def term_in_result_glossary(res_gloss, term_name)
193
+ res_gloss = result_glossary(res_gloss) if res_gloss.is_a? String
194
+ return nil if res_gloss.nil?
195
+
196
+ res_gloss[:term].each { |t| return t if t[:name] == term_name }
197
+ nil
198
+ end
199
+
200
+ # Finds a specific constant in a result enumeration
201
+ def constant_in_result_enumeration(res_enum, constant_name)
202
+ res_enum = result_enumeration(res_enum) if res_enum.is_a? String
203
+ return nil if res_enum.nil?
204
+
205
+ res_enum[:constant].each { |t| return t if t[:name] == constant_name }
206
+ nil
207
+ end
208
+
209
+ # Resets the state so each scenario runs independently
210
+ def clean_slate
211
+ @classes = []
212
+ @glossaries = []
213
+ @enumerations = []
214
+ @last_object = nil
215
+ @parser = Talk::Parser.new
216
+ @exception = nil
217
+ Talk::Registry.reset
218
+ end
219
+
220
+
221
+ ## Generic test cases
222
+
223
+ Before do |scenario|
224
+ clean_slate
225
+ end
226
+
227
+ Given(/^I have defined a valid class$/) do
228
+ make_class("SomeClass").add_data("A description")
229
+ end
230
+
231
+ Given(/^I have defined a valid class named (\S+)$/) do |class_name|
232
+ make_class(class_name).add_data("A description")
233
+ end
234
+
235
+ Given(/^I have defined a valid enumeration$/) do
236
+ make_enumeration("AnEnumeration", "A description")
237
+ end
238
+
239
+ Given(/^I have defined a valid enumeration named (\S+)$/) do |enumeration_name|
240
+ make_enumeration(enumeration_name, "A description")
241
+ end
242
+
243
+ Given(/^I have defined a valid glossary$/) do
244
+ make_glossary("AGlossary", "A description")
245
+ end
246
+
247
+ Given(/^I have defined a valid glossary named (\S+)$/) do |glossary_name|
248
+ make_glossary(glossary_name, "A description")
249
+ end
250
+
251
+ When(/^I get the result hash$/) do
252
+ begin
253
+ @parser.parse("scenario.talk", render)
254
+ @results = @parser.results
255
+ rescue => @exception
256
+ end
257
+ end
258
+
259
+ Then(/^there should be a parse error$/) do
260
+ expect(@exception.is_a? Talk::ParseError).to be true
261
+ end