openwferu 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/examples/kotoba.rb +22 -0
  2. data/lib/openwfe/engine/engine.rb +46 -10
  3. data/lib/openwfe/expool/expressionpool.rb +84 -71
  4. data/lib/openwfe/expool/history.rb +6 -2
  5. data/lib/openwfe/expool/journal.rb +9 -3
  6. data/lib/openwfe/expool/journal_replay.rb +8 -5
  7. data/lib/openwfe/expressions/fe_participant.rb +32 -1
  8. data/lib/openwfe/filterdef.rb +1 -1
  9. data/lib/openwfe/omixins.rb +70 -0
  10. data/lib/openwfe/participants/participantmap.rb +14 -1
  11. data/lib/openwfe/rest/definitions.rb +2 -1
  12. data/lib/openwfe/rest/xmlcodec.rb +56 -27
  13. data/lib/openwfe/util/kotoba.rb +2 -2
  14. data/lib/openwfe/util/workqueue.rb +177 -0
  15. data/lib/openwfe/utils.rb +52 -13
  16. data/lib/openwfe/version.rb +1 -1
  17. data/lib/openwfe/worklist/storeparticipant.rb +7 -4
  18. data/test/fei_test.rb +12 -1
  19. data/test/flowtestbase.rb +21 -8
  20. data/test/ft_0b_sequence.rb +6 -4
  21. data/test/ft_10_loop.rb +10 -5
  22. data/test/ft_10b_loop2.rb +5 -2
  23. data/test/ft_11_ppd.rb +12 -5
  24. data/test/ft_1_unset.rb +22 -13
  25. data/test/ft_23c_wait.rb +10 -6
  26. data/test/ft_25_cancel.rb +11 -5
  27. data/test/ft_27_getflowpos.rb +21 -4
  28. data/test/ft_28_fileparticipant.rb +1 -1
  29. data/test/ft_2c_concurrence.rb +8 -4
  30. data/test/ft_30_socketlistener.rb +8 -0
  31. data/test/ft_32_journal.rb +11 -2
  32. data/test/ft_34_cancelwfid.rb +4 -0
  33. data/test/ft_36_subprocids.rb +2 -1
  34. data/test/ft_37_pnames.rb +1 -1
  35. data/test/ft_38_tag.rb +5 -5
  36. data/test/ft_39_reserve.rb +1 -41
  37. data/test/ft_39b_reserve.rb +70 -0
  38. data/test/ft_40_defined.rb +2 -1
  39. data/test/ft_42_environments.rb +1 -2
  40. data/test/ft_45_citerator.rb +16 -4
  41. data/test/ft_46_pparams.rb +3 -0
  42. data/test/ft_49_condition.rb +2 -1
  43. data/test/ft_50_xml_attribute.rb +72 -3
  44. data/test/ft_51_stack.rb +58 -0
  45. data/test/ft_52_obs_participant.rb +127 -0
  46. data/test/ft_7b_lose.rb +5 -4
  47. data/test/ft_tests.rb +3 -0
  48. data/test/hparticipant_test.rb +21 -18
  49. data/test/misc_test.rb +9 -0
  50. data/test/param_test.rb +6 -0
  51. data/test/rake_test.rb +1 -0
  52. data/test/scheduler_test.rb +21 -0
  53. data/test/sec_test.rb +14 -27
  54. data/test/timeout_test.rb +6 -2
  55. metadata +8 -2
@@ -41,6 +41,7 @@
41
41
 
42
42
  require 'openwfe/workitem'
43
43
  require 'openwfe/service'
44
+ require 'openwfe/util/observable'
44
45
  require 'openwfe/participants/participants'
45
46
 
46
47
  include OpenWFE
@@ -52,6 +53,7 @@ module OpenWFE
52
53
  # A very simple directory of participants
53
54
  #
54
55
  class ParticipantMap < Service
56
+ include Observable
55
57
 
56
58
  attr_accessor \
57
59
  :participants
@@ -60,6 +62,8 @@ module OpenWFE
60
62
  super(service_name, application_context)
61
63
 
62
64
  @participants = []
