proteus 0.9.0

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 (43) hide show
  1. data/COPYING +674 -0
  2. data/README +88 -0
  3. data/Rakefile +33 -0
  4. data/bin/pro +189 -0
  5. data/lib/ClassParser.rb +84 -0
  6. data/lib/ComponentClass.rb +51 -0
  7. data/lib/ComponentInstance.rb +76 -0
  8. data/lib/DefinitionHelper.rb +157 -0
  9. data/lib/DefinitionParser.rb +107 -0
  10. data/lib/Facade.rb +116 -0
  11. data/lib/FileHelper.rb +80 -0
  12. data/lib/InputParser.rb +241 -0
  13. data/lib/InstanceParser.rb +65 -0
  14. data/lib/InstanceProxy.rb +100 -0
  15. data/lib/PropertyHash.rb +64 -0
  16. data/lib/TemplateRenderer.rb +128 -0
  17. data/lib/exceptions.rb +50 -0
  18. data/test/spec/ClassParser_spec.rb +314 -0
  19. data/test/spec/ComponentClass_spec.rb +44 -0
  20. data/test/spec/ComponentInstance_spec.rb +50 -0
  21. data/test/spec/DefinitionHelper_spec.rb +134 -0
  22. data/test/spec/DefinitionParser_spec.rb +236 -0
  23. data/test/spec/Facade_spec.rb +44 -0
  24. data/test/spec/FileHelper_spec.rb +113 -0
  25. data/test/spec/InputParser_spec.rb +424 -0
  26. data/test/spec/InstanceParser_spec.rb +125 -0
  27. data/test/spec/TemplateRenderer_spec.rb +54 -0
  28. data/test/spec/lib/NS1/TestComponent10.def +4 -0
  29. data/test/spec/lib/NS1/TestComponent11.def +4 -0
  30. data/test/spec/lib/NS1/TestComponent4.def +4 -0
  31. data/test/spec/lib/NS1/TestComponent5.def +4 -0
  32. data/test/spec/lib/NS1/TestComponent8.def +4 -0
  33. data/test/spec/lib/NS1/TestComponent9.def +4 -0
  34. data/test/spec/lib/NS2/TestComponent6.def +4 -0
  35. data/test/spec/lib/TestComponent1.def +4 -0
  36. data/test/spec/lib/TestComponent3.def +4 -0
  37. data/test/spec/test_lib_dir1/File1.def +0 -0
  38. data/test/spec/test_lib_dir1/File3.def +0 -0
  39. data/test/spec/test_lib_dir1/NS1/File4.def +0 -0
  40. data/test/spec/test_lib_dir1/NS1/NS2/File5.def +0 -0
  41. data/test/spec/test_lib_dir2/File1.def +0 -0
  42. data/test/spec/test_lib_dir2/File2.def +0 -0
  43. metadata +113 -0
