activefacts 1.6.0 → 1.7.1

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +60 -0
  8. data/Rakefile +3 -80
  9. data/activefacts.gemspec +36 -0
  10. data/bin/afgen +4 -2
  11. data/bin/cql +5 -1
  12. data/lib/activefacts.rb +3 -12
  13. data/lib/activefacts/{vocabulary/query_evaluator.rb → query/evaluator.rb} +0 -0
  14. data/lib/activefacts/version.rb +2 -2
  15. metadata +48 -296
  16. data/History.txt +0 -4
  17. data/LICENSE +0 -19
  18. data/Manifest.txt +0 -165
  19. data/README.rdoc +0 -81
  20. data/css/offline.css +0 -3
  21. data/css/orm2.css +0 -124
  22. data/css/print.css +0 -8
  23. data/css/style-print.css +0 -357
  24. data/css/style.css +0 -387
  25. data/download.html +0 -110
  26. data/examples/CQL/Address.cql +0 -44
  27. data/examples/CQL/Blog.cql +0 -54
  28. data/examples/CQL/CompanyDirectorEmployee.cql +0 -56
  29. data/examples/CQL/Death.cql +0 -17
  30. data/examples/CQL/Diplomacy.cql +0 -48
  31. data/examples/CQL/Genealogy.cql +0 -98
  32. data/examples/CQL/Insurance.cql +0 -320
  33. data/examples/CQL/Marriage.cql +0 -18
  34. data/examples/CQL/Metamodel.cql +0 -493
  35. data/examples/CQL/Monogamy.cql +0 -24
  36. data/examples/CQL/MultiInheritance.cql +0 -22
  37. data/examples/CQL/NonRoleId.cql +0 -14
  38. data/examples/CQL/OddIdentifier.cql +0 -18
  39. data/examples/CQL/OilSupply.cql +0 -53
  40. data/examples/CQL/OneToOnes.cql +0 -17
  41. data/examples/CQL/Orienteering.cql +0 -111
  42. data/examples/CQL/PersonPlaysGame.cql +0 -18
  43. data/examples/CQL/RedundantDependency.cql +0 -34
  44. data/examples/CQL/SchoolActivities.cql +0 -33
  45. data/examples/CQL/SeparateSubtype.cql +0 -30
  46. data/examples/CQL/ServiceDirector.cql +0 -276
  47. data/examples/CQL/SimplestUnary.cql +0 -12
  48. data/examples/CQL/Supervision.cql +0 -34
  49. data/examples/CQL/WaiterTips.cql +0 -33
  50. data/examples/CQL/Warehousing.cql +0 -101
  51. data/examples/CQL/WindowInRoomInBldg.cql +0 -28
  52. data/examples/CQL/unit.cql +0 -474
  53. data/examples/index.html +0 -420
  54. data/examples/intro.html +0 -327
  55. data/examples/local.css +0 -24
  56. data/index.html +0 -111
  57. data/lib/activefacts/cql.rb +0 -35
  58. data/lib/activefacts/cql/CQLParser.treetop +0 -158
  59. data/lib/activefacts/cql/Context.treetop +0 -48
  60. data/lib/activefacts/cql/Expressions.treetop +0 -67
  61. data/lib/activefacts/cql/FactTypes.treetop +0 -358
  62. data/lib/activefacts/cql/Language/English.treetop +0 -315
  63. data/lib/activefacts/cql/LexicalRules.treetop +0 -253
  64. data/lib/activefacts/cql/ObjectTypes.treetop +0 -210
  65. data/lib/activefacts/cql/Rakefile +0 -14
  66. data/lib/activefacts/cql/Terms.treetop +0 -183
  67. data/lib/activefacts/cql/ValueTypes.treetop +0 -202
  68. data/lib/activefacts/cql/compiler.rb +0 -156
  69. data/lib/activefacts/cql/compiler/clause.rb +0 -1137
  70. data/lib/activefacts/cql/compiler/constraint.rb +0 -581
  71. data/lib/activefacts/cql/compiler/entity_type.rb +0 -457
  72. data/lib/activefacts/cql/compiler/expression.rb +0 -443
  73. data/lib/activefacts/cql/compiler/fact.rb +0 -390
  74. data/lib/activefacts/cql/compiler/fact_type.rb +0 -421
  75. data/lib/activefacts/cql/compiler/query.rb +0 -106
  76. data/lib/activefacts/cql/compiler/shared.rb +0 -161
  77. data/lib/activefacts/cql/compiler/value_type.rb +0 -174
  78. data/lib/activefacts/cql/nodes.rb +0 -49
  79. data/lib/activefacts/cql/parser.rb +0 -241
  80. data/lib/activefacts/dependency_analyser.rb +0 -182
  81. data/lib/activefacts/generate/absorption.rb +0 -70
  82. data/lib/activefacts/generate/composition.rb +0 -118
  83. data/lib/activefacts/generate/cql.rb +0 -714
  84. data/lib/activefacts/generate/dm.rb +0 -279
  85. data/lib/activefacts/generate/help.rb +0 -64
  86. data/lib/activefacts/generate/helpers/inject.rb +0 -16
  87. data/lib/activefacts/generate/helpers/oo.rb +0 -162
  88. data/lib/activefacts/generate/helpers/ordered.rb +0 -605
  89. data/lib/activefacts/generate/helpers/rails.rb +0 -57
  90. data/lib/activefacts/generate/html/glossary.rb +0 -461
  91. data/lib/activefacts/generate/json.rb +0 -337
  92. data/lib/activefacts/generate/null.rb +0 -32
  93. data/lib/activefacts/generate/rails/models.rb +0 -246
  94. data/lib/activefacts/generate/rails/schema.rb +0 -216
  95. data/lib/activefacts/generate/records.rb +0 -46
  96. data/lib/activefacts/generate/ruby.rb +0 -133
  97. data/lib/activefacts/generate/sql/mysql.rb +0 -280
  98. data/lib/activefacts/generate/sql/server.rb +0 -273
  99. data/lib/activefacts/generate/stats.rb +0 -69
  100. data/lib/activefacts/generate/text.rb +0 -27
  101. data/lib/activefacts/generate/topics.rb +0 -265
  102. data/lib/activefacts/generate/traits/datavault.rb +0 -241
  103. data/lib/activefacts/generate/traits/oo.rb +0 -73
  104. data/lib/activefacts/generate/traits/ordered.rb +0 -33
  105. data/lib/activefacts/generate/traits/ruby.rb +0 -210
  106. data/lib/activefacts/generate/transform/datavault.rb +0 -266
  107. data/lib/activefacts/generate/transform/surrogate.rb +0 -214
  108. data/lib/activefacts/generate/version.rb +0 -26
  109. data/lib/activefacts/input/cql.rb +0 -43
  110. data/lib/activefacts/input/orm.rb +0 -1636
  111. data/lib/activefacts/mapping/rails.rb +0 -132
  112. data/lib/activefacts/persistence.rb +0 -15
  113. data/lib/activefacts/persistence/columns.rb +0 -446
  114. data/lib/activefacts/persistence/foreignkey.rb +0 -187
  115. data/lib/activefacts/persistence/index.rb +0 -240
  116. data/lib/activefacts/persistence/object_type.rb +0 -198
  117. data/lib/activefacts/persistence/reference.rb +0 -434
  118. data/lib/activefacts/persistence/tables.rb +0 -380
  119. data/lib/activefacts/registry.rb +0 -11
  120. data/lib/activefacts/support.rb +0 -132
  121. data/lib/activefacts/vocabulary.rb +0 -9
  122. data/lib/activefacts/vocabulary/extensions.rb +0 -1348
  123. data/lib/activefacts/vocabulary/metamodel.rb +0 -570
  124. data/lib/activefacts/vocabulary/verbaliser.rb +0 -804
  125. data/script/txt2html +0 -71
  126. data/spec/absorption_spec.rb +0 -95
  127. data/spec/cql/comparison_spec.rb +0 -89
  128. data/spec/cql/context_spec.rb +0 -94
  129. data/spec/cql/contractions_spec.rb +0 -224
  130. data/spec/cql/deontic_spec.rb +0 -88
  131. data/spec/cql/entity_type_spec.rb +0 -320
  132. data/spec/cql/expressions_spec.rb +0 -66
  133. data/spec/cql/fact_type_matching_spec.rb +0 -338
  134. data/spec/cql/french_spec.rb +0 -21
  135. data/spec/cql/parser/bad_literals_spec.rb +0 -86
  136. data/spec/cql/parser/constraints_spec.rb +0 -19
  137. data/spec/cql/parser/entity_types_spec.rb +0 -106
  138. data/spec/cql/parser/expressions_spec.rb +0 -199
  139. data/spec/cql/parser/fact_types_spec.rb +0 -44
  140. data/spec/cql/parser/literals_spec.rb +0 -312
  141. data/spec/cql/parser/pragmas_spec.rb +0 -89
  142. data/spec/cql/parser/value_types_spec.rb +0 -42
  143. data/spec/cql/role_matching_spec.rb +0 -148
  144. data/spec/cql/samples_spec.rb +0 -244
  145. data/spec/cql_cql_spec.rb +0 -73
  146. data/spec/cql_dm_spec.rb +0 -136
  147. data/spec/cql_mysql_spec.rb +0 -69
  148. data/spec/cql_parse_spec.rb +0 -34
  149. data/spec/cql_ruby_spec.rb +0 -73
  150. data/spec/cql_sql_spec.rb +0 -72
  151. data/spec/cql_symbol_tables_spec.rb +0 -261
  152. data/spec/cqldump_spec.rb +0 -170
  153. data/spec/helpers/array_matcher.rb +0 -23
  154. data/spec/helpers/ctrl_c_support.rb +0 -52
  155. data/spec/helpers/diff_matcher.rb +0 -39
  156. data/spec/helpers/file_matcher.rb +0 -34
  157. data/spec/helpers/parse_to_ast_matcher.rb +0 -80
  158. data/spec/helpers/string_matcher.rb +0 -30
  159. data/spec/helpers/test_parser.rb +0 -15
  160. data/spec/norma_cql_spec.rb +0 -66
  161. data/spec/norma_ruby_spec.rb +0 -62
  162. data/spec/norma_ruby_sql_spec.rb +0 -107
  163. data/spec/norma_sql_spec.rb +0 -57
  164. data/spec/norma_tables_spec.rb +0 -95
  165. data/spec/ruby_api_spec.rb +0 -23
  166. data/spec/spec_helper.rb +0 -35
  167. data/spec/transform_surrogate_spec.rb +0 -59
  168. data/status.html +0 -138
  169. data/why.html +0 -60