65
+
66
+ @observers = {}
63
67
  end
64
68
 
65
69
  #
@@ -167,12 +171,21 @@ module OpenWFE
167
171
 
168
172
  workitem.participant_name = participant_name
169
173
 
170
- if workitem.kind_of? CancelItem and participant.respond_to? :cancel
174
+ if (workitem.kind_of?(CancelItem) and
175
+ participant.respond_to?(:cancel))
176
+
171
177
  participant.cancel(workitem)
178
+
179
+ onotify :dispatch, :cancel, workitem
180
+
172
181
  return
173
182
  end
174
183
 
184
+ onotify :dispatch, :before_consume, workitem
185
+
175
186
  participant.consume(workitem)
187
+
188
+ onotify :dispatch, :after_consume, workitem
176
189
  end
177
190
  end
178
191
 
@@ -67,7 +67,8 @@ module OpenWFE
67
67
  E_LONG = 'long'
68
68
  E_DOUBLE = 'double'
69
69
 
70
- E_XML = 'raw-xml'
70
+ E_RAW_XML = 'raw-xml'
71
+ E_XML_DOCUMENT = 'xml-document'
71
72
  E_BASE64 = 'base64'
72
73
 
73
74
  E_LIST = 'list'
@@ -37,6 +37,7 @@
37
37
  # "hecho en Costa Rica"
38
38
  #
39
39
 
40
+ require 'base64'
40
41
  require 'rexml/document'
41
42
 
42
43
  require 'openwfe/utils'
@@ -62,7 +63,11 @@ module OpenWFE
62
63
 
63
64
  if xmlElt.kind_of? String
64
65
 
65
- xmlElt = REXML::Document.new(xmlElt)
66
+ xmlElt = REXML::Document.new(
67
+ xmlElt,
68
+ :compress_whitespace => :all,
69
+ :ignore_whitespace_nodes => :all)
70
+
66
71
  xmlElt = xmlElt.root
67
72
  end
68
73
 
@@ -145,7 +150,7 @@ module OpenWFE
145
150
  launchable.url = xmlElt.attributes[URL]
146
151
  launchable.engine_id = xmlElt.attributes[ENGINE_ID]
147
152
 
148
- return launchable
153
+ launchable
149
154
  end
150
155
 
151
156
 
@@ -210,7 +215,7 @@ module OpenWFE
210
215
  #puts " ... fei.expressionName is >#{fei.expressionName}<"
211
216
  #puts " ... fei.wfid is >#{fei.workflowInstanceId}<"
212
217
 
213
- return fei
218
+ fei
214
219
  end
215
220
 
216
221
 
@@ -221,20 +226,30 @@ module OpenWFE
221
226
  #
222
227
  # atomic types
223
228
 
224
- return xmlElt.text if xmlElt.name == E_STRING
225
- return Integer(xmlElt.text) if xmlElt.name == E_INTEGER
226
- return Integer(xmlElt.text) if xmlElt.name == E_LONG
227
- return Float(xmlElt.text) if xmlElt.name == E_DOUBLE
228
- return parse_boolean(xmlElt.text) if xmlElt.name == E_BOOLEAN
229
-
230
- return xmlElt if xmlElt.name == E_XML
231
-
232
- return Base64Attribute.new(xmlElt.txt) if xmlElt.name == E_BASE64
229
+ return xmlElt.text \
230
+ if xmlElt.name == E_STRING
231
+ return Integer(xmlElt.text) \
232
+ if xmlElt.name == E_INTEGER
233
+ return Integer(xmlElt.text) \
234
+ if xmlElt.name == E_LONG
235
+ return Float(xmlElt.text) \
236
+ if xmlElt.name == E_DOUBLE
237
+ return parse_boolean(xmlElt.text) \
238
+ if xmlElt.name == E_BOOLEAN
239
+
240
+ return decode_xmldocument(xmlElt) \
241
+ if xmlElt.name == E_XML_DOCUMENT
242
+ return xmlElt.children[0] \
243
+ if xmlElt.name == E_RAW_XML
244
+
245
+ return Base64Attribute.new(xmlElt.text) \
246
+ if xmlElt.name == E_BASE64
233
247
 