@@ -0,0 +1,44 @@
1
+ ################################################################################
2
+ # (C) Copyright 2009 William Madden
3
+ #
4
+ # This file is part of Proteus.
5
+ #
6
+ # Proteus is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along with
16
+ # Proteus. If not, see <http://www.gnu.org/licenses/>.
17
+ ################################################################################
18
+
19
+ require File.expand_path( 'lib/Facade.rb' )
20
+
21
+ include Proteus
22
+
23
+
24
+ describe Facade do
25
+
26
+ #-----------------------------------------------------------------------------
27
+ #
28
+ # Input Constants
29
+ #
30
+ #-----------------------------------------------------------------------------
31
+
32
+ #-----------------------------------------------------------------------------
33
+ #
34
+ # Set up, tear down
35
+ #
36
+ #-----------------------------------------------------------------------------
37
+
38
+ #-----------------------------------------------------------------------------
39
+ #
40
+ # Tests
41
+ #
42
+ #-----------------------------------------------------------------------------
43
+
44
+ end
@@ -0,0 +1,113 @@
1
+ ################################################################################
2
+ # (C) Copyright 2009 William Madden
3
+ #
4
+ # This file is part of Proteus.
5
+ #
6
+ # Proteus is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along with
16
+ # Proteus. If not, see <http://www.gnu.org/licenses/>.
17
+ ################################################################################
18
+
19
+ require File.expand_path( 'lib/FileHelper.rb' )
20
+
21
+ include Proteus
22
+
23
+
24
+ describe FileHelper do
25
+
26
+ #-----------------------------------------------------------------------------
27
+ #
28
+ # Input Constants
29
+ #
30
+ #-----------------------------------------------------------------------------
31
+
32
+ @@LIB_DIR_1 = "test/spec/test_lib_dir1"
33
+ @@LIB_DIR_2 = "test/spec/test_lib_dir2"
34
+ @@PATH = @@LIB_DIR_1 + ":" + @@LIB_DIR_2
35
+
36
+ # Correct answers
37
+ @@FILE_1_PATH = @@LIB_DIR_1 + "/File1.def"
38
+ @@FILE_2_PATH = @@LIB_DIR_2 + "/File2.def"
39
+ @@FILE_3_PATH = @@LIB_DIR_1 + "/File3.def"
40
+ @@FILE_4_PATH = @@LIB_DIR_1 + "/NS1/File4.def"
41
+ @@FILE_5_PATH = @@LIB_DIR_1 + "/NS1/NS2/File5.def"
42
+
43
+ #-----------------------------------------------------------------------------
44
+ #
45
+ # Tests
46
+ #
47
+ #-----------------------------------------------------------------------------
48
+
49
+ #
50
+ # Handle collisions - return first match.
51
+ #
52
+ it "should return the first matching file" do
53
+
54
+ # Search for "File1.def", it should be found in test_lib_dir1
55
+ file = FileHelper.find_file( 'File1.def', @@PATH )
56
+
57
+ file.should == @@FILE_1_PATH
58
+
59
+ end
60
+
61
+
62
+ #
63
+ # Search all paths.
64
+ #
65
+ it "should search all directories" do
66
+
67
+ # Search for "File2.def", it should be found in test_lib_dir2
68
+ file = FileHelper.find_file( 'File2.def', @@PATH )
69
+
70
+ file.should == @@FILE_2_PATH
71
+
72
+ end
73
+
74
+
75
+ #
76
+ # Search for definition with no namespaces.
77
+ #
78
+ it "should find definitions by classname" do
79
+
80
+ # Search for ["File3"]
81
+ file = FileHelper.find_definition( ['File3'], @@PATH )
82
+
83
+ file.should == @@FILE_3_PATH
84
+
85
+ end
86
+
87
+
88
+ #
89
+ # Search for definition nested under one namespace.
90
+ #
91
+ it "should find definitions with one namespace" do
92
+
93
+ # Search for ["NS1", "File4"]
94
+ file = FileHelper.find_definition( ['NS1', 'File4'], @@PATH )
95
+
96
+ file.should == @@FILE_4_PATH
97
+
98
+ end
99
+
100
+
101
+ #
102
+ # Search for definition nested by more than one namespace.
103
+ #
104
+ it "should find definitions with multiple namespaces" do
105
+
106
+ # Search for ["NS1", "NS2", "File5"]
107
+ file = FileHelper.find_definition( ['NS1', 'NS2', 'File5'], @@PATH )
108
+
109
+ file.should == @@FILE_5_PATH
110
+
111
+ end
112
+
113
+ end
@@ -0,0 +1,424 @@
1
+ ################################################################################
2
+ # (C) Copyright 2009 William Madden
3
+ #
4
+ # This file is part of Proteus.
5
+ #
6
+ # Proteus is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # Proteus is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along with
16
+ # Proteus. If not, see <http://www.gnu.org/licenses/>.
17
+ ################################################################################
18
+
19
+ require File.expand_path( 'lib/InputParser.rb' )
20
+
21
+ include Proteus
22
+
23
+
24
+ describe InputParser do
25
+
26
+ #-----------------------------------------------------------------------------
27
+ #
28
+ # Input Constants
29
+ #
30
+ #-----------------------------------------------------------------------------
31
+
32
+ # Nil
33
+
34
+ @@NIL = nil
35
+
36
+ # Scalars
37
+
38
+ @@INVALID_SCALAR_COMPONENT = "not a component"
39
+ @@INVALID_SCALAR_COMPONENT2 = "Not A Component"
40
+ @@INVALID_SCALAR_COMPONENT3 = "Definitely Not Component"
41
+
42
+ @@KNOWN_SCALAR_COMPONENT = "TestComponent1"
43
+ @@KNOWN_SCALAR_COMPONENT2 = "TestComponent3"
44
+
45
+ @@UNKNOWN_SCALAR_COMPONENT = "TestComponent2"
46
+
47
+ @@COMPONENT_PROPERTIES = {
48
+ "prop1" => "val1",
49
+ "prop2" => "val2",
50
+ "prop3" => @@KNOWN_SCALAR_COMPONENT
51
+ }
52
+
53
+ # Hashes
54
+
55
+ @@KNOWN_COMPONENT_HASH = {
56
+ @@KNOWN_SCALAR_COMPONENT => @@COMPONENT_PROPERTIES
57
+ }
58
+
59
+ @@KNOWN_COMPONENT_HASH2 = {
60
+ @@KNOWN_SCALAR_COMPONENT2 => @@COMPONENT_PROPERTIES
61
+ }
62
+
63
+ @@INVALID_COMPONENT_HASH = {
64
+ @@INVALID_SCALAR_COMPONENT => @@COMPONENT_PROPERTIES
65
+ }
66
+
67
+ @@INVALID_COMPONENT_HASH2 = {
68
+ @@INVALID_SCALAR_COMPONENT2 => @@COMPONENT_PROPERTIES
69
+ }
70
+
71
+ @@UNKNOWN_COMPONENT_HASH = {
72
+ @@UNKNOWN_SCALAR_COMPONENT => @@COMPONENT_PROPERTIES
73
+ }
74
+
75
+ @@LONG_COMPONENT_HASH = {
76
+ @@KNOWN_SCALAR_COMPONENT => @@COMPONENT_PROPERTIES,
77
+ @@KNOWN_SCALAR_COMPONENT2 => @@COMPONENT_PROPERTIES
78
+ }
79
+
80
+ # Arrays
81
+
82
+ @@EMPTY_ARRAY = []
83
+
84
+ @@NONC_SCALAR_ARRAY = [ @@INVALID_SCALAR_COMPONENT ]
85
+
86
+ @@COMP_SCALAR_ARRAY = [ @@KNOWN_SCALAR_COMPONENT ]
87
+
88
+ @@MANY_NONC_SCALAR_ARRAY = [
89
+ @@INVALID_SCALAR_COMPONENT,
90
+ @@INVALID_SCALAR_COMPONENT2,
91
+ @@INVALID_SCALAR_COMPONENT3
92
+ ]
93
+
94
+ @@MANY_COMP_SCALAR_ARRAY = [
95
+ @@KNOWN_SCALAR_COMPONENT,
96
+ @@KNOWN_SCALAR_COMPONENT2
97
+ ]
98
+
99
+ @@MIXED_SCALAR_ARRAY = [
100
+ @@INVALID_SCALAR_COMPONENT,
101
+ @@KNOWN_SCALAR_COMPONENT,
102
+ @@INVALID_SCALAR_COMPONENT2,
103
+ @@KNOWN_SCALAR_COMPONENT2
104
+ ]
105
+
106
+ @@NONC_HASH_ARRAY = [ @@INVALID_COMPONENT_HASH ]
107
+ @@COMP_HASH_ARRAY = [ @@KNOWN_COMPONENT_HASH ]
108
+
109
+ @@MANY_NONC_HASH_ARRAY = [
110
+ @@INVALID_COMPONENT_HASH,
111
+ @@INVALID_COMPONENT_HASH2,
112
+ @@INVALID_COMPONENT_HASH
113
+ ]
114
+ @@MANY_COMP_HASH_ARRAY = [
115
+ @@KNOWN_COMPONENT_HASH,
116
+ @@KNOWN_COMPONENT_HASH2,
117
+ @@KNOWN_COMPONENT_HASH
118
+ ]
119
+
120
+ @@MIXED_HASH_ARRAY = [
121
+ @@INVALID_COMPONENT_HASH,
122
+ @@KNOWN_COMPONENT_HASH,
123
+ @@INVALID_COMPONENT_HASH2,
124
+ @@KNOWN_COMPONENT_HASH2
125
+ ]
126
+
127
+ @@MIXED_ARRAY = [
128
+ @@KNOWN_SCALAR_COMPONENT,
129
+ @@KNOWN_COMPONENT_HASH,
130
+ @@INVALID_SCALAR_COMPONENT,
131
+ @@INVALID_COMPONENT_HASH
132
+ ]
133
+
134
+ #-----------------------------------------------------------------------------
135
+ #
136
+ # Set up, tear down
137
+ #
138
+ #-----------------------------------------------------------------------------
139
+
140
+ #------------------------------
141
+ # before(:all)
142
+ #------------------------------
143
+
144
+ before(:all) do
145
+
146
+ # Instance parser
147
+ @instance_parser = InstanceParser.new
148
+
149
+ # Class parser
150
+ @class_parser = ClassParser.new
151
+
152
+ # Definition parser
153
+ @definition_parser = DefinitionParser.new
154
+ @definition_parser.class_parser = @class_parser
155
+
156
+ # Definition helper
157
+ @definition_helper = DefinitionHelper.new
158
+ @definition_helper.definition_parser = @definition_parser
159
+ @definition_helper.path = "test/spec/lib"
160
+
161
+ @definition_parser.definition_helper = @definition_helper
162
+
163
+ # Input parser
164
+ @input_parser = InputParser.new
165
+ @input_parser.instance_parser = @instance_parser
166
+ @input_parser.definition_helper = @definition_helper
167
+
168
+ @definition_parser.input_parser = @input_parser
169
+
170
+ end
171
+
172
+ #-----------------------------------------------------------------------------
173
+ #
174
+ # Helper functions
175
+ #
176
+ #-----------------------------------------------------------------------------
177
+
178
+ def check_hash_parsed( hash )
179
+ hash.is_a?( Hash ).should == true
180
+ hash.length.should == 1
181
+
182
+ check_properties_parsed( hash.values[0] )
183
+ end
184
+
185
+ def check_properties_parsed( hash )
186
+ hash.length.should == 3
187
+
188
+ hash["prop1"].should == "val1"
189
+ hash["prop2"].should == "val2"
190
+ hash["prop3"].is_a?( ComponentInstance ).should == true
191
+ hash["prop3"].kind.name.should == @@KNOWN_SCALAR_COMPONENT
192
+ end
193
+
194
+ #-----------------------------------------------------------------------------
195
+ #
196
+ # Tests
197
+ #
198
+ #-----------------------------------------------------------------------------
199
+
200
+ # Parse nil:
201
+ # nil
202
+
203
+ it "nil -> nil" do
204
+ result = @input_parser.parse_yaml( @@NIL )
205
+ result.should == @@NIL
206
+ end
207
+
208
+
209
+ # Parse scalar:
210
+ # invalid component name -> scalar
211
+ # valid, known component name -> component instance
212
+ # valid but unknown component name -> scalar
213
+
214
+ it "invalid component name -> scalar" do
215
+ result = @input_parser.parse_yaml( @@INVALID_SCALAR_COMPONENT )
216
+ result.should == @@INVALID_SCALAR_COMPONENT
217
+ end
218
+
219
+ it "valid, known component name -> component instance" do
220
+ result = @input_parser.parse_yaml( @@KNOWN_SCALAR_COMPONENT )
221
+ result.is_a?( ComponentInstance ).should == true
222
+ end
223
+
224
+
225
+ it "valid but unknown component name -> scalar" do
226
+ result = @input_parser.parse_yaml( @@UNKNOWN_SCALAR_COMPONENT )
227
+ result.should == @@UNKNOWN_SCALAR_COMPONENT
228
+ end
229
+
230
+
231
+ # Parse hash:
232
+ # length 1 with valid, known component name -> component instance
233
+ # length 1 with valid, unknown component name -> hash of parsed values
234
+ # length 1 with invalid component name -> hash of parsed values
235
+ # length > 1 -> hash of parsed values
236
+
237
+ it "length 1 with valid, known component name -> component instance" do
238
+ result = @input_parser.parse_yaml( @@KNOWN_COMPONENT_HASH )
239
+
240
+ result.is_a?( ComponentInstance ).should == true
241
+ result.kind.name.should == @@KNOWN_SCALAR_COMPONENT
242
+ end
243
+
244
+
245
+ it "length 1 with valid, unknown component name -> hash of parsed values" do
246
+ result = @input_parser.parse_yaml( @@UNKNOWN_COMPONENT_HASH )
247
+
248
+ check_hash_parsed( result )
249
+ end
250
+
251
+
252
+ it "length 1 with invalid component name -> hash of parsed values" do
253
+ result = @input_parser.parse_yaml( @@INVALID_COMPONENT_HASH )
254
+
255
+ check_hash_parsed( result )
256
+ end
257
+
258
+
259
+ it "length > 1 -> hash of parsed values" do
260
+ result = @input_parser.parse_yaml( @@LONG_COMPONENT_HASH )
261
+
262
+ result.length.should == 2
263
+
264
+ result.keys[0].should == @@KNOWN_SCALAR_COMPONENT
265
+ result.keys[1].should == @@KNOWN_SCALAR_COMPONENT2
266
+
267
+ check_properties_parsed( result.values[0] )
268
+ check_properties_parsed( result.values[1] )
269
+ end
270
+
271
+
272
+ # Parse arrays:
273
+ # empty array -> empty array
274
+ # array of single, non-component scalar -> array of parsed values
275
+ # array of single, component scalar -> array of component instance
276
+ # array of many non-component scalars -> array of parsed values
277
+ # array of many component scalars -> array of component instances
278
+ # array of mixed scalars -> array of parsed values
279
+ # array of single, non-component hash -> array of parsed hash
280
+ # array of single, component hash -> array of component instance
281
+ # array of many non-component hashes -> array of parsed hashes
282
+ # array of many component hashes -> array of component instances
283
+ # array of mixed hashes -> array of parsed hashes
284
+ # array of mixed scalars and hashes -> array of parsed values
285
+
286
+ it "empty array -> empty array" do
287
+ result = @input_parser.parse_yaml( @@EMPTY_ARRAY )
288
+ result.should == @@EMPTY_ARRAY
289
+ end
290
+
291
+
292
+ it "array of single, non-component scalar -> array of parsed values" do
293
+ result = @input_parser.parse_yaml( @@NONC_SCALAR_ARRAY )
294
+ result.should == @@NONC_SCALAR_ARRAY
295
+ end
296
+
297
+
298
+ it "array of single, component scalar -> array of component instance" do
299
+ result = @input_parser.parse_yaml( @@COMP_SCALAR_ARRAY )
300
+ result.length.should == 1
301
+ result[0].is_a?( ComponentInstance ).should == true
302
+ result[0].kind.name.should == @@KNOWN_SCALAR_COMPONENT
303
+ end
304
+
305
+
306
+ it "array of many non-component scalars -> array of parsed values" do
307
+ result = @input_parser.parse_yaml( @@MANY_NONC_SCALAR_ARRAY )
308
+ result.should == @@MANY_NONC_SCALAR_ARRAY
309
+ end
310
+
311
+
312
+ it "array of many component scalars -> array of component instances" do
313
+ result = @input_parser.parse_yaml( @@MANY_COMP_SCALAR_ARRAY )
314
+
315
+ result.length.should == 2
316
+
317
+ result[0].is_a?( ComponentInstance ).should == true
318
+ result[0].kind.name.should == @@KNOWN_SCALAR_COMPONENT
319
+
320
+ result[1].is_a?( ComponentInstance ).should == true
321
+ result[1].kind.name.should == @@KNOWN_SCALAR_COMPONENT2
322
+ end
323
+
324
+
325
+ it "array of mixed scalars -> array of parsed values" do
326
+ result = @input_parser.parse_yaml( @@MIXED_SCALAR_ARRAY )
327
+
328
+ result.length.should == 4
329
+
330
+ result[0].should == @@INVALID_SCALAR_COMPONENT
331
+
332
+ result[1].is_a?( ComponentInstance ).should == true
333
+ result[1].kind.name.should == @@KNOWN_SCALAR_COMPONENT
334
+
335
+ result[2].should == @@INVALID_SCALAR_COMPONENT2
336
+
337
+ result[3].is_a?( ComponentInstance ).should == true
338
+ result[3].kind.name.should == @@KNOWN_SCALAR_COMPONENT2
339
+ end
340
+
341
+
342
+ it "array of single, non-component hash -> array of parsed hash" do
343
+ result = @input_parser.parse_yaml( @@NONC_HASH_ARRAY )
344
+ result.length.should == 1
345
+ result[0].is_a?( Hash ).should == true
346
+
347
+ check_hash_parsed( result[0] )
348
+ end
349
+
350
+
351
+ it "array of single, component hash -> array of component instance" do
352
+ result = @input_parser.parse_yaml( @@COMP_HASH_ARRAY )
353
+ result.length.should == 1
354
+ result[0].is_a?( ComponentInstance ).should == true
355
+ result[0].kind.name.should == @@KNOWN_SCALAR_COMPONENT
356
+ end
357
+
358
+
359
+ it "array of many non-component hashes -> array of parsed hashes" do
360
+ result = @input_parser.parse_yaml( @@MANY_NONC_HASH_ARRAY )
361
+
362
+ result.length.should == 3
363
+
364
+ result[0].is_a?( Hash ).should == true
365
+ result[1].is_a?( Hash ).should == true
366
+ result[2].is_a?( Hash ).should == true
367
+
368
+ check_hash_parsed( result[0] )
369
+ check_hash_parsed( result[1] )
370
+ check_hash_parsed( result[2] )
371
+ end
372
+
373
+
374
+ it "array of many component hashes -> array of component instances" do
375
+ result = @input_parser.parse_yaml( @@MANY_COMP_HASH_ARRAY )
376
+
377
+ result.length.should == 3
378
+
379
+ result[0].is_a?( ComponentInstance ).should == true
380
+ result[0].kind.name.should == @@KNOWN_SCALAR_COMPONENT
381
+ result[1].is_a?( ComponentInstance ).should == true
382
+ result[1].kind.name.should == @@KNOWN_SCALAR_COMPONENT2
383
+ result[2].is_a?( ComponentInstance ).should == true
384
+ result[2].kind.name.should == @@KNOWN_SCALAR_COMPONENT
385
+ end
386
+
387
+
388
+ it "array of mixed hashes -> array of parsed hashes" do
389
+ result = @input_parser.parse_yaml( @@MIXED_HASH_ARRAY )
390
+
391
+ result.length.should == 4
392
+
393
+ check_hash_parsed( result[0] )
394
+
395
+ result[1].is_a?( ComponentInstance ).should == true
396
+ result[1].kind.name.should == @@KNOWN_SCALAR_COMPONENT
397
+
398
+ check_hash_parsed( result[2] )
399
+
400
+ result[3].is_a?( ComponentInstance ).should == true
401
+ result[3].kind.name.should == @@KNOWN_SCALAR_COMPONENT2
402
+
403
+ end
404
+
405
+
406
+ it "array of mixed scalars and hashes -> array of parsed values" do
407
+ result = @input_parser.parse_yaml( @@MIXED_ARRAY )
408
+
409
+ result.length.should == 4
410
+
411
+ result[0].is_a?( ComponentInstance ).should == true
412
+ result[0].kind.name.should == @@KNOWN_SCALAR_COMPONENT
413
+
414
+ result[1].is_a?( ComponentInstance ).should == true
415
+ result[1].kind.name.should == @@KNOWN_SCALAR_COMPONENT
416
+
417
+ result[2].should == @@INVALID_SCALAR_COMPONENT
418
+
419
+ check_hash_parsed( result[3] )
420
+
421
+ end
422
+
423
+
424
+ end