@@ -1,88 +0,0 @@
1
- #
2
- # ActiveFacts CQL Deontic Constraints tests
3
- # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'activefacts/support'
7
- require 'activefacts/api/support'
8
- require 'activefacts/cql/compiler'
9
-
10
- describe "Deontic Constraints" do
11
- DeonticPrefix = %q{
12
- vocabulary Test;
13
- Person is written as Person;
14
- Person is employed;
15
- Person is unemployed;
16
- Person has borrowed cash;
17
- Person is a bad credit risk;
18
- Nr is written as Nr;
19
- Person is good credit risk;
20
- Bar is written as Bar;
21
- Baz is written as Baz;
22
- }
23
- Cases = [
24
- # Constraints:
25
- [ 'each Person occurs one time (otherwise alert fraud dept) in Person is employed, Person is unemployed;',
26
- 'alert', 'fraud dept'
27
- ],
28
- [ 'for each Person at most one of these holds ( otherwise email auditors ) : Person has borrowed cash, Person is a bad credit risk;',
29
- 'email', 'auditors'
30
- ],
31
- [ 'either Person has borrowed cash or Person is a bad credit risk ( otherwise email auditors );',
32
- 'email', 'auditors'
33
- ],
34
- [ 'either Person has borrowed cash or Person is a bad credit risk but not both ( otherwise email auditors );',
35
- 'email', 'auditors'
36
- ],
37
- [ 'Person is good credit risk only if Person is employed (otherwise consider foreclosure);',
38
- 'consider', 'foreclosure'
39
- ],
40
- [ 'Person is good credit risk if and only if Person is employed (otherwise log event);',
41
- 'log', 'event'
42
- ],
43
- [ 'Foo is written as Nr restricted to {1..10} (otherwise log);',
44
- 'log', ''
45
- ],
46
- [ 'Foo is identified by its Nr restricted to {1..10} (otherwise log);',
47
- 'log', ''
48
- ],
49
- [ 'Baz has at most one (otherwise notify security) Bar, Bar is of one Baz restricted to {1..10};',
50
- 'notify', 'security'
51
- ],
52
- [ 'Baz has at most one Bar, Bar is of one Baz restricted to {1..10} (otherwise log exception);',
53
- 'log', 'exception'
54
- ],
55
- ]
56
-
57
- before :each do
58
- @compiler = ActiveFacts::CQL::Compiler.new('Test')
59
- end
60
-
61
- Cases.each do |c|
62
- source, action, agent = *c
63
- it "should parse #{source.inspect}" do
64
- result = @compiler.compile(DeonticPrefix+source)
65
- puts @compiler.failure_reason unless result
66
- result.should_not be_nil
67
- constellation = @compiler.vocabulary.constellation
68
-
69
- enforcements =
70
- constellation.Constraint.values.map do |c|
71
- c.enforcement
72
- end.compact
73
- enforcements.size.should == 1
74
- enforcements[0].enforcement_code.should == action if action
75
- if agent
76
- if agent != ''
77
- enforcements[0].agent.agent_name.should == agent
78
- else
79
- enforcements[0].agent.should be_nil
80
- end
81
- end
82
-
83
- #result.map{|d| d.value}.should == ast if ast
84
- # Uncomment this to see what should replace "nil" in the cases above:
85
- #puts result.map{|d| d.value}.inspect unless ast
86
- end
87
- end
88
- end
@@ -1,320 +0,0 @@
1
- #
2
- # ActiveFacts CQL Fact Type matching tests
3
- # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'rspec/expectations'
7
-
8
- require 'activefacts/support'
9
- require 'activefacts/api/support'
10
- require 'activefacts/cql/compiler'
11
- # require File.dirname(__FILE__) + '/../helpers/compiler_helper' # Can't see how to include/extend these methods correctly
12
-
13
- describe "When compiling an entity type, " do
14
- MatchingPrefix = %q{
15
- vocabulary Tests;
16
- Boy is written as String;
17
- Girl is written as Integer;
18
- }
19
- BaseObjectTypes = 4 # Integer, String, Boy, Girl
20
-
21
- def self.SingleFact &b
22
- lambda {|c|
23
- real_fact_types = c.FactType.values-c.LinkFactType.values
24
- real_fact_types.size.should == 1
25
- @fact_type = real_fact_types[0]
26
- b.call(@fact_type) if b
27
- @fact_type
28
- }
29
- end
30
-
31
- def self.FactHavingPlayers(*a, &b)
32
- lambda {|c|
33
- @fact_type = c.FactType.detect do |key, ft|
34
- ft.all_role.map{|r| r.object_type.name}.sort == a.sort
35
- end
36
- b.call(@fact_type) if b
37
- @fact_type
38
- }
39
- end
40
-
41
- def self.PresenceConstraints fact_type, &b
42
- @presence_constraints =
43
- fact_type.all_role.map{|r|
44
- r.all_role_ref.map{|rr|
45
- rr.role_sequence.all_presence_constraint.to_a
46
- }
47
- }.flatten.uniq
48
- b.call(@presence_constraints) if b
49
- @presence_constraints
50
- end
51
-
52
- def self.Readings fact_type, &b
53
- @readings = fact_type.all_reading.sort_by{|r| r.ordinal}
54
- b.call(@readings) if b
55
- @readings
56
- end
57
-
58
- def self.ReadingCount n
59
- lambda {|c|
60
- unless @fact_type.all_reading.size == n
61
- puts "SPEC FAILED, wrong number of readings (should be #{n}):\n\t#{
62
- @fact_type.all_reading.map{ |r| r.expand}*"\n\t"
63
- }"
64
- end
65
- @fact_type.all_reading.size.should == n
66
- }
67
- end
68
-
69
- def self.PresenceConstraintCount n
70
- lambda{ |c|
71
- @fact_type.all_role.map{|r|
72
- r.all_role_ref.map{|rr|
73
- rr.role_sequence.all_presence_constraint.to_a
74
- }
75
- }.flatten.uniq.size.should == n
76
- }
77
- end
78
-
79
- def self.ObjectTypeCount n
80
- lambda {|c|
81
- @constellation = c
82
- c.ObjectType.values.size.should == n
83
- }
84
- end
85
-
86
- def self.ObjectType name, &b
87
- lambda {|c|
88
- @object_type = c.ObjectType[[["Tests"], name]]
89
- @object_type.should_not == nil
90
- b.call(@object_type) if b
91
- @object_type
92
- }
93
- end
94
-
95
- def self.WrittenAs name
96
- lambda {|c|
97
- @base_type = c.ObjectType[[["Tests"], name]]
98
- @base_type.class.should == ActiveFacts::Metamodel::ValueType
99
- @object_type.class.should == ActiveFacts::Metamodel::ValueType
100
- @object_type.supertype.should == @base_type
101
- }
102
- end
103
-
104
- def self.PreferredIdentifier num_roles
105
- lambda {|c|
106
- @preferred_identifier = @object_type.preferred_identifier
107
- @preferred_identifier.should_not == nil
108
- @preferred_identifier.role_sequence.all_role_ref.size.should == num_roles
109
- #@preferred_identifier.min_frequency.should == 1
110
- @preferred_identifier.max_frequency.should == 1
111
- @preferred_identifier.is_preferred_identifier.should == true
112
- }
113
- end
114
-
115
- def self.PreferredIdentifierRolePlayedBy name, num = 0
116
- lambda {|c|
117
- @preferred_identifier.role_sequence.all_role_ref.sort_by{|rr| rr.ordinal}[num].role.object_type.name.should == name
118
- }
119
- end
120
-
121
- class BlackHole
122
- def method_missing(m,*a,&b)
123
- self
124
- end
125
- end
126
- class PendingSilencer
127
- def STDOUT; BlackHole.new; end
128
- def puts; BlackHole.new; end
129
- def p; BlackHole.new; end
130
- end
131
-
132
- def self.pending(msg = "TODO", &b)
133
- lambda {|*c|
134
- raised = nil
135
- begin
136
- example = b.call
137
- eval(lambda { example.call(*c) }, BlackHole.new)
138
- rescue => raised
139
- end
140
- raise RSpec::Core::Pending::PendingExampleFixedError.new(msg) unless raised
141
- throw :pending_declared_in_example, msg
142
- }
143
- end
144
-
145
- def self.ReadingContainsHyphenatedWord reading_num
146
- lambda {|c|
147
- hyphenated_reading =
148
- c.FactType.values[0].all_reading.select {|reading|
149
- reading.ordinal == reading_num
150
- }[0]
151
- hyphenated_reading.should_not == nil
152
- (hyphenated_reading.text =~ /[a-z]-[a-z]/).should_not == nil
153
- }
154
- end
155
-
156
- EntityIdentificationTests = [
157
- [
158
- # REVISIT: At present, this doesn't add the minimum frequency constraint that a preferred identifier requires.
159
- %q{Thong is written as String;},
160
- %q{Thing is identified by Thong where Thing has one Thong;},
161
- SingleFact() do |fact_type|
162
- Readings(fact_type).size.should == 1
163
- PresenceConstraints(fact_type).size.should == 2
164
- end,
165
- ObjectType('Thong') do |object_type|
166
- object_type.class.should == ActiveFacts::Metamodel::ValueType
167
- # REVISIT: Figure out how WrittenAs can access the constellation.
168
- WrittenAs('String')
169
- end,
170
- ObjectTypeCount(2+BaseObjectTypes),
171
- ObjectType('Thing'),
172
- PreferredIdentifier(1),
173
- PreferredIdentifierRolePlayedBy('Thong'),
174
- ],
175
-
176
- [ # Auto-create Id and Thing Id:
177
- %q{Thing is identified by its Id;},
178
- SingleFact() do |fact_type|
179
- Readings(fact_type).size.should == 2
180
- PresenceConstraints(fact_type).size.should == 2
181
- end,
182
- ObjectTypeCount(3+BaseObjectTypes),
183
- ObjectType('Thing'),
184
- PreferredIdentifier(1),
185
- PreferredIdentifierRolePlayedBy('Thing Id'),
186
- ],
187
-
188
- [ # Auto-create Thing Id:
189
- %q{Id is written as String;},
190
- %q{Thing is identified by its Id;},
191
- SingleFact() do |fact_type|
192
- Readings(fact_type).size.should == 2
193
- PresenceConstraints(fact_type).size.should == 2
194
- end,
195
- ObjectTypeCount(3+BaseObjectTypes),
196
- ObjectType('Thing'),
197
- PreferredIdentifier(1),
198
- PreferredIdentifierRolePlayedBy('Thing Id'),
199
- ],
200
-
201
- [ # Auto-create nothing (identifying value type exists already)
202
- %q{Thing Id is written as String;},
203
- %q{Thing is identified by its Id;},
204
- SingleFact() do |fact_type|
205
- Readings(fact_type).size.should == 2
206
- PresenceConstraints(fact_type).size.should == 2
207
- end,
208
- ObjectTypeCount(2+BaseObjectTypes),
209
- ObjectType('Thing'),
210
- PreferredIdentifier(1),
211
- PreferredIdentifierRolePlayedBy('Thing Id'),
212
- ],
213
-
214
- [ # Auto-create nothing (identifying entity type exists already so don't create a VT)
215
- %q{Id is written as Id;},
216
- %q{Thing Id is identified by Id where Thing Id has one Id, Id is of one Thing Id;},
217
- %q{Thing is identified by its Id;},
218
- FactHavingPlayers("Thing", "Thing Id") do |fact_type|
219
- Readings(fact_type).size.should == 2
220
- PresenceConstraints(fact_type).size.should == 2
221
- end,
222
- ObjectTypeCount(3+BaseObjectTypes),
223
- ObjectType('Thing'),
224
- PreferredIdentifier(1),
225
- PreferredIdentifierRolePlayedBy('Thing Id'),
226
- ],
227
-
228
- [
229
- %q{Thong is written as String;},
230
- %q{Thing is identified by Thong where Thing has one Thong, Thong is of one Thing;},
231
- SingleFact() do |fact_type|
232
- Readings(fact_type).size.should == 2
233
- PresenceConstraints(fact_type).size.should == 2
234
- end,
235
- ObjectTypeCount(2+BaseObjectTypes),
236
- ObjectType('Thing'),
237
- PreferredIdentifier(1),
238
- PreferredIdentifierRolePlayedBy('Thong'),
239
- ],
240
-
241
- [ # Objectified fact type with internal identification
242
- %q{Relationship is where Boy relates to Girl;},
243
- SingleFact() do |fact_type|
244
- Readings(fact_type).size.should == 1
245
- PresenceConstraints(fact_type).size.should == 1
246
- end,
247
- ObjectTypeCount(1+BaseObjectTypes),
248
- ObjectType('Relationship'),
249
- PreferredIdentifier(2),
250
- # PreferredIdentifierRolePlayedBy('Thong'),
251
- ],
252
-
253
- [ # Objectified fact type with external identification
254
- %q{Relationship is identified by its Id where Boy relates to Girl;},
255
- ObjectTypeCount(3+BaseObjectTypes),
256
- ObjectType('Relationship'),
257
- PreferredIdentifier(1), # 1 role in PI
258
- PreferredIdentifierRolePlayedBy('Relationship Id'),
259
- FactHavingPlayers('Relationship', 'Relationship Id') do |fact_type|
260
- Readings(fact_type).size.should == 2
261
- PresenceConstraints(fact_type).size.should == 2
262
- fact_type.all_reading.detect{|r| r.text == '{0} has {1}'}.should_not == nil
263
- fact_type.all_reading.detect{|r| r.text == '{0} is of {1}'}.should_not == nil
264
- end,
265
- FactHavingPlayers('Boy', 'Girl') do |fact_type|
266
- fact_type.entity_type.should == @object_type
267
- end,
268
- ],
269
-
270
- [ # Objectified fact type with external identification and explicit reading
271
- %q{Relationship is identified by its Id where Boy relates to Girl, Relationship is known by Relationship Id;},
272
- ObjectTypeCount(3+BaseObjectTypes),
273
- ObjectType('Relationship'),
274
- PreferredIdentifier(1),
275
- PreferredIdentifierRolePlayedBy('Relationship Id'),
276
- FactHavingPlayers('Relationship', 'Relationship Id') do |fact_type|
277
- Readings(fact_type).size.should == 2
278
- PresenceConstraints(fact_type).size.should == 2
279
- fact_type.all_reading.detect{|r| r.text == '{0} is known by {1}'}.should_not == nil
280
- fact_type.all_reading.detect{|r| r.text == '{0} is of {1}'}.should_not == nil
281
- end,
282
- FactHavingPlayers('Boy', 'Girl') do |fact_type|
283
- fact_type.entity_type.should == @object_type
284
- end,
285
- ],
286
-
287
- ]
288
-
289
- AllTests =
290
- EntityIdentificationTests
291
-
292
- before :each do
293
- @compiler = ActiveFacts::CQL::Compiler.new('Test')
294
- end
295
-
296
- AllTests.each do |tests|
297
- it "should process '#{(tests.select{|t| t.is_a?(String)}*' ').gsub(/\s+/m,' ')}' correctly" do
298
- tests.each do |test|
299
- case test
300
- when String
301
- result = @compiler.compile(MatchingPrefix+test)
302
- puts @compiler.failure_reason unless result
303
- result.should_not be_nil
304
- @compiler.vocabulary.finalise
305
- when Proc
306
- begin
307
- test.call(@compiler.vocabulary.constellation)
308
- rescue RSpec::Expectations::ExpectationNotMetError
309
- raise
310
- rescue RSpec::Core::Pending::PendingDeclaredInExample
311
- raise
312
- rescue => e
313
- puts "Failed on\n\t"+tests.select{|t| t.is_a?(String)}*" "
314
- raise
315
- end
316
- end
317
- end
318
- end
319
- end
320
- end
@@ -1,66 +0,0 @@
1
- #
2
- # ActiveFacts CQL Expressions
3
- # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'rspec/expectations'
7
-
8
- require 'activefacts/support'
9
- require 'activefacts/api/support'
10
- require 'activefacts/cql/compiler'
11
- require File.dirname(__FILE__) + '/../helpers/compile_helpers'
12
-
13
- describe "When compiling expressions" do
14
- before :each do
15
- extend CompileHelpers
16
-
17
- prefix = %q{
18
- vocabulary Tests;
19
- Name is written as String;
20
- year/years converts to 365.25 day;
21
- Age is written as Integer year;
22
- Person is identified by its Name;
23
- Person is of Age;
24
-
25
- // Company is identified by its Name;
26
- // Directorship is where Person directs Company;
27
- }
28
- @compiler = ActiveFacts::CQL::Compiler.new('Test')
29
- @compiler.compile(prefix)
30
- @constellation = @compiler.vocabulary.constellation
31
-
32
- baseline
33
- end
34
-
35
- describe "expressions" do
36
-
37
- it "should create appropriate fact types" do
38
- compile %q{Person is of Age >= 3*(9+11)? }
39
-
40
- new_fact_types = fact_types
41
- # new_fact_types.each { |ft| puts "new fact type: #{ft.default_reading}" }
42
- new_fact_types.size.should == 3
43
- end
44
-
45
- it "should create derived fact types and project the roles" do
46
- compile %q{Person is old where Person is of Age >= 3*(9+11); }
47
-
48
- new_fact_types = fact_types
49
- # new_fact_types.each { |ft| puts "new fact type: #{ft.default_reading}" }
50
- new_fact_types.size.should == 4
51
-
52
- is_old_ft = new_fact_types.detect{|ft| ft.all_reading.detect{|r| r.text =~ /is old/} }
53
- (is_old_ft.all_reading.map{ |r| r.expand }*', ').should == "Person is old"
54
-
55
- new_readings = new_fact_types.
56
- reject{|ft| ft == is_old_ft}.
57
- map{|ft| ft.all_reading.map{|r| r.expand}*", "}
58
-
59
- new_readings.should include("Boolean = Age >= PRODUCT_OF<Integer SUM_OF<Integer, Integer>>")
60
- new_readings.should include("PRODUCT_OF<Integer SUM_OF<Integer, Integer>> = Integer * SUM_OF<Integer, Integer>")
61
- new_readings.should include("SUM_OF<Integer, Integer> = Integer + Integer")
62
-
63
- # one_query_with_value 60, 'year'
64
- end
65
- end
66
- end