234
248
  #
235
249
  # composite types
236
250
 
237
- return decode_list(xmlElt) if xmlElt.name == E_LIST
251
+ return decode_list(xmlElt) \
252
+ if xmlElt.name == E_LIST
238
253
 
239
254
  if xmlElt.name == E_SMAP or xmlElt.name == E_MAP
240
255
 
@@ -258,6 +273,12 @@ module OpenWFE
258
273
  OpenWFE.xmldoc_to_string(xmlElt.document())
259
274
  end
260
275
 
276
+ def decode_xmldocument (xmlElt)
277
+
278
+ s = Base64::decode64 xmlElt.text.strip
279
+ REXML::Document.new s
280
+ end
281
+
261
282
  def decode_entry (xmlElt, map)
262
283
 
263
284
  key = xmlElt.elements[1]
@@ -452,25 +473,27 @@ module OpenWFE
452
473
  #puts "encodeAttribute() att.class is #{att.class}"
453
474
 
454
475
  return encode_atomicattribute(E_STRING, att) \
455
- if att.kind_of? String
476
+ if att.kind_of?(String)
456
477
  return encode_atomicattribute(E_INTEGER, att) \
457
- if att.kind_of? Fixnum
478
+ if att.kind_of?(Fixnum)
458
479
  return encode_atomicattribute(E_DOUBLE, att) \
459
- if att.kind_of? Float
480
+ if att.kind_of?(Float)
460
481
 
482
+ return encode_xmldocument(att) \
483
+ if att.kind_of?(REXML::Document)
461
484
  return encode_xmlattribute(att) \
462
- if att.kind_of? REXML::Element
485
+ if att.kind_of?(REXML::Element)
463
486
 
464
487
  return encode_atomicattribute(E_BOOLEAN, true) \
465
- if att.kind_of? TrueClass
488
+ if att.kind_of?(TrueClass)
466
489
  return encode_atomicattribute(E_BOOLEAN, false) \
467
- if att.kind_of? FalseClass
490
+ if att.kind_of?(FalseClass)
468
491
 
469
492
  return encode_base64attribute(att) \
470
- if att.kind_of? Base64Attribute
493
+ if att.kind_of?(Base64Attribute)
471
494
 
472
- return encode_mapattribute(att) if att.kind_of? Hash
473
- return encode_listattribute(att) if att.kind_of? Array
495
+ return encode_mapattribute(att) if att.kind_of?(Hash)
496
+ return encode_listattribute(att) if att.kind_of?(Array)
474
497
 
475
498
  #
476
499
  # default
@@ -482,18 +505,24 @@ module OpenWFE
482
505
  # "Cannot encode attribute of class '#{att.class}'"
483
506
  end
484
507
 
508
+ def encode_xmldocument (elt)
509
+
510
+ e = REXML::Element.new(E_XML_DOCUMENT)
511
+ e.text = Base64::encode64(elt.to_s)
512
+ e
513
+ end
485
514
 
486
515
  def encode_xmlattribute (elt)
487
516
 
488
- return elt if elt.name == E_XML
517
+ return elt if elt.name == E_RAW_XML
489
518
 
490
519
  #
491
520
  # else, wrap within <raw-xml>...</raw-xml>
492
521
 
493
- e = REXML::Element.new(E_XML)
522
+ e = REXML::Element.new(E_RAW_XML)
494
523
  e << elt
495
524
 
496
- return e
525
+ e
497
526
  end
498
527
 
499
528
 
@@ -502,7 +531,7 @@ module OpenWFE
502
531
  e = REXML::Element.new(E_BASE64)
503
532
  e.text = att.content
504
533
 
505
- return e
534
+ e
506
535
  end
507
536
 
508
537
 
@@ -512,7 +541,7 @@ module OpenWFE
512
541
  #elt << REXML::Text.new(value.to_s())
513
542
  elt.add_text(value.to_s())
514
543
 
515
- return elt
544
+ elt
516
545
  end
517
546
 
518
547
 
@@ -1,6 +1,6 @@
1
1
  #
2
2
  #--
3
- # Copyright (c) 2006-2007, John Mettraux OpenWFE.org
3
+ # Copyright (c) 2007, John Mettraux OpenWFE.org
4
4
  # All rights reserved.
5
5
  #
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -53,7 +53,7 @@
53
53
  #
54
54
  # Kotoba is meant to be used for generating human readable (or more
55
55
  # easily rememberable) identifiers. Its first usage is within the
56
- # OpenWFEru Ruby workflow and bpm engine for generating 'kawai'
56
+ # OpenWFEru Ruby workflow and bpm engine for generating 'kawaii'
57
57
  # business process intance ids.
58
58
  #
59
59
  # == Kotoba from the command line
@@ -0,0 +1,177 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+ # $Id$
34
+ #
35
+
36
+ #
37
+ # "made in Japan"
38
+ #
39
+ # John Mettraux at openwfe.org
40
+ #
41
+
42
+ require 'thread'
43
+ require 'openwfe/utils'
44
+
45
+
46
+ module OpenWFE
47
+
48
+ module WorkqueueMixin
49
+
50
+ WQF_LOW = 0.500
51
+
52
+ #
53
+ # Starts the workqueue with a given frequency (seconds)
54
+ #
55
+ def start_workqueue
56
+
57
+ @workqueue_mutex = Mutex.new
58
+ @workqueue = []
59
+ @workqueue_frequency = 0
60
+
61
+ OpenWFE::call_in_thread "expression_pool", self do
62
+ while true
63
+ sleep @workqueue_frequency
64
+ break if @workqueue_frequency == nil
65
+ do_process_workqueue
66
+ end
67
+ end
68
+ end
69
+
70
+ #
71
+ # Returns true if there is or there just was activity for the ]
72
+ # work queue.
73
+ #
74
+ def is_workqueue_busy?
75
+ (@workqueue.size > 0 or @workqueue_frequency < WQF_LOW)
76
+ end
77
+
78
+ #
79
+ # Stops the workqueue.
80
+ #
81
+ def stop_workqueue
82
+ @workqueue_frequency = nil
83
+ do_process_workqueue
84
+ end
85
+
86
+ #
87
+ # the method called by the mixer to actually queue the work.
88
+ #
89
+ def queue_work (*args)
90
+ @workqueue_mutex.synchronize do
91
+
92
+ if @workqueue
93
+ @workqueue.push args
94
+ #
95
+ # work will be done later (millisec order)
96
+ # by the work thread
97
+ else
98
+ do_process_workelement args
99
+ #
100
+ # degraded mode : as if there were no workqueue
101
+ end
102
+ end
103
+ end
104
+
105
+ #
106
+ # Returns the current workqueue size
107
+ #
108
+ def workqueue_size
109
+ return 0 unless @workqueue
110
+ @workqueue.size
111
+ end
112
+
113
+ #
114
+ # Called by the workqueue thread, copies the workqueue and clears
115
+ # it, and then processes the elt in the copied workqueue.
116
+ # (meanwhile, the empty workqueue gets filled by queue_work()
117
+ # calls)
118
+ #
119
+ # This method calls the do_process_workelement() method of
120
+ # its 'mixer' with each work element queued.
121
+ #
122
+ def do_process_workqueue
123
+
124
+ q = nil
125
+
126
+ @workqueue_mutex.synchronize do
127
+
128
+ if @workqueue.size < 1
129
+ increment_workqueue_frequency
130
+ return
131
+ end
132
+
133
+ q = Array.new(@workqueue)
134
+ @workqueue.clear
135
+
136
+ @workqueue_frequency = 0
137
+ #
138
+ # back to maximum reponsiveness
139
+ end
140
+
141
+ #ldebug { "do_process_workqueue() #{q.size} items to process" }
142
+
143
+ q.each do |elt|
144
+ begin
145
+
146
+ do_process_workelement elt
147
+
148
+ rescue Exception => e
149
+
150
+ lwarn do
151
+ "#{self.service_name} caught an exception\n" +
152
+ OpenWFE::exception_to_s(e)
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ protected
159
+
160
+ #
161
+ # No activity spotted, so decrease responsiveness
162
+ #
163
+ def increment_workqueue_frequency
164
+
165
+ return if @workqueue_frequency == nil
166
+
167
+ @workqueue_frequency *= 3
168
+
169
+ if @workqueue_frequency == 0
170
+ @workqueue_frequency = 0.001
171
+ elsif @workqueue_frequency > WQF_LOW
172
+ @workqueue_frequency = WQF_LOW
173
+ end
174
+ end
175
+ end
176
+ end
177
+
data/lib/openwfe/utils.rb CHANGED
@@ -112,27 +112,34 @@ module OpenWFE
112
112
 
113
113
  return nil if object == nil
114
114
 
115
- return object if object.kind_of? Float
116
- return object if object.kind_of? Fixnum
117
- return object if object.kind_of? TrueClass
118
- return object if object.kind_of? FalseClass
115
+ return object if object.kind_of?(Float)
116
+ return object if object.kind_of?(Fixnum)
117
+ return object if object.kind_of?(TrueClass)
118
+ return object if object.kind_of?(FalseClass)
119
119
 
120
- return object.dup if object.kind_of? String
120
+ return object.dup if object.kind_of?(String)
121
121
 
122
122
  #return deep_clone(object) if object.kind_of? REXML::Document
123
- return REXML::Document.new(object.to_s) \
124
- if object.kind_of? REXML::Document
123
+
124
+ #return REXML::Document.new(object.to_s) \
125
+ # if object.kind_of? REXML::Document
126
+
127
+ if object.kind_of?(REXML::Element)
128
+ d = REXML::Document.new object.to_s
129
+ return d if object.kind_of?(REXML::Document)
130
+ return d.root
131
+ end
125
132
 
126
133
  o = object.class.new
127
134
 
128
135
  #
129
136
  # some kind of collection ?
130
137
 
131
- if object.kind_of? Array
138
+ if object.kind_of?(Array)
132
139
  object.each do |i|
133
140
  o << fulldup(i)
134
141
  end
135
- elsif object.kind_of? Hash
142
+ elsif object.kind_of?(Hash)
136
143
  object.each do |k, v|
137
144
  o[copy(k)] = fulldup(v)
138
145
  end
@@ -158,7 +165,7 @@ module OpenWFE
158
165
  end
159
166
  end
160
167
 
161
- return o
168
+ o
162
169
  end
163
170
 
164
171
  def OpenWFE.to_underscore (string)
@@ -195,7 +202,7 @@ module OpenWFE
195
202
  return URI::parse(string)
196
203
  rescue Exception => e
197
204
  end
198
- return nil
205
+ nil
199
206
  end
200
207
 
201
208
  #
@@ -209,7 +216,7 @@ module OpenWFE
209
216
  #
210
217
  return false unless string
211
218
  return false if string.length < start.length
212
- return string[0, start.length] == start
219
+ string[0, start.length] == start
213
220
  end
214
221
 
215
222
  #
@@ -218,7 +225,7 @@ module OpenWFE
218
225
  def OpenWFE.ends_with (string, _end)
219
226
  return false unless string
220
227
  return false if string.length < _end.length
221
- return string[-_end.length..-1] == _end
228
+ string[-_end.length..-1] == _end
222
229
  end
223
230
 
224
231
  #
@@ -254,6 +261,8 @@ module OpenWFE
254
261
  # raw_expression.apply(wi)
255
262
  # end
256
263
  #
264
+ # Returns the new thread instance.
265
+ #
257
266
  def OpenWFE.call_in_thread (caller_name, caller_object=nil, &block)
258
267
 
259
268
  return unless block
@@ -262,10 +271,12 @@ module OpenWFE
262
271
  begin
263
272
  #$SAFE = safe_level
264
273
  #
274
+ # (note)
265
275
  # doesn't work : the block inherits the safety level
266
276
  # of its surroundings, it's a closure, ne ?
267
277
 
268
278
  block.call
279
+
269
280
  rescue Exception => e
270
281
  msg = "#{caller_name} caught an exception\n" + exception_to_s(e)
271
282
  if caller_object and caller_object.respond_to? :lwarn
@@ -370,6 +381,34 @@ module OpenWFE
370
381
  return has_attribute?(rest, key)
371
382
  end
372
383
 
384
+ #
385
+ # Returns a list of lines matching the pattern in the given file.
386
+ #
387
+ # This is also possible :
388
+ #
389
+ # OpenWFE::grep "^..) ", "path/to/file.txt" do |line|
390
+ # puts " - '#{line.downcase}'"
391
+ # end
392
+ #
393
+ def OpenWFE.grep (pattern, filepath, &block)
394
+
395
+ result = []
396
+ r = Regexp.new pattern
397
+
398
+ File.open filepath do |file|
399
+ file.readlines.each do |l|
400
+ if r.match l
401
+ if block
402
+ block.call l
403
+ else
404
+ result << l
405
+ end
406
+ end
407
+ end
408
+ end
409
+ result unless block
410
+ end
411
+
373
412
  #
374
413
  # This method is used within the InFlowWorkItem and the CsvTable classes.
375
414
  #
@@ -34,5 +34,5 @@
34
34
  #
35
35
 
36
36
  module OpenWFE
37
- OPENWFERU_VERSION = '0.9.9'
37
+ OPENWFERU_VERSION = '0.9.10'
38
38
  end
@@ -39,6 +39,7 @@
39
39
  #
40
40
 
41
41
  require 'openwfe/utils'
42
+ require 'openwfe/omixins'
42
43
  require 'openwfe/rudefinitions'
43
44
  require 'openwfe/storage/yamlfilestorage'
44
45
  require 'openwfe/participants/participant'
@@ -65,6 +66,7 @@ module OpenWFE
65
66
  #
66
67
  module StoreParticipantMixin
67
68
  include LocalParticipant
69
+ include FeiMixin
68
70
 
69
71
  #def initialize ()
70
72
  #end
@@ -132,9 +134,10 @@ module OpenWFE
132
134
  # identifier.
133
135
  #
134
136
  def delete (wi_or_fei)
135
- fei = wi_or_fei
136
- fei = fei.fei if fei.is_a? InFlowWorkItem
137
- super fei
137
+ #fei = wi_or_fei
138
+ #fei = fei.fei if fei.is_a? InFlowWorkItem
139
+ #super fei
140
+ super extract_fei(wi_or_fei)
138
141
  end
139
142
 
140
143
  #
@@ -159,7 +162,7 @@ module OpenWFE
159
162
  if (not workflow_instance_id) or workitem.fei.parent_wfid == workflow_instance_id
160
163
  end
161
164
 
162
- return result
165
+ result
163
166
  end
164
167
 
165
168
  #
data/test/fei_test.rb CHANGED
@@ -9,9 +9,10 @@
9
9
 
10
10
  require 'test/unit'
11
11
  require 'rutest_utils'
12
+ #require 'openwfe/owfe'
12
13
  require 'openwfe/workitem'
13
14
  require 'openwfe/flowexpressionid'
14
- #require 'openwfe/rudefinitions'
15
+ require 'openwfe/rudefinitions'
15
16
 
16
17
 
17
18
  class FeiTest < Test::Unit::TestCase
@@ -131,6 +132,16 @@ class FeiTest < Test::Unit::TestCase
131
132
  "failure 1"
132
133
  end
133
134
 
135
+ #def test_to_fei
136
+ # fei = new_fei
137
+ # wi = OpenWFE::InFlowItem.new
138
+ # wi.last_expression_id = fei
139
+ # assert_nil OpenWFE::to_fei(nil)
140
+ # assert_equal fei, OpenWFE::to_fei(fei)
141
+ # assert_equal fei, OpenWFE::to_fei(wi)
142
+ # assert_equal fei, OpenWFE::to_fei(fei.to_s)
143
+ #end
144
+
134
145
  protected
135
146
 
136
147
  def puts_hash (